feat: Story 3.1 Code-Review-Loop-2-Patches (bmad-code-review, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1) — compiler.md Revision 2.4.2, Diff-Selbsttest operationalisiert, Sandbox-Verification-Record, Story done

16 Patches + 4 Decision-Resolutions (alle 1 = empfohlen): (1) D-1: §5.9-Pkt.-5-Probe = git diff --name-only <Baseline-Commit> -- wiki/ + git status --porcelain (vor Commit, Neu-Anlage-Zielpfade erlaubt, Pfad-Normalisierung, Rollback-Mechanik); (2) D-2: R-1-Baseline-Commit im log.md-Run-Eintrag notiert + Diskrepanz-Regel (git diff gewinnt, SHA-256 Sekundär) + Fallback; (3) D-3: INPUT_UNCOMMITTED-Abbruch „published/committed Input erforderlich" als P2-Element (1) + §1.1-Anker-Divergenz-Fußnote; (4) D-4: Sandbox-Edge-Tests S1-S5 + S6-Kontrolle re-executiert, echte Outputs als Verification Record in der (nicht gefrorenen) Spec-## Verification + re-executierbares Skript versioniert (implementation-artifacts/sandbox-3-1/); (5) Instruktions-Präzisierungen: P2-Zeitpunkt, No-Op-Kandidat, Mehrfach-Treffer-Reihenfolge, Update-Pfad-Rollback §5.3, AD-17h-Gap (Home Story 3.8), Term-Ableitung, visited-set, Worked Example auf Ist-Baum korrigiert, stale-Anker nachgeführt. wiki/log.md: 2026-08-19-Eintrag (Rev 2.4.2, Loop-2-Aufarbeitung, D-1-Probe-Beleg). deferred-work.md: F17-Eintrag saniert + VG-Beleg auf Verification Record zeigt. sprint-status.yaml: 3-1-... done, last_updated 08-19-2026. AD-3/D-3/keine neue §7-Klasse/Commit-Boundary gehalten.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Michael Tamse
2026-08-19 06:44:49 +02:00
co-authored by Claude
parent efc543c9e1
commit e3e7ec346d
6 changed files with 314 additions and 19 deletions
@@ -170,15 +170,17 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein
- summary: **Story-3.1-Review: Diff-Selbsttest-Ausgabe (Pkt. 5) und Sandbox-Edge-Test-Scenarien (I/O-Matrix) waren als Beleg-Verdikt nur prosa-behauptet, nicht als konkrete deterministische Ausgabe nachgewiesen** (Verification-Gap-Reviewer). Heilung: `wiki/log.md`-Eintrag 2026-08-18 wurde in einen realen **Story-3.1-Update-Beurteilungs-Nachweis** umgeschrieben — `git diff --name-only -- wiki/` liefert exakt `wiki/log.md` (deterministischer Ist-Ausgabe-Befund, kein Ghost-Diff); die fünf Sandbox-Edge-Tests der I/O-Matrix (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) sind als deterministische Proben auf synthetischen Bäumen re-executierbar dokumentiert. Die konkreten Formel-Ausgaben je Szenario sind in der Spec-Verification der Story-3.1-Spezifikation enthalten.
evidence: Step-04-Review Story 3.1, VG-Reviewer; Verifikations-Nachweis.
status: umgesetzt (2026-08-18, Story 3.1 Patch-Runde) —
- `git diff --name-only -- wiki/``wiki/log.md` (1 Insertion) — kein Ghost-Diff
- Sandbox-Edge-Tests der I/O-Matrix → deterministische Formel-Ausgaben je Szenario
- `git diff --name-only -- wiki/``wiki/log.md` (die `--name-only`-Form listet Pfade, nicht Insertions-Zählungen; der ursprüngliche Beleg notierte beides vermischt) — kein Ghost-Diff
- Sandbox-Edge-Tests der I/O-Matrix → deterministische Formel-Ausgaben je Szenario: **konkret belegt** in der Story-3.1-Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)` (re-executierbar: `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh` — S1S5 I/O-Matrix + S6 INPUT_UNCOMMITTED-Kontrolle; bmad-code-review Loop 2, D-4-Resolution)
- `git status --porcelain` → 4 modificiert + 2 untracked (der Schema-/Artefakt-/Spec-Teil liegt außerhalb `wiki/` und ist kein Ghost-Diff)
- Loop-2-Nachführung (2026-08-19): die operative Probe ist seit `schema/compiler.md` Revision 2.4.2 (D-1) `git diff --name-only <Baseline-Commit> -- wiki/` + `git status --porcelain -- wiki/` (vor Commit, Pfad-Normalisierung Strip `wiki/` + `.md`); die zitierte Vor-2.4.1-Form (`--stat`) war die Rev-2.4-Notation — s. `wiki/log.md` 2026-08-19-Eintrag (b)
- summary: **Story-3.1-Review: Verbleibende Defer-/Klärungs-Punkte als konkrete Folge-Aufgaben** (Blind-/Edge-Case-Hunter F9/F12/F17, VG-Reviewer F7-F8): (F9) §1-Anker §1.1/§1.4 → §1 Pkt. 1/Pkt. 4 nachgeführt (Patch in Revision 2.4.1); (F12) Defer-R-1-Baseline („gegen den git-diff-Befund") deterministisch bestimmt — HEAD der vorherigen Mutations-Boundary (AD-17f), Patch in Revision 2.4.1; (F17) Producer ohne Git (Ausweichform) — offener Punkt, siehe eigener Defer-Eintrag unten.
evidence: Step-04-Review Story 3.1, EH/BH/VG (F9/F12/F17).
status: umgesetzt/einzuordnen (2026-08-18, Patch-Runde) — F9/F12 als Patch in Revision 2.4.1; F17 als neue Defer-Aufgabe unten.
- summary: **Neue Folge-Aufgabe (Story-3.1-Review F17): „Git-interaktion" des Producers bei einem Producer ohne Git-Tooling** (`git diff`/`git status`/Baseline-Commit sind für Zuwachserkennung und Diff-Selbsttest vorausgesetzt, AD-17h); Ausweichform für Umgebungen, in denen kein Git-Tooling verfügbar ist. Als Teil des Determinismus-Vertrags (AD-17h) werden `git`-Befunde als verlässlich behandelt; eine git-lose Partition ist als Ausweichform zu beschreiben (dokumentarische Konvention, D-3) — Vorschlag: Executive spiegelt die Zuwachserkennung über ein textuelles Eingabe-Manifest statt des `git diff`-Befunds und die Diff-Probe über ein Datei-Baseline-Manifest (Checksummen) — bis dahin bleibt Git für den Producer vorausgesetzt (NFR-1/NFR-5, Git-Bash auf win32).
evidence: Step-04-Review Story 3.1, EH (F17); Nutzer-Entscheidung 1/1 (Story 3.2).
status: open — nach Story 3.2/Epic-3-Klärung als Ausweichform zu spezifizieren.
- source_spec: `_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md`
summary: **Neue Folge-Aufgabe (Story-3.1-Review F17): „Git-interaktion" des Producers bei einem Producer ohne Git-Tooling** (`git diff`/`git status`/Baseline-Commit sind für Zuwachserkennung und Diff-Selbsttest vorausgesetzt, AD-17h); Ausweichform für Umgebungen, in denen kein Git-Tooling verfügbar ist. Als Teil des Determinismus-Vertrags (AD-17h) werden `git`-Befunde als verlässlich behandelt; eine git-lose Partition ist als Ausweichform zu beschreiben (dokumentarische Konvention, D-3) — Vorschlag: der Producer (Agent) spiegelt die Zuwachserkennung über ein textuelles Eingabe-Manifest statt des `git diff`-Befunds und die Diff-Probe über ein Datei-Baseline-Manifest (Checksummen) — bis dahin bleibt Git für den Producer vorausgesetzt (NFR-1/NFR-5, Git-Bash auf win32). (Loop-2-Korrektur 2026-08-19: `source_spec`-Feld ergänzt — Schemaabweichung zu allen anderen Einträgen; Akteur „Executive" → „Producer (Agent)" — „Executive" ist in der D-3-Semantik undefiniert, der ausführende Akteur der Instruktion ist der Producer/Agent; die „Nutzer-Entscheidung 1/1 (Story 3.2)"-Referenz entfällt — Story 3.2 ist `backlog`, eine solche Entscheidung existiert nicht.)
evidence: Step-04-Review Story 3.1, EH (F17).
status: offen — Home: mit Story 3.2 (Relevanzbestimmung, `backlog`) oder der AD-17h-Absicherung (Story 3.8) zu klären; als Ausweichform (dokumentarische Konvention, D-3) zu spezifizieren.
- summary: **Story-3.1-Review: „Git-zentrierte Zuwachserkennung" setzt einen validen Git-Zustand voraus; die AD-17-Grenze (nur published/committed Input) wird durch die eingefügte Erhaltungs-Invariante (§5.9 Pkt. 5, Erhaltungs-Diff) und die Ghost-Diff-Konsequenz (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf) hinreichend verbunden** — Kein neuer Folge-Gap; dokumentiert für die Nachvollziehbarkeit des Review-Nachweises.
status: Kein Gap — abgeschlossen (Patch in Revision 2.4.1).
@@ -321,3 +323,15 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein
status: offen
## Deferred from: code review of spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update (2026-08-19)
- source_spec: `_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md`
summary: **V-1-Cross-Referenz dreistufig und nie explizit aufgelöst** — der P2-Check-Block (compiler.md §5.9 Pkt. 6) zitiert `wiki/index.md`-V-1 als „Vertrag §2", während V-1 die §3.2-Voraussetzungsprüfung des Validators ist; die Kette compiler-§3-Pkt.-3 ↔ Validator-§3.2 ↔ Vertrag-§2 ist dreistufig und nicht explizit aufgelöst. Bestehendes Referenz-Idiom der Instruktion (Epic-1/Epic-2-Ära), nicht von Story 3.1 verursacht; Home: nächste Compiler-Instruktions-Revision, die §3/Pkt. 3 ohnehin berührt.
evidence: bmad-code-review Story 3.1 (2026-08-19, Blind-Hunter-Layer F14): compiler.md §5.9 Pkt. 6 Pkt. (4) vs. validator.md §3.2-Voraussetzungsprüfung (V-1/V-2-Label, Epic-1-Retro-F-03) vs. wiki-compiler.md §2 (Bundleroot).
status: offen
- source_spec: `_bmad-output/implementation-artifacts/spec-3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile-synthesize-update.md`
summary: **`epic-3-context.md` ist ein neues Artefakt außerhalb der Spec-Code-Map** — die Code Map listet exakt compiler.md / log.md / deferred-work.md / sprint-status.yaml (sonst read-only); die 50-Zeilen-Context-Datei (im Story-3.1-Commit neu) wird nirgends referenziert oder als erzeugt dokumentiert. Vom build-Verfahren (compile-epic-context) erzeugtes Kontext-Artefakt, keine Story-Inhalts-Mutation, kein Always/Ask-First/Never-Verstoß; Home: Story-3.2-Handoff oder nächstes Sprint-Sync (einzeilige Nennung im log.md-Nachweis genügt).
evidence: bmad-code-review Story 3.1 (2026-08-19, Acceptance-Auditor-Layer): Spec-Code-Map vs. `git show efc543c --stat` (6 Dateien, `epic-3-context.md` new file).
status: offen
@@ -0,0 +1,160 @@
#!/usr/bin/env bash
# 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)
set -u
ROOT=$(mktemp -d /tmp/sb31-XXXXXX)
SB="$ROOT/sb"
mkdir -p "$SB/wiki" "$SB/raw"
cd "$SB"
git init -q
git config user.email "sandbox@test"
git config user.name "Sandbox"
# ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ----------
cat > wiki/index.md <<'EOF'
# Index
- [Alpha](alpha.md)
- [Beta](beta.md)
EOF
cat > wiki/alpha.md <<'EOF'
---
type: concept
sources:
- resource: raw/alpha-v1.md
id: s1
generated:
by: wow-compiler/0.1.0
at: 2026-08-16T09:00:00Z
---
Das Alpha-Protokoll verwendet quanten-protocol-schlüssel für die Authentifizierung.
EOF
cat > wiki/beta.md <<'EOF'
---
type: concept
sources:
- resource: raw/beta-v1.md
id: s1
generated:
by: wow-compiler/0.1.0
at: 2026-08-16T09:00:00Z
---
Beta beschreibt ein anderes, hier nicht betroffenes Thema.
EOF
cat > wiki/log.md <<'EOF'
# Log
EOF
cat > raw/alpha-v1.md <<'EOF'
Evidenz v1: quanten-protocol-schlüssel (Stelle S-1).
EOF
cat > raw/beta-v1.md <<'EOF'
Evidenz v1: Beta-Thema (Stelle S-1).
EOF
git add -A
git commit -qm "Baseline"
BASE=$(git rev-parse HEAD)
echo "BASELINE-COMMIT: $BASE"
echo
runlabel() { echo; echo "########## $1 ##########"; }
RG() { if command -v rg >/dev/null; then rg "$@"; else grep -rln "$@"; fi; }
# Isolation: Worktree auf BASE zuruecksetzen (kein Carry-over ueber Szenarien)
isolate() { git checkout -q -b "$1" "$BASE" 2>/dev/null || git checkout -q "$1"; git reset -q --hard "$BASE"; git clean -qfd wiki raw; }
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
}
# =====================================================================
runlabel "S1: HAPPY_PATH_UPDATE (bestehendes Concept wird im bestehenden Pfad aktualisiert)"
# Zuwachs: neue committierte Evidenz mit Term-Ueberschneidung
cat > raw/alpha-v2.md <<'EOF'
Evidenz v2: quanten-protocol-schlüssel erfaehrt eine Rotation (Stelle S-2).
EOF
git add -A; git commit -qm "Zuwachs raw/alpha-v2.md"
# Reconcile: Kandidatenliste (textuell-deterministisch, AD-13)
echo "--- Kandidaten-Erhebung: rg -l 'quanten-protocol-schlüssel' wiki/ ---"
RG -l 'quanten-protocol-schlüssel' wiki/ || true
# Update-Pfad: Mutation im BESTEHENDEN Pfad (Erweitern) + log.md
cat >> wiki/alpha.md <<'EOF'
Seit der Rotation (raw/alpha-v2.md#S-2) gelten die Schlüssel neu.
EOF
cat >> wiki/log.md <<EOF
## 2026-08-19
- Story 3.1-Update: alpha (raw/alpha-v2.md; Baseline $BASE)
EOF
echo "--- Probe (git diff --name-only <BASE> -- wiki/ + git status --porcelain -- wiki/, normalisiert) ---"
probe
echo "--- Erwartet: log, alpha (betroffen); beta NICHT; keine neue Datei (porcelain o.??) ---"
git status --porcelain -- wiki/
echo "--- Duplikat-Check: existiert alpha.md weiterhin exakt 1x? ---"
ls wiki/alpha.md; git status --porcelain -- wiki/ | grep -c '^??' || echo "0 untracked"
# =====================================================================
runlabel "S2: UNTOUCHED_CONCEPT (neue Evidenz betrifft kein bestehendes Concept)"
isolate s2
cat > raw/gamma.md <<'EOF'
Evidenz: vollstaendig neues gamma-observatorium-thema (Stelle S-1).
EOF
git add -A; git commit -qm "Zuwachs raw/gamma.md"
echo "--- Kandidaten-Erhebung: rg -l 'gamma-observatorium-thema' wiki/ ---"
RG -l 'gamma-observatorium-thema' wiki/ || echo "(leer — kein Kandidat)"
echo "--- Folge: keine Mutation, kein log.md-Zusatz (UNTOUCHED_CONCEPT) ---"
echo "--- Probe ---"
probe
echo "(leere Ausgabe = kein Ghost-Diff; leere Menge ist Teilmenge jeder erlaubten Menge)"
# =====================================================================
runlabel "S3: CONCEPT_COLLISION_BESTEHEND (Zielpfad belegt -> Update-Routing, kein Duplikat)"
isolate s3
cat > raw/alpha-v2.md <<'EOF'
Evidenz v2: quanten-protocol-schlüssel (Stelle S-2, ergaenzend).
EOF
git add -A; git commit -qm "Zuwachs"
echo "--- Vor-Mutation-Check: Ziel-Pfad wiki/alpha.md belegt? ---"
test -f wiki/alpha.md && echo "JA — Update-Routing (kein Duplikat, kein stummer Ueberschreiben)"
echo "--- Vor-Mutation-Zustand (muss leer sein) ---"
git status --porcelain -- wiki/; echo "(leer)"
echo "--- Mutation im bestehenden Pfad (Update) ---"
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 "--- Nach-Mutation: nur M-Eintraege, KEIN ?? (keine neue Datei = kein Duplikat) ---"
git status --porcelain -- wiki/
echo "--- Probe ---"
probe
# =====================================================================
runlabel "S4: CHANGE_DETECTION (R-1: nur der Zuwachs wird als Evidenz interpretiert)"
isolate s4
cat > raw/alpha-v2.md <<'EOF'
Evidenz v2: nur diese Datei ist neu (Stelle S-2).
EOF
git add -A; git commit -qm "Zuwachs"
echo "--- git diff --name-only <BASE> -- raw/ ---"
git diff --name-only "$BASE" -- raw/
echo "--- Erwartet: AUSSCHLIESSLICH raw/alpha-v2.md (alpha-v1.md/beta-v1.md bleiben aussen) ---"
echo "--- SHA-256-Abgleich (Sekundaer-Fingerprint, D-2): alpha-v1 unveraendert? ---"
sha256sum raw/alpha-v1.md
git show "$BASE:raw/alpha-v1.md" | sha256sum
echo "--- (identische Summen = unveraendert; bei Diskrepanz gewinnt git diff, D-2) ---"
# =====================================================================
runlabel "S5: PRE_RUN_RECONCILE (Check-Block vor Mutation; fehlende Bundleroot -> Run-FAIL V-1)"
isolate s5
rm wiki/index.md # Szenario-Setup: Bundleroot fehlt (simuliert, kein Run-Zustand)
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
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) ---"
git status --porcelain -- wiki/; echo "(leer)"
# =====================================================================
runlabel "S6: INPUT_UNCOMMITTED (D-3: Working-Copy vs. HEAD-Check -> benannter Abbruch)"
isolate s6
echo "uncommittete Zwischenstunde" >> raw/alpha-v1.md # simuliert Dirty-Tree
echo "--- Check-Block: Working-Copy vs. HEAD fuer raw/ + wiki/ ---"
DIRTY=$(git status --porcelain -- raw/ wiki/)
if [ -z "$DIRTY" ]; then echo "OK — published/committed Input"; else
echo "Abbruch: published/committed Input erforderlich (AD-17a) — ungepublishter Zustand:"
echo "$DIRTY"
fi
echo
echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)"
@@ -3,7 +3,7 @@ title: 'Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Sy
type: 'feature'
created: '2026-08-18'
status: 'done'
review_loop_iteration: 0
review_loop_iteration: 2
baseline_commit: 802a5576eb4bbf54761a947e43e68b7e7ea9d67d
context:
- _bmad-output/implementation-artifacts/epic-3-context.md
@@ -74,8 +74,42 @@ context:
- Given der Run-Input, when verarbeitet, then verwendet er ausschließlich published/committed Inhalte und nie Zwischenstände während der Mutation (AD-17.2/AD-17a) — bestehende §1.1-Regel bleibt und wird referenziert.
- Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), es gibt keine neue §7-Klasse und kein Standalone (D-3) — der Validator läuft auf dem Ist-Bundle SUCCESS (per-Datei-Verdikt-Nachweis in `wiki/log.md`).
### Review Findings
bmad-code-review 2026-08-19 (Loop 2, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff-Baseline `802a557``efc543c`). Verifiziert am Ist-Baum: `grep "Aktualisierung ist Epic 3" schema/compiler.md` → kein Treffer (Rev-2.4.1-Claim korrekt); `rg -l 'FR-12' wiki/``wiki/knowledge-kompilation-inkrementell.md` + `wiki/log.md` (Worked-Example-Ziel `wissensarchitektur/source-material.md` NICHT getroffen).
**Decision-needed (alle 2026-08-19 per Nutzer-Entscheidung 1/1/1/1 aufgelöst — jeweils empfohlene Option gewählt):**
- [x] [Review][Decision] D-1: Diff-Selbsttest-Probe neu definieren — `git diff --name-only -- wiki/` ist blind für (a) ungetrackte neue Dateien (Duplikat-Verstoß unsichtbar), (b) den Zustand nach dem Commit (leere Ausgabe = vacuous Test, Commit-Boundary = Mutations-Boundary AD-17f), und die erlaubte Menge enthält keine Neu-Anlage-Zielpfade (Misch-Runs → jede Neu-Anlage fälschlich Ghost-Diff; §5.9 Pkt. 5 vs. §3 Pkt. 2 „betroffene bestehende Concepts"). Empfohlene Lösung (P1): Probe = `git diff --name-only <Baseline-Commit> -- wiki/` + `git status --porcelain -- wiki/`, fixiert VOR dem Commit (im P2-Block), erlaubte Menge = Kandidatenliste Neu-Anlage-Zielpfade (§5.1/§5.7) `log.md` `index.md`; Ausgabe-Pfade normalisieren (Stripping `wiki/`-Präfix + `.md`). **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** wie Empfohlene Lösung umgesetzt (Baseline + porcelain + Neu-Anlage + Normalisierung, Pre-Commit-Zeitpunkt).
- [x] [Review][Decision] D-2: R-1-Baseline deterministisch auflösbar machen + Abweichungsregel — „HEAD der vorherigen Mutations-Boundary" (Rev-2.4.1-F12) ist ohne Lauf-State-Record nicht deterministisch feststellbar (AD-14: Git liefert Historie, nicht Domain-State; `log.md` ist Dokumentation, kein State); der Claim „derselbe Baseline-Commit wie Pkt. 5" ist faktisch falsch (Pkt.-5-Probe hat kein Commit-Argument); bei git-diff ↔ SHA-256-Record-Diskrepanz ist die Ergebnis-Regel undefiniert. Empfohlene Lösung (P2): Baseline-Commit wird vom Producer im `wiki/log.md`-Run-Eintrag notiert; bei Diskrepanz gewinnt `git diff` (Commit-Boundary = Mutations-Boundary), SHA-256 bleibt Sekundär-Fingerprint; Fallback für Workspace ohne vorherige Mutations-Boundary definieren (alles als Zuwachs). **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** Baseline-Commit wird vom Producer im `wiki/log.md`-Run-Eintrag notiert; bei Diskrepanz gewinnt `git diff`; SHA-256 = Sekundär-Fingerprint; Fallback „alles als Zuwachs".
- [x] [Review][Decision] D-3: INPUT_UNCOMMITTED-Abbruch implementieren + Anker-Divergenz dokumentieren — das gefrorene I/O-Matrix-Szenario verlangt den textuell benannten Abbruch „published/committed Input erforderlich"; implementiert ist nur die Referenz auf §1 Pkt. 1 (keine Zustandsprüfung, keine Abbruchmeldung, kein Test, kein Defer). Die gefrorene Spec zitiert 3× „§1.1" (Zeilen 26/42/74), das in `schema/compiler.md` nicht existiert (§1 ist eine nummerierte Liste Pkt. 14) — Rev-2.4.1 korrigierte nur die Anker in compiler.md. Empfohlene Lösung (P3): Input-Zustandsprüfung (Working-Copy vs. HEAD für `raw/` + `wiki/`) als P2-Check-Block-Element mit genanntem Abbruch; die Spec↔Anker-Divergenz als dokumentierte Fußnote (Rev-Log + log.md), da die Spec frozen bleibt. **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** Input-Zustandsprüfung (Working-Copy vs. HEAD für `raw/` + `wiki/`) als P2-Check-Block-Element mit genanntem Abbruch; Anker-Divergenz als dokumentierte Fußnote (Rev-Log + log.md).
- [x] [Review][Decision] D-4: Sandbox-Edge-Test-Nachweis als hängenden Zeiger heilen — `wiki/log.md:4` und `deferred-work.md` behaupten „deterministische Formel-Ausgaben je Szenario in der Spec-Verification", aber die `## Verification`-Sektion der Spec enthält keine Szenario-Ausgaben (keine Sandbox-Bäume, keine Befehle, keine ausgeführten Outputs; repo-weit existiert kein Execution-Record für die fünf Szenarionyme, nur frozen Matrix + Tasks + Prosa). Repo-Idiom (spec-2-1 „Verification Record (Ausführungs-Beleg)", spec-2-5 Pkt. 1) liefert die Vorlage. Empfohlene Lösung (P4): fünf synthetische Sandbox-Bäume (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) ausführen, echte Ausgaben als „Verification Record (Ausführungs-Beleg)" in die (nicht gefrorene) `## Verification` schreiben, `log.md`/`deferred-work.md`-Zeile darauf zeigen. **Resolution (Nutzer 1/1, 2026-08-19, Option 1 — empfohlen):** volle Sandbox-Execution der fünf I/O-Matrix-Szenarien; echte Ausgaben als „Verification Record (Ausführungs-Beleg)" in die nicht gefrorene `## Verification`.
**Patch:**
- [x] [Review][Patch] Worked Example §5.9 Pkt. 7 nicht reproduzierbar: `rg -l 'FR-12' wiki/` trifft am Ist-Baum `wiki/knowledge-kompilation-inkrementell.md` + `wiki/log.md`, NICHT `wiki/wissensarchitektur/source-material.md` (dort 0 Treffer) — das „an die reale Ist-Lage gebundene" Example reproduziert sich nicht [schema/compiler.md:259]
- [x] [Review][Patch] P2-Check-Block-Zeitpunkt widersprüchlich: „einmal pro Run führend an der Spitze erhoben", aber die Kandidatenliste entsteht erst im Reconcile — Block muss nach Reconcile, an der Spitze von Mutieren, durchlaufen werden [schema/compiler.md:258]
- [x] [Review][Patch] Stale-Anker „§3.2-Kollisionsprüfung" — §3 ist eine nummerierte Liste (Pkt. 1/2/3), §3.2 existiert nicht [schema/compiler.md:42]
- [x] [Review][Patch] Stale-Referenz „§3-Voraussetzungsprüfung" (P2-Block Pkt. 4 zitiert §3 Pkt. 3 und diese Pseudo-Sektion doppelnd) [schema/compiler.md:258]
- [x] [Review][Patch] §5.8 Pkt. 3: Zeiger „die in Pkt. 1 als offen notierte Punkt-11-Grenze" — die Lücken-Notiz stand in Pkt. 2 [schema/compiler.md:232]
- [x] [Review][Patch] Befehls-/Ausgabe-Inkonsistenz der Diff-Selbsttest-Belege: `wiki/log.md:4` (b) zitiert `git diff --stat -- wiki/` (Rev-2.4.1: „statt `--stat`" umgestellt), `deferred-work.md` notiert den `--name-only`-Befehl mit `--stat`-stiler Ausgabe („1 Insertion") [wiki/log.md:4; _bmad-output/implementation-artifacts/deferred-work.md:172]
- [x] [Review][Patch] Log-Eintrag dokumentiert „Revision 2.4", der Commit enthält 2.4 + 2.4.1; die Step-04-Review-Patch-Runde und `in-progress → review` sind nur implizit (sprint-status-Zweizeitstempel) [wiki/log.md:4]
- [x] [Review][Patch] F17-Defer-Eintrag: kein `source_spec`-Feld (Schemaabweichung zu allen anderen Einträgen), „Executive spiegelt" = undefinierter Akteur in D-3-Semantik, „Nutzer-Entscheidung 1/1 (Story 3.2)" referenziert eine nicht existierende Story (3.2 ist `backlog`) [_bmad-output/implementation-artifacts/deferred-work.md:177-179]
- [x] [Review][Patch] No-Op-Kandidat (Kandidat mit null substantiellem Delta) undefiniert: Mutation/`at`-Bump/`log.md`-Eintrag? — Spurious-Churn vs. verpasste Pflichteintrag; zusätzlich: Konsolidierungsreihenfolge nur für „vollständig unabhängige" Einheiten definiert (lexicografisch), partiell-abhängige haben keine Regel (AD-17h) [schema/compiler.md:241-248]
- [x] [Review][Patch] Update-Pfad-Rollback undefiniert: §5.3/§6.3 definieren Teilzustand-Rollback nur für neue Dateien („gelöscht, Index entfernt, log.md-Eintrag entfernt"); für modifizierte bestehende Concepts fehlt die Rücksetzregel (Validierungs-FAIL im Update-Pfad) [schema/compiler.md:265-266]
- [x] [Review][Patch] `generated.at` = Wanduhr-Zeitstempel kollidiert mit AD-17h-Determinismus (zwei unabhängige Runs, gleicher Input → verschiedene `at`-Werte → verschiedene Bundle-States); P1-Konvention heilt nur Drift innerhalb eines Runs — die Lücke ist weder in §5.9 noch in `deferred-work.md` als Gap benannt (Story-3.8-Anker) [schema/compiler.md:246]
- [x] [Review][Patch] Term-Ableitung für die Kandidatenerhebung (a) `rg -l '<konzeptterm>' wiki/` nicht deterministisch: welcher Term, welche Normalisierung, Case-Sensitivity, mehrere Terme pro Einheit? — ist Interpretationsentscheidung (genau das, was AD-13 für Auswahl ausschließt); Story-3.2-Vorbehalt ist nur für den „feinkörnigen Mechanismus" formuliert, nicht für die Term-Ableitung [schema/compiler.md:41]
- [x] [Review][Patch] Probe-Ausgabe-Pfade nicht normiert: `git diff --name-only` liefert `wiki/`-Präfix + `.md`; die Kandidatenliste ist definiert als „relative OKF-Pfade ohne `.md`" — die Teilmenge-Vergleichsoperation ist nicht definiert (Stripping-Regel fehlt) [schema/compiler.md:255]
- [x] [Review][Patch] Fallback fehlt: kein vorheriger Mutations-Boundary-Commit vorhanden (frischer Workspace) → `<Baseline-Commit>` für R-1 Change-Detection nicht auflösbar [schema/compiler.md:257]
- [x] [Review][Patch] Link-Following (Kandidatenerhebung (c)) ohne visited-set/Tiefen-Schranke — zyklische Concept-Links → unendliche Traversal / unbeschränkte Kandidatenmenge [schema/compiler.md:41]
- [x] [Review][Patch] Ghost-Diff-Rollback-Mechanik nicht spezifiziert: „rollt den Ghost-Diff zurück" ist Prozess-Beschreibung ohne Mechanismus (welcher Befehl? `git restore`? §5.3-Sequenz?); für D-3/AD-17h muss die Rücksetz-Aktion deterministisch beschreibbar sein [schema/compiler.md:255]
**Defer (vorbestehend, nicht von Story 3.1 verursacht):**
- [x] [Review][Defer] V-1-Cross-Referenz dreistufig (compiler §3 Pkt. 3 / Validator-Voraussetzungsprüfung / Vertrag §2) und nie explizit aufgelöst — bestehendes Referenz-Idiom der Instruktion [schema/compiler.md:258] — deferred, pre-existing
- [x] [Review][Defer] `epic-3-context.md` ist ein neues Artefakt außerhalb der Spec-Code-Map, nirgends referenziert/dokumentiert (log.md/deferred-work) — Kontext-Datei wird vom build-Verfahren erzeugt, keine Story-Inhalts-Mutation [_bmad-output/implementation-artifacts/epic-3-context.md] — deferred, pre-existing
## Spec Change Log
- **2026-08-19 (bmad-code-review Loop 2 — Resolution & Patch-Runde):** 4 decision-needed per Nutzer-Entscheidung 1/1/1/1 aufgelöst (D-1 Probe-Befestigung + Neu-Anlage + Normalisierung; D-2 Baseline-Commit-Notiz + Diskrepanz-Regel + Fallback; D-3 INPUT_UNCOMMITTED-Abbruch als P2-Element + Anker-Divergenz-Fußnote; D-4 Sandbox-Execution + Verification Record); 16 patch umgesetzt — `schema/compiler.md`**Revision 2.4.2** (Diff-Selbsttest operationalisiert, R-1-Baseline + Abweichungsregel, P2-Block um Input-Zustand + Zeitpunkt, No-Op-Kandidat, Mehrfach-Treffer-Reihenfolge, Update-Pfad-Rollback §5.3, AD-17h-Gap benannt, Term-Ableitung abgegrenzt, visited-set, Worked Example korrigiert, stale-Anker nachgeführt) + `wiki/log.md` (2026-08-19-Eintrag: Befund-Befehlsform korrigiert, Rev 2.4.1/2.4.2 + Review-Handoff dokumentiert, Sandbox-Zeiger auflösbar, Baseline-Commit-Konvention) + `deferred-work.md` (F17-Eintrag: `source_spec` + Akteurskorrektur + Story-3.2-Referenz behoben; VG-Beleg: Befehls-/Ausgabe-Form korrigiert, Zeiger auf diesen Verification Record); 2 defer in `deferred-work.md` verankert; 6 dismissed (s. Review Findings-Einleitung); `## Verification Record (Ausführungs-Beleg)` angehängt (re-executierbares Sandbox-Skript + echte Outputs, S1S5 I/O-Matrix + S6 D-3-Kontrolle); Frontmatter `review_loop_iteration` → 2; `sprint-status.yaml`: `3-1-…``done`, `last_updated` 08-19-2026.
- **2026-08-19 (bmad-code-review Loop 2):** Review Findings-Sektion angehängt (4 decision-needed, 16 patch, 2 defer, 6 dismissed als Noise — u. a.: Key-Abkürzungs-Muster in sprint-status ist Projekt-Schema, Chronologie „Review-Ergebnis im selben Commit wie Review-Handoff" ist prozedural korrekt, Validator-7/7-Lauf gilt für Endzustand inkl. Append, AA-Teilbehauptung „Hold-String überlebt in Rev-1.4-Log" ist am Ist-Baum widerlegt — grep liefert keinen Treffer).
- **2026-08-18 (Erstellung):** Initiale Approve-Baseline.
## Design Notes
@@ -98,6 +132,86 @@ context:
**Manual checks:**
- §3-Pkt.-2-Hold ersetzt (Update-Routing) und §5.9 vorhanden (Update-Semantik, Diff-Selbsttest, R-1/P2-Bausteine); `compiler.md` §8-Revision 2.4 mit Abschlussklausel; kein `schema/validator.md`-/`schema/wiki-compiler.md`-/`raw/`-Diff; §7-Vorbehalt gekürzt; `wiki/log.md`-Eintrag datiert mit Story-3.1-Semantik, Diff-Selbsttest-Beleg, Statuswechsel `backlog → in-progress`, per-Datei-Verdikt; `deferred-work.md`-R-1-/P2-Einträge als aufgegriffen markiert (append-only); `sprint-status.yaml` konsistent (`3-1-…` → in-progress).
## Verification Record (Ausführungs-Beleg, 2026-08-19 — bmad-code-review Loop 2, D-4-Resolution)
**Re-executierbar:** `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh` (ab Workspace-Root; Git-Bash; Sandbox-Bäume unter `/tmp/sb31-XXXXXX`, reiner Test-Baum — nie der reale `wiki/`-Bundle; kein Carry-over über Szenarien via `isolate()`: Branch auf Baseline + `git reset --hard` + `git clean`). Das Skript setzt das compiler.md-§5.9-Update-Szenario auf einem synthetischen Basis-Baum (`wiki/index.md` + `alpha.md` + `beta.md` + `log.md`, `raw/alpha-v1.md` + `raw/beta-v1.md`, committer Baseline) gegen die fünf I/O-Matrix-Szenarien + die D-3-Abbruch-Kontrolle durch. Die Probe-Funktion implementiert die D-1-Probe wörtlich: `{ git diff --name-only <BASE> -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}' }` → Normalisierung (Strip `wiki/`-Präfix + `.md`-Suffix, `LC_ALL=C sort -u`).
**Baseline-Commit (Sandbox-Baum, reiner Test-Baum):** `f7335a3f4f98aafcbb1294bc8a4ba5ca76db143a`
**S1 — HAPPY_PATH_UPDATE** (Zuwachs `raw/alpha-v2.md` mit Term-Ueberschneidung `quanten-protocol-schlüssel`; Mutation im bestehenden Pfad `wiki/alpha.md` + `log.md`):
```
--- Kandidaten-Erhebung: rg -l 'quanten-protocol-schlüssel' wiki/ ---
wiki/alpha.md
--- Probe (git diff --name-only <BASE> -- wiki/ + git status --porcelain -- wiki/, normalisiert) ---
alpha
log
--- Erwartet: log, alpha (betroffen); beta NICHT; keine neue Datei (porcelain o.??) ---
M wiki/alpha.md
M wiki/log.md
--- Duplikat-Check: existiert alpha.md weiterhin exakt 1x? ---
wiki/alpha.md
0
0 untracked
```
→ Probe ⊆ erlaubte Menge (`alpha` betroffen, `log` = `log.md`; `beta` NICHT; keine ungetrackte Datei = kein Duplikat). FT-6/FR-12 erfüllt.
**S2 — UNTOUCHED_CONCEPT** (Zuwachs `raw/gamma.md`, Term `gamma-observatorium-thema`; kein Kandidat, keine Mutation):
```
--- Kandidaten-Erhebung: rg -l 'gamma-observatorium-thema' wiki/ ---
(leer — kein Kandidat)
--- Folge: keine Mutation, kein log.md-Zusatz (UNTOUCHED_CONCEPT) ---
--- Probe ---
(leere Ausgabe = kein Ghost-Diff; leere Menge ist Teilmenge jeder erlaubten Menge)
```
→ Konzept bleibt unverändert (keine Dateiänderung, kein Index-, kein `log.md`-Zusatz).
**S3 — CONCEPT_COLLISION_BESTEHEND** (Zielpfad `wiki/alpha.md` belegt → Update-Routing):
```
--- Vor-Mutation-Check: Ziel-Pfad wiki/alpha.md belegt? ---
JA — Update-Routing (kein Duplikat, kein stummer Ueberschreiben)
--- Vor-Mutation-Zustand (muss leer sein) ---
(leer)
--- Mutation im bestehenden Pfad (Update) ---
--- Nach-Mutation: nur M-Eintraege, KEIN ?? (keine neue Datei = kein Duplikat) ---
M wiki/alpha.md
M wiki/log.md
--- Probe ---
alpha
log
```
→ Statt Kollision-Hold: Mutation im bestehenden Pfad; nur `M`-Einträge, kein `??` (keine neue Datei = kein Duplikat); Index-Link unverändert gültig.
**S4 — CHANGE_DETECTION (R-1)** (Zuwachs `raw/alpha-v2.md`; `alpha-v1.md`/`beta-v1.md` unverändert):
```
--- git diff --name-only <BASE> -- raw/ ---
raw/alpha-v2.md
--- Erwartet: AUSSCHLIESSLICH raw/alpha-v2.md (alpha-v1.md/beta-v1.md bleiben aussen) ---
--- SHA-256-Abgleich (Sekundaer-Fingerprint, D-2): alpha-v1 unveraendert? ---
21e7fc1dd09baa0d3fed56bf36e7eba19b1b3376f236b79ecbce8a907761b50b *raw/alpha-v1.md
21e7fc1dd09baa0d3fed56bf36e7eba19b1b3376f236b79ecbce8a907761b50b *-
--- (identische Summen = unveraendert; bei Diskrepanz gewinnt git diff, D-2) ---
```
→ Nur die neue Datei wird als Zuwachs interpretiert (git-diff-basiert); unveränderte bleiben außen vor; SHA-256-Record bestätigt (identische Summen), Sekundär-Fingerprint gemäß D-2-Diskrepanz-Regel.
**S5 — PRE_RUN_RECONCILE (P2)** (Setup: `wiki/index.md` fehlt → fehlende Bundleroot):
```
--- Check-Block: (4) wiki/index.md-V-1-Vorbedingung ---
Run-FAIL (V-1, Vertrag §2): wiki/index.md fehlt — keine Mutation darf erfolgen
--- Zustand nach Abbruch + Rueckstellung (muss leer sein — der Run selbst mutierte nichts) ---
(leer)
```
→ Pre-Run-Reconcile-Check-Block durchlaufen **vor jeder Mutation**; fehlende Bundleroot → Run-FAIL (V-1, besteht fort); der Run mutierte nichts (Zustand nach Abbruch leer; die Rückstellung ist Setup, kein Run-Zustand).
**S6 — INPUT_UNCOMMITTED (D-3-Abbruch-Kontrolle)** (Setup: `raw/alpha-v1.md` im Working-Copy abweichend von HEAD):
```
--- Check-Block: Working-Copy vs. HEAD fuer raw/ + wiki/ ---
Abbruch: published/committed Input erforderlich (AD-17a) — ungepublishter Zustand:
M raw/alpha-v1.md
```
→ P2-Check-Block-Element (1) **Input-Zustand**: Working-Copy von `raw/`+`wiki/` gegen HEAD; bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** vor Interpretation und vor jeder Mutation — die gefrorene I/O-Matrix-Verpflichtung (Szenario `INPUT_UNCOMMITTED`) ist jetzt als Check-Block-Element in `schema/compiler.md` §5.9 Pkt. 6 (1) implementiert (Rev 2.4.2, D-3-Resolution).
**Gesamtergebnis:** Alle 5 I/O-Matrix-Szenarien + die D-3-Abbruch-Kontrolle deterministisch ausgeführt — keine Abweichung vom Erwartungsverhalten; die `wiki/log.md`- und `deferred-work.md`-Verweise auf „deterministische Formel-Ausgaben/Nachweise je Szenario in der Spec-Verification" sind damit auflösbar (D-4).
## Suggested Review Order
**Inkrementeller Datenfluss — Update-Routing (Einstieg)**
@@ -29,7 +29,7 @@
# - 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
generated: 08-14-2026 00:00
last_updated: 08-18-2026 22:30
last_updated: 08-19-2026 06:30
project: wow20
project_key: NOKEY
tracking_system: file-system
@@ -51,7 +51,7 @@ development_status:
epic-2-retrospective: done
epic-3: in-progress
3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: review
3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done
3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: backlog
3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: backlog
3-4-wissen-aus-mehreren-sources-synthetisieren: backlog