Files
wow20/_bmad-output/implementation-artifacts/spec-3-13-epic-3-verifikations-und-abnahmegate.md
T

64 KiB
Raw Blame History

title, type, created, status, baseline_commit, review_loop_iteration, context
title type created status baseline_commit review_loop_iteration context
Story 3.13 — Epic-3-Verifikations- und Abnahmegate feature 2026-08-22 in-progress c234fc361e 1
_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/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

Code Map

  • _bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.shneu 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.shread-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.shread-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.mdread-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.mdappend, 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.yamlmutiert 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.mdmutiert („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.mdappend (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:

  • _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
  • 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)
  • _bmad-output/implementation-artifacts/epic-3-context.md — Abnahme-Zeile auf Ist-Zustand nachführen
  • 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)
  • 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):

  • [Review][Decision] D-3.13-1: Agent-Prompt hard-codiert erwartete Plan-/Entscheidungs-/Receipt-/Log-LiteraleAGENT_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).
  • [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).
  • [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.
  • [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).
  • [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.
  • [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).
  • [Review][Decision] D-3.13-7: Status-Flip done geht dem konvergierten Review voransprint-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):

  • [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.1sandbox-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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [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]
  • [Review][Patch] P-14: Toter Code + fehlendes Cleanupcmd_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]
  • [Review][Patch] P-15: Spec-Design-Notes-Beispiel invalid + ≠leer-Pin widerspricht Implementierunggit 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):

  • [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.
  • [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

  • Re-Run #8-Befund: E.6-Feld-Dreideutigkeit (P-19) + P-18 bestätigt; C 12/12, D/D-NEG/E.1E.5 grün, A==B bis at (2026-08-24): Vierter Voll-Lauf des gehärteten Gates (ausschließlich /tmp-Käfig, fail-fast). Erstmals erreicht und grün: C 12/12 Sub-Runs (3.13.12, je exit 0), D 4/4 SUCCESS (frischer Validator: D.4 exakt-ein-Verdikt, D.6 0 FAIL über Käfig-Bundle), D-NEG 3×FAIL + 1×SUCCESS (neg-1 fehlendes type, neg-2 okf_version außerhalb Bundleroot, neg-3 at: 2026-02-31; Positiv-Kontrolle SUCCESS), E.1E.5 (Fixture $BASE=f396f8f5…, Worktrees, beide Agent-Läufe RUN_DONE; E.4 NON_AT=0 AT=2 — Rev 3.8 zum dritten Mal unter echten frischen LLMs bestätigt; E.5 Multi-Beleg-Witness raw/alpha-v2.md#S-3 in A und B; E.7/E.8/E.9 nicht erreicht). P-18 bestätigt: beide Agent-Läufe lieferten den Run-Receipt (5/5 Receipts über 4 Läufe — die #7-„fehlt"-Klasse ist adhärent aufgelöst). Rot an E.6 (dritte Befund-Klasse im selben Abschnitt): (1) sources_added divergiert A/B (A leer, B raw/alpha-v2.md) — die Prompt-Wortung „neue raw/-Ressourcen oder leer" ist dreideutig (neue raw/-Dateien / neu verbrauchte Evidenz / neue Frontmatter-sources:-Listeneinträge); die drei Lesarten liefern unterschiedliche Werte → echte Prompt-Definitionslücke in einem Gate-als-deterministisch-erklärten Feld (kein Flake: A und B haben beide einer Lesart konsistent gefolgt); (2) baseline zeigt A==B 143f7faf… (Phase-B-Käfig-Baseline „Käfig-Baseline") statt f396f8f5… (Worktree-Vor-Mutation-HEAD „Käfig-Fixture: Baseline inkl. Zuwachs") — der Prompt-Wortlaut „SHA des Baseline-Commits" ist objektiv mehrdeutig (zwei Commits mit „Baseline" in der Betreffzeile im Worktree-Log) und benennt nicht den Commit, auf dem der Run läuft. P-19 (Gate-Prompt-Präzisierung, A-B-Optionen wie P-17/P-18): baseline = git rev-parse HEAD des Worktree vor der ersten Mutation; sources_added = resource:-Werte (Pfad) der raw/-Ressourcen, die der Lauf der Frontmatter-sources:-Liste der mutierten Concepts neu gegenüber dem Vor-Mutation-Zustand hinzufügt, lexikografisch sortiert (beide Felder damit REINE FUNKTIONEN der Lauf-Eingaben — für die UPDATE-only-Fixture ergibt A und B jeweils raw/alpha-v2.md; die A==B-Identität ist über E.4 beweisbar, da die sources:-Liste Teil des byte-identischen Bundle-State ist); decision bleibt freie Prosa (Befund-Äquivalenz, Re-Run-#6-Klassifizierung). E.6-Assertion UNVERÄNDERT (A==B byte-identisch über die drei Felder + decision nicht-leer) — geändert ist die Feld-Semantik im Prompt, nicht der Check; kein AC-4-Fall (compiler.md definiert den Receipt nicht — 0 Treffer; keine Schema-Semantik geändert), kein frozen-Block-Change, D-1/D-2/D-3.13-2-Option-1 respektiert. Nächster Schritt: Re-Run #9 (Erwartung: E.6 grün + F (G-1..G-8) + G (Porcelain) erstmals erreicht). Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt: git status --porcelain -- wiki/ zeigt ausschließlich wiki/log.md (dieser Eintrag); AD-3 read-only (schema/validator.md/schema/wiki-compiler.md/schema/compiler.md/adapters//raw//schema/canonical-terms.md unverändert); kein Standalone (D-3), keine neue §7-Invaliditätsklasse, keine Vertragsänderung; Epic-3-Abnahme (Story 3.13) bleibt offen (epic-3 in-progress).
  • Re-Run #7-Befund: fehlender Agent-B-Receipt (P-18) (2026-08-24):

Re-Run #7-Befund: fehlender Agent-B-Receipt (P-18: Prompt-Adhärenz-Härtung) (2026-08-24): Re-Run #7 (Hintergrund, ~2,5 h) lief grün bis E.6 — E.4 erneut GRÜN (NON_AT=0 AT=2, doppelte Bestätigung der Rev-3.8-Remediation unter echten frischen LLMs), C/D/D-NEG/E.5/E.7-Vorgaben grün — und brach an E.6 mit neuer Ursache: run-receipt.txt B fehlt/leer (Agent A lieferte den Receipt, Agent B nicht — B's wiki/-Mutationen waren vollständig, E.5-Witness grün, RUN_DONE b vorhanden → Agent B behandelte den Receipt als optional). Gate-Verhalten korrekt (fehlender Nachweis = kein stilles Grün, HARD-FAIL — die E.6-Härtung aus Re-Run #6 hat ihre Eigenschaft bewahrt: sie prüft nur, wenn der Receipt existiert). Klassifikation: LLM-Prompt-Adhärenz-Flake, kein Gate-Logik-Fehler, kein Schema-Defizit (3/4 Receipts in #6/#7 geschrieben). Wurzelursache: der Prompt hatte den Receipt „EXAKT nach den Konventionen von schema/compiler.md" zugeordnet — compiler.md definiert ihn aber nicht (0 Treffer „receipt") und der Prompt erklärt compiler.md zur einzigen normativen Instruktion → der Agent kann den Receipt als außerhalb-des-Vertrags/optional deuten (gleiche Klasse wie P-17 Prompt-Wortungs-Präzisierung). Ausgeführte P-18-Härtung (run-sandbox.sh AGENT_PROMPT, bash -n clean; kein compiler.md-/frozen-Block-Change; D-1-konform — exakte Feldstruktur ≠ erwartete Werte): der Receipt wird im Prompt als expliziter, verpflichtender Gate-Reporting-Lieferant von compiler.md entkoppelt („GATE-spezifische Berichtsdatei, die schema/compiler.md NICHT definiert"), beide Lieferungen (wiki/-Mutationen + run-receipt.txt) sind PFLICHT, RUN_DONE ist erst nach Vorliegen beider Lieferungen erlaubt; exakte 4-Feld-Form bleibt (Feldnamen exakt, Werte frei). Nicht erreicht in #7 (fail-fast an E.6): F (G-1..G-8) + G (Porcelain). Status: Story 3.13 bleibt in-progress; Re-Run #8 (Erwartung: E.6 grün + F/G erstmals) vor dem finalen done-Flip + Review-Loop-2. Stabilitäts-Beobachtung für #8: falls Agent B erneut keinen Receipt liefert, ist das ein systematischer Prompt-Adhärenz-Defekt (kein Flake) und erfordert eine breitere Instruktion (z. B. Receipt-Generierung als nummerierte Pflicht-Schritt-Liste); ein einzelner Fehl-Lauf bleibt im Flake-Korridor (empirisch 75 % Adhärenz in 4 LLM-Runs).

Re-Run #6-Befund: E.6-Over-Pin (Gate-Artefakt) + Gate-Härtung + benannter Receipt-Defer (2026-08-24): Re-Run #6 (Hintergrund-Lauf, ~2,5 h; A/B = echtes winpty-freies claude.exe, P-16-Floor 32000) lief grün bis E.6 — und bestätigt die Rev-3.8-Remediation: E.4 A/B-Bundle-Vergleich GRÜN NON_AT=0 AT=2 (alpha.md at-only; log.md/gamma.md/index.md byte-identisch), dazu D (4/4 SUCCESS), D-NEG (3×FAIL + 1×SUCCESS), C (12/12 Sub-Runs), E.5/E.7/E.8/E.9 Witness grün. Abbruch an E.6 (Run-Receipt A-vs-B): nur die decision:-Zeile divergierte (A „alpha: UPDATE (…)" vs B „wiki/alpha.md = UPDATE (…); … NO_OP; …"), während baseline/candidates/sources_added byte-identisch A==B waren — identischer Befund, freie Wortung. Klassifikation: Gate-Over-Pin, kein compiler.md-Defizit, kein AC-4-Fallschema/compiler.md definiert den Receipt nicht (0 Treffer „receipt"), der Gate-Prompt (D-1) deklariert decision selbst als frei („keine vorgegebenen Werte"); der alte E.6-Byte-Vergleich des kompletten Receipt widersprach damit dem eigenen Prompt (selbe Over-Pin-Klasse wie Re-Run #5 log.md, hier auf der Gate-Assertion-Seite). Die semantische Entscheidung ist bereits am Bundle-State bewiesen (E.4 + E.5/E.7/E.8). Ausgeführte Gate-Härtung (run-sandbox.sh E.6, bash -n clean; kein compiler.md-/frozen-Block-Change; D-2/D-1-konsistent, D-3.13-2-Option-1-Prinzip „Receipt-Vergleich, keine erwarteten Literale"): E.6 vergleicht nun nur die drei deterministischen Felder baseline/candidates/sources_added byte-identisch A==B + decision-Zeile auf Vorhandensein (nicht leer); die decision-Prosa gilt als Befund-Äquivalenz (Nicht-Wort-Identität, §5.10-Pkt-3-Prinzip). Benannter Defer (Ask-First-Kandidat, in deferred-work.md „Deferred from: Re-Run #6" D-3.13-R6-1): die Vertrags-Vollständigkeit eines byte-deterministischen Receipts (kanonische decision-Feldform) ist nicht Teil des gültigen Vertrags — übergeben an eine spätere compiler.md-Revision (Rev 3.9) oder Epic-4-Determinismus-Überarbeitung. Nicht erreicht in #6 (fail-fast an E.6): F (G-1..G-8) + G (Porcelain) — sie laufen in Re-Run #7. Status: Story 3.13 bleibt in-progress; Re-Run #7 (erwartet: E.6 grün + F/G erstmals) vor dem finalen done-Flip + Review-Loop-2. Hinweis zur Entscheidung: die E.6-Härtung (Gate-Änderungsfläche, „was gilt als bestanden") wurde nach der E.4-Grünmeldung als Gate-Härtung + Defer-Notiz ausgeführt — die kleinste, ehrliche, vertragskonforme Variante, konsistent mit dem bereits autorisierten Muster (D-3.13-6 Option 2, Rev-3.8-Präzedenz); eine breitere compiler.md-Rev-3.9-Pinning-Alternative wurde als Defer dokumentiert, nicht als stille Gate-Semantik.

Epic-1-Remediation (Rev 3.8) + A/B-Umfangs-Entscheidung (b) ausgeführt (2026-08-23, Nutzer-Autorisierung „continue" — superset des „Empfehlung (b)"-Vorschlags aus der E.4-Befund-Raffinierung; die „keine der Optionen wurde gewählt"-Zustandsmeldung dieses Logs ist damit obsolet): Nach exakter Zeilen-Nachzähl des Re-Run-#5-Befunds (NON_AT=26 AT=4) bestätigt: 24/26 (92%) der NON_AT-Abweichungen sind CREATE-/Slug-getrieben (wiki/beta.md 11 + wiki/quanten-observatorium-kanal.md 11 + wiki/index.md 2 — Git-Rename-Semantik zählt die content-identischen Frontmatter-Zeilen doppelt, weil die Dateinamen divergieren), die verbleibenden 4 wiki/log.md-Zeilen = 2 CREATE-Einträge (Slug-Divergenz) + 2 freie UPDATE-Wortungen (+ Wanduhr-generated.at im Body). Daraus folgt der ausgeführte, autorisierte Minimal-Änderungssatz (beide Hälften vermeiden den frozen Block + den §5.14-Pkt-3-Vertrag):

  1. A/B-Vergleichsumfang = Empfehlung (b) der E.4-Befund-Raffinierung (D-3.13-6 Option 1 → Option 2): der CREATE-/beta-Fall wird aus der A/B-Fixture entnommen — die A/B-Prüfung (E.4) deckt damit den Update-/Erhaltungs-Kern (alpha CONFIRMING-UPDATE + gamma Erhaltung), der nachweislich byte-deterministisch ist (Re-Run #5: wiki/alpha.md byte-identisch bis auf at:). CREATE + Multi-Source-Synthese gelten über die 12 Sandbox-Sub-Runs (insb. 3-3/3-4, mechanisch gepinnt, eigene Isolation) als demostriert — AC-6 „Anlage einer neuen Wissenseinheit" gilt über diese. Gate-Änderung (sandbox-3-13/run-sandbox.sh, bash -n clean): E.1-Fixture (keine beta-Quellen mehr; keine Term-Isolation nötig), AGENT_PROMPT (beta-Fakt entfernt), E.5 (CREATE-Witness entfernt, UPDATE-alpha-Witness + Multi-Beleg bleibt), E.8 (index.md unverändert — IDX_ADDED=0/IDX_DELETED=0 — statt „+1 CREATE-Link"), Header-Kommentare; kein sed -i (AC-2). Keine NEW_CONCEPT/NEW_LEAF-Referenzen mehr; G-6 (perturbed-alpha.md-Tree + at-only-Kontrolle) bleibt gültig.
  2. schema/compiler.md Rev 3.7 → 3.8 (D-3-Instruktions-Patch, autorisiert; additive Präzisierung, kein Re-Negotiation): die kanonische, byte-deterministische log.md-Eintragsform wird fixiert, damit der log.md-Body dem Determinismus-Vertrag §5.14/AD-17h (Zwei-Run-Byte-Identität außerhalb der at-Ausnahme) genügt — die bisherige Eintragspflicht (ohne Wort-Pin) erlaubte freien Zusatztext + Wanduhr-at im Body, jede Freiheit = NON_AT-Differenz = AD-16-Klassifikationsdefekt. Gepinnt in §5.9 Pkt. 4 (Update), §5.1 Pkt. 4 (Anlage), §5.10 Pkt. 7 (Synthese-Anlage): - <Operation>: <concept> (<quellen>; Baseline <Baseline-Commit>) mit lexikografisch (LC_ALL=C) sortierten, per + getrennten Quellen + vollem SHA, keinem freien Zusatztext, keinem Wanduhr-Wert im Body (Wanduhr lebt ausschließlich im Frontmatter-generated.at, §5.14 Pkt. 3). Die Form ist genau die, die die Sub-Runs 3-3/3-4 mechanisch bereits demonstrieren (Ist-Behaviour verankert, kein Widerspruch). Nicht geändert: §5.14 Pkt. 3 (die at-Ausnahme bleibt die generated.at/verified[].at-Feldwerte — das log.md-Body-Wanduhr-Verbot ist eine Folge davon, keine Änderung der Ausnahme-Menge), §5.10 Pkt. 3 (CREATE-/Synthese-Body-Wortung bleibt „Befund-Äquivalenz, nicht Wort-Identität" — der Pin betrifft nur den log.md-Eintrag, nicht den Concept-Body), §5.1 Pkt. 2 (FR-2 „eigenständig formuliert" — der Body bleibt eigenständig), die Regeltexte oberhalb der Pins (textuell unverändert). Q1-Item-2 „CREATE-Body byte-deterministisch" ist NICHT ausgeführt (Option (c) = FR-2-Verstoß; bewusst zurückgewiesen). Q1-Item-1 „CREATE-Slug-Signal pinning" ist NICHT ausgeführt — als offener Defer / Ask-First-Kandidat dokumentiert (in compiler.md Rev 3.8 benannt); der Slug-Mechanismus (§5.15 Pkt. 1 Dateiname→Term, §5.7) bleibt wie ist, da der CREATE-Fall nicht mehr in der A/B-Fixture steht. §8 Revisionslog Rev 3.8-Eintrag. git status-Impact: schema/compiler.md-Diff ist eine autorisierte Instruktions-Änderung (nicht „stille Schema-Semantik-Änderung durch das Gate" — AC-4-Defizit-Route geschlossen durch diese separat autorisierte Remediation, Präzedenz Validator-Rev-8/9).

Erwartetes E.4-Ergebnis Re-Run #6: wiki/alpha.md at-only (AT=2), wiki/log.md byte-identisch (gepinntes Template, gleiche Datumsgruppe, gleicher Baseline-SHA, kein Wanduhr-at), wiki/gamma.md/wiki/index.md unverändert → NON_AT=0 AT=2 → E.4 grün. F (G-1..G-8) + G (Porcelain) wurden in Re-Run #5 nicht erreicht (fail-fast an E.4); sie werden in Re-Run #6 ausgeführt. Status: Story 3.13 bleibt in-progress; finaler done-Flip + Review-Loop-2 erfolgen im Step-05-Status-Sync nach grünem Re-Run #6.

E.4-Befund-Raffinierung (2026-08-23, vor Remediations-Start — Prämisse-Korrektur, Entscheidung offen): Vor dem Start der autorisierten Epic-1-Remediation (Q1, „compiler.md-Patch → Re-Run #6 grün") gegen den compiler.md-Quelltext verifiziert — die Remediation allein erreicht kein Exit 0 des Gates; die Q1-Prämisse bedarf Nachverhandlung, keine der Optionen wurde gewählt, nichts wurde geändert. Quelltext-Verankerungen (Zeilen): (1) §5.14 Pkt. 3 (L375): der Zwei-Run-Vergleich lässt genau eine benannte Differenz zu (den generated.at-Wanduhr-Gap); alle übrigen Bundle-State-Bestandteile sind zwischen zwei Runs desselben Git-States byte-identisch. (2) §5.10 Pkt. 3 (L297): die CREATE-/Synthese-Body-Reihenfolge ist deterministisch gepinnt (lexikografisch nach Beleg-Anker, LC_ALL=C) — der Wortlaut ist es nicht; das Äquivalenzkriterium ist dort explizit „Befund-Äquivalenz, nicht Wort-Identität". (3) §5.1 Pkt. 2 (L84) + §5 Pkt. 3 (L34, FR-2): der Body ist „eigenständig formuliert"; „Bloße Kopie, das Einfügen großer Quellblöcke … DÜRFEN nicht erzeugt werden"; „Der Body darf keine großen Quell-Exzerpte enthalten". (4) §5.14 Pkt. 2 (L374) + spec-3-8 P-5 (L150): die 3.8-Determinismus-Bestätigung wurde mechanisch simuliert (zwei Subshell-Läufe in getrennten Worktrees desselben Skripts), nie mit echten frischen LLMs; „der Nachweis echter frischer Kontexte erfolgt im Story-3.13-Abnahmegate über reale Agent-Läufe". Konsequenz: die 3.8-Basis validiert nur den UPDATE-Pfad (nachweislich A/B-byte-identisch bis auf at: — Run A wiki/alpha.md, Re-Run #5) — und zwar per Simulation, wo der „Producer" deterministische Skriptlogik ist und Byte-Identität trivial gilt. Der CREATE-Pfad ist erstmals unter echten frischen LLMs (E.4) ausgesetzt: dort verlangt FR-2 freien, eigenständig formulierten Wortlaut, während §5.14 Pkt. 3 Byte-Identität fordert — eine latente Vertrags-Spannung (in 3.8 durch die Simulation verdeckt, in 3.13/E.4 aufgedeckt), kein bloßes Instruktions-Defizit und kein Validator-Defizit in der engen AC-4-Lesart. Zweiteilung des Befunds: der Slug-Teil (raw-Dateinamen-Stamm „beta" vs. Inhalts-Term „quanten-observatorium-kanal"; §5.15 Pkt. 1 L383 „dieser kollabierte, lowercasene Dateiname ist der primäre Term") ist legitim per compiler.md-Patch auflösbar (Inhalts-Term maßgeblich — Design-Notes-L150-Intention, kein FR-2-Verstoß); der Body-Byte-Teil ist es nicht innerhalb des gültigen Vertrags — ein Byte-Pin des CREATE-Body widerspricht FR-2/NFR-2/§5.10 Pkt. 3 („nicht Wort-Identität") direkt und wäre ein Semantik-Change, kein Bugfix. Status: Remediation (compiler.md), 12-Sandbox-Re-Execution und Re-Run #6 gehalten — alle drei hängen an der A/B-Vergleichsumfangs-Entscheidung (frozen I/O-Matrix-Zeile GENERATED_AT_AUSNAHME, L49; frozen-Block nur mit menschlicher Bestätigung änderbar, Ask-First). Offene Entscheidung (Prämisse-Korrektur zu Q1), drei Wege zu einem grünen, ehrlichen Re-Run #6: (a) A/B-Vergleich auf freier CREATE-Synthese auf die Wissens-Ebene nachverhandeln (Zielpfad/Slug, Frontmatter, sources, Index-Link, Provenanz-Anker, Claim-Abdeckung byte-identisch; freier Body-Wortlaut als zweite benannte Ausnahme-Klasse neben at per Claim-/Provenienz-Abdeckung, nicht byte-weise) + Slug-Patch — frozen-Block-Änderung (Ask-First), vertragskonsistent mit der „Wissen ist deterministisch, LLM-Oberfläche nicht"-Prämisse. (b) CREATE aus der A/B-Fixture nehmen (D-3.13-6 Option 1 → Option 2; A/B prüft nur den nachweislich byte-deterministischen UPDATE-Pfad; CREATE + Multi-Source-Synthese bleiben über Sandbox-Sub-Runs 3-3/3-4 in eigener Isolation belegt, AC-6 „Anlage neuer Wissenseinheit" gilt über diese) — vertragskonform, frozen-Block unangetastet, kleinster ehrlicher Pfad. (c) substanzieller compiler.md-Change (CREATE-Body auf kanonische, aus raw/ mechanisch abgeleitete Form pinnen) — erreicht Byte-Determinismus, aber bricht vmtl. FR-2; eigener, breiterer Autorisations-Runde würdig. Empfehlung: (b) — kleinster, vertragskonformer, ehrlicher Pfad zu grünem Re-Run #6 ohne frozen-Block-Verletzung und ohne stille FR-2-Verletzung; der CREATE-Byte-Identitäts-Fall (mit den obigen Verankerungen) wird als benannter Defer an eine spätere Vertrags-Revision/Epic-4-Determinismus-Überarbeitung übergeben. Keine Schema-/Gate-/Fixture-/frozen-Block-Änderung durch diese Notiz — sie dokumentiert nur den Befund, die Verankerungen und die Entscheidungsbasis.

Nutzer-Entscheidungen Re-Run-#5-Nachbearbeitung (2026-08-23, ProMods-Response auf den E.4-Befund): (1) AC-4-Auflösung = autorisierte Epic-1-Remediationschema/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=4HARD-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):

# 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

  • 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

  • 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

  • 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

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

  • Abnahme-Zeile von „…als abgeschlossen…Zwei-frische-Agenten-Kontexte…" auf Ist-Zustand nachgeführt. 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

  • Key 3-13 → done (final, nach Review), Epic-3 bleibt bis zum Gate-Abschluss in-progress. sprint-status.yaml