--- title: 'Story 3.13 — Epic-3-Verifikations- und Abnahmegate' type: 'feature' created: '2026-08-22' status: 'in-progress' baseline_commit: 'c234fc361e006043c3c972cc03211b52998c2ddb' review_loop_iteration: 1 context: - '_bmad-output/implementation-artifacts/epic-3-context.md' --- ## 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/d–h, 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 ` ü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 -- 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 | ## 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-``-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/` — read-only verifizieren (kein Diff), `schema/canonical-terms.md` unangetastet (AD-3) - [ ] Gate real ausführen (mehrere Läufe, inkl. skript-seitiger Zwei-/Mehr-Lauf-Stabilität) bis Exit 0; Negativ-Kontrollen ausführen - [ ] `_bmad-output/implementation-artifacts/sprint-status.yaml` — Key 3-13 → `done`, `epic-3` Status-Kette prüfen, `last_updated` aktualisieren (Step-05 nach Review) - [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) - [ ] `_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) - [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. ``). 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 2–3 §7-Negativ-Fixtures in einen separaten /tmp-Käfig bauen, frischen Validator-Agenten darauf fahren, MUST `FAIL `-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.7–3.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 (S1–S6) 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 ` 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)._ ## Spec Change Log **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): `- : (; Baseline )` 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.7–3.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 ` ü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), kein Source-/Schema-Diff (AC-4: keine stille Schema-Änderung). - 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)