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 (Audit H-1, PR #180) — siehe Charakter-Anatomie |
| Voice Checker | Post-Draft / Prosa | voice-checker |
| Chapter Reviewer | Post-Draft / Einzelkapitel (28 Punkte + 20a POV-Boundary) | chapter-reviewer |
| 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 |
| First-Chapter Gate | Post-Draft / Kapitel 1 (härter) | in chapter-reviewer |
| Manuscript Checker | Post-Draft / Komplettes Buch | manuscript-checker |
| 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 |
| Cross-Chapter Timeline Validator | Post-Draft / Kapitelübergreifender Zeitdrift | MCP validate_timeline_consistency |
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, ...) |
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.
Issue-Referenz: D-3 von Epic #195.
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 (Issue #158: sieben unabhängige Erfindungsfehler in einer einzigen ~960-Wort-Szene).
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, das genannte Beta-Feedback-Symptom bei Blood & Binary Ch 22.
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 Kapitelsprevious_chapter_timeline — Grid des Vorgänger-Kapitels (Cross-Chapter-Zeitanker)canonical_timeline_entries — kanonische Story-Kalender-Einträge aus plot/timeline.mdtravel_matrix — alle Routen aus world/setting.mdcanon_log_facts — alle Fakten mit Status (ACTIVE / CHANGED / SUPERSEDED)tonal_rules — Non-Negotiable-Rules, Litmus-Test, Banned-Prose-Patterns, Warning-Signsactive_rules — Regeln aus dem Per-Book CLAUDE.mdactive_callbacks — offene Callbacks aus dem Per-Book CLAUDE.mdmcp__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 Eventstravel_matrix — geparste Travel-Matrix-Zeilencanon_log_facts — alle Fakten mit Status und Domaincharacter_index — alle Charakter-Dateien als Flat-Listchapter_timelines — Intra-Day-Grids aller Kapitel (kein Status-Filter — Continuity-Checker muss auch Drafts und Outlines prüfen)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.
| 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: Seit #216 scannt /storyforge:manuscript-checker 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. Beta-Feedback-Beispiel: „blood smells when it has been on the ground for a while in cold air" — geschrieben aus Theos IT-Guy POV.
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. Smoke-Test gegen Blood & Binary Ch 20-22 ging von 6 False Positives auf 0 nach dem Fix.
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 auf den genannten Beta-Feedback-Fall (Theos Forensik-Wissen) nicht.
chapter-reviewer Sub-Point 20a oberflächt diese Warnings im 28-Punkt-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.
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:
Vocabula
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 ab Sprint 2 automatisch beim Übergang Draft → Review. Bei Büchern, die vor Sprint 2 gedraftet wurden, 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
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.
| 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 |
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 |
sentence_repetition |
Gleiche oder sehr ähnliche Sätze innerhalb eines Kapitels | High bei ≥3 Hits |
snapshot |
Eingefrorne Beobachtungspassagen ohne Bewegung oder Handlung | High bei ≥3 Hits |
callback_dropped |
Offene Callbacks aus dem Register die nie eingelöst wurden | High |
callback_deferred |
Aufgeschobene Callbacks die noch offen sind | Medium |
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 (#217): 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 (#212): 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): Seit #216 wird 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.
Erkennt Sätze, die innerhalb desselben Kapitels nahezu identisch wiederholt werden — auch wenn einzelne Wörter variieren. Die Erkennung normalisiert Leerzeichen und ignoriert Gross-/Kleinschreibung. Tritt häufig bei unbeabsichtigtem Copy-Paste oder beim Discovery Writing auf, wenn ähnliche Szenen-Beats mehrfach beschrieben werden.
Erkennung: Sliding-Window über alle Sätze im Kapitel; paarweise Ähnlichkeit mit konfigurierbarem Schwellenwert. Feld im Report: sentence_repetition.
Erkennt Passagen, in denen der POV-Charakter still beobachtet, ohne zu handeln oder zu sprechen — ein häufiges AI-Pattern. Snapshots (mehr als eine Handvoll pro Kapitel) lassen Szenen statisch wirken und verringern die narrative Dichte.
Erkennung: Konsekutive Sätze mit Beobachtungsverben (bemerkte, sah, betrachtete, hörte, spürte) ohne Handlungsverb dazwischen. Feld im Report: snapshot.
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:continuity-checker validiert das komplette Buch gegen:
plot/timeline.md) — Temporale Konsistenzworld/setting.md) — Räumliche Konsistenzplot/canon-log.md) — Fakten-KonsistenzTemporale 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
Der Cross-Chapter Timeline Validator erkennt Zeitdrift auf Buchebene: Er gleicht relative Zeitphrasen im Prosa-Text (yesterday, last week, an hour ago etc.) gegen das kanonische Event-Kalender in plot/timeline.md ab. Wenn das implizierte Story-Datum einer Phrase vom Kalender-Eintrag für dasselbe Kapitel abweicht, wird ein Finding gemeldet.
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.
plot/timeline.md — parst Anker-Datum und Event-Kalender (Human-readable Dec 25, 2025 und ISO 2025-12-25 werden beide akzeptiert)## Chapter Timeline aus chapters/{slug}/README.md und löst den Start-Zeitpunkt aufyesterday, 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.
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.
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 — 28-Punkte-Kapitelprüfung + Sub-Point 20a POV-Boundary
↓
MCP get_review_brief(book_slug, chapter_slug)
→ bündelt 8 Datenquellen (Timeline, Travel Matrix, Canon-Facts, Tonal-Rules, Regeln)
2. Craft-Fixes umsetzen (Hook checkt jeden Fix)
3. /storyforge:chapter-humanizer — Section-11-AI-Construction-Scan + Vokabular; interaktive Fixes in Autorenstimme
4. /storyforge:chapter-proofreader — Rechtschreibung, Grammatik, Interpunktion (Erklärungen in native_language des Autors)
5. (optional) /storyforge:voice-checker — Holistischer Authentizitäts-Score 0–100; für gezielte Fixes: chapter-humanizer nutzen
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 --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 im Legacy-Quote-Format haben Regeln im alten Quote-Format ("clocked" statt `clocked`). Der Hook würde sie nicht erkennen. Migration via Skript:
# Dry-run (zeigt Diff, schreibt nicht)
~/.storyforge/venv/bin/python3 -m tools.claudemd.migrate_to_backticks \
/pfad/zum/buch
# Apply mit interaktiver Bestätigung
~/.storyforge/venv/bin/python3 -m tools.claudemd.migrate_to_backticks \
/pfad/zum/buch --apply
Mehr Details und Caveats: StoryForge-Hauptseite — Migration.
Optionale Schema-Migration: tactical: und knowledge: Blöcke können nachträglich an Charakter-Frontmatter angehängt werden. Beide sind optional — fehlende Blöcke führen zu graceful degrade. Nicht alle Charaktere brauchen tactical-Daten; nur action-relevante Figuren. Knowledge-Daten nur für POV-Charaktere relevant.
Symptome: Write schlägt fehl mit [BLOCK] ..., aber die Phrase ist Teil der gewollten Voice.
Ursachen:
CLAUDE.md als Backtick-Pattern### Absolutely Forbidden-SektionLösungen:
### Absolutely Forbidden entfernenlinter_mode: warn in Buch-CLAUDE.md-FrontmatterSymptome: Hook flaggt Domain-Vokabel im Narrator-Text als POV-Boundary-Verletzung, obwohl der Charakter das Wissen plausibel hat.
Ursachen:
none/layperson deklariert, sollte aber competent seinreference/craft/knowledge-domains/-FilenameLösungen:
forensics aus none raus, in competent rein)knowledge:-Block entfernen → Scan wird komplett übersprungen für diesen Charakterreference/craft/knowledge-domains/{custom}.md anlegen — community-erweiterbarMögliche Ursachen:
vocabulary.md hat keine banned_wordsFix: Autorenprofil stärken — siehe Autorenprofile.
Normal bei:
Ansatz: Fokus auf High-Severity-Findings. Ignoriere Medium-Severity im ersten Pass.
Symptome: Hook gibt bei jedem yesterday/tomorrow/an hour ago eine warn-Meldung mit implizitem Datum aus.
Das ist Absicht. Die Warning ist eine Verifikations-Checkliste, kein Block. Wenn das implizite Datum stimmt → ignorieren. Wenn die Warnings zu noisy werden, kannst du sie nicht selektiv abschalten — das ganze Linter-Set läuft auf linter_mode: warn oder gar nicht.
Beispiel: Chapter sagt "drei Tage später", Timeline sagt "zwei Tage später".
Check: War der Tagesbeginn intra-day (früher Morgen = gleicher Tag)? Timeline-Einträge müssen präzise sein.
Fix:
/storyforge:register-callback Regel: Timeline-Tage sind Kalendertage, nicht 24h-Blöcke
Damit bleibt diese Semantik im Per-Book CLAUDE.md persistiert.