# Spec Sheet — Check Voice

**What you are building:** A read-only skill that audits a piece of writing against a documented "voice baseline" and reports off-voice patterns, with quoted evidence and per-attribute drift — diagnosis only, never a rewrite.

> Bracketed [PLACEHOLDERS] are yours to fill in for your own product and voice. This skill has no credentials of its own; if you adapt it to fetch remote files, supply any token from your own secret store and never inline it.

## 1. Purpose

Keep a product's voice from eroding as prompts, specs, completions, and copy get written and edited by many hands and many model calls. The skill compares a target piece of writing to a fixed, file-based voice baseline and reports exactly where the writing drifts, quoting the offending passage and naming the attribute or anti-pattern it breaks. It is a diagnostic instrument: it produces a report and a verdict, it does not edit anything.

## 2. Activation

- **Name:** `check-voice` (invoked as `/check-voice`).
- **Description (this is what makes Claude auto-trigger):** lead with the action, then enumerate the trigger surface. Include the explicit command, plus the natural-language phrasings: "check voice," "check voice consistency," "is this on-voice," "does this sound like [BRAND]," "audit the voice samples in this spec," "sanity-check this copy before it ships." Name the genres it accepts (a prompt, an LLM completion, a [SPEC] with embedded voice samples, marketing copy) so the model maps varied requests onto the skill. Example: *"Review a piece of writing — a prompt, a captured LLM completion, a [SPEC], marketing copy — against [BRAND]'s voice baseline and report off-voice patterns. Use when the user runs /check-voice, asks to check voice consistency on a prompt or completion, audit a spec's voice samples, or sanity-check newly-written copy before it ships."*
- **Argument:** one path, several paths, or a shorthand token resolving to a known file.
- **No-argument behavior:** do not proceed. Print a usage line with two or three concrete examples and stop.

## 3. Inputs and preconditions

- One or more file paths to the writing under review, OR a shorthand token (e.g. `[SPEC_NAME]`) that resolves to a path.
- **Precondition:** both voice-baseline files must exist and be readable. If either is missing, say so and stop — the check cannot run from memory.
- Shorthand resolution requires a lookup table (see §5) mapping tokens to file paths.

## 4. Outputs and side effects

- A single structured Markdown report printed to chat (template in §6, step 5).
- **No side effects.** Nothing is written to disk; neither the writing nor the baseline is edited. This is a hard guarantee, not a default.
- When several files are reviewed, the full report structure repeats once per file under its own header.

## 5. Environment and dependencies

- **Two voice-baseline files**, generalized:
  - `[OPERATIONAL_BASELINE]` — the tight, operative voice spec the agent actually runs on. Must contain: a short list of named voice **attributes**; an explicit **anti-pattern** list ("what you never do"); a **behavioral-patterns** section; and **audience-calibration** examples.
  - `[VOICE_AND_BRAND_GUIDE]` — the broader document: attributes elaborated, voice-across-contexts adaptations, anti-patterns with "what wrong looks like," and voice samples by situation.
- **A shorthand-resolution table** — e.g. a "source of truth" table in your project's `[PROJECT_CONTEXT_FILE]` (a `CLAUDE.md` or equivalent) that maps shorthand tokens to spec file paths. Reuse the same table a sibling coherence-checking skill uses, if one exists.
- No MCP tools, no network, no state files, no scripts. The skill is pure read-and-reason. (If your baseline lives remotely, add a fetch step and supply credentials from a secret store — never inline.)

## 6. Procedure

1. **Resolve the argument.** If absent, print usage and stop. If shorthand, resolve via the `[PROJECT_CONTEXT_FILE]` table; if ambiguous, list the matches and ask the user to choose before proceeding.

2. **Load the baseline, in order.** Read `[OPERATIONAL_BASELINE]` first (note the attributes, anti-patterns, behavioral patterns, audience calibration), then `[VOICE_AND_BRAND_GUIDE]` (for fuller anti-pattern coverage and situational samples). If either is missing, stop. All judgments must trace to these files, not to memory — the baseline is the evolving source of truth, and if it has been edited so that new content contradicts what you would otherwise flag, the baseline wins.

