brand-voice-synthesizer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited brand-voice-synthesizer (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Version: 1.2.0 Updated: 2026-09-13 Freshly updated: v1.2.0 saves the voice to Site Memory with respira_remember, so every later session, in any AI client, reads it through respira_get_site_context with no extra call. The full profile stays with the user; the site keeps a distilled form that fits memory's 500-character entries. Plugins older than 8.3 keep the respira_brand_voice option. v1.1.0 wired the voice profile into the rest of the brand system. The extracted profile now persists to per-site memory via respira_get_option (diff first) + respira_update_option, cross-links explicitly with the Page Template Library and Design System Synthesizer skills so copy and layout share one brand foundation, and adds a brand-consistency report built from respira_generate_activity_report so you can see how on-voice recent content actually is. Category: intelligence Status: stable Requires: Respira for WordPress plugin 8.3+ for Site Memory (older plugins fall back to an option) + MCP server
Read 5–10 published posts on a WordPress site and extract the brand voice — tone, lexicon, sentence patterns, person used, formality, signature phrases, phrases the site never uses. Persist it to the site so every future content-writing skill produces copy that sounds like the brand, not like generic AI.
This is the verbal counterpart to the Design System Synthesizer. The two together form a complete brand foundation that every future content-generation skill references.
A structured brand_voice artifact stored at the site level. Schema:
{
"version": "1.1.0",
"synthesized_at": "2026-05-24T14:30:00Z",
"synthesized_from": ["/blog/post-a/", "/blog/post-b/", "..."],
"n_samples": 8,
"total_words_sampled": 12450,
"person": "we",
"formality": "approachable_professional",
"sentence_length_avg_words": 14,
"sentence_length_median_words": 12,
"sentence_length_p90_words": 28,
"paragraph_length_avg_sentences": 3.2,
"reading_grade_avg": 8.4,
"tone_descriptors": ["confident", "direct", "lightly playful", "evidence-driven"],
"signature_phrases": [
"the short version is",
"here's what we learned",
"let's break that down"
],
"common_openers": ["here's", "the", "we"],
"common_closers": ["that's the lesson", "more soon", "questions welcome"],
"lexicon_preferred": ["ship", "wire", "land", "tighten", "lean into"],
"lexicon_avoided": ["leverage", "synergy", "best-in-class", "world-class", "innovative", "cutting-edge", "revolutionary"],
"punctuation_patterns": {
"em_dash_usage": "frequent",
"exclamation_marks": "never",
"oxford_comma": true,
"ellipsis_usage": "rare",
"parenthetical_asides": "frequent"
},
"structural_patterns": {
"opens_with_question": "sometimes",
"uses_headings": "every_post",
"uses_bullet_lists": "often",
"uses_code_blocks": "for_technical_posts",
"uses_blockquotes": "rare",
"ends_with_call_to_action": "never"
},
"examples": {
"good_paragraph": "We shipped the redesign last week. The short version is: fewer pages, more density, one CTA per screen. Conversion is up 18% on the new pricing page so far. We'll know more by end of month.",
"bad_paragraph": "We are thrilled to announce the launch of our revolutionary new design! This best-in-class experience leverages cutting-edge UX innovations to deliver unparalleled value!"
}
}The full artifact is for the user to keep: paste it into a style guide or save it as a file. What the site keeps is a distilled form in Site Memory (Step 6), because memory arrives in every future session through respira_get_site_context, while an option only reaches a skill that knows to ask for it. Earlier versions planned a separate artifact store; Site Memory replaced that plan.
Call respira_get_active_site + respira_get_site_context.
Call respira_list_posts with status=publish, limit=20. From the list, pick 5–10 posts that should represent the voice:
author)If fewer than 5 posts exist, use whatever's there but note n_samples honestly.
For each picked post, call respira_read_post(post_id) or respira_extract_builder_content(post_id) depending on the active builder. Strip:
For the corpus of cleaned text, compute:
Output a human-readable summary:
## Brand voice synthesized for {site_url}
Based on {n_samples} published posts ({total_words_sampled:,} words sampled, mostly from the last 6 months).
**Person:** {person} ("we" / "I" / "you" / mixed)
**Formality:** {formality}
**Sentence length:** ~{sentence_length_avg_words} words avg ({sentence_length_p90_words}-word p90)
**Reading grade:** {reading_grade_avg}
**Tone:** {tone_descriptors joined}
**Signature phrases this site uses repeatedly:**
{signature_phrases as bulleted list}
**Words this site reaches for:**
{lexicon_preferred as inline list}
**Words this site conspicuously avoids:**
{lexicon_avoided as inline list}
**Punctuation quirks:**
- em dashes: {em_dash_usage}
- exclamation marks: {exclamation_marks}
- oxford comma: {oxford_comma}
**Structural patterns:**
- Opens with a question? {opens_with_question}
- Uses headings? {uses_headings}
- Ends with a CTA? {ends_with_call_to_action}
**A paragraph that sounds like you:**
> {examples.good_paragraph from the corpus}
**A paragraph that does NOT sound like you (generic AI):**
> {examples.bad_paragraph as a constructed counter-example}Ask the user: "Does this match how you'd describe your voice? Anything to add or correct?"
Site Memory is the site's own memory. Every entry arrives in respira_get_site_context under site_memory, for every later session and every AI client, with no extra call. Entries are capped at 500 characters, so save a distilled voice, not the JSON.
respira_list_memory and look for the brand-voice and brand-voice-avoid keys. If they exist, show the user what would change (person, tone, added or removed words) before replacing anything. Never replace a saved voice silently.brand-voice, type preference: person, formality, sentence length, tone and signature phrases in two or three sentences. For example: "Write in first person plural, approachable and direct. Sentences average 14 words; paragraphs stay under four sentences. Reach for ship, wire, land, tighten. Signature opener: 'the short version is'."brand-voice-avoid, type preference: the avoided words and the punctuation habits. For example: "Never use: leverage, synergy, best-in-class, world-class, innovative, cutting-edge, revolutionary. No exclamation marks. Oxford comma on."respira_remember only after the user says yes. Use type preference, never rule: a rule is enforced on every write and only the owner can remove it, which is wrong for a style.respira_list_memory shows both keys with today's date.On a plugin older than 8.3 there are no memory tools. Fall back to the option: diff with respira_get_option('respira_brand_voice'), write with respira_update_option('respira_brand_voice', <json>) after the user says yes, and read it back.
Output: "Brand voice saved to this site's memory as two entries, brand-voice and brand-voice-avoid. Every later session reads them automatically, whichever AI client opens the site. The avoided-words entry is the strongest signal: the agent will not use those words even when a prompt suggests them."
The voice profile is also a yardstick: it tells you whether content already on the site sounds on-brand. Pull the recent work log with respira_generate_activity_report (it returns what was published/edited and when), then sample those pages/posts and score them against the saved profile:
Report it plainly: "Of the last 12 published posts, 9 are on-voice. 3 drift toward the avoided lexicon ('revolutionary', 'best-in-class') — likely the templated launch posts. Want me to rewrite those to match?" This turns the voice profile from a passive artifact into an active consistency check, and pairs naturally with the rewrite skills.
Once saved, the voice arrives in the site_memory block of respira_get_site_context, so every content-writing skill (page generators, blog post drafters, social post composers) has it at the top of its workflow with no extra call. respira_list_memory shows the two entries by key. On plugins older than 8.3, read the respira_brand_voice option instead. Skills use the voice to:
The avoided lexicon is the strongest signal. When the agent is about to write "revolutionary" or "best-in-class," the voice artifact says "this site never uses that word" and the agent picks a more honest verb.
The brand voice is one half of the brand foundation. It works best alongside two sibling skills:
respira_design_system). Voice covers how the words read; the design system covers how the page looks. Run both so generated content is on-brand top to bottom. The Design System Synthesizer's style-guide page even links back here for the full voice.brand-voice memory entries so the placeholder copy it drops in already sounds like the site, not like lorem-ipsum or generic AI. Voice supplies the words; the template supplies the layout.If only one of the two artifacts exists, content skills should still use what's there — but flag to the user that running the missing synthesizer would tighten the result.
preference, never a rule, and only after the user says yes.Reading the corpus (source of truth)
respira_get_active_siterespira_get_site_contextrespira_list_postsrespira_read_postrespira_extract_builder_contentPersisting + reporting
respira_list_memory: find an existing brand-voice entry before replacing itrespira_remember: save the two distilled entries, type preferencerespira_forget: remove an old voice entry the user says is wrongrespira_get_option and respira_update_option: the fallback on plugins older than 8.3respira_generate_activity_report: recent published and edited work for the brand-consistency check (plugin 9.0 and later list it as a tool; on older plugins call respira_invoke_ability with ability: "respira/generate-activity-report" and the same arguments under args)Pairs with the Design System Synthesizer (respira_design_system via respira_get_option) and the Page Template Library. Use only respira-wordpress MCP tools; never invent a tool name.
Records: site URL hash, number of posts sampled, total words analyzed, person detected, formality detected, success/failure. No actual phrases, no avoided words, no example paragraphs are sent.
Endpoint: POST https://www.respira.press/api/skills/track-usage
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.