Zurück zur StoryForge-Hauptseite
StoryForge hat drei Validierungs-Ebenen:
| Ebene | Greift wann | Mechanik | Wer reagiert |
|---|---|---|---|
| Pre-Write | manuell vor dem Schreiben | Tool-Calls liefern strukturierte JSON-Briefs / Sanity-Checks | chapter-writer / rolling-planner |
| Pre-Save (Hook) | bei jedem Write/Edit auf draft.md, characters/*.md, people/*.md |
exit 2 → Tool-Call wird abgelehnt | PostToolUse-Hooks (validate_chapter, validate_character) |
| Post-Draft (Skill) | manuell aufgerufen nach Draft / vor Revision | Markdown-Reports, interaktive Fixes | User entscheidet |
Die Pre-Write-Schicht liefert dem Modell strukturierte Daten BEVOR die erste Wort geschrieben wird — get_chapter_writing_brief bündelt 14 Datenquellen (inkl. pov_character_inventory und pov_character_state), get_review_brief bündelt 8 Datenquellen für das Chapter-Review, get_continuity_brief bündelt Kalender + Travel Matrix + Canon-Facts + Character-Index für den Continuity-Check, verify_tactical_setup flaggt Walking-Order-Probleme. Die Pre-Save-Schicht ist die Production-Gate: kein Schreib-Versuch landet ohne Validation auf disk. Die Post-Draft-Schicht ist die deep-Review: ganze Bücher in einem Pass scannen, Cross-Chapter-Patterns erkennen, qualitative Bewertung.
| Gate | Ebene | Skill / Hook |
|---|---|---|
| Chapter Writing Brief | Pre-Write (Keystone) | MCP get_chapter_writing_brief |
| Tactical Setup Verifier | Pre-Write | MCP verify_tactical_setup |
| Pre-Scene Logic Audit | Pre-Write (pro Szene / Kapitel) | chapter-writer Step A1b / 2c |
| Recent Chapter Timelines | Pre-Write | MCP get_recent_chapter_timelines |
| Review Brief | Pre-Review (chapter-reviewer) | MCP get_review_brief |
| Continuity Brief | Pre-Check (continuity-checker) | MCP get_continuity_brief |
| PostToolUse Validator | Pre-Save (automatisch, 7 Scanner) | validate_chapter.py / MCP validate_chapter |
| PostToolUse Character-Validator | Pre-Save (automatisch, strukturell + empfohlene Sections) | validate_character.py — siehe Charakter-Anatomie |
| Voice Checker | Post-Draft / Prosa | voice-checker |
| Chapter Reviewer | Post-Draft / Einzelkapitel (28 Punkte + 20a POV-Boundary) | chapter-reviewer |
| Author Check | Post-Draft, Positive Style-Compliance (style_principles) | author-check |
| Chapter Humanizer | Post-Draft / Einzelkapitel (AI-Construction-Scan: 8 Section-11-Shapes + 55 Vokabular-Hits; interaktive Fixes in Autorenstimme) | chapter-humanizer |
| Chapter Proofreader | Post-Draft / Einzelkapitel (Rechtschreibung, Grammatik, Interpunktion — in Muttersprache des Autors erklärt) | chapter-proofreader |
| Chapter Fixer | Post-Draft / ad hoc, nach FAIL oder WARN aus Reviewer oder Manuscript Checker | chapter-fixer |
| First-Chapter Gate | Post-Draft / Kapitel 1 (härter) | in chapter-reviewer |
| Manuscript Checker (Fiction) | Post-Draft / Komplettes Buch | manuscript-checker |
| Manuscript Checker (Memoir) | Post-Draft / Komplettes Buch (+5 memoir-spezifische Kategorien) | manuscript-checker-memoir |
| Cross-Chapter Timeline Validator | Post-Draft / Kapitelübergreifender Zeitdrift | MCP validate_timeline_consistency |
| Continuity Checker | Post-Draft / Timeline / Travel / Canon | continuity-checker |
| Emotional Truth Pass | Post-Draft / Memoir-Kapitel (vor chapter-reviewer) | emotional-truth-prompt |
| Memoir Ethics Gate | Vor Export / Nur Memoir (Pflicht) | memoir-ethics-checker |
| rules-audit | Post-Draft (on-demand) | /storyforge:rules-audit |
Die Quality Gates sind nicht optional. Bücher, die sie überspringen, klingen wie AI-Output — auch wenn das Autorenprofil stark ist. Die Gates sind die zweite Schutzschicht.
Alle Checker-MCP-Tools geben ein einheitliches GateResult zurück:
| Feld | Typ | Inhalt |
|---|---|---|
status |
"PASS" | "WARN" | "FAIL" |
Maschinenlesbares Gesamt-Urteil |
reasons |
list[str] |
Lesbare Begründungen für das Urteil |
findings |
list[Finding] |
Strukturierte Findings mit File:Line-Referenzen |
metadata |
dict |
Checker-spezifische Extras (Counts, Pfade, ...) |
{
"status": "PASS|WARN|FAIL",
"reasons": ["..."],
"findings": [],
"metadata": {}
}
Aggregation: FAIL > WARN > PASS. validate_book_structure(book_slug) und run_pre_export_gates(book_slug) fassen mehrere Gate-Ergebnisse zu einem Gesamt-GateResult zusammen.
Strukturierte Daten-Briefs ergänzen die Hook-basierte Validierung. Statt 16 prose-prereq-loads in chapter-writer liefert ein einziges MCP-Tool ein deterministisches JSON.
mcp__storyforge-mcp__get_chapter_writing_brief(book_slug, chapter_slug) ist der Keystone-Tool. Bündelt 14 Datenquellen in einem strukturierten JSON, das chapter-writer mit einem Tool-Call konsumiert:
chapter (number, title, status, pov_character)pov_character (resolved name)story_anchor (current + previous chapter, relative-phrase-mapping)recent_chapter_timelines (letzte 3 review-or-later Kapitel als Intra-Day-Grids)recent_chapter_endings (last paragraph der letzten 3 Drafts)characters_present (full profiles + optional knowledge + tactical)pov_character_inventory (deterministisch extrahiertes Inventar des POV-Charakters; priority: frontmatter > timeline_regex > draft_heuristic > none; Items mit Quellen-Pointern wie chapter:26-the-basement:timeline:~12:55; nicht-leere warnings bedeuten: Benutzer fragen statt erfinden)pov_character_state (4 physische Kategorien: clothing, injuries, altered_states, environmental_limiters; jede Kategorie extrahiert unabhängig mit eigenem extraction_method; outline-aware warnings — nur wenn das Kapitel-Outline die fehlende Kategorie erwähnt; consumed by Pre-Scene Logic Audit Kategorie 5)rules_to_honor (book CLAUDE.md ## Rules, severity-classified als block/advisory)callbacks_in_register (book CLAUDE.md ## Callbacks)banned_phrases (deduplicated book + author + global, max 50)recent_simile_count_per_chapter (für simile-discipline-scaling)tone_litmus_questions (aus plot/tone.md)tactical_constraints (auto-aktiv bei Combat/Travel-Outline-Detection, sonst null)review_handle (aus ~/.storyforge/config.yaml)errors (component → error map, defensive composition)Defensive Composition: Jede Sub-Komponente ist in try/except gewrapt. Eine einzige Failure-Source landet als {component, error}-Eintrag in errors, der Brief shipped mit Partial-Daten weiter. Determinismus: gleicher Input → identischer Brief, inklusive errors-Reihenfolge.
Fallback für legacy Bücher: Ältere Blood & Binary-Kapitel encoden POV/Title in einer Markdown-## Overview-Tabelle statt YAML-Frontmatter. Der Brief parst beide Formate.
Skill-Größenreduktion: chapter-writer SKILL.md von 301 → 175 Zeilen. Prereqs: 16 nummerierte prose-loads → 9 Einträge.
Wenn das Buch Teil einer Serie ist, wird jeder Eintrag in characters_present um ein series_evolution-Feld angereichert, das dem chapter-writer Kontext über Buchgrenzen hinweg liefert.
characters_present[*].series_evolution Payload-Form:
"series_evolution": {
"tracker_slug": "kael",
"current_book_phase": "B2 Moonrise (geplant)",
"previous_book_end": "Mit Theo zusammen, Sera tot...",
"current_book_plan": "Trauernder Bruder, Macht-Asymmetrie kippt...",
"relationships_evolution": "- **Theo:** Liebe → ..."
}
Das Feld ist null wenn:
Das Feld ist immer vorhanden in jedem Character-Payload — Konsumenten können sich auf das Existieren des Keys verlassen und auf null prüfen, um "kein Serien-Kontext" von "Feld fehlt" zu unterscheiden.
Quelle: tools/state/loaders/series.py::build_series_evolution_for_character(). Source-Priorität für current_book_plan: Tracker geplant > ende > start (der zukunfts-gerichtetste Slot gewinnt). Bei B1-Kapiteln ist previous_book_end ein leerer String (kein Vorgängerband).
Cross-Link: siehe Character Anatomy → Series Lifecycle für den vollständigen Workflow.
mcp__storyforge-mcp__verify_tactical_setup(book_slug, scene_outline_text, characters_present) prüft Combat- und Travel-Szenen gegen optionale tactical:-Profile der beteiligten Charaktere:
tactical:
protector_role: false # actively protects others
protected_role: true # needs protection in combat
combat_skill: none # none|low|medium|high|elite|unknown
movement_lead: false # tends to take point
movement_rear: false # tends to bring up the rear
vulnerable_to: [daylight, silver]
carries: [knife]
5 Heuristik-Regeln:
movement_lead: true im Profil → warnPosition-Detection nutzt Sentence-bounded preceding-name attribution. „Theo walked flanked by Kael at point and Viktor at the rear" → Theo=middle, Kael=lead, Viktor=rear.
Liefert immer ≥3 questions-for-writer als Pre-Write-Checkliste — auch bei passes: true. Beispiel:
{
"passes": false,
"warnings": [
{"severity": "warn", "message": "Theo (protected_role: true, combat_skill: none) is in rear position. Protectors (Kael, Viktor, Dom) should flank or trail."}
],
"questions_for_writer": [
"Who is closest to Theo at all times?",
"Who scouts ahead?",
"What is the formation if they need to break and run?"
],
"detected_positions": {"Theo": "rear", "Kael": "lead", "Viktor": "middle", "Dom": "middle"}
}
chapter-writer Step A2 und rolling-planner Step 4b rufen das Tool gegated auf Combat/Travel-Keyword-Detection auf (is_tactical_scene).
Der Pre-Scene Logic Audit ist ein strukturierter Pflicht-Block, den chapter-writer vor jeder Szene (Mode A: Step A1b) bzw. einmalig vor dem Kapitel (Mode B: Step 2c) in den Chat emittiert — das strukturelle Gegengewicht zu kontextdruckbedingter Erfindung: unter Kontextdruck neigen Modelle dazu, mehrere unbelegte Details pro Szene zu erfinden, wenn sie nicht gezwungen werden, Quellen erneut zu prüfen.
Das Modell, das soeben vier Szenen am Stück geschrieben hat, konsultiert die geladenen Quellen nicht zuverlässig neu, außer es wird dazu gezwungen. Der Audit-Block ist diese Erzwingung.
Fünf Pflicht-Kategorien — jede mit Quellenangabe in einem Satz. Lücken werden explizit kommuniziert, nicht überbrückt:
| Kategorie | Quelle | Bei Lücke |
|---|---|---|
| 1. Inventar (POV-Charakter) | Brief pov_character_inventory (frontmatter-Priorität, Quellen-Pointer) |
warnings nicht leer → Benutzer fragen statt erfinden |
| 2. Geografie | world/setting.md (Travel Matrix), plot/timeline.md, recent_chapter_timelines |
Route mental modellieren vor Bewegungsverb |
| 3. Biografie & Beziehungen | characters/{slug}.md, Brief canon_brief (pov_relevant_facts + changed_facts) — für die ungefilterte Faktenliste im Scope-Fenster standalone MCP get_canon_brief() aufrufen |
Quellen-freie Behauptung → fragen |
| 4. Verbotene Phrasen + Autor-Tics | Brief banned_phrases, Autorenprofil recurring_tics / donts |
Beat umplanen, bevor Prosa entsteht |
| 5. Sensorische Plausibilität | Brief pov_character_state (clothing, injuries, altered_states, environmental_limiters) |
extraction_methods[cat] == "none" + Beat abhängig → fragen |
Beispiel (Kategorie 1):
"Theo (Kap 26 ~12:55, Quelle: chapter:26-the-basement:timeline:~12:55): Kompass, Silbermesser, signalloses Telefon, halber Power-Riegel, Missions-Jacke. Flugblatt NICHT bei ihm."
Beispiel (Kategorie 5):
"
pov_character_state.clothing→ taktische Boots (frontmatter); geplanter Beat 'die Stufen waren kälter als erwartet' → Boots verhindern direkten Stein-Kalt-Kontakt → umschreiben in 'Er griff das steinerne Geländer — kalt genug, dass er es selbst durch die Handschuhe spürte.'"
mcp__storyforge-mcp__get_recent_chapter_timelines(book_slug, n=3) lädt die letzten N review-or-later Kapitel als JSON. Filter: rank ≥ 2 (Drafts/Outlines werden übersprungen). Verhindert Cross-Chapter Cascade-Drift — Fakten, die stillschweigend zwischen Kapiteln driften, wenn frühere Inhalte nicht erneut konsultiert werden.
Hinweis: get_continuity_brief liefert Intra-Day-Grids aller Kapitel (statusunabhängig) — für den Continuity-Checker, der alle Drafts scannen muss. get_recent_chapter_timelines filtert auf review-or-later — für den Chapter-Writer, der nur etablierte Zeitanker braucht.
mcp__storyforge-mcp__update_character_snapshot(book_slug, pov_slug, snapshot_json, book_category) persistiert den End-of-Chapter-Zustand des POV-Charakters zurück in characters/{pov_slug}.md (Fiction) bzw. people/{pov_slug}.md (Memoir) als YAML-Frontmatter-Felder.
Geschriebene Felder:
current_inventory — Items, die der Charakter am Kapitelende trägtcurrent_clothing — Kleidung / Ausrüstung am Körpercurrent_injuries — Wunden, Schmerzen, Mobilitätsbeschränkungenaltered_states — Erschöpfung, Rausch, Hunger, Schockenvironmental_limiters — Sensorische Dämpfer (Maske, Helm, Gehörschutz)as_of_chapter — Chapter-Slug des letzten UpdatesWarum das wichtig ist: pov_character_inventory und pov_character_state nutzen Frontmatter als höchste Extraktionspriorität. Ohne Write-Back degradiert jeder neue Chapter-Brief auf timeline_regex oder draft_heuristic — fragile Quellen, die stille Zustandsänderungen verpassen. Ein 30-Sekunden-Snapshot-Dialog nach Kapitelabschluss hält den Brief für alle Folgekapitel scharf.
Trigger (chapter-writer Step 7.8): Das Skill extrahiert den Endzustand aus dem soeben geschriebenen Chapter-Timeline-Block, schlägt einen Snapshot vor, wartet auf Bestätigung oder Korrekturen und persistiert dann. Nur bei Review / Final-Übergängen — nicht bei Zwischenspeicherungen im Draft-Status.
mcp__storyforge-mcp__get_review_brief(book_slug, chapter_slug) bündelt die Daten, die chapter-reviewer für einen vollständigen 28-Punkte-Check braucht — ein einziger Aufruf ersetzt 6+ direkte Datei-Reads:
chapter_timeline — Intra-Day-Grid des aktuellen Kapitels (Start/Ende/Szenen)previous_chapter_timeline — Grid des Vorgänger-Kapitels (Cross-Chapter-Zeitanker)canonical_timeline_entries — kanonische Story-Kalender-Einträge aus plot/timeline.md (Tag/Datum/Kapitel/Events)travel_matrix — alle Routen aus world/setting.md (von/nach/Distanz/Reisezeit)canon_log_facts — alle Fakten aus plot/canon-log.md mit Status (ACTIVE / CHANGED)tonal_rules — Non-Negotiable-Rules, Litmus-Test, Banned-Prose-Patterns, Warning-Signs aus plot/tone.mdactive_rules — Regeln aus dem Per-Book CLAUDE.md mit Severity (block / advisory)active_callbacks — offene Callbacks aus dem Per-Book CLAUDE.md ## Callback RegisterKapitel-Drafts sind bewusst NICHT im Brief enthalten — sie sind die zu prüfenden Daten, nicht Projekt-Zustands-Metadaten (ADR-0001: data-briefs-over-prompt-instructions).
Defensive Composition: Gleiches _Recorder-Pattern wie beim Chapter Writing Brief — jede Sub-Komponente ist in try/except gewrapt. Nicht-leere errors bedeuten: manche Dateien fehlten oder waren nicht lesbar; der Brief shipped trotzdem mit Partial-Daten weiter.
mcp__storyforge-mcp__get_continuity_brief(book_slug) bündelt alles, was continuity-checker für einen buchweiten Scan braucht:
canonical_calendar — geparste plot/timeline.md Events (story_day/real_date/chapter_slug/key_events)travel_matrix — geparste world/setting.md Travel-Matrix-Zeilen (von/nach/Distanz/Transport/Reisezeit/Notizen)canon_log_facts — geparste plot/canon-log.md Fakten mit Status (ACTIVE / CHANGED / SUPERSEDED) und Domaincharacter_index — alle Charakter-Dateien als Flat-List (Slug/Name/Rolle/Beschreibung)chapter_timelines — Intra-Day-Grids aller Kapitel (jeder Status) — Source of Truth für Kapitel-Start/End-AnkerAnders als get_recent_chapter_timelines (das auf review-or-later Kapitel filtert) enthält der Continuity Brief alle Kapitel — auch Drafts und Outline-Stage — weil der Continuity-Checker das komplette Manuskript scannt.
Kapitel-Drafts sind bewusst NICHT im Brief enthalten — sie sind die zu prüfenden Daten, nicht Projekt-Zustands-Metadaten (ADR-0001).
Der wichtigste Quality-Gate. Läuft automatisch nach jedem Write/Edit/MultiEdit auf **/chapters/*/draft.md. Liest die Claude-Code-JSON-Payload via stdin, scopes sich strikt auf Chapter-Drafts, andere Files passieren ungestört.
Ein zweiter PostToolUse-Hook — validate_character.py — läuft parallel zum Chapter-Validator und scopet sich auf **/characters/*.md und **/people/*.md. Dasselbe JSON-Payload-Protokoll, dieselbe Exit-Code-Semantik, anderes Schema. Im Detail dokumentiert unter Charakter-Anatomie.
Läuft nach jedem Write/Edit auf **/characters/*.md und **/people/*.md.
Geprüfte Constraints:
VALID_ROLES-Setseries_evolution-Block vorhandenBei Constraint-Verletzungen: Exit Code 2 (blockiert den Write).
| Severity | Effekt | Verhalten |
|---|---|---|
block |
Hook returns exit code 2 | Tool-Call wird abgelehnt, stderr wird ins Modell zurückgespielt, Modell muss fixen |
warn |
Hook returns exit code 0 | Findings landen im Output, blockt nicht |
info |
Hook returns exit code 0 | Hinweis ohne Druck (z.B. Knowledge-Profile fehlt) |
Default ist strict. Buch kann via Frontmatter in der CLAUDE.md auf warn schalten:
---
linter_mode: warn
---
# Mein Buch
Im warn-Modus wird auch bei block-Severity nicht abgelehnt — alle Findings nur als stderr-Warnungen. Notfall-Override wenn z.B. ein Pattern zu aggressiv ist und schnell weitergeschrieben werden soll.
Quelle: projects/{book}/CLAUDE.md Section ## Rules mit Backtick-Patterns
Per-Szene-Counter: Wenn Regel ein max N per chapter-Limit deklariert, wird das proportional zur aktuellen Draft-Länge skaliert. Bei 900-Wort-Szene und 3200-Wort-Chapter-Target ergibt max 3 per chapter einen Per-Szene-Limit von 1.
Beispiel-Output:
[BLOCK] draft.md line 12: phrase 'kind of X that Y' appears 5 times
(scaled scene limit: 1; chapter cap: 3; current draft: 904w of 3200w
target). Cut at least 4. line 3: ...She walked the kind of corridor
that smelled...; line 5: ...He noticed the kind of silence that follows...
Erkannte Limit-Phrasings: max N per chapter, max N-M per chapter (Obergrenze), maximum N per chapter, max of N per chapter, limit to N per chapter, deutsch max N per kapitel.
Quelle: ~/.storyforge/authors/{slug}/vocabulary.md Sections ### Absolutely Forbidden, ### Forbidden Hedging Phrases, ### Forbidden Emotional Tells, ### Forbidden Structural Patterns
Slug-Auflösung: automatisch aus Buch-CLAUDE.md ## Book Facts (- **Author:** Ethan Cole)
Inflektions-Matching: Single-Words mit silent-e (delve) matched auch delved, delving, delves. Multi-Word-Phrasen exakt.
Beispiel-Output:
[BLOCK] draft.md line 23: Banned by author voice
(author-vocab (Absolutely Forbidden)): 'delve'
Hardcoded Patterns: Ch \\d+, callback(s), as established, echoes the earlier, foreshadow*, calls back to, parallels|mirrors (the|his|her|their) (earlier|previous)
HTML-Kommentare ausgenommen — Outline-Notation in <!-- ... --> bleibt erlaubt
Beispiel-Output:
[BLOCK] draft.md line 47: meta-narrative phrase 'Ch 15' (chapter
reference) — name the event or character instead of pointing to
the chapter number
Bewusst ausgenommen: beat, set piece, bare parallels — zu viele legitime Prosa-Verwendungen ohne Narration-vs-Dialog-Awareness.
Liest ## Chapter Timeline Start/End aus dem aktuellen Chapter README
Mappt relative Phrasen (yesterday, tomorrow, last week, an hour ago, last night, etc.) auf konkrete Story-Daten
Beispiel-Output:
[WARN] draft.md line 47: phrase 'yesterday' implies Mon Dec 23 ~19:30
(chapter starts Tue Dec 24 ~19:30). Verify against plot/timeline.md.
Bewusst nur warn, nicht block. Block-on-implied-event-conflict braucht semantic event-matching, das ohne LLM zu false-positive-anfällig ist.
Quelle: reference/craft/anti-ai-patterns.md Section ### Heavily Flagged Words and Phrases
~50 kuratierte Patterns (delve, tapestry, vibrant, embark, etc.)
Beispiel-Output:
[WARN] draft.md line 8: AI-tell 'tapestry' found (3 occurrences)
Pendant im Manuscript-Checker: /storyforge:manuscript-checker scannt dieselbe Section-1-Vokabel zusätzlich und meldet sie unter ai_tell_violation (Severity medium). Der Hook stoppt bypass-Writes; der Manuscript-Checker fängt sie auf dem finalen Pre-Export-Sweep.
Misst Standardabweichung der Satzlängen über die ganze Szene
Bei std_dev < 4 → Warnung (Text klingt zu uniform → AI-typisch)
Beispiel-Output:
[WARN] draft.md: Low sentence length variance (std_dev=2.3) — text
may sound AI-generated. Vary sentence lengths more.
Zweck: Verhindert close-third POV-Drift, bei dem die Narration Domänen-Wissen attribuiert, das der POV-Charakter nicht hat. Beispiel: „blood smells when it has been on the ground for a while in cold air" — geschrieben aus Theos IT-Guy POV, einer Domäne, in der er keine Expertise hat.
Quellen: POV-Charakter aus chapter.yaml / Overview-Tabelle, Knowledge-Profile aus characters/{pov-slug}.md (optionaler knowledge:-Block), Vokabular aus reference/craft/knowledge-domains/{domain}.md
Strippt Dialog (gerade + krumme Anführungszeichen) bevor gescannt wird — narrator-knowledge gate, nicht character-speech
Word-Boundary-Match (regression-tested): pea matcht NICHT in appeared, speak, ahead.
Knowledge-Schema im Charakter-Profile:
knowledge:
expert: [it, programming, networking, devops]
competent: [photography, brewing_coffee]
layperson: [psychology, history, philosophy]
none: [forensics, ballistics, medicine, tactical_combat, automotive_repair]
5 Seed-Domains unter reference/craft/knowledge-domains/: forensics, tactical_combat, medicine, ballistics, automotive_repair — community-erweiterbar via PR
Free-form Domain-Keys (z.B. learned_from_kael) werden als competent behandelt
Flaggt Phrasen aus Domains, für die der POV-Charakter none oder layperson deklariert hat
Beispiel-Output:
[WARN] draft.md line 47: POV BOUNDARY: 'blood smells when' (domain: forensics,
Theo Wilkons knowledge: none). Move into dialog by an expert, reframe as
lay observation, or cut.
Bewusst nur warn, nicht block. POV-Calls sind nuanciert; False-Positives akzeptabel, False-Negatives bei echten Domänen-Mismatches (z. B. ein Charakter argumentiert mit forensischem Fachwissen, das er nicht hat) nicht.
chapter-reviewer Sub-Point 20a oberflächt diese Warnings im 28-Punkt-Review.
Zusätzlicher Gate (v3.0.0): Der Hook erzwingt Canon-Fakten-Aufzeichnung vor Kapitel-Statuswechsel nach "Review".
Schreib-Versuch von Theo clocked the door in einer Blood-&-Binary-Szene:
StoryForge linter blocked this write:
[BLOCK] draft.md line 12: Banned by author voice
(author-vocab (Absolutely Forbidden)): 'clocked'
[BLOCK] draft.md line 12: Banned phrase from book CLAUDE.md: 'clocked'
Plus 3 non-blocking warnings:
[WARN] draft.md line 8: phrase 'yesterday' implies Mon Dec 23 ~19:30
(chapter starts Tue Dec 24 ~19:30). Verify against plot/timeline.md.
[WARN] draft.md line 15: AI-tell 'tapestry' found (1 occurrence)
[WARN] draft.md line 47: POV BOUNDARY: 'lividity' (domain: forensics,
Theo Wilkons knowledge: none).
Fix the blocking issues and try again. Set `linter_mode: warn` in the
book's CLAUDE.md frontmatter to override.
Das Modell empfängt diese Meldung in stderr und muss die Block-Severity-Issues fixen, bevor der nächste Write akzeptiert wird.
CLAUDE.mdDamit Hook und Soft-Warnings sauber zusammenspielen, gilt eine klare Markup-Konvention in ## Rules-Bullets:
| Markup | Bedeutung | Wer reagiert |
|---|---|---|
`phrase` (Backticks) |
Hard-Block-Pattern | PostToolUse-Hook → exit 2 |
*phrase* (Italics) |
Heuristik-Marker für manuelles Review | manuscript-checker (Soft) |
"phrase" (Double-Quotes) |
Beispiele, Replacements, advisory | Nur Lese-Hilfe für Modell |
Mehr Details in der StoryForge-Hauptseite.
Eine eigene Layer für Editier- und Audit-Tools, die mit dem Inhalt des Buch-CLAUDE.md ## Rules-Blocks arbeiten. Drei MCP-Tools plus ein interaktiver Skill — ergänzen den PostToolUse-Hook und den Manuscript-Checker, ohne mit ihnen zu konkurrieren.
Wann diese Layer nutzen:
| Tool | Zweck | Returns |
|---|---|---|
list_book_rules(book_slug) |
Inventar aller Rules im RULES-Block | [{index, title, raw_text, has_regex, has_literals, extracted_patterns}] |
lint_book_rules(book_slug) |
Bulk-Audit gegen den Pattern-Extraction-Vertrag | {rules_total, issues: [{rule_index, title, warnings, extracted_patterns}]} |
update_book_rule(book_slug, rule_match, new_text, validate=True) |
Rule editieren oder löschen, mit Re-Lint | {found, changed, rule_index, old_text, new_text, warnings, extracted_patterns} |
Alle drei operieren ausschließlich innerhalb der <!-- RULES:START --> / <!-- RULES:END --> Marker. Statische Rules über dem Block bleiben unsichtbar — sie sind Template-Boilerplate, nicht user-managed.
append_book_rule(book_slug, text, validate=True) lintet ebenfalls beim Anlegen. Default validate=True — neue Rules mit scanner-blinden Shapes melden sich beim Append, nicht erst, wenn der Manuscript-Checker schon ratlos durchläuft.
| Warning | Wann es feuert | Hinweis |
|---|---|---|
italic_examples_with_ban_cue |
Ban-Cue + *"phrase"*-Examples in der Rule |
Italic-wrapped Examples sind für den Scanner unsichtbar — backticks nutzen |
mixed_positive_negative_quotes |
Ban-Cue + zwei oder mehr "..."-Phrasen |
Scanner extrahiert ALLE quoted phrases als Bans, auch positive Beispiele |
bracket_placeholder |
Backtick-Body enthält [noun], [verb], [subj] etc. |
Scanner liest es als Character-Class, nicht als Placeholder — \w+ nutzen |
scanner_extracts_nothing |
Ban-Cue ohne backticks und ohne quoted phrase | Rule ist effektiv tot; backticks ergänzen UND eine Alternative dokumentieren |
Das Lint nutzt denselben Pattern-Extractor wie der manuscript-checker — was das Lint flaggt, würde der Scanner auch silently dropping. Die Lint-Logik driftet nicht von der Scanner-Logik weg.
Derselbe Contract gilt auf der Autorenprofil-Seite. write_author_discovery(validate=True) läuft einen section-aware Linter über jeden Recurring-Tic-, Don't- oder Style-Principle-Bullet und hängt warnings + extracted_patterns an die MCP-Antwort. Fünf Codes:
| Sektion | Code | Wann er feuert |
|---|---|---|
donts |
mixed_positive_negative_italics |
Italics auf beiden Seiten eines Empfehlungs-Markers (Render, Instead:, →, ...) — die Post-Marker-Italics werden stumm NICHT als Bans extrahiert. |
donts |
mixed_positive_negative_quotes |
Mehrere doppelte Quotes unter einem Ban-Cue — jede Quote vor dem Marker extrahiert als Ban. |
donts |
scanner_extracts_nothing |
Ban-Cue ohne Backtick / Quote / Italic — Regel kann nicht greifen, weil der Scanner kein Pattern sieht. |
recurring_tics |
bold_title_unscannable |
Nicht-ASCII-Titel + kein Body-Pattern — der Titel-Text-Fallback würde einen deutschen Rule-Name kompilieren, der nie englische Prosa matcht. |
donts, recurring_tics, style_principles |
bracket_placeholder |
Backtick-Body enthält [word] — das ist eine Character Class, kein \w+-Placeholder. |
Style Principles geben bewusst KEINE Scanner-Gap-Warnings — sie werden by design nicht maschinell gescannt.
Der Write selbst wird durch Lint-Warnings nie blockiert — der Lint ist Observability, damit das Harvest-Skill sie dem User zeigen kann und der User entscheidet, ob bleiben, editieren oder neu schreiben.
/storyforge:rules-auditManuell die drei Tools zu orchestrieren ist machbar, aber mühsam. /storyforge:rules-audit [book-slug] macht das Audit interaktiv: Scan → Findings-Tabelle → Triage pro Finding → Apply mit Re-Lint → Report.
Vier Triage-Optionen pro Finding:
Nach jedem Write läuft das Re-Lint. Wenn der Fix neue Warnings produziert, kann der User iterieren oder akzeptieren. Final Re-Lint zur Verifikation, Report über fixed / cleaned / skipped / still flagged.
Rules-Audit ändert nie Rules ohne User-Confirmation. Lint-Findings sind advisory; der User besitzt die Rule-Semantik.
rules-audit — Prüft Buchregeln auf Hook-Blindstellen (Muster die der Scanner nicht erkennt), triagiert Findings, wendet Fixes an. Kein automatischer Gate — on-demand via /storyforge:rules-audit.
Die Rules-Hygiene-Layer ist die proaktive Variante der Migration im Quote-Format. Migration konvertiert nur "..." → `...`; das Lint flaggt zusätzlich die Shape-Probleme, die auch nach Backtick-Konversion bleiben (italic-Examples mit Ban-Cue, mixed Quotes, dead Patterns).
Reihenfolge bei Legacy-Büchern: erst migrate_to_backticks, dann /storyforge:rules-audit für die übrigen Shape-Issues.
Das Skill /storyforge:chapter-humanizer ist der chirurgische AI-Tell-Entferner. Während der voice-checker einen holistischen Score liefert, macht der Humanizer konkrete Vorschläge pro Fund und schreibt sie nach Freigabe direkt in draft.md zurück.
Workflow-Position: nach chapter-reviewer, vor chapter-proofreader.
Acht Shapes aus anti-ai-patterns.md Section 11, die häufig in AI-generierter Prosa auftauchen:
| Shape | Beispiel-Muster | Warum AI-Typisch |
|---|---|---|
| 11.1 Embodied Abstract Emotion | "Her chest ached with grief" | Körperteil als Emotions-Träger |
| 11.2 Trust Split | "his hands did what they always did" | Körperreaktion als separater Agent |
| 11.3 Silence-as-Volition | "the silence stretched between them" | Stille als handelndes Subjekt |
| 11.4 Possession Split | "her voice found its way" | Besitz-Konstrukt als Agent |
| 11.5 Latent-Property Abstraction | "the darkness pressed in" | Abstrakte Eigenschaft als Subjekt |
| 11.6 Ontological State Separation | "stayed there until he could trust his face again" | Existenz-Zustand von Person getrennt |
| 11.7 Backward-Negation Loop | "what it had been refusing to close on" | Verneinung in Vergangenheitsform verschachtelt |
| 11.8 Expository Repeat | "They had silver on her... a vampire they had silver on" | Dasselbe Faktum zweimal erklärt |
Interact-Format: Nummerierte Hit-Liste. User antwortet apply 1, 3 / skip 2 / 4: shorter. Maximal 20 Hits pro Batch, maximal 2 Iterationen pro Session.
55 flagged Wörter aus Section 1 der anti-ai-patterns.md. Typische Beispiele:
| voice-checker | chapter-humanizer | |
|---|---|---|
| Modus | Diagnose / Score | Chirurgisch / interaktiv |
| Output | Score 0–100, Dimensionen | Nummerierte Hit-Liste, Fixes |
| Schreibt in draft.md | Nein | Ja (nach User-Freigabe) |
| Pflichtschritt | Nein (optional) | Ja (nach chapter-reviewer) |
| Wann nutzen | Scorecard-Check, Vergleich über Kapitel | AI-Tells aktiv entfernen |
Das Skill /storyforge:voice-checker ist kein Pflichtschritt im Standard-Workflow. Es liefert einen holistischen Authentizitäts-Score (0–100) über 7 Dimensionen — nützlich als optionaler Scorecard-Check, aber nicht als Ersatz für den gezielten chapter-humanizer-Pass. Für per-Hit-Entfernung von AI-Tells in Draft-Prosa: /storyforge:chapter-humanizer verwenden.
Das Skill scannt Text in sieben Dimensionen. Es vergleicht gegen das Autorenprofil und gegen den eingebauten Anti-AI-Pattern-Katalog.
Was wird geprüft:
anti-ai-patterns.md-ListeOutput-Beispiel:
Vocabulary — 5 AI-Tells gefunden
---
Zeile 234: "journey" (gebanntes AI-Nomen)
Zeile 401: "tapestry of emotions" (abstraktes Nomen-Cluster)
Zeile 612: "landscape" (metaphorisch, gebannt)
Zeile 823: "it's worth noting" (Hedging)
Zeile 1205: "embraced" (AI-Verb in metaphorischem Kontext)
Was wird gemessen:
Menschliche Prosa: StdDev > 8 Wörter. Mix aus 3-Wort-Fragmenten und 35-Wort-Satzbögen.
AI-Prosa: StdDev < 5 Wörter. Verdächtig gleichmäßig.
Flag-Regel: Mindestens 5 aufeinanderfolgende Sätze innerhalb eines 3-Wort-Längenfensters → Warning.
Output-Beispiel:
Sentence Length Analysis
---
Mean: 14.3 words
Median: 13 words
StdDev: 4.2 words (⚠️ AI-verdächtig, < 5)
Flags:
- Absatz 4: 6 aufeinanderfolgende Sätze 12-15 Wörter → uniform
- Absatz 11: 4 aufeinanderfolgende Sätze 14-17 Wörter → uniform
Prüfungen:
Prüfungen:
Prüfungen:
Prüfungen:
Prüfungen:
Am Ende gibt es einen AI-Tell-Score von 0-100:
| Score | Bewertung |
|---|---|
| 0-20 | Solid — bereit für Next Stage |
| 21-40 | Akzeptabel — minor Fixes empfohlen |
| 41-60 | Problematisch — revise Kapitel |
| 61-80 | AI-verdächtig — major Überarbeitung |
| 81-100 | Praktisch AI-generiert — komplett neu schreiben |
Das Skill /storyforge:chapter-reviewer prüft ein Einzelkapitel gegen eine 28-Punkte-Liste (plus Subpoints).
| Kategorie | Punkte | Fokus |
|---|---|---|
| Structure | 5 | Opening, Scene-Sequel, Arc, Ending, Pacing |
| Craft | 5 + 1 | Show/Tell, Senses, Specific Details, Dialog, Conflict, Simile Discipline |
| Voice | 5 + 1 | Author-Konsistenz, Tone, Vocabulary, Rhythm, Dialog-Voice, Phrase Micro-Echo (14b) |
| Continuity | 5 + 1 | Canon, Timeline, Travel, Stale-References, Character-Facts, POV-Boundary (20a) |
| Tonal Consistency | 5 | Dominant-Mode, Warning-Signs, Non-Negotiable-Rules, Litmus-Test, Banned-Patterns |
| Intra-Day Timeline | 3 | Time-Anchor, Internal-Consistency, Cross-Chapter |
Jeder Simile und jede Metapher im Kapitel wird einem Zwei-Fragen-Test unterzogen:
Flag-Fälle:
Author-Voice-Bias: Wenn das Profil einen simile-reichen Stil dokumentiert (z.B. viktorianisch, Chandler-like), wird milder bewertet — die Prüfung greift Qualität, nicht Quantität.
Innerhalb eines 3-Satz-Fensters werden Inhaltswörter (Nomen, Verben, Adjektive) auf Close-Range-Wiederholung geprüft — ohne beabsichtigten rhetorischen Effekt.
Drei Flag-Fälle:
"the locked-down quality … Theo knew that quality")Ausgenommen: Bewusste Wiederholung (Anapher, Refrain, Litanei).
Severity: Standard WARN — FAIL nur wenn der Echo einen kritischen Scene-Beat entgleist. Empfehle immer den einfachsten Fix zuerst: Pronomen, Synonym oder Umformulierung — keine elaborierte Bildsprache.
Surfaced PostToolUse-Hook-Warnings im Review-Report. Pro [WARN] pov_boundary-Finding aus dem Hook gibt es drei Remediation-Optionen:
Skip wenn POV-Charakter kein knowledge:-Block hat — graceful degrade.
5 neue Plot-Logic-Checks im Chapter-Reviewer. Alle rufen analyze_plot_logic(book_slug, chapter_slug) auf und surfacen Findings im Review-Report.
| Sub-Point | Kategorie | Detection | Memoir |
|---|---|---|---|
| 20b | causality_inversion |
Deterministisch — Cause-After-Effect via Story-Day-Map | Aktiv |
| 20c | chekhov_gun |
Deterministisch — registrierte Promises ohne Payoff bis zum Ende des bisher gedrafteten Manuskripts | Skipped |
| 20d | information_leak |
LLM-Pass mit Canon-Log-Knowledge-Index — POV-Charakter weiß Dinge, die noch nicht etabliert sind | Aktiv |
| 20e | motivation_break |
LLM-Pass mit Character-Arc-Index — Charakter-Aktion bricht mit etabliertem Arc-State | Aktiv |
| 20f | pov_knowledge_boundary |
LLM-Pass mit knowledge:-Block — semantisch (Domain-Wissen, das nicht deklariert ist) |
Aktiv |
Architektur: deterministische Datenquellen + statische Detektoren leben im MCP-Tool, die LLM-Passes für die semantischen Kategorien leben im Skill — gefüttert durch den knowledge_index des Tools (Canon-Log-Fakten, Story-Day-Map, Promises-Register).
Pflicht-Voraussetzung für chekhov_gun: Das Kapitel muss eine ## Promises-Sektion im Kapitel-README.md haben. chapter-writer befüllt sie automatisch beim Übergang Draft → Review. Bei älteren Büchern ohne diese Sektion einmalig /storyforge:backfill-promises <book-slug> laufen lassen.
## Chapter Review: "Das Leuchtfeuer" (Kapitel 2)
### Structure (5 / 5)
- [x] 1. Opening hook — "Der Nebel kam nicht vom Meer." Starker Opener.
- [x] 2. Scene-sequel flow — Drei klare Scene-Sequel-Paare
- [x] 3. Chapter arc — Arne geht von Misstrauen zu Neugier
- [x] 4. Ending — Cliffhanger mit Silbermünze
- [x] 5. Pacing — Atmosphäre-Aufbau, dann Twist
### Craft (4 / 5 + subpoint)
- [x] 6. Show don't tell
- [x] 7. Sensory details (sight, sound, smell stark — kein taste)
- [WARN] 8. Specific details — "die Möbel" statt konkret (Zeile 47)
- [x] 9. Dialog quality
- [x] 10. Conflict
- [WARN] 10b. Simile discipline — 1 gestapelter Simile-Absatz (Z. 201-203)
### Voice (5 / 5)
[alle PASS]
### Continuity (3 / 5 + subpoint)
- [x] 16. Canon consistency
- [x] 17. Timeline accuracy
- [FAIL] 18. Travel consistency — Arne geht in 15 min vom Hafen zum
Leuchtturm; Travel Matrix sagt 25 min.
- [x] 19. Stale references
- [FAIL] 20. Character facts — Inga wird als 32 beschrieben, Canon sagt 34
- [WARN] 20a. POV boundary — Z. 89: "lividity" (forensics, Arne knowledge: none)
→ in Dialog von Pfarrer Thaden verschieben oder als
"Toten-Flecken" lay observation reframen
### Tonal Consistency (5 / 5)
[alle PASS]
### Intra-Day Timeline (3 / 3)
[alle PASS]
### Phrase Echo Report
- Close-Range-Echos gefunden: keine
- Intentionale Refrains ausgeschlossen: 0
## Overall: 23 / 28 — Revise before Final
Critical: Fix travel time (Z. 87), fix Inga age (Z. 134), POV-Boundary Z. 89
Polish: Specific details Z. 47, simile stack Z. 201-203
/storyforge:author-check ist das positive Gegenstück zum manuscript-checker — er prüft nicht was fehlt oder verboten ist, sondern ob die genre- und ton-spezifischen positiven Stilmuster des Autors im Draft präsent sind.
Nach chapter-writer oder chapter-reviewer. Optional, aber empfohlen vor chapter-humanizer.
## Writing Discoveries / ### Style Principles ladenstyle_principles befülltstudy-author Phase 1.5 (v2.1.0): schreibt positive Muster PFLICHT beim Analysieren neuer Werkebackfill-style-principles (v2.2.0): einmalige Nachfüllung für Autoren vor Phase 1.5author-check: mein-buch / kapitel-22
Style Principles — 8 gesamt, 5 präsent, 3 fehlend
PRÄSENT:
✓ Banter-Dialoge: Muster gefunden — Z. 34 ("Sie war nicht erschöpft. Sie war fertig.")
✓ Found-Family-Dynamik: Z. 127 (Scene: Gruppendiskussion nach dem Kampf)
...
FEHLEND:
✗ Dark-Humor-Einsatz: kein Galgenhumor-Muster im Draft erkannt
✗ Sarkasmus-Deployment: keine sarkastischen Einzeiler gefunden
...
Findings sind Advisory — kein automatisches Block. Der User entscheidet, ob er nachschärfen möchte.
Härteres Regime für das erste Kapitel. Läuft vor der 28-Punkte-Liste.
Set the Stage
Spotlight the Protagonist
Give Readers a Reason to Stay
Die kritischsten (FAIL hier = Kapitel muss überarbeitet werden vor dem nächsten):
Wenn einer davon FAIL hat, blockt das Skill den weiteren Workflow.
"Der Leuchtturm war schon dunkel, als Arne ankam."
→ Tone: PASS
→ Genre hint: ambiguous (könnte Mystery, Horror, Literary sein)
→ Curiosity: PASS (warum dunkel?)
→ Killer-Level: 7/10
"Es war ein regnerischer Herbstmorgen, und Arne Kruse fuhr zur Insel."
→ Tone: WEAK (generic)
→ Genre hint: keine
→ Curiosity: WEAK
→ Killer-Level: 3/10 — überarbeiten
Das Skill /storyforge:manuscript-checker scannt das komplette Buch auf Probleme, die nur bei End-to-End-Lesung sichtbar werden.
Der Checker ist in eine Fiction- und eine Memoir-Variante gesplittet, analog zu chapter-reviewer / chapter-reviewer-memoir: /storyforge:manuscript-checker deckt Fiction ab (Default bei fehlendem book_category) und lädt keine memoir-spezifischen Kategorien; /storyforge:manuscript-checker-memoir deckt Memoir ab und ergänzt fünf zusätzliche Kategorien (Anonymisierungs-Lecks, ordentliche Lektions-Enden, reflektierende Plattitüden, Timeline-Unschärfe, Namensform-Konsistenz bei realen Personen). Beide teilen sich alle Basis-Kategorien unten. Beim falschen book_category verweist das jeweilige Skill auf die passende Variante, statt einfach durchzulaufen.
| Kategorie | Was wird erfasst | Severity |
|---|---|---|
book_rule_violation |
Verletzungen der Rules aus Per-Book CLAUDE.md |
Always High |
author_rule_violation |
Verletzungen der ### Don'ts aus dem Autorenprofil — gilt für alle Bücher dieses Autors |
Always High |
author_vocab_violation |
Verletzungen der vocabulary.md ### Forbidden ...-Sektionen (gleiche Quelle wie der PostToolUse-Hook) |
Always High |
writing_discovery_violation |
Verletzungen der ### Recurring Tics aus dem Autorenprofil (über /storyforge:harvest-author-rules aus früheren Büchern promotet) |
Always High |
global_shape_violation |
Verletzungen der katalog-weiten Shape-Bans aus anti-ai-patterns.md Sektion 11 (elegant-abstraction register, gilt für alle Autoren ohne Per-Author-Setup) |
Medium (advisory) |
ai_tell_violation |
Treffer auf die Catalog-AI-Tell-Vokabel aus anti-ai-patterns.md Sektion 1 (delve, tapestry, vibrant, ... — gilt für alle Autoren ohne Per-Author-Setup) |
Medium (advisory) |
plot_hole |
Aggregierter Plot-Hole-Bucket aus analyze_plot_logic (6 Sub-Kategorien — siehe unten) |
Always High |
cliche |
~130 kuratierte Patterns abgedroschener Prosa-Phrasen | Always High |
question_as_statement |
Q-Word-Dialog mit Period statt Fragezeichen | High bei ≥5 Hits |
filter_word |
POV-distanzierende Verben (>3/1k Wörter) | High bei >6/1k |
adverb_density |
-ly Adverbien (>8/1k Wörter) |
High bei >14/1k |
sentence_repetition |
Wiederkehrende 8-15-Wort-Phrasen über Kapitel hinweg | High bei ≥3 Hits |
snapshot |
Statische Beschreibungsblöcke ohne Handlungsverben oder Dialog | Always Medium |
callback_dropped |
Registrierte Callbacks ohne Auftreten in einem gedrafteten Kapitel | High |
callback_deferred |
Callback seit mehr als 10 Kapiteln nicht mehr aufgegriffen | Medium |
simile |
Cross-Chapter-Simile-Wiederholung | High bei ≥4 Hits |
character_tell |
Wiederholte Body-Language-Tics | High bei ≥4 Hits |
blocking_tic |
Wiederholte Blocking-Patterns ("stood up", "sat down") | High bei ≥4 Hits |
sensory |
Wiederholte Sensory-Beschreibungen | High bei ≥4 Hits |
structural |
Wiederholte Satzstrukturen | High bei ≥4 Hits |
signature_phrase |
Autor-Signatur-Phrase zu oft | High bei ≥4 Hits |
Der Manuscript-Checker ist toleranter mit der Buch-CLAUDE.md
## Rules-Section als der PostToolUse-Hook: er erfasst sowohl Backtick- als auch Double-Quoted-Patterns (mit Ban-Cue). Das ist Absicht — Soft-Findings vertragen 50/50 false-positives, weil du als User entscheidest. Hard-Block-Findings (im Hook) brauchen explizite Backticks.
Autorenprofil-Quellen: Die drei
author_*-Kategorien lesen aus~/.storyforge/authors/{slug}/profile.md(Sektionen### Don'tsund### Recurring Ticsunter## Writing Discoveries) bzw.vocabulary.md(alle### Forbidden ...-Subsections). Eine Regel einmal im Autorenprofil eintragen — sie gilt automatisch für jedes Buch dieses Autors. Keine Per-Book-Duplikation mehr nötig.Format-Konvention für
### Don'ts: Patterns als Backtick-Regex (`\bthe (room|silence) (received|held)\b`) oder als kursive Beispielphrasen (*The room received it.*) im selben Bullet wie ein Ban-Cue (Never,Avoid,Don't use). Die kursive Form matched die Phrase überall im Manuskript — trailing Satzzeichen (.,,,!) werden beim Pattern-Build gestrippt.Empfehlungs-Marker: Italics und doppelte Quotes NACH einem Marker-Wort (
Render,Replace,Use instead,Instead:,Allowed:,Better:,Rewrite as,→,Rather:) gelten als positive Beispiele (was stattdessen zu schreiben ist) und werden NICHT als gebannte Patterns extrahiert. Backticks werden unabhängig von der Position extrahiert, weil sie explizite Ban-Intention kodieren.Recurring-Tics-Body-Extraktion: Wenn der Bold-Titel eines Recurring-Tic-Bullets keine Quote enthält, liest der Loader scannbare Patterns aus dem Bullet-Body — sowohl doppelte Quotes als auch Backticks. So funktionieren deutsche Rule-Labels mit englischen Beispiel-Phrasen ("his hands were having a conversation with each other") ohne Duplikation in ein Don't.
Katalog-Shape-Bans (
global_shape_violation): Die elegant-abstraction-Shapes ausreference/craft/anti-ai-patterns.mdSektion 11 (Word-Count-Meta-Commentary, Sentence-as-Projectile, Room-as-Receiver, Economic-Metaphor, Body-Part-Anthropomorphisierung) werden automatisch für jeden Autor gescannt — keine Per-Profile-Kopie nötig. Severity ist medium (advisory): der Manuscript-Report listet die Treffer, der Hook gibt einewarn, blockt aber nicht. Wer Hard-Block für einen bestimmten Autor will, kopiert die Regex in dessenprofile.md ### Don'ts(severity wird zublock).Catalog-AI-Tell-Vokabel (
ai_tell_violation): Die Section-1-Vokabel aus derselben Catalog-Datei (delve,tapestry,vibrant,embark, ...) ebenfalls vom Manuscript-Checker gescannt, Severity medium (advisory), parallel zurwarn-Stufe des Hooks. Wer einzelne Wörter für einen Autor als Hard-Block setzen will, trägt sie invocabulary.md ### Absolutely Forbiddenein (Block-Severity + Inflections-Matching).Dedup: Wenn ein Autor-Don't, Vocabulary-Eintrag oder Recurring Tic bereits eine Stelle als Hard-Block fängt, werden beide Catalog-Warnungen (
global_shape_violation,ai_tell_violation) für genau diese Zeile unterdrückt — keine Doppel-Flaggung derselben Position.
manuscript-checker-memoir)| Kategorie | Was wird erfasst | Severity |
|---|---|---|
anonymization_leak |
Echter Name im Manuskript, obwohl das Personen-Profil in people/ die Person als anonymisiert markiert |
Immer High — Pre-Publication-Blocker |
tidy_lesson_ending |
Letzter Absatz des Kapitels schließt mit einer Moral-/Lektions-Zusammenfassung statt einem Moment | High bei ≥3 Cues, Medium bei 2 |
reflective_platitude |
Dichte retrospektiver Kommentierung pro Kapitel ("im Rückblick", "was ich gelernt habe") | High bei ≥3 Hits, Medium bei 2 |
timeline_ambiguity |
Dichte zeitlicher Verschleierung pro Kapitel ("irgendwann", "Jahre später") | High bei >6/1k Wörtern, Medium bei >3/1k |
real_people_consistency |
Gleiche Person erscheint in inkonsistenter Groß-/Kleinschreibung oder Namensform über Kapitel hinweg | Immer Medium |
anonymization_leakist ein Pre-Publication-Blocker, aber der Gate-Status springt dadurch allein aufWARN, nichtFAIL—book_rule_violationbleibt die einzigeFAIL-Bedingung. Die Headline wird trotzdem explizit als Privacy-Blocker annotiert, damit es nicht als "nichts Dringendes" gelesen wird.plot_holeläuft bei Memoir nur mit dercausality_inversion-Subkategorie —chekhov_gun(unfired Promises) ist fiction-spezifisch und feuert bei Memoir nicht.
Scannt alle Kapitel-Drafts auf wiederkehrende 8-15-Wort-Phrasen. Erfasst Muster, die der Per-Chapter-Blick übersieht, weil sie pro Kapitel nur einmal auftauchen, aber über das ganze Buch verteilt viele Male:
Severity: High bei ≥3 Cross-Chapter-Vorkommen. Nutzt N-Gram-Overlap — Varianten mit 8-15 gemeinsamen aufeinanderfolgenden Wörtern werden gruppiert.
Flaggt statische Beschreibungsblöcke — aufeinanderfolgende Sätze ohne Handlungsverben und ohne Dialog. Snapshots bremsen die narrative Dynamik und sind ein verbreitetes AI-Prosa-Muster.
Erkennung: Ein Block von ≥5 aufeinanderfolgenden Sätzen ohne Handlungsverben oder Dialog-Marker löst ein Finding aus. Der Schwellenwert lässt sich pro Buch in der Buch-CLAUDE.md überschreiben:
## Linter Config
snapshot_threshold: 8
Severity: Always Medium. Manche atmosphärischen Pausen sind beabsichtigt — der User entscheidet, welche Findings er umsetzt.
StoryForge führt ein Register aller Callbacks, die via /storyforge:register-callback erstellt wurden. Dieser Scanner prüft:
callback_dropped — Ein registrierter Callback wurde bis zum Ende des Manuskripts nie eingelöst. High-Severity — vergessene Story-Versprechen brechen den Leser-Vertrag.callback_deferred — Ein Callback wurde explizit als aufgeschoben markiert, ist aber nach X Kapiteln noch offen. Medium-Severity — Warnung, kein Block.Beide Felder sind ausschliesslich im Post-Draft-Scan sinnvoll, da der Status eines Callbacks erst bei End-to-End-Lesung beurteilt werden kann.
scan_manuscript MCP-Tool)research/manuscript-report.md)Manuscript Scan — "Der Leuchtturmhüter" (34 Kapitel, 82.300 Wörter)
---
Gefunden: 127 Findings
High-Severity:
- 3 Book-Rule-Violations
- 5 Clichés
- 1 Question-as-Statement-Cluster
- 4 Heavy-Filter-Word-Chapters
- 2 Heavy-Adverb-Chapters
- 7 Cross-Chapter-Repetitions
Top Offenders:
1. RULE-VIOLATION: "journey" als Metapher — 12x (Kap 3, 7, 14, 19, 22)
→ Per-Book CLAUDE.md bannt abstrakte Nomen
2. CLICHÉ: "das Blut gefror ihm in den Adern" — 3x (Kap 2, 17, 29)
3. REPETITION: "für einen Moment hielt er inne" — 18x (strukturell)
4. FILTER-WORDS Kap 8: "sah"×14, "bemerkte"×8, "schien"×5 (24/1k Words)
5. SIMILE: "wie eine Feder auf dem Wasser" — 4x Kap 5, 9, 17, 23
Full Report: research/manuscript-report.md
Mit --interactive geht der Checker jedes High-Severity-Finding durch:
Finding 1 / 7
---
Book-Rule-Violation: "journey" als Metapher (12 Treffer)
Treffer:
- Kap 3, Z. 67: "...seine innere Journey..."
- Kap 7, Z. 142: "...die Journey der Erinnerung..."
- Kap 14, Z. 201: "...eine stille Journey..."
[...weitere 9]
Empfehlung:
- Kap 3: Ersetze durch "Weg" oder konkret "Zug durch den Nebel"
- Kap 7: Ersetze durch "Gedächtnis-Kette"
- Kap 14: Streiche den Satz — redundant mit vorigem Absatz
Aktion?
[a] Alle übernehmen
[c] Custom (einzeln anpassen)
[s] Skip
[q] Quit
question_as_statementFlat-Delivery-Questions ("Wer war das.") sind eine legitime stilistische Entscheidung (McCarthy-Style). In kleinen Dosen.
Bei Skala (18+ Hits) werden sie monoton oder wirken wie Bug.
Pro Hit bietet das Skill zwei Optionen:
Beispiel (B):
Vorher: "Wer?"
Nachher: "Wer." Sein Blick wanderte nicht von der Münze.
Das Skill /storyforge:chapter-fixer schließt die Lücke zwischen "ein Checker hat ein Problem gefunden" und "das Problem ist behoben" — ohne dafür chapter-writer erneut aufzurufen. chapter-writer arbeitet append-only und würde ein bereits gedraftetes draft.md beschädigen. Chapter-Fixer liest stattdessen den geflaggten Text, patcht exakt diese Textstelle über das Edit-Tool und lässt alles andere im Kapitel unverändert.
Position im Workflow: ad hoc, nicht Teil der festen Pipeline-Reihenfolge. Läuft immer dann, wenn chapter-reviewer / chapter-reviewer-memoir / manuscript-checker / manuscript-checker-memoir FAIL oder WARN mit kapitelverankerten Findings zurückgibt, oder wenn der User eine Passage zeigt, die laut rules-audit gegen eine Regel verstößt. Danach wird der auslösende Checker normalerweise erneut ausgeführt, um FAIL/WARN → PASS zu bestätigen.
chapter-writer vor, statt einzelne Patches zu erzwingen.chapter-reviewer / chapter-reviewer-memoir / manuscript-checker erzeugte Findings — direkt weiterverwendet.rules-audit-Regel.Sonderfall Memoir: anonymization_leak-Findings sind Pre-Publication-Blocker und von Bulk-Apply ausgeschlossen — jeder braucht eine eigene Bestätigung. Dieselbe Ausnahme gilt bei chapter-fixer auch für book_rule_violation.
Session-Limit: maximal 3 Fixer-Runden pro Session (eine Runde = ein vollständiger Gather → Apply → Re-Validate-Zyklus, unabhängig davon, wie viele ≤20-Hit-Batches sie umfasst).
Der Cross-Chapter Timeline Validator gleicht Kapitel-Anker-Daten und relative Zeitphrasen im Prosa-Text gegen den kanonischen plot/timeline.md Event-Kalender ab. Er ist das Batch-Pendant zum Per-Write Story-Time-Anchor-Hook — nutze ihn, um bestehende Kapitel nachträglich zu prüfen oder einen fertigen Draft zu validieren.
MCP-Tool: mcp__storyforge-mcp__validate_timeline_consistency(book_slug)
Wann verwenden: Nach dem Schreiben mehrerer Kapitel, vor der Revision-Phase — besonders bei Discovery Writing, wo der Kalender nachträglich aufgebaut wird und Cascade-Drift über Kapitelgrenzen hinweg entsteht.
Für jedes Kapitel mit einer parsebaren ## Chapter Timeline-Sektion im README:
yesterday, last week, this morning, tonight, an hour ago, etc.)draft.md mit Word-Boundary-Regex — längste Phrase zuerst, damit "last week" vor "last" gewinntplot/timeline.mdKapitel ohne parsebare ## Chapter Timeline-Sektion landen in missing_anchors statt zu crashen — /storyforge:chapter-reviewer nutzen, um die Sektion im README nachzutragen.
yesterday, tomorrow, last week, next week, last night, this morning, this afternoon, this evening, tonight, an hour ago, one hour ago, two hours ago
{
"book_slug": "my-novel",
"chapters_checked": 22,
"calendar_built": true,
"findings": [
{
"chapter": "22-the-night-before",
"scene": "Szene 3",
"line": 47,
"phrase": "yesterday",
"implied_date": "2025-12-23",
"actual_event_date": "2025-12-15",
"drift_days": 8,
"snippet": "...He had not slept since yesterday. The hallway felt long..."
}
],
"missing_anchors": ["05-interlude"],
"report_path": "reports/timeline-validation.json"
}
missing_anchors listet Kapitel ohne parsebaren ## Chapter Timeline-Block — diese werden übersprungen, nicht gecrasht. Ergebnisse werden zusätzlich nach {book}/reports/timeline-validation.json persistiert.
plot/timeline.md mit ## Anchor Point- und ## Event Calendar-Sektionen (Standard-Template-Format)## Chapter Timeline in jedem Kapitel-README mit **Start:**-ZeileFehlt plot/timeline.md, gibt calendar_built: false zurück — kein Crash, keine Findings. Graceful degrade.
/storyforge:continuity-checkerfür grobe Timeline-Rekonstruktion aus der Prosa nutzen.validate_timeline_consistencyfür präzise Drift-Erkennung, wennplot/timeline.mdbereits befüllt ist.
Das Skill /storyforge:continuity-checker validiert das komplette Buch gegen:
plot/timeline.md) — Temporale Konsistenzworld/setting.md) — Räumliche Konsistenzplot/canon-log.md) — Fakten-KonsistenzDas Skill ruft get_continuity_brief(book_slug) auf, um alle benötigten Projekt-Zustands-Daten in einem strukturierten JSON zu laden — kanonischer Kalender, Travel Matrix, Canon-Log-Fakten, Character-Index und Intra-Day-Grids für ALLE Kapitel. Kapitel-Drafts werden separat geladen, als der zu prüfende Inhalt.
Temporale Konflikte:
Kap 5, Z. 89: "Es war Mittwoch"
Timeline: Tag 12 = Donnerstag
→ CONFLICT
Reise-Unmöglichkeiten:
Kap 8: Arne verlässt den Leuchtturm um 14:20, kommt um 14:35
im Pfarrhaus an.
Travel Matrix: Leuchtturm → Pfarrhaus = 45 min
→ CONFLICT (30 min zu wenig)
Character-Fakt-Drift:
Kap 2: Inga wird als 34 eingeführt
Kap 11: "Inga, die 32-jährige..."
Canon Log: Inga = 34
→ CHANGED/CONTRADICTED fact
Location-Description-Drift:
Kap 3: Die Küche ist "klein, hellblau, mit nur einem Fenster"
Kap 19: "...die weitläufige Küche mit den beiden großen Fenstern..."
→ DESCRIPTION DRIFT
Der MCP-Tool get_current_story_anchor(book_slug, chapter_slug) liefert ein strukturiertes Mapping vom aktuellen Chapter-Start zu allen Standard-Relativ-Phrasen. Wird vom PostToolUse-Hook live beim Schreiben genutzt (warn-severity), kann aber auch direkt aufgerufen werden:
mcp__storyforge-mcp__get_current_story_anchor blood-and-binary-firelight 22-the-night-before
Liefert u.a.:
{
"available_relative_phrases": {
"yesterday": "Mon Dec 23 ~19:30",
"tomorrow": "Wed Dec 25 ~19:30",
"an hour ago": "Tue Dec 24 ~18:30"
}
}
Voraussetzung: ## Chapter Timeline in der Chapter-README mit **Start:** Tue Dec 24 ~19:30-Format.
Ergänzung des Story-Time-Anchors um Intra-Day-Grids der letzten 3 review-or-later Kapitel. Liefert Scene-Listen mit Clock-Times statt nur Start/End-Anker. Verhindert Cross-Chapter Cascade-Drift.
mcp__storyforge-mcp__get_recent_chapter_timelines blood-and-binary-firelight 3
Continuity-Checker nutzt get_continuity_brief(book_slug) als Single-MCP-Call für kanonischen Kalender, Travel Matrix, Canon-Facts, Character-Index und Intra-Day-Grids aller Kapitel.
Wenn Timeline oder Travel Matrix fehlen, rekonstruiert das Skill sie aus allen Kapitel-Drafts. Das ist der häufigste Einsatzfall bei Discovery Writern — die Timeline entsteht erst durchs Schreiben.
/storyforge:continuity-checker mein-discovery-buch
→ Kein plot/timeline.md gefunden. Rekonstruiere...
→ Kein world/setting.md (Travel Matrix) gefunden. Rekonstruiere...
Timeline rekonstruiert:
Tag 1 (Mo, 14.3.): Arne ankommt (Kap 1)
Tag 2 (Di, 15.3.): Leuchtturm-Erkundung (Kap 2)
Tag 3 (Mi, 16.3.): Silbermünze gefunden (Kap 3)
...
Travel Matrix rekonstruiert:
Locations gefunden: Leuchtturm, Hafen, Dorf, Pfarrhaus, Klippe
Reise-Events erfasst: 14 in 27 Kapiteln
Inkonsistenzen: 2
→ Speichere nach plot/timeline.md und world/setting.md
Memoir-Buecher haben zwei zusaetzliche Quality Gates, die es fuer Fiction nicht gibt. Beide sind Pflicht — der export-engineer verweigert den Export ohne sie.
/storyforge:emotional-truth-prompt prueft einen Kapitelentwurf auf Felt-Sense-Luecken — die Momente, in denen der Text glatt ist, aber die Erfahrung fehlt. Ausfuehren nach dem Kapitelentwurf und vor /storyforge:chapter-reviewer.
Workflow-Position: chapter-writer → emotional-truth-prompt → chapter-reviewer
Das Skill fuehrt eine 7-Dimensionen-Befragung (ET1–ET7) durch:
| Dimension | Was geprueft wird |
|---|---|
| ET1 Implizites Gefuehl | Emotionale Zustaende abstrakt benannt oder ganz ausgelassen |
| ET2 Retrospektive Perspektive | Wissen der Gegenwarts-Erzaehlerin schleicht sich in die Szene |
| ET3 Erinnerungskontradiktion | Verdaechtig saubere Erinnerung; keine gemischten Gefuehle; verschwiegene Luecken |
| ET4 Vermeidungs-Hedge | Vage Ereignis-Verweise; unbenannte Verweigerungen; Uebergangsleerlaeufe |
| ET5 Gruendlichkeitsfalle | Inventar-Detail ohne Felt-Sense-Funktion |
| ET6 Szene/Zusammenfassung-Fehler | Angelpunkte zusammengefasst; Uebergangsinhalte dramatisiert |
| ET7 "Ich lag falsch"-Darstellung | Busse-Pornografie; ordentliche Erloesung; Falschheit erzaehlt statt gezeigt |
Ausgabe: Fragen und Revisions-Hinweise — niemals Prosa-Umschreibungen. Verdicts:
| Verdict | Bedeutung |
|---|---|
PASS |
Weiter zu /storyforge:chapter-reviewer |
DEEPEN |
Markierte Dimensionen bearbeiten, dann zweiten Durchlauf starten |
REWRITE |
Szenen-Modus-Fehler oder umfangreiche Vermeidung — strukturelle Ueberarbeitung noetig |
Nur fuer Memoir-Buecher (book_category: memoir). Bei Fiction-Buechern gibt das Skill einen Fehler aus und empfiehlt chapter-reviewer.
/storyforge:memoir-ethics-checker ist die Pflicht-Export-Voraussetzung fuer Memoir-Buecher. Es laueft in zwei Durchlaeufen:
Durchlauf 1 — Einwilligungs-Scan (pro Person in people/):
| Status | Bedeutung | Export-Auswirkung |
|---|---|---|
granted |
Schriftliche Einwilligung eingeholt | Freigabe |
pending |
Einwilligung angefragt, Antwort ausstehend | Warnung — verzoegert Export |
not-asked |
Einwilligung noch nicht angefragt | Warnung |
refused |
Einwilligung explizit verweigert | BLOCKIERT |
not-required |
Oeffentliche Person / bereits oeffentlich | Freigabe |
Durchlauf 2 — Verleumdungsrisiko-Prosa-Scan (vier Musterkategorien):
| Muster | Kategorie |
|---|---|
| D1 | Falsch-Behauptungen ueber Privatpersonen |
| D2 | Sexueller Inhalt ohne Einwilligung |
| D3 | Boesartigkeits-Marker (leichtfertige Missachtung, absichtliche Schadens-Rahmung) |
| D4 | Finanzstraftaten-Behauptungen ohne Beweise |
Verdicts:
| Verdict | Bedingung |
|---|---|
EXPORT CLEAR |
Alle Einwilligungen geloest, keine D1–D4-Muster |
RESOLVE BEFORE EXPORT |
Ausstehende Einwilligungen oder weiche D-Muster |
EXPORT BLOCKED |
Beliebige refused-Einwilligung oder hartes D1/D3-Muster |
Workflow-Position: sensitivity-reader → memoir-ethics-checker → voice-checker → export-engineer
Manuell beim Start eines Kapitels / einer Szene:
1. /storyforge:chapter-writer
↓
MCP get_chapter_writing_brief(book_slug, chapter_slug)
→ bündelt 14 Datenquellen in einem JSON (inkl. pov_character_inventory + pov_character_state)
↓
Bei Combat/Travel-Outline:
MCP verify_tactical_setup(book_slug, scene_outline_text, characters_present)
→ flaggt Walking-Order-Probleme
Automatisch bei jedem Write/Edit auf draft.md:
Write/Edit/MultiEdit
↓
PostToolUse-Hook (validate_chapter.py)
├─ Buch-CLAUDE.md Banlist → block on hit
├─ Author-Vocabulary → block on hit
├─ Meta-Narrative → block on hit
├─ Story-Time-Anchor → warn with implied date
├─ Globale AI-Tells → warn
├─ Sentence-Variance → warn
└─ POV-Boundary → warn with domain + remediation options
Keine manuelle Aktion nötig — der Hook läuft mit jedem Schreib-Vorgang.
1. /storyforge:chapter-reviewer — MCP get_review_brief() lädt Projekt-Zustand, dann 28-Punkte-Kapitelprüfung + Sub-Point 20a POV-Boundary
2. Craft-Fixes umsetzen (Hook checkt jeden Fix)
3. /storyforge:author-check — Positive Style-Compliance: sind die style_principles des Autors im Draft präsent?
4. /storyforge:chapter-humanizer — AI-Construction-Scan: 8 Section-11-Shapes + 55 Vokabular-Hits; interaktive Fixes in Autorenstimme
5. Humanizer-Fixes umsetzen
6. /storyforge:chapter-proofreader — Rechtschreibung, Grammatik, Interpunktion (Erklärungen in native_language des Autors)
7. (optional) /storyforge:voice-checker für kritische Kapitel
FAIL oder WARN mit kapitelverankerten Findings aus Schritt 1 (oder später aus dem Manuscript Checker)?
/storyforge:chapter-fixerwendet die Fixes gezielt an, danach den auslösenden Checker erneut laufen lassen.
1. MCP validate_timeline_consistency — Kapitelübergreifende Zeitdrift-Prüfung
2. /storyforge:continuity-checker — Timeline/Travel/Canon
↓
MCP get_continuity_brief(book_slug)
→ kanonischer Kalender + Travel Matrix + Canon-Facts + Character-Index
→ Intra-Day-Grids ALLER Kapitel (statusunabhängig)
3. /storyforge:manuscript-checker (Fiction) bzw. manuscript-checker-memoir (Memoir) --interactive — Cross-Chapter-Cleanup
4. (optional) /storyforge:voice-checker — Holistischer Authentizitäts-Score; kein Pflichtschritt
1. /storyforge:sensitivity-reader — Optional, für sensible Themen
2. (Nur Memoir) /storyforge:memoir-ethics-checker — Einwilligungs- + Verleumdungs-Gate (Pflicht für Memoir)
3. (optional) /storyforge:voice-checker mein-buch — Holistischer Score-Check
4. Alle Kapitel auf Status `Final`
5. /storyforge:export-engineer
Ältere Bücher haben Rules in der CLAUDE.md im alten Quote-Format ("clocked" statt `clocked`). Der Hook erkennt sie so nicht. Migration per Skript:
# Dry-Run (zeigt Diff, schreibt nicht)
~/.storyforge/venv/bin/python3 -m tools.claudemd.migrate_to_backticks \
/path/to/book
# Anwenden mit interaktiver Bestätigung
~/.storyforge/venv/bin/python3 -m tools.claudemd.migrate_to_backticks \
/path/to/book --apply
Mehr Details und Fallstricke: StoryForge-Hauptseite — Migration.
Optionale Schema-Migration: tactical:- und knowledge:-Blöcke lassen sich nachträglich ans Charakter-Frontmatter anhängen. Beide sind optional — fehlende Blöcke degradieren graceful. Nicht jeder Charakter braucht Tactical-Daten, nur handlungsrelevante. Knowledge-Daten sind nur für POV-Charaktere relevant.
Symptome: Write schlägt fehl mit [BLOCK] ..., obwohl die Phrase Teil der beabsichtigten Stimme ist.
Ursachen:
CLAUDE.md als Backtick-Pattern### Absolutely Forbidden-SektionFixes:
### Absolutely Forbidden entfernenlinter_mode: warn im Buch-CLAUDE.md-Frontmatter setzenSymptome: Hook flaggt Domain-Vokabular im Narrator-Text als POV-Boundary-Verstoß, obwohl die Figur es plausibel wissen könnte.
Ursachen:
none/layperson deklariert, sollte aber competent seinreference/craft/knowledge-domains/Fixes:
forensics von none nach competent verschieben)knowledge:-Block komplett entfernen → Scan wird für diese Figur vollständig übersprungenreference/craft/knowledge-domains/{custom}.md anlegen — community-erweiterbarMögliche Ursachen:
vocabulary.md hat keine banned_wordsFix: Autorenprofil schärfen — siehe Autorenprofile.
Normal bei:
Vorgehen: Auf High-Severity-Findings fokussieren. Medium-Severity im ersten Pass ignorieren.
Symptome: Hook produziert bei jedem yesterday/tomorrow/an hour ago eine Warn-Meldung mit implizitem Datum.
Das ist Absicht. Die Warnung ist eine Verifikations-Checkliste, kein Block. Wenn das implizierte Datum korrekt ist → ignorieren. Werden die Warnungen zu störend, lassen sie sich nicht selektiv deaktivieren — das komplette Linter-Set läuft entweder in linter_mode: warn oder gar nicht.
Beispiel: Kapitel sagt "drei Tage später", Timeline sagt "zwei Tage später".
Prüfen: War der Tagesbeginn intra-day (früher Morgen = derselbe Tag)? Timeline-Einträge müssen präzise sein.
Fix:
/storyforge:register-callback Regel: Timeline-Tage sind Kalendertage, keine 24h-Blöcke
Das persistiert die Semantik in der Per-Book CLAUDE.md.