/voice-gate — The Line Editor

SkillDev tools

Line-editor pass on any content draft against a client voice guide. Flags cadence issues, signature-move overuse, voice-guide violations, receipt gaps — things a rule-based gate can't catch. Use after /content-gate and before human review.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the /voice-gate — The Line Editor skill

What this skill tells your AI

The instructions your AI receives, as published by cgallic/kai-cmo-harness in harness/voice-gate/SKILL.md and read by ahel’s review.

Run a subjective-voice review of a drafted piece against a client's voice guide. Produces a structured editorial report with severity-ranked issues, verbatim quotes, rule citations, and direction for human-editor fixes.

This is the complementary pass to /content-gate. Rule-based gates (Four U's, banned words, SEO lint) catch mechanical quality issues. Voice Gate catches what they can't: sing-songy cadence, signature-move overuse, voice-guide violations that require interpretation, receipt gaps, and flow. Claude Code's session executes the judge prompt inline — no external API, no script wrapper, no env vars.

Preamble

source "$(dirname "$0")/../lib/preamble.sh"

Arguments

Required:

  • file path: Path to the draft markdown file to review.

Optional:

  • --voice-guide : Path to the client's writing guide. If omitted, auto-discovered (see Step 1).
  • --persona : Path to the writer persona file for extra biographical context. Optional but improves flag specificity.
  • --max-issues : Cap the number of issues in the report. Default 30.

Example: /voice-gate clients/GrowthModeOn/outputs/blog-posts/how-to-write-a-podcast-pitch.md Example: /voice-gate path/to/draft.md --voice-guide path/to/writing-guide.md --persona path/to/persona.md

The Skill

Step 1: Resolve Arguments

Parse ARGUMENTS. The first positional argument is the draft file path. Use the Read tool to validate it exists. If the draft is not a readable markdown file, stop and tell the user: "Draft not found: {path}. Pass a valid markdown file path."

Resolve the voice guide:

  • If --voice-guide <path> is provided, use that path.
  • Otherwise, auto-discover. Walk up from the draft's directory until you find an outputs/personas/ directory (or a plain personas/ directory). Inside, look for a file matching *-writing-guide.md. The canonical convention is clients/<client>/outputs/personas/<writer>-writing-guide.md. Pick the first match in the closest candidate directory.
  • If no match is found, stop and tell the user: "No voice guide found. Pass --voice-guide <path> explicitly, or place a *-writing-guide.md file in the nearest outputs/personas/ directory."

Resolve the persona (optional):

  • If --persona <path> is provided, use it.
  • Otherwise, look in the same directory as the resolved voice guide for a sibling *-persona.md whose basename prefix matches the writing guide (e.g. lexie-smith-writing-guide.mdlexie-smith-persona.md). If found, use it. If not, proceed without a persona.

Resolve max-issues: default 30. Parse --max-issues <n> if present and coerce to an integer.

Step 2: Read Inputs

Use the Read tool to load:

  • The draft file (full text).
  • The voice guide (full text).
  • The persona file (full text, if resolved).

If any required file fails to read, surface the error and stop.

Step 3: Load the Judge Prompt

Use the Read tool to load voice-gate/judge-prompt.md from this skill's own directory. This is the rubric Claude applies to produce the editorial report. If the file is missing, stop and tell the user: "Voice Gate judge prompt missing at voice-gate/judge-prompt.md. Re-install the skill."

Step 4: Execute the Judge Prompt (inline)

You (Claude) are the judge. There is no external API call. Apply the judge prompt against the three inputs: the draft text, the voice guide text, and (if present) the persona text. Produce a structured editorial report that conforms to the output contract defined in judge-prompt.md.

Hard requirements on the report — these are non-negotiable:

  • Every issue cites a verbatim quote from the draft (never a paraphrase).
  • Every issue references a specific rule — a numbered section of the voice guide (e.g., "Voice guide §11 DO #4"), a named signature-move cap ("I repeat — cap 1, count 3"), or a named editorial principle when the voice guide is silent ("Editorial: triple-list cadence monotony").
  • Severity is one of: High (publish-blocking), Medium (meaningful craft issue), Low (polish).
  • Recommended fixes are direction only, never rewrites. The human editor owns the rewrite.
  • If the total issue count exceeds max_issues, include only the top max_issues by severity and note in the Summary Table that the cap was hit.

Step 5: Write the Report

Derive the report path: <draft-path-without-extension>.VOICE-GATE.md. Example: .../how-to-write-a-podcast-pitch.md.../how-to-write-a-podcast-pitch.VOICE-GATE.md.

Use the Write tool to save the report at that path.

Step 6: Compute the Verdict

Count issues by severity. Apply the verdict logic:

  • PASS: 0 High issues AND ≤3 Medium issues. Message: "Ready for human review."

  • HOLD: 1–2 High issues OR >3 Medium issues (and no FAIL triggers). Message: "Moderate edits needed. See report."

  • FAIL: 3+ High issues OR any voice-guide hard-rule violation. Hard-rule violation triggers:

    • A Tier 1 banned word from the voice guide's DON'T list appears in the draft.
    • A year-count canonicalization rule is violated (e.g., the guide canonicalizes "15+ years" but draft says "13 years" or "11 years").
    • An AI-slop phrase the guide explicitly flags appears ("In conclusion," "delve," "innovative," "disruptive," "holistic," etc., per the guide's forbidden list).
    • The cold-open rule for SEO posts is violated (e.g., "Hey guys" opening a blog post).

    Message: "Blocking issues. Fix before human review."

Step 7: Display the Summary

Print a concise scorecard:

VOICE GATE REPORT
═══════════════════════════════════════════
File:        {draft_filename}
Voice guide: {voice_guide_filename}
Persona:     {persona_filename or "—"}
Report:      {report_path}

Issues:      {total} total
  High:      {high}
  Medium:    {medium}
  Low:       {low}

VERDICT: {PASS | HOLD | FAIL}
{verdict_message}

Top 3 issues:
  1. [{severity}] {category} — {one_line_summary}
  2. [{severity}] {category} — {one_line_summary}
  3. [{severity}] {category} — {one_line_summary}

Full report: {report_path}

Step 8: Save the Gate Log

Append a log entry to ~/.kai-marketing/gates/{date}-{slug}-voice.json — where {date} is today's date in YYYY-MM-DD and {slug} is the draft filename stem. One log file per draft per day (overwrite if the file already exists).

{
  "file": "{draft_path}",
  "voice_guide": "{voice_guide_path}",
  "persona": "{persona_path or null}",
  "report_path": "{report_path}",
  "verdict": "{PASS|HOLD|FAIL}",
  "high_count": {n},
  "medium_count": {n},
  "low_count": {n},
  "total_count": {n},
  "timestamp": "{ISO datetime}"
}

Error Handling

  • Draft file not found: Stop. Tell user the exact path checked.
  • Voice guide not resolvable: Stop. Tell user to pass --voice-guide <path> explicitly.
  • Judge prompt file missing: Install error. Tell user: "Voice Gate judge prompt missing at voice-gate/judge-prompt.md. Re-install the skill."
  • Draft exceeds ~40K words: Proceed, but add a note at the top of the report: "Draft exceeds the comfortable review window; the report may be partial."
  • Voice guide lacks numbered rules: The judge falls back to editorial-principle citations. Add a note at the top of the report: "Voice guide lacks numbered rules — citations use editorial principles only."

Chain State

Reads from: the draft, the voice guide, the persona (if present), voice-gate/judge-prompt.md Writes to:

  • <draft-path-stem>.VOICE-GATE.md — the editorial report (alongside the draft)
  • ~/.kai-marketing/gates/{date}-{slug}-voice.json — log entry

Read by: Human editor who opens the report for triage. Optionally re-read by /content-retro downstream.

When to Use This Skill

Use it:

  • For any client with a written voice guide (outputs/personas/*-writing-guide.md).
  • After /content-gate passes — it is the subjective complement to the rule-based gate.
  • On blog posts, LinkedIn articles, newsletters, long-form content.
  • Any time a reviewer has flagged "this doesn't sound like them" on prior drafts.

Skip it:

  • Ad copy (voice matters less than claim-compliance; /content-gate is enough).
  • Technical documentation, product release notes.
  • Content without a written voice standard — the gate has nothing to score against.
  • When the voice owner is about to read the draft themselves within an hour.

Pipeline Position

draft agent  →  /content-gate (rule-based)  →  /voice-gate (subjective)  →  human review  →  publish

Signals

GitHub stars
47
Forks
6
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
voice-gate
Source
github.com/cgallic/kai-cmo-harness