20 KiB
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 |
0 |
|
Intent
Problem: Epic 3 gilt erst als abgeschlossen, wenn ein reales, reproduzierbares Source→Compilation→Wiki-Abnahmegate es qualifiziert (epic-3-context Z. 7, Z. 46, Z. 52; AD-5/AD-6/AD-13/AD-17a/b/d–h, A0-12/13/15/16/19). Die 12 verankerten Sandbox-Suiten (3-1..3-12) beweisen die Einzel-Mechaniken jeweils isoliert in /tmp-Mini-Bundles; die cross-cutting-Abnahmeebene fehlt: kein einziges Kommando führt alle Epic-3-Szenarien fail-fast aus, der vollständige autorisierte Validator (schema/validator.md Rev 9) wird bisher nur human-mechanisch über wiki/ gestellt (kein ausführbares Verfahren, D-3), die „zwei frische Agent-Kontexte"-Zwei-Run-Bestätigung ist ausdrücklich nur mechanisch simuliert (Subshells, spec-3-8 P-5 / compiler.md Z. 374 — der echte Nachweis ist dem 3.13-Gate vorbehalten), und der Epic-5-Abhängigkeits-Smoke (FR-15/16) plus Porcelain-Unverändertheit (git status --porcelain) eines Clean-Checkouts wurden nie als Gate geprüft.
Approach: Ein einziges, re-executierbares, fail-fast ausführbares Gate-Skript _bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh orchestriert die vollständige Epic-3-Abnahme: (a) Repo-Weiter Bausatz: alle 12 Sandbox-run-sandbox.sh als Sub-Runs nacheinander, jede Assertion hart, jede Abweichung = Non-Zero-Exit; (b) echte vollständige Validator-Integration — ein frisch gestarteter Agent-Kontext liest schema/validator.md (Rev 9, 14 Punkte + §6-Fachprüfungen) und stellt ein Verdikt SUCCESS/FAIL <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.shaus Repo-Root). Es läuft ausschließlich als/tmp-Kopie des realen Clone-Baums (koppeltgit clone/git worktree add+ Bundle-Kopie), greift nie auf den Ist-Baum zu und hinterlässt den Ist-Baumgit status --porcelain-unverändert (G-8). - Kein
sed -i: alle Mutationen im Gate-Skript übercp/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 realenraw/-Baums + Zuwachs dort), nie als Mutation im realenraw/.- 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 echteswiki/-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 PASS, Story bleibt offen; Bedarf einer Epic-1-Remediation wird textuell benannt | Non-Zero-Exit, kein Gate-Flip |
| FRESH_AGENT_TWO_TREES | zwei getrennte Arbeitskopien, gleicher $BASE-Commit |
beide Runs beenden; git diff A B zeigt nur at-Abweichung; Bundle-Hashes/Reihenfolge/Plan A==B (außer at) |
Divergenz außerhalb Ausnahme = harter FAIL |
| PERTURBIERTE_ENTSCHEIDUNG | eine der zwei Runs wird im Script über eine perturbed Option geroutet | Negativ-Kontrolle: divergente Bäume werden erkannt (G-6) | Non-Zero-Exit, kein false-PASS |
| PORCELAIN_CLEAN | nach dem Lauf | git status --porcelain --untracked-files=no auf dem Ist-Baum leer |
überszogene Gate-Artefakte = Non-Zero |
| CONSUMER_SMOKE | nur das erzeugte Bundle | FR-15/16-Fragen ohne Planungs-Referenzen beantwortbar (G-7) | Referenz auf PRD/Spec/Spine = Non-Zero |
| GENERATED_AT_AUSNAHME | die einzige erlaubte Differenz | generated.at/verified[].at-Zellen dürfen abweichen |
andere Zellen abweichend = Non-Zero |
Code Map
_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh— neu erzeugt (re-executierbar, Mustersandbox-3-12/run-sandbox.sh820 Z. +sandbox-3-8Zwei-Worktree-Mechanik Z. 249-251/268/281-306/415-433;set -u, keinset -e— negatives Assertion-Idiomcmd && 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-Listesandbox-3-1..3-12,git status --porcelain-Pre-Check; (B) Käfig-Bau —/tmp-Kopie des realen Clone-Baums (liest allewiki/**/*.md-Dateiliste, kopiertschema/raw/…),git init+baseline; (C) 12 Sandbox-Sub-Runs — jebash …/sandbox-3-N/run-sandbox.shmit Exit-Check; (D) Validator-Agent — frischen Sub-Agent-Kontext starten, derschema/validator.mdüber allewiki/-Dateien ausführt undverdict-*.md-Dateien (SUCCESS/FAIL-Format) ablegt; (E) Zwei-frische-Agenten — zwei/tmp-Arbeitskopien (G-Kontext), shared$BASE-Fixture-ROH-Zuwachsraw/alpha-v2.md+Zielwiki/alpha.mdcommittet, beide Runs aufgit 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 derpass()/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): Key3-13-epic-3-verifikations-und-abnahmegatebacklog → done(final);epic-3bleibt solangein-progress;last_updated(FormatMM-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:
_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-Baumschema/compiler.md/schema/validator.md/adapters//raw/— read-only verifizieren (kein Diff),schema/canonical-terms.mdunangetastet (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-3Status-Kette prüfen,last_updatedaktualisieren (Step-05 nach Review)_bmad-output/implementation-artifacts/epic-3-context.md— Abnahme-Zeile auf Ist-Zustand nachführenwiki/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 --porcelaindes 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 -ireproduzierbar, arbeitet ausschließlich in temporären Repositories und hinterlässtgit status --porcelainunverändert (AC-2). - Given positive und negative OKF-Fixtures, when validiert wird, then wird der vollständige Vertrag aus
schema/validator.mdüber allewiki/-Dateien ausgeführt; unter anderem fehlendesgenerated.by, kalenderinvalidesgenerated.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.mdausfü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-…aufdonegeflippt und Epic 3 erst nach bestandenem Gate unddonealler Stories 3.8..3.13 aufdonegesetzt; bis dahin bleibt Epic 3in-progress(AC-9).
Spec Change Log
Leer bis zum ersten bad_spec-Loopback (Step-04).
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:
git diff --stat "$ROOT/wt-a" "$ROOT/wt-b" -- wiki/ # ≠ leer (nicht-vakuum), at-only
Die repräsentative Fixture nimmt das 3-12-Sandbox-Muster (Mini-Bundle wiki/index.md+alpha.md+log.md, raw/alpha-v1.md als Baseline, Zuwachs raw/alpha-v2.md → Update von alpha.md, ergänzt um Bereichs-Synthese/gamma und wiki/-bleibt-Byte-identisch für unabhängiges delta) — in den /tmp-Käfig kopiert und committet, nie das reale Bundle.
Verification
Commands:
bash _bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh-- expected: 12 Sandbox-Sub-Runs (jedeexit 0), Validator-Integration, Zwei-frische-Agenten A/B-Identität (nurat-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: keinesed -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/nurat-Zellen, Negativ-Kontrolle perturbed.run-sandbox.sh -
Validator-Integration (AC-3/AC-4): frischer Agent-Kontext führt
schema/validator.mdüber allewiki/-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-Abschlussin-progress.sprint-status.yaml