A constraint-driven, multi-agent writing framework for Claude Code. It treats prose quality the way an engineering team treats code quality: a deterministic gate at the harness level, least-privilege reviewers that cannot touch what they review, auditable revision passes, and a parallel, named-agent review panel.
Clone it, open it in Claude Code, and every core feature works with zero external accounts: no API keys, no MCP servers.
-
Harness-level enforcement, not vibes. A PostToolUse hook (
.claude/scripts/em-dash-guard.sh) blocks the banned em-dash token at write time: when a Claude CodeWriteorEditwould introduce one to a manuscript file, the hook exits 2 and the harness blocks the write. The rule is enforced by the harness, not requested in a prompt the model might ignore. The matcher is scoped to manuscript directories and spares the literal---rule. -
Least-privilege, tool-isolated reviewers. Every reviewer agent carries YAML frontmatter declaring its tools. The seven gating critics are locked to
Read, Grep, Glob, so they physically cannot edit the manuscript they score. Only creator agents holdWrite, Edit. -
Isolated, auditable revision passes.
/auto-revise-chapterruns each revision in its own git worktree and branch (plaingit worktree addpluscdpluscommit, not a special harness flag). Every pass is a separate, diffable, rollback-able commit. A bad revision never corrupts the working copy. -
Parallel, named-agent review.
/review-chapterfans out the seven named gating critics in one response, each in its own clean context, each scored against an explicit four-tier rubric. The critics are launched by name (subagent_type: pacing-master, and so on), never as a single general-purpose prompt simulating a panel.
WriteAssist works for any book-length narrative: fiction, memoir, autobiography, biography, or narrative non-fiction.
-
Clone and open.
git clonethe repo and open it in Claude Code. The hooks and statusline auto-load from.claude/settings.json. The only host dependencies arejqandpython3(used by the portable em-dash matcher). -
The aha moment. Ask Claude Code to write a sentence containing an em dash to any file under
02-Manuscript/. The PostToolUse hook blocks theWrite/Edit(exit 2) and tells you why. Through the normal edit path, a banned token cannot reach a chapter file. -
Fill the two template files. Edit
project-config.md(genre, voice, tone, themes) andauthor-rules.md(your hard and soft constraints). The em-dash ban already lives inauthor-rules.mdas a configurable example. -
Run the pipeline.
/outline-book # plan-mode gate, then writes 01-Planning/outline.md /setup-story # builds story-compendium.md and characters /generate-wrp 1 # plan-mode gate, then a chapter blueprint /execute-wrp 05-wrp/chapter_01_WRP.md/execute-wrpwrites the chapter and then auto-fires the four-tier review panel. If the panel returns Revise, run/auto-revise-chapterand inspect each pass withgit logandgit diff. -
Don't want to run anything yet?
example/holds a hand-authored synthetic walkthrough: a filled config, one WRP, and the chapter that follows from it (guaranteed zero em dashes).
The framework ships 16 agents: 11 core plus 5 optional advanced reviewers and helpers. Agents live flat in .claude/agents/; the core-versus-advanced tier below is documentation only. The seven gating critics are exactly the seven dimensions of the review engine, so the agent roster, critic list, and gate denominator are the same seven (see docs/ARCHITECTURE.md and .claude/docs/review-engine.md).
| Agent | Tier | Tools | Critic dimension | Gating or advisory |
|---|---|---|---|---|
| story-architect | core | Read, Write, Edit, Grep, Glob | (creator: plot architecture) | creator |
| character-developer | core | Read, Write, Edit, Grep, Glob | (creator: character profiles and arcs) | creator |
| world-builder | core | Read, Write, Edit, Grep, Glob | (creator: setting and lore) | creator |
| research-assistant | core | Read, Write, Edit, Grep, Glob, WebFetch, WebSearch | (creator: fact and domain research) | creator |
| continuity-checker | core | Read, Grep, Glob | Continuity and Logic (20%) | gating (critical-fail) |
| rule-enforcer | core | Read, Grep, Glob | Rules Compliance (15%) | gating (critical-fail) |
| voice-consistency | core | Read, Grep, Glob | Voice and Prose (15%) | gating (critical-fail) |
| character-critic | core | Read, Grep, Glob | Characters and Arc (15%) | gating |
| pacing-master | core | Read, Grep, Glob | Pacing and Flow (12.5%) | gating |
| dialogue-coach | core | Read, Grep, Glob | Dialogue and Subtext (12.5%) | gating |
| engagement-critic | core | Read, Grep, Glob | Engagement and Impact (10%) | gating |
| sensitivity-reviewer | advanced | Read, Grep, Glob | Representation and harmful tropes | advisory (prunable) |
| thematic-guide | advanced | Read, Grep, Glob | Theme and motif reinforcement | advisory |
| grammar-clarity | advanced | Read, Grep, Glob | Grammar and readability | advisory |
| timeline-keeper | advanced | Read, Grep, Glob | Chronology and event sequencing | helper (backs /update-timeline) |
| twist-engineer | advanced | Read, Write, Edit, Grep, Glob | Reveal and misdirection design | creator helper |
11 core: 4 creators plus the 7 gating critics. 5 optional advanced: 3 advisory critics plus 2 creative helpers. The advisory critics inform but never gate; they are pruned on /review-chapter --fast or when author-rules.md declares no sensitivity constraint.
What this is
- A working Claude Code framework for long-form prose with a deterministic style gate, tool-isolated reviewers, worktree-isolated revisions, and a parallel review panel.
- A demonstration that author-defined quality rules can be enforced by the harness instead of hoped for in a prompt.
- Runnable on the first try with no external services.
What it is not
- Not a publishing pipeline. The MCP-dependent reach (Drive sync, query letters, calendar blocking) is parked in
integrations/, not in the core surface. - Not a guarantee of "good writing." The framework structures and gates the work; it does not replace authorial judgment.
- Not a benchmark suite. It cites at most one reproducible measurement (in
.claude/docs/smoke-tests.md); every other number is labeled illustrative.
Honest caveats
- Review scores are heuristics. The four-tier tiers and the panel and weighted gates are qualitative model judgments used as a stopping rule, not ground truth. The deterministic, checkable guarantee is the em-dash gate; the panel result is advisory by nature.
- Parallel review trades tokens for latency. Fanning out seven critics in clean contexts costs roughly seven critic-sized inferences per review. You get speed and isolation; you pay in tokens. See
docs/ADVANCED.mdfor batch token-cost guidance. - MCP features are parked. Anything needing Drive, Gmail, or Calendar lives in
integrations/behind a "requires MCP server" banner so the first-run promise stays true.
docs/ARCHITECTURE.md: the design write-up. Constraint hierarchy, WRP pipeline, why a hook over a prompt, why read-only reviewers, why git worktrees, and the four-tier review engine with the agent-critic-gate table.docs/ADVANCED.md: the advanced commands and the five optional agents, plus batch usage and token-cost guidance..claude/docs/review-engine.md: the full four-tier rubric, dual-gate math, and critical-fail overrides..claude/docs/smoke-tests.md: the gate-logic and hook smoke tests.
WriteAssist was designed and built by Justin Jorgensen, with two AI collaborators who helped shape, critique, and rebuild it to v1.0:
- Claude (Anthropic), via Claude Code
- Codex (OpenAI's GPT-5.5)
Released under the MIT License. Copyright (c) 2026 Justin Jorgensen. See LICENSE.