Automatischer Push: 45 Datei(en) geändert

- .claude/agents/planer.md
- .claude/agents/quorum-stimme.md
- .claude/skills/bookstack-upload/SKILL.md
- .claude/skills/bookstack-upload/scripts/bookstack/archiv.py
- .claude/skills/bookstack-upload/scripts/bookstack/auswahl.py
- .claude/skills/bookstack-upload/scripts/bookstack/beschreibung.py
- .claude/skills/bookstack-upload/scripts/bookstack/bilder.py
- .claude/skills/bookstack-upload/scripts/bookstack/ergebnis.py
- .claude/skills/bookstack-upload/scripts/bookstack/hochladen.py
- .claude/skills/bookstack-upload/scripts/bookstack/konvertierung.py
- .claude/skills/bookstack-upload/scripts/bookstack/struktur.py
- .claude/skills/bookstack-upload/scripts/bookstack/verweise.py
- … und 33 weitere

Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Pascal MichelandClaude Opus 5 committed 2026-10-01 04:00:02 +02:00
1 parent e8472409e9
commit eb48f8822d
45 files changed
+8645 -262

No files matched your search

@@ -5,7 +5,7 @@ status: draft
summary: "Nach dem Plan prüft ein neuer Workflow quorum vor Einspielen, neuer Version auf master und Abgabe eines Kundendokuments denselben Unterschied seit dem letzten Quorum mit Opus, Sonnet und Codex (Ersatz Haiku), zählt Mehrheiten, lässt Einzelbefunde von Sonnet nachprüfen und liefert Urteil und Bericht."
tags: [plan, vault-tools, codeworkflow]
created: 2026-09-29
updated: 2026-09-29
updated: 2026-09-30
---
# Quorum am Meilenstein
@@ -15,7 +15,7 @@ updated: 2026-09-29
Die Anforderung ist die Spec `Inbox/2026-09-29-spec-quorum.md`; dieser Plan zitiert sie nicht, er setzt sie um. Nach dem Plan gibt es:
- **`.claude/workflows/quorum.js`:** baut über einen Hilfsagenten ein Prüfpaket, startet Opus und Sonnet als `quorum-stimme` und Codex über das Plugin gleichzeitig, setzt Haiku ein, wenn Codex keine gültige Stimme abgibt, lässt einen Sonnet-Agenten gleiche Befunde gruppieren, zählt die Stimmen, lässt Einzelbefunde der Schwere blockierend und wichtig nachprüfen und liefert Urteil, Bericht und Berichtspfad.
- **`.vault-tools/quorum/quorum_werkzeug.py`:** tut für den Workflow, was nur mit Dateisystem und Shell geht: Paket bauen, leeren Unterschied erkennen, Basis und Berichtsnummer bestimmen, das Ergebnis eines Codex-Jobs auswerten. Mit eigenen Fällen und Mutanten.
- **`.vault-tools/quorum/quorum_werkzeug.py`:** tut für den Workflow, was nur mit Dateisystem und Shell geht: Paket bauen, leeren Unterschied erkennen, Basis und Berichtsnummer bestimmen, das Ergebnis eines Codex-Jobs auswerten und den Bericht ablegen (`ablegen`, setzt `stand` aus `paket.json` ein). Mit eigenen Fällen und Mutanten.
- **`.claude/agents/quorum-stimme.md`:** die nur lesende Stimme mit drei Auftragsarten (Stimme, Nachprüfung, Nachkontrolle), dazu eine Zeile in der Rollentabelle des Stamms.
- **`AI/Regelwerk/codeworkflow.md`:** der Abschnitt „Quorum am Meilenstein“ als der eine Ort der Regel, Schritt 6 verweist darauf.
- **`.vault-tools/workflow-pruefung/`:** Grundlinie, Fälle und Mutanten für `quorum.js` wie für die übrigen Workflows.
@@ -33,7 +33,7 @@ Die Anforderung ist die Spec `Inbox/2026-09-29-spec-quorum.md`; dieser Plan ziti
```text
quorum.js (Args: anlass, projekt | ordner+dateien+uebersicht, basis?, kontext?, suite? | suite_datei?, codex?, codex_runden?)
├─ Paket werkzeug:paket (sonnet, low) ── python quorum_werkzeug.py paket ... --ziel $T
│ → QUORUM_PAKET {ordner, leer, basis, stand, dateien, lesemarke, bericht_pfad, nummer, vorher, ...}
│ → QUORUM_PAKET {ordner, leer, basis, stand, anzahl_dateien, lesemarke, bericht_pfad, nummer, vorher, paket_summe, ...}; Listen nur in paket.json
│ leer → Urteil des letzten Berichts übernehmen, keine Stimme, kein verbrauch
├─ Stimmen verbrauch.js (wunsch 1) → gebremst: kein Urteil
│ gleichzeitig: stimme:opus (quorum-stimme, opus)
@@ -60,14 +60,14 @@ Nachgelesen im Quelltext des Plugins `openai-codex/codex/1.0.6` (unter `~/.claud
| Rein lesende Prüfung eines Git-Diffs | `review` fährt den eingebauten Reviewer mit Sandbox `read-only` (`scripts/lib/codex.mjs` 1010-1013), kennt aber nur Arbeitsbaum oder Branch als Ziel (cc 259-269) und nimmt keinen eigenen Auftragstext (cc 271-276). `adversarial-review --base <ref>` fährt `read-only` (cc 414) mit festem Ausgabeschema (cc 415, `schemas/review-output.schema.json`, `additionalProperties: false`, kein Feld für einen Lesebeleg). Beide verlangen Git (cc 360). |
| Dokumente ohne Git | nur `task`: ohne `--write` Sandbox `read-only` (cc 491), Auftrag aus `--prompt-file` (cc 643-645), kein `ensureGitRepository` in `executeTaskRun` (cc 461-495). Die Wurzel ist das Git-Repo oder, ohne Git, das Arbeitsverzeichnis (`scripts/lib/workspace.mjs` 3-9). |
| Warten über zehn Minuten | `task --background` startet einen abgekoppelten Prozess (cc 671-682, 788-805) und gibt `jobId` und `logFile` zurück (cc 700-707); `status <job> --wait --timeout-ms` wartet höchstens so lange (cc 318-334, 891-897) und meldet `waitTimedOut`. `result <job> --json` liefert Job und gespeichertes Ergebnis, nur für beendete Jobs (cc 910-926, `scripts/lib/job-control.mjs` 256-263). |
| Kontingentabbruch | Ein Fehler des Codex-Servers geht als Zeile `Codex error: <Meldung>` ins Log (`scripts/lib/codex.mjs` 537-540, geschrieben über `scripts/lib/tracked-jobs.mjs` 122-131); die Schlussausgabe steht ebenfalls im Log (`tracked-jobs.mjs` 179). Exit 0 gibt es nur bei Turn-Status `completed` (`codex.mjs` 754-756, cc 665-667). Die Meldung selbst („usage limit“) ist aus dem Vorfall vom 2026-09-05 bekannt (Harness-Gedächtnis `codex-kontingent-begrenzt`), ihre Form im Log ist nicht gemessen. |
| Kontingentabbruch | Ein Fehler des Codex-Servers geht als Zeile `Codex error: <Meldung>` ins Log (`scripts/lib/codex.mjs` 537-540, geschrieben über `scripts/lib/tracked-jobs.mjs` 122-131); die Schlussausgabe steht ebenfalls im Log (`tracked-jobs.mjs` 179). Exit 0 gibt es nur bei Turn-Status `completed` (`codex.mjs` 754-756, cc 665-667). Die Form im Log ist belegt: Die Logs vom 2026-09-05 im Plugin-Datenordner zeigen `[<Zeitstempel>] Codex error: You've hit your usage limit. …` (Plankritik 2026-09-30). Gezählt wird deshalb nur eine Zeile dieser Form, nicht jedes Vorkommen im Log, denn dort stehen auch die Antwort von Codex und jede ausgeführte Befehlszeile. |
| Status und Logs | Zustand unter `$CLAUDE_PLUGIN_DATA/state/<ordnername>-<hash>/`, ohne die Variable im System-Temp unter `codex-companion/` (`scripts/lib/state.mjs` 29-44); darin `state.json` und `jobs/<job>.json` und `jobs/<job>.log` (`state.mjs` 183-191). `status` ohne Job-Kennung zeigt nur Jobs der eigenen Sitzungs-ID (`job-control.mjs` 15-25), mit Kennung alle (242-254). `status` startet keinen Codex-Lauf (cc 883-908, `job-control.mjs` 213-240, `codex.mjs` 906-923). |
**Entscheidung:** `task` ohne `--write`, im Hintergrund, für Code und Dokumente gleich. Nur `task` erreicht Dokumente ohne Git und erlaubt einen eigenen Auftrag mit Antwortformat und Lesebeleg; alle drei Stimmen lesen dann dasselbe Paket. Das Warten übernehmen kurze Hilfsagenten mit `status --wait`, weil das Bash-Werkzeug eines Agenten nach zehn Minuten endet.
**Wie der Workflow Codex erreicht:** über Hilfsagenten ohne `agentType` auf **`sonnet` mit `effort: 'low'`**, die je genau einen im Workflow zusammengesetzten Befehl fahren und die Ausgabe übertragen. Das Urteil über die Gültigkeit rechnet der Workflow aus den übertragenen Feldern, nicht der Agent. `low`, weil mechanische Arbeit auf `low` gemessen gleich treu war wie auf `high` (codeworkflow.md, „Effort je Rolle“). Nicht Haiku, weil `codex:ende` die Befundtexte von Codex überträgt und Haiku typografische Zeichen still ersetzt (ebenda, „Haiku und typografische Zeichen“).
**Gültige Codex-Stimme** (Spec, Abschnitt Codex): `status` vor dem Lauf mit Exit 0; Job endet `completed`; Log gelesen und null Treffer für „usage limit“; Antwort im vereinbarten Block; der Lesebeleg zitiert die Zeile `Lesemarke: <16 Hex>` aus `paket.md`. Die Lesemarke steht nicht im Codex-Auftrag, also kann sie nur zitieren, wer die Datei gelesen hat.
**Gültige Codex-Stimme** (Spec, Abschnitt Codex): `status` vor dem Lauf mit Exit 0; Job endet `completed`; Log gelesen und keine Zeile der Form `[<Zeitstempel>] Codex error: …usage limit…`; Antwort im vereinbarten Block; der Lesebeleg zitiert die Zeile `Lesemarke: <16 Hex>` aus `paket.md`. Die Lesemarke steht nicht im Codex-Auftrag, also kann sie nur zitieren, wer die Datei gelesen hat.
## Entscheidungsliste (pruefwerkzeuge.md, Abschnitt 1)
@@ -79,7 +79,7 @@ Nachgelesen im Quelltext des Plugins `openai-codex/codex/1.0.6` (unter `~/.claud
| Wann ist der Unterschied leer? | Spec | Code: kein Unterschied außerhalb von `docs/quorum/`. Dokumente: keine Datei neu, geändert oder entfernt nach SHA-256. |
| Was gilt bei leerem Unterschied? | Spec | Das Urteil des letzten Berichts, ohne Stimme und ohne `verbrauch`. |
| Wann zählt ein Befund für die Mehrheit? | Spec | Mit nicht leerem Beleg (nach `trim`). |
| Wann sind Befunde gleich? | Spec, Projektvorgabe | Der Sonnet-Agent gruppiert; das Skript löst jede Gruppe über verschiedene Dateien auf. Mehrheit heißt zwei verschiedene Stimmen. |
| Wann sind Befunde gleich? | Spec, Projektvorgabe (Nachbesserung 2026-09-30) | Der Sonnet-Agent gruppiert; das Skript teilt jede Gruppe in Teilgruppen nach Datei und, wo die Stellen Zeilennummern tragen, nach Zeilenbereichen, die sich mit einer Toleranz von drei Zeilen überschneiden (transitive Hülle). Eine Stelle ohne Zeilennummer bleibt bei ihrer Gruppe, solange die Zeilen dieser Datei genau eine Teilgruppe bilden. Mehrheit heißt zwei verschiedene Stimmen in einer Teilgruppe. |
| Schwere einer Mehrheitsgruppe? | Annahme (offen) | Die höchste ihrer Mitglieder. |
| Wer wird nachgeprüft? | Spec | Gruppen ohne Mehrheit mit Schwere blockierend oder wichtig. Hinweise gehen ungeprüft in den Bericht. |
| Urteil frei? | Spec, verschärft (offen) | Kein bestätigter blockierender Befund und kein blockierender, der ungeprüft blieb. |
@@ -103,8 +103,9 @@ Nachgelesen im Quelltext des Plugins `openai-codex/codex/1.0.6` (unter `~/.claud
|---|---|---|---|---|
| 01 | `.vault-tools/quorum/quorum_werkzeug.py`, `faelle_quorum_werkzeug.py`, `mutanten_quorum_werkzeug.py` | neu | haiku | 1 |
| 02 | `.claude/workflows/quorum.js` | neu | haiku | 1 |
| 03 | `.vault-tools/workflow-pruefung/faelle_workflows.mjs`, `mutanten_workflows.py` | geändert | haiku | 2 |
| 03 | `.vault-tools/workflow-pruefung/faelle_workflows.mjs`, `mutanten_workflows.py` | geändert | sonnet, low | 3 |
| 04 | `.claude/agents/quorum-stimme.md` (neu), `CLAUDE.md`, `AI/Regelwerk/codeworkflow.md` (geändert) | neu und geändert | sonnet, low | 1 |
| 05 | `.vault-tools/quorum/quorum_werkzeug.py`, `faelle_quorum_werkzeug.py`, `mutanten_quorum_werkzeug.py`, `.claude/workflows/quorum.js` | Nachbesserung nach der Prüfung von Welle 1 (2026-09-30): Teilgruppen nach Datei und Zeilen mit Toleranz drei, `GIT_OPTIONAL_LOCKS=0`, `--summe` in `ablegen`; Delta gegen den Baum | sonnet, low | 2 |
Die Zieldateien sind disjunkt. **Welle 1** (Task 01, 02, 04) läuft parallel. **Welle 2** (Task 03) folgt, weil ihre Fälle und Mutanten gegen `quorum.js` aus Task 02 laufen.
@@ -113,7 +114,7 @@ Die Zieldateien sind disjunkt. **Welle 1** (Task 01, 02, 04) läuft parallel. **
- **M1, kostenlos, vor Welle 1** (Sonnet-Executer oder Koordinator, im Bash-Werkzeug eines Subagenten, denn so ruft der Workflow das Plugin):
`node "$HOME/.claude/plugins/cache/openai-codex/codex/1.0.6/scripts/codex-companion.mjs" status --json --cwd D:/Claude; echo "EXIT $?"; [ -n "$CLAUDE_PLUGIN_DATA" ] && echo "CLAUDE_PLUGIN_DATA gesetzt" || echo "CLAUDE_PLUGIN_DATA leer"`
Erwartet: Exit 0 und ein JSON mit `workspaceRoot`. Die Zeile zu `CLAUDE_PLUGIN_DATA` sagt, ob Jobs aus dem Workflow im Plugin-Datenordner oder im System-Temp landen. `status` startet keinen Codex-Lauf (Belege oben).
- **M2, kostet Codex-Kontingent, im Lauf mit echten Daten:** Überlebt der Hintergrundjob das Ende des Bash-Aufrufs von `codex:start`? Wie lange braucht Codex für ein Paket? Wie sieht die Log-Zeile bei „usage limit“ aus, falls sie auftritt?
- **M2, kostet Codex-Kontingent, im Lauf mit echten Daten:** Überlebt der Hintergrundjob das Ende des Bash-Aufrufs von `codex:start`? Wie lange braucht Codex für ein Paket? (Die Form der Log-Zeile bei „usage limit“ ist aus den Logs vom 2026-09-05 belegt.)
- **M3, im Lauf mit echten Daten:** Verbrauch je Lauf (Ablesungen vorher und am Ende stehen im Bericht).
## Fertig heißt
@@ -127,7 +128,7 @@ Die Zieldateien sind disjunkt. **Welle 1** (Task 01, 02, 04) läuft parallel. **
7. `python .vault-tools/regelwerk-check/regelwerk_check.py --vault .`: keine Befundzeile, die `quorum-stimme` oder `Rollentabelle` enthält, und nicht mehr Befunde als vor Task 04.
8. Byte-Vergleich: `welle_vergleich.py` je Welle gegen die Kopie mit angewendetem Plan, dazu `plan_bloecke.py nach` für Task 03 und 04 ohne Befund.
9. M1 wie oben: Exit 0 und JSON.
10. Lauf mit echten Daten wie unten: `status: fertig` mit Bericht, danach ein Leerlauf mit `status: leer`.
10. Lauf mit echten Daten wie unten: `status: fertig` mit Bericht, und die eingebaute Macke steht darin als Mehrheit oder als bestätigter Einzelbefund; danach ein Leerlauf mit `status: leer`.
## Lauf mit echten Daten
@@ -136,7 +137,7 @@ Nach Welle 2, in einer frischen Sitzung oder über `scriptPath` (ein neuer Workf
1. Ein Probe-Repo im Scratchpad: zwei Commits, im zweiten eine eingebaute Macke mit klarer Schwere (etwa eine vertauschte Bedingung in einer kleinen Funktion, dazu ein Test, der sie nicht fängt, und ein Suite-Ergebnis in einer Datei).
2. `workflow({ scriptPath: "D:/Claude/.claude/workflows/quorum.js" }, { anlass: "einspielen", projekt: "<probe>", basis: "<erster commit>", suite_datei: "<datei>" })`.
3. Auffallen müsste: Die Macke steht als Mehrheit oder als bestätigter Einzelbefund im Bericht. Codex ist gültig oder der Grund steht im Bericht (M2). Die Lesemarken der Claude-Stimmen passen (sonst Hinweis im Bericht). Verbrauch vorher und am Ende stehen drin (M3). Das Journal zeigt Opus, Sonnet und `codex:start` gleichzeitig.
4. `bericht_md` unter `bericht_pfad` ablegen, dann denselben Aufruf ohne `basis` noch einmal: `status: leer`, das Urteil ist übernommen, genau ein Agent (`werkzeug:paket`) lief.
4. `bericht_md` als `bericht.md` in den Paketordner schreiben und den `ablegen_befehl` aus dem Ergebnis fahren, dann denselben Aufruf ohne `basis` noch einmal: `status: leer`, das Urteil ist übernommen, genau ein Agent (`werkzeug:paket`) lief.
5. Das Temp-Paket (`paket` im Ergebnis) danach löschen.
Der erste echte Meilenstein eines Projekts ist der zweite Lauf mit echten Daten; die Auswertung nach fünf Quoren steht in der Regel.
@@ -150,11 +151,11 @@ Der erste echte Meilenstein eines Projekts ist der zweite Lauf mit echten Daten;
- **Laufzeit je Claude-Stimme** aus dem Workflow-Journal, nach dem Muster von `verbrauch_reihe.py` (Labels `stimme:*`, Zeitstempel aus `agent-<id>.jsonl`), als kleines Skript unter `.vault-tools/quorum/`.
- **Auswertung nach fünf Quoren:** eine Tabelle über alle Berichte eines Projekts (Stimme, Befunde, bestätigt, Alleinfunde, wie oft Haiku statt Codex), als Grundlage für den Dump.
- **`LIESMICH.md`** für `.vault-tools/quorum/` mit den Belegen der ersten Läufe.
- Falls Pascal es will: ein Workflow-Modus für die Nachkontrolle behobener Befunde statt des Agent-Werkzeugs, und die Stamm-Zeile für Kundendokumente (Offene Punkte 3 und 9).
- Falls Pascal es will: ein Workflow-Modus für die Nachkontrolle behobener Befunde statt des Agent-Werkzeugs (Offener Punkt 3).
## Risiken
- **Fremde Änderungen im Baum.** `CLAUDE.md` und `AI/Regelwerk/codeworkflow.md` tragen am 2026-09-29 nicht committete Änderungen einer anderen Sitzung (Sonnet 5.5). Die Aus-Blöcke von Task 04 zitieren diesen Stand. Vor Welle 1 `plan_bloecke.py vor` fahren; bei einem Befund den Plan nachziehen, nicht den Baum.
- **Parallele Sitzungen im Baum.** `CLAUDE.md` und `AI/Regelwerk/codeworkflow.md` sind seit dem Auto-Push vom 2026-09-30, 04:00, committet, `plan_bloecke.py vor` war danach ohne Befund. Andere Sitzungen können beide Dateien weiter ändern. Vor Welle 1 deshalb erneut `plan_bloecke.py vor` fahren; bei einem Befund den Plan nachziehen, nicht den Baum. `CLAUDE.md` liegt im Arbeitsbaum mit CRLF, `plan_materialisiere.py` schreibt sie ganz als LF zurück; das entspricht `.gitattributes` (`eol=lf`).
- **Hintergrundjob stirbt** mit dem Bash-Aufruf von `codex:start` (M2). Dann endet `status --wait` mit einem Job, der nie fertig wird, oder mit `failed`; die Codex-Stimme ist ungültig, Haiku springt ein, und der Bericht nennt den Grund.
- **Codex braucht länger** als `codex_runden` mal neun Minuten. Dann bricht der Workflow den Job ab und setzt Haiku ein.
- **Falsche Gruppen** erzeugen eine falsche Mehrheit. Dagegen stehen die Originaltexte je Gruppe im Bericht; gemessen ist die Fehlerquote nicht.
@@ -164,15 +165,19 @@ Der erste echte Meilenstein eines Projekts ist der zweite Lauf mit echten Daten;
## Offene Punkte für Pascal
**Entschieden am 2026-09-30:** Pascal hat die Spec abgenommen und alle Vorschläge dieser Liste angenommen. Punkt 9 ist als Block in Task 04 umgesetzt (Zeile im Regelwerk-Verzeichnis des Stamms), aus Paket 2 entfällt er damit.
1. **„Prüfpaket bauen ohne Agent“ geht nicht wörtlich.** Ein Workflow-Skript hat weder Dateisystem noch Shell; das Laufzeitsystem reicht nur `agent`, `parallel`, `pipeline`, `phase`, `log`, `workflow`, `args` und `budget` hinein (nachgebildet in `attrappe.mjs` 45). Deshalb fährt ein Hilfsagent (Sonnet, `low`) genau einen Skriptbefehl. Bei leerem Unterschied läuft also genau dieser Hilfsagent, keine Stimme.
2. **Den Bericht schreibt der Koordinator**, nicht der Workflow: Der liefert `bericht_md` und `bericht_pfad`, der Koordinator legt ab, verlinkt und committet. Ein Hilfsagent, der den Text abschreibt, wäre eine Fehlerquelle mehr.
2. **Den Bericht schreibt der Koordinator**, nicht der Workflow: Der liefert `bericht_md`, `bericht_pfad` und `ablegen_befehl`, der Koordinator legt über `quorum_werkzeug.py ablegen` ab und committet; den Stand setzt das Skript aus `paket.json` ein (Plankritik 2026-09-30, Q8). Ein Hilfsagent, der den Text abschreibt, wäre eine Fehlerquelle mehr.
**Seit der Nachbesserung vom 2026-09-30:** Ein Kundendokument muss unter `D:/Claude/` liegen, weil der Bericht die Übersicht per Wikilink mit vollem Vault-Pfad verlinkt; `pruefeArgs` lehnt einen Ordner außerhalb ab.
3. **Nachkontrolle behobener Befunde** läuft über das Agent-Werkzeug (`quorum-stimme` auf Sonnet, Auftragsart Nachkontrolle), nicht als Workflow-Modus. Reicht das?
4. **Laufzeit je Claude-Stimme** steht im Bericht als „nicht gemessen“, bis Paket 2 sie aus dem Journal nachträgt. Codex-Laufzeit steht drin.
5. **Schwere einer Mehrheitsgruppe** bei abweichender Einstufung: Der Plan nimmt die höchste.
6. **Ungeprüft blockierend sperrt:** Liefert die Nachprüfung kein Urteil, sperrt ein blockierender Einzelbefund wie ein bestätigter. Die Spec nennt nur „bestätigt“.
7. **Weniger als zwei Stimmen:** kein Urteil, kein Bericht, die Basis bleibt die alte. Die Spec regelt den Fall nicht.
8. **Unbelegte Einzelbefunde** werden nicht nachgeprüft, auch blockierende nicht. Die Spec sagt nur, dass sie nicht für die Mehrheit zählen.
9. **Kundendokumente lösen die Regel nie aus:** `codeworkflow.md` wird nur bei Code-Projekten geladen. Vorschlag: eine Zeile im Regelwerk-Verzeichnis des Stamms („Einspielen, neue Version auf master oder Kundendokument vor der Abgabe → codeworkflow.md, Quorum am Meilenstein“). Nicht umgesetzt.
9. **Kundendokumente lösen die Regel nie aus:** `codeworkflow.md` wird nur bei Code-Projekten geladen. Vorschlag: eine Zeile im Regelwerk-Verzeichnis des Stamms („Einspielen, neue Version auf master oder Kundendokument vor der Abgabe → codeworkflow.md, Quorum am Meilenstein“). Umgesetzt am 2026-09-30 in Task 04.
10. **Erstes Quorum eines Code-Projekts** braucht eine Basis. Welche, entscheidet der Koordinator je Projekt (etwa der Commit der letzten abgenommenen Version).
11. **Welche Spec- und Planübersichten ins Paket kommen**, nennt der Koordinator über `kontext`. Eine automatische Erkennung gibt es nicht.
12. **Effort der Sonnet-Stimme:** keine Abweichung, `high` aus dem Frontmatter. Abdeckung ist der Zweck, und bei Sonnet treibt das Lesen die Kosten, nicht der Effort (codeworkflow.md, „Effort je Rolle“). Gemessen ist Sonnet als Prüfer nicht.