Files
wow20/_bmad-output/implementation-artifacts/spec-3-13-epic-3-verifikations-und-abnahmegate.md
T
Michael TamseandClaude 2a9fa89f8a docs: Story 3.13 Status-Sync nach Rev-3.8-Ausführung (Spec Change Log + Design Notes + Autorisierungs-Träger §0.1)
Spec-3-13:
- Neues Spec-Change-Log-Top-Eintrag: Epic-1-Remediation (Rev 3.8) +
  A/B-Umfangs-Entscheidung (b) ausgeführt (24/26 NON_AT CREATE-getrieben;
  Minimal-Änderungssatz: (1) CREATE-Kern aus A/B-Fixture, (2) log.md-Pin).
- Design Notes: Allowance-Zeile auf alpha-UPDATE-Witness (raw/alpha-v2.md#S-3)
  umgestellt; Fixture-Beschreibung = 3-12-Muster OHNE CREATE-Kandidat
  (D-3.13-6 Option 2; index/gamma unverändert, IDX_ADDED=0).
- Frozen-Block L12-51 + GENERATED_AT_AUSNAHME-Zeile UNBERÜHRT (diff-geprüft).

Autorisierungs-Träger (compiler-revision-3-8-...):
- §0.1 Ausführungsstatus: B2 (log-Pin) + A/B-Umfang (b) = ANGEWENDET (Rev 3.8,
  Commit 7c3c19b); B1 (Slug) = offener Defer/Ask-First-Kandidat; C (Body-Byte)
  = zurückgewiesen (FR-2-Verstoß). Original-Entwurfstext als historische
  Entscheidungsgrundlage erhalten.

Status: Story 3.13 bleibt in-progress; finaler done-Flip + Review-Loop-2
erfolgen nach grünem Re-Run #6 (Step-05-Status-Sync).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 06:04:04 +02:00

201 lines
56 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: 'in-progress'
baseline_commit: 'c234fc361e006043c3c972cc03211b52998c2ddb'
review_loop_iteration: 1
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/` — 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. `<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)._
## 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): `- <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), 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)