Markus Michalski FAQ

StoryForge Banlist-Architektur

Wo StoryForge verbotene Phrasen und Muster speichert, welcher Scanner welche Quelle liest, welches Format jede Quelle erwartet und wie du entscheidest, wohin eine neue Regel gehört.

StoryForge Banlist-Architektur

English Version

Zurück zur StoryForge-Hauptseite


Worum es geht

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.


Die zwei Scanner

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.


Die Speicherorte

# 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.


Wer scannt was

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.


Formate je Speicher

Jeder Speicher hat eigene Parser-Regeln. Ein Muster im falschen Format wird still ignoriert.

A: Buchregeln

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.

B: Autor-Don'ts

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.

C: Autor-Tics

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.

D: Style Principles

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.

E: Katalog Abschnitt 1

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.

F: Katalog Abschnitt 11

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.

G: Tonregeln

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.


Prüfung beim Schreiben der Erkenntnisse

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.


Entscheidungsbaum

Wohin trage ich ein Muster ein, das geblockt oder gemeldet werden soll?

  1. Ist es ein universeller AI-Tell, der jeden Autor betrifft?

    • Einzelwort (delve, tapestry): E, Katalog Abschnitt 1
    • Phrasen-Shape (the room received it): F, Katalog Abschnitt 11
    • Wirkung: warn im Hook, medium im Checker, für alle Autoren automatisch. Das ist eine Änderung am Plugin selbst.
  2. Gilt es für alle Bücher eines Autors, ist also ein Merkmal seiner Stimme?

    • verbotene Phrase oder Muster: B (write_author_banned_phrase)
    • wiederkehrender Tic aus fertigen Büchern, mit Kapitel-Limit oder als warn/advisory markierbar — beide Scanner werten das aus: C (harvest-author-rules oder write_author_discovery mit recurring_tics)
    • narrative Anweisung ohne scannbares Muster: D
    • Wirkung: block für jedes Buch des Autors (bei C je nach Markierung warn im Hook bzw. medium im Checker)
  3. Gilt es nur für dieses Buch?

    • Muster, ein Setting-, Plot- oder Stimm-Detail, im Hook auch mit Kapitel-Limit (max N per chapter): A (append_book_rule)
    • Verbotsmuster, die zur Tonvorgabe des Buchs gehören: G (Abschnitt „Banned Prose Patterns" in plot/tone.md)
    • Wirkung: block nur in diesem Buch

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.

Überlappungen: wer gewinnt

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.


Verwandte Seiten


← Zurück zur StoryForge-Hauptseite