Cite Check
Ein Prüfdurchlauf über einen fertigen oder in Arbeit befindlichen Artikelentwurf. Jede Autorität wird auf Existenz geprüft; jedes Zitat wird wörtlich gegen die echte Quelle geprüft; jede URL wird auf Auflösbarkeit bestätigt; Seitenangaben werden auf Plausibilität geprüft, wo die Seitennummerierung der Quelle wiederherstellbar ist. Deterministische Skripte führen Extraktion und Querverweisauflösung für nahezu null Token durch; Modell-Agenten führen die Zitat-/Seitenangabenprüfung in einem Unique-Source-Fan-Out durch, mit einer zwingenden zweiten Prüfung jeder Feststellung hoher Schwere, sodass ein Prüf-Artefakt nie den Bericht erreicht.
Es verwendet die Mechanismen des legal-research-Skills (check_cite.py, fetch_page.py, das CourtListener-Token, die Budget-Abbauleiter) sowie dessen Hausregeln (nur offenes Web, niemals aus dem Gedächtnis prüfen, eine nicht abrufbare Quelle wird als ungeprüft gemeldet – niemals angenommen).
Was geprüft wird: dass jeder Nachweis zur behaupteten Quelle führt, Captions/Autoren/Titel richtig geschrieben sind, der Reporter/Band/erste Seite/Gericht/Jahr richtig sind, Zitate wörtlich oder ehrlich gekennzeichnet sind, supra/id.-Querverweise intakt sind und URLs live sind.
Deckungsverzeichnis (hinzugefügt 2026-09-06) – und was weiterhin NICHT geprüft wird. Zitatprüfeinheiten werden aus Zitaten gebildet; allein ließen sie jede nicht zitierte Sekundärquelle unberücksichtigt. Nun inventarisiert scripts/citation_ledger.py jede Zitat-Instanz in jeder Fußnote (Rechtsprechung oder Sekundärquelle, zitiert oder nicht, mit Id./supra/Kurzform-Ketten aufgelöst), ein Sekundärquellen-Existenzdurchlauf deckt die nicht zitierten Artikel/Bücher/Gesetze/URLs ab, und Abschnitt H des Berichts gibt jeder Instanz einen Status – geprüft, Feststellung, nur-Existenz, nicht verifizierbar, nicht geprüft, Querverweis, nicht aufgelöster Querverweis – und listet die nicht geprüften nach Fußnote. Zwei Grenzen bleiben bestehen, und der Bericht muss dies sagen: (1) Proposition-Unterstützung – ob ein nicht zitierter Nachweis tatsächlich für den Satz steht, an dem er hängt – wird nie bewertet (das bedeutet nur-Existenz); (2) Seitenangaben werden nur geprüft, wo ein Zitat sie verankert. Behandle nur-Existenz als „echte Quelle, ungelesen“, niemals als „bestanden“.
Plus die offensichtlichen FORM-Probleme (Scope-Lock von der Nutzerin/dem Nutzer aufgehoben, 2026-08-10 – „das Lock rückgängig machen, soweit es Sie daran hindert, offensichtliche Dinge zu prüfen“). Eine Form-Phase berichtet, was allein aus dem Entwurf entscheidbar ist, ohne Quelle:
- Kurzformen – eine vollständige Zitierung wiederholt innerhalb des Fünf-Fußnoten-Fensters von Bluebook R. 10.9, wo die Kurzform hingehört; eine Fallkurzform, die über dieses Fenster hinaus verwaist ist oder kein Vollzitat vor sich hat; eine Sekundärquelle zweimal vollständig zitiert, wenn R. 4.2
Autor, supra note Nvorsieht. - Schriftart (nur
.docx) – Signale /Id./supra/quotingin Grundschrift belassen, dasnote Nnach einem kursivensuprafälschlich kursiv gesetzt, Kursivierung auf das Komma vor einem Zitat übergreifend, Kapitälchen mitten im Wort gebrochen und Fallnamen-Kursivierung nach R. 2.1(a) (Grundschrift in einem Vollzitat in einem Zitatsatz, kursiv in einem Textsatz oder einer Kurzform – der einzige Aufruf, der einen Agenten benötigt, da ein Muster diese nicht unterscheiden kann).
Diese laufen über ${CLAUDE_PLUGIN_ROOT}/skills/legal-research/citeform.py, das gleiche Modul, das /proofread verwendet, sodass die beiden Skills keine widersprüchlichen Ratschläge geben können. Die angewendeten Regeln sind in ${CLAUDE_PLUGIN_ROOT}/skills/legal-research/bluebook-typeface-and-short-forms.md niedergeschrieben. Form-Feststellungen erhalten ihren eigenen Berichtsabschnitt gegen Ende und gelangen nie in „Benötigt Ihre Aufmerksamkeit“ – sie sind Aufräumarbeiten, nicht inhaltlich.
Was es immer noch NICHT ist: ein vollständiger Bluebook-Linter (Signalanordnung, Zitatanordnung und ob ein Zitat korrekt zusammengesetzt ist, bleiben außen vor), ein inhaltlicher Redakteur oder ein Ersatz für die Zitierprüfung der Fachzeitschrift. Die Aufteilung mit /proofread bleibt für alles andere unverändert: proofread liest die Prosa, cite-check prüft die Autoritäten – sie teilen sich jetzt zufällig die Zitierform-Ebene.
Ausführung
1. Anfrage analysieren
- draftPath – Pfad zum Entwurf (erforderlich).
.docxmit echten Word-Fußnoten ist kanonisch;.md/.txtmit Pandoc-artigen[^n]-Fußnoten funktioniert als Fallback. - footnotes – optionaler partieller Durchlauf, z.B. „Fußnoten 45–80“ oder eine Liste. Standard: gesamter Entwurf.
- deep – optional; schwerere Prüfung (mittlerer Aufwand für Prüfagenten, höhere Soft-Cap). Für einen fast fertigen Entwurf oder wenn die Nutzerin/der Nutzer „deep“/„thorough“ sagt.
- Wenn der Entwurf Änderungen verfolgt hat, dies mitteilen und fragen, ob vor der Prüfung alle angenommen werden sollen (der Parser liest den aktuellen/akzeptierten Text und überspringt verfolgte Löschungen, aber ein stark markierter Entwurf ist einen Hinweis wert).
1b. Nach Tiefe fragen (Entscheidung der Autorin/des Autors, 2026-08-09 – spiegelt /proofread Schritt 1b)
FALLS die Anfrage es nicht bereits klärt, VORAB FRAGEN – eine AskUserQuestion, Kopfzeile Depth, vor dem Pre-Flight. Den Hinweis zu verfolgten Änderungen (Schritt 1) in denselben Aufruf integrieren, wenn zutreffend, damit die Nutzerin/der Nutzer alles in einer Interaktion beantwortet, anstatt zweimal gestoppt zu werden.
Die Frage überspringen, wenn die Formulierung bereits eine Stufe wählt („deep“, „thorough“, „near-final“, „pre-submission“, „quick“, „standard“), bei einer teilweisen Wiederholung einer bereits in dieser Sitzung gewählten Stufe oder wenn die Nutzerin/der Nutzer nur einen engen Fußnotenbereich angefragt hat.
Zwei Optionen – cite-check hat keine fable-Eskalation, also ist die Leiter kürzer als bei proofread:
| Option | Argumente | Was zu sagen ist |
|---|---|---|
| Standard | deep:false | Prüfagenten mit niedrigem Aufwand, Soft-Cap 650k. Gut für einen Arbeitsentwurf. |
| Deep | deep:true | Prüfagenten mit mittlerem Aufwand, Soft-Cap 900k. Genauere Lektüre jedes Zitats gegenüber seiner Quelle – für einen fast fertigen Entwurf. |
Verwenden Sie NICHT die Begründung von /proofread hier – die beiden deeps sind unterschiedliche Mechanismen. Proofreads deep fügt einen zweiten Offset-Extraktionsdurchlauf hinzu (ein Recall-Ansatz, gestützt auf die ~75–80%ige Überlappungsfeststellung desselben Modells). Cite-check's deep fügt keinen Durchlauf hinzu und holt nichts erneut: es erhöht den Aufwand der Prüfagenten von low auf medium (Workflow-Zeile 557) und hebt die Soft-Cap an. Es erkauft Sorgfalt pro Zitat, nicht mehr Zitate. Die Zitatabdeckung ist in beiden Fällen identisch – jedes Zitat wird in beiden Stufen geprüft – also nicht implizieren, dass Standard etwas überspringt.
Das Timing ist hier weniger wichtig als bei proofread (deep ändert die Extraktion nicht, also kann eine spätere Wiederholung Segment/Existenz aus dem Cache via resumeFromRunId abspielen), aber die Prüfung ist der Großteil des Laufs – 26 von 33 Agenten beim National Muffler-Entwurf – also bedeutet eine Stufenänderung immer noch, die teure Phase erneut auszuführen. Zuerst fragen.
2. Pre-Flight (VOR dem Start tun – eine Berechtigungsaufforderung mitten im Lauf kann einen Agenten töten)
~/.claude/settings.jsonlesen; sicherstellen, dasspermissions.allow"WebFetch"und"WebSearch"enthält (Fehlendes zusammenführen – niemals das Array ersetzen). Routine-Setup; nicht nachfragen.- Bestätigen, dass das CourtListener-Token funktioniert. Testen, nicht nach einer Datei suchen – ausführen:
python3 ${CLAUDE_PLUGIN_ROOT}/skills/legal-research/check_cite.py "347 U.S. 483"; Exit 0 mit"found": truebedeutet, es funktioniert und es gibt nichts zu berichten.check_cite.pylöst das Token ausCOURTLISTENER_API_TOKEN, dannCOURTLISTENER_TOKEN, dann der Datei~/.config/courtlistener/tokenauf – in dieser Reihenfolge, und der Umgebungsvariablen-Weg (üblicherweise imenv-Block von~/.claude/settings.jsongesetzt) ist die normale Installation, also beweist ein fehlendes~/.config/courtlistener/-Verzeichnis nichts. Wenn die Prüfung tatsächlich fehlschlägt, funktioniert der Lauf trotzdem (Fall-Existenz fällt auf das Web zurück), aber es einmal bei der Auslieferung erwähnen. Token-Seite: https://www.courtlistener.com/profile/api-token/ - Die Zotero-Bibliothek des Projekts auflösen (Projekte unterscheiden sich – einige sind Co-Autor-Gruppenbibliotheken, andere Einzelpersonen-Personalbibliotheken):
a. Nach einer
Zotero library:-Zeile inCLAUDE.md(oderAGENTS.md) des Projektordners suchen. Wenn vorhanden, den genannten MCP-Server verwenden und zu (c) springen. b. Wenn nicht vorhanden, die Nutzerin/den Nutzer FRAGEN, welche Zotero-Bibliothek dieses Projekt verwendet (persönliche Bibliothek oder eine benannte Gruppenbibliothek), dann die Antwort als eineZotero library: <Name> → MCP server <Server>-Zeile inCLAUDE.mddes Projektordners notieren, damit zukünftige Läufe nicht erneut fragen. c. Bestätigen, dass dieser MCP-Server tatsächlich existiert (persönlich =zotero; Gruppenbibliotheken erhalten ihren eigenen Server, z.B.zotero-groupfür „5A general law“, Gruppen-ID in~/.claude.json). Wenn die Bibliothek des Projekts NOCH KEINEN Server hat, ist JETZT der Moment, einen hinzuzufügen: denzotero-Eintrag in~/.claude.jsonalszotero-<slug>mitZOTERO_LIBRARY_TYPE=groupund der Gruppen-ZOTERO_LIBRARY_IDduplizieren (über die Gruppen-URL auf zotero.org oder die Feldcodes des Entwurfs finden); beachten, dass es einen Claude Code-Neustart benötigt, also Agenten in diesem Lauf auf das Web zurückfallen. d. Den Servernamen alszoteroServerübergeben (undzotero:false, wenn in diesem Lauf kein brauchbarer Zotero-Server vorhanden ist).
2b. Entwurf sichern (immer)
Eine Live-OneDrive/Word-Co-Author-Datei kann zwischen Extraktion und Auslieferung geändert werden, was den Bericht Bytes beschreiben ließe, die nie geprüft wurden. Den Entwurf einmal kopieren, die Kopie schreibschützen, hashen und alles nachgelagerte von der Sicherung aus ausführen. Der ursprüngliche Pfad wird hier und sonst nirgendwo verwendet – niemals in Workflow-Argumenten oder einer Agentenaufforderung.
cp "<draftPath>" "<scratch>/snapshot.docx" && chmod a-w "<scratch>/snapshot.docx"
shasum -a 256 "<scratch>/snapshot.docx" # aufzeichnen; dies kommt in die Berichtsfußzeile
3. Extrahieren & vorbereiten (deterministische Skripte – diese selbst ausführen, nahezu null Token)
Das zwischenzeitliche JSON an einen Ort legen, den die Agenten des Workflows lesen können (der Sitzungs-Notizblock ist in Ordnung). Die installierten Skriptpfade verwenden, damit dies aus jedem Ordner funktioniert (draftName bleibt der ursprüngliche Dateiname, nicht „snapshot“):
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/extract_cites.py "<scratch>/snapshot.docx" "<scratch>/extract.json"
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/prepare_units.py "<scratch>/extract.json" "<scratch>/units.json"
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/citation_ledger.py "<scratch>/extract.json" "<scratch>/ledger.json"
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/citation_ledger.py "<scratch>/extract.json" --compact > "<scratch>/ledger_args.json"
citation_ledger.py gibt instance_count / by_kind / unique_secondary_cites / unresolved_xrefs aus. Einen Blick auf by_kind werfen: eine große Anzahl other oder text bedeutet, dass die Fußnoten eine Zitierform verwenden, die der Splitter nicht erkennt – diese Instanzen werden trotzdem im Register geliefert (als unchecked / not-a-citation), sodass der Bericht ehrlich bleibt, aber es bei der Auslieferung sagen. Die --compact-Datei enthält die beiden Arrays, die der Workflow benötigt (instances, secondary).
extract_cites.py gibt eine Zusammenfassung aus (footnote_count, body/footnote quote counts, unique_case_cite_count, supra_problem_candidates, plus form_findings / form_short_form / form_typeface / formatting_available / case_name_candidates aus der Form-Ebene). prepare_units.py gibt unit_count / case_cites / supra_problems aus. extract.json lesen, um die Arrays zu ziehen, die der Workflow benötigt: unique_case_cites, supra_problem_candidates und den gesamten form_checks-Block.
formatting_available: false bedeutet einen Markdown/Plain-Text-Entwurf – Kurzformen laufen trotzdem, Schriftart nicht; bei der Auslieferung sagen. Wenn formatting_unaligned_footnotes erscheint, haben so viele Fußnoten keine Schriftartanalyse erhalten (ihr formatierter Text stimmte nicht mit dem validierten Parser-Text überein, also hat die Ebene abgelehnt, anstatt das Risiko von verschobenen Offsets einzugehen) – nur erwähnen, wenn die Anzahl nicht trivial ist.
Für einen partiellen Durchlauf den Fußnotenbereich in Einheiten-IDs auflösen:
python3 ${CLAUDE_PLUGIN_ROOT}/skills/cite-check/scripts/prepare_units.py "<scratch>/extract.json" --footnotes 45-80
(gibt unit_ids aus – als unitIds übergeben).
4. Workflow starten
Workflow({
scriptPath: "${CLAUDE_PLUGIN_ROOT}/skills/cite-check/cite-check.workflow.js",
args: {
skillsDir: "${CLAUDE_PLUGIN_ROOT}/skills", // wo die gebündelten Hilfsskripte leben
extractPath: "<scratch>/extract.json", // Agenten lesen Einheiten + vollständigen Kontext hieraus
draftName: "<Entwurf-Dateiname ohne Erweiterung>",
footnoteCount: <extract.footnote_count>,
unitCount: <prepare.unit_count>,
caseCites: <extract.unique_case_cites>, // Array
supraProblems: <extract.supra_problem_candidates>, // Array
formChecks: <extract.form_checks>, // Schriftart + Kurzformen (ganzer Block)
ledger: <ledger_args.instances>, // jede Zitat-Instanz (kompakte Form)
secondaryCites:<ledger_args.secondary>, // eindeutige nicht zitierte Sekundärquellen
unitIds: <null | [IDs von --footnotes]>, // nur partieller Durchlauf
deep: false,
zotero: true, // false, wenn in diesem Lauf kein brauchbarer Zotero-Server
zoteroServer: "<vom Pre-Flight 2.3>" // z.B. "zotero-group" (5A) oder "zotero" (persönlich)
}
})
Pipeline (alle Modellstufen Sonnet außer dem Bericht, der das Sitzungsmodell erbt):
- Segmentieren/Auflösen – in Blöcken; jedes Zitat wird mit der SPEZIFISCHEN Quelle gepaart, an der es hängt,
Id.-Ketten zu ihrem wahren Vorgänger (der ein Fall zwei Noten höher sein kann) durchlaufend undsupra note N-Weiterleitungen folgend, unter Verwendung von
…