3. **Read the input fully and classify its genre.** The baseline applies differently by genre:
   - *Instructions* (prompts, specs): the prose drives agent behavior; embedded voice samples (`> "..."` blockquotes, "VOICE SAMPLE" sections) are the most literal check.
   - *Output* (completions, conversations): this is what the baseline is supposed to produce; off-voice patterns here are the most consequential.
   - *Copy* (marketing): same attributes, broader/compressed context; some voice-across-contexts adaptations may apply.
   - **Do not flag scaffolding** — headers, instruction phrases ("Voice samples:", "Don't:"), marker definitions, structural prose. Only flag language the agent would *speak*.

4. **Scan for off-voice patterns** across four lenses:
   - **Anti-pattern matches** — flag exact phrases or close paraphrases from your anti-pattern list. Generalize the categories to your brand; a representative set is: corporate softening, performed empathy, manufactured warmth, tech-bro directness, [DOMAIN]-preachiness, [DOMAIN]-influencer scamminess, over-explaining, hedge-into-vagueness, generic professionalism ("leverage" as a verb, "synergies," "stakeholders," "best-in-class"), trying-too-hard, and [DOMAIN]-jargon where plain language would do.
   - **Drift from each named attribute** — read the writing once per attribute and decide: violated, served, or absent. Note the failure mode for each (e.g. for an "occasionally funny" attribute, *performed* humor is the failure, absence is fine).
   - **Audience calibration** — check against your defined [AUDIENCE]: jargon leaking in, wrong-segment framing, generic framing that ignores the audience's specifics, or any condescension.
   - **Format and pacing** — only when checking prompts or conversations: stacked questions vs a one-idea-per-turn rule, over-long messages, formatting (Markdown/emoji) appearing in agent output that should be plain, control markers narrated to the user instead of emitted cleanly.

5. **Note what's working** — two to four specific, quoted strengths, so the next iteration doesn't drift away from validated patterns. "Reads on-voice; nothing to flag" is a valid result when true.

6. **Report** in this fixed template (sections with no findings print "None." / "No drift found." on their own line — never omit a section):

   ```
   ## Voice check: <input name>

   **Reviewed:** <path(s)>
   **Baseline:** <operational baseline> + <voice & brand guide>

   ### Off-voice patterns
   1. **<short label>.** <quoted passage> Violates <attribute or anti-pattern>. <one sentence: why, and the fix direction — not a rewrite>
   2. ...

   ### Drift from voice attributes
   - **<Attribute 1>.** <"no drift found" or quoted finding>
   - ... (one bullet per named attribute)

   ### Audience calibration
   - <"No issues" or quoted finding>

   ### Format and pacing
   (Only for a prompt or conversation. Skip for copy or pure spec text.)
   - <"No issues" or finding>

   ### What's working
   - <2–4 quoted strengths>

   ### What I didn't check
   - <anything skipped, and why>
   ```

   Repeat the whole structure once per file when several are reviewed.

## 7. Edge cases and failure handling

- **No argument:** print usage, stop.
- **Missing baseline file:** say which one, stop. Never improvise the rules from memory.
- **Ambiguous shorthand:** list candidates, ask, wait.
- **A spec that *describes* an anti-pattern** ("Don't lecture") is not a violation — it is instruction. Flag only passages where the *agent's voice* is on the page.
- **Strong writing:** say so plainly; do not pad with manufactured findings.
- **Multiple files:** review each separately; one report block per file.

## 8. Guardrails / hard rules

