fix: Story 3.13 Review-Loop-1-Auflösung (D-3.13-1..7 = 1/1/2/1/1/1/1, P-1..P-15; Status-Revert in-progress, Gate gehärtet 839 Z., Status-Sync spec/sprint-status/log.md; VALIDATOR_DEFIZIT-Matrix-Zeile = Renegotiation-Kandidat)

This commit is contained in:
Michael Tamse
2026-08-23 08:51:34 +02:00
parent 894ae346ab
commit 50f3628df4
6 changed files with 784 additions and 609 deletions
@@ -648,3 +648,9 @@ Der Epic-3-Abnahmegate-Lauf (`_bmad-output/implementation-artifacts/sandbox-3-13
- **DF1 — AC-3-`git stash push`-Variante + kombiniertes AC-5** (Story-3.12-Defer, Z. 633; Home: Sandbox-Härtung / Story-3.13-Abnahme-Gate) — aufgegriffen (Gate-Route): Das 3.13-Gate re-ausführt sandbox-3-12 L-1..L-9 (inkl. Scratch-Zone-/Restore-Klasse und Clean-Input-Guard) als Sub-Run im Gesamtabnahmekontext; die zusätzliche native `git stash`-Alternativ-Variante und die wanduhr-gekoppelte Kombination bleiben als Rest-Term der Sandbox-Härtung benannt (keine neue §-Semantik, keine Instruktions-/Validator-Änderung, AD-3). - **DF1 — AC-3-`git stash push`-Variante + kombiniertes AC-5** (Story-3.12-Defer, Z. 633; Home: Sandbox-Härtung / Story-3.13-Abnahme-Gate) — aufgegriffen (Gate-Route): Das 3.13-Gate re-ausführt sandbox-3-12 L-1..L-9 (inkl. Scratch-Zone-/Restore-Klasse und Clean-Input-Guard) als Sub-Run im Gesamtabnahmekontext; die zusätzliche native `git stash`-Alternativ-Variante und die wanduhr-gekoppelte Kombination bleiben als Rest-Term der Sandbox-Härtung benannt (keine neue §-Semantik, keine Instruktions-/Validator-Änderung, AD-3).
- status: aufgegriffen (Home „Story-3.13-Abnahme" realisiert durch die echten Abnahmegate-Runs; Original-Defer-Blöcke unverändert; jeweils benannte Rest-Terme der weiterführenden Sandbox-Härtung bleiben offen — kein Instruktions-/Validator-Defekt, A0-20-konform) - status: aufgegriffen (Home „Story-3.13-Abnahme" realisiert durch die echten Abnahmegate-Runs; Original-Defer-Blöcke unverändert; jeweils benannte Rest-Terme der weiterführenden Sandbox-Härtung bleiben offen — kein Instruktions-/Validator-Defekt, A0-20-konform)
## Deferred from: code review of spec-3-13-epic-3-verifikations-und-abnahmegate (2026-08-22)
- W-1 — Timeout-Budgets (2700 s pro Agent-Lauf) an der Grenze zu beobachteten Agent-Laufzeiten (Skript-Kommentar dokumentiert empirisch A:~30 min, B: >35 min): Laufzeit-Variation ist Modell-/Token-Latenz, kein deterministischer Defekt; kein A0-20-Verstoß (Timeout ist Laufzeit-Schutz, keine Wanduhr-Steuerung). Home: Sandbox-Härtung (Budget-Observation bei Folge-Läufen).
- W-2 — `PASS_COUNT`-Beleg-Zahl ist loop-basiert (12 Referenz-Sandbox-Existenz-PASS + 7 wiki-Datei-Verdikt-PASS + fix) und driftet design-immanent bei Bundle-/Referenzwachstum: Beleg-Zahl in log.md/sprint-status/epic-3-context ist Lauf-Momentaufnahme, keine stabile Invariante; Beleg-Formulierung (kumulative vs. pro-Sektion-Zählung) wird im Review-Patch P-12 geklärt; keine Gate-Semantik-Folge. Home: Sandbox-Kosmetik (nächste Sandbox-Härtung).
@@ -1,6 +1,8 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Story 3.1 — Sandbox-Edge-Tests der I/O-Matrix (fünf Szenarien) + D-3-Abbruch-Kontrolle # Story 3.1 — Sandbox-Edge-Tests der I/O-Matrix (fünf Szenarien) + D-3-Abbruch-Kontrolle
# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb31) # Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb31)
# Review-Loop-2-Härtung (Story 3.13, D/Patch P-1): harte Assertions mit Exit-Pfaden —
# jede Erwartung wird geassertet (Abweichung = Non-Zero-Exit), konsistent mit 3-2..3-12.
set -u set -u
ROOT=$(mktemp -d /tmp/sb31-XXXXXX) ROOT=$(mktemp -d /tmp/sb31-XXXXXX)
SB="$ROOT/sb" SB="$ROOT/sb"
@@ -9,6 +11,12 @@ cd "$SB"
git init -q git init -q
git config user.email "sandbox@test" git config user.email "sandbox@test"
git config user.name "Sandbox" git config user.name "Sandbox"
FAILED=0
PASS_COUNT=0
pass() { PASS_COUNT=$((PASS_COUNT+1)); echo "PASS: $1"; }
fail() { FAILED=$((FAILED+1)); echo "FAIL: $1" >&2; }
# hardfail: Setup-/Infrastrukturfehler brchen sofort ab (kein Szenario-Exit).
hardfail() { echo "HARD-FAIL: $1" >&2; exit 1; }
# ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ---------- # ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ----------
cat > wiki/index.md <<'EOF' cat > wiki/index.md <<'EOF'
@@ -50,8 +58,9 @@ cat > raw/beta-v1.md <<'EOF'
Evidenz v1: Beta-Thema (Stelle S-1). Evidenz v1: Beta-Thema (Stelle S-1).
EOF EOF
git add -A git add -A
git commit -qm "Baseline" git commit -qm "Baseline" || hardfail "Baseline-Commit fehlgeschlagen"
BASE=$(git rev-parse HEAD) BASE=$(git rev-parse HEAD)
[ -n "$BASE" ] || hardfail "Baseline-Commit nicht auflösbar"
echo "BASELINE-COMMIT: $BASE" echo "BASELINE-COMMIT: $BASE"
echo echo
runlabel() { echo; echo "########## $1 ##########"; } runlabel() { echo; echo "########## $1 ##########"; }
@@ -61,6 +70,12 @@ isolate() { git checkout -q -b "$1" "$BASE" 2>/dev/null || git checkout -q "$1";
probe() { # Pkt. 5-Probe (D-1-Form): Baseline-Diff + porcelain, normalisiert (wiki/-Praefix + .md gestrippt) probe() { # Pkt. 5-Probe (D-1-Form): Baseline-Diff + porcelain, normalisiert (wiki/-Praefix + .md gestrippt)
{ git diff --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } | sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u { git diff --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } | sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u
} }
# expect_eq: $1=Beschreibung, $2=erwartet, $3=ist (jeweils mehrzeilig)
expect_eq() {
if [ "$2" = "$3" ]; then pass "$1"; else
fail "$1 — erwartet: [$2], ist: [$3]"
fi
}
# ===================================================================== # =====================================================================
runlabel "S1: HAPPY_PATH_UPDATE (bestehendes Concept wird im bestehenden Pfad aktualisiert)" runlabel "S1: HAPPY_PATH_UPDATE (bestehendes Concept wird im bestehenden Pfad aktualisiert)"
@@ -68,7 +83,7 @@ runlabel "S1: HAPPY_PATH_UPDATE (bestehendes Concept wird im bestehenden Pfad ak
cat > raw/alpha-v2.md <<'EOF' cat > raw/alpha-v2.md <<'EOF'
Evidenz v2: quanten-protocol-schlüssel erfaehrt eine Rotation (Stelle S-2). Evidenz v2: quanten-protocol-schlüssel erfaehrt eine Rotation (Stelle S-2).
EOF EOF
git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" git add -A; git commit -qm "Zuwachs raw/alpha-v2.md" || hardfail "Zuwachs-Commit fehlgeschlagen"
# Reconcile: Kandidatenliste (textuell-deterministisch, AD-13) # Reconcile: Kandidatenliste (textuell-deterministisch, AD-13)
echo "--- Kandidaten-Erhebung: rg -l 'quanten-protocol-schlüssel' wiki/ ---" echo "--- Kandidaten-Erhebung: rg -l 'quanten-protocol-schlüssel' wiki/ ---"
RG -l 'quanten-protocol-schlüssel' wiki/ || true RG -l 'quanten-protocol-schlüssel' wiki/ || true
@@ -81,11 +96,17 @@ cat >> wiki/log.md <<EOF
- Story 3.1-Update: alpha (raw/alpha-v2.md; Baseline $BASE) - Story 3.1-Update: alpha (raw/alpha-v2.md; Baseline $BASE)
EOF EOF
echo "--- Probe (git diff --name-only <BASE> -- wiki/ + git status --porcelain -- wiki/, normalisiert) ---" echo "--- Probe (git diff --name-only <BASE> -- wiki/ + git status --porcelain -- wiki/, normalisiert) ---"
probe S1_PROBE=$(probe)
echo "--- Erwartet: log, alpha (betroffen); beta NICHT; keine neue Datei (porcelain o.??) ---" echo "$S1_PROBE"
git status --porcelain -- wiki/ expect_eq "S1 Probe: genau alpha + log betroffen, beta NICHT" "$(printf 'alpha\nlog')" "$S1_PROBE"
echo "--- Duplikat-Check: existiert alpha.md weiterhin exakt 1x? ---" # Keine neue Datei (Duplikat-Kontrolle): kein ?? unter wiki/
ls wiki/alpha.md; git status --porcelain -- wiki/ | grep -c '^??' || echo "0 untracked" S1_UNTRACKED=$(git status --porcelain -- wiki/ | grep -c '^??' || true)
[ "$S1_UNTRACKED" -eq 0 ] && pass "S1 keine neue Datei unter wiki/ (kein Duplikat)" \
|| fail "S1 unerwartete untracked wiki/-Datei(en): $S1_UNTRACKED"
# alpha.md existiert exakt 1x
S1_ALPHA_COUNT=$(git ls-files wiki/alpha.md | wc -l | tr -d ' ')
[ "$S1_ALPHA_COUNT" -eq 1 ] && pass "S1 alpha.md ist exakt 1x getrackt" \
|| fail "S1 alpha.md getrackt: $S1_ALPHA_COUNT (erwartet 1)"
# ===================================================================== # =====================================================================
runlabel "S2: UNTOUCHED_CONCEPT (neue Evidenz betrifft kein bestehendes Concept)" runlabel "S2: UNTOUCHED_CONCEPT (neue Evidenz betrifft kein bestehendes Concept)"
@@ -96,10 +117,13 @@ EOF
git add -A; git commit -qm "Zuwachs raw/gamma.md" git add -A; git commit -qm "Zuwachs raw/gamma.md"
echo "--- Kandidaten-Erhebung: rg -l 'gamma-observatorium-thema' wiki/ ---" echo "--- Kandidaten-Erhebung: rg -l 'gamma-observatorium-thema' wiki/ ---"
RG -l 'gamma-observatorium-thema' wiki/ || echo "(leer — kein Kandidat)" RG -l 'gamma-observatorium-thema' wiki/ || echo "(leer — kein Kandidat)"
echo "--- Folge: keine Mutation, kein log.md-Zusatz (UNTOUCHED_CONCEPT) ---" # Folge: keine Mutation, kein log.md-Zusatz (UNTOUCHED_CONCEPT)
echo "--- Probe ---" S2_PROBE=$(probe)
probe echo "--- Probe: [$S2_PROBE] ---"
echo "(leere Ausgabe = kein Ghost-Diff; leere Menge ist Teilmenge jeder erlaubten Menge)" expect_eq "S2 Probe: leer (kein Ghost-Diff, UNTOUCHED_CONCEPT)" "" "$S2_PROBE"
S2_LOG_DIFF=$(git diff "$BASE" -- wiki/log.md | wc -l | tr -d ' ')
[ "$S2_LOG_DIFF" -eq 0 ] && pass "S2 log.md unverändert (kein Eintrag ohne Kandidat)" \
|| fail "S2 log.md mutierte ohne Kandidat (S2_LOG_DIFF=$S2_LOG_DIFF)"
# ===================================================================== # =====================================================================
runlabel "S3: CONCEPT_COLLISION_BESTEHEND (Zielpfad belegt -> Update-Routing, kein Duplikat)" runlabel "S3: CONCEPT_COLLISION_BESTEHEND (Zielpfad belegt -> Update-Routing, kein Duplikat)"
@@ -109,16 +133,26 @@ Evidenz v2: quanten-protocol-schlüssel (Stelle S-2, ergaenzend).
EOF EOF
git add -A; git commit -qm "Zuwachs" git add -A; git commit -qm "Zuwachs"
echo "--- Vor-Mutation-Check: Ziel-Pfad wiki/alpha.md belegt? ---" echo "--- Vor-Mutation-Check: Ziel-Pfad wiki/alpha.md belegt? ---"
test -f wiki/alpha.md && echo "JA — Update-Routing (kein Duplikat, kein stummer Ueberschreiben)" test -f wiki/alpha.md && echo "JA — Update-Routing (kein Duplikat, kein stummer Ueberschreiben)" \
|| fail "S3 Zielpfad wiki/alpha.md nicht belegt (Szenario-Setup verletzt)"
echo "--- Vor-Mutation-Zustand (muss leer sein) ---" echo "--- Vor-Mutation-Zustand (muss leer sein) ---"
git status --porcelain -- wiki/; echo "(leer)" S3_PRE=$(git status --porcelain -- wiki/)
echo "--- Mutation im bestehenden Pfad (Update) ---" echo "$S3_PRE"
[ -z "$S3_PRE" ] && pass "S3 Vor-Mutation-Zustand leer" || fail "S3 Vor-Mutation-Zustand nicht leer: $S3_PRE"
# Mutation im bestehenden Pfad (Update)
echo "Ergaenzung (raw/alpha-v2.md#S-2)." >> wiki/alpha.md echo "Ergaenzung (raw/alpha-v2.md#S-2)." >> wiki/alpha.md
echo "## 2026-08-19" >> wiki/log.md; echo "- Story 3.1-Update: alpha (raw/alpha-v2.md)" >> wiki/log.md echo "## 2026-08-19" >> wiki/log.md; echo "- Story 3.1-Update: alpha (raw/alpha-v2.md)" >> wiki/log.md
echo "--- Nach-Mutation: nur M-Eintraege, KEIN ?? (keine neue Datei = kein Duplikat) ---" echo "--- Nach-Mutation: nur M-Eintraege, KEIN ?? (keine neue Datei = kein Duplikat) ---"
git status --porcelain -- wiki/ S3_PORC=$(git status --porcelain -- wiki/)
echo "--- Probe ---" echo "$S3_PORC"
probe S3_UNTRACKED=$(echo "$S3_PORC" | grep -c '^??' || true)
[ "$S3_UNTRACKED" -eq 0 ] && pass "S3 keine ??-Einträge (kein Duplikat)" \
|| fail "S3 unerwartete ??-Einträge: $S3_PORC"
S3_ONLY_M=$(echo "$S3_PORC" | grep -cv '^ M ' || true)
[ -n "$S3_PORC" ] && [ "$S3_ONLY_M" -eq 0 ] && pass "S3 nur M-Einträge (Update im bestehenden Pfad)" \
|| fail "S3 Porcelain enthält Einträge außerhalb ' M ' (nur-$S3_ONLY_M-Andere)"
S3_PROBE=$(probe)
expect_eq "S3 Probe: genau alpha + log" "$(printf 'alpha\nlog')" "$S3_PROBE"
# ===================================================================== # =====================================================================
runlabel "S4: CHANGE_DETECTION (R-1: nur der Zuwachs wird als Evidenz interpretiert)" runlabel "S4: CHANGE_DETECTION (R-1: nur der Zuwachs wird als Evidenz interpretiert)"
@@ -128,22 +162,35 @@ Evidenz v2: nur diese Datei ist neu (Stelle S-2).
EOF EOF
git add -A; git commit -qm "Zuwachs" git add -A; git commit -qm "Zuwachs"
echo "--- git diff --name-only <BASE> -- raw/ ---" echo "--- git diff --name-only <BASE> -- raw/ ---"
git diff --name-only "$BASE" -- raw/ S4_ADD=$(git diff --name-only "$BASE" -- raw/)
echo "--- Erwartet: AUSSCHLIESSLICH raw/alpha-v2.md (alpha-v1.md/beta-v1.md bleiben aussen) ---" echo "$S4_ADD"
expect_eq "S4 Zuwachs: ausschließlich raw/alpha-v2.md" "raw/alpha-v2.md" "$S4_ADD"
echo "--- SHA-256-Abgleich (Sekundaer-Fingerprint, D-2): alpha-v1 unveraendert? ---" echo "--- SHA-256-Abgleich (Sekundaer-Fingerprint, D-2): alpha-v1 unveraendert? ---"
sha256sum raw/alpha-v1.md S4_SHA_NOW=$(sha256sum raw/alpha-v1.md | cut -d' ' -f1)
git show "$BASE:raw/alpha-v1.md" | sha256sum S4_SHA_BASE=$(git show "$BASE:raw/alpha-v1.md" | sha256sum | cut -d' ' -f1)
echo "--- (identische Summen = unveraendert; bei Diskrepanz gewinnt git diff, D-2) ---" echo "$S4_SHA_NOW / $S4_SHA_BASE"
[ -n "$S4_SHA_NOW" ] && [ "$S4_SHA_NOW" = "$S4_SHA_BASE" ] \
&& pass "S4 raw/alpha-v1.md byte-identisch zur Baseline (Immutabilität)" \
|| fail "S4 raw/alpha-v1.md weicht von der Baseline ab ($S4_SHA_NOW != $S4_SHA_BASE)"
# ===================================================================== # =====================================================================
runlabel "S5: PRE_RUN_RECONCILE (Check-Block vor Mutation; fehlende Bundleroot -> Run-FAIL V-1)" runlabel "S5: PRE_RUN_RECONCILE (Check-Block vor Mutation; fehlende Bundleroot -> Run-FAIL V-1)"
isolate s5 isolate s5
rm wiki/index.md # Szenario-Setup: Bundleroot fehlt (simuliert, kein Run-Zustand) rm wiki/index.md # Szenario-Setup: Bundleroot fehlt (simuliert, kein Run-Zustand)
echo "--- Check-Block: (4) wiki/index.md-V-1-Vorbedingung ---" echo "--- Check-Block: (4) wiki/index.md-V-1-Vorbedingung ---"
if [ -f wiki/index.md ]; then echo "OK"; else echo "Run-FAIL (V-1, Vertrag §2): wiki/index.md fehlt — keine Mutation darf erfolgen"; fi if [ -f wiki/index.md ]; then
echo "OK"
fail "S5 V-1-Vorbedingung: wiki/index.md fehlt nicht — Szenario-Setup verletzt"
else
echo "Run-FAIL (V-1, Vertrag §2): wiki/index.md fehlt — keine Mutation darf erfolgen"
pass "S5 V-1-Check löst Run-FAIL (fehlende Bundleroot)"
fi
git checkout -q "$BASE" -- wiki/index.md # Setup-Rueckstellung (kein Run-Zustand) git checkout -q "$BASE" -- wiki/index.md # Setup-Rueckstellung (kein Run-Zustand)
echo "--- Zustand nach Abbruch + Rueckstellung (muss leer sein — der Run selbst mutierte nichts) ---" echo "--- Zustand nach Abbruch + Rueckstellung (muss leer sein — der Run selbst mutierte nichts) ---"
git status --porcelain -- wiki/; echo "(leer)" S5_PORC=$(git status --porcelain -- wiki/)
echo "$S5_PORC"
[ -z "$S5_PORC" ] && pass "S5 Zustand nach Abbruch leer (keine Mutation erfolgt)" \
|| fail "S5 Zustand nach Abbruch nicht leer: $S5_PORC"
# ===================================================================== # =====================================================================
runlabel "S6: INPUT_UNCOMMITTED (D-3: Working-Copy vs. HEAD-Check -> benannter Abbruch)" runlabel "S6: INPUT_UNCOMMITTED (D-3: Working-Copy vs. HEAD-Check -> benannter Abbruch)"
@@ -151,10 +198,22 @@ isolate s6
echo "uncommittete Zwischenstunde" >> raw/alpha-v1.md # simuliert Dirty-Tree echo "uncommittete Zwischenstunde" >> raw/alpha-v1.md # simuliert Dirty-Tree
echo "--- Check-Block: Working-Copy vs. HEAD fuer raw/ + wiki/ ---" echo "--- Check-Block: Working-Copy vs. HEAD fuer raw/ + wiki/ ---"
DIRTY=$(git status --porcelain -- raw/ wiki/) DIRTY=$(git status --porcelain -- raw/ wiki/)
if [ -z "$DIRTY" ]; then echo "OK — published/committed Input"; else if [ -z "$DIRTY" ]; then
echo "OK — published/committed Input"
fail "S6 Dirty-Tree nicht erkannt (Abbruch hätte greifen müssen)"
else
echo "Abbruch: published/committed Input erforderlich (AD-17a) — ungepublishter Zustand:" echo "Abbruch: published/committed Input erforderlich (AD-17a) — ungepublishter Zustand:"
echo "$DIRTY" echo "$DIRTY"
pass "S6 INPUT_UNCOMMITTED-Abbruch greift (benannter Abbruch, keine Mutation)"
fi fi
echo echo
echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)" echo "########## EMBEDDED-EXIT ##########"
echo "FAILED=$FAILED PASS_COUNT=$PASS_COUNT"
if [ "$FAILED" -eq 0 ]; then
echo "SANDBOX-3-1-OK"
exit 0
else
echo "SANDBOX-3-1-FAILED" >&2
exit 1
fi
File diff suppressed because it is too large Load Diff
@@ -2,9 +2,9 @@
title: 'Story 3.13 — Epic-3-Verifikations- und Abnahmegate' title: 'Story 3.13 — Epic-3-Verifikations- und Abnahmegate'
type: 'feature' type: 'feature'
created: '2026-08-22' created: '2026-08-22'
status: 'done' status: 'in-progress'
baseline_commit: 'c234fc361e006043c3c972cc03211b52998c2ddb' baseline_commit: 'c234fc361e006043c3c972cc03211b52998c2ddb'
review_loop_iteration: 0 review_loop_iteration: 1
context: context:
- '_bmad-output/implementation-artifacts/epic-3-context.md' - '_bmad-output/implementation-artifacts/epic-3-context.md'
--- ---
@@ -86,9 +86,48 @@ context:
- 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 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). - 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 ## Spec Change Log
_Leer bis zum ersten bad_spec-Loopback (Step-04)._ **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 ## Design Notes
@@ -98,11 +137,11 @@ Der Gate-Kern löst das 3.8-P-5-Defizit: die Zwei-frische-Agenten-Bestätigung l
```bash ```bash
# im Gate-Skript: Bau beider Bäume auf denselben Commit # 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" 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: # A vs B — nur die at-Zellen dürfen differieren (Commits der Worktrees als tree-ishes):
git diff --stat "$ROOT/wt-a" "$ROOT/wt-b" -- wiki/ # ≠ leer (nicht-vakuum), at-only git diff --stat "$HEAD_A" "$HEAD_B" -- wiki/ # Allowance: leer (voll konvergiert) ODER at-only; Nicht-Vakuum sichert der Witness (E.5: alpha ≠ Baseline, CREATE-Datei, Index-Link)
``` ```
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. Die repräsentative 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`), CREATE-Kandidat `raw/beta-v1.md`+`raw/beta-v2.md` (eindeutiger Term `quanten-observatorium-kanal`, kein bestehendes Concept → neue Concept-Datei mit term-geleitetem Pfad gemäß §5.15/§5.7 + Index-Link), `gamma.md`/`index.md` bleiben für unabhängiges Wissen byte-identisch bzw. um exakt eine Link-Zeile wachsen) — in den `/tmp`-Käfig gebaut und als `$BASE` committet, nie das reale Bundle.
## Verification ## Verification
@@ -29,7 +29,7 @@
# - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended)
# - Retrospective appends its action items to action_items; the status view surfaces open ones # - Retrospective appends its action items to action_items; the status view surfaces open ones
generated: 08-14-2026 00:00 generated: 08-14-2026 00:00
last_updated: 08-22-2026 19:10 last_updated: 08-23-2026
project: wow20 project: wow20
project_key: NOKEY project_key: NOKEY
tracking_system: file-system tracking_system: file-system
@@ -63,7 +63,7 @@ development_status:
3-10-inkrementelle-update-und-synthese-erhaltung-absichern: done # Story 3.10 Abschluss 2026-08-21 (bmad-code-review, 3 Layer; Patch-Kaskade, keine intent_gap/bad_spec — Sandbox E-1..E-9 nach Härtung 9/9 harte PASS/Exit 0, §5.16 Rev 3.5). Hinweis: die Epic-3-Abnahme (3.13) bleibt offen (epic-3 remains in-progress). 3-10-inkrementelle-update-und-synthese-erhaltung-absichern: done # Story 3.10 Abschluss 2026-08-21 (bmad-code-review, 3 Layer; Patch-Kaskade, keine intent_gap/bad_spec — Sandbox E-1..E-9 nach Härtung 9/9 harte PASS/Exit 0, §5.16 Rev 3.5). Hinweis: die Epic-3-Abnahme (3.13) bleibt offen (epic-3 remains in-progress).
3-11-root-scope-leasing-atomar-akquirieren: done # Story 3.11 Review-Loop-1-Abschluss 2026-08-21 (bmad-code-review, 4 Layer; D-3.11-1 „Konstruktiv + härten", D-3.11-2 „Intentionalen Mutationsversuch bauen"; 20 Patches angewendet — A-2-Sampler wirksam, A-4 Worktree-Beobachtung, A-7 MERGE_OK hart abgewiesen + Post-Merge-State + Baseline im Hold-Eintrag, §5.17 Pkt. 1/4/5-Berichtigungen; Sandbox A-1..A-8 8/8 harte PASS/Exit 0 re-executiert). Hinweis: der finale `done`-Flip ist der Step-05-Status-Sync nach konvergiertem Review-Loop (Präzedenz Story 3.7/3.8/3.9); die Epic-3-Abnahme (3.13) bleibt offen (epic-3 remains in-progress). 3-11-root-scope-leasing-atomar-akquirieren: done # Story 3.11 Review-Loop-1-Abschluss 2026-08-21 (bmad-code-review, 4 Layer; D-3.11-1 „Konstruktiv + härten", D-3.11-2 „Intentionalen Mutationsversuch bauen"; 20 Patches angewendet — A-2-Sampler wirksam, A-4 Worktree-Beobachtung, A-7 MERGE_OK hart abgewiesen + Post-Merge-State + Baseline im Hold-Eintrag, §5.17 Pkt. 1/4/5-Berichtigungen; Sandbox A-1..A-8 8/8 harte PASS/Exit 0 re-executiert). Hinweis: der finale `done`-Flip ist der Step-05-Status-Sync nach konvergiertem Review-Loop (Präzedenz Story 3.7/3.8/3.9); die Epic-3-Abnahme (3.13) bleibt offen (epic-3 remains in-progress).
3-12-lease-lifecycle-und-commit-abschluss-transaktional-schliessen: done # Story 3.12 Review-Loop-2-Abschluss 2026-08-22 (bmad-code-review, 4 Layer; D-3.12-1 Option 1 — AC-6-Grenze an log.md-Praxis, L-8-Kategorie-Hyphenate + Negativ-Kontrolle; 7 Patches — P1 scopelock_healthy()/LOCK_READ_ERROR-Propagation, P2 Release-Fehler-negativ + L-6 hart, P3 Setup-Robustheit, P4 Ghost-Diff-Probe + reg_write real, P5 Ownership-Stale + Takeover-Exactly-once, S1/S2 Sync- & Anker-Berichtigung; Sandbox L-1..L-9 9/9 harte PASS/Exit 0 re-executiert; Loop 1: atomarer Ownership-CAS im Takeover, AK-2->AC-2; §5.18 Revision 3.7). Hinweis: der finale `done`-Flip ist der Step-05-Status-Sync nach konvergiertem Review-Loop (Präzedenz Story 3.7/3.8/3.9/3.10/3.11); die Epic-3-Abnahme (3.13) bleibt offen (epic-3 remains in-progress). 3-12-lease-lifecycle-und-commit-abschluss-transaktional-schliessen: done # Story 3.12 Review-Loop-2-Abschluss 2026-08-22 (bmad-code-review, 4 Layer; D-3.12-1 Option 1 — AC-6-Grenze an log.md-Praxis, L-8-Kategorie-Hyphenate + Negativ-Kontrolle; 7 Patches — P1 scopelock_healthy()/LOCK_READ_ERROR-Propagation, P2 Release-Fehler-negativ + L-6 hart, P3 Setup-Robustheit, P4 Ghost-Diff-Probe + reg_write real, P5 Ownership-Stale + Takeover-Exactly-once, S1/S2 Sync- & Anker-Berichtigung; Sandbox L-1..L-9 9/9 harte PASS/Exit 0 re-executiert; Loop 1: atomarer Ownership-CAS im Takeover, AK-2->AC-2; §5.18 Revision 3.7). Hinweis: der finale `done`-Flip ist der Step-05-Status-Sync nach konvergiertem Review-Loop (Präzedenz Story 3.7/3.8/3.9/3.10/3.11); die Epic-3-Abnahme (3.13) bleibt offen (epic-3 remains in-progress).
3-13-epic-3-verifikations-und-abnahmegate: done # Story 3.13 Epic-3-Abnahmegate abgeschlossen 2026-08-22: run-sandbox.sh (A Setup, B Käfig-Bau, C 12 Sandbox-Sub-Runs, D Validator-Agent, E Zwei-frische-Agenten A/B, F G-1..G-8, G Porcelain) — voller Lauf PASS_COUNT=70, FAILED=0, RUN_OK/Exit 0; Validator 7/7 SUCCESS über reales Bundle; A/B byte-identisch nur at-Ausnahme (§5.14 Pkt. 2); G-6 Negativ-Kontrolle erkennt Perturbation; G-8 Ist-Baum-Porcelain leer. Aufgedeckte und behobene reale Befunde: (1) wiki/log.md:42 zitat das Literal 'type: bundle' in Prosa → Validator Punkt-9-Verletzung, bedeutungserhaltend de-literalisiert (Bundle-Compliance); (2) G-7-Smoke überstreng gegen Bundleroot-Schema-Glossar (../schema/, compiler §5.6 'andere Schicht') + log.md-Protokoll (§5.6 Pkt. 2 Log-Exclusion) → Exclusion im Gate, Smoke bleibt hart für Concept-Bodies. Epic-3 bleibt in-progress bis zur Epic-3-Retrospektive (AC-9: Epic 3 erst nach done aller Stories 3.8..3.13). 3-13-epic-3-verifikations-und-abnahmegate: in-progress # Story 3.13 Review-Loop-1-Auflösung 2026-08-23 in Arbeit (bmad-code-review, 4 Layer, 2026-08-22; 28 eindeutige Befunde: 7 decision-needed / 15 patch / 2 defer / 6 dismissed; ProMods: „Ich folge Deinen Empfehlungen" — D-3.13-1..6 = 1/1/2/1/1/1, D-3.13-7 = 1): Status-Flip `done → in-progress` zurückgenommen (D-3.13-7, Präzedenz 3.73.12: finaler `done`-Flip = Step-05 nach konvergiertem Review-Loop); alle 22 Befunde tickt + Change-Log-Eintrag; run-sandbox.sh gehärtet (839 Z.: D-1..D-6 + P-2..P-14 — geankerter E.4-Classifier, Receipt-A-vs-B, G-6 perturbed-Tree wt-c + at-only-Kontrolle wt-c2, G-7 Link-Auflösung + geschlossene Token-Menge am Ist-Baum, D-NEG 3×FAIL+1×SUCCESS, Validator-Defizit-Route, P-11/P-13/P-14); P-1: sandbox-3-1 harte Exit-Pfade (14 PASS/Exit 0); VALIDATOR_DEFIZIT-Matrix-Zeile „G-5 PASS" vs. Boundary/AC-4 = Renegotiation-Kandidat (Boundary/AC-4 gilt implementiert; frozen-Block unangetastet, Ask-First). Erst-Lauf-Beleg (2026-08-22, vor Härtung): PASS_COUNT=70, FAILED=0, RUN_OK/Exit 0, Validator 7/7 SUCCESS — die (20/27/40/51/60/68)-Schnappschüsse im log.md-Eintrag sind kumulative PASS_COUNT-Werte; $BASE=5024d751… ist ein /tmp-Käfig-Commit (Lauf-Beleg, nicht re-ableitbar — P-12, korrigierende Formulierung im 2026-08-23-log-Eintrag). Grüner Re-Run (Voll-Lauf, ~2.53.5 h) + Review-Loop-2 ausstehend → finaler `done`-Flip danach. Epic-3 bleibt in-progress (AC-9: erst nach done aller Stories 3.8..3.13).
epic-3-retrospective: optional epic-3-retrospective: optional
epic-4: backlog epic-4: backlog
+3
View File
File diff suppressed because one or more lines are too long