Files
wow20/_bmad-output/implementation-artifacts/spec-3-13-epic-3-verifikations-und-abnahmegate.md
T
Michael TamseandClaude 3f57586a50 feat: Story 3.13 finaler Status-Sync — done-Flip + Epic 3 done (Step-05 nach grünem Re-Run #10 + konvergiertem Review-Loop-2)
Grüner Re-Run #10 (committed 09c1c83): FAILED=0 PASS_COUNT=51, SANDBOX-3-13-OK,
RUN_OK/Exit 0 — A.5 Pre-Check sauber, C 12/12, D 4/4 SUCCESS, D-NEG 3×FAIL+1×SUCCESS,
E.4 NON_AT=0 AT=2, E.6 Feldsatz-exakt (P-L2-2) + A==B + Known-Value-Witness (P-L2-1),
E.9 kanonische 'Baseline $BASE'-Form (P-L2-6), F G-1..G-8 (G-6 Negativ-/Positiv-Kontrolle),
G-8 Porcelain-Clean (inkl. Untracked) + AD-3 Read-only ohne Diff.
Review-Loop-2 konvergiert (bmad-code-review 4 Layer): 38 rohe → 4 decision-needed /
11 patch / 2 defer / 4 dismissed; alle Entscheidungen mit ProMods geschlossen,
alle Patches P-L2-1..11 angewendet (Gate 1005 Z., bash -n clean).

Status-Sync (Präzedenz 3.7–3.12):
- spec-3-13 Frontmatter status: done, review_loop_iteration: 2; Tasks L71/L72/L75 getickt
- sprint-status.yaml: Key 3-13 → done, epic-3 → done (AC-9: alle Stories 3.1–3.13 done),
  last_updated → 08-24-2026 13:22
- deferred-work.md: 3.13-Home-Defers (L551/560/576/594/597/611/629/633) über den
  "Aufgegriffen: Story-3.13-Abnahme als Home"-Block erledigt (bereits in 09c1c83);
  Review-Loop-2-Block (W-L2-1/2 + D-3.13-L2-1/2/3) als offene Defers → Rev 3.9/Epic-4
- epic-3-context.md: Ist-Zeilen (Z.7/46/52) auf grünen Re-Run #10 + done nachgeführt
- wiki/log.md: neuer ## 2026-08-24-Eintrag (append-only, P-12-Präzedenz; bestehende
  Datumsgruppen unverändert) — Review-Loop-2-Abschluss + grüner Re-Run #10 + done-Flip

Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt: git status --porcelain -- wiki/ zeigt nur
diesen log-Eintrag; AD-3 Read-only (schema/validator.md, schema/wiki-compiler.md,
schema/compiler.md, adapters/, raw/, schema/canonical-terms.md) unverändert;
kein Standalone (D-3), keine neue §7-Invaliditätsklasse, keine Vertragsänderung.
epic-3-retrospective (optional) bleibt offen.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 13:36:07 +02:00

239 lines
80 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 'Story 3.13 — Epic-3-Verifikations- und Abnahmegate'
type: 'feature'
created: '2026-08-22'
status: 'done'
baseline_commit: 'c234fc361e006043c3c972cc03211b52998c2ddb'
review_loop_iteration: 2
context:
- '_bmad-output/implementation-artifacts/epic-3-context.md'
---
<frozen-after-approval reason="human-owned intent — do not modify unless human renegotiates">
## Intent
**Problem:** Epic 3 gilt erst als abgeschlossen, wenn ein **reales, reproduzierbares Source→Compilation→Wiki-Abnahmegate** es qualifiziert (epic-3-context Z. 7, Z. 46, Z. 52; AD-5/AD-6/AD-13/AD-17a/b/dh, A0-12/13/15/16/19). Die 12 verankerten Sandbox-Suiten (3-1..3-12) beweisen die Einzel-Mechaniken jeweils isoliert in `/tmp`-Mini-Bundles; die **cross-cutting-Abnahmeebene** fehlt: kein einziges Kommando führt alle Epic-3-Szenarien fail-fast aus, der vollständige autorisierte Validator (`schema/validator.md` Rev 9) wird bisher nur **human-mechanisch** über `wiki/` gestellt (kein ausführbares Verfahren, D-3), die „zwei frische Agent-Kontexte"-Zwei-Run-Bestätigung ist ausdrücklich nur **mechanisch simuliert** (Subshells, spec-3-8 P-5 / compiler.md Z. 374 — der echte Nachweis ist dem 3.13-Gate vorbehalten), und der Epic-5-Abhängigkeits-Smoke (FR-15/16) plus Porcelain-Unverändertheit (git status --porcelain) eines Clean-Checkouts wurden nie als Gate geprüft.
**Approach:** Ein einziges, re-executierbares, fail-fast ausführbares **Gate-Skript** `_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` orchestriert die vollständige Epic-3-Abnahme: (a) Repo-Weiter Bausatz: alle 12 Sandbox-`run-sandbox.sh` als Sub-Runs nacheinander, jede Assertion hart, jede Abweichung = Non-Zero-Exit; (b) echte vollständige Validator-Integration — ein frisch gestarteter **Agent-Kontext** liest `schema/validator.md` (Rev 9, 14 Punkte + §6-Fachprüfungen) und stellt ein Verdikt `SUCCESS`/`FAIL <pfad> <ursache>` über **alle** `wiki/`-Dateien des Clean-Checkouts per angefügter `verdict-*-dateien.md`-Datei; das Gate prüft deren Grammatik (§5, §5.1) und Exhaustivität (jede `wiki/**/*.md`-Datei außer nicht-`raw/`-externe hat genau ein Verdikt), schreibt aber **keine eigenen Validator-Urteile**; (c) zwei frische Agent-Kontexte (zwei getrennte `$SB`-Arbeitskopien, jeweils ausgemeindete Clone-Kopien, `git worktree add` auf denselben `$BASE`-Commit) führen `schema/compiler.md` über einer repräsentativen committeten Fixture aus; das Gate baut die Fixture auf (rohes Zuwachs-Paar + Ziel-Concepts, committet als `$BASE`), schreibt **selbst weder erwartete Wiki-Bodies noch Lease-/Log-/Git-Ausgänge** (§5.14 Pkt. 2; epic-3-context-Z. 46) und vergleicht die beiden Ergebnis-Bäume via `git diff <A> <B> -- wiki/` + Hash- und Frontmatter-Angleichung (nur die benannte `generated.at`-/`verified[].at`-Ausnahme); (d) G-Szenarien (G-1..G-8) als harte Assertions, inkl. der Epic-5-Abhängigkeits-Smoke (G-7: die vordefinierten Wissensfragen brauchen nur das `wiki/`-Bundle, keine Planungs-Referenzen) und Porcelain-Check (G-8: nach dem Lauf `git status --porcelain -untracked-files=no` leer). `schema/compiler.md`, `schema/validator.md`, `schema/wiki-compiler.md`, `adapters/`, `raw/` bleiben read-only (AC-4: das Gate ändert die Schema-Semantik nie still); der Gate-Lauf findet ausschließlich als `/tmp`-Kopie des realen Clone-Baums statt (nie im Ist-Baum), das reale `wiki/` wird nur als Textquelle gelesen.
## Boundaries & Constraints
**Always:**
- **Nicht primär-mutiert:** `schema/compiler.md`, `schema/validator.md`, `schema/wiki-compiler.md`, `adapters/`, `raw/` — read-only (AD-3; das Gate ist eine Abnahme, keine neue Instruktions- oder Validator-Semantik).
- **Ein Datei-Satz erzeugt:** `_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` (re-executierbar, `bash run-sandbox.sh` aus Repo-Root). Es läuft **ausschließlich als `/tmp`-Kopie** des realen Clone-Baums (koppelt `git clone`/`git worktree add` + Bundle-Kopie), greift nie auf den Ist-Baum zu und hinterlässt den Ist-Baum `git status --porcelain`-unverändert (G-8).
- **Kein `sed -i`:** alle Mutationen im Gate-Skript über `cp`/`printf > file`/`git …`-Aufrufe (portabel macOS/BSD- und Linux/GNU-Userland, AC-2).
- **Harness schreibt keine erwarteten Wiki-Bodies / Lease-/Log-/Git-Ausgänge:** die beiden frischen Agent-Kontext-Läufe (c) erzeugen die Wiki-/Receipt-Ausgabe; das Gate vergleicht A vs B (§5.14 Pkt. 2), hard-codiert keinerlei erwartete Bodies/Receipts (AC-4/AC-5, epic-3-context Z. 46; Defer-Home: DET-1/DET-2-Plan-Literale, R-9-Receipt-Literale).
- **`raw/` bleibt Status quo:** der Clean-Checkout-Fixture-Roh-Zuwachs lebt in der /tmp-Fixture (Kopie des realen `raw/`-Baums + Zuwachs dort), nie als Mutation im realen `raw/`.
- **Validator-Ausführung:** der frische Agent-Kontext ist der DIR-Exekutor für `schema/validator.md`; das Gate validiert nur Verdikt-Grammatik/-Exhaustivität, urteilt nie selbst (D-3-Compliance).
- **AC-4-Defizit-Route:** erkennt das Gate ein Validator-Defizit, schlägt G-5 fehl (Non-Zero), Story 3.13 bleibt offen und benennt den Bedarf einer separat autorisierten Epic-1-Remediation; das Gate ändert dann nichts an Schema/Validator.
- **Sandbox-Nachweis:** Exit 0, harte PASS/FAIL, `/tmp`-Baum, nie der reale Ist-Baum (Muster sandbox-3-11/3-12).
**Ask First:**
- Einen Validator-Patch anzufassen (wäre Epic-1-Remediation, separat autorisiert) — oder Gate-Verhalten zu ändern, das auf realen Wanduhr-/`generated.at`-Ausnahmen beruht (A0-20).
**Never:**
- Kein Umschreiben von `schema/compiler.md`/`schema/validator.md`/`raw/`; kein neues Prädikat/keine neue §7-Invaliditätsklasse; kein Standalone-Inhalts-Befund (D-3); kein textueller Auto-Merge (AD-17c); keine stille Löschung (AD-17e); keine Wanduhr-/TTL-Steuerung (A0-20); kein echtes `wiki/`-oder-`raw/`-Schreiben durch das Gate (nur Textquelle); kein Zugriff auf echte fremde Worktrees.
## I/O & Edge-Case Matrix
| Scenario | Input / State | Expected Output / Behavior | Error Handling |
|----------|--------------|---------------------------|----------------|
| SANDBOX_SUB_RUN_OK | n-te Sandbox liefert PASS/Exit 0 | Sub-Run erkennbar; FAIL → Non-Zero-Exit, Lauf bricht ab (fail-fast) | jede Abweichung = harter Non-Zero |
| VALIDATOR_AGENT_VERDIKT_OK | frische Verdikt-Datei je Datei-Pfad | Grammatik §5/§5.1 erfüllt; jede stattfindende `wiki/**/*.md`-Datei hat ein Verdikt; SUCCESS überall → G-3 PASS | fehlende/ungrammatische/FAIL-Verdikte = Non-Zero |
| VALIDATOR_DEFIZIT | fehlende/ungrammatische/FAIL-Verdikte werden nicht selbst repariert | G-5 FAIL (Non-Zero), Story bleibt offen; Bedarf einer Epic-1-Remediation wird textuell benannt | Non-Zero-Exit, kein Gate-Flip |
| FRESH_AGENT_TWO_TREES | zwei getrennte Arbeitskopien, gleicher `$BASE`-Commit | beide Runs beenden; `git diff A B` zeigt nur `at`-Abweichung; Bundle-Hashes/Reihenfolge/Plan A==B (außer `at`) | Divergenz außerhalb Ausnahme = harter FAIL |
| PERTURBIERTE_ENTSCHEIDUNG | eine der zwei Runs wird im Script über eine perturbed Option geroutet | Negativ-Kontrolle: divergente Bäume werden erkannt (G-6) | Non-Zero-Exit, kein false-PASS |
| PORCELAIN_CLEAN | nach dem Lauf | `git status --porcelain --untracked-files=no` auf dem Ist-Baum leer | überszogene Gate-Artefakte = Non-Zero |
| CONSUMER_SMOKE | nur das erzeugte Bundle | FR-15/16-Fragen ohne Planungs-Referenzen beantwortbar (G-7) | Referenz auf PRD/Spec/Spine = Non-Zero |
| GENERATED_AT_AUSNAHME | die einzige erlaubte Differenz | `generated.at`/`verified[].at`-Zellen dürfen abweichen | andere Zellen abweichend = Non-Zero |
</frozen-after-approval>
## Code Map
- `_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh`**neu erzeugt** (re-executierbar, Muster `sandbox-3-12/run-sandbox.sh` 820 Z. + `sandbox-3-8` Zwei-Worktree-Mechanik Z. 249-251/268/281-306/415-433; `set -u`, **kein** `set -e` — negatives Assertion-Idiom `cmd && fail`; `ROOT=$(mktemp -d /tmp/sb313-XXXXXX)`; `git config core.autocrlf false` + `core.filemode false`; `pass()/fail()` hart; End-Exit 0). Abschnitte: **(A) Setup** — Repo-/Bundle-/Referenz-Check, Referenz-Sandbox-Liste `sandbox-3-1..3-12`, `git status --porcelain`-Pre-Check; **(B) Käfig-Bau** — `/tmp`-Kopie des realen Clone-Baums (liest alle `wiki/**/*.md`-Dateiliste, kopiert `schema/raw/…`), `git init`+baseline; **(C) 12 Sandbox-Sub-Runs** — je `bash …/sandbox-3-N/run-sandbox.sh` mit Exit-Check; **(D) Validator-Agent** — frischen Sub-Agent-Kontext starten, der `schema/validator.md` über alle `wiki/`-Dateien ausführt und `verdict-*.md`-Dateien (SUCCESS/FAIL-Format) ablegt; **(E) Zwei-frische-Agenten** — zwei `/tmp`-Arbeitskopien (G-Kontext), shared `$BASE`-Fixture-ROH-Zuwachs `raw/alpha-v2.md`+Ziel `wiki/alpha.md` committet, beide Runs auf `git worktree add $BASE`, A/B-`git diff -- wiki/` + Hash-/Frontmatter-Vergleich, Nur-`at`-Ausnahme; **(F) G-1..G-8** harte Assertions; **(G) Nachweise/Porcelain** — Endzustands-Invariante + `git status --porcelain`-leerer Zustand.
- `_bmad-output/implementation-artifacts/sandbox-3-12/run-sandbox.sh`**read-only** Ausgangspunkt (L-1..L-9, Exit 0; Portrait der $5.18-Kill-Point-/Clean-Input-Härtung), Ausgangspunkt der `pass()/fail()`/Isolate-Helfer.
- `_bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh`**read-only** Quelle der Zwei-Worktree-Mechanik (DET-2: `git worktree add -q "$ROOT/wt-a" "$BASE"` Z. 249-251; `run2_worktree()` Z. 268; Manifest-Validierung Z. 281-306; Cross-Receipt-Vergleich A vs B Z. 415-433) — der 3.13-„Zwei-frische-Agenten"-Kern.
- `_bmad-output/implementation-artifacts/spec-3-8-determinismus-vertrag-ad-17h-als-agent-instruktions-validato.md`**read-only** Defer P-5 (Z. 150): „die zwei frischen Agent-Kontexte sind mechanisch simuliert … der Nachweis echter frischer Kontexte erfolgt im Story-3.13-Abnahmegate über reale Agent-Läufe".
- `_bmad-output/implementation-artifacts/deferred-work.md`**append, read-only lesbar** (Aufgegriffen-/3.13-Home-Marker): L551 (DET-1/2-Plan-/Form-Literale), L560 (R-9-Receipt-Literale), L576 (wiki//raw/-Invarianten-Beweis), L594 (Zwei-Producer-verschiedene-`<id>`-Gewinner), L597 (Zwei-Worktree-Barriere-überlappung), L611 (Zwei-Worktree-Übernahme), L629 (geteilter-Ref-Namespace-Real-Beweis), L633 (AC-3-Stash-/AC-5-kombinierter-Clean-Input-Beweis) — diese werden über die echten Gate-Runs einschlägig **geschlossen** (Home 3.13-Abnahme realisiert); der zugehörige RD-Notiz-/Defer-Block bleibt unverändert (nur das Home ist erledigt).
- `_bmad-output/implementation-artifacts/sprint-status.yaml`**mutiert** nach Gate-Freigabe (Step-05): Key `3-13-epic-3-verifikations-und-abnahmegate` `backlog → done` (final); `epic-3` bleibt solange `in-progress`; `last_updated` (Format `MM-DD-YYYY HH:MM`).
- `_bmad-output/implementation-artifacts/epic-3-context.md`**mutiert** („Edit freely") nach Gate-Freigabe: Z. 7/46/52 von „…als abgeschlossen/…Gate…zwei frische Agent-Kontexte…" auf Ist-Zustand (Gate erfolgreich ausgeführt) aktualisiert.
- `wiki/log.md`**append** (Vertrag §5): Story-3.13-Eintrag (Gate-Lauf, Sandbox 3-13, G-1..G-8, Zwei-frische-Agenten-A/B-Identität, Sandbox-Nachweis 12×Exit 0, Validator-Integration, Porcelain-Check, sprint-status.yaml-Flip) — **nur** vertragskonforme fachliche + Koordinationsereignisse (AC-6; Dokumentations-Kategorie wie 3.12—3.13-Gate-Lauf selbst ist zulässiger Koordinations-Nachweis, Kategorie-Historie bleibt außerhalb).
**Read-only evidence (AD-3):** `schema/validator.md` (Rev 9, §0 L9-22 „rein textuell — kein Standalone-Programm (D-3)", §3 14-Punkte-Tabelle Z. 50-73, §5 Verdikt-Format Z. 139, §5.1 Selbstbegrenzung Z. 154, §6-Fachprüfungen EC-1/EC-3/EC-11 Z. 160-201, §7-Fixtures Z. 202-289); `schema/compiler.md` (Revision 3.7; §0 Z. 9, §6 Z. 441-446 — „Das gesamte Bundle gemäß schema/validator.md geprüft"; §7 Z. 486-499; §8-Revisionslog Z. 501-543); `schema/wiki-compiler.md`; `adapters/`; `raw/` (immutable Evidenz). `schema/canonical-terms.md` append-only unangetastet.
## Tasks & Acceptance
**Execution:**
- [x] `_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` — Gate-Skript bauen (Setup → Käfig-Bau → 12-Sandbox-Fail-Fast → Validator-Agent → Zwei-frische-Agenten-A/B → G-1..G-8 → Porcelain-Check), harte PASS/FAIL, Exit 0, `/tmp`-Kopie nie Ist-Baum
- [x] `schema/compiler.md`/`schema/validator.md`/`adapters/`/`raw/` — durch das **Gate** read-only verifiziert (kein Gate-Diff; AD-3); `schema/compiler.md`-Diff = separat **autorisierte** Rev 3.8 (nicht durch das Gate), `schema/canonical-terms.md` unangetastet
- [x] Gate real ausführen (mehrere Läufe, inkl. skript-seitiger Zwei-/Mehr-Lauf-Stabilität) bis Exit 0; Negativ-Kontrollen ausführen — **Re-Run #10 (2026-08-24) GRÜN** (committed `09c1c83`; `FAILED=0 PASS_COUNT=51`, SANDBOX-3-13-OK, RUN_OK/Exit 0; A.5 Pre-Check sauber, C 12/12, D 4/4 SUCCESS, D-NEG 3×FAIL+1×SUCCESS, E.4 `NON_AT=0 AT=2`, E.6 Feldsatz-exakt (P-L2-2) + A==B + Known-Value-Witness (P-L2-1), E.9 kanonische `Baseline $BASE`-Form (P-L2-6), F G-1..G-8 grün inkl. G-6 Negativ-/Positiv-Kontrolle, G-8 Porcelain-Clean + Negativ-Kontrolle + AD-3 ohne Diff); Re-Run #5-#9-Historie s. Change-Log
- [x] `_bmad-output/implementation-artifacts/sprint-status.yaml` — Key 3-13 → `done`, `epic-3` Status-Kette prüfen, `last_updated` aktualisieren (Step-05 nach Review) — **ausgeführt (2026-08-24)**: Key `3-13-…``done`, `epic-3``done` (AC-9: alle Stories 3.13.13 done), `last_updated` → 08-24-2026
- [x] `_bmad-output/implementation-artifacts/epic-3-context.md` — Abnahme-Zeile auf Ist-Zustand nachführen
- [x] `wiki/log.md` — Story-3.13-Eintrag (Gate, Sandbox-3-13, G-1..G-8, Validator-Integration, Zwei-frische-Agenten, Porcelain) — nur vertragskonforme Inhalte (AC-6)
- [x] `_bmad-output/implementation-artifacts/deferred-work.md` — 3.13-Home-Defers (L551/L560/L576/L594/L597/L611/L629/L633) als aufgegriffen/erledigt markieren (Defer-Block selbst historisch unverändert) — **ausgeführt (2026-08-24)**: „Aufgegriffen: Story-3.13-Abnahme als Home"-Block (deferred-work.md) realisiert die Homes durch die echten Gate-Runs; Original-Defer-Blöcke historisch unverändert
- [x] Nachweis: `git status --porcelain` des realen Ist-Baums nach Gate-Lauf unverändert (G-8), `raw/` unverändert
**Acceptance Criteria:**
- Given einen sauberen Checkout, when das repositoryweite Epic-3-Gate ausgeführt wird, then führt ein Kommando alle Epic-3-Szenarien fail-fast aus; fehlgeschlagene Assertions, übersprungene Szenarien, fehlende Abhängigkeiten und Kindprozessfehler ergeben einen Non-Zero-Exit (AC-1).
- Given macOS/BSD- und Linux/GNU-Userland, when das Gate läuft, then ist es ohne plattformspezifisches `sed -i` reproduzierbar, arbeitet ausschließlich in temporären Repositories und hinterlässt `git status --porcelain` unverändert (AC-2).
- Given positive und negative OKF-Fixtures, when validiert wird, then wird der vollständige Vertrag aus `schema/validator.md` über alle `wiki/`-Dateien ausgeführt; unter anderem fehlendes `generated.by`, kalenderinvalides `generated.at`, unzulässige Source-Pfade und gebrochene Index-Links verhindern SUCCESS und Commit (AC-3).
- Given der autorisierte Validator-Vertrag oder seine ausführbare Aufrufbarkeit weist dabei ein Defizit auf, when das Gate es erkennt, then bleibt Story 3.13 offen und benennt den Bedarf für eine separat autorisierte Epic-1-Remediation; Story 3.13 darf die Schema-Semantik nicht still ändern, verantwortet aber die Integration und vollständige Ausführung des bestehenden Vertrags (AC-4).
- Given eine repräsentative committete Fixture, when ein frischer Agent-Kontext die kanonische Instruktion `schema/compiler.md` ausführt, then darf der Harness nach dem Setup weder erwartete Wiki-Bodies noch Lease-, Log- oder Git-Ausgänge selbst schreiben (AC-5).
- Given diese Fixture, when der Compilation Run endet, then demonstriert er Update eines bestehenden Concepts, Anlage einer neuen Wissenseinheit, kohärente Multi-Source-Synthese, vollständige Multi-Evidenz-Provenienz, Source-Immutabilität und byte-identische Erhaltung unabhängigen Wissens (AC-6).
- Given dasselbe kanonische Eingabemanifest, when zwei frische Agent-Kontexte in getrennt aufgebauten Worktrees laufen, then stimmen Run-Receipts und Bundle-State gemäß Story 3.8 überein; eine perturbierte Entscheidung oder Ausgabe wird erkannt (AC-7).
- Given nur das erzeugte Knowledge Bundle ohne Planungsartefakte, when ein unabhängiger Consumer im Epic-5-Abhängigkeits-Smoke-Test vordefinierte Wissensfragen beantwortet, then benötigt er weder Product Brief, SPEC, Architecture Spine noch Story-Historie zum semantischen Verständnis; solche Referenzen sind höchstens optionale Provenienz/Traceability (AC-8).
- Given ein bestandenes Gate, when die Status-Synchronisation läuft, then wird der Key `3-13-…` auf `done` geflippt und Epic 3 erst nach bestandenem Gate und `done` aller Stories 3.8..3.13 auf `done` gesetzt; bis dahin bleibt Epic 3 `in-progress` (AC-9).
### Review Findings
_Review-Loop 1 (bmad-code-review, 4 Layer — blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor, 2026-08-22; Diff `c234fc3..894ae34`+working tree; 28 eindeutige Befunde nach Dedup aus 43 rohen: 7 decision-needed / 15 patch / 2 defer / 6 dismissed. Hinweis: der Verification-Gap-Layer lieferte nach einem transienten API-Output-Limit-Fehler über einen Größenbegrenzten Retry)._
**Decision-Needed (7):**
- [x] [Review][Decision] **D-3.13-1: Agent-Prompt hard-codiert erwartete Plan-/Entscheidungs-/Receipt-/Log-Literale**`AGENT_PROMPT` (E.3) diktiert beide frischen Kontexte auf `candidates: alpha`, `decision: form=konsolidieren;zelle=UPDATE;ziel=alpha`, `sources_added: raw/alpha-v2.md`, die exakte Multi-Beleg-Ergebnisform und die wörtliche `log.md`-Zeile (inkl. `<volles-SHA>`). Verletzt den gefrorenen Boundary „hard-codiert keinerlei erwartete Bodies/Receipts" (AC-4/AC-5, epic-3-context Z. 46; compiler.md §5.14 Pkt. 2: „weder erwartete Pläne noch Concept-Bodies werden im Test hart codiert") und widerspricht dem eigenen deferred-work-„Aufgegriffen"-Block, der die DET-1/DET-2- und R-9-Defer (Plan-/Receipt-Literale) als durch diesen Lauf geschlossen markiert. A==B-Konvergenz ist dadurch prompt-gesteuert, nicht unabhängig aus `schema/compiler.md` abgeleitet. Options: (1) Prompt auf Instruktion + Fixture-Fakten beschränken, erwartete Formen/Receipts/Log-Zeile entfernen, Gate-Checks auf A-vs-B + Nicht-Vakuum-Witness gegen Baseline reduzieren (wahrer 3.8-Nachweis); (2) Literalen als „repräsentative Fixture-Vorgabe" dokumentieren und Spec/deferred-work-Klammern nachverhandeln (frisiert die AC-5-Präzedenz).
- [x] [Review][Decision] **D-3.13-2: AC-7-Hälfte „Run-Receipts … überein" wird nie verglichen** — Das Gate vergleicht nur den Bundle-State (`git diff HEAD_A HEAD_B -- wiki/` + sha256 je Datei); `run-receipt.txt` wird von den Agenten geschrieben, aber nie gelesen, gegreppt, gehasht oder A-vs-B-anglichen (grep: nur Prompt-/Kommentar-Treffer). AC-7 + §5.14 Pkt. 2 nennen den Receipt als „von außen vergleichbaren Nachweis je Lauf". Options: (1) Receipt-Vergleich implementieren (A vs B zeilenweise, keine erwarteten Literale — mit D-3.13-1-Option 1 konsistent); (2) AC-7-Auslegung als „nur Bundle-State" dokumentieren (braucht Intent-Nachverhandlung).
- [x] [Review][Decision] **D-3.13-3: G-6-Negativ-Kontrolle routet keinen perturbed Run** — Die I/O-Matrix-Zeile PERTURBIERTE_ENTSCHEIDUNG (frozen) verlangt: „eine der zwei Runs wird im Script über eine perturbed Option geroutet". Implementiert ist: `git archive` des committeden A-`alpha.md` in eine Scratch-Datei, `sed`-Worttausch, at-normalisierter sha256sum-Vergleich gegen B. Das prüft den Hash-Vergleich, aber weder das E.4-Line-Classifier-Prädikat (das tatsächlich G-1 abwartet) noch einen echten gelaufenen Run. Options: (1) Echten perturbed-Drittrun (3. Agent mit perturbed Option; A-vs-C-Classifier MUSS `NON_AT`≠0 flaggen) — teuer (~45 min Agent-Lauf); (2) Perturbed-Commit-Tree in einer wt-Kopie committen + denselben E.4-Diff-Classifier darüber fahren (MUSS `NON_AT`≠0) — deterministisch, ohne 3. Agent; (3) Ist-Lösung als „Prädikat-Negativ-Kontrolle" akzeptieren + I/O-Matrix-Zeile nachverhandeln.
- [x] [Review][Decision] **D-3.13-4: G-7-Smoke ist enger als die frozen I/O-Matrix CONSUMER_SMOKE** — Matrix-Zeile: „Referenz auf PRD/Spec/Spine = Non-Zero"; AC-8: „benötigt er weder Product Brief, SPEC, Architecture Spine noch Story-Historie". Implementiert ist nur `grep '\]\(\.\./(schema|adapters)/'` plus Exclusion `wiki/index.md`+`wiki/log.md`. Prosa-Referenzen auf PRD/Spine/Story-History in Concept-Bodies oder Links auf andere Nicht-Bundle-Pfade (z. B. `../../planning-artifacts/…`) passieren. Options: (1) G-7 auf Matrix-Formulierung erweitern (Token-/Link-Prüfung auf PRD/Spec/Spine/Brief/Story-History in allen nicht-exkludierten wiki-Dateien); (2) Enge Grep-Form als hinreichend dokumentieren (Intent-Nachverhandlung).
- [x] [Review][Decision] **D-3.13-5: AC-3-Negativ-Fixture-Hälfte wird nie ausgeführt** — AC-3: „fehlendes `generated.by`, kalenderinvalides `generated.at`, unzulässige Source-Pfade und gebrochene Index-Links verhindern SUCCESS und Commit". Abschnitt D validiert nur das real-grüne Bundle (7/7 SUCCESS); keine Negativ-Fixture (validator.md §7-Katalog: 4a `resolved=`, Innen-Ebenen `role:`, 11a unlinked Area, EC-3-Kalender) wird dem frischen Validator-Agenten vorgelegt. Options: (1) Mini-Baum mit 23 §7-Negativ-Fixtures in einen separaten /tmp-Käfig bauen, frischen Validator-Agenten darauf fahren, MUST `FAIL <Punkt>`-Verdikte erwarten; (2) Negativ-Hälfte als von Epic-1-Zertifizierungen (log.md-Rev-9-Nachweis) gedeckt akzeptieren + AC-3-Auslegung dokumentieren.
- [x] [Review][Decision] **D-3.13-6: AC-6-Fixture demonstriert keine „Anlage einer neuen Wissenseinheit"** — AC-6 verlangt sechs Demonstrationen, inkl. „Anlage einer neuen Wissenseinheit" und „kohärente Multi-Source-Synthese". Die Fixture ist ein rein CONFIRMING-Update auf das bestehende `alpha` (Prompt verbietet neue Concepts, §5.9 Pkt. 3); `gamma`/`index` bleiben byte-identisch. „Multi-Source-Synthese" reduziert sich auf einen Multi-Beleg-Anker an einer bestehenden Aussage. Anlage/Multi-Source-Synthese laufen nur als Sub-Runs sandbox-3-3/3-4 (eigene Isolation, nicht im Acceptance-Fixture-Run). Options: (1) Fixture um einen CREATE-Kandidaten + echten Multi-Source-Synthese-Baustein erweitern (größere Fixture, längere Agent-Läufe, komplexere A/B-Witness); (2) AC-6-Auslegung: „repräsentative Fixture" deckt Update-+Erhaltungs-Kern, CREATE/Synthese gelten über die 12 Sub-Runs als demostriert (Spec-Notiz, kein Code-Change).
- [x] [Review][Decision] **D-3.13-7: Status-Flip `done` geht dem konvergierten Review voran**`sprint-status.yaml`-Key 3-13 ist seit Commit 6624e07 `done` + Spec-Frontmatter `status: done` (Commit 894ae34, während dieses Reviews angelegt), während `review_loop_iteration: 0` und dieses Review-Loop-1 noch offen ist. Präzedenz 3.73.12: „der finale `done`-Flip ist der Step-05-Status-Sync nach konvergiertem Review-Loop". Spec-Code-Map bestätigt: Sprint-Status „mutiert nach Gate-Freigabe (Step-05)". Options: (1) Flip auf `in-progress` zurücknehmen, erst nach konvergiertem Loop final `done` (Präzedenz-konform); (2) Ist-Lage akzeptieren, Loop-Nachschärfung im `done`-Eintrag dokumentieren.
**Patch (15):**
- [x] [Review][Patch] **P-1: sandbox-3-1-Sub-Run ist No-Op-Verifier — AC-1/G-4-Green-Claim lügt für Suite 3.1**`sandbox-3-1/run-sandbox.sh` hat 0 `exit 1`/`fail()`-Aufrufe (alle 6 Szenarien drucken nur `--- Erwartet: …` + Ist-Ausgabe, impliziter Exit 0); 3-2..3-12 haben harte Exit-Pfade. Das Gate (Abschnitt C) beobachtet nur den Child-Exit-Code → eine Regression in den 3.1-Datenfluss-Szenarien (S1S6) ist dem Gate unsichtbar; G-4 „12 Sandbox-Sub-Runs alle Exit 0" ist für n=1 vakuum. [sandbox-3-13/run-sandbox.sh:193-196]
- [x] [Review][Patch] **P-2: E.4-Classifier `*"at: "*` ist substring-breit** — Jede Diff-Zeile, die das Substring `at: ` enthält (z. B. Body-Zeilen mit „…dat: "), zählt als erlaubte at-Ausnahme; echte Content-Divergenz unter dieser Maske bleibt unsichtbar. Schärfe auf ankerierte at-Feld-Zeilen (Frontmatter `^ at: `), konsistent mit E.6/G-6. [sandbox-3-13/run-sandbox.sh:531-532]
- [x] [Review][Patch] **P-3: AC-2-Portabilität gebrochen**`[ -n "${CLAUDE_BIN:-}" ] || CLAUDE_BIN="/d/Apps/nodejs/claude.cmd"` (MSYS-Pfad + `.cmd`), `cygpath -w`-Aufrufe, GNU-`timeout 900/1500/2700` (stock macOS/BSD: nicht vorhanden), GNU-`sha256sum` (BSD: `shasum -a 256`). Auf stock macOS scheitert das Gate vor der ersten Assertion. Options im Patch: Plattform-Feature-Checks (Kommandopresenz mit klaren Fehlern) + portablen Hash-Fallback + CLAUDE_BIN als Pflicht-Env (oder PATH-`claude`) statt hartem Default. [sandbox-3-13/run-sandbox.sh:227,237,248,299,306,451,514,556-558]
- [x] [Review][Patch] **P-4: E-Fixture ist nicht isoliert — echtes wiki//raw/-Overlay bleibt in `$BASE`** — B kopiert den vollen echten `wiki/` (7 Dateien) und `raw/` (prd/, epics/, architecture-spine/, assets/) in den Käfig; E.1 überlagert nur 4 wiki- + 3 raw-Dateien ohne Löschen des Rests, `git add -A` committet alles. `$BASE` ist damit kein dokumentiertes „Mini-Bundle" (Design Notes), der Prompt-Welt-Claim „enthält: …" (E.3) ist für beide Worktrees falsch, und die verwaisten echten Concepts sind aus der Fixture-Index nicht erreichbar (ein §6-validierender Agent würde Punkt-11-Verstoß melden). [sandbox-3-13/run-sandbox.sh:153-162,325-375]
- [x] [Review][Patch] **P-5: Kein Cage-Cleanliness-Check zwischen D und E** — Nach dem Validator-Agent (Write-enabled, Ausgabe-Pfad absolut außerhalb CWD) fehlt ein `git -C $CAGE status --porcelain`-Check; E.1 `git add -A` würde eine fremde Datei, die der Agent im Käfig hinterließ, still in `$BASE` committen und beide A/B-Runs kontaminieren, ohne Gate-Signal. [sandbox-3-13/run-sandbox.sh:255-296]
- [x] [Review][Patch] **P-6: „genau ein Verdikt je Datei" wird nicht erzwungen; Summe nie mit Dateizahl abgeglichen** — Exhaustivitäts-Loop nutzt `grep -qE` (Mindestens-1); duplizierte/konfligierende Verdikt-Zeilen für denselben Pfad passieren; `VERDICT_LINES`/`SUCCESS_VERDICTS` werden nur ausgegeben, nie mit `WIKI_MD_COUNT` verglichen — der Pass-Text-Claim „genau ein Verdikt je Datei" (und das abgeleitete „7/7 SUCCESS") ist damit überzeichnet. [sandbox-3-13/run-sandbox.sh:285-302]
- [x] [Review][Patch] **P-7: G-5/AC-4-Defizit-Route ist vakuüm + Remediation-Text nie emittiert** — Bei Defizit bricht D hart ab, ohne den geforderten Text „Bedarf einer separat autorisierten Epic-1-Remediation" zu benennen; F erreicht G-5 nur im grünen Zustand, wo es bedingungslos `pass`-t. Boundary (frozen) verlangt: „erkennt das Gate ein Validator-Defizit, schlägt G-5 fehl (Non-Zero) … benennt den Bedarf". (Zusätzlich: frozen I/O-Matrix-Zeile VALIDATOR_DEFIZIT sagt „G-5 PASS" — offenbar Tippfehler gegen Boundary/AC-4; im Patch mitnachführen, frozen-Block nur nach menschlicher Bestätigung.) [sandbox-3-13/run-sandbox.sh:277,296,633-638]
- [x] [Review][Patch] **P-8: Protokoll-Marker `VALIDATOR_DONE`/`RUN_DONE <name>` nie verifiziert** — Beide Prompts verlangen exakte Abschluss-Marker, das Gate greift die `.out`-Dateien nur im Fehlschlagsfall tail; ein Agent ohne Marker passiert trotzdem. [sandbox-3-13/run-sandbox.sh:244,306,432,451]
- [x] [Review][Patch] **P-9: Präskriptiver kanonischer `log.md`-Eintrag wird nie gegen den Run-Endzustand geprüft** — E.4 vergleicht nur A-vs-B, E.5/E.7 lesen nur `alpha.md`, E.8 pinnt `index.md`/`gamma.md`; eine Verletzung der §5-Log-Pflicht (fehlender Eintrag, ` --`-Form) ist A==B-konsistent möglich und passiert (Kultur-Vergleich: sandbox-3-4 prüft Wortlaut hart). [sandbox-3-13/run-sandbox.sh:512-540,560-571,599-609]
- [x] [Review][Patch] **P-10: AC-6 „Source-Immutabilität" fehlt als Assertion in E** — Nach beiden Agent-Läufen wird nie geprüft, dass `raw/` in wt-a/wt-b byte-identisch zu `$BASE` ist (Agenten haben Edit-Tool; Prompt-Verbot ist keine Assertion). [sandbox-3-13/run-sandbox.sh:512-609]
- [x] [Review][Patch] **P-11: G-8-Invariante mit `--untracked-files=no` + ohne Negativ-Kontrolle** — Der Spec-Wortlaut sagt „`git status --porcelain` leer" (inkl. Untracked); beide Checks (A Pre-Check + G End) exkludieren Untracked → eine im Repo abgelegte Gate-Datei passiert. Kein Negativ-Test (Kultur: 3-11/3-12 üben Guards negativ). [sandbox-3-13/run-sandbox.sh:107,717-757]
- [x] [Review][Patch] **P-12: log.md-Evidenz fehl-labelliert; `$BASE`-SHA nicht reproduzierbar** — Die „(20/27/40/51/60/68 PASS)"-Zahlen sind kumulative `PASS_COUNT`-Schnappschüsse, nicht pro-Sektion-Zählungen; `$BASE=5024d751…` ist ein /tmp-Commit (Zeitstempel-abhängig, nicht re-ableitbar). Beleg-Formulierungen an die tatsächliche Semantik ausrichten (kumulative Zählung deklarieren; SHA als Lauf-Beleg ohne Re-Derivations-Claim). (Reconciliation: `PASS_COUNT=70` selbst stimmt exakt mit dem aktuellen Skript.) [wiki/log.md Story-3.13-Eintrag]
- [x] [Review][Patch] **P-13: G-7 greift den /tmp-Käfig-Spiegel statt des Ist-Baums** — Nach `cd "$CAGE"` verbleibt die CWD im Käfig; der G-7-Loop liest `$f` relativ dazu → der Spiegel, nicht der reale Baum (heute äquivalent, da Spiegel aus dem Ist-Baum gebaut; bei Divergenz prüft der Smoke den falschen Baum; fehlende Datei → `grep` Exit 2 → still „keine Verletzung"). Relativ `$REPO_ROOT` greifen. [sandbox-3-13/run-sandbox.sh:166,686-700]
- [x] [Review][Patch] **P-14: Toter Code + fehlendes Cleanup**`cmd_or_fail()` (definiert, nie aufgerufen), Restkommentar `$*`/`"$@"`/SC2034, `fail()`/`FAILED` (nie inkrementiert → `RUN_FAILED`-Zweig unerreichbar), `C_FAILED` (fail-fast-Exit vor Guard), doppelte Porcelain-Lesung `G8_PORCELAIN`+`G8_TRAIL`, kein `trap`/Cleanup für `$ROOT` (wächst je Lauf). [sandbox-3-13/run-sandbox.sh:52-61,193-207,717-746,765-771]
- [x] [Review][Patch] **P-15: Spec-Design-Notes-Beispiel invalid + ≠leer-Pin widerspricht Implementierung**`git diff --stat "$ROOT/wt-a" "$ROOT/wt-b" -- wiki/` vergleicht Verzeichnis-Pfade (kein tree-ish → schlägt fehl); der gepinnte Kommentar „≠ leer (nicht-vakuum)" widerspricht der implementierten Allowance-leerer-Diff + Witness-Nicht-Vakuum. Beispiel auf `HEAD_A/HEAD_B`-Form korrigieren + Pin-Wortlaut an Implementierung angleichen (Design Notes sind editierbar; der frozen-Block oben bleibt unangetastet). [spec-3-13-epic-3-verifikations-und-abnahmegate.md:Design Notes]
**Defer (2):**
- [x] [Review][Defer] **W-1: Timeout-Budgets (2700 s) an der Grenze zu beobachteten Agent-Laufzeiten** [sandbox-3-13/run-sandbox.sh:451-453] — deferred, pre-existing: Laufzeit-Variation ist Modell-/Token-Latenz (Skript-Kommentar dokumentiert A:~30 min, B: >35 min); kein deterministischer Defekt, A0-20-konform; Beobachtung für spätere Sandbox-Härtung.
- [x] [Review][Defer] **W-2: `PASS_COUNT` driftet bei Bundle-/Referenzwachstum** [sandbox-3-13/run-sandbox.sh:42-109,184-196,285-288] — deferred, pre-existing: Loop-basierte Zählung (12 Referenz-Sandboxen + 7 Wiki-Dateien) ist design-immanent driftanfällig; Beleg-Zahl ist Lauf-Momentaufnahme (P-12 klärt die Label-Form); keine Gate-Semantik-Folge.
_Dismissed (6): G-6-„Hash-Primitive"-Beobachtung (Duplikat von D-3.13-3/P-2); „E.5/E.7-Witness stärker als reiner A/B-Vergleich" (unter D-3.13-1 subsumiert); „Status-Dokumente stützen sich auf geschwächte Assertions" (Konsequenz, kein eigener Befund); „$BASE-SHA nicht reproduzierbar / PASS_COUNT-Drift" (Duplikat von P-12/W-2, Reconciliation: 70 stimmt exakt mit dem aktuellen Skript); „review_loop_iteration: 0" (unter D-3.13-7 subsumiert); „12 Suiten alle hart"-Claim (Duplikat von P-1)._
### Review Findings — Review-Loop 2 (2026-08-24)
_Review-Loop 2 (bmad-code-review, 4 Layer — blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor, 2026-08-24; Diff `50f3628..HEAD` + working tree: E.6-Härtung 77fd460, P-18 65dfc26, P-19 cccc0a3, Status-Sync-Docs; 38 rohe Befunde → nach Dedup (gleicher Claim + gleiche Aktion) und Code-Verifikation: **4 decision-needed / 11 patch / 2 defer / 4 dismissed**.)_
**Decision-Needed (4):**
- [x] [Review][Decision] **D-3.13-L2-1 (RESOLVED — Defer + Bearer-Fix, Nutzer-Option 1): compiler.md Rev-3.8-Unterpinnung — B2-Reihenfolge-Pin fehlt, §8-Überreich, Bearer-Claim falsch** [schema/compiler.md §5.9/§8 + compiler-revision-3-8-bearer] — (a) §5.9 pinnt die Log-Eintragsform, aber **nicht** die Reihenfolge *innerhalb* einer `## YYYY-MM-DD`-Datumsgruppe (B2-Hälfte „Reihenfolge-pinnen" von Rev 3.8 nie in compiler.md gelandet; grep 0 Treffer „Innerhalb einer Datumsgruppe"/Tie-Break); (b) §8-Rev-3.8-Claim „jeder Eintrag byte-deterministisch ableitbar" + „Sub-Runs 3-3/3-4 demonstrieren" ist **überreich** (Disagreement-Form unpinnt; nur 2/3 Formen live demonstriert, bare `- Anlage:` nach CREATE-Entfernung ohne Live-Beleg); (c) Bearer-Doc §0.1 „B2 ✅ ANGEWENDET … = genau so wie im Entwurf" ist für die **Reihenfolge-Hälfte falsch** (nur Form-/Wanduhr-Hälfte angewendet). Latent (3× grün bis E.6, noch nie rot); Bearer-Falschheit = echter Doku-Defekt. compiler.md ist READ-ONLY (AC-4). Options: (1) autorisierte **Rev 3.9** (Reihenfolge-Pin + §8-Korrektur + Bearer-Fix); (2) **deferen** (Lücke benennen) + Bearer-Doc-Claim als Doku-Korrektur richten (erlaubt, kein compiler.md-Change).
- [x] [Review][Decision] **D-3.13-L2-2 (RESOLVED — Defer + Gate-Seite dokumentiert, Nutzer-Option 1): log.md `## YYYY-MM-DD`-Datumsgruppen-Header = Wanduhr, außerhalb der at-Ausnahme** [schema/compiler.md §5.9/§5.14 Pkt. 3 + run-sandbox.sh E.4] — Die Datumsgruppen-Header sind Wanduhr-Werte, aber §5.14 Pkt. 3 nennt **nur** `generated.at`/`verified[].at` als Ausnahmefelder. Ein A/B-Paar, das Mitternacht überschneidet, erzeugt deterministisch einen **NON_AT-rot** an E.4 (falsch-rot; der geankerte Classifier maskiert den Header korrekt NICHT). Noch nicht beobachtet (Läufe same-day). Options: (1) Header an **Baseline-Commit-Date** koppeln (compiler.md-Change); (2) als **benannte Ausnahmeklasse** zu §5.14 Pkt. 3 aufnehmen (compiler.md-Change); (3) deferen + Gate-Seite dokumentiert behandeln.
- [x] [Review][Decision] **D-3.13-L2-3 (RESOLVED — Defer + Substitutions-Notiz, Nutzer-Option 1): AC-6 CREATE/Synthese — kein frischer-LLM-Lauf, Substitution unbewiesen, Residual nie deferred** [run-sandbox.sh E.1 + AC-6] — AC-6 verlangt „Anlage einer neuen Wissenseinheit" + „kohärente Multi-Source-Synthese". Die A/B-Fixture ist **UPDATE-only** (keine CREATE); CREATE/Synthese gilt „über Sub-Runs 3-3/3-4 als demostriert" (Loop-1 D-3.13-6 Option 2) — aber 3-3/3-4 sind **mechanisch gepinnte Subshells ohne frischen LLM**, und diese Substitution (mechanisch ≙ frischer-LLM) wird selbst **nie behauptet/geprüft**; das CREATE-Residual steht **nicht** in deferred-work.md. Re-Run #5 belegte: frischer-LLM-CREATE ist **nicht-deterministisch** (24/26 NON_AT) → ein frischer-LLM-CREATE-Run würde das Gate **rot** machen (ohne compiler.md-CREATE-Pinning). Options: (1) frischer-LLM-CREATE-Residual **deferen** + Substitutions-Validität als Doku-Notiz **asserten** (empfohlen); (2) dedizierten frischer-LLM-Struktur-CREATE-Run ins Gate (würde ohne Rev rot).
- [x] [Review][Decision] **D-3.13-L2-4 (RESOLVED — dokumentierte Abweichung annotiert, Nutzer-Option 1): frozen Approach-Zeile „greift nie auf den Ist-Baum zu" (spec L24) vs. G-7/P-13 Ist-Baum-Read** [spec-3-13 L24, frozen-Block L12-51] — G-7 liest **relativ `$REPO_ROOT`** den realen Ist-Baum (read-only, AC-8-Consumer-Smoke; P-13) → die frozen-Zeile ist **literal falsch**. Intent: „nie mutiert/schreibt in den Ist-Baum" (G-8-Porcelain). frozen-Block ändert nur mit Bestätigung. Options: (1) als **dokumentierte Abweichung annotieren** (frozen-Zeile unangetastet, Change-Log-Notiz: G-7-Read ist die intendierte AC-8-Smoke, read-only) — empfohlen; (2) frozen-Zeile **renegotieren** (menschliche Bestätigung).
**Patch (11):**
- [x] [Review][Patch] **P-L2-1 (HIGH, ANGEWENDET): E.6 kennt den korrekten Wert nie — nur A==B** [run-sandbox.sh:715-735] — E.6 prüft `baseline`/`candidates`/`sources_added` nur auf **A==B**. Ein **konsistent-falscher** Wert (beide Läufe liefern dasselbe Falsche) — exakt die **Re-Run-#8-Klasse** — passiert. Known-Value-Witness fehlt (widerspricht dem Loop-1-D-2-„Nicht-Vakuum-Witness gegen Baseline"). Fix: `baseline == $BASE` (E.2-bekannt, reine Funktion — bulletproof) + `sources_added ==` der Fixture-ableitbarer erwarteter Wert (UPDATE-only-Fixture: `raw/alpha-v2.md`, der einzige neue Zuwachs, den ein korrekter CONFIRMING-Run in `alpha.sources` aufnehmen MUSS). **Verhaltensändernd → Gate-Re-Run nötig.**
- [x] [Review][Patch] **P-L2-2 (MED, ANGEWENDET): E.6 validiert weder Feldsatz noch Zeilenzahl** [run-sandbox.sh:709-713] — `receipt_field` (sed `^$2:`) liefert bei **falschem Feldnamen/fehlendem Feld** leer → A==B beide leer → **passt still**. Eine fehlgeformte Receipt (falsche Feldnamen) passiert als „beide leer". Fix: prüfen, dass die Receipt **exakt** die 4 erwarteten Feldzeilen (baseline/candidates/decision/sources_added) trägt, keine Unexpected-Felder. **Verhaltensändernd → Gate-Re-Run nötig.**
- [x] [Review][Patch] **P-L2-3 (ANGEWENDET): `candidates`-Serialisierung unpinnt** [run-sandbox.sh:563] — Prompt sagt „kommagetrennt, oder leer" aber pinnt weder Sortierung noch Trenn-Format (`alpha,gamma` vs `alpha, gamma` vs Reihenfolge) → latent flaky (A==B fängt nur Divergenz). Fix: Serialisierung pinnen (lexikografisch, kein Leerzeichen nach Komma, oder leer) — konsistent mit `sources_added`. **Verhaltensändernd (Prompt) → Gate-Re-Run nötig.**
- [x] [Review][Patch] **P-L2-4 (ANGEWENDET): AGENT_PROMPT „compiler.md NICHT definiert" faktisch untergraben** [run-sandbox.sh:561] — compiler.md §5.14 Pkt. 2 definiert den **Run-Receipt-KONZEPT** (15 Treffer „Run-Receipt" inkl. „Entscheidungen"); nur lowercase `receipt` = 0. Die Aussage „die schema/compiler.md NICHT definiert" ist in ihrer starken Form unzutreffend. Fix: „definiert den Run-Receipt-Konzept (§5.14 Pkt. 2) aber nicht die konkrete `run-receipt.txt`-Datei/4-Felder-Form". **Verhaltensändernd (Prompt-Text) → Gate-Re-Run nötig.** (Parallel: Doku-Korrektur in deferred-work D-3.13-R6-1 + Spec-Change-Log #6/#7/#8, s. P-L2-10.)
- [x] [Review][Patch] **P-L2-5 (ANGEWENDET): P-16-Floor-Vergleich oktaler bei führenden Nullen** [run-sandbox.sh:136] — `[ "$_cur_tokens" -lt "$TOKEN_FLOOR" ]` interpretiert führende Nullen **oktal** (`016000` → 14336) → falsche Floor-Entscheidung. Fix: dezimal erzwungen (`$((10#$_cur_tokens))`). **Nicht verhaltensändernd im Normalfall (Env-Werte ohne führende Null); `bash -n` + Logik-Check genügt.**
- [x] [Review][Patch] **P-L2-6 (ANGEWENDET): E.9 greift nacktes `$BASE`-Substring statt Kanon-Form** [run-sandbox.sh:783] — `grep -q "$BASE"` matcht das SHA auch außerhalb der kanonischen `Baseline <volles-SHA>`-Form. Fix: `grep -q "Baseline $BASE"` (Rev-3.8-Kanon-Form). **Verhaltensändernd (Assertion) → Gate-Re-Run nötig.**
- [x] [Review][Patch] **P-L2-7 (ANGEWENDET): A.2-Pass-Meldung ungenau** [run-sandbox.sh:148] — Loop prüft **5** Referenzen (compiler/validator/wiki-compiler/canonical-terms/adapters-README), Meldung sagt „(compiler/validator/adapters)". Fix: Meldung an die 5 ausrichten. **Kosmetisch; `bash -n` genügt.**
- [x] [Review][Patch] **P-L2-8 (ANGEWENDET): D-NEG.3-Label stale** [run-sandbox.sh:449-450] — „neg-2 (ohne okf_version)" — die Fixtur trägt `okf_version` **in einer Concept-Datei** (= außerhalb Bundleroot, Punkt 9), nicht „ohne". Fix: Label auf „okf_version außerhalb Bundleroot (Punkt 9)" korrigieren. **Kosmetisch; `bash -n` genügt.**
- [x] [Review][Patch] **P-L2-9 (ANGEWENDET): Spec-Change-Log #6 überzeichnet E.7E.9 „grün"** [spec-3-13 Change-Log] — Re-Run #6 brach an **E.6** ab → E.7/E.8/E.9 wurden **nicht** erreicht; der #6-Eintrag behauptet sie „grün". Fix: Wortung korrigieren (E.7E.9 „nicht erreicht" wegen E.6-Abbruch).
- [x] [Review][Patch] **P-L2-10 (ANGEWENDET): Spec-Change-Log #7/#8 + deferred-work: Heading-/Wortungs-Fehler + „0 Treffer receipt"-Case-Artefakt** [spec-3-13 Change-Log #7/#8 + deferred-work D-3.13-R6-1] — (a) #8 „Erstmals erreicht und grün" unzutreffend (C 12/12, D, E.1E.5 waren in #5/#6/#7 schon grün); (b) #8 „5/5 Receipts" Arithmetik ungenau (5 von 6 Läufen, die E.6 erreichten, lieferten Receipts; #7 B fehlte); (c) #7/#8 doppelte/falsche Headings; (d) der „0 Treffer 'receipt'"-Beleg in deferred-work D-3.13-R6-1 + #6/#7/#8 ist ein **Case-Sensitivity-Artefakt** (15 „Run-Receipt" vs 0 lowercase). Fix: alle Wortungen korrigieren.
- [x] [Review][Patch] **P-L2-11 (ANGEWENDET): Spec-Verification „kein Source-/Schema-Diff" + geticktes „compiler.md read-only (kein Diff)" post-Rev-3.8 falsch** [spec-3-13 Verification + Task] — Rev 3.8 **wurde** autorisiert und angewendet (compiler.md geändert) → „kein Schema-Diff" und der getickte read-only-Task-Claim sind **literal falsch**. Fix: an die autorisierte Rev 3.8 ausrichten (Doku; frozen-Block unangetastet).
**Defer (2):**
- [x] [Review][Defer] **W-L2-1: D-NEG-FAIL-Wurzel nicht gegen beabsichtigten Punkt verifiziert** [run-sandbox.sh:445-452] — deferred: AC-3-Negativ-Hälfte ist demonstrated (3×FAIL je Neg-Fixtur + 1×SUCCESS Positiv-Kontrolle); die exakte **Punkt-Root** des FAIL ist **freier Validator-Text** — eine Punkt-Exakt-Match-Assertion wäre **fragil** (falsch-rot-Risiko); der Differenz-Nachweis (pos-SUCCESS vs neg-FAIL) + Validator-Determinismus genügt für die Abnahme. Hartungs-Kandidat für spätere Sandbox-Härtung.
- [x] [Review][Defer] **W-L2-2: E.6 `decision`-Präsenz-Check (nicht-leer) = beabsichtigtes Scope** [run-sandbox.sh:727-731] — deferred: `decision` ist **freie Prosa** (Befund-Äquivalenz, Loop-1 D-2 / Re-Run-#6-Klassifizierung) — ein Stärker-Check (min. Länge / Concept-Referenz) wäre **Over-Pin** (Re-Run-#6-Klasse) und riskiert falsch-rot; „nicht-leer" ist das beabsichtigte Scope. Kein Defekt.
_Dismissed (4): „Porcelain-Task-Tick stale" (BH-13) — **stale/falsch**: das gehärtete Gate erreichte in Re-Run #9 G-8 grün, der getickte Nachweis-Tick ist korrekt; „frozen VALIDATOR_DEFIZIT-Zeile = autorisierte Renegotiation" (AA-1) — Compliance-Notiz, die Zeile war der autorisierte Renegotiation-Kandidat, kein Defekt; „Validator-Scope-Verengung" (AA-7) — **bewusst** (P-4 isolierte Mini-Fixture), Intent; „kanonische Null-Quellen-Form undefined" (EC-3) + „Ist-Behaviour deckt nur 2/3 Formen" (BH-16) — unter D-3.13-L2-1 subsumiert._
## Spec Change Log
- **Review-Loop-2 (bmad-code-review, 4 Layer, 2026-08-24; Diff `50f3628..HEAD` + working tree) — 38 rohe → 4 decision-needed / 11 patch / 2 defer / 4 dismissed; alle Patches angewendet, alle Entscheidungen mit ProMods geschlossen:** **Entscheidungen (alle empfohlene Option):** D-3.13-L2-1 = **Defer + Bearer-Fix** (B2-Reihenfolge-Pin „Reihenfolge der Log-Einträge innerHALB einer Datumsgruppe" nie in compiler.md gelandet — Bearer-Doc-Claim „= genau so wie im Entwurf" war für die Reihenfolge-Hälfte falsch; Lücke = offener Defer, Bearer-Doc korrigiert; latent, noch nie rot); D-3.13-L2-2 = **Defer** (log.md `## YYYY-MM-DD`-Datumsgruppen-Header = Wanduhr außerhalb der §5.14-Pkt.-3-`at`-Ausnahme; Mitternachts-überschneidender A/B-Lauf wäre deterministisch falsch-rot an E.4 — bekannt latente Risiko-Klasse, same-day-Läufe deterministisch, Gate-Seite dokumentiert); D-3.13-L2-3 = **Defer + Substitutions-Notiz** (AC-6 CREATE/Synthese: A/B-Fixture UPDATE-only; 3-3/3-4 sind mechanisch gepinnte Subshells **ohne frischen LLM** — die Substitution „mechanisch ≙ frischer LLM" wird hiermit explizit als **strukturelle Deckung** notiert (CREATE-/Synthese-*Mechanik* strukturell belegt), der frische-LLM-CREATE-Unterpfad bleibt **benanntes nicht-deterministisches Residual** (Re-Run-#5-Befund 24/26 NON_AT); Residual in deferred-work.md); D-3.13-L2-4 = **dokumentierte Abweichung annotieren** (frozen Approach-Zeile „greift nie auf den Ist-Baum zu" ist literal ungenau: G-7/P-13 liest den Ist-Baum **read-only** relativ `$REPO_ROOT` (AC-8-Consumer-Smoke); Intent = „nie mutiert/schreibt" (G-8-Porcelain); frozen-Block unangetastet, dies ist die annotierende Notiz). **Patches (alle 11 angewendet):** P-L2-1 (E.6 **Known-Value-Witness** gegen `$BASE`: `baseline == $BASE` + `sources_added == raw/alpha-v2.md` — A==B allein ließ einen konsistent-falschen Wert passieren, Re-Run-#8-Klasse), P-L2-2 (E.6 **Feldsatz-Prüfung**: exakt die 4 Feldzeilen, jede genau einmal, keine unzulässigen Zeilen — ein fehlender/falscher Feldname würde sonst „beide leer" A==B still passieren), P-L2-3 (`candidates`-Serialisierung gepinnt: kommagetrennt OHNE Leerzeichen, lexikografisch LC_ALL=C, oder leer), P-L2-4 (Prompt-Wortung: compiler.md definiert den Run-Receipt-**Konzepts** (§5.14 Pkt. 2, 15 Treffer „Run-Receipt" vs. 0 lowercase — „0 Treffer receipt" war Case-Sensitivity-Artefakt), nicht die 4-Felder-Dateiform; „keine weiteren Zeilen" hinzugefügt), P-L2-5 (P-16-Floor dezimal `$((10#…))` — führende Nullen wären oktal), P-L2-6 (E.9 greift Kanon-Form `Baseline $BASE` statt nacktem SHA-Substring), P-L2-7 (A.2-Meldung: 5 Referenzen), P-L2-8 (D-NEG.3-Label: „okf_version außerhalb Bundleroot (Punkt 9)"), P-L2-9 (#6-Eintrag: E.7E.9 „grün" → „nicht erreicht" (fail-fast an E.6)), P-L2-10 (#7/#8-Einträge: doppeltes/falsches Heading, „5/5 Receipts" → 5/6, „Erstmals erreicht und grün" → in #5/#6/#7 bereits grün, Case-Artefakt-Wortung), P-L2-11 (Verification „kein Schema-Diff" + geticktes read-only-Task: an autorisierte Rev 3.8 ausgerichtet). **Gate-Re-Run nötig** (P-L2-1/2/3/4/6 ändern E.6/E.9/Prompt) — finaler Bestätigungs-Re-Run nach diesem Eintrag. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md`; AD-3 read-only (compiler.md unverändert — L2-1..L2-3 sind **Defer**, keine compiler.md-Änderung); kein frozen-Block-Change; Story 3.13 bleibt **`in-progress`** bis Re-Run grün + Step-05-Status-Sync.
- **Re-Run #8-Befund: E.6-Feld-Dreideutigkeit (P-19) + P-18 bestätigt; C 12/12, D/D-NEG/E.1E.5 grün, A==B bis at** (2026-08-24): Vierter Voll-Lauf des gehärteten Gates (ausschließlich /tmp-Käfig, fail-fast). **Erreicht und grün (bereits in #5/#6/#7 grün; hier fortgeführt):** C **12/12** Sub-Runs (3.13.12, je `exit 0`), **D 4/4 SUCCESS** (frischer Validator: D.4 exakt-ein-Verdikt, D.6 0 FAIL über Käfig-Bundle), **D-NEG 3×FAIL + 1×SUCCESS** (neg-1 fehlendes `type`, neg-2 `okf_version` außerhalb Bundleroot, neg-3 `at: 2026-02-31`; Positiv-Kontrolle SUCCESS), **E.1E.5** (Fixture `$BASE=f396f8f5…`, Worktrees, beide Agent-Läufe `RUN_DONE`; **E.4 `NON_AT=0 AT=2`** — Rev 3.8 zum **dritten Mal** unter echten frischen LLMs bestätigt; E.5 Multi-Beleg-Witness `raw/alpha-v2.md#S-3` in A und B; E.7/E.8/E.9 nicht erreicht). **P-18 bestätigt:** beide Agent-Läufe lieferten den Run-Receipt (5/6 Agent-Läufe über #6#8 lieferten den Receipt — #7-B fehlte; die #7-„fehlt"-Klasse ist nach P-18 adhärent aufgelöst). **Rot an E.6 (dritte Befund-Klasse im selben Abschnitt):** (1) `sources_added` divergiert A/B (A leer, B `raw/alpha-v2.md`) — die Prompt-Wortung „neue raw/-Ressourcen oder leer" ist **dreideutig** (neue raw/-*Dateien* / neu *verbrauchte* Evidenz / neue Frontmatter-`sources:`-Listeneinträge); die drei Lesarten liefern unterschiedliche Werte → echte **Prompt-Definitionslücke** in einem Gate-als-deterministisch-erklärten Feld (kein Flake: A und B haben beide *einer* Lesart konsistent gefolgt); (2) `baseline` zeigt A==B `143f7faf…` (Phase-B-Käfig-Baseline „Käfig-Baseline") statt `f396f8f5…` (Worktree-Vor-Mutation-HEAD „Käfig-Fixture: Baseline inkl. Zuwachs") — der Prompt-Wortlaut „SHA des Baseline-Commits" ist objektiv mehrdeutig (zwei Commits mit „Baseline" in der Betreffzeile im Worktree-Log) und benennt nicht den Commit, auf dem der Run läuft. **P-19 (Gate-Prompt-Präzisierung, A-B-Optionen wie P-17/P-18):** `baseline` = `git rev-parse HEAD` des Worktree **vor der ersten Mutation**; `sources_added` = `resource:`-Werte (Pfad) der raw/-Ressourcen, die der Lauf der Frontmatter-`sources:`-Liste der mutierten Concepts **neu** gegenüber dem Vor-Mutation-Zustand hinzufügt, lexikografisch sortiert (beide Felder damit REINE FUNKTIONEN der Lauf-Eingaben — für die UPDATE-only-Fixture ergibt A und B jeweils `raw/alpha-v2.md`; die A==B-Identität ist über E.4 beweisbar, da die `sources:`-Liste Teil des byte-identischen Bundle-State ist); `decision` bleibt freie Prosa (Befund-Äquivalenz, Re-Run-#6-Klassifizierung). **E.6-Assertion UNVERÄNDERT** (A==B byte-identisch über die drei Felder + `decision` nicht-leer) — geändert ist die Feld-Semantik im Prompt, nicht der Check; kein AC-4-Fall (compiler.md definiert den Run-Receipt-Konzept, §5.14 Pkt. 2, aber nicht die konkrete 4-Felder-Dateiform; keine Schema-Semantik geändert), kein frozen-Block-Change, D-1/D-2/D-3.13-2-Option-1 respektiert. **Nächster Schritt:** Re-Run #9 (Erwartung: E.6 grün + F (G-1..G-8) + G (Porcelain) erstmals erreicht). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag); AD-3 read-only (`schema/validator.md`/`schema/wiki-compiler.md`/`schema/compiler.md`/`adapters/`/`raw/`/`schema/canonical-terms.md` unverändert); kein Standalone (D-3), keine neue §7-Invaliditätsklasse, keine Vertragsänderung; Epic-3-Abnahme (Story 3.13) bleibt offen (epic-3 in-progress).
- **Re-Run #7-Befund: fehlender Agent-B-Receipt (P-18: Prompt-Adhärenz-Härtung)** (2026-08-24): Re-Run #7 (Hintergrund, ~2,5 h) lief **grün bis E.6** — E.4 **erneut** GRÜN (`NON_AT=0 AT=2`, doppelte Bestätigung der Rev-3.8-Remediation unter echten frischen LLMs), C/D/D-NEG/E.5/E.7-Vorgaben grün — und brach an E.6 mit **neuer** Ursache: **`run-receipt.txt` B fehlt/leer** (Agent A lieferte den Receipt, Agent B nicht — B's wiki/-Mutationen waren vollständig, E.5-Witness grün, `RUN_DONE b` vorhanden → Agent B behandelte den Receipt als optional). **Gate-Verhalten korrekt** (fehlender Nachweis = kein stilles Grün, HARD-FAIL — die E.6-Härtung aus Re-Run #6 hat ihre Eigenschaft bewahrt: sie prüft nur, wenn der Receipt existiert). **Klassifikation: LLM-Prompt-Adhärenz-Flake, kein Gate-Logik-Fehler, kein Schema-Defizit** (3/4 Receipts in #6/#7 geschrieben). **Wurzelursache:** der Prompt hatte den Receipt „EXAKT nach den Konventionen von schema/compiler.md" zugeordnet — compiler.md definiert ihn aber **nicht** (0 Treffer „receipt") und der Prompt erklärt compiler.md zur **einzigen** normativen Instruktion → der Agent kann den Receipt als außerhalb-des-Vertrags/optional deuten (gleiche Klasse wie P-17 Prompt-Wortungs-Präzisierung). **Ausgeführte P-18-Härtung** (`run-sandbox.sh` AGENT_PROMPT, `bash -n` clean; **kein** compiler.md-/frozen-Block-Change; D-1-konform — exakte Feldstruktur ≠ erwartete Werte): der Receipt wird im Prompt als **expliziter, verpflichtender Gate-Reporting-Lieferant** von compiler.md **entkoppelt** („GATE-spezifische Berichtsdatei, die schema/compiler.md NICHT definiert"), beide Lieferungen (wiki/-Mutationen + run-receipt.txt) sind **PFLICHT**, `RUN_DONE` ist **erst nach** Vorliegen beider Lieferungen erlaubt; exakte 4-Feld-Form bleibt (Feldnamen exakt, Werte frei). **Nicht erreicht in #7** (fail-fast an E.6): F (G-1..G-8) + G (Porcelain). **Status:** Story 3.13 bleibt **`in-progress`**; Re-Run #8 (Erwartung: E.6 grün + F/G erstmals) vor dem finalen `done`-Flip + Review-Loop-2. **Stabilitäts-Beobachtung für #8:** falls Agent B erneut keinen Receipt liefert, ist das ein **systematischer** Prompt-Adhärenz-Defekt (kein Flake) und erfordert eine breitere Instruktion (z. B. Receipt-Generierung als nummerierte Pflicht-Schritt-Liste); ein einzelner Fehl-Lauf bleibt im Flake-Korridor (empirisch 75 % Adhärenz in 4 LLM-Runs).
**Re-Run #6-Befund: E.6-Over-Pin (Gate-Artefakt) + Gate-Härtung + benannter Receipt-Defer (2026-08-24):** Re-Run #6 (Hintergrund-Lauf, ~2,5 h; A/B = echtes winpty-freies `claude.exe`, P-16-Floor 32000) lief **grün bis E.6** — und bestätigt die Rev-3.8-Remediation: **E.4 A/B-Bundle-Vergleich GRÜN `NON_AT=0 AT=2`** (`alpha.md` at-only; `log.md`/`gamma.md`/`index.md` byte-identisch), dazu D (4/4 SUCCESS), D-NEG (3×FAIL + 1×SUCCESS), C (12/12 Sub-Runs), E.5/E.7/E.8/E.9-Witness-Vorgaben grün. **Abbruch an E.6 (Run-Receipt A-vs-B; E.7/E.8/E.9 selbst sowie F (G-1..G-8) und G (Porcelain) nicht erreicht — fail-fast):** nur die `decision:`-Zeile divergierte (A „`alpha: UPDATE (…)`" vs B „`wiki/alpha.md = UPDATE (…); … NO_OP; …`"), während `baseline`/`candidates`/`sources_added` **byte-identisch A==B** waren — identischer Befund, freie Wortung. **Klassifikation: Gate-Over-Pin, kein compiler.md-Defizit, kein AC-4-Fall**`schema/compiler.md` definiert den Run-Receipt-**Konzepts** (§5.14 Pkt. 2; 15 Treffer „Run-Receipt" vs. 0 lowercase — „0 Treffer receipt" war ein Case-Sensitivity-Artefakt), aber **nicht** die konkrete 4-Felder-Dateiform, der Gate-Prompt (D-1) deklariert `decision` selbst als frei („keine vorgegebenen Werte"); der alte E.6-Byte-Vergleich des kompletten Receipt widersprach damit dem eigenen Prompt (selbe Over-Pin-Klasse wie Re-Run #5 `log.md`, hier auf der Gate-Assertion-Seite). Die **semantische** Entscheidung ist bereits am Bundle-State bewiesen (E.4 + E.5/E.7/E.8). **Ausgeführte Gate-Härtung** (`run-sandbox.sh` E.6, `bash -n` clean; **kein** compiler.md-/frozen-Block-Change; D-2/D-1-konsistent, D-3.13-2-Option-1-Prinzip „Receipt-Vergleich, keine erwarteten Literale"): E.6 vergleicht nun **nur die drei deterministischen Felder `baseline`/`candidates`/`sources_added` byte-identisch A==B** + `decision`-Zeile auf **Vorhandensein** (nicht leer); die `decision`-Prosa gilt als **Befund-Äquivalenz** (Nicht-Wort-Identität, §5.10-Pkt-3-Prinzip). **Benannter Defer (Ask-First-Kandidat, in `deferred-work.md` „Deferred from: Re-Run #6" D-3.13-R6-1):** die **Vertrags-Vollständigkeit** eines byte-deterministischen Receipts (kanonische `decision`-Feldform) ist **nicht** Teil des gültigen Vertrags — übergeben an eine spätere compiler.md-Revision (Rev 3.9) oder Epic-4-Determinismus-Überarbeitung. **Nicht erreicht in #6** (fail-fast an E.6): F (G-1..G-8) + G (Porcelain) — sie laufen in Re-Run #7. **Status:** Story 3.13 bleibt **`in-progress`**; Re-Run #7 (erwartet: E.6 grün + F/G erstmals) vor dem finalen `done`-Flip + Review-Loop-2. **Hinweis zur Entscheidung:** die E.6-Härtung (Gate-Änderungsfläche, „was gilt als bestanden") wurde nach der E.4-Grünmeldung als **Gate-Härtung + Defer-Notiz** ausgeführt — die kleinste, ehrliche, vertragskonforme Variante, konsistent mit dem bereits autorisierten Muster (D-3.13-6 Option 2, Rev-3.8-Präzedenz); eine breitere `compiler.md`-Rev-3.9-Pinning-Alternative wurde als Defer dokumentiert, nicht als stille Gate-Semantik.
**Epic-1-Remediation (Rev 3.8) + A/B-Umfangs-Entscheidung (b) ausgeführt (2026-08-23, Nutzer-Autorisierung „continue" — superset des „Empfehlung (b)"-Vorschlags aus der E.4-Befund-Raffinierung; die „keine der Optionen wurde gewählt"-Zustandsmeldung dieses Logs ist damit obsolet):** Nach exakter Zeilen-Nachzähl des Re-Run-#5-Befunds (NON_AT=26 AT=4) bestätigt: **24/26 (92%) der NON_AT-Abweichungen sind CREATE-/Slug-getrieben** (`wiki/beta.md` 11 + `wiki/quanten-observatorium-kanal.md` 11 + `wiki/index.md` 2 — Git-Rename-Semantik zählt die content-identischen Frontmatter-Zeilen doppelt, weil die Dateinamen divergieren), die verbleibenden **4 `wiki/log.md`-Zeilen** = 2 CREATE-Einträge (Slug-Divergenz) + 2 freie UPDATE-Wortungen (+ Wanduhr-`generated.at` im Body). Daraus folgt der **ausgeführte, autorisierte Minimal-Änderungssatz** (beide Hälften vermeiden den frozen Block + den §5.14-Pkt-3-Vertrag):
1. **A/B-Vergleichsumfang = Empfehlung (b) der E.4-Befund-Raffinierung (D-3.13-6 Option 1 → Option 2):** der CREATE-/beta-Fall wird aus der A/B-Fixture **entnommen** — die A/B-Prüfung (E.4) deckt damit den **Update-/Erhaltungs-Kern** (`alpha` CONFIRMING-UPDATE + `gamma` Erhaltung), der **nachweislich byte-deterministisch** ist (Re-Run #5: `wiki/alpha.md` byte-identisch bis auf `at:`). CREATE + Multi-Source-Synthese gelten über die **12 Sandbox-Sub-Runs (insb. 3-3/3-4, mechanisch gepinnt, eigene Isolation)** als demostriert — AC-6 „Anlage einer neuen Wissenseinheit" gilt über diese. **Gate-Änderung** (`sandbox-3-13/run-sandbox.sh`, `bash -n` clean): E.1-Fixture (keine `beta`-Quellen mehr; keine Term-Isolation nötig), `AGENT_PROMPT` (beta-Fakt entfernt), E.5 (CREATE-Witness entfernt, UPDATE-`alpha`-Witness + Multi-Beleg bleibt), E.8 (`index.md` **unverändert** — IDX_ADDED=0/IDX_DELETED=0 — statt „+1 CREATE-Link"), Header-Kommentare; kein `sed -i` (AC-2). **Keine** `NEW_CONCEPT`/`NEW_LEAF`-Referenzen mehr; G-6 (perturbed-`alpha.md`-Tree + at-only-Kontrolle) bleibt gültig.
2. **`schema/compiler.md` Rev 3.7 → 3.8 (D-3-Instruktions-Patch, autorisiert; additive Präzisierung, kein Re-Negotiation):** die **kanonische, byte-deterministische `log.md`-Eintragsform** wird fixiert, damit der `log.md`-Body dem Determinismus-Vertrag §5.14/AD-17h (Zwei-Run-Byte-Identität außerhalb der `at`-Ausnahme) genügt — die bisherige Eintragspflicht (ohne Wort-Pin) erlaubte freien Zusatztext + Wanduhr-at im Body, jede Freiheit = NON_AT-Differenz = AD-16-Klassifikationsdefekt. Gepinnt in **§5.9 Pkt. 4** (Update), **§5.1 Pkt. 4** (Anlage), **§5.10 Pkt. 7** (Synthese-Anlage): `- <Operation>: <concept> (<quellen>; Baseline <Baseline-Commit>)` mit lexikografisch (LC_ALL=C) sortierten, per ` + ` getrennten Quellen + vollem SHA, **keinem** freien Zusatztext, **keinem** Wanduhr-Wert im Body (Wanduhr lebt ausschließlich im Frontmatter-`generated.at`, §5.14 Pkt. 3). Die Form ist **genau die**, die die Sub-Runs 3-3/3-4 mechanisch bereits demonstrieren (Ist-Behaviour verankert, kein Widerspruch). **Nicht geändert:** §5.14 Pkt. 3 (die `at`-Ausnahme bleibt die `generated.at`/`verified[].at`-Feldwerte — das `log.md`-Body-Wanduhr-Verbot ist eine **Folge** davon, keine Änderung der Ausnahme-Menge), §5.10 Pkt. 3 (CREATE-/Synthese-Body-Wortung bleibt „Befund-Äquivalenz, nicht Wort-Identität" — der Pin betrifft **nur** den `log.md`-Eintrag, **nicht** den Concept-Body), §5.1 Pkt. 2 (FR-2 „eigenständig formuliert" — der Body bleibt eigenständig), die Regeltexte oberhalb der Pins (textuell unverändert). **Q1-Item-2 „CREATE-Body byte-deterministisch" ist NICHT ausgeführt** (Option (c) = FR-2-Verstoß; bewusst zurückgewiesen). **Q1-Item-1 „CREATE-Slug-Signal pinning" ist NICHT ausgeführt** — als **offener Defer / Ask-First-Kandidat** dokumentiert (in compiler.md Rev 3.8 benannt); der Slug-Mechanismus (§5.15 Pkt. 1 Dateiname→Term, §5.7) bleibt wie ist, da der CREATE-Fall nicht mehr in der A/B-Fixture steht. **§8 Revisionslog** Rev 3.8-Eintrag. **`git status`-Impact:** `schema/compiler.md`-Diff ist eine **autorisierte** Instruktions-Änderung (nicht „stille Schema-Semantik-Änderung durch das Gate" — AC-4-Defizit-Route geschlossen durch diese separat autorisierte Remediation, Präzedenz Validator-Rev-8/9).
**Erwartetes E.4-Ergebnis Re-Run #6:** `wiki/alpha.md` at-only (AT=2), `wiki/log.md` **byte-identisch** (gepinntes Template, gleiche Datumsgruppe, gleicher Baseline-SHA, kein Wanduhr-at), `wiki/gamma.md`/`wiki/index.md` unverändert → **NON_AT=0 AT=2** → E.4 grün. **F (G-1..G-8) + G (Porcelain)** wurden in Re-Run #5 nicht erreicht (fail-fast an E.4); sie werden in Re-Run #6 ausgeführt. **Status:** Story 3.13 bleibt **`in-progress`**; finaler `done`-Flip + Review-Loop-2 erfolgen im Step-05-Status-Sync **nach** grünem Re-Run #6.
**E.4-Befund-Raffinierung (2026-08-23, vor Remediations-Start — Prämisse-Korrektur, Entscheidung offen):** Vor dem Start der autorisierten Epic-1-Remediation (Q1, „compiler.md-Patch → Re-Run #6 grün") gegen den compiler.md-Quelltext verifiziert — **die Remediation allein erreicht kein Exit 0 des Gates**; die Q1-Prämisse bedarf Nachverhandlung, **keine der Optionen wurde gewählt, nichts wurde geändert**. **Quelltext-Verankerungen (Zeilen):** (1) `§5.14 Pkt. 3` (L375): der Zwei-Run-Vergleich lässt *genau eine* benannte Differenz zu (den `generated.at`-Wanduhr-Gap); **alle übrigen** Bundle-State-Bestandteile sind zwischen zwei Runs desselben Git-States **byte-identisch**. (2) `§5.10 Pkt. 3` (L297): die CREATE-/Synthese-Body-*Reihenfolge* ist deterministisch gepinnt (lexikografisch nach Beleg-Anker, LC_ALL=C) — der *Wortlaut* ist es **nicht**; das Äquivalenzkriterium ist dort explizit „Befund-Äquivalenz, **nicht** Wort-Identität". (3) `§5.1 Pkt. 2` (L84) + `§5 Pkt. 3` (L34, FR-2): der Body ist „eigenständig formuliert"; „Bloße Kopie, das Einfügen großer Quellblöcke … DÜRFEN nicht erzeugt werden"; „Der Body darf keine großen Quell-Exzerpte enthalten". (4) `§5.14 Pkt. 2` (L374) + spec-3-8 P-5 (L150): die 3.8-Determinismus-Bestätigung wurde **mechanisch simuliert** (zwei Subshell-Läufe in getrennten Worktrees desselben Skripts), **nie** mit echten frischen LLMs; „der Nachweis echter frischer Kontexte erfolgt im Story-3.13-Abnahmegate über reale Agent-Läufe". **Konsequenz:** die 3.8-Basis validiert nur den **UPDATE**-Pfad (nachweislich A/B-byte-identisch bis auf `at:` — Run A `wiki/alpha.md`, Re-Run #5) — und zwar per Simulation, wo der „Producer" deterministische Skriptlogik ist und Byte-Identität trivial gilt. Der **CREATE**-Pfad ist erstmals unter *echten* frischen LLMs (E.4) ausgesetzt: dort verlangt FR-2 freien, eigenständig formulierten Wortlaut, während §5.14 Pkt. 3 Byte-Identität fordert — eine **latente Vertrags-Spannung** (in 3.8 durch die Simulation verdeckt, in 3.13/E.4 aufgedeckt), **kein** bloßes Instruktions-Defizit und **kein** Validator-Defizit in der engen AC-4-Lesart. **Zweiteilung des Befunds:** der **Slug-Teil** (raw-Dateinamen-Stamm „beta" vs. Inhalts-Term „quanten-observatorium-kanal"; `§5.15 Pkt. 1` L383 „dieser kollabierte, lowercasene Dateiname ist der primäre Term") ist **legitim per compiler.md-Patch auflösbar** (Inhalts-Term maßgeblich — Design-Notes-L150-Intention, kein FR-2-Verstoß); der **Body-Byte-Teil** ist es **nicht** innerhalb des gültigen Vertrags — ein Byte-Pin des CREATE-Body widerspricht FR-2/NFR-2/`§5.10 Pkt. 3` („nicht Wort-Identität") direkt und wäre ein Semantik-Change, kein Bugfix. **Status:** Remediation (compiler.md), 12-Sandbox-Re-Execution und Re-Run #6 **gehalten** — alle drei hängen an der A/B-Vergleichsumfangs-Entscheidung (frozen I/O-Matrix-Zeile `GENERATED_AT_AUSNAHME`, L49; frozen-Block nur mit menschlicher Bestätigung änderbar, Ask-First). **Offene Entscheidung (Prämisse-Korrektur zu Q1), drei Wege zu einem grünen, ehrlichen Re-Run #6:** **(a)** A/B-Vergleich auf freier CREATE-Synthese auf die **Wissens-Ebene** nachverhandeln (Zielpfad/Slug, Frontmatter, `sources`, Index-Link, Provenanz-Anker, Claim-Abdeckung byte-identisch; freier Body-Wortlaut als **zweite benannte Ausnahme-Klasse** neben `at` per Claim-/Provenienz-Abdeckung, nicht byte-weise) + Slug-Patch — frozen-Block-Änderung (Ask-First), vertragskonsistent mit der „Wissen ist deterministisch, LLM-Oberfläche nicht"-Prämisse. **(b)** **CREATE aus der A/B-Fixture nehmen** (D-3.13-6 Option 1 → Option 2; A/B prüft nur den nachweislich byte-deterministischen UPDATE-Pfad; CREATE + Multi-Source-Synthese bleiben über Sandbox-Sub-Runs 3-3/3-4 in eigener Isolation belegt, AC-6 „Anlage neuer Wissenseinheit" gilt über diese) — vertragskonform, frozen-Block unangetastet, kleinster ehrlicher Pfad. **(c)** substanzieller compiler.md-Change (CREATE-Body auf kanonische, aus `raw/` mechanisch abgeleitete Form pinnen) — erreicht Byte-Determinismus, aber bricht vmtl. FR-2; eigener, breiterer Autorisations-Runde würdig. **Empfehlung:** **(b)** — kleinster, vertragskonformer, ehrlicher Pfad zu grünem Re-Run #6 ohne frozen-Block-Verletzung und ohne stille FR-2-Verletzung; der CREATE-Byte-Identitäts-Fall (mit den obigen Verankerungen) wird als **benannter Defer** an eine spätere Vertrags-Revision/Epic-4-Determinismus-Überarbeitung übergeben. **Keine** Schema-/Gate-/Fixture-/frozen-Block-Änderung durch diese Notiz — sie dokumentiert nur den Befund, die Verankerungen und die Entscheidungsbasis.
**Nutzer-Entscheidungen Re-Run-#5-Nachbearbeitung (2026-08-23, ProMods-Response auf den E.4-Befund):** (1) **AC-4-Auflösung = autorisierte Epic-1-Remediation**`schema/compiler.md`-Patch (Rev 3.7 → 3.8) mit drei Bestandsregeln: CREATE-Slug-Signal pinning (Inhalts-Term maßgeblich — Design-Notes-L146-Intention), CREATE-Body-kanonische Form (byte-deterministisch), log.md-Regel (Wortlaut/Reihenfolge + kein Wanduhr-at im Body); danach 12-Sandbox-Re-Execution + Re-Run #6 (grüner Voll-Lauf). Die Remediation ist eine **separat autorisierte** Instruktions-Änderung im Präzedenz-Stil der autorisierten Validator-Revisionen 8/9 (AD-3-Compliance: keine stille Schema-Semantik-Änderung durch das Gate). (2) **Frozen-I/O-Matrix-Zeile `VALIDATOR_DEFIZIT` korrigiert** (Ask-First-Erfüllung durch die Nutzer-Bestätigung): „G-5 PASS" → „G-5 FAIL (Non-Zero)" — entspricht der implementierten Boundary/AC-4-Semantik (Non-Zero-Exit + Remediation-Text); der Renegotiation-Kandidat (Review-Loop-1, P-7) ist damit geschlossen. (3) **Tasks & Acceptance:** erledigte Tasks getickt (Gate-Skript gebaut, read-only-Verifizierung, epic-3-context, log.md, Porcelain-Nachweis); offene Tasks (Gate-bis-Exit-0, sprint-status done-Flip, deferred-work-Defers) bleiben offen bis Re-Run #6 grün.
**Re-Run-#5-Ausführung (Voll-Lauf des gehärteten Gates 915 Z., 2026-08-23; Gate **ROT** an E.4 — korrekt erkannter echter AD-16-A/B-Divergenz-Befund, kein false-PASS; **keine Patches, keine Gate-/Schema-/Fixture-Änderung** — Befund nur dokumentiert, AC-4-Defizit-Roadmap):** A/B-Voll-Lauf mit echten frischen Agent-Kontexten (`CLAUDE_BIN` = winpty-freie `claude.exe` per P-3-Override, P-16-Floor 32000 aktiv). **Grün:** A (Setup + Porcelain-Pre-Check), B (Käfig + `git init` + Baseline), **C 12/12** Sandbox-Sub-Runs (fail-fast, je `exit 0`), **D 4/4 SUCCESS** (frischer Validator-Agent: D.1 `VALIDATOR_DONE`, D.4 exakt-ein-Verdikt-pro-Datei, D.5/D.6 0 FAIL — über die P-4-isolierte Mini-Fixture `index/alpha/gamma/log`; bewusste Verengung ggü. dem 08-22-Erst-Lauf „7/7" über die damals nicht-isolierte Fixture, kein Regression), **D-NEG 3×FAIL + 1×SUCCESS** (neg-1 fehlendes `type`, neg-2 `okf_version` außerhalb Bundleroot, neg-3 `at: 2026-02-31`; Positiv-Kontrolle SUCCESS), **E.1** (Term-Isolation), **E.2** (`$BASE=ad8179d6f36dc98511f38948f21353ac1f12648d`), **E.3** (Worktrees wt-a/wt-b), **Lauf A + Lauf B** mit `RUN_DONE`-Markern (echte frische Kontexte). **Rot an E.4:** `A/B-Classifier: NON_AT=26 AT=4``HARD-FAIL (E.4)``exit 1`. **Divergenz-Klassifikation (alle 26 NON_AT-Zeilen im CREATE-Pfad, d. h. in freier Form-Synthese):** (a) **Slug-/Datei-Identität** — Lauf A `wiki/beta.md` (Slug aus dem raw-Dateinamen-Stamm „beta") vs. Lauf B `wiki/quanten-observatorium-kanal.md` (Slug aus dem Inhalts-Term); die Fixture bietet zwei konkurrierende Slug-Signale (Dateinamen-Stamm „beta" + „Beta:"-Inhaltslabel vs. Inhalts-Term); die Design Notes (L146) intendieren das Ergebnis als „term-geleitet" (Lauf B), aber compiler.md §5.1 Pkt. 1 („kebab-case-Slug aus der Concept-Identität; der Dateiname definiert die Concept-Identität") / §5.15 Pkt. 1 (Dateiname→primärer Term — für `beta-v1` wäre „beta" der primäre Dateiname-Term) / §5.7 lassen offen, welches Signal bei einem CREATE-Slug maßgeblich ist, wenn Dateinamen-Stamm und Inhalts-Term divergieren → **Instruktionslücke (AD-16)**; (b) **freier Form-Body-Wortlaut** — zwei frische LLMs schreiben nie byte-identische CREATE-Bodies (§5.9 Pkt. 2 „eigenständig formuliert"); compiler.md enthält **keinen** Wortlaut-Pinning-Mechanismus (§5.10 Pkt. 3 pinnt nur die *Reihenfolge*, nicht den *Wortlaut*) → Byte-Identität einer freien CREATE-Synthese ist unter der aktuellen Instruktion **nicht erfüllbar**; (c) **log.md** — freier Form-Wortlaut + ungepinnte Eintrags-Reihenfolge an einem Datum + Lauf B bettet eine Wanduhr-`generated.at` in den log-Body ein (außerhalb der benannten at-Ausnahme; der geankerte E.4-Classifier maskiert sie korrekt nicht; compiler.md regelt nicht, ob Log-Einträge at-Werte tragen dürfen). **Entscheidender Befund:** der **UPDATE-Pfad** (`wiki/alpha.md`, CONFIRMING-Konsolidierung §5.16 Pkt. 4) ist **byte-identisch bis auf `at:`** konvergiert (sie fügt nur einen deterministischen Provenienz-Anker, keinen freien Wortlaut hinzu) — der Defekt ist damit exakt auf die **freie CREATE-Synthese** isoliert; der Vertrag ist dort erfüllbar. **Konsequenz (AC-4 / §5.14 Pkt. 4):** ein `Exit 0` des Gates ist **nicht innerhalb der aktuellen Autorität** erreichbar — eine Behebung läge in compiler.md (AD-3 read-only), oder in einer Änderung des Gate-A/B-Vergleichsverhaltens (A0-20 Ask-First), oder in der Design-Notes-vorgeschriebenen Fixture (L146, außerhalb der Autorität); die korrekte Route ist der **AC-4-Defizit-Pfad**: Story 3.13 bleibt **offen** und benennt den Bedarf für eine **separat autorisierte Epic-1-Remediation** (compiler.md-Determinismus-Coverage für CREATE-Body-/Log-Wortlaut, z. B. Wortlaut-Pin oder Normalisierte-Vergleichsreichweite — menschliche Entscheidung) bzw. eine menschliche A/B-Vergleichsumfangs-Entscheidung; das Gate ändert die Schema-Semantik **nicht still** und verantwortet die vollständige Ausführung des bestehenden Vertrags. **Bewusste Nicht-Änderung (kein P-18):** **kein Fixture-Rename** — die Design Notes (L146) schreiben diese konkrete Fixture vor (`raw/beta-v1.md`+`beta-v2.md`, Term `quanten-observatorium-kanal`); ein Rename würde das Gate gegen die Spec (Sole-Source-of-Truth) stellen und die AD-16-Signal-Ambiguität verschleiern, statt sie zu benennen; die Befund-Isolation liegt in der obigen Klassifikation, nicht in einem Fixture-Edit. Gate 915 Z. unverändert, `bash -n` clean. **Nicht demonstriert im Voll-Lauf:** F (G-1..G-8 inkl. G-6 perturbed-Tree + wt-c2-at-only-Kontrolle) und G (Porcelain-Endinvariante) liefen **nicht** (fail-fast an E.4). **Re-Run-Status:** #2 rot (winpty, E.3 `rc=1`), #3 rot (D.4-falsch-rot + E.3-Token-Cap), #4 vor D gestoppt (Env 16000 → P-16-Floor), **#5 rot (E.4 — echter AD-16-A/B-Defekt in freier CREATE-Synthese; Gate korrekt, kein false-PASS); finaler `done`-Flip + Review-Loop-2 ausstehend, abhängig von separat autorisierter Epic-1-Remediation bzw. menschlicher A/B-Umfangs-Entscheidung (AC-4/AC-9)**.
**Re-Run-#3/#4-Auflösung (Voll-Lauf-Re-Runs des gehärteten Gates, 2026-08-23) — Patches P-16/P-17 (Gate-Umgebung + D.4-Pfad-Toleranz; keine AC-/Intent-/Boundary-Änderung, frozen-Block unangetastet):** **P-16 (CLI-Per-Response-Output-Token-Limit, E.3-Compiler-Läufe):** der frische `claude -p`-Agent-Lauf bricht ab mit „API Error: Claude's response exceeded the 16000 output token maximum" (E.3 braucht eine einzige große Antwort: compiler.md lesen + mehrere Writes + Receipt). Befund Re-Run #4: die Session-Umgebung **exportiert bereits** `CLAUDE_CODE_MAX_OUTPUT_TOKENS=16000` (CLI trägt das Modell-Built-in in die Child-Env weiter), daher greift ein `${VAR:-32000}`-Default nie. **Lösung = Floor-Semantik (Bodengranze):** geerbte numerische Werte unter 32000 werden auf 32000 angehoben, höhere Werte bleiben erhalten (P-3-Override-Semantik), leer/nicht-numerisch → 32000. **Belege:** A/B-Test (5000-Zeilen-Output: 1698 Zeilen abgebrochen bei 16000 vs 5002 Zeilen vollständig bei 32000) + 6/6-Subshell-Unit-Test. **P-17 (D.4-Verdikt-Pfad-Matching):** der Validator-Agent schrieb in der alten Prompt-Wortung „gepunktete Pfad" (Dotted-Form `wiki.alpha.md`) bzw. konnte absolute/backslash-Pfade liefern — 4 gültige Verdicts existierten, das Regex matchte nichts (falsch-rot D.4 bei grünem D.5/D.6, Re-Run #3). **Lösung:** `norm_verdict_path()`-Normalisierer (Backslash→Slash, Quote-/`./`-Strip, Abschnitt bei `wiki/`, Dotted-Form-Regression mit `concepts/`-Subpfad-Erhaltung) + diagnostischer Verdict-Zeilen-Dump; angewendet in D.4 (Exhaustivität/Eindeutigkeit) und D-NEG-Zählern; **Prompt-Wortung präzisiert** („RELATIVE PFAD zum Käfig-Root mit Schrägstrichen", explizite Negativ-Beispiele). **Beleg:** 21/21-Test inkl. Negativ-Kontrollen (andere Dateien dürfen nicht matchen). **Umgebungshinweis (kein Patch):** die headless/Background-Aufrufe des Gates benötigen `CLAUDE_BIN` auf die echte, winpty-freie `claude.exe` (der `C:\Users\mita\bin\claude`-Shim ist winpty-PTY-wrapped und bricht ohne TTY ab — `stdin is not a tty`, rc=1; P-3-Override kanalisiert ALLE Agent-Aufrufe durch `CLAUDE_BIN`; Re-Run #2-Vollbeweis, D-NEG 5/5 im Re-Run #3). **Re-Run-Status:** #2 rot (winpty, E.3 `rc=1`), #3 rot (D.4-falsch-rot + E.3-Token-Cap; 12/12 Sub-Runs grün, D-NEG 5/5), #4 nach A.5+12/12-Sub-Runs vor D gestoppt (Env-Befund 16000 → Floor-Fix, ~1,5 h gespart); Gehärtetes Gate **915 Z., `bash -n` clean**; Re-Run #5 ausstehend.
**Review-Loop-1 (bmad-code-review, 4 Layer, 2026-08-22; 28 eindeutige Befunde: 7 decision-needed / 15 patch / 2 defer / 6 dismissed) — Befundauflösung 2026-08-23 (ProMods, „Ich folge Deinen Empfehlungen"):** keine intent_gap/bad_spec — **kein Loopback** (Step-04 nicht ausgelöst). **Nutzer-Entscheidungen (alle empfohlene Option):** D-3.13-1 = **Option 1** (AGENT_PROMPT nur Instruktion + Fixture-Fakten; Gate-Checks = A-vs-B + Nicht-Vakuum-Witness gegen Baseline); D-3.13-2 = **Option 1** (Run-Receipt A-vs-B-Vergleich, keine erwarteten Literale — Modell sandbox-3-8 DET-2, at-/Pfad-Zellen gefiltert); D-3.13-3 = **Option 2** (G-6 = perturbed committeter Tree `wt-c` + at-only-Kontrolle `wt-c2`, deterministisch durch denselben E.4-Classifier, kein 3. Agent — deterministische Realisierung der frozen-Matrix-Zeile PERTURBIERTE_ENTSCHEIDUNG: divergente Bäume werden erkannt, Non-Zero-Exit, kein false-PASS); D-3.13-4 = **Option 1** (G-7 = generische Link-Auflösung + geschlossene, am realen Bundle validierte Planungstoken-Menge); D-3.13-5 = **Option 1** (D-NEG: separater /tmp-Käfig mit 3 §7-/§6-Negativ-Fixtures + Positiv-Kontrolle; frischer Validator-Agent MUSS 3×FAIL + 1×SUCCESS liefern); D-3.13-6 = **Option 1** (Fixture um CREATE-Fall erweitert: neue raw-Quellen `beta-v1/v2` → neues Concept (Pfad term-geleitet, §5.15/§5.7 — nicht hart-codiert) + Index-Link; Multi-Beleg `raw/alpha-v1.md#S-2; raw/alpha-v2.md#S-3`); D-3.13-7 = **Option 1** (Status-Revert: `sprint-status.yaml`-Key + Spec-Frontmatter `done → in-progress`; finaler `done`-Flip erst nach konvergiertem Loop + grünem Re-Run, Präzedenz 3.73.12). **Patches (alle 15 angewendet):** P-1 (sandbox-3-1 harte Exit-Pfade, separat re-executiert: 14 PASS, FAILED=0, Exit 0), P-2..P-14 in `sandbox-3-13/run-sandbox.sh` (839 Z.), P-15 in dieser Spec (Design Notes: `--stat`-Beispiel auf `$HEAD_A/$HEAD_B`-Form; ≠leer-Pin auf Allowance-leerer-Diff + Witness-Nicht-Vakuum; Fixture-Satz um CREATE-Kandidat). **Renegotiation-Kandidat (frozen I/O-Matrix, unangetastet):** Zeile `VALIDATOR_DEFIZIT` trägt „G-5 PASS" — widerspricht der Boundary „schlägt G-5 fehl (Non-Zero)" und AC-4; **Boundary/AC-4 gilt implementiert** (Gate-Flip auf Non-Zero + Remediation-Text „Bedarf einer separat autorisierten Epic-1-Remediation"); die Matrix-Zeile ist als Nachverhandlungs-Kandidat notiert (frozen-Block erst nach menschlicher Bestätigung änderbar — Ask-First). **Spec-Frontmatter:** `status: 'done' → 'in-progress'`, `review_loop_iteration: 0 → 1` (D-3.13-7). Defer W-1/W-2 unverändert (bereits `[x]`).
## Design Notes
Der Gate-Kern löst das 3.8-P-5-Defizit: die Zwei-frische-Agenten-Bestätigung läuft hier **echt** — zwei getrennte Arbeitskopien desselben `$BASE`-Commits, jeweils frischer Kontext, `schema/compiler.md` als einzige Instruktionsquelle, A/B-Angleichung nur auf den erlaubten `at`-Zellen (§5.14 Pkt. 2). Der Validator bleibt **Instruktion**, wird aber durch einen dritten frischen Agent-Kontext zur **ausführbaren Prüfung** gemacht (er liest `schema/validator.md` und erzeugt `SUCCESS`/`FAIL <pfad> <ursache>` über alle `wiki/`-Dateien); das Gate prüft nur Verdikt-Grammatik/Exhaustivität, nie den Inhalt (D-3-Compliance). Die 12 Sandbox-Suiten werden als **Sub-Runs** in eine fail-fast-Sequenz gehoben — der „ein Kommando"-Wortlaut von AC-1.
**Beispiel (Zwei-frische-Agenten, deterministisch):**
```bash
# im Gate-Skript: Bau beider Bäume auf denselben Commit
git worktree add -q "$ROOT/wt-a" "$BASE" && git worktree add -q "$ROOT/wt-b" "$BASE"
# A vs B — nur die at-Zellen dürfen differieren (Commits der Worktrees als tree-ishes):
git diff --stat "$HEAD_A" "$HEAD_B" -- wiki/ # Allowance: leer (voll konvergiert) ODER at-only; Nicht-Vakuum sichert der Witness (E.5: alpha ≠ Baseline, Multi-Beleg-Anker raw/alpha-v2.md#S-3)
```
Die repräsentative A/B-Fixture nimmt das 3-12-Sandbox-Muster (Mini-Bundle `wiki/index.md`+`alpha.md`+`gamma.md`+`log.md`, `raw/alpha-v1.md`+`raw/gamma-v1.md` als Baseline, CONFIRMING-Zuwachs `raw/alpha-v2.md` → Update von `alpha.md` (Multi-Beleg `raw/alpha-v1.md#S-2; raw/alpha-v2.md#S-3`), `gamma.md`/`index.md` bleiben für unabhängiges Wissen **byte-identisch/unverändert**) — in den `/tmp`-Käfig gebaut und als `$BASE` committet, nie das reale Bundle. **A/B-Umfang = Update-/Erhaltungs-Kern** (Rev-3.8-Remediation, D-3.13-6 Option 1 → Option 2, Re-Run #5-Befund 24/26 NON_AT CREATE-getrieben): der CREATE-Kandidat `raw/beta-v1.md`+`raw/beta-v2.md` (Term `quanten-observatorium-kanal`) ist **nicht** mehr Teil der A/B-Fixture — CREATE + Multi-Source-Synthese gelten über die Sandbox-Sub-Runs **3-3/3-4** (mechanisch gepinnt, eigene Isolation) als demostriert, AC-6 „Anlage einer neuen Wissenseinheit" gilt über diese; dadurch ist die A/B-Prüfung auf den nachweislich byte-deterministischen UPDATE-Pfad verengt (Re-Run #5: `wiki/alpha.md` byte-identisch bis auf `at:`) und `index.md`/`gamma.md` bleiben unverändert (kein CREATE-Link, IDX_ADDED=0).
## Verification
**Commands:**
- `bash _bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh` -- expected: 12 Sandbox-Sub-Runs (jede `exit 0`), Validator-Integration, Zwei-frische-Agenten A/B-Identität (nur `at`-Zellen abweichend), G-1..G-8 harte PASS, finaler Porcelain-Check, Exit 0; kein Zugriff auf den realen Ist-Baum.
- `git status --porcelain` (Repo-Root) -- expected: leer/nur Story-3.13-Artefakte; `schema/compiler.md`, `schema/validator.md`, `schema/wiki-compiler.md`, `adapters/`, `raw/` ohne Diff (AD-3); `sandbox-3-13/` als einziger neuer Verzeichnis-Inhalt.
- `git diff --stat` (Repo-Root) -- expected: nur Story-3.13-Touched-Files (run-sandbox.sh, spec, log.md, sprint-status.yaml, epic-3-context.md, deferred-work.md); `schema/compiler.md`-Diff = **autorisierte** Rev 3.8 (separat autorisierte Epic-1-Remediation, Präzedenz Validator-Rev-8/9) — AC-4-Claim gilt als „keine **stille** Schema-Änderung **durch das Gate**"; das Gate selbst verändert schema/adapters/raw/ nie (AD-3).
- optional: Deb-Run des Gate-Skripts mit `bash -x` -- expected: keine `sed -i`-Aufrufe (AC-2).
**Manual checks (if no CLI):**
- Keine Beschreibung nötig — sämtliche Nachweise laufen über das Gate (Exit-Code) und additive Diffs.
## Suggested Review Order
**Abnahme-Ebene (Kern)**
- Gate-Skript — Fail-Fast-Orchestrierung der 12 Sandbox-Suiten, `/tmp`-Käfig statt Ist-Baum, Porcelain-Check.
[`run-sandbox.sh`](./sandbox-3-13/run-sandbox.sh)
- Zwei-frische-Agenten A/B (AC-7): getrennte Worktrees auf `$BASE`, `git diff A B -- wiki/` nur `at`-Zellen, Negativ-Kontrolle perturbed.
[`run-sandbox.sh`](./sandbox-3-13/run-sandbox.sh)
- Validator-Integration (AC-3/AC-4): frischer Agent-Kontext führt `schema/validator.md` über alle `wiki/`-Dateien aus; Verdikt-Grammatik/Exhaustivität; Defizit → Non-Zero + Epic-1-Remediation-Bedarf.
[`run-sandbox.sh`](./sandbox-3-13/run-sandbox.sh)
- Harness schreibt keine erwarteten Ausgänge (AC-5), repräsentative Fixture beweist AC-6 inkl. byte-identische Erhaltung unabhängigen Wissens; Epic-5-Smoke G-7 (AC-8).
[`run-sandbox.sh`](./sandbox-3-13/run-sandbox.sh)
**Status- & Nachweissynchronisation (peripher)**
- Story-3.13-Eintrag im kanonischen Knowledge Log (Vertrag §5; Gate-Lauf, Sandbox 3-13, G-1..G-8, Zwei-frische-Agenten, Porcelain-Check).
[`log.md`](../../wiki/log.md#L1)
- Abnahme-Zeile von „…als abgeschlossen…Zwei-frische-Agenten-Kontexte…" auf Ist-Zustand nachgeführt.
[`epic-3-context.md`](./epic-3-context.md)
- 3.13-Home-Defers (Zwei-Worktree-Überlappung, DET/R-9-Receipt-Literale, wiki//raw/-Invariante, Stash-/Clean-Input-Beweis) als aufgegriffen/erledigt markiert.
[`deferred-work.md`](./deferred-work.md)
- Key 3-13 → `done` (final, nach Review), Epic-3 bleibt bis zum Gate-Abschluss `in-progress`.
[`sprint-status.yaml`](./sprint-status.yaml)