- **Read-only. Never edit** the writing or the baseline, under any circumstances.
- **Quote the writing.** Concrete quoted evidence is the only useful finding; "feels off" is not actionable.
- **Don't rewrite.** Produce the report; the user decides the fix. A requested rewrite is a separate follow-up turn, not part of the report.
- **Distinguish describing from speaking.** Only the agent's spoken voice is in scope.
- **Don't manufacture findings.** False positives erode the skill's signal.
- **Calibrate severity.** One instance is a note; the same pattern repeated across many lines is a systemic flag.
- **Baseline over memory.** Judgments draw on the files; if the baseline was edited to contradict a habitual flag, the baseline wins.

## 9. Acceptance criteria

- Running the skill on the [OPERATIONAL_BASELINE] itself returns nearly clean (it *is* the voice) — a good smoke test.
- Every off-voice finding includes a verbatim quote and names the attribute or anti-pattern it breaks.
- Every named attribute appears in the "Drift from voice attributes" section, even when the entry is "no drift found."
- No-argument invocation prints usage and does not proceed.
- A missing baseline file halts the run with a clear message.
- The report never contains a rewrite, and no file on disk changes.
- Scaffolding/instruction language is not mistaken for a voice violation.
- Format-and-pacing appears for prompt/conversation inputs and is omitted for pure copy or spec text.

## 10. Adapt to your setup

- Replace the two baseline files with your own [OPERATIONAL_BASELINE] and [VOICE_AND_BRAND_GUIDE], and make sure each contains named attributes, an anti-pattern list, and audience-calibration examples.
- Replace the [ATTRIBUTES] with your brand's own, each with its failure mode.
- Replace the [AUDIENCE] anchor and its plain-language test with yours.
- Re-derive the anti-pattern categories from your domain (the [DOMAIN]-preachiness / [DOMAIN]-jargon slots are placeholders).
- Point shorthand resolution at your own [PROJECT_CONTEXT_FILE] table, or drop shorthand entirely and accept only literal paths.
- Drop the format-and-pacing lens if your product's output isn't conversational, or rewrite its rules to match your channel.

---

```markdown
---
name: check-voice
description: Review a piece of writing — a prompt, a captured LLM completion, a [SPEC], marketing copy — against [BRAND]'s voice baseline and report off-voice patterns. Use when the user runs /check-voice, asks to check voice consistency on a prompt or completion, audit a spec's voice samples, or sanity-check newly-written copy before it ships.
---

# Check voice

Read a piece of writing, compare it to [BRAND]'s voice baseline, report where it is off-voice. Read-only — never edits the writing or the baseline.

## Argument
<!-- A path, several paths, or a shorthand token. Resolve shorthand via [PROJECT_CONTEXT_FILE]'s lookup table; list matches if ambiguous. If no argument, print a usage line with examples and stop. -->

## What to do

### Step 1 — Load the voice baseline
<!-- Read [OPERATIONAL_BASELINE] then [VOICE_AND_BRAND_GUIDE], in that order. Note attributes, anti-patterns, behavioral patterns, audience calibration. If either file is missing, say so and stop. List your named [ATTRIBUTES] and the [AUDIENCE] anchor here as the report's spine. -->

### Step 2 — Read the input
<!-- Read fully; classify genre (instruction / output / copy). Do not flag scaffolding — only language the agent would speak. -->

### Step 3 — Scan for off-voice patterns
<!-- Four lenses: anti-pattern matches; drift from each named attribute (violated / served / absent); audience calibration; format and pacing (prompts & conversations only). Quote everything. -->

### Step 4 — Note what's working
<!-- 2–4 specific, quoted strengths. "Reads on-voice; nothing to flag" is valid. -->

### Step 5 — Report
<!-- Fixed template: Off-voice patterns / Drift from voice attributes (all attributes listed) / Audience calibration / Format and pacing (skip for copy & spec) / What's working / What I didn't check. Empty sections print "None." — never omitted. One block per file. -->

## Important
<!-- Read-only. Quote the writing. Don't rewrite. Distinguish describing from speaking. Don't manufacture findings. Calibrate severity. Baseline over memory. -->
```
