Autonovel consistency pass
Skill DukeTwoCan/autonovel-agent-skills/skills/creative/autonovel-consistency-pass
Collaboration-first Agent Skills pipeline for planning, drafting, revising, reviewing, and exporting long-form fiction.
npx -y skills add DukeTwoCan/autonovel-agent-skills --skill autonovel-consistency-passAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 22 days oldThe repository was created 22 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Autonovel Phase 3b.1 — cross-chapter consistency review focused on character voice, plot, world rules, and repeated phrasing. Builds a rolling chapter summary then windows over the manuscript in 4-chapter groups, emitting per-window critique and merging into critique/consistency.md. Hands targeted fixes back to autonovel-revision. Max 2 cycles. Designed for the 27B/65k local-model envelope — never loads the full manuscript at once.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
10.3 KB, as published. Nobody here has run it
Autonovel — Phase 3b.1 (Consistency pass)
Catch cross-chapter inconsistencies (character voice drift, plot holes, world-rule violations, repeated phrases) that the per-chapter drafting loop can't see.
When to use this skill
- State.json shows
"phase": "consistency"(set by autonovel-revision when 3a complete) - User says "do a consistency pass" / "check for plot holes" / "look for inconsistencies"
Prerequisites
!`cd "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG" && ls chapters/*.md | wc -l`
!`cat "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/state.json" | python -c "import json,sys; s=json.load(sys.stdin); print(s.get('phase'), s.get('revision_cycle'))"`
Need ≥2 chapters drafted; otherwise consistency-pass is meaningless.
Workflow
Step 1 — Build rolling chapter summary
If story_state/facts.json exists, drafting has already been appending each
accepted chapter's summary to consistency_state/rolling_summary.md live
(see autonovel-drafting/references/fact-extraction.md). In that case, read
the existing consistency_state/rolling_summary.md first, note which
## Chapter N headers are already present, and only fill gaps — chapters
with no header (drafted before story-state was initialized, or the file is
missing entirely). Do not regenerate a summary that already exists. If
story_state/facts.json does not exist, or the summary file is missing
entirely, build every chapter's summary from scratch as below.
For each chapter needing a summary:
- Read
chapters/ch_NN.md. - Generate a ~200-token summary covering: what happens, which characters appear, what state changes (relationship dynamics, possessions, knowledge), any world-rule invocations.
- Append to
consistency_state/rolling_summary.mdwith header## Chapter N.
This is the rolling summary the windowed reviewer uses. Built once (or gap-filled); reused across windows.
Step 2 — Window the manuscript
Use lib/chunk_text.py:
import sys
sys.path.insert(0, "${HERMES_SKILL_DIR}/lib")
from chunk_text import chunk_by_chapters
# Read all chapter files in order
import os, glob
chapter_files = sorted(glob.glob("$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/chapters/ch_*.md"))
chapter_texts = [open(f).read() for f in chapter_files]
chunks = chunk_by_chapters(chapter_texts, group_size=4)
Each chunk holds 4 consecutive chapters (last chunk may be 1-3).
Step 3 — Per-window critique
For each chunk, build prompt:
-
references/rolling-summary-template.md(this skill's references) — explains the task -
The chunk text (4 chapters)
-
The rolling summary built in Step 1
-
World, characters, canon references (small, just the rules-relevant parts)
-
genre_context/story-contract.md— the novel's persistent reader promises, combination decisions, and required genre payoffs -
genre_context/compiled/evaluation-manuscript.md— the bounded selected-pack rules for manuscript-wide promises, guardrails, exclusions, rating, and content-tag coverage. Preserve each packetSource:citation in any finding based on a pack rule. -
The profile checklist from state.json:
profile.tags'-tagexclusions,profile.rating, andprofile.content_tags, so the reviewer can check excluded-tag content, rating exceedance, and content-tag coverage alongside the other categories (see../autonovel/genres/README.md's-tagexclusion rule and "Content tags" rule, and../autonovel/references/ratings.md). Content-tag coverage is manuscript-wide, not per-window — the reviewer notes per window which content tags a window delivers; the undelivered check itself runs once at merge (Step 4), against the outline's coverage map. -
STORY STATE for the window (if
story_state/facts.jsonexists — see../autonovel-drafting/references/fact-extraction.mdfor how the ledger is populated). For a window covering chaptersa..b, run:!`python3 ${HERMES_SKILL_DIR}/lib/story_state.py query "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/story_state/facts.json" {a-1} <subjects>`For the first window (
a=1), query chapter0— there are no facts stamped before chapter 1, so this returns the seed/empty state.<subjects>is the entity keys of every character appearing anywhere in the rolling summary for chaptersa..b(fall back to the full cast if that's short). Budget: the ENTERING THE WINDOW block stays <= 1.5k tokens. If larger, restrict subjects to characters appearing in the window's rolling-summary entries only (never the full-cast fallback), and if still larger, drop facts for minor characters (fewest facts first) and note the omission in the window prompt. Never inject an unbounded ledger. Label this block "STORY STATE ENTERING THE WINDOW (as of end of chapter {a-1})" in the prompt.This is the N-1 convention documented on
story_state.py'scurrent_facts(): a chapter's own transitions are stamped AT that chapter, so querying ata-1gives the state the window's prose actually starts from — not a state that already bakes in the window's own changes. Tell the reviewer explicitly, in the prompt: transitions the window's own prose establishes will NOT appear in the ENTERING block (they're stamped inside[a, b]) — prose showing a change of state mid-window is the story moving, not a contradiction. Only flag a ledger contradiction (see the rubric's new category) when the prose conflicts with the ENTERING block and the window offers no transition explaining the change. Ifstory_state/facts.jsondoes not exist, skip this block entirely — the window is reviewed without ledger cross-checking (pre-Module-A-ledger novels).
The agent reads the chunk and emits a per-window critique JSON to critique/consistency_window_<start>_<end>.md. The critique has six categories per references/consistency-rubric.md:
- character-voice drifts (cite chapter:line)
- plot inconsistencies
- repeated phrases (citing both occurrences)
- world-rule violations
- profile and genre-contract violations (unresolved genre promises, required
payoffs, selected-pack guardrails, excluded-tag content, or rating
exceedance; cite chapter:line and the contract section or evaluation-packet
Source:; plus, at merge, anyprofile.content_tagsentry undelivered anywhere in the manuscript) - ledger contradictions (chunk text contradicts an open fact from the STORY STATE ENTERING THE WINDOW block; cite fact id + chapter:line — see the rubric's N-1 reminder before flagging)
Step 4 — Merge windows
Combine all per-window critiques into a single critique/consistency.md. Deduplicate items mentioned in multiple windows (same character drift seen across chunks).
If profile.content_tags is non-empty, run the manuscript-wide content-tag
coverage check here (see references/consistency-rubric.md's Profile
violations): using the outline's content-tag coverage map as the source of
truth, confirm every entry is delivered in at least one chapter (integrated,
not merely named). Cite the delivering chapter for each; any entry with no
delivering chapter is an undelivered-content-tag finding under profile
violations, handed to autonovel-revision like any other.
At the same merge point, check every reader promise and required genre payoff in
genre_context/story-contract.md against the whole rolling summary and all
window findings. Record unresolved genre promises under profile violations,
citing the contract section and the chapter where delivery was expected (or
the manuscript ending if no delivery exists). Apply every manuscript rule in
genre_context/compiled/evaluation-manuscript.md; when a finding comes from a
selected pack, retain its packet Source: path alongside the chapter:line
citation.
Emit relationship graphs for the user. If story_state/facts.json
exists, run, for each act boundary in outline.md:
!`python3 ${HERMES_SKILL_DIR}/lib/story_state.py graph "$AUTONOVEL_WORKSPACE/$NOVEL_SLUG/story_state/facts.json" <last-chapter-of-act>`
and write the output to story_state/graph_act_N.md (N = 1, 2a, 2b, 3 for
the outline's four acts — Act I, Act II Part 1, Act II Part 2, Act III),
wrapped in a mermaid code fence: open with ```mermaid on its own line,
close with ``` on its own line. Determine <last-chapter-of-act> from
outline.md's ## Act Structure percentage marks and each chapter's % mark
field: Act I's boundary is the last chapter with a % mark <= 23%, Act II
Part 1's is the last chapter <= 50%, Act II Part 2's is the last chapter
<= 77%, and Act III's is the manuscript's final chapter. If a chapter's
% mark is missing or unparseable, approximate act boundaries by chapter
count instead (act boundaries at 23%/50%/77% of chapters_total, rounded).
These graphs are
for the USER and human proofreaders to review relationship arcs at a
glance — they are never injected into any prompt. If story_state/facts.json
does not exist, skip this step silently (pre-Module-A-ledger novels).
Step 5 — Hand to autonovel-revision
Update state.json phase back to "revision", set revision_source: "consistency" so the revision skill knows where to target fixes. Invoke autonovel-revision.
Step 6 — Cycle limit
Increment consistency_cycle in state.json. If consistency_cycle >= 2, instead of looping, set phase = "export" and hand off to autonovel-export. (Hard limit prevents endless polishing.)
Handoff
autonovel-revision for fixes, then either back here (cycle < 2) or autonovel-export.
See also
references/rolling-summary-template.md— the per-chapter summary promptreferences/consistency-rubric.md— what counts as a finding, what doesn't