Zurück zur StoryForge-Hauptseite
StoryForge kennt mehrere Orte, an denen verbotene Phrasen und Muster stehen, und zwei Scanner, die sie lesen: den Prosa-Hook und den Manuscript Checker. Diese Seite ist die Karte: Was liegt wo, wer scannt was, in welchem Format und mit welcher Stufe.
Wenn du dich fragst, wohin eine neue Regel gehört, spring zum Entscheidungsbaum.
| Scanner | Wann | Mechanik | Folge |
|---|---|---|---|
Prosa-Hook (hooks/validate_chapter.py) |
PostToolUse: nach jedem Write, Edit und MultiEdit auf draft.md |
Die Datei ist schon geschrieben. Stufe block führt im Modus strict zu Exit-Code 2 und gibt die Meldung über stderr an das Modell zurück |
Das Modell muss den Treffer beheben, bevor es weiterschreibt |
Manuscript Checker (/storyforge:manuscript-checker) |
von dir aufgerufen, scannt das ganze Buch | Report unter research/manuscript-report.md und ein Gate-Ergebnis in der Tool-Antwort |
blockiert keinen Schreibvorgang, siehe unten |
Der Hook prüft Kapitel für Kapitel unmittelbar nach dem Schreiben, der Checker das fertige Buch. Beide lesen dieselben Quellen und verwenden weitgehend dieselben Kategorien-Namen, melden aber mit eigenen Stufen. Die einzige Abweichung bei den Katalog-Wörtern: Der Hook nennt die Kategorie ai_tell, der Checker ai_tell_violation.
Das Gate des Manuscript Checkers ist FAIL, wenn es einen Fund book_rule_violation gibt, dessen Regel keine eigene Ausnahme dokumentiert. Das Gate steht nicht im Markdown-Report, sondern nur im Schlüssel gate der Antwort des Tools scan_manuscript. In run_pre_export_gates ist der Manuscript Checker nicht enthalten, ein FAIL stoppt also den Export nicht von selbst. Beide Scanner lesen daneben auch Speicher G, die Tonregeln aus plot/tone.md des Buchs.
| # | Ort | Wo | Inhalt |
|---|---|---|---|
| A | Buch | Datenbank der Serie oder des Buchs (Buchregeln, Typ rule) |
Regeln des Buchs, auch sichtbar in CLAUDE.md unter ## Rules (from DB) |
| B | Autor | ~/.storyforge/db/authors.db, Typ donts |
verbotene Phrasen, Muster und Don'ts des Autors |
| C | Autor | authors.db, Typ recurring_tics |
wiederkehrende Tics des Autors |
| D | Autor | authors.db, Typ style_principles |
positive Stilmuster, nicht gescannt |
| E | Katalog | reference/craft/anti-ai-patterns.md |
Abschnitt 1: ### Heavily Flagged Words and Phrases |
| F | Katalog | reference/craft/anti-ai-patterns.md |
Abschnitt 11: Zeilen mit **Banned shape:** |
| G | Buch | plot/tone.md, Abschnitt „Banned Prose Patterns" |
Verbotsmuster der Tonvorgabe des Buchs |
Die Datei vocabulary.md eines Autors ist reine Referenz und wird nicht gescannt. Verbotene Wörter, die in einer solchen Datei stehen, übernimmt scripts/migrate_vocabulary_to_db.py in den Speicherort B. create_author legt zusätzlich 19 Standard-AI-Tell-Wörter (delve, tapestry, nuanced ...) direkt als flache Phrasen in B an — sie wirken sofort als author_vocab_violation und stehen nicht mehr in vocabulary.md. Schlägt dieser Datenbank-Schreibvorgang fehl, wird der Autor trotzdem angelegt; die Antwort von create_author trägt dann ein warning-Feld mit dem Hinweis, die Wörter per add_vocabulary_entry nachzutragen.
Damit Speicher B und C für ein Buch greifen, müssen Hook und Manuscript Checker zuerst dessen Autor auflösen: Sie lesen die Zeile - **Author:** ... aus der CLAUDE.md des Buchs und leiten den Slug aus dem Namen ab. Fehlt diese Zeile — der Standard-Workflow schreibt sie nicht —, lesen beide stattdessen das Feld author: aus dem YAML-Frontmatter der README.md, das create_book_structure bei jedem Buch setzt. Ohne eine der beiden Quellen bleiben B und C für dieses Buch leer.
| Speicher | Hook | Hook-Stufe | Hook-Kategorie | Manuscript Checker | MC-Gewicht | MC-Kategorie |
|---|---|---|---|---|---|---|
| A Buchregeln | ja, nur Backticks | block | book_rule_violation |
ja, Backticks und Zitate mit Verbots-Hinweis | high | book_rule_violation |
| B Autor-Don'ts, flache Phrasen | ja | block | author_vocab_violation |
ja | high | author_vocab_violation |
| B Autor-Don'ts, Fett-Titel ohne Muster (Fallback) | ja | block | author_vocab_violation |
ja | high | author_vocab_violation |
| B Autor-Don'ts, Backtick und Kursiv | ja | block | author_rule_violation |
ja | high | author_rule_violation |
| C Autor-Tics | ja | block oder warn | writing_discovery_violation |
ja | medium oder high | writing_discovery_violation |
| D Style Principles | nein | nein | ||||
| E Katalog Abschnitt 1 | ja | warn | ai_tell |
ja | medium | ai_tell_violation |
| F Katalog Abschnitt 11 | ja | warn | global_shape_violation |
ja | medium | global_shape_violation |
| G Tonregeln (Buch) | ja, nur Backticks | block | book_rule_violation |
ja, wie Buchregel | high | book_rule_violation |
Der Hook meldet die Katalog-Ebenen (E, F) als warn, der Manuscript Checker als medium. Die Katalog-Ebenen E und F gelten nur für Bücher auf Englisch, siehe die Unterabschnitte E und F unten.
Der Report des Manuscript Checkers sortiert alle Funde in einer festen Reihenfolge (_CATEGORY_RANK): zuerst die Meta-Funde book_rules_unreadable und callbacks_unreadable — sie zeigen an, dass die Buchregeln- oder die Callback-Datenbank selbst nicht lesbar war (etwa bei einem Serienbuch, das noch nicht über add_book_to_series verknüpft ist), ohne eigene Textfunde. Danach folgen book_rule_violation, author_rule_violation, author_vocab_violation, writing_discovery_violation, global_shape_violation, ai_tell_violation, anonymization_leak, plot_hole und cliche. Alles andere wird nach Schweregrad angehängt.
Jeder Speicher hat eigene Parser-Regeln. Ein Muster im falschen Format wird still ignoriert.
Eine Regel ist ein Text. Der Hook zieht nur Backtick-Muster heraus, der Checker mehr:
| Form | Hook | Manuscript Checker |
|---|---|---|
Backtick-Regex (`\b...\b`) |
ja, hart | ja |
Backtick-Literal (`delve`) |
ja, hart | ja |
Zitat in Anführungszeichen mit Verbots-Hinweis (Never, Avoid, nie, kein ...) im selben Satz |
nein | ja, wenn mindestens sechs Zeichen |
Kursiv (*phrase*) |
nein | nein (gilt als erzählerisches Beispiel) |
| Fließtext | nein | nein |
Ein Backtick-Text mit Regex-Zeichen (| ( ) [ ] \ ^ $ ? + * { }) wird als regulärer Ausdruck kompiliert — über compile_backtick_pattern, eine einzige Funktion für Hook und Manuscript Checker, die für Buchregeln (A), Autor-Don'ts (B) und Autor-Tics (C) gleich gilt. Sie hat eine Schutzregel gegen aufwendige Ausdrücke: Literal wird der Text nur, wenn eine quantifizierte Gruppe (+, * oder ein offenes {n,}) selbst einen unbegrenzten Quantor in ihrem Körper trägt, zum Beispiel (a+)+. Jede quantifizierte Gruppe, nicht nur verschachtelte, zu erfassen, würde auch harmlose Ausdrücke treffen: (foo)+ bleibt Regex, weil der Gruppenkörper selbst nichts wiederholt, und (?:being){2} bleibt Regex, weil {2} eine feste Obergrenze ist, kein offenes {n,}.
Kapitel-Limit: Ein Zusatz wie max N per chapter aktiviert eine Obergrenze je Kapitel. Das gilt für Buchregeln (A) und für Autor-Tics (C), nicht für Don'ts (B). Im Hook wird das Limit auf die Länge des aktuellen Entwurfs im Verhältnis zur Ziel-Wortzahl des Kapitels skaliert. Der Manuscript Checker kennt dieses Limit bei Buchregeln nicht und meldet dort alle Treffer; bei Tics (C) wertet er es dagegen aus, siehe Abschnitt C.
Ein Eintrag kann flach sein (eine Phrase), nur einen fetten Titel ohne Muster tragen, Backticks tragen oder kursive Beispiele mit Verbots-Hinweis. Der Hook und der Checker extrahieren unterschiedlich weit:
| Form | Hook | Manuscript Checker |
|---|---|---|
flache Phrase ohne Backtick und Fettdruck (Aliase mit /, Klammerzusatz wird entfernt) |
ja, mit Beugungen und Wortgrenze am Anfang | ja |
| Zeile, die mit einem fetten Titel beginnt, ohne Backtick und ohne kursive Beispielphrase nach einem Verbots-Hinweis (Fallback auf den Titeltext) | ja, wie eine flache Phrase: mit Beugungen und Wortgrenze am Anfang | ja, wie eine flache Phrase |
| Backtick-Regex oder -Literal | ja, immer; ein Literal ist ein reiner Teilstring ohne Beugung und Wortgrenze | ja, immer |
| Kursiv mit Verbots-Hinweis | ja, nur vor einem Empfehlungs-Marker | ja, nur vor einem Empfehlungs-Marker |
| Zitat mit Verbots-Hinweis | nein | ja, nur vor einem Empfehlungs-Marker |
Einträge von write_author_banned_phrase sind Backtick-Literale: `delve` trifft redelve, aber nicht delving. Beugung und Wortgrenze gibt es nur bei flachen Einträgen (add_vocabulary_entry, Migration aus vocabulary.md) und beim Fett-Titel-Fallback.
Eine donts-Zeile mit fettem Titel, aber ohne Backtick und ohne kursive Beispielphrase nach einem Verbots-Hinweis fällt auf den Titeltext selbst zurück, sofern der Fettdruck direkt am Zeilenanfang steht: load_author_vocab liest ihn wie eine flache Phrase. So wird jede solche Zeile von genau einem der beiden Loader durchgesetzt — entweder hier als Fallback-Literal, oder, wenn der Eintrag doch ein Backtick-Muster oder eine kursive Beispielphrase mit Verbots-Hinweis trägt, von load_author_dont_rules (nächste Zeile unten).
Bei kursiven Mustern werden Satzzeichen am Ende abgeschnitten, damit *The room received it.* auch The room received it without complaint trifft.
Empfehlungs-Marker: Render, Replace, Use instead, Instead:, Allowed:, Better:, Rewrite as, Rather: und →. Das Marker-Fenster (extract_ban_window) ist dieselbe Funktion in Hook und Manuscript Checker: Beide extrahieren kursive Phrasen nur aus dem Bereich vor dem ersten Marker, danach gelten sie als positive Beispiele. Der Checker wendet das Fenster zusätzlich auf Zitate an, der Hook extrahiert für Don'ts ohnehin keine Zitate (siehe Tabelle oben). Backticks werden in beiden Scannern unabhängig von der Position extrahiert.
- **Never personify rooms** — *The room received it.* / *the silence held it.*
Render the impact through a named body: *Caelan's eyes did not move*
Im Beispiel gilt in beiden Scannern nur The room received it. und the silence held it. als Verbot; Caelan's eyes did not move steht nach Render und gilt als Empfehlung, auch im Hook. Für Empfehlungen in Don'ts heißt das: Setze sie hinter einen der Marker — ob sie dort kursiv stehen oder nicht, spielt für die Extraktion keine Rolle mehr.
Ein Bullet mit fettem Titel. Die Phrase wird in dieser Reihenfolge gesucht:
| Priorität | Form | Wann |
|---|---|---|
| 1 | Zitat im fetten Titel (**Vague-noun "thing" als Fallback**) |
Hauptweg |
| 2 | Backticks oder Zitate im Text des Bullets | wenn der Titel kein Zitat hat |
| 3 | Text des fetten Titels | wenn weder Titel noch Text etwas Scannbares tragen |
So funktionieren deutsche Regel-Titel mit englischen Beispiel-Phrasen im Text. Zusätze im Bullet steuern die Stufe im Hook: [warn] oder [advisory] macht aus block ein warn, Max N per chapter (auch Max N–M pro Kapitel, Max einmal pro Kapitel) erlaubt bis zu N Treffer je Kapitel, skaliert auf die Länge des aktuellen Entwurfs. Der Manuscript Checker wertet beide Zusätze ebenfalls aus: [warn]/[advisory] ergibt dort das Gewicht medium statt high, und ein Kapitel bei oder unter dem Limit erzeugt überhaupt keinen Fund — geprüft pro Kapitel des fertigen Entwurfs, nicht gegen die Gesamtzahl im Buch.
Nicht maschinell gescannt, bewusst. Sie sind narrative Anweisungen an chapter-writer und chapter-reviewer, keine Phrasen-Banlists. Sie stehen nicht im Chapter Writing Brief: Beide Skills laden sie über get_author.
Nummerierte Liste unter ### Heavily Flagged Words and Phrases. Jeder Eintrag setzt seine Begriffe fett, danach folgt nach einem Gedankenstrich die Begründung:
1. **Delve** / **Delve into** — One of the most notorious AI tells.
2. **Tapestry** (metaphorical) — "A rich tapestry of..." Almost never used by humans.
Gelesen wird jeder fette Begriff einzeln, also Delve und Delve into. Das / zwischen den fetten Begriffen ist nur Schreibweise: Der Loader trennt nicht innerhalb eines fetten Begriffs an /, deshalb muss jeder Begriff seine eigenen ** tragen. Ein Klammerzusatz wie (metaphorical) außerhalb des Fettdrucks wird nicht gelesen. Steht ein Klammerzusatz innerhalb des fetten Begriffs, entfernt der Loader ihn. Einzelwörter treffen Beugungen. Stufe: warn im Hook, medium im Checker. Es sind Hinweise, keine nutzerbehauptete Regel. Gilt nur für Bücher auf Englisch (Sprache aus language im README-Frontmatter); für andere Sprachen gibt es aktuell keinen Katalog, die Treffer entfallen.
Nur das Trennen an / gibt es ausschließlich bei flachen Don'ts (B). Klammerzusätze entfernt der Loader auch bei flachen Don'ts, bei fetten Katalog-Begriffen und bei Tic-Phrasen.
Zeilen in Abschnitt 11 mit dieser genauen Form:
**Banned shape:** `\bregex_hier\b`
Nur der Text in Backticks nach **Banned shape:** wird als regulärer Ausdruck kompiliert. Je Shape eine Regex. Stufe: warn im Hook, medium im Checker. Ein ungültiger Ausdruck wird übersprungen. Zeilen mit Zusatz wie **Banned shape (density):** passen nicht auf diese Form und werden nicht geladen, aktuell sind es sechs geladene Zeilen. Gilt nur für Bücher auf Englisch (Sprache aus language im README-Frontmatter); für andere Sprachen gibt es aktuell keinen Katalog, die Treffer entfallen.
Der Abschnitt „Banned Prose Patterns" in plot/tone.md eines Buchs, Überschrift auf einer Ebene von ## bis ######. Aufzählungspunkte mit einer Phrase in Backticks sind durchsetzbar, mit demselben compile_backtick_pattern wie bei A, B und C; ein Zusatz wie Max. N pro Kapitel begrenzt die Treffer je Kapitel genauso wie bei Buchregeln. Punkte ohne Backticks bleiben ein reiner Hinweis, den kein Scanner durchsetzt — sichtbar für Reviewer und den Humanizer, nicht für den Hook oder den Manuscript Checker.
Beim Anlegen einer Erkenntnis mit write_author_discovery(validate=True) läuft eine abschnittsbezogene Prüfung und hängt warnings und extracted_patterns an die Antwort. Der Write geht immer durch. Die Prüfung macht sichtbar, was der Scanner tatsächlich durchsetzt, und sie folgt dem Extraktor des Manuscript Checkers:
| Abschnitt | Code | Befund |
|---|---|---|
donts |
mixed_positive_negative_italics |
Kursiv auf beiden Seiten eines Empfehlungs-Markers. Kursive Phrasen nach dem Marker werden in keinem der beiden Scanner als Verbot extrahiert — die Prüfung macht diese Asymmetrie sichtbar, damit du verifizierst, dass sie wirklich als Empfehlung gemeint sind. |
donts |
mixed_positive_negative_quotes |
mehrere Zitate unter einem Verbots-Hinweis |
donts |
scanner_extracts_nothing |
Verbots-Hinweis ohne Backtick, Zitat oder Kursiv, die Regel greift nicht |
donts, recurring_tics, style_principles |
bracket_placeholder |
[word] in Backticks, das ist eine Zeichenklasse und kein Platzhalter |
recurring_tics |
bold_title_unscannable |
Nicht-ASCII-Titel ohne Muster im Text |
Style Principles erzeugen bewusst keine Lücken-Warnungen. Für Buchregeln gibt es dieselbe Idee mit lint_book_rules und /storyforge:rules-audit, siehe Quality System.
Wohin trage ich ein Muster ein, das geblockt oder gemeldet werden soll?
Ist es ein universeller AI-Tell, der jeden Autor betrifft?
delve, tapestry): E, Katalog Abschnitt 1Gilt es für alle Bücher eines Autors, ist also ein Merkmal seiner Stimme?
write_author_banned_phrase)harvest-author-rules oder write_author_discovery mit recurring_tics)Gilt es nur für dieses Buch?
max N per chapter): A (append_book_rule)plot/tone.md)Häufig falsch zugeordnet:
| Versuchung | Richtig |
|---|---|
| „AI-Tell, also Buchregel" | Katalog (E oder F) |
„Stimm-Eigenheit des Autors, also vocabulary.md" |
Die Datei wird nicht gelesen. Phrase oder Shape gehört nach B, ein wiederkehrender Tic nach C. |
| „Style Principle als scannbares Muster" | D wird nicht gescannt. Soll es blocken, ist es ein Don't in B. |
Steht dasselbe Muster an mehreren Orten:
| Fall | Ergebnis |
|---|---|
| Buchregel (A) und Autor-Eintrag (B oder C) | beide melden, die Kategorien sind eigenständig |
| Autor-Eintrag (B, C) und Katalog (E, F) im Hook | beide melden: der Autor-Eintrag als block, der Katalog als warn |
| Autor-Eintrag und Katalog im Manuscript Checker | Der Katalog-Fund (ai_tell_violation, global_shape_violation) entfällt auf der Zeile, die ein Autor-Eintrag schon trifft |
| flache Phrase (B), Tic (C) und Don't (B) im Hook | gleiche Phrase nur einmal: erst flache Phrase, dann Tic, dann Don't |
| Buchregel (A) und Tonregel (G) mit demselben Muster im Hook | meldet nur einmal |
Dedup führt keine Mute-Listen. Meldet ein Katalog-Muster fälschlich, kannst du es nur im Katalog enger fassen (Änderung am Plugin) oder es bewusst nicht in ein Autor-Don't kopieren, dann bleibt es bei warn.
linter_modereference/craft/anti-ai-patterns.md im Plugin: Speicher E und F