Chapter_N_draft doc step was placed after PASS 3 think, so last_text() returned char state (3151 chars) instead of the actual chapter from SELF-CHECK. Moved doc step to immediately after step 2 (SELF-CHECK). New step order: 0-think, 1-think, 2-think(selfcheck), 3-doc(draft), 4-think(charstate), 5-rag_write, 6-doc(charstate), 7-package, 8-close Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
411 lines
19 KiB
YAML
411 lines
19 KiB
YAML
name: book_chapter
|
||
description: "Write one chapter — continuity check, draft, self-check, then spawn editorial review."
|
||
debug: true
|
||
system: agent_prompt
|
||
|
||
requires:
|
||
- genre_name
|
||
- genre_audience
|
||
- prose_style
|
||
- chapter_target_words
|
||
- chapter_ref
|
||
|
||
conditional_skills:
|
||
- path: guides/YAFictionGuide.md
|
||
genre_contains:
|
||
- "YA"
|
||
- "Young Adult"
|
||
- path: guides/RomanceFictionGuide.md
|
||
genre_contains:
|
||
- "Romance"
|
||
- "Contemporary Romance"
|
||
- path: guides/SciFiFictionGuide.md
|
||
genre_contains:
|
||
- "Science Fiction"
|
||
- "Sci-Fi"
|
||
- "SciFi"
|
||
- "Science-Fiction"
|
||
|
||
# Genre-aware guide use: Only the guide whose genre_contains keywords match {genre_name}
|
||
# is injected. The pipeline skips non-matching guides entirely, so there are no
|
||
# conflicting craft signals from other genres.
|
||
|
||
agent_prompt:
|
||
- "= identity.md"
|
||
- "agent.rag.json"
|
||
|
||
sections:
|
||
- agent
|
||
- project
|
||
- rag
|
||
- skills
|
||
- deliverables
|
||
- message
|
||
- rejection_feedback
|
||
- instructions
|
||
|
||
steps:
|
||
- type: think
|
||
hint: |
|
||
PASS 0 — BIBLE, CONTINUITY, AND DRAFT PROMPT
|
||
|
||
GENRE: {genre_name} | AUDIENCE: {genre_audience}
|
||
PROSE STYLE GUIDE: {prose_style}
|
||
TARGET CHAPTER LENGTH: ~{chapter_target_words} words
|
||
|
||
GENRE GUIDE: Your skills section contains exactly the guide for {genre_name}. Apply it fully.
|
||
|
||
CONTINUITY GUARDRAILS:
|
||
- Use ONLY the outline / character bible and the immediately previous chapter for continuity.
|
||
- Ignore future chapters, editorial reviews, roundtables, polish drafts, and any non-chapter artifacts.
|
||
- Never pull facts from a deliverable whose filename indicates a later chapter than {chapter_ref}.
|
||
|
||
⚠️ CRITICAL: Your task name tells you EXACTLY which chapter to write.
|
||
Look at the CURRENT MESSAGE — write THAT chapter and ONLY that chapter.
|
||
Do NOT write Chapter 1 unless the message explicitly says "Chapter 1".
|
||
|
||
STEP 1 — READ THE OUTLINE / CHARACTER BIBLE:
|
||
Look at PROJECT DELIVERABLES for the outline file (it contains the Character Bible
|
||
if this is a fiction project, and the Chapter Outline for all projects).
|
||
Extract and record:
|
||
- Protagonist: exact name, voice description, age (if fiction)
|
||
- Love interest and supporting characters: exact names and roles (if fiction)
|
||
- World rules / constraints (if paranormal or speculative)
|
||
- This chapter's summary, emotional beat, and closing hook from the outline
|
||
If no outline/bible is available, use the character names and project details
|
||
from the task description above — be CONSISTENT throughout the book.
|
||
|
||
STEP 2 — FIND THE PREVIOUS CHAPTER:
|
||
Look at PROJECT DELIVERABLES for the chapter that comes BEFORE this one.
|
||
If no previous chapter exists (this IS Chapter 1), skip to STEP 4.
|
||
|
||
STEP 3 — QUOTE THE ENDING:
|
||
Copy the LAST 2–3 sentences of the previous chapter here, word for word.
|
||
Label them: "PREVIOUS CHAPTER ENDED WITH: ..."
|
||
Your new chapter MUST pick up from this exact moment.
|
||
|
||
STEP 4 — BUILD THE DRAFT PROMPT:
|
||
Write the exact drafting prompt for the next pass. That prompt must include:
|
||
- CHAPTER: Exact chapter number and title (from the task message)
|
||
- POV CHARACTER: Whose perspective are we in?
|
||
- FIRST LINE: The exact opening sentence, continuing from the previous ending
|
||
- EMOTIONAL ARC: What does the protagonist feel at start vs end?
|
||
- CHAPTER GOAL: What plot event MUST happen here?
|
||
- KEY BEATS: 3–5 numbered scene beats that will form the chapter
|
||
- CLOSING HOOK: Exact last image or line that makes readers continue
|
||
- Reminders about continuity, prose style, and target length
|
||
- CHARACTER VOICE PROFILES (pre-extracted):
|
||
{character_profiles}
|
||
If this block is empty, fall back to searching PROJECT DELIVERABLES for a file
|
||
containing "## Voice Signatures" and copy it here. PASS 1 must write every
|
||
character to their profile.
|
||
|
||
STEP 5 — CHECK LIVE CHARACTER STATE (if available):
|
||
Look in your RAG context for an asset called [character-state].
|
||
If it exists — this is WHERE and WHO each character is RIGHT NOW.
|
||
It OVERRIDES any outline predictions about character state.
|
||
Record as "LIVE CHARACTER STATE:" for use in PASS 1.
|
||
|
||
LOCATION CONTINUITY CHECK (perform this if [character-state] is present):
|
||
Does this chapter's outline place any character at a location inconsistent
|
||
with their Location field in [character-state]?
|
||
Example conflict: character-state says "Earth hospital" but outline opens on Mars.
|
||
If conflict found — FLAG before drafting:
|
||
"LOCATION CONFLICT: [char] is at [state-location] per last chapter but outline
|
||
places them at [outline-location]. Resolve: (a) open chapter in transit,
|
||
(b) adjust scene to actual location, or (c) write a time-skip bridge paragraph.
|
||
Do NOT silently teleport the character."
|
||
|
||
Also note any Active obligations, Open loops, or Known secrets from [character-state]
|
||
that should be honored or advanced in this chapter.
|
||
|
||
Also check RAG for [world-state] — current NPC attitudes and faction memory.
|
||
If present, record as "LIVE WORLD STATE:". Any NPC listed there who appears in
|
||
this chapter should behave according to their recorded attitude.
|
||
|
||
Stop here. Output ONLY the draft prompt. Do NOT write chapter prose yet.
|
||
|
||
- type: think
|
||
model: power
|
||
max_tokens: 32000
|
||
hint: |
|
||
PASS 1 — WRITE THE DRAFT
|
||
|
||
Use the draft prompt below as your exact writing brief:
|
||
|
||
{steps[0].text}
|
||
|
||
Requirements:
|
||
- Start with the FIRST LINE you planned — make it continue naturally from the previous chapter
|
||
- If the draft prompt contains a line starting with "LOCKED PREVIOUS CHAPTER HOOK:",
|
||
your FIRST LINE MUST directly resolve that hook — the reader expects the answer immediately
|
||
- If the draft prompt contains a line starting with "AUTHOR'S INTENT:", treat it as a
|
||
binding creative directive — your draft must satisfy that intent in full
|
||
- Follow the KEY BEATS in order, but write with full scene depth — don't skip
|
||
- All character names must be consistent with the bible/outline
|
||
- Every dialogue exchange must be tight and voice-distinct
|
||
- Show, don't tell — externalize emotion through action, detail, and dialogue
|
||
- Every scene beat moves the story forward OR reveals character (no filler)
|
||
- End with the CLOSING HOOK you planned
|
||
- Match the prose style guide: {prose_style}
|
||
- Target length: {chapter_target_words} words — write the FULL chapter, not a summary
|
||
- ⚠️ DO NOT stop early. If you have not reached {chapter_target_words} words, continue
|
||
writing — add interiority, sensory detail, extended dialogue beats, and scene transitions
|
||
until you hit the target. Short chapters will be REJECTED in adjudication.
|
||
|
||
DRAFTING DISCIPLINE — apply these on every page:
|
||
- {prose_style} is a hard constraint, not decoration
|
||
- Not every paragraph needs a memorable or quotable line — use functional connective prose
|
||
- Let observation precede interpretation: show the moment before naming what it means
|
||
- Avoid clustering aphorisms or thesis-style sentences back to back
|
||
- Prefer scene motion over thesis delivery — action and dialogue carry meaning
|
||
- Write ONE complete draft now. Do NOT self-polish. Reviewers will give feedback downstream.
|
||
|
||
VOICE ANTI-PATTERNS — THESE ARE FORBIDDEN ON EVERY PAGE:
|
||
- Do NOT open any chapter with the "didn't just X; it Y" sentence construction.
|
||
Every chapter must have a structurally distinct opener. Vary: in medias res,
|
||
quiet beat, dialogue cold open, environmental sweep, interiority.
|
||
No two consecutive chapters may use the same opener structure.
|
||
- The book's thematic contrast (whatever it is — body/mind, memory/possibility, etc.)
|
||
may appear ONCE per scene as a metaphor. Not in every paragraph. Trust the reader.
|
||
If you have used the contrast in the last two paragraphs, you may not use it again
|
||
for at least three more paragraphs.
|
||
- Do NOT label an emotion that you have already shown through action or dialogue.
|
||
If the character's hands are shaking, do not also write "she was afraid."
|
||
If the dialogue already conveys anger, do not add "his voice was furious."
|
||
- Do NOT count or reference chapter numbers in the prose.
|
||
"Five chapters of..." is an AI fingerprint. Never.
|
||
- Each character must have at least ONE verbal imperfection per scene they appear in:
|
||
a sentence they don't finish, a word they use wrong, a line that doesn't land,
|
||
a moment of fumbling before the right words come. Perfect dialogue is dead dialogue.
|
||
- Check the CHARACTER VOICE PROFILE in the outline/bible (if present) — if each
|
||
speaking character's dialogue cannot be identified as THEIRS without a speaker tag,
|
||
rewrite until it can. Verbal tics, pet phrases, and characteristic patterns are
|
||
non-negotiable signatures.
|
||
|
||
Output ONLY the draft chapter text.
|
||
Start directly with the chapter title (e.g., "Chapter N: [Title]") and opening line.
|
||
No commentary, no plan headers, no "Pass 1" label.
|
||
|
||
- type: think
|
||
hint: |
|
||
SELF-CHECK — STRUCTURAL VALIDATION ONLY
|
||
|
||
You have just written a chapter draft. Your job here is narrow: check the draft against
|
||
the structural checklist below, apply ONLY the corrections that fall within scope, and
|
||
output the final chapter.
|
||
|
||
DRAFT TO CHECK:
|
||
{steps[1].text}
|
||
|
||
CHECKLIST — check each item, note any issue found:
|
||
1. BEAT & HOOK: Does the chapter reach its intended emotional beat and closing hook
|
||
from the PASS 0 draft prompt? Flag if the chapter ends without the planned hook.
|
||
2. NAMES & POV: Are all character names and the POV consistent with the bible/outline?
|
||
Flag any name that doesn't match the project canon.
|
||
3. CONTINUITY TERMS: Do world rules, place names, and timeline references match
|
||
project state? Flag any factual break.
|
||
4. FORMATTING: Are there obvious section-break artifacts, duplicate headers,
|
||
or missing chapter title? Flag and fix.
|
||
5. WORD FLOOR: Is the draft within 10% of {chapter_target_words}? Flag only if
|
||
critically short (more than 20% under target) — do not expand for style.
|
||
6. OPENING HOOK: Check the PASS 0 draft prompt ({steps[0].text}) for a line labeled
|
||
"LOCKED PREVIOUS CHAPTER HOOK:". If present, verify the chapter's opening paragraph
|
||
directly resolves it. If not, add a brief resolution sentence at the opening —
|
||
do not leave a locked hook unanswered.
|
||
7. AUTHOR'S INTENT: Check the PASS 0 draft prompt ({steps[0].text}) for a line
|
||
starting with "AUTHOR'S INTENT:". If present, confirm the completed chapter
|
||
satisfies that intent — note whether it was honored or partially missed.
|
||
|
||
ALLOWED CORRECTIONS:
|
||
- Fix a wrong character name to match the canon name
|
||
- Fix a POV slip (e.g., the chapter is 1st-person but one paragraph shifted to 3rd)
|
||
- Fix a missing or duplicated chapter title/header
|
||
- If the chapter is missing its closing hook entirely, add it as a final paragraph
|
||
that matches the hook specified in the draft prompt — no new invention beyond the
|
||
planned hook
|
||
|
||
NOT ALLOWED — do not make any of these changes:
|
||
- Improve any sentence for prose quality, rhythm, or lyricism
|
||
- Deepen emotional beats or add interiority
|
||
- Expand any description or add sensory detail
|
||
- Reorder scenes or restructure the chapter
|
||
- Add new metaphors, aphorisms, or quotable lines
|
||
- Normalize or upgrade the authorial voice
|
||
|
||
OUTPUT FORMAT:
|
||
Start your response with a VALIDATION LOG section:
|
||
VALIDATION LOG:
|
||
1. BEAT & HOOK: [check pass/fail with brief note]
|
||
2. NAMES & POV: [check pass/fail with brief note]
|
||
3. CONTINUITY TERMS: [check pass/fail with brief note]
|
||
4. FORMATTING: [check pass/fail — note any fixes applied]
|
||
5. WORD FLOOR: [check pass/fail — include word count]
|
||
6. OPENING HOOK: [check pass/fail or N/A]
|
||
7. AUTHOR'S INTENT: [honored / partially missed — note / N/A if no intent set]
|
||
|
||
Then output the separator on its own line:
|
||
---BEGIN CHAPTER---
|
||
|
||
Then output the final chapter text (corrected where structurally required,
|
||
verbatim everywhere else). Start the chapter directly with the chapter title
|
||
and first line. No preamble or commentary within the chapter text.
|
||
|
||
# Commit chapter draft now — last_text() = self-check output (step 2). Must come before
|
||
# PASS 3 think so the character-state extraction does not overwrite last_text().
|
||
- type: document
|
||
filename: "Chapter_{chapter_number}_draft"
|
||
|
||
- type: think
|
||
hint: |
|
||
PASS 3 -- CHARACTER + WORLD STATE EXTRACTION
|
||
|
||
You have just completed the chapter. Extract structured state for continuity tracking.
|
||
Write in compact format -- this content will be stored as a RAG asset read by the
|
||
NEXT chapter's PASS 0. Every character who appeared must have an entry.
|
||
|
||
OUTPUT FORMAT -- write this EXACTLY, filling in real values:
|
||
|
||
# Character State: {chapter_ref}
|
||
|
||
## [Character Name]
|
||
Location: [specific location -- building, floor, city, planet -- no vague "nearby"]
|
||
Physical: [injuries, fatigue, notable physical state, or "no injuries"]
|
||
Emotional: [dominant emotion at chapter end; what they are CARRYING into next chapter]
|
||
Active obligations: [debts/promises owed, format: "owes [person] [what] (Ch[N]) -- UNPAID/PAID"]
|
||
Open loops: [unresolved conflicts, unanswered questions, format: "[parties] [issue] (Ch[N]) -- UNRESOLVED/RESOLVED"]
|
||
Known secrets: [information this character has that others don't -- format: "knows [what] -- [who does NOT know]"]
|
||
Arc: [XX%] -- [one sentence: what permanently changed in this character this chapter, or "no change"]
|
||
Permanent: [YES if something permanently changed (power gained/lost, relationship status changed, secret revealed); NO otherwise]
|
||
|
||
(Repeat for EVERY named character who appeared in this chapter)
|
||
|
||
# World State: {chapter_ref}
|
||
|
||
## NPC Memory
|
||
- [NPC Name] ([faction/location]): [ATTITUDE] -- [what happened] -- [behavioral consequence]
|
||
(List every NPC who interacted with a protagonist and now has a changed attitude)
|
||
|
||
## Faction Attitudes
|
||
- [Faction name]: [current attitude toward protagonists] -- [reason]
|
||
(List any faction whose attitude changed this chapter)
|
||
|
||
## Active World Events
|
||
- [Event]: [status and expected timeline]
|
||
(List any ongoing world events that will affect future chapters)
|
||
|
||
CRITICAL: Keep the total output under 3500 characters. Be precise and specific.
|
||
Do NOT write prose -- only the structured data above.
|
||
|
||
- type: rag_write
|
||
asset_id: "character-state"
|
||
max_chars: 4000
|
||
|
||
- type: document
|
||
filename: "character-state-{chapter_ref}"
|
||
|
||
- type: package
|
||
max_tokens: 12000
|
||
hint: |
|
||
The draft chapter has been written, self-checked, and committed.
|
||
|
||
CRITICAL — include the `chapter_text` field:
|
||
Copy the COMPLETE chapter text from the self-check output (step 2 — the final chapter draft)
|
||
into the `chapter_text` field.
|
||
Reviewers have NO other way to access the chapter content.
|
||
Do NOT summarize or truncate it — include every word of the chapter.
|
||
|
||
Now spawn the three independent editorial reviewers
|
||
and the roundtable debate. Use the exact task_names shown — the roundtable depends_on all three.
|
||
schema:
|
||
chapter_text: string
|
||
spawn:
|
||
- task_type: chapter_review
|
||
task_name: "Review (Devon): {chapter_ref}"
|
||
agent_name: Devon
|
||
priority: 6
|
||
_if: "not meta.is_locked"
|
||
context:
|
||
chapter_text: "{chapter_text}"
|
||
review_focus: developmental
|
||
genre_name: "{genre_name}"
|
||
genre_audience: "{genre_audience}"
|
||
chapter_ref: "{chapter_ref}"
|
||
chapter_number: "{chapter_number}"
|
||
review_letter: "a"
|
||
character_profiles: "{character_profiles}"
|
||
|
||
- task_type: chapter_review
|
||
task_name: "Review (Lane): {chapter_ref}"
|
||
agent_name: Lane
|
||
priority: 6
|
||
_if: "not meta.is_locked"
|
||
context:
|
||
chapter_text: "{chapter_text}"
|
||
review_focus: line
|
||
genre_name: "{genre_name}"
|
||
genre_audience: "{genre_audience}"
|
||
chapter_ref: "{chapter_ref}"
|
||
chapter_number: "{chapter_number}"
|
||
review_letter: "b"
|
||
character_profiles: "{character_profiles}"
|
||
|
||
- task_type: chapter_review
|
||
task_name: "Review (Cora): {chapter_ref}"
|
||
agent_name: Cora
|
||
priority: 6
|
||
_if: "not meta.is_locked"
|
||
context:
|
||
chapter_text: "{chapter_text}"
|
||
review_focus: continuity
|
||
genre_name: "{genre_name}"
|
||
genre_audience: "{genre_audience}"
|
||
chapter_ref: "{chapter_ref}"
|
||
chapter_number: "{chapter_number}"
|
||
review_letter: "c"
|
||
character_profiles: "{character_profiles}"
|
||
|
||
- task_type: chapter_roundtable
|
||
task_name: "Roundtable: {chapter_ref}"
|
||
agents:
|
||
- Devon
|
||
- Lane
|
||
- Cora
|
||
priority: 7
|
||
_if: "not meta.is_locked"
|
||
context:
|
||
chapter_text: "{chapter_text}"
|
||
genre_name: "{genre_name}"
|
||
genre_audience: "{genre_audience}"
|
||
chapter_ref: "{chapter_ref}"
|
||
chapter_target_words: "{chapter_target_words}"
|
||
character_profiles: "{character_profiles}"
|
||
depends_on:
|
||
- "Review (Devon): {chapter_ref}"
|
||
- "Review (Lane): {chapter_ref}"
|
||
- "Review (Cora): {chapter_ref}"
|
||
|
||
- type: close
|
||
rag_update: true
|
||
|
||
adjudication:
|
||
enabled: true
|
||
pass_threshold: 80
|
||
deliverable_type: consumer
|
||
criteria:
|
||
word_count:
|
||
weight: 30
|
||
description: "Chapter meets the {chapter_target_words}-word minimum; under-length chapters fail"
|
||
narrative_flow:
|
||
weight: 25
|
||
description: "Story progresses naturally with good pacing"
|
||
character_voice:
|
||
weight: 20
|
||
description: "Characters are distinct and consistent"
|
||
prose_quality:
|
||
weight: 15
|
||
description: "Writing is clear and readable; voice is consistent with {prose_style}"
|
||
continuity:
|
||
weight: 10
|
||
description: "Consistent with prior chapters and canon"
|