Files
claude-regelwerk/.vault-tools/regelwerk-check/ENTWURF.md
T
Pascal MichelandClaude Opus 5.5 3b7128c9e1 regelwerk_check: Pruefung 7 meldet unsichtbare Zeichen in gespeicherten Workflows
Jedes Zeichen der Kategorie Cc ausser LF und jedes der Kategorie Cf in
.claude/workflows/**/*.js, gelesen als Bytes. Anlass: plankritik.js mit
CRLF scheiterte am Workflow-Werkzeug. Der Hook nach dem Bearbeiten loest
auch bei Workflows aus. Regressionslauf 28/28 angeschlagen, 6/6 stumm;
Hook-Treiber 58/58; Vorfall in exakter Form gemeldet (U+000D).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-26 20:54:51 +02:00

12 KiB

Entwurf: Konsistenzprüfung der Anweisungsschicht

Geschrieben am 2026-08-30 vor der ersten Zeile Code, wie es AI/Regelwerk/pruefwerkzeuge §1 verlangt.

Was die Prüfung beantworten soll — und woher die Antwort kommt

# Frage Herkunft Auflösung
1 Zeigt jeder Wikilink auf eine existierende Datei? Quelle — Dateisystem Ziel ist <link>.md oder <link> relativ zum Vault-Root. Alias nach | wird abgeschnitten, Anker nach # ebenso.
2 Trägt jede Regelwerk-Datei die Pflichtfelder im Frontmatter? Projektvorgabe — abgelesen an den sieben bestehenden Dateien type, status, title, summary, tags, created, updated
3 Ist jede Regelwerk-Datei vom Stamm aus verlinkt? Projektvorgabe — CLAUDE.md, Abschnitt „Regelwerk" Eine Datei, die niemand verlinkt, wird nie geladen.
4 Steht eine Regelwerk-Datei auf status: pending-review? Projektvorgabe — CLAUDE.md, Abschnitt „Selbstpflege" Hinweis, kein Fehler: die Freigabe steht aus.
5 Weicht das model: einer Agentendefinition von der Rollentabelle im Stamm ab? Projektvorgabe — CLAUDE.md, Tabelle „Agenten & Modelle" Die Tabelle wird gelesen, nicht im Skript nachgebaut.
6 Nennen mehrere Dateien die Planablage-Konvention widersprüchlich? Projektvorgabe — codeworkflow.md ist maßgeblich Siehe Auflösung unten.

Die drei Annahmen, die vor dem Code aufgelöst wurden

Annahme A: „Ein Pfad in Backticks ist ein Vault-Pfad." Falsch. Backticks tragen auch Befehle (python …), Frontmatter-Schlüssel (modell:), Dateinamen ohne Ort (CHANGELOG.md) und Beispielwerte. Eine allgemeine Pfadprüfung wäre eine Heuristik im Positivlisten-Gewand.

→ Aufgelöst durch Streichung. Frage 2 der ersten Fassung („existiert jeder Pfad in Backticks") ist nicht Teil der Prüfung. Wikilinks werden geprüft, Backtick-Pfade nicht. Das steht als benannte Lücke im Kopfkommentar.

Annahme B: „Aus Fließtext lässt sich ablesen, welches Modell ein Agent fährt." Falsch. „Executer-Subagent (executer, Sonnet — bei reiner Abschrift Haiku…)" ist für einen Menschen eindeutig und für ein Skript nicht.

→ Aufgelöst durch Einschränkung des Geltungsbereichs. Geprüft wird ausschließlich das model:-Feld im Frontmatter der Agentendateien gegen die Rollentabelle im Stamm. Fließtextaussagen über Modelle prüft das Skript nicht — benannte Lücke.

Annahme C: „Eine widersprüchliche Konvention ist maschinell erkennbar." Nur eingeschränkt.

→ Aufgelöst durch eine erzwungene Form. Das Skript sucht das Literal docs/plans/JJJJ-MM-TT und klassifiziert das unmittelbar folgende Zeichen: / = Ordnerform, . = Dateiform. Regel: Wer die Dateiform nennt, ohne die Ordnerform zu nennen, ist ein Befund — denn codeworkflow.md schreibt beide vor und die Ordnerform ist die, die vergessen wird. Genau dieser Fall lag am 2026-08-30 in planer.md vor.

Nachtrag 2026-09-23: Prüfung 5 prüft auch effort:

Geschrieben vor der Änderung am Skript. Anlass: Keine Agentendatei trug effort:, jeder Subagent erbte deshalb den Effort der Hauptsitzung, oft xhigh oder max. Seitdem steht der Effort je Rolle im Stamm und im Frontmatter (Messung und Begründung: AI/Regelwerk/codeworkflow, „Effort je Rolle"). Die Prüfung sorgt dafür, dass beide gleich bleiben.

# Frage Herkunft Auflösung
5a Welche Effort-Werte gibt es? Quelle für die Stufen — Claude Code 2.1.280, Enum ["low","medium","high","xhigh","max"] in der Programmdatei (nachgelesen 2026-09-23). Der Leser für Agentendateien nimmt darüber hinaus Großschreibung, med und ganze Zahlen an. Projektvorgabe ist die engere Form. Erlaubt sind nur die fünf Wörter, klein geschrieben: eine Schreibweise, die jeder ohne Programmkenntnis liest. Die Meldung sagt deshalb „nicht in der Vorgabe", nicht „ungültig". Anführungszeichen um den Wert sind YAML und zählen nicht mit.
5b Welcher Effort gilt je Agent? Projektvorgabe — Rollentabelle im Stamm, Spalte mit der Überschrift „Effort", erster Backtick-Ausdruck der Zelle Das effort: im Frontmatter muss ihm gleichen. Die Spalte wird über ihre Überschrift gefunden, nicht über die Position.
5c Agentendatei ohne effort: oder mit leerem Wert Projektvorgabe — Stamm: „Deshalb trägt jede Agentendatei effort:" Befund: Der Agent erbt den Effort der Hauptsitzung.
5d Rollentabelle ohne Effort-Spalte Projektvorgabe Befund am Stamm. Die Effort-Hälfte von Prüfung 5 schweigt dann nicht, sie meldet, dass sie nicht laufen kann.
5e Tabellenzeile eines Agenten ohne Backtick-Wert in der Effort-Spalte Projektvorgabe Befund am Stamm, mit dem Namen des Agenten.

Benannte Lücken, bewusst nicht geprüft:

  • effort: bei model: haiku. Haiku 4.5 kennt keinen Effort; Claude Code sendet ihn dann nicht (Programmdatei). Die Rollentabelle führt keinen Agenten auf Haiku; die Abschrift-Stufe steht im Task-Frontmatter, nicht in einer Agentendatei.
  • Doppelter Schlüssel effort:. Der flache Frontmatter-Leser nimmt den letzten Wert, wie bei model:.
  • Ob Claude Code den Wert anwendet. Das zeigt nur das Feld effort im Transkript eines echten Laufs, und eine geänderte Agentendatei wirkt in der laufenden Sitzung nicht sofort. Belegt am 2026-09-23 in frischen Sitzungen über das Agent-Werkzeug und im Workflow.
  • effort in gespeicherten Workflows unter .claude/workflows/. Sie setzen den Effort mit agentType absichtlich nicht; eine Abweichung dort sieht diese Prüfung nicht.

Dazu zwei Korrekturen am Regressionslauf, die mit diesem Nachtrag gekommen sind: Die Grundlinie setzt status: pending-review in ihrer Kopie auf reference. Vorher brach der Lauf nach jeder Selbstpflege an der Grundlinie ab, weil Prüfung 4 dann anschlägt — gemessen am 2026-09-23. Und Prüfung 4 bekommt dafür erstmals einen eigenen Angriffsfall.

Nachtrag 2026-09-26: Prüfung 7, unsichtbare Zeichen in gespeicherten Workflows

Geschrieben vor der Änderung am Skript. Anlass: Am 2026-09-25 und 26 lehnte das Workflow-Werkzeug plankritik.js ab („script contains control characters that would be hidden in the approval dialog“). Die Datei trug CRLF im Arbeitsbaum. Pascal hat die Prüfung am 2026-09-26 als Punkt 4 des Pakets „Arbeitsweise“ freigegeben. Plan: docs/plans/2026-09-26-workflow-steuerzeichen/ in diesem Ordner.

# Frage Herkunft Auflösung
7a Welche Zeichen weist das Werkzeug ab? Quelle nur für CR (der Vorfall). Die Zeichenmenge steht im Abbild von Claude Code 2.1.281 nicht eindeutig neben der Meldung (am Abbild gelesen 2026-09-26). Der Rest ist unbelegt und wird nicht geraten.
7b Welche Zeichen meldet die Prüfung? Projektvorgabe Jedes Zeichen der Unicode-Kategorie Cc außer LF und jedes der Kategorie Cf. Das ist eine geschlossene Menge und eine Obermenge dessen, was belegt ist. Tab wird gemeldet, obwohl unbelegt ist, ob das Werkzeug ihn abweist.
7c Welche Dateien? Projektvorgabe Jede *.js unter .claude/workflows/, auch in Unterordnern.
7d Wie gelesen? Quelle — Erinnerung gespeicherter-workflow-per-name-scheitert Als Bytes. read_text übersetzt CRLF still und war beim Vorfall blind.
7e Kein UTF-8, Ordner fehlt oder ist leer Projektvorgabe — pruefwerkzeuge.md, Abschnitte 4 und 6 Kein UTF-8 ist ein Befund. Fehlt der Ordner oder ist er leer, gibt es nichts zu prüfen, und Schweigen ist richtig.

Der Hook session-hooks/regelwerk_nach_edit.py löst seitdem auch bei Änderungen unter .claude/workflows/ aus.

Positivliste, nicht Negativliste

Alle sieben Prüfungen schränken geschlossene Mengen ein: die Menge der Wikilinks in einer Datei, die Menge der Pflichtfelder, die Menge der Agentendateien, die Menge der Regelwerk-Dateien, die Menge der Zeichen zweier Unicode-Kategorien. Es gibt keine Prüfung, die eine offene Menge verbotener Muster abzählt — und damit auch keine handgepflegte Negativliste, die gegen sie verlieren könnte.

Die Begründung gilt nur für diese sieben Achsen. Sie gilt ausdrücklich nicht für die Frage, ob zwei Regeln inhaltlich dasselbe sagen. Das sieht die Prüfung nicht und kann es nicht sehen.

Angriffsliste — einmal vollständig

Je Fall eine Wegwerfkopie des Vaults, Rücksetzen dazwischen, Exit-Code und auslösende Meldung protokolliert. Vor allem läuft die Grundlinie: die unbeschädigte Kopie muss sauber durchlaufen, sonst misst der Rest nichts.

Klasse Fall
Grundlinie unveränderter Vault → Exit 0
fehlt Pflichtfeld summary aus einer Regelwerk-Datei entfernt
fehlt Regelwerk-Datei nicht mehr im Stamm verlinkt
null status: auf leeren Wert gesetzt
leer Regelwerk-Datei auf 0 Byte gekürzt
zusätzlich neue Regelwerk-Datei, die niemand verlinkt
Wertebereich model: sonnet in pruefer.md (Tabelle sagt opus)
Wertebereich effort: xhigh in pruefer.md (Tabelle sagt high)
Wertebereich effort: hoch in planer.md — kein gültiger Wert
fehlt, Reihenfolge effort: fehlt in der ersten Agentendatei (executer.md) und, als eigener Fall, in der letzten (recherche.md)
null effort: ohne Wert in planer.md
Umgebung Effort-Spalte der Rollentabelle entfernt
Verweis ins Leere Effort-Zelle eines Agenten ohne Backtick-Wert
Freigabe eine Regelwerk-Datei auf status: pending-review
Gegenfall (muss stumm bleiben) effort: "high" in Anführungszeichen
Gegenfall (muss stumm bleiben) Zusatzspalte mit Backtick-Wert hinter der Effort-Spalte — fängt einen Rückfall auf die Spaltenposition
Gegenfall (muss stumm bleiben) Effort-Zelle mit zweitem Backtick-Wert — fängt „letzter statt erster Backtick-Ausdruck"
Verweis ins Leere Wikilink auf nicht existierende Datei
Konvention Dateiform der Planablage ohne Ordnerform
Reihenfolge toter Wikilink an erster und an letzter Position derselben Datei
Umgebung --vault zeigt auf ein Verzeichnis ohne CLAUDE.md
Umgebung AI/Regelwerk/ fehlt vollständig
Umgebung Rollentabelle im Stamm nicht auffindbar
Steuerzeichen, Reihenfolge CRLF in der ersten Workflowdatei und, als eigener Fall, ein CR in der letzten Zeile der letzten
Steuerzeichen NUL, Bidi-Umkehr U+202E, BOM am Dateianfang, Tab, je ein Fall
Kodierung Workflowdatei ist kein UTF-8
zusätzlich Workflowdatei mit CR in einem Unterordner
Gegenfall (muss stumm bleiben) typografische Anführungszeichen, Striche, Auslassungspunkte, Umlaut und Euro im Workflow
Gegenfall (muss stumm bleiben) Workflow-Ordner fehlt

Die letzten drei sind die wichtigsten: Sie prüfen, dass eine fehlende Voraussetzung ein Befund ist und kein Grund zu schweigen (§6).

Abbruchbedingung, vor der ersten Runde benannt

Schluss ist, wenn eine Runde nur noch Umformulierungen findet oder wenn alle verbleibenden Befunde dieselbe Antwort haben. Die Prüfung ist fertig, wenn alle Fälle der Angriffsliste anschlagen, alle Gegenfälle stumm bleiben und die Grundlinie grün ist — nicht, wenn sie „durchläuft". Die Zahl der Fälle zählt der Regressionslauf selbst; hier steht keine, weil sie bei jeder Erweiterung von Hand nachgezogen und dabei falsch würde.

Was diese Prüfung ausdrücklich nicht ist

Ein Fangnetz gegen formale Widersprüche. Kein Nachweis, dass die Anweisungsschicht widerspruchsfrei ist. Zwei Dateien können dieselbe Regel in verschiedenen Worten gegensätzlich formulieren, und die Prüfung meldet null Befunde. Der belastbare Nachweis ist das Lesen — die Prüfung nimmt nur die Formalien aus dem Weg, damit beim Lesen Kontext für den Inhalt bleibt.