# Log ## 2026-08-20 - **Story 3.8 → `in-progress` (Determinismus-Vertrag (AD-17h) als Agent-Instruktions-Validator, Verankerung §5.14, 2026-08-20):** `schema/compiler.md` Revision 3.3 — neue Sektion **§5.14 „Determinismus-Vertrag & Agent-Instruktions-Validator (Story 3.8)“** (nach §5.13, vor §6; §5.13 Pkt. 7-Seam auf den §5.14-Anker umgehängt): geschlossene Bestätigungs-Mechanik des Determinismus-Vertrags (AD-17h/FT-10/A0-19) — (1) **Bundle-State-Definition** (deterministische Projektion des committeten Git-States: committeter Baum gg. Baseline, Plan-/Kandidaten-/Reihenfolge-Outputs, Ausführungs-Entscheidungen; `generated.at`/`verified[].at` als **benannte Ausnahme** der Projektion), (2) **Zwei-Run-Bestätigungs-Mechanik** (agent-Instruktions-basiert D-3/Q-6: Producer führt zweimal über demselben committeten Git-State aus, Vergleichs-Operandum = committeter Baum, diff-/hashbasierte Formeln, identische Outputs byte-identisch bis auf `at`; Sandbox DET-2 nicht-vakuum; kein Prozess/Server/MCP/Standalone, AD-6/AD-11), (3) **Ausnahme-Menge** (allein der `generated.at`-Wanduhr-Gap als dokumentierte A0-20-Konvention — kein stiller Ausschluss; alle übrigen Bestandteile byte-identisch), (4) **Abweichungs-Klassifikation** (jede Differenz außerhalb der Ausnahme = **AD-16-Klassifikationsdefekt**, kein Rauschen, textuell benannt NFR-4, korrigiert/zurückgerollt, erneut bestätigt), (5) **Normalisierungs-/Match-/Orphan-Schließung** (verweist auf §3.2-Pkt.-1b-/§5.10-Pkt.-8-Verankerung). **§3.2 Normalisierungs-Lücken geschlossen (append-only, kein Umbruch):** Em-Dash in der Kollaps-Klasse (`[-–— _]` → `-`), Kollaps-Reichweite (jedes Vorkommen → genau ein `-` + Trim), Match-Scope der Stufe a (ganze Wörter über den Body, Frontmatter exkludiert). **§5.10 Pkt. 8 Orphan** zur deterministischen Reconcile-Orphan-Regel präzisiert (Zuwachs gg. ``, datumsgruppierter `log.md`-Eintrag, kein Banner, AD-16-Default). §7-Determinismus-Vorbehalt **aufgelöst** (Story-3.8-Verankerung, bestehende Bullets unverändert); §8-`AD-17h` auf den **§5.14-Anker** angehoben (mit `generated.at`-Wanduhr-Gap-Ausnahme-Nennung); **Revisionslog Revision 3.3** mit Abschlussklausel (AD-3 — `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert; keine neue §7-Klasse; kein Standalone/D-3; keine Vertragsänderung; kein neuer Prädikat-/Format-/Frontmatter-Key; `generated.at`-Verhalten unverändert, Ask-First bei Verhaltens-Wechsel; keine eigene Workflow-Engine). `sprint-status.yaml`-Key `3-8-determinismus-vertrag-ad-17h-als-agent-instruktions-validato` → **`in-progress`** (Implementierungs-Flip, HEAD-Stand 08-20-2026 09:05; finaler `review`/`done`-Flip im Review-Schritt — Step-04/05), `last_updated` → 08-20-2026 09:05. **Sandbox-Nachweis** (`_bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh`, `/tmp`-Baum, Linux-Semantik, nie der reale `wiki/`-/`raw/`-Baum): **DET-1..DET-8, Exit 0, 8 harte PASS-Assertionen** — DET-1 Bundle-State-Definition (Projektion zweimal byte-identisch extrahiert, KEINE_EIGENE_ENGINE-Negativkontrolle D-3/AD-11); DET-2 Zwei-Run-identisch **nicht-vakuum** (echte Content-Hashes Plan-/log-/index-/alpha + Bundle-TREE byte-identisch über zwei unabhängige Läufe, Witness weicht byte-weise von Baseline ab); DET-3 Zwei-Run-Abweichung (künstlich divergenter Lauf → AD-16-Klassifikationsdefekt textuell benannt NFR-4, korrigierter Lauf == Referenz); DET-4 `at`-Gap-Ausnahme (diff ausschließlich at-Zeile, nach at-Maskierung byte-identisch, Negativkontrolle Body-Differenz = Defekt); DET-5 Em-Dash (identische canonische Form wie En-Dash/Bindestrich/Unterstrich/Leerzeichen); DET-6 Kollaps (`a--b`→`a-b`, `-x`→`x`, `x-`→`x`); DET-7 Match-Scope (ganze Wörter, Body-exklusiv, Substring-/Frontmatter-Treffer liefern keine Kandidaten); DET-8 Orphan (verwaiste Evidenz unzugeordnet, `log.md`-Verwaist-Eintrag mit ``, kein Banner, keine eigenständige Anlage, Erhaltungs-Invariante nur `log.md`). **Defers aufgegriffen/geschlossen** → `deferred-work.md` append-only (7 `### Aufgegriffen`-Blöcke + 1 `### Aufgegriffen (teilweise)`-Block: Em-Dash → §3.2 Pkt. 1b/§5.14 Pkt. 5; Kollaps-Reichweite → §3.2 Pkt. 1b; Match-Scope Stufe a → §3.2 Pkt. 1b; Orphan → §5.10 Pkt. 8; `generated.at`↔AD-17h-Gap → §5.14 Pkt. 1–3; A0-20-Post-Zustand-Negativkontrolle → §5.14 Pkt. 2–4; Misch-Run-Coverage → §5.14; Umlaut/Em-Dash **teilweise aufgegriffen** — der Em-Dash-Anteil in §3.2 Pkt. 1b/§5.14 Pkt. 5 geschlossen, der Umlaut-vs-Transkription-Anteil bleibt offen, kein Instruktions-Defekt). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story D-3); `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert (AD-3, via `git status` geprüft); `schema/canonical-terms.md` unverändert (append-only-Registry unangetastet). **Validator-Verdikt auf Ist-Bundle** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI; keine Concept-Inhalts-Mutation): alle `wiki/`-Dateien SUCCESS. - **Story 3.7 → Review-Loop-2-Abschluss (bmad-code-review Re-Run, 4 Layer — blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor, 2026-08-20):** Nutzer-Entscheidungen D1/D2/D3 = 1/1/1 (je empfohlene Option). Findings: 3 decision-needed / 7 patch / 3 defer / 9 dismissed (False-Positives: „18 PASS lines"-Claim → 14; Wanduhr-Datumsgruppen-Verdacht → Vertrag-§5-Datumsgruppen-Pflicht; Zeilenanker-Off-by-one → exakt; CONSIST-2-ad-hoc-Rollback → korrekte §5.9-Pkt.-5-Semantik; „Nur compiler.md mutiert" → D-3-Scope-Klausel-Misread; „die Baseline" → in §5.9 Pkt. 6 definiert; frontmatter-Status-Timing / fehlender Verification-Transkript → by-design; CONSIST-3-raw-SHA-vs-Setup → korrekt). **Patches:** (1) **D1**: `deferred-work.md` append — zwei Delokalisierungs-Blöcke (Terminologie-Drift `INPUT_UNCOMMITTED`/`UNCOMMITTED_INPUT` pre-existing §5.9/§5.11, Sandbox nutzt §5.9-Label; Misch-Run-Coverage Neu-Anlage+Update → Home Story 3.8) → das done-Bullet („Delokalisierungs-Doku") ist jetzt wahr; in-progress-Bullet-Präzisierung („Defers aus dem Review-Lauf sind im done-Bullet nachgeführt") — Protokollwiderspruch aufgelöst. (2) **D2**: `sprint-status`-Wert `review` im Diff **behalten** (Review-Start-Flip, File-Header-Konvention „review: Implementation complete, ready for review") + 4 Dokumentationsstellen korrigiert (Spec-Code-Map `backlog → review`, SRO-Anker-Text, dieses in-progress-Bullet, §8-Revision-3.2-Klausel „`in-progress`" → „`review` (Impl.-Flip + Review-Start-Flip im selben Commit; finaler `done`-Flip im Step-05-Status-Sync)"). (3) **D3**: `p2_plan`-Element-(1)-Scope-Fix `git status --porcelain -- raw wiki` — exakt wie Instruktion §5.9 Pkt. 6 Element (1) (die dev-interne E1-Ablehnung „Sandbox läuft nur auf sauberen Bäumen" aufgehoben; in den IST-Szenarien wirkungslos, Demo folgt jetzt der Instruktion). **Sandbox-Patches:** CONSIST-1-EC-1-Isolation (Quellen-Löschung **committet** → Element (3) feuert isoliert; Element (1) isoliert über untracked-Datei); **CONSIST-2 Misch-Run-Erweiterung** (Neu-Anlage `delta` + Update `alpha`; Neu-Anlage-Zielpfad `+delta` als erlaubter Plan-Freeze-Teil; Duplikat-Kontrolle in `p2_plan`; Voll-Rollback → **Neu-Anlage-Absenz** via `assert_restored`-Neu-Anlage-Guard — Guard erstmals real geübt); CONSIST-5-`raw/`-SHA gg. `$BASE`-Blob (tautologischer Selbstvergleich entfernt, Muster CONSIST-4); **CONSIST-6 committierter Zustand gültig** (Body-Zeile zitiert `raw/alpha-v2.md#S-3` mit vorhandener `sources`-Nachführung `id: s3` + `generated.at`-Bump — §5.9-Pkt.-2-Update-Form vollzogen, kein mehrdeutiger Referenz-Demo); `rollback()`-Doku-Block (Voll-Rollback = §6-Pkt.-3-Teilzustand; in der Sandbox sind ungetrackte `wiki/`-Dateien lauf-eigener Teilzustand, fremde Änderungen schützen vorher Stash/Scratch nach §5.11 Pkt. 3 — AD-17e); Tippfehler (`porcelan`/`texuelle`/`Ferien-Zustand`). **Instruktions-Patch:** §5.13 Pkt. 7 Determinismus-Vertrag für „Post-Zustand" um den **dokumentierten `generated.at`-Wanduhr-Gap** ergänzt (§5.10 Pkt. 8, A0-20-Konvention, Home Story 3.8) — konsistent zu §5.10/§5.12, die das Gap bereits ausweisen. **Defers:** 3 → `deferred-work.md` Section „Deferred from: code review of … (Story 3.7, 2026-08-20)" (CONSIST-7-Label-Präzisierung; A0-20-Post-Zustand-Negativkontrolle → Story 3.8; pre-existing-Zeitpunktswort-Fuge §5.9 „Anfang der Mutationsphase" vs. §5.13/I/O-Matrix „vor der Mutationsphase" — §5.9 wortlautgeschützt). **Sandbox re-executiert:** CONSIST-1..CONSIST-7, **Exit 0, 14 harte PASS-Assertionen** (7 Szenario-Ende + 4 `assert_restored` — CONSIST-2 neu — + 2 `assert_invariant` — CONSIST-2-Endprobe durch Rollback-Flow ersetzt — + 1 `assert_frontmatter`); einzige HARD-FAIL-Zeile = intendierte CONSIST-2-Freeze-Negativkontrolle (Ghost `gamma`); CONSIST-7 non-vakuum (plan_sha `b855ee9a…` byte-identisch über beide Runs). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation; `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert (AD-3). - **Story 3.7 → `done` (Step-04-Review-Abschluss, 2026-08-20):** Der Review-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1/3.2/3.3/3.4/3.5/3.6-Präzedenz) ist hier als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-7-reason-mutate-trennung-und-konsistenz-endzustand-sicherstell` → **`review`** (Review-Schritt; das `done`-Flip ist Workflow-Konvention des Review-Abschlusses — Step-05 setzt Spec-Frontmatter `status: 'done'`), `last_updated` → 08-20-2026 00:30; Spec-Frontmatter `status: 'in-review' → 'done'`, `review_loop_iteration: 0`; Spec-`## Suggested Review Order` (Review-Trail: §5.13-Reason/Mutate-Sektion → §7/§8-Nachweis → Sandbox-Nachweis → Story-Protokoll/Defers) mit klickbaren `path:line`-Ankern (343/356/358/362/420/461 in `schema/compiler.md`). **Review-Ergebnis (Review-Loop 1, 3 Subagenten — blind-hunter / edge-case-hunter / verification-gap, kein Loopback):** keine intent_gap/bad_spec; Stapel Autofix-Patches — **Spec/SRO/Code-Map-Anker** auf IST-Zeilen korrigiert (§5.13 Einstieg Z. 343, Änderungsplanung Z. 356, Zustands-Restaurations-Invariante Z. 358, keine Engine Z. 362, §7-Bullet Z. 420, §8-Revision-3.2 Z. 461; §6-Start Z. 364, §8-AD-6 Z. 430; SRO-Sprint-Status-Label „in-progress (Implementierung)", keine `done`-Transition im Diff), **„fünf AD-6-Phasen" → „vier"** (Design Notes + §5.13-Intro-Post-Tabelle + Rev-3.2 + Boundaries + Review-Hinweis — konsistent zur AD-6-Rule und der 4-Zeilen-Zuordnungstabelle; Reconcile in die Analyse-Zelle gefasst; `fünf` in compiler.md = 0), **CONSIST-6-Sequenz** (`assert_frontmatter` + `log_commit` VOR `git commit` — der Commit enthält alpha + log.md mit Plan- und SUCCESS-Bullets; Commit enthält den §6-Pkt.-4-Nachweis, Commit-Boundary AD-17f), **CONSIST-7-`log_sha`-Vakuum** (log_sha nach Rollback ist Baseline-Konstante → nur Kommentar; Determinismus-Zeuge = `plan_sha`/`plan_state` aus dem committeten Plan-Capture-Baum, non-vakuum), **CONSIST-1-EC-1-Negativkontrolle** (P2-Element (3), fehlende `raw/alpha-v2.md`-Existenz → `p2_plan` muss `return 1`, textuell benannt, keine Mutation), **pgrep-Robustheits-Guard** (KEINE_ENGINE-Negativkontrolle: `command -v pgrep` → sonst `ps`-Fallback — pgrep auf Git-Bash-Host nicht vorhanden; vorher stille vacuöse Negativkontrolle, jetzt reeller `ps aux`-Scan), **`assert_restored`-Neu-Anlage-Guard** (`git cat-file -e "$BASE:wiki/$p"` — nicht-Baseline-Pfad darf nach Rollback nicht existieren), **Setup-Existenz-Assert** (CONSIST-4: `git cat-file -e "$BASE:raw/..."` ersetzt toten `|| sha256sum`-Fallback ohne pipefail), **Tippfehler `inv_viol` „§5.9 Pkt. 8" → „Pkt. 5"**, **plan-run.capture-Disclaimer** (nur deterministischer Sandbox-Zeuge, kein §5.13-Artefakt; „kein Artefakt-File" bleibt Ask-First-Norm), **Delokalisierungs-Doku** (deferred-work.md append-only: Terminologie-Drift `INPUT_UNCOMMITTED`/`UNCOMMITTED_INPUT` pre-existing §5.9/§5.11, §5.11-Wortlaut geschützt — XY nutzt `INPUT_UNCOMMITTED` wie §5.9-P2-Element (1); Misch-Run-Coverage Neu-Anlage+Update → Story 3.8), **Rejects** dokumentiert (u.a. E1 full-repo-P2-Check — Instruktionstext „Working-Copy von raw/ und wiki/" korrekt; Sandbox läuft nur auf sauberen Bäumen). **Sandbox re-executiert:** CONSIST-1..CONSIST-7, **Exit 0, 14 harte PASS-Assertionen**, einzige HARD-FAIL-Zeile = intendierte CONSIST-2-Negativkontrolle (Freeze-Verletzung auf `gamma`); CONSIST-7 non-vakuum (plan_sha byte-identisch über beide Runs); keine ungewollten `cat:`/`sha256sum:`-Zeilen; Zeilenanker real. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story D-3); `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert (AD-3); Validator-Verdikt auf Ist-Bundle (human-mechanisch, `schema/validator.md` Rev 9, D-3): alle `wiki/`-Dateien SUCCESS. - **Story 3.7 → `in-progress` (Reason/Mutate-Trennung & Konsistenz-Endzustand, Verankerung §5.13, 2026-08-20):** `schema/compiler.md` Revision 3.2 — neue Sektion **§5.13 „Reason/Mutate-Phasen-Trennung & Konsistenz-Endzustand (Story 3.7)“** (nach §5.12, vor §6): verbindliche Verankerung von **AD-6/A0-7** (Reason/Mutate-Trennung; A0-7-AC-2: konsistenter Endzustand bei Abbruch). Die **§0-Ablaufstruktur (0)–(5) bleibt unverändert** (deterministische Takt-Folge, keine Um-Nummerierung); §5.13 ordnet nur logisch zu (AD-6-Phase ↔ §0-Zuordnungstabelle). Inhalte: P2-Block (§5.9 Pkt. 6) institutionalisiert als **Änderungsplanung** (Wortlaut-unverändert referenziert, Rückverweis); **Plan-Freeze** (Veränderungs-Sperre: erlaubte Pfad-Menge = Kandidatenliste ∪ Neu-Anlage ∪ log.md ∪ index.md, Verletzung = Ghost-Diff §5.9 Pkt. 5); **Zustands-Restaurations-Invariante** (Post-Rollback-Diff gg. Baseline leer, Bundle == Baseline ∨ valid committet, deterministisch, ohne Wanduhr A0-20); kein Teilerfolg (Commit-Boundary = Mutations-Boundary, AD-17f); VALIDATION_FAIL (Rollback, keine weiteren Mutationen) vs. VALIDATION_SUCCESS (Mutationen als Ganzes committen, §6-Pkt.-4-Nachweis); **KEINE_EIGENE_ENGINE** (D-3/AD-11: logische Trennung in einer Session, kein Prozess/Server/MCP). §7-Bullet ergänzt (Nachweis-Block), §8-AD-6-Anker, Revisionslog **Revision 3.2** mit Abschlussklausel (AD-3 — `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert; keine neue §7-Klasse; kein Standalone; keine Vertragsänderung; kein neuer Prädikat-/Format-/Frontmatter-Key; keine Workflow-Engine; §0 unverändert; Commit-Boundary-Regel unverändert). `sprint-status.yaml`-Key `3-7-reason-mutate-trennung-und-konsistenz-endzustand-sicherstell` → **`review`** (Implementierungs-Flip `in-progress` + Review-Start-Flip `review` im selben Commit; finaler `done`-Flip im Step-05-Status-Sync), `last_updated` → 08-20-2026 00:30 (Story 3.7). **Sandbox-Nachweis** (`_bmad-output/implementation-artifacts/sandbox-3-7/run-sandbox.sh`, `/tmp`-Baum, Linux-Semantik, nie der reale `wiki/`-/`raw/`-Baum): **CONSIST-1..CONSIST-7, Exit 0, 14 harte PASS-Assertionen** — CONSIST-1 konsistente Änderungsplanung (P2-Block) aus committetem Input + **Plan-Defizit-Abbruch VOR der Mutationsphase** (uncommitteter Input AD-17a); CONSIST-2 **Plan-Freeze** (Verletzung auf Nicht-Plan-Pfad `gamma` erkannt, Ghost-Diff-Rollback); CONSIST-3 **Zustands-Restaurations-Invariante** (Post-Rollback-Diff leer, Bundle == Baseline, SHA-256 byte-identisch, `raw/` unverändert AD-3); CONSIST-4 kein Teilerfolg als fertige Mutation (Commit-Boundary = Mutations-Boundary AD-17f); CONSIST-5 **VALIDATION_FAIL** (§6-Pkt.-3-Rollback, keine weiteren Mutationen); CONSIST-6 **VALIDATION_SUCCESS** (Mutationen als Ganzes committet, Diff-Selbsttest ohne Ghost-Diff, §6-Pkt.-4-Nachweis, kein Wanduhr-Trigger A0-20); CONSIST-7 **Determinismus-Zwei-Run nicht-vakuum** (identische Plan-/Rollback-/State-Outputs, AD-17h/A0-19; der Plan wird nach Rollback aus dem committeten Baum `git show`-gelesen — der einzige deterministische Zeuge, da `rollback` auf Baseline resettet) + **KEINE_ENGINE-Negativkontrolle** (kein Prozess/Server/MCP — D-3/AD-11, AC-4). Die einzige HARD-FAIL-Zeile im Sandbox-Output ist die intendierte CONSIST-2-Negativkontrolle (Freeze-Verletzung auf `gamma` — erwarteter Non-Zero-Exit, vom Szenario hart assertiert). **Keine Story-3.7-Defers** (per Implementierungsstand, per Spec-README: keine Home-3.7-Defers; Defers aus dem Review-Lauf sind im done-Bullet nachgeführt). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story D-3); `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert (AD-3); Validator-Verdikt auf Ist-Bundle (human-mechanisch, `schema/validator.md` Rev 9, D-3): alle `wiki/`-Dateien SUCCESS. ## 2026-08-19 - **Story 3.6 → `done` (Step-04-Review-Abschluss, 2026-08-19):** Der Review-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1/3.2/3.3/3.4/3.5-Präzedenz) ist hier als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-6-…` → **`done`**, `last_updated` → 08-19-2026 22:10; Spec-Frontmatter `status: 'in-review' → 'done'`, `review_loop_iteration: 0`; Spec-`## Suggested Review Order` (Review-Trail: §5.12-Leasing-Staleness-Sektion → §7/§8-Nachweis → Sandbox-Nachweis → Story-Protokoll/Defers) verankert. **Review-Ergebnis (Review-Loop 1, 3 Subagenten — blind-hunter / edge-case-hunter / verification-gap, kein Loopback):** keine intent_gap/bad_spec; Stapel Autofix-Patches (Terminologie-Inversion „jünger→älter" in §5.12 Pkt. 1/3/6 + §8-Revisionslog + log.md + Spec, Gen kleiner = älter; Generations-Quellen-Präzedenz deterministisch gepinnt — committeter `lease-granite-root`-Marker gewinnt, sonst `lease/`-Baumableitung, sonst Startwert `gen = 0`; STALE-1-kern generationenbasiertes TTL gegen **dieselbe** `id` durchgesetzt, STALE-3-Re-Akquise, STALE-5-Same-id-A/B, holder_id-genuine Ableitung, baseline_commit-Merge-Base-Diskrepanz real, STALE-4-**lesender-**`raw/`-Bind (Recovery-Basis Zugriffs-/Consistency-Basis), Marker-Idempotenz-Regex, STALE-6-Full-State-Invariante, log_bullet-Datumsgruppen); **1 neuer Defer** → `deferred-work.md` append-only (Schicksal des `lease//`-Branch nach Übernahme/Stale-Markierung — Home: spätere Instruktions-/Sandbox-Runde oder Story 3.8). **Sandbox re-executiert:** STALE-1..STALE-6 + Erhaltungs-Invariante, **Exit 0, 12 harte PASS-Assertionen**; AD-3 geprüft (`schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert); Validator-Verdikt auf Ist-Bundle: alle `wiki/`-Dateien SUCCESS (keine Inhalts-Mutation). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story). - **Story 3.6 → `in-progress` (Lease-Staleness & Recovery-Basis, Verankerung §5.12, 2026-08-19):** `schema/compiler.md` Revision 3.1 — neue Sektion **§5.12 „Lease-Staleness & Recovery-Basis (Story 3.6)“** (nach §5.11, vor §6), die **verbindliche Verankerung der Staleness-/Recovery-Dimension** (AD-17d, A0-15; §5.11-Seam-Kriterium S-1 und Pkt.-7-Text sowie §5.11 Pkt. 1 „verbleibt bis Story 3.6“ textuell unverändert — Haltbarkeits-Fuge): (1) **Lease-Registrierung & generationenbasiertes TTL** — Registrierung im **Clone-Root-State** (nicht `wiki/`/`raw/`/Concept-Frontmatter, Vertrag §3.1–§3.7 unverändert), monotoner Run-Generator (**`generation`-Zähler je Clone-Root**, deterministisch aus dem committeten Git-State ableitbar: `lease/`-Baumableitung oder Mono-Commit-`lease-granite-root`-Marker), **TTL-Ablauf-Kriterium generationen-basiert** (ältere Erzeugungs-Generation = stale, blockiert keinen nachfolgenden Run, I/O-Matrix `STALE_ABLAUF`), **kein Wanduhr-Timestamp im Lockfile-/Registrierungs-Format** (A0-20; streng durchsetzendes Zeit-TTL = Ask-First); (2) **holder_id-Ableitung** (deterministischer Default `holder_id := -`, reproduzierbar aus dem committeten Git-State; **Story-3.5-Defer aufgegriffen**); (3) **Verwaist-Klassifikation, Übernahme & Stale-Markierung** (AD-17e/AD-17g) — `VERWAIST_UEBERNEHMEN` gg. erneute Merge-Base-Prüfung (Pkt.-4-Regel) mit log.md-Protokoll, `VERWAIST_STALE_MARKIEREN` via Registry-Marker der aktuellen Generation (Blockade aufgehoben); verwaiste Leases **nie still gelöscht** (AD-17e); (4) **baseline_commit-Merge-Base-Diskrepanz-Regel** — `git merge-base` gewinnt, notierter `` bleibt Sekundär-Fingerprint, Fallback ohne Boundary (alle `raw/`-Dateien Zuwachs, Merge-Base = ältester Fundamentpunkt, §5.9 Pkt. 6 R-1/AD-14); gilt auch bei Lease-Übernahme (**Defer aufgegriffen**); (5) **`raw/`-Recovery-Basis & native `git stash`-Variante** — `raw/` immutable AD-3 als Zugriffs-/Consistency-Basis, Real-Baum-Beweis auf Sandbox-Evidenzwege beschränkt (EC-1-Grenze), `git stash push -- ` als zweite textuell zulässige Schutzvariante (byte-identisch, nie gelöscht, Restore dokumentiert; **Defer aufgegriffen**); (6) **Registrierungs-Invariante & kumulativer Registry-Aufbau über Runs** (Vertrag §5) — `Gen > erzeugend oder gleiche Gen`, hält den sichtbar höchsten Reg-Generator, kein eigener `# Log`-Stand in der Registry (`wiki/log.md` alleiniger Aufzeichnungs-Ort; **Defer aufgegriffen**); (7) **`log.md`-Eintragspflicht & Determinismus-Vertrag** (AD-17h/A0-19) — Registrierung/TTL, Lease-Übernahme, Stale-Markierung, Recovery-Basis-Nutzung als datumsgruppierte Einträge (neueste zuerst, `` D-2), **deterministisch aus dem committeten Git-State**, kein Wanduhr-Timestamp steuert einen Vorgang. **§7-Vorbehalt `Lease-Staleness/Recovery` (`:376`) aufgelöst:** „**in §5.12 dieser Instruktion verankert (Story 3.6)**“ (§5.11-Pkt.-7-Seam-Satz und §7-Leasing-Enum-Bullet-Text unverändert). **§8-Normreferenzen** AD-17d/A0-15 von reiner Story-Zuordnung auf **§5.12-Anker** angehoben (`AD-17d (Lease-Staleness, §5.12)`, `A0-15 (Lease-Staleness, §5.12)`). **§8-Revisionslog Revision 3.1** mit Abschlussklausel (keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` AD-3; **keine neue §7-Invaliditätsklasse**; **kein Standalone** D-3; keine Vertragsänderung; **kein neuer Frontmatter-Key für Lease-Metadaten**; kein Prädikat-/Format-Key; Commit-Boundary-Regel unverändert). **Sandbox `sandbox-3-6/run-sandbox.sh` re-executierbar (Muster sandbox-3-5, `/tmp`-Baum, `core.autocrlf false`-Pin für deterministische `git stash`-Roundtrips; nie der reale `wiki/`-`/raw/`-Baum):** **STALE-1 STALE_ABLAUF** (abgebrochener Run hinterlässt Lease + Registrierung ohne Freigabe; nachfolgender Run klassifiziert sie generationenbasiert als stale — **kein Blockade-fail**, akquire run-b erfolgreich; Lockfile + Registry-Zeile bleiben, AD-17e; kein Wanduhr-Timestamp A0-20; log.md-TTL-Eintrag Pkt. 6a/7a), **STALE-2 VERWAIST_UEBERNEHMEN** (Übernahme gg. erneute Merge-Base-Prüfung `git merge-base == $BASE`, log.md-Übernahme-Eintrag Pkt. 6b/7b, holder_id-Ableitung Pkt. 2, nichts still gelöscht AD-17e), **STALE-3 VERWAIST_STALE_MARKIEREN** (Registry-Marker `stale: run-a (Gen 2)`, `lease_active=false` → Blockade aufgehoben, log.md-Eintrag Pkt. 6c/7c, Gen-Invariante gehalten, Lockfile+Zeile bleiben AD-17e), **STALE-4 RECOVERY_RAW_BASIS** (`raw/`-SHA-256 vor/nach identisch — immutable AD-3, EC-1-Grenze; native `git stash push`/`pop` um `wiki/alpha.md` byte-identischer Restore via SHA-256, nie gelöscht; log.md-Recovery-Eintrag Pkt. 6d/7d), **STALE-5 REGISTRIERUNGS-INVARIANTE** (drei Runs in EINER `registry/wiki` — Gen 3 == höchster, Regression auf Gen 1 zurückgewiesen (Invariante Pkt. 6); verwaiste Kanten run-a/run-b/run-c nie gelöscht AD-17e; HOLD gegen aktive Lease deterministisch (akquire run-c verweigert), kein Abbruch-Text; kein Wanduhr), **STALE-6 DETERMINISMUS** (AD-17h/A0-19: zwei identische Runs → Registry- und `log.md`-SHA-256 **byte-identisch**, identische Stale-Markierungs-Klassifikation); **Exit 0, 6/6 harte PASS-Szenarien** (re-executiert, 08-19-2026). **4 Defers aufgegriffen (Story 3.5, Home 3.6):** `deferred-work.md` append-only — vier `### Aufgegriffen`-Blöcke (holder_id-Quelle → §5.12 Pkt. 2; baseline_commit-Diskrepanz → §5.12 Pkt. 4; Sandbox-log-Akkumulator/cumulative Registry → §5.12 Pkt. 6; native `git stash`-Variante → §5.12 Pkt. 5), je Status `aufgegriffen (Home erledigt in §5.12 …)` + Sandbox-Nachweis; keine neuen Story-3.6-Defers. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story; `sprint-status.yaml`/`deferred-work.md`/`sandbox-3-6/` liegen außerhalb `wiki/` und sind nicht Teil der Diff-Probe). **Validator-Verdikt (per-Datei, human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI; unverändert zur Story 3.5, Story 3.6 mutiert keine Concept-Inhalte):** alle **7** `wiki/`-Dateien **SUCCESS** — `wiki/index.md` (Punkt 11, Bundleroot), `wiki/knowledge-kompilation-inkrementell.md`, `wiki/llm-wiki-prinzip.md`, `wiki/wissensarchitektur-trennung-states.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1), `wiki/log.md` (frontmatterlos, Punkt 10), `wiki/wissensarchitektur/index.md` (frontmatterlos, Punkt 10/11), `wiki/wissensarchitektur/source-material.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart Rev 9). `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3, via `git status` geprüft); keine neue §7-Klasse; kein Standalone (D-3). `sprint-status.yaml`-Key `3-6-…` → **`in-progress`**, `last_updated` → 08-19-2026 21:30. - **Story 3.5 → `done` (Step-04-Review-Abschluss, 2026-08-19):** Der Review-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1/3.2/3.3/3.4-Präzedenz) ist hier als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-5-…` → **`done`**, `last_updated` → 08-19-2026 20:37; Spec-Frontmatter `status: 'in-review' → 'done'`, `review_loop_iteration: 0`; Spec-`## Suggested Review Order` (Review-Trail: §5.11-Leasing-Sektion → §7/§8-Nachweis → Sandbox-Nachweis → Story-Protokoll/Defers) verankert. **Review-Ergebnis (Review-Loop 1, 3 Subagenten — blind-hunter / edge-case-hunter / verification-gap, kein Loopback):** keine intent_gap/bad_spec; Stapel Autofix-Patches (Text-Fixes (§5.11): Pkt.-1-Querverweis „Pkt. 3" → „Pkt. 2", UNCOMMITTED_INPUT als dieselbe §5.9-P2-Prüfung deklariert, „neueste zuerst"-Datumsgruppe, Lease-Freigabe als deterministischer Pkt.-1-Sub-Bullet + Pkt.-6-Eintragstyp (e), testbares 3.5/3.6-Seam-Kriterium, AD-17d/A0-15-Norm-Rückverweis, §8-Revision 3.1; Sandbox: Header-Bullet-Paare, L2-Lease-Hold-Exit-Assertion, L4-Restore-Weg + UNCOMMITTED_INPUT-Abbruch-Wirkung, L6-BUILD_HEAD, L5-Klassifikations-Bullet, N1-§5.10-Pkt.-8-Orphan-Nachbarschaft, D2-Kumulative-Aufzeichnung); **4 Defers** → `deferred-work.md` append-only (holder_id-Quelle · baseline_commit-Merge-Base-Diskrepanz-Regel · Sandbox-log-Akkumulator [D2 schließt] · native `git stash`-Variante — Home je Story 3.6/3.8). **Sandbox re-executiert:** L1–L6 + N1 + D1 + D2, **Exit 0, 21 harte PASS-Assertionen**; AD-3 geprüft (`schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert); Validator-Verdikt auf Ist-Bundle: alle `wiki/`-Dateien SUCCESS (keine Inhalts-Mutation). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story). - **Story 3.5 → `in-progress` (Leasing & Dirty-Tree-Schutz, Verankerung §5.11, 2026-08-19):** `schema/compiler.md` Revision 3.0 — neue Sektion **§5.11 „Leasing & Dirty-Tree-Schutz für konkurrierende Producer (Story 3.5)“** (nach §5.10, vor §6): Lease-Akquise auf **`lease//`-Branches** vom Merge-Base mit **Lockfile** (`lease//.lock`, semantisch identisch in jedem Adapter, A0-12; deterministische Felder `area`/`id`/`producer`/`baseline_commit`/`holder_id` — kein Zeitstempel, AD-17h), Basis-Commit = eindeutiger Commit-Object-Wert (Merge-Base-Disziplin); **Root-Scope-Lease** (AD-17b, A0-13: `wiki/` inkl. `log.md`, `index.md`, aller Root-Dateien; kein Bereich jenseits `wiki/`); **Dirty-Tree-Schutz** (AD-17e/f, A0-16: Pre-Mutation-Prüfung, Stash/Scratch-Zone außerhalb `wiki/`, fremde uncommittete Änderungen NIE gelöscht, log.md-Dokumentation, UNCOMMITTED_INPUT-Abbruch „published/committed Input erforderlich“ AD-17a); **kein textueller Auto-Merge** (AD-17c, A0-14: compiler-vermittelter AD-16-Pfad, Default Erhaltung, log.md-Klassifikations-Eintrag, Eskalation AD-17g); **Commit-Boundary = Mutations-Boundary** unverändert (§0/§5.3); `log.md`-Eintragspflicht (Akquise/Schutz/Klassifikation/Eskalation, ``, D-2); **Determinismus-Vertrag** (AD-17h/A0-19) · **Lease-Staleness/Recovery bleibt → Story 3.6** (AD-17d, A0-15). §7-Vorbehalt `:357` **aufgelöst** (→ §5.11), §8-Normreferenzen um AD-17b/c/d/e-f/g + A0-12..A0-16 ergänzt, Abschlussklausel (AD-3, keine neue §7-Klasse, kein Standalone D-3, keine Vertragsänderung, kein neuer Frontmatter-Key). `sprint-status.yaml`-Key `3-5-…` → **`in-progress`**. **Sandbox `sandbox-3-5/run-sandbox.sh` re-executierbar (Muster Story 3.4, /tmp-Baum):** L1 Lease-Akquise (Branch-Form, Lockfile-Felder, Merge-Base = eindeutiger Commit-Object-Wert), L2 Lease-Hold (zweite Akquise verweigert, Lockfile unverändert, keine Mutation), L3 Root-Scope (index/log/Root-Dateien erfasst; raw//lease/ keine Mutationsziele), L4 Dirty-Tree-Schutz (Pre-Mutation-Prüfung erkennt Fremd-Aenderung, Scratch-Zone byte-identisch, NIE gelöscht, log.md-Dokumentation; UNCOMMITTED_INPUT-Abbruch), L5 NO_AUTO_MERGE (Merge-Versuch scheitert; AD-16-Erhaltung + Eskalation AD-17g, beide Behauptungen erhalten), L6 COMMIT_BOUNDARY (Zwischenstand nie committet; validierte Mutation committet; invalidierter Zwischenstand → Validierungs-FAIL → Rollback §5.3), N1 ??-Ghost-Diff-Negativkontrolle (Ghost-Datei als Duplikat/Ghost-Diff verworfen, Kontrolle nicht vacuous), D1 Determinismus (Lockfile-Inhalt + Merge-Klassifikation Zwei-Run-identisch, AD-17h/A0-19); **Exit 0**, **21 harte PASS-Assertionen** (2 HARD-FAIL-Zeilen sind die intendierte N1-Ghost-Erkennung). **Review-Loop-1-Patches (Step-04, kein Loopback, 2026-08-19):** log-Helfer → **Header-Bullet-Paare** je Eintrag (Vertrag-§5-Datumsgruppe, neueste zuerst, wie §5.9 Pkt. 4); **L1 Lease-Freigabe (Release, deterministisch, §5.11 Pkt. 1)** — `free_lease` entfernt nach committetem Run das Lockfile und dokumentiert den Abschluss als **log.md-Freigabe-Eintrag** (+ log_release-Helfer; Lockfiles häufen sich nicht; eine ohne Freigabe beendete Lease verbleibt → **Story 3.6**); L2 `akquire`-Exit-Status != 0 als Fehlerpfad-Assertion; **L4 Restore-Weg** (Scratch → Bundle, byte-identischer Restore; Fremd-Aenderung nie gelöscht) + **UNCOMMITTED_INPUT-Abbruch-Wirkung hart assertiert** (`HEAD` unverändert `[ "$(git rev-parse HEAD)" = "$BASE" ]`, `ALPHA_ONLY` exakt „alpha" — **dieselbe Pre-Run-Prüfung** wie §5.9-P2-Element (1) `INPUT_UNCOMMITTED`, kein zweiter Abbruch-Pfad, §5.11 Pkt. 3); L5 Merge-Klassifikations-Bullet in Datumsgruppen-Form (`-- '- Merge-Klassifikation: …'`); **L6** Widerspruchs-Tautologie (`BROKEN_HEAD`/`COMMIT_AFTER_RUN`) → einzelnes `BUILD_HEAD`, Frontmatter-Negativtest subshell-gewrappt (Exit-1-safe); N1-Header um §5.10-Pkt.-8-Orphan-Nachbarschaft + §5.9-Pkt.-5-Erhaltungs-Invariante; L3-`??`-Sicht-Assertion (`^?? wiki/beta.md`); **neues D2 „Kumulative Koordinations-Aufzeichnung"** — 4 Koordinationsentscheidungen (log_lease + log_dirty + log_merge + log_release) in EINEM `log.md`: `HEADERS = 4`, jede Bullet präsent, erst an der Commit-Boundary committiert — PASS. **Seam-Kriterium 3.5/3.6 (compiler.md §5.11 Pkt. 7):** 3.5 = committeter-Git-State-Determinismus (AD-17h), 3.6 = Zeit-/Umgebungs-Zustands-Frage (TTL-Ablauf, verwaiste/hängende Leases, `raw/`-Recovery). **4 Defers → `deferred-work.md`** (holder_id-Uniqueness-Quelle; baseline_commit-Merge-Base-Diskrepanz-Regel; Sandbox-log-Akkumulator vs. isolierte Szenarien [D2 schließt]; native `git stash`-Variante ungetestet — Home je Story 3.6). Sandbox nach allen Patches re-executiert: **Exit 0, 21 PASS**. **Validator-Verdikt auf Ist-Bundle:** `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert (AD-3); alle `wiki/`-Dateien SUCCESS (keine Inhalts-Mutation); `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag). - **Story 3.4 → `done` (Step-04-Review-Abschluss, 2026-08-19):** der Review-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1/3.2/3.3-Präzedenz) ist hier als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-4-…` → **`done`**, `last_updated` → 08-19-2026 16:40 (Präzisions-Rückgewinnung auf HEAD-Format `HH:MM`); Spec-Frontmatter `status: 'in-review' → 'done'`, `review_loop_iteration: 0`; Spec-`## Spec Change Log`-Review-Loop-1-Eintrag + `## Suggested Review Order` (Review-Trail: Synthese-Sektion → §7/§8 → Sandbox-Nachweis → Provenienz/Status) verankert. **Review-Ergebnis (Loop 1, 3 Subagenten — blind-hunter / edge-case-hunter / verification-gap, kein Loopback):** keine intent_gap/bad_spec; Stapel Patches (compiler.md §5.10: Reflektiertheits-Selbsttest-Muster auf Zeilenanfangs-Label erweitert `^(Quelle|Source) [A-Z][A-Za-z0-9_ -]*:`, **Body-Reihenfolge deterministisch** über Beleg-Anker LC_ALL=C, **Konsolidierungs-Kriterium** Befund-Äquivalenz, Duplikat-Fall + Orphan-Kontrolle in Pkt. 8, Stil-/Genus-Korrekturen; Sandbox: `git add -A`-wiki-Staging entfernt → Pkt.-8-`??`-Sicht lebendig, **S5-Pkt.-8-`??`-Negativkontrolle** (Ghost-Datei-HARD-FAIL), **N1**-Stimulus-Kommentar, **neue Szenarien N2 Disagreement (AD-16, §5.10 Pkt. 3/7)** + **N3 AD-4c-Übernahme-Marker** — erstmals = **10 Szenarien S1–S6 + N1–N3 + FW**, Exit 0 dreimal re-executiert, 30 harte PASS-Assertionen; S1/S2-log.md-Multi-Source-Listen; log.md-/Spec-/sprint-status-Konsistenz); **4 Defers** → `deferred-work.md` append-only (AD-16/AD-4c-reale-Anwendung Home Epic-4, Orphan-Kontrolle Home Story 3.8, Umlaut/Em-Dash-Sandbox-Normalisierung Home Story 3.8, Frozen-„Nickel"-Typo Re-Negotiation); Rejects dokumentiert. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story); `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3, geprüft). Sandbox re-executiert: **10/10 Szenarien PASS, Exit 0**. - **Story 3.4 — Step-03-Abschluss Audit (2026-08-19):** **Sandbox-Nachweis re-executiert (Story-3.4-Sandbox, `bash _bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh`, Linux-Semantik auf einem `/tmp`-Baum, Exit 0)** — jetzt **S1–S6 + N1–N3 + Form-Wahl-Probe FW = 10 Szenarien** (zuvor 7): **N1 NO_OP-SYNTHESE** ergänzt (deckt die I/O-Matrix-Zeile `NO_OP_SYNTHESE`, Story-3.3-U4-Muster: zweite committete Quelle mit redundanter Evidenz zum selben Thema → keine Form greift → **No-Op als Nicht-Form**: volle Byte-Identität von `alpha.md`/`log.md`/`index.md`, kein `generated.at`-Bump, kein sources-Zusatz, kein `log.md`-Eintrag, Probe leer = Ghost-Diff-negativ — PASS), **N2 DISAGREEMENT** (AD-16-Default, §5.10 Pkt. 3/7: widersprüchliche Aussagen zweier Quellen werden **nicht** still zu einer scheinbar eindeutigen Aussage zusammengeführt; beide Behauptungen + je Beleg bleiben, kein `(e; f)`-Falsch-Multi-Beleg, `Disagreement:`-Eintrag in `log.md` — Epic-4-Interface — PASS) und **N3 AD-4c-UEBERNAHME-MARKER** (Kontext-Marker-Muster „übernommen aus `gamma` auf Basis von `raw/gamma-v1.md#S-1`, nicht eigenständig belegt"; eigenständig belegte Aussagen tragen den Marker nicht; `raw/gamma-v1.md` wird **nicht** als eigene `sources`-Quelle eingetragen — PASS). **S5-Pkt.-8-`??`-Negativkontrolle** nun lebendig: eine ungetrackte Nicht-Ziel-Datei (`ghost.md`) außerhalb der erlaubten Ziel-Pfade wird von der `??`-Sicht als Duplikat/Ghost-Diff HARD-FAIL erkannt (Story-3.3-U9-Muster, nicht vacuous). **S5-Mechanik korrigiert** (auditierte `&&`-Verkettung von `assert_invariant`/`assert_frontmatter` ersetzt): die Erhaltungs-Invariante wird in Non-Exiting-Varianten aufgespalten (`inv_viol` + `assert_frontmatter_ok`), S5-Setup als regelkonforme Anlage (delta + Index-Link + log-Eintrag) restrukturiert — der Verstoß sitzt jetzt ausschließlich in der **Struktur-Ebene** (unbefugter Key `foo:`); Path-Set-Ebene teils erwartet gehalten, teils das Erkennen des Struktur-Verstoßes hart assertiert (P2-Element (6), Vertrag §3.3/§3.4-Subset — nicht vacuous) — PASS. **Matrix-Test-Audit (step-03):** alle 7 I/O-Matrix-Zeilen abgedeckt+bestanden — HAPPY_SYNTHESE_NEUANLAGE→S1, HAPPY_SYNTHESE_KONSOLIDIERUNG→S2, HAPPY_SYNTHESE_UPDATE→S4, NO_OP_SYNTHESE→N1, ANEINANDERREIHUNG_NEGATIV→S3, STRUKTUR_ERHALT→S5, SYNTHESE_OVERLAP_FORMCROSS→FW. Spec-`## Tasks & Acceptance`: alle 4 Execution-Tasks `[x]`. Layout-/Struktur-/AD-3-/Erhaltungs-Invariante-Verifikation erneut bestanden (`git status --porcelain -- wiki/` ausschließlich `wiki/log.md`; `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert). - **Story 3.4 «Wissen aus mehreren Sources synthetisieren — gemischte claim-granulare Provenienz operationalisieren» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-4-wissen-aus-mehreren-sources-synthetisieren` **`in-progress`**):** `schema/compiler.md` → **Revision 2.9** — die **Synthese-Dimension** (AD-4, FR-7; §7-Vorbehalt `:343` aufgelöst) als neue Sektion **§5.10 „Synthese aus mehreren Sources (Story 3.4)"** verankert (nach §5.9, vor §6): (1) **Synthese-Stimulus** — ≥ 2 belegende `raw/`-Quellen desselben Themas per §2-Interpretation → eine Synthese-Einheit; einzelne Quelle bleibt auf §5.9-/§3.2-Pfad; (2) **Ein-Ziel-Repräsentation (FR-7 AC-1)** — ein Synthese-Concept über einen Ziel-Pfad (§5.7-Routing), `sources`-Liste ≥ 2 Einträge, **deterministisch lexikografisch nach `resource` (LC_ALL=C, AD-17h/A0-19)**, getrennte Zusammenfassungs-Concepts je Quelle verboten (FR-7); (3) **gemischte claim-granulare Provenienz (AD-4a/4b, A0-3)** — je Aussage Inline-`raw/`-Verweis §5.5, **Multi-Beleg-Konsolidierung** (§5.5-Semikolon-Form, voller Pfad je Beleg; keine Beleg-Tilgung AD-4), **AD-16-Default** (widersprüchliche Aussagen bleiben, Disagreement in `log.md` — Epic-4-Interface); (4) **AD-4c-Übernahme-Marker** („übernommen aus `` auf Basis von ``, nicht eigenständig belegt" — nie alleinige Provenienz); (5) **Reflektiertheits-Selbsttest (FR-7 AC-4/NFR-7)** — keine per-Source-Zusammenfassungs-Struktur („Quelle A: …/Quelle B: …"), grepbasiert `grep -nE 'Quelle [A-Z]:|Source [A-Z]:'`, Befund = textuell benannter Instruktions-Selbsttest-FAIL (NFR-4), vor Run-Abschluss zu beheben; (6) **§5.6-Pin unverändert** + **Form-Wahl-Klassifikationsprobe (Story-3.3-Defer U2/U7)** — Überlapp-Einheiten an die §5.9-Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` (erste zutreffende Form, AD-17h), Textgenauigkeits-Rahmen der übrigen Formen je Teilbestand; **(7) `log.md`-Eintragspflicht** — „Story 3.1-Update" bei Synthese-Update, Anlage-Eintrag bei neuem Synthese-Concept (disambiguierbar), Multi-Source-Liste + `` (R-1); (8) **Erhaltungs-Invariante (§5.9 Pkt. 5 gilt unverändert) + Determinismus-Vertrag** — Ziel-Pfad via §3.2/§5.7, `sources`-Lexikografie, Konsolidierung/Form-Zuordnung deterministisch; `generated.at`-Wanduhr-Gap bleibt A0-20-Konvention, Home Story 3.8. **§7:** Synthese-Vorbehalt **aufgelöst** („in §5.10 verankert"); Scope-Einleitung um §5.10 geöffnet; verbleibende 3.x-Themen: Leasing/Dirty-Tree → Story 3.5/3.6. **§8:** Revisionslog **Revision 2.9** mit Abschlussklausel (keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` AD-3; **keine neue §7-Invaliditätsklasse**; **kein Standalone** D-3; keine Vertragsänderung; **keine fünfte Update-Form** — Abgrenzungs-Reihenfolge §5.9 unverändert, Synthese = Querschnitt; kein Leasing-Scope; Commit-Boundary-Regel unverändert). **Sandbox-Nachweis (re-executiert 2026-08-19, ab Workspace-Root, `bash _bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh`; Linux-Sandbox-Semantik auf einem `/tmp`-Baum, nie der reale `wiki/`-Baum; Exit **0**, zweimal re-executiert):** Mini-Bundle mit `alpha`/`gamma`-Root-Concepts; Szenarien **S1–S6 + N1–N3 + Form-Wahl-Klassifikationsprobe FW (10)**, harte Pass/Fail-Assertionen (Exit 1; damit inzwischen **10 Szenarien, Exit 0**, zweimal re-executiert): **S1 NEU-ANLAGE** (zwei Quellen `raw/synth-a.md`+`raw/synth-b.md` → **ein** Synthese-Concept `delta`, `sources` ≥ 2 lexikografisch LC_ALL=C — PASS, gemischte §5.5-Belege je Aussage — PASS, keine per-Source-Struktur — PASS, Index-Link Punkt 11 + Anlage-Eintrag — PASS, Probe `{delta index log}` — PASS, Frontmatter — PASS), **S2 KONSOLIDIERUNG** (redundante Aussage in beiden Quellen → **eine** konsolidierte Aussage mit Multi-Beleg-Semikolon-Form `(raw/synth-c.md#S-1; raw/synth-d.md#S-1)` — PASS, keine Beleg-Tilgung AD-4 — PASS, Probe `{delta index log}` — PASS), **S3 NEGATIV-KONTROLLE ANEINANDERREIHUNG** („Quelle A:/Quelle B:"-Struktur wird vom Reflektiertheits-Selbsttest erkannt — nicht vacuous — und durch integrierte, provenance-versehene Aussagen umgebaut (NFR-4) — PASS), **S4 SYNTHESE-UPDATE** (zwei Quellen treffen den bestehenden Pfad `alpha` → §5.9-Formwahl **ERWEITERN**, `sources`-Zuwachs `s2`+`s3` lexikografisch, bestehende belegte Aussagen byte-identisch, »Story 3.1-Update«-Eintrag, Probe `{alpha log}` — PASS; Index-Link unverändert, §5.9 Pkt. 3), **S5 STRUKTUR-/FRONTMATTER-INVARIANTE** (unbefugter Key `foo:` im Synthese-Concept → Frontmatter-Subset-HARD-FAIL, Pkt. 8/P2-Element (6) — PASS; **Pkt.-8-`??`-Negativkontrolle lebendig**: ungetrackte Nicht-Ziel-Datei `ghost.md` → Duplikat/Ghost-Diff-HARD-FAIL, nicht vacuous), **S6 ZWEI-RUN-IDENTITÄT (AD-17h/A0-19)** (zwei unabhängige Synthese-Runs über dieselben zwei Quellen → byte-identisches Ergebnis: `delta.md`/`log.md`/`index.md`-SHA-256 identisch je Lauf, auch nach Commit — PASS), **N2 DISAGREEMENT (AD-16, §5.10 Pkt. 3/7)** (widersprüchliche Quellen-Befunde → beide Behauptungen + je Beleg bleiben, kein `(e; f)`-Falsch-Multi-Beleg, `Disagreement:`-Eintrag in `log.md` — Epic-4-Interface — PASS), **N3 AD-4c-ÜBERNAHME-MARKER** (Kontext-Marker „übernommen aus `gamma` auf Basis von `raw/gamma-v1.md#S-1`, nicht eigenständig belegt"; eigenständig belegte Aussagen tragen den Marker nicht; `raw/gamma-v1.md` als übernommene Quelle nicht in `sources` — PASS), **FW FORM-WAHL-KLASSIFIKATIONSPROBE** (Story-3.3-Defer U2/U7: gemischte Einheit mit Ersetzungs-Befund → erste zutreffende Form **KORRIGIEREN**; Ablösung mit Ersetzungs-Multi-Beleg, alter Wortlaut erhalten AD-16-Default, Nebenbefund byte-identisch, `sources` ≥ 2 lexikografisch, Probe `{alpha log}` — PASS). **Erhaltungs-Invariante §5.9 Pkt. 5 wird hart erzwungen** (Proben-Einträge normalisiert ⊆ {betroffener Pfad, log} ∪ Neu-Anlage-Zielpfade ∪ Index; `??`-Sicht = keine neue Datei außer echten Ziel-Pfaden; kein Ghost-Diff lässt sich still durchschleusen). **Status-/Diff-Nachweis:** nach diesem Instruktions-Run zeigt `git status --porcelain -- wiki/` ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante gewahrt, keine Concept-Inhalts-Mutation (Instruktions-Story, Demonstration per Sandbox). **Validator-Verdikt (per-Datei, human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI; unverändert zur Story 3.3, Story 3.4 mutiert keine Concept-Inhalte):** alle **7** `wiki/`-Dateien **SUCCESS** — `wiki/index.md` (Punkt 11, Bundleroot), `wiki/knowledge-kompilation-inkrementell.md`, `wiki/llm-wiki-prinzip.md`, `wiki/wissensarchitektur-trennung-states.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1), `wiki/log.md` (frontmatterlos, Punkt 10), `wiki/wissensarchitektur/index.md` (frontmatterlos, Punkt 10/11), `wiki/wissensarchitektur/source-material.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart Rev 9). `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3, via `git status` geprüft); keine neue §7-Klasse; kein Standalone (D-3); keine fünfte Update-Form. Spec-Frontmatter: `status: 'in-progress'`, `review_loop_iteration: 0` (zum Audit-Zeitpunkt). - **Story 3.3 → `done` (Step-04-Review-Abschluss, 2026-08-19):** der Review-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1/3.2-Präzedenz: Review-Abschluss setzt `done` im selben Loop) ist hier als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-3-…` → **`done`**, `last_updated` → 08-19-2026 13:21; Spec-Frontmatter `status: 'done'`, `review_loop_iteration: 0`; Spec-`## Suggested Review Order` verankert (Review-Trail: Abgrenzungs-Mechanik → Struktur-Invariante/P2 → Sandbox-Nachweis → Provenienz/Status). **Review-Ergebnis (Loop 1, 3 Subagenten, kein Loopback):** keine intent_gap/bad_spec; 1 Stapel Patches (Präzedenz-Reihenfolge + No-Op-Nicht-Form + Korrigieren-Wortlaut-Erhaltung in `schema/compiler.md`; Sandbox U1–U9 mit 2 neuen Negativ-Kontrollen U8/U9, vollen byte-Identitäts-Assertionen, reellen `S-N`-Ankern, `-eq 1`-Konsolidierung, Frontmatter-Reihenfolge/Duplikat); 5 Defers → `deferred-work.md`; Rejects dokumentiert. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag) — keine Concept-Inhalts-Mutation (Instruktions-Story); `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3). Sandbox re-executiert: **9/9 PASS, Exit 0**. - **Step-04-Review Loop 1 / Patch-Runde (Story 3.3, 2026-08-19):** bmad-code-review, 3 Subagenten (blind-hunter 9, edge-case-hunter 2+Minors, verification-gap 18 Findings); Klassifikation (Dedupe → Severity → Route, s. Spec-`## Spec Change Log` Review-Loop-1-Eintrag): **kein intent_gap, kein bad_spec** (kein Loopback) — **patch** (auto-fixiert) + **defer** (5 Einträge → `deferred-work.md` append-only) + **reject** (noise). **Patches (auto-fixiert, erneut verifiziert):** (1) **`schema/compiler.md` §5.9 Pkt. 2 — Operationelle-Ebene:** **Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op`** (strikt pro Evidenz-Einheit, erste zutreffende Form — überlappende Kriterien deterministisch gebunden, AD-17h/A0-19); **No-Op als Nicht-Form** geklärt (eigenes Abgrenzungskriterium + Erhaltungsregel „volle Byte-Identität"); Korrigieren-Struktur-Erhaltung präzisiert (**Original-Wortlaut bleibt als abgelöster Bestand** erhalten, nur die Aussage-Fortschreibung wechselt); at↔AD-17h-Gap-Kreuzreferenz auf `generated.at`-Konvention (Home Story 3.8). (2) **Sandbox `run-sandbox.sh` (jetzt 9 Tests U1–U9, Exit 0):** U1/U2/U3 byte-Identität auf **alle drei** bestehenden Aussagen erweitert (Lücke aus V-1); **U8** neu — unbefugter Frontmatter-Key `foo:` im YAML → Struktur-Ebene-HARD-FAIL (Pkt. 5/P2-Element (6)) — **U9** neu — ungetrackte neue Datei `wiki/neu.md` → `??`-Sicht-Duplikat-HARD-FAIL; U7 `-le 1` → **`-eq 1`** + konsolidierter log-Eintrag verlinkt jetzt **beide** raw/-Quellen (`raw/alpha-v2.md + raw/alpha-v3.md`, Pkt. 4); `assert_frontmatter` um **canoniche Reihenfolge** + **Duplikat-Prohibition** erweitert; **reale `S-N`-Anker** (Markdown-Headings) in allen raw/-Evidenzdateien statt Prosa-„Stelle S-N" — die `#S-N`-Fragmente lösen jetzt im Rohdokument auf (§5.5-Anker-Semantik); U3 verändert den Wortlaut der abgelösten Aussage **nicht** mehr (om `rotierte`-Tense). (3) **`wiki/log.md`:** Spec-Frontmatter-Status-Mismatch korrigiert (`in-progress` → `in-review`, Review-Handoff). (4) **`sprint-status.yaml last_updated`:** Präzisions-Regression zurückgesetzt (`08-19-2026 13:21`, HEAD-Format `08-19-2026 13:14`-Familie); General-Verhalten des Sync-Steps als Defer notiert. **Defers (5, `deferred-work.md` append-only):** last_updated-Präzision (Sync-General), frozen Story-3.1-Typos „Schärferung/Formata" (Re-Negotiation), U6-„auch nach Commit"-Überzeichnung + at↔AD-17h-Gap (Home Story 3.8), U2-Selbsterfüllung + U7-Ordnungs-Rationale, Umlaut/Em-Dash-Normalisierungs-Politik im Sandbox-Evidenztext. **Rejects (noise):** U6-log.md-SHA-Reproduzierbarkeit (random `$BASE`-SHA konstruktionsbedingt), Diff-Artefakt-Pfad-Präfix, Spec-Change-Log „leer" (per Konvention erst in Review-Loops befüllt). **Re-executierte Verifikation (2026-08-19, ab Workspace-Root):** Sandbox **9/9 PASS, Exit 0** (re-runnable `bash _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh`); `grep -n "Struktur-Erhaltungsregel\|operationelle\|Revision 2.8" schema/compiler.md` → 5 Marker; AD-3 `git status --porcelain -- schema/validator.md schema/wiki-compiler.md raw/` leer; kein Standalone (D-3), keine neue §7-Klasse, kein Leasing-Scope. Spec-Frontmatter: `status: 'in-review'`, `review_loop_iteration: 0`; Spec-`## Spec Change Log` Review-Loop-1-Eintrag befüllt. - **Story 3.3 «Bestehende Concepts erweitern/präzisieren/korrigieren — Update-Formen operativ schärfen» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` bleibt **`in-progress`** — der Review-Abschluss-Flip `done` erfolgt gemäß Workflow-Konvention durch den Review-Schritt):** `schema/compiler.md` → **Revision 2.8** — die drei Update-Formen **operationell ausformuliert** (deterministische Brücke Regel → Run, AD-17h/A0-19; kein neuer normativer Inhalt, kein Schema-/Validator-/`raw/`-Change AD-3; der frozen Story-3.1-Regeltext bleibt unverändert als normative Basis, die operationellen Regeln sind die Präzisierungsebene darunter — keine Re-Negotiation): (1) **§5.9 Pkt. 2 — Präzisierungsebene je Update-Form** (Sub-Bullet an die Commit-Boundary-Regel angefügt): je Form **(a) Abgrenzungskriterium** (aus der committeten Evidenz — neue belegte Aussage → **Erweitern**; Schärfung einer bestehenden Formulierung/Abgrenzung ohne Ersatz → **Präzisieren**; Ersetzung einer fehlerhaften/überholten → **Korrigieren**; keines davon → **No-Op**, engere Auslegung — gleicher Git-State + gleiche Eingabemenge → identischer Update-Vorgang), **(b) Struktur-Erhaltungsregel** (das Geschützte aus FR-6/AC-2: Frontmatter-Subset — nur `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump, kein neuer Key, keine Entfernung ohne Beleg; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen) und **(c) Textgenauigkeits-Rahmen** (Schärfen an der Aussage selbst, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). (2) **§5.9 Pkt. 5 — Erhaltungs-Invariante um den Struktur-Erhaltungs-Bezug ergänzt:** die Diff-Probe (§5.9 Pkt. 5, D-1-Form) verifiziert zwei Ebenen — die Pfad-Mengen-Ebene (bestehender Teilmenge-Vergleich) und die **Struktur-Ebene je berührtem Pfad** (pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft: Frontmatter-Subset, keine Umschreibung belegter Aussagen außerhalb der Formen, Inline-Verweise, Linkform; Verstöße textuell benannt NFR-4, vor dem Commit zu beheben, sonst Ghost-Diff mit Rollback). (3) **§5.9 Pkt. 6 — P2-Check-Block um den Struktur-Erhaltungs-Check erweitert** (Element (6), zusätzliches textuelles Element: keine unbefugten Keys — Vertrag §3.3/§3.4-Subset, keine stille Löschung — AD-16/„Korrigieren"-Form, Links unverändert/keine neuen ohne echte Beziehung — §5.6-Pin). (4) **§8 Revisionslog Revision 2.8** mit Abschlussklausel (keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` AD-3; keine neue §7-Invaliditätsklasse; kein Standalone D-3; keine Vertragsänderung; Commit-Boundary-Regel unverändert; kein Leasing-Scope — AC-4 → Story 3.5/3.6, AD-17.3-Hinweis unverändert in §7). **Sandbox-Nachweis (re-executiert 2026-08-19, ab Workspace-Root, `bash _bmad-output/implementation-artifacts/sandbox-3-3/run-sandbox.sh`; Linux-Sandbox-Semantik auf einem `/tmp`-Baum, nie der reale `wiki/`-Baum; Exit **0**):** Mini-Bundle mit Concept `alpha` + nicht-betroffenem Kontroll-Concept `beta`; committete Neuevidenz je Szenario; alle drei Update-Formen + No-Op durchgespielt: **U1 ERWEITERN** (neue belegte Aussage angefügt, bestehende drei Aussagen byte-identisch — PASS; Probe `{alpha log}` ⊆ erlaubte Menge — PASS; Frontmatter-Konformität — PASS), **U2 PRAEZISIEREN** (Aussage an ihr selbst geschärft, Position/Struktur erhalten, Beleg nachgeführt §5.5 — PASS; Probe `{alpha log}` — PASS; Frontmatter — PASS), **U3 KORRIGIEREN** (fehlerhafte Aussage explizit abgelöst + Ersetzungsbeleg, keine stille Löschung AD-16-Default — PASS; Probe `{alpha log}` — PASS; Frontmatter — PASS), **U4 NO_OP** (Evidenz bereits vollständig enthalten — byte-identisch, kein `at`-Bump, kein `sources`-Zusatz, kein `log.md`-Eintrag — PASS; Probe leer = Ghost-Diff-negativ — PASS), **U5 NEGATIV-KONTROLLE** (simulierter Ghost-Diff auf `beta` wird von der Assertions-Mechanik zuverlässig als HARD-FAIL erkannt — PASS, Mechanik nicht vacuous), **U6 ZWEI-RUN-IDENTITÄT** (AD-17h/A0-19: zwei unabhängige Runs über dieselbe Evidenz → byte-identischer Update-Vorgang — SHA-256 `6b148dd1…` (alpha.md) / `a6d08427…` (log.md) identisch je Lauf, auch nach Commit — PASS), **U7 MEHRFACH_TREFFER** (I/O-Matrix-Zeile; zwei Neuevidenzen `raw/alpha-v2.md` + `raw/alpha-v3.md` desselben Runs treffen denselben Concept-Pfad `alpha` → **ein konsolidiertes Update**: eine Body-Mutation, ein `log.md`-Eintrag, ein konsolidierter `sources`-Zuwachs `s2`+`s3`, ein `generated.at`; Zuwachs-Sicht-Ordnung `v2`-vor-`v3` (lexikografischer Tie-Break bei Body-Ende); bestehende drei Aussagen byte-identisch; Probe `{alpha log}` — PASS; Frontmatter-Konformität — PASS). Die **Erhaltungs-Invariante (§5.9 Pkt. 5) wird als harte Assertion erzwungen**: Proben-Einträge (normalisiert: `wiki/`-Präfix + `.md`-Suffix strippend) ⊆ {betroffener Concept-Pfad, log}; bei Verstoß oder neuer Datei (`??`-Sicht) → HARD-FAIL + Exit 1; kein Ghost-Diff lässt sich still durchschleusen (U5). **Status-/Diff-Nachweis:** nach diesem Instruktions-Run zeigt `git status --porcelain -- wiki/` ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, keine Concept-Inhalts-Mutation (Instruktions-Story, kein neues committetes `raw/`-Material; Demonstration per Sandbox). **Validator-Verdikt (per-Datei, human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI; unverändert zur Story 3.2, Story 3.3 mutiert keine Concept-Inhalte):** alle **7** `wiki/`-Dateien **SUCCESS** — `wiki/index.md` (Punkt 11, Bundleroot), `wiki/knowledge-kompilation-inkrementell.md`, `wiki/llm-wiki-prinzip.md`, `wiki/wissensarchitektur-trennung-states.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1), `wiki/log.md` (frontmatterlos, Punkt 10), `wiki/wissensarchitektur/index.md` (frontmatterlos, Punkt 10/11), `wiki/wissensarchitektur/source-material.md` (Punkte 1/2/6/7/8/9/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart Rev 9). `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3, via `git status` geprüft); keine neue §7-Klasse; kein Standalone (D-3). Spec-Frontmatter: `status: 'in-review'` (Step-04-Review-Handoff), `review_loop_iteration: 0`. - **Step-04-Review Loop 3 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.7** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review Loop 3, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4/D-5 = 1/1/1/1/1, jeweils empfohlene Option; + Patches P-1/P-2). (1) **D-1 — Statuskette abgeschlossen:** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention; Story-3.1-Präzedenz: Review-Abschluss setzt `done` im selben Loop) ist mit dieser Zeile als eigener dokumentierter Schritt nachgeführt; `sprint-status.yaml`-Key `3-2-…` bleibt **`done`** (die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand; Review-Handoff/-Abschluss ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar). (2) **D-2 — Sandbox erweitert:** `run-sandbox.sh` um **T5 `LINK_FOLLOWING_ZYKLUS`** (Zyklus alpha ↔ omega via Backlink; besuchte Menge → endliche, doppelungsfreie Candidate-Liste `omega`, `alpha` — der Zyklus endet), **T6 `TRAVERSAL_REACH_ONLY`** (Term `trafo-gebiet` trifft **nur** die Area-`index.md` → die gewurzelten Concept-Pfade `trafo/delta`, `trafo/epsilon` sind die Kandidaten; `index.md` selbst ist kein Concept-Kandidat) und **T7 `TERM_ABLEITUNG_SYNONYM`** (Registry-Test-Doppel: `Quanten Protocol` → Normalisierung → `quanten-protocol` (Canon-Treffer), `QuantenProtocol` → `quantenprotocol` (Variante-Treffer) → canonische Form `quanten-protocol`; Negativ-Fall `nicht-in-registry` → wie notiert, kein stiller Ausschluss); T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus — kein Concept-Kandidat); **P-1** — T1/T4 jetzt mit harten Pass/Fail-Asssertionen (`exit 1` bei Abweichung). (3) **D-3 — Selbsttest-Beleg (b) neu belegt:** die Rev-2.5-Log-Zeile (b) beschrieb einen **nicht committierten** Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz); die Rev-2.5-Zeile bleibt **historisch unverändert** (append-only, Vertrag §5), der korrigierte Nachweis steht in dieser Zeile (re-executierte Sandbox-Ausgabe, s. (5)(b)). (4) **D-4 — §3.2-Pkt.-3b-Ordnung:** Stufe-a-Treffer jetzt **rein lexikografisch (LC_ALL=C)** innerhalb jeder Stufe; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung (dieselbe Treffermenge → identische Liste, AD-17h/A0-19). (5) **D-5 — `schema/canonical-terms.md`-Lookup-Semantik:** Lookup-Verfahren deterministisch fixiert (lowercasing → `[-–_ ]`→`-`-Kollaps → **Lookup der normalisierten Form**; Spalten tragen ausschließlich normalisierte Formen), **Eindeutigkeits-Invariante** (jede normalisierte Form in genau einem Eintrag — Canon **oder** Variante, nie beides/zweimal) + **Konflikt-Verfahren** (keine stille Anhängung; `deferred-work.md`/Ask-First, analog zur Umbenennungs-Regel). (6) **P-2 — Typos korrigiert:** `Determinsmus` → `Determinismus` (compiler.md §8-Referenz, diese Log, `deferred-work.md`-Belege), `§3.2-beankert` → `§3.2-angeankert` (Rev-2.5-Log-Zeile), `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (`deferred-work.md`-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root; Sandbox-Run exit 0):** (a) live: `grep -rl 'A0-18' --exclude=log.md wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad, `log.md` ausgeschlossen); (b) **Mini-Sandbox** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, re-executierbar): alle **7** Tests **PASS** — T1 Membership (exakt `alpha`; Kontaminations-Kontrolle ohne Exklusion trifft zusätzlich `log`), T2 Zwei-Run-Identität (identisch), T3 NO_MATCH (leer), T4 Vereinigung `alpha,gamma` (hart assertierte), T5 LINK_FOLLOWING_ZYKLUS (endlich, doppelungsfrei, Zyklus endet), T6 TRAVERSAL_REACH_ONLY (`trafo/delta`, `trafo/epsilon`), T7 TERM_ABLEITUNG_SYNONYM (beide Varianten → `quanten-protocol`; Negativ-Fall wie notiert); (c) `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `wiki/log.md` (dieser Eintrag) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff (die Instruktions-Story mutiert keine Concept-Inhalte). **Abschlussklausel Rev 2.7:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. `sprint-status.yaml`: Key bleibt `done`, `last_updated` → 08-19-2026. Spec-Frontmatter: `status: 'done'`, `review_loop_iteration: 3`; Spec-`### Review Findings` abgehakt (5 Decisions + 2 Patches + 4 Defers → `deferred-work.md`). - **Step-04-Review Loop 2 / Patch-Runde (Story 3.2, 2026-08-19):** `schema/compiler.md` → **Revision 2.6** (D-3-Instruktions-Patch, kein neuer Inhalt; bmad-code-review VG-Findings verarbeitet). (1) **§4-Überschrift wiederhergestellt** — die §3.2-Einfügung (Rev 2.5) hatte die Überschrift **`## 4. Synthetisieren (Provenienz & Trust)`** verdrängt (der §3.2-Sektionskopf ersetzte die §4-Überschrift; der gesamte Frontmatter-Body hing kopflos unter §3.2; alle §4-Referenzen wären dangling geblieben). Der §4-Kopf ist zwischen §3.2-Body und dem Frontmatter-Body wieder eingefügt. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Rev-2.5-Form in diesem Log- plus dem §3.2-Eintrag, §3-Pkt.-2, §3.2-Pkt.-2a, §5.9-Worked Example (Pkt. 7) und §7 nutzten `rg -l '' --exclude=log.md wiki/` — nicht-existent (ripgrep 14.1.1: `rg --exclude` → `unrecognized flag`; GNU grep unterstützt `--exclude`, ripgrep nutzt `-g '!log.md'` / `--glob '!log.md'`). Die Instruktion nutzt jetzt tool-korrekte Formen: rg `rg -l '' -g '!log.md' wiki/` (native Glob-Exklusion) bzw. GNU grep `grep -rl '' --exclude=log.md wiki/`; die §5.6-Formeln (bereits GNU-grep) und §5.9-Pkt.-7-Erhebung adoptieren die Exklusion. Dieser Eintrag zitiert den alten Defekt **historisch** (verlaufsgetreue Log-Führung; die operative Form ist jetzt tool-korrekt). (3) **§5.9-Worked Example (Pkt. 7) auf die Exklusions-Form gehoben** (`rg -l 'FR-12' -g '!log.md' wiki/`), Kommentar `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a. (4) **Mini-Sandbox re-executierbar verankert** (`_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh`, Muster Story-3.1-Sandbox S1–S6): Tests T1–T4 (Membership-Pin — Term auf Concept-Bodies UND `log.md` verteilt, Candidate-Liste nur Concept-Pfade; Zwei-Run-Identität AD-17h; NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT; Mehrfach-Treffer → Vereinigung + lexikografische Ordnung). (5) **`deferred-work.md`-Em-Dash-Eintrag** append-only ergänzt (Home: Story 3.8) — die §3.2-Pkt.-1b-Kollaps-Klasse deckt En-Dash/Bindestrich/Unterstrich/Leerzeichen, aber **nicht** den Em-Dash `—`; dieser Handoff wird nicht stillschweigend gelöst, sondern als offene Determinismus-Frage dokumentiert. **Re-executierte Selbsttest-Belege (2026-08-19, ab Workspace-Root):** (a) rg-Form real: `rg -l 'A0-18' -g '!log.md' wiki/` → exakt `wiki/knowledge-kompilation-inkrementell.md`; ohne Exklusion `rg -l 'A0-18' wiki/` → zusätzlich `wiki/log.md` (Selbstkontamination — der §3.2-Pkt.-2a-Fall, reell belegt); (b) GNU-grep-Äquivalent `grep -rl 'A0-18' --exclude=log.md wiki/` → identisch `wiki/knowledge-kompilation-inkrementell.md`; (c) `rg -l 'FR-12' -g '!log.md' wiki/` → `wiki/knowledge-kompilation-inkrementell.md` (§5.9-WE-Korrektur reell); (d) Mini-Sandbox T1–T4 → siehe Rev-2.6-Eintrag; (e) `git status --porcelain` → `wiki/` nur `log.md` (dieser Eintrag; Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt), `schema/compiler.md` + `deferred-work.md` sind außerhalb `wiki/` (kein Teil der Diff-Probe). **Abschlussklausel Rev 2.6:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3, geprüft via `git status`); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. (Der Rev-2.5-Implementierungs-Eintrag oben bleibt unverändert — dokumentiert den Zustand bei Rev-2.5-Veröffentlichung inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) - **Story 3.2 «Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following)» (Implementierung, Instruktions-Story D-3; `sprint-status.yaml`: Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**):** `schema/compiler.md` → **Revision 2.5** — die beiden **Story-3.2-Vorbehalte aufgehoben** (§3 Pkt. 2 + §7) und die feinkörnige Relevanz-Findungsmechanik als neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** verankert (nach §3, vor §4; Pkt. 2 bleibt Kern-Anker „Erhebung nach §3.2"): (1) **Term-Ziehverfahren deterministisch** — bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps (En-Dash/Bindestrich/Unterstrich/Leerzeichen); **kanonischer Schreibweisen-Resolver als committete, append-only Registry `schema/canonical-terms.md`** (canon. Form + erlaubte Varianten, `[]`; Bestandteil des Git-States → Auflösung pinbar, AD-17h/A0-19); genau eine canon. Form je Semantik (A0-18); **kein stiller Ausschluss** nicht auflösbarer Varianten (Verwendung wie notiert); mehrere Terme je Einheit → Vereinigung; **bekannte Determinismus-Lücke**: Em-Dash `—` fällt nicht unter den `[-–_ ]`-Kollaps → an **Story 3.8** übergeben (nicht still hinzugefügt); (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (GNU-grep-Äquivalent `grep -rl '' --exclude=log.md wiki/`; **`log.md` strukturell exkludiert** — die Candidate-Liste ist auf Concept-Pfade definiert, `log.md` ist kein Kandidat), (b) `index.md`-Traversal (gewurzelte Erreichbarkeit Root → Area → Concept, §5.8; TRAVERSAL_REACH_ONLY; fehlende Bundleroot → Run-FAIL V-1), (c) Link-Following mit **besuchter Menge** (file-relativ, §5.7 Pkt. 4; Zyklen enden — LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag** — relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (lexikografischer Tie-Break; AD-17h/A0-19), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad, Ghost-Diff-negativ); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) unten belegt. **§8-Normreferenzen:** AD-13 (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2), **A0-19** (Determinismus-Vertrag — war im Ist-§8 noch nicht gelistet, als Determinismus-Referenz ergänzt, §3.2/AD-17h) und **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; `schema/canonical-terms.md` als Resolver-Registry referenziert. **Abschlussklausel Rev 2.5:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **`deferred-work.md`:** der Story-3.1-Defer-Eintrag `epic-3-context.md` („Home: Story-3.2-Handoff") als **aufgegriffen** markiert (append-only); der F17/Em-Morphologie-Handoff (Story 3.8) bleibt bestehen. **Determinismus-Selbsttest (Membership + Identität, re-executiert 2026-08-19, ab Workspace-Root):** (a) `grep -rl 'A0-18' --exclude=log.md wiki/` zweimal ausgeführt → beide Ausgaben **identisch**, exakt `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad; `log.md` ausgeschlossen — der `--exclude=log.md`-Fakt ist ehrlich dokumentiert: ohne die Exklusion würde `log.md` ab dem Moment selbst „Kandidat", in dem dieser Eintrag `A0-18` zitiert — die B1-`log.md`-Kontamination ist damit geschlossen); (b) **mini-Sandbox-Baum** (`/tmp/sb32-…`, Term `quanten-protocol` auf Concept-Bodies **und** `log.md` verteilt) → exakte Candidate-Liste nur Concept-Pfade (`wiki/alpha.md`, `wiki/sub/beta.md`; `log.md` ausgeschlossen, `wiki/gamma.md` ohne Term nicht getroffen); normalisiert `alpha`, `sub/beta`; **Zwei-Run-Identität** (SHA-256 `159092bb…` ≡); Kontrolle ohne `--exclude` → `log.md` wird Kandidat (B1-Falle belegt und geschlossen); (c) §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 Ist-Zählung **38** (kein `wiki/`-Dateimenge-Change durch Story 3.2 — keine Re-Baseline nötig). **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 3.1, Story 3.2 mutiert keine Concept-Inhalte; `wiki/log.md` bleibt frontmatterlos, Punkt 10); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 4 und AC 5. `git status --porcelain -- wiki/` nach diesem Run: ausschließlich `log.md` (modifiziert) — Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt, kein Ghost-Diff. - **Story 3.1 «Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update)» → `done` (bmad-code-review Loop 2, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff-Baseline `802a557` → `efc543c`; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1, jeweils empfohlene Option):** `schema/compiler.md` → **Revision 2.4.2** (alle 4 Decision-Resolutions + 16 Patches, rein textuell — kein Code, kein Standalone, keine neue §7-Klasse): (1) **D-1: Diff-Selbsttest (Pkt. 5) operationalisiert** — Probe = `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte `??`-Dateien — die Duplikat-Kontrolle braucht diese Sicht; `git diff` allein ist blind dafür), **Probe-Zeitpunkt vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen; nach dem Commit wäre die Probe vacuous, AD-17f), erlaubte Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt (Misch-Runs: keine fälschlichen Ghost-Diffs), **Pfad-Normalisierung** (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich), **Rollback-Mechanik** deterministisch benannt (`git checkout -- ` für modifizierte Pfade, ungetrackte löschen, Index `git checkout -- `); (2) **D-2: R-1-Baseline deterministisch** — `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA; AD-14: Git liefert Historie, nicht Domain-State — deshalb die Notiz); **Diskrepanz-Regel**: `git diff` gewinnt, SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; (3) **D-3: INPUT_UNCOMMITTED-Abbruch implementiert** — neuer P2-Check-Block-Element (1) **Input-Zustand**: Working-Copy von `raw/`+`wiki/` gegen HEAD prüfen, bei Abweichung **benannter Abbruch „published/committed Input erforderlich"** (AD-17a) vor Interpretation und vor jeder Mutation — die gefrorene I/O-Matrix-Verpflichtung ist damit als Zustandsprüfung + Abbruchmeldung umgesetzt (zuvor nur Referenz auf §1 Pkt. 1); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label) ist als dokumentierte Fußnote in Rev-2.4.2 gesichert (Spec bleibt frozen); (4) **D-4: Sandbox-Edge-Test-Nachweis** — die fünf I/O-Matrix-Szenarien (HAPPY_PATH_UPDATE, UNTOUCHED_CONCEPT, CONCEPT_COLLISION_BESTEHEND, CHANGE_DETECTION, PRE_RUN_RECONCILE) + die D-3-Abbruch-Kontrolle sind als re-executierbares Skript (`_bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`, `bash …` ab Workspace-Root, Sandbox-Bäume unter `/tmp`) mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)` verankert — die Verweise „in der Spec-Verification enthalten" (dieses Log, `deferred-work.md`) sind damit auflösbar; (5) **Instruktions-Präzisierungen:** P2-Block-Zeitpunkt (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende), **No-Op-Kandidat**-Regel (Evidenz bereits vollständig enthalten → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch), **Mehrfach-Treffer-Reihenfolge** für alle Einheiten (Zuwachs-Sicht-Ordnung; lexicografisch nur Tie-Break — AD-17h), **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen), **`generated.at`↔AD-17h-Gap** explizit benannt (Home: Story 3.8 — Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention A0-20 bleibt bindend, Wechsel = Ask-First), Term-Ableitung als §2-Interpretation abgegrenzt (Erhebung mit festem Term deterministisch; Term-Mechanismus Story 3.2), Link-Following mit besuchter Menge (keine Schleife bei zyklischen Links), **Worked Example (Pkt. 7) auf den realen Ist-Baum korrigiert** (`rg -l 'FR-12' wiki/` trifft `wiki/knowledge-kompilation-inkrementell.md`, nicht `wissensarchitektur/source-material.md` — das Rev-2.4.1-Beispiel enthielt den Term nicht), stale-Anker (`§3.2-Kollisionsprüfung`, `§3-Voraussetzungsprüfung`, §5.8-Pkt.-3-Zeiger „Pkt. 1" → „Pkt. 2") nachgeführt. **Abschlussklausel Rev 2.4.2:** `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` unverändert (AD-3); keine neue §7-Invaliditätsklasse; kein Standalone (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert. **Review-Loop-2-Aufarbeitung zum Implementierungs-Eintrag (2026-08-18, oben):** (a) der dortige (b)-Diff-Selbsttest-Beleg zitierte die Vor-Rev-2.4.1-Form `git diff --stat -- wiki/` — die operative Probe ist seit Rev 2.4.2 die D-1-Form (`git diff --name-only -- wiki/` + `git status --porcelain -- wiki/`); (b) der Implementierungs-Eintrag dokumentierte „Revision 2.4" — der Story-3.1-Commit `efc543c` enthält **Revision 2.4 + 2.4.1** (Step-04-Review-Patch-Runde 2026-08-18, in `deferred-work.md` als „Story-3.1-Review-Protokoll" protokolliert) und ist jetzt auf **2.4.2** (dieser Eintrag) fortgeführt; (c) Statuskette: `in-progress` (Implementierungs-Eintrag) → `review` (Review-Handoff `efc543c`) → **`done`** (dieser Eintrag — Loop-2-Abschluss: 4 Decision-Resolutions + 16 Patches, keine unresolved Findings; spec-Frontmatter `status: 'done'` + `review_loop_iteration: 2` deckungsgleich). **Selbsttest-Beleg (re-executiert 2026-08-19, ab Workspace-Root, D-1-Probe-Form; `` = `802a5576eb4bbf54761a947e43e68b7e7ea9d67d` = Review-Baseline, hier als Konventions-Demonstration notiert — bei echten Run-Einträgen ist es der HEAD der vorherigen Mutations-Boundary, D-2):** (a) Instruktions-Integrität — `grep -n "5.9" schema/compiler.md` → §5.9-Sektion vorhanden; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` → **kein Treffer** (Hold ersetzt, unverändert); (b) **Diff-Selbsttest (Erhaltungs-Invariante)** — `git diff --name-only 802a557… -- wiki/` → ausschließlich `wiki/log.md` (dieser Eintrag; keine Concept-Datei, kein Index, kein Ghost-Diff auf nicht betroffenen Pfaden — die Instruktions-Story mutiert keine Concept-Inhalte; FT-6/FR-12) + `git status --porcelain -- wiki/` → ` M wiki/log.md` (tracked, modifiziert — im erlaubten Satz; **keine** `??`-Einträge = keine ungetrackten neuen Dateien = kein Duplikat); normalisiert: `log` ⊆ erlaubte Menge (`log.md`); (c) **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md` Rev 9, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 2.5, Story 3.1 mutiert keine Concept-Inhalte); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 3 und AC 5; (d) **Sandbox-/Edge-Tests (I/O-Matrix)** — ausgeführt, echte Outputs in der **Spec-`## Verification Record (Ausführungs-Beleg, 2026-08-19)`** (re-executierbar: `bash _bmad-output/implementation-artifacts/sandbox-3-1/run-sandbox.sh`): S1 HAPPY_PATH_UPDATE (Probe → `alpha`, `log`; 0 untracked), S2 UNTOUCHED_CONCEPT (leere Probe), S3 CONCEPT_COLLISION_BESTEHEND (nur `M`-Einträge, kein `??`), S4 CHANGE_DETECTION (außschließlich `raw/alpha-v2.md`; SHA-256 `21e7fc1d…` identisch), S5 PRE_RUN_RECONCILE (Run-FAIL V-1, Zustand sauber), S6 INPUT_UNCOMMITTED (benannter Abbruch „published/committed Input erforderlich (AD-17a)"). `sprint-status.yaml`: `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` `review` → **`done`**, `last_updated` → 08-19-2026. ## 2026-08-18 - **Story 3.1 «Inkrementellen Datenfluss implementieren (Interpret → Reconcile → Synthesize → Update)» (Implementierung, Instruktions-Story D-3):** `schema/compiler.md` → **Revision 2.4** (inkrementeller Datenfluss als Erweiterungs-Instruktion, rein textuell — kein Code, kein Standalone, keine neue §7-Klasse): (1) **§3 Reconcile** — Pkt. 2 Kollision-Hold durch **Update-Routing** ersetzt (bestehende Wissenseinheit → **Update-Kandidat im bestehenden Concept-Pfad**, kein Duplikat, kein stummer Überschreib, AD-16-Default-Erhaltung; der Epic-3-Abbruch entfällt) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Relevanz-Mechanismus Story 3.2 vorbehalten); (2) **neue §5.9 «Inkrementelles Update bestehender Concepts (Story 3.1)»** (nach §5.8, vor §6): Update-Stimulus = Reconcile-Kandidatenliste (§3 Pkt. 2); Mutationsmechanik — **Erweitern** (Absatz/Beleg ergänzen), **Präzisieren** (Aussage schärfen, Beleg neu/nachgeführt, §5.5), **Korrigieren** (ersetzte Aussage + Ersetzungsbeleg, keine stille Löschung, AD-16-Default), `sources` nur um echte neue Belege ergänzen (§5.5-Pkt.-1b-Relokation, Vertrag §3.3-Subset), `generated.at` = aktueller Run-Zeitstempel (A0-20, einmalige `at`-Festlegung pro Run), vorhandenes human-`verified` bleibt stehen; Index-/Link-Form unverändert (§5.6-Pin, kein neuer Link bei reinem Body-Update); **`log.md`-Eintragspflicht** (Vertrag §5, „**Story 3.1-Update**"-Markierung; Disagreement-Fälle dokumentiert — Epic-4-Interface, keine Korrektur-Klassifikation hier); **Erhaltungs-Invariante (FT-6/FR-12) + re-executierbarer Diff-Selbsttest** — nach jedem Run `git diff --stat -- wiki/`, geänderte Dateien ⊆ (betroffene Concepts ∪ `log.md` ∪ nachgeführte `index.md`), Ghost-Diff = textuell benannter Instruktions-Verstoß (NFR-4), nie „Regenerate Everything" (AD-5, A0-6); **Run-Vorphase-Bausteine** — Defer **R-1** Input-Zuwachserkennung (Change-Detection via `git diff` auf `raw/` und/oder SHA-256-Record aus `raw/**/source.md`) und Defer **P2** Pre-Run-Reconcile-Check-Block (Zielpfade, Quellen-Existenz EC-1, Betroffenheits-Kandidatenliste, `wiki/index.md`-V-1) als wiederverwendbare textuelle Check-Blöcke (D-3, keine neuen Prozesse); Worked Example; (3) **§0-Aufruf** — sechs Phasen für Neu-Anlage- und Update-Variante präzisiert (Reconcile/Mutieren betreffen auch bestehende Concepts; AD-17a-Input-Regel referenziert, §1.1 bleibt); (4) **§5.7 Pkt. 3 / §5.8 Pkt. 2/3** — Top-Level-Kollisions-Referenz auf das Update-Routing (§3 Pkt. 2/§5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung „aktualisieren ist Epic 3" ist entfernt: Das Update lebt in §5.9; das Schutzprinzip der Erhaltung — „nicht stumm überschreiben" — bleibt als AD-16-Default in §3 Pkt. 2/§5.9 erhalten); (5) **§7-Selbstbegrenzung** — Update-Thema **aus dem Epic-3-Vorbehalt entlassen**, Scope-Einleitung um die Update-Variante geöffnet; die verbleibenden 3.x-Themen im Vorbehalt benannt: Synthese über mehrere Concepts → Story 3.4 (AD-4/FR-7), Leasing/Dirty-Tree-Schutz → Story 3.5/3.6 (AD-17a..f), Relevanz-Verfeinerung → Story 3.2; (6) **§8-Normreferenzen** um A0-6/FR-6/FR-12 ergänzt (AD-5/AD-6/AD-17h bereits gelistet) + **Revisionslog 2.4** mit Abschlussklausel (kein Vertrag-/Validator-/`raw/`-Change, keine neue §7-Klasse, kein Standalone, Commit-Boundary-Regel unverändert). **`deferred-work.md`:** Defer **R-1** (Input-Zuwachserkennung) und **P2** (Pre-Run-Reconcile-Check-Block) als **aufgegriffen (2026-08-18, Story 3.1 — §5.9)** markiert (append-only, bestehende Einträge unverändert). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). **`sprint-status.yaml`:** `3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit Story 3.1 statt; Sprint-Status bereits synchronisiert) → **`review`** (Review-Handoff, der übliche Folgezustand nach dem Implementierungs-Eintrag, s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). **Selbsttest-Beleg (re-executierbar, ab Workspace-Root):** (a) Instruktions-Integrität — `grep -n "5.9" schema/compiler.md` → neue §5.9-Sektion gefunden; `grep -n "Aktualisierung ist Epic 3" schema/compiler.md` → **kein Treffer** (Hold ersetzt); §7 enthält „Update" nur noch als „aus dem Vorbehalt entlassen"-Verweis, nicht als offenes Vorbehalts-Thema; (b) **Diff-Selbsttest (Erhaltungs-Invariante)** — `git diff --stat -- wiki/`: ausschließlich die von Story 3.1 berührten Dateien (`wiki/log.md`; keine Concept-Datei, kein Index, kein Ghost-Diff auf nicht betroffenen Pfaden — die Instruktions-Story mutiert keine Concept-Inhalte; FT-6/FR-12); (c) **Validator-Lauf** (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md`, D-3 — kein CLI): alle **7** `wiki/`-Dateien **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1 — unverändert zur Story 2.5, Story 3.1 mutiert keine Concept-Inhalte); das per-Datei-Verdikt ist der Ausführungs-Nachweis der Spec-Verification Pkt. 3 und AC 5. Sandbox-/Edge-Tests (I/O-Matrix): siehe Spec-Verification — isolierte Sandbox-Bäume für HAPPY_PATH_UPDATE (Update-Routing: bestehender Pfad aktualisiert, kein Duplikat), UNTOUCHED_CONCEPT (kein Diff auf nicht betroffenem Pfad), CONCEPT_COLLISION_BESTEHEND (Update statt Duplikat), CHANGE_DETECTION (nur Zuwachs über `git diff`/SHA-256-Record), PRE_RUN_RECONCILE (Check-Block vor jeder Mutation; fehlende Bundleroot → Run-FAIL, V-1) — deterministische Formel-Ausgaben/Nachweise je Szenario. - **Validierungs-Revision 9 (autorisiert; Epic-2-Retro F-02/AI-2-R-5, de-dupliziert mit `code-review-2-1-item-2`; ausgeführt 2026-08-18, Quelle: `_bmad-output/implementation-artifacts/spec-autorisierte-validator-revision-9-punkt-11-area-lesart.md`):** `schema/validator.md` → **Revision 9**. Fünf inhaltliche Änderungen, keine neue §7-Klasse (kein Punkt 15; Vertrag `schema/wiki-compiler.md` + Instruktion `schema/compiler.md` + `raw/` + `adapters/` + alle `wiki/`-Concept-Dateien unverändert, AD-3/D-3): (1) **Punkt-11-Area-Lesart formalisiert** (§3 Zelle: Für ein Area-Concept genügt die file-relative Referenz in der Area-`index.md` des nächsten Vorfahren; identitätsstiftend ist das Pärchen Area-Präfix (= bundle-relativer Verzeichnispfad der Area-`index.md`) + Link-Ziel ohne `.md`-Endung (AD-7a), textuelle Nennung der Bundle-Identität entfällt — Live: `wissensarchitektur/source-material` über `](source-material.md)` in `wiki/wissensarchitektur/index.md`; Normalisierung: `.`/`./`-Strip, `..` nicht Teil der Ein-Ebenen-Form); (2) **Punkt-4-Vorlage um `resolved=`-Token ergänzt + Semantik verankert** (`…|file://|resolved=`; §6.2: nur bei Ablehnung durch aufgelöste Lage außerhalb `raw/`, Wert = aufgelöster workspace-relativer Pfad) — Fixture 4a ableitbar; (3) **Innen-Ebenen-Punkt-6-Fixtures in §7.3** (Negativ: `role: x` in `sources`-Eintrag → FAIL Punkt 6; Positiv-Gegenzeile ausschließlich erlaubte Keys → SUCCESS); (4) **§7-Fixtures 11a** (Negativ: Area-Concept unverlinkt → `Concept nicht verlinkt=wissensarchitektur/source-material` am realen Live-Area-Namen; Positiv: file-relativ verlinkt → SUCCESS); (5) §8-Normreferenz-Notiz „Story 2.3 (Link-Form)" um die Rev-9-Area-Lesart ergänzt. Nachgeführt: Header auf „Revision 9" + Revisionslog-Eintrag Revision 9 (append-only, bestehende Einträge unangetastet). **Zertifizierung (mechanisch, D-3):** (a) Fixture 4a isoliert — Sample `sources: [{resource: README.md}]` mit existierender `README.md` an der Workspace-Root → `FAIL … Punkt 4: resource ausserhalb raw/ oder unzulaessiger Pfad (…|resolved=README.md)`, kein Vorab-FAIL durch Punkt 3/andere Punkte (Punkt-4-vor-3-Priorität §6.2); (b) Innen-Ebenen-Sample isoliert — `sources:\n - resource: raw/prd/prd-wow20-2026-08-14.md\n role: x` (Datei existiert, sonst-valides Sample) → genau `Punkt 6: nicht autorisiertes Feld (Key=role) bzw. unautorisierter Key in sources/generated/verified`, kein anderer Punkt (Isolations-Prinzip §7.3); (c) Punkt-11-Area-Lesart-Fixtures — Negativ 11a (Area-`index.md` verlinkt `source-material.md` **nicht**) → `FAIL … Punkt 11: Index-Regel verletzt (Concept nicht verlinkt=wissensarchitektur/source-material)`; Positiv 11a (file-relativer `](source-material.md)`-Link, Live-Lage) → SUCCESS (kein „nicht verlinkt"-FAIL); (d) **reales Bundle gegen den revidierten Validator (human-mechanisch ausgeführte Text-Instruktion)** — alle **7** `wiki/`-Dateien weiterhin **SUCCESS** (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; Punkt 11 inkl. Area-Lesart), identisch zur Story-2.4/2.5-Lage — keine neu ausgelösten FAILs, Abschluss-Eigenschaft des §7-Katalogs gewahrt. **Mechanische Belege (ausgeführt 2026-08-18):** (e) AD-3/D-3-Freeze — `git diff --name-only ..HEAD -- schema/wiki-compiler.md schema/compiler.md raw/ adapters/` → **0 Treffer** (keine dieser Dateien geändert); (f) Live-Invariant der 7/7-SUCCESS-Behauptung — `grep -qF '](source-material.md)' wiki/wissensarchitektur/index.md` → **exit 0** (Area-Lesart lebend verankert). `sprint-status.yaml`: `code-review-2-1-item-2` und `epic-2-retro-item-14-…` (AI-2-R-5) → `done` (closed 2026-08-18, resolution mit Rev-9 + ref auf die Rev-9-Runde). - **Story 2.5 «Progressive Discovery über `index.md` bereitstellen» (Implementierung, inkl. Review-Loop-1-Korrektur + Review-Loop-3-Patches, bmad-code-review 2026-08-18, 4 Layer; Nutzer-Entscheidungen 1/1):** `schema/compiler.md` → **Revision 2.3** (neue §5.8 „Progressive Discovery über `index.md` (Story 2.5)"): (1) **Discovery-Pfad** — Bundleroot `wiki/index.md` → Area-`index.md` (frontmatterlos) → Area-Concepts in gepinnter §5.6-Form; Root-Concepts direkt aus der Bundleroot (AD-9, FR-11; gewurzelte Erreichbarkeit Root → Area → Concept, §5.7 Pkt. 5); (2) **gewurzelte Erreichbarkeit als deterministisches Discovery-Kriterium + re-executierbarer Selbsttest** (`UNREACHABLE AREA: ` für von der Bundleroot unverlinkte Area — AD-9; `NESTED AREA: ` für Zwei-Ebenen-Kandidaten, geprüft über **zwei Läufe** der Selbsttest-Formel: (A) Ein-Ebenen-Area-`index.md` → Root-Verlinkungsstatus, (B) `find wiki -mindepth 3 -type f -name "*.md"` → jede Datei in Tiefe ≥ 3 ist ein Zwei-Ebenen-Kandidat, Meldung je Verletzung genau eine; beide Läufe ohne Ausgabe = Discovery-SUCCESS; Instruktions-Selbsttest, schließt die Validator-Navigation-Lücke ohne Validator-Change — kein neuer §7-Punkt, AD-3); (3) **konsolidierte Zwei-Ebenen-Kartografie** (antwortet und schließt **Defer F-07**): Root + eine Area-Ebene; `wiki/a/b/` ist **keine zugelassene Anlageform** — `wiki/a/b/concept.md`-Kandidat (auch **ohne** `index.md`; die Area-ohne-Index-Lücke, die der reine `index.md`-Scan übersähe) wird durch den **§5.8-Instruktions-Hold (Zwei-Ebenen, Tiefe ≥ 3)** angehalten (keine Datei, kein Index-Link, textuelle Meldung `NESTED AREA: `, Run „teilweise erfolgreich", NFR-4) — **Loopback-1-Renegotiation (menschen-autorisierte Option A):** Träger ist der §5.8-lokale Hold, **nicht** der §3.2-Kollisions-Hold (der bleibt der Dateikollision *bestehender* Concepts vorbehalten — ein brandneuer Zwei-Ebenen-Pfad kollidiert nie mit einem existierenden); (4) **Suche = Consumer-grep** (`grep -rn wiki/` rekursiv bzw. `rg wiki/`, AD-13 — keine Such-Datenbank, kein Embedding, kein Index-Datei-Format; NFR-3), (5) **Discovery-Demo (optional, kein MOVE)** — bei Durchführung: Formel-4-Re-Baseline-Pflicht (neuer Zuwachs-Run), sonst bleibt Formel 4 `38 ≡ 38`. Nachgeführt: **§7** Story-2.5-Vorbehalt auf „Suche"-Rest gekürzt (Navigation/Area-Indizes jetzt §5.8-verankert, Suche = Consumer-Thema; die Vorbehalt-Zeile lag in der Baseline `main` bei Z. 253, nach dem §5.8-Einschub bei Z. 285), **§8** Normreferenzen (AD-9/AD-13 → §5.8, FR-11 → §5.7 Pkt. 5/§5.8, NFR-3 neu) + Revisionslog **2.3**. **Selbsttest-Beleg (re-executiert, die gehärtete Loop-3-§5.8-Pkt.-2-Selbsttest-Formel von `schema/compiler.md` §5.8 Pkt. 2 (CWD-Präguard, Erreichbarkeits-Check auf Markdown-Linksyntax `](` per `grep -qF`, `LC_ALL=C sort -u`) als wörtlicher Einzel-Quote-`sh -c '…'`-String — Live-Baum: keine Ausgabe, Exit 0; CWD-Präguard-Kontrolle außerhalb der Workspace-Root: `SELBSTTEST-SETUP-Fehler: Workspace-Root (wiki/index.md fehlt)` + Exit 1):** Area `wissensarchitektur` aus der Bundleroot verlinkt (Root→Area, Selbsttest-Lauf A); die Area→Concept-Verlinkung (`source-material.md` in der Area-`index.md`) ist durch den **Validator Punkt 11** mechanisch abgedeckt (kein Duplikat im Selbsttest). **Sandbox-/Edge-Tests (I/O-Matrix, deterministische Formel-Ausgaben):** (a) HAPPY — gewurzelte Erreichbarkeit ohne Verletzung; (b) **AREA_UNREACHABLE** — Area-`index.md` existiert, Bundleroot unverlinkt → `UNREACHABLE AREA: ` (textuell benannter Instruktions-Selbsttest-Befund, kein Validator-Punkt); (c) **NESTED_AREA_KANDIDAT** — `wiki/a/b/index.md`- und `wiki/a/b/concept.md`-Kandidaten (je einzeln) → `NESTED AREA: a` (erste Ebene der nicht-zulässigen Struktur; bei mehreren Dateien unter derselben ersten Ebene Konsolidierung über `LC_ALL=C sort -u`); Sandbox-Nachweis auf einem synthetischen Baum mit angelegter Testdatei (Zwei-Zustands-Klarstellung Loop-3-Decision-2: die Formel meldet bestehende Tiefe-≥-3-Dateien; der Hold-Zeitpunkt hält den Erstellungskandidaten an, ohne Datei). Die Sandbox-Kontrollen decken die I/O-Matrix-Szenarien **AREA_UNREACHABLE** und **NESTED_AREA_KANDIDAT** ab. §5.6-Formeln unverändert re-executierbar: Formel 2 (Form-Check) `0` (Exit 0), Formel 3 (Dangling-Check) keine Ausgabe, Formel 4 `38 ≡ 38` (Ist ≡ Extraktion aus dem Run-Kopf `862cf41` — keine neue Baseline nötig, keine `wiki/`-Dateimenge-Änderung durch Story 2.5; die Demo ist optional und würde bei Durchführung die Re-Baseline auslösen). Validator-Lauf (human-mechanisch ausgeführte Text-Instruktion `schema/validator.md`, D-3 — kein CLI): alle 7 `wiki/`-Dateien SUCCESS (Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1) — unverändert zur Story 2.4; das per-Datei-Verdikt ist der Ausführungs-Nachweis für die Spec-Verification Pkt. 3 und AC 5. `sprint-status.yaml`: `2-5-progressive-discovery-über-index-md-bereitstellen` `backlog` → **`in-progress`** (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag — die gefrorene Spec-Vorgabe „→ `in-progress`" beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand, s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"); Loop-3-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 3). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3); keine Vertragsänderung. - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Review-Loop 2, bmad-code-review, 4 Layer):** 3 `decision-needed` (Nutzer-Entscheidungen 1/1/1) + 11 `patch` umgesetzt, 4 `defer` (s. `deferred-work.md`), 8 dismissed. `schema/compiler.md` → **Revision 2.2**: (1) **Formel 3 quellenbasierte `../schema/*`-Exklusion** (Decision 2): die Exklusion greift nur, wenn die Quell-Datei auf Bundleroot-Ebene liegt (`dirname ` = `wiki`); aus Area-Quellen läuft einstufiges `../schema/…` durch Auflösung + Containment + Existenztest (Prosa war bereits „nur aus Root-Dateien", die Formel folgt jetzt der Prosa); (2) **Formel 4 Re-Baseline auf den Run-Kopf** (Decision 1): Extraktions-Commit `862cf410c624072833cd959da9a2fb26235716f6` statt `66451b6…` — der gepinnte Selbsttest lief auf dem Zuwachs-Baum deterministisch `38 ≠ 30` = Run-FAIL (bekannt-böser Zustand aus Loop-1-A2, nur halb geheilt); jetzt **38 ≡ 38** (re-executiert: Ist=38, Extraktion `862cf41`=38; `66451b6`/`30` dokumentiert den Vor-Zuwachs-Zustand, bleibt als Referenz dieses Runs); (3) **§5.7 Pkt. 1(a) Treffer-Prädikat + Tie-Break** (Decision 3): „inhaltlich deckungsgleichen Eintrag" (Urteil, AD-13-Verstoß) ersetzt durch textuelles Prädikat (Identität des Link-Ziels ≡ kanonischer Name des Themas) + Mehrfachtreffer-Regel (Bundleroot-Links vor Area-Links, dann lexicografische Pfad-Reihenfolge); (4) file-relative Pin-Wortwahl in §5.3 Pkt. 3 (Oxymoron „file-relativ bundle-relativ" aufgelöst), §6.6-Zelle und §7-Bullet nachgeführt; (5) §7-Scope-Einleitung „Root-Ebene" → „Root-Ebene und in Areas gemäß §5.7"; (6) Typos („akte-Baseline" → „aktuelle Baseline", Doppel-Leerzeichen §6.6); (7) „Kopf dieser Spezifikation" → „Baseline-Commit des letzten Zuwachs-Runs". `wiki/wissensarchitektur/index.md`: Prosa auf den tatsächlichen Area-Inhalt gekürzt (nur `source-material.md` existiert; Link-Form/Discovery-Topics waren übergezeichnet). **Negativ-Test-Nachweis (Sandbox-Baum, exakte Formel-Ausgabe):** (a) **TOP_LEVEL_COLLISION** — Kandidat mit ID `llm-wiki-prinzip`: `wiki/llm-wiki-prinzip.md` existiert → §3.2-Hold „Concept existiert bereits — Aktualisierung ist Epic 3" (keine Datei, kein Index-Link, kein `log.md`-Eintrag); (b) **AREA_WITHOUT_INDEX** — Sandbox-`wiki/foo/` ohne `index.md`: wörtliche Punkt-11-Meldung `FAIL wiki/foo/ Punkt 11: Index-Regel verletzt (Area ohne index.md=foo)` (Validator-§7.1-Fixture-Wortlaut, kein inventiertes `AREA_WITHOUT_INDEX`-Label); (c) **DIVING_NON_EXISTENT** — `[v](../fehlt.md)` aus Area-Concept → `DANGLING: ../fehlt.md`; (d) **Out-of-Bundle-Escape** (Loop-1-A1-Kontrolle) — `[x](../../README.md)` → `DANGLING: ../../README.md`, `[y](../../schema/compiler.md)` → `DANGLING: ../../schema/compiler.md`; (e) **In-Bundle-`../schema/` aus Area (Loop-2-Kontrolle)** — `[z](../schema/compiler.md)` aus `wiki/wissensarchitektur/source-material.md` → `DANGLING: ../schema/compiler.md` (vor dem Loop-2-Patch: still exkludiert, leere Ausgabe — Sandbox-Nachweis des gefixten Löchs). Positiv-Kontrolle nach allen Patches: Formel 2 (Form-Check) = `0` (Exit 0), Formel 3 (Dangling) = keine Ausgabe, Formel 4 = `38 ≡ 38` (beide re-executiert). Status-Nachführung (korrigiert zum obigen Implementierungs-Eintrag): `sprint-status.yaml` `2-4-…` `backlog` → `in-progress` (Implementierungs-Eintrag) → **`review`** (Review-Handoff, dieser Eintrag); die gefrorene Spec-Vorgabe („→ `in-progress`") beschreibt den Implementierungsstand, der Review-Handoff ist der übliche Folgezustand (s. Sprint-Status-Workflow-Kommentar „Dev moves story to 'review'"). Loop-Abschluss mit diesem Review: `review` → **`done`** (Sprint-Status synchronisiert, `sprint-status.yaml` `last_updated` nachgeführt; spec-Frontmatter `status: 'done'` deckungsgleich, `review_loop_iteration` → 2). Validator-Lauf-Korrektur zum obigen Eintrag: die gültige Datei-Zählung ist **7** `wiki/`-Dateien (Bundleroot, `log.md`, 3 Root-Concepts, Area-`index.md`, Area-Concept) — der obige Verweis auf „Punkt 9/10" für die Differenz zur Spec-Zahl 6 war falsch belegt (Punkt 9 = `okf_version`/`type: bundle`-Verbot außerhalb der Bundleroot; `log.md` wird über Punkt 10/V-2 mitvalidiert); die Spec-Zahl 6 ist eine frozen-Defizitzählung (Defer in `deferred-work.md`). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). - **Story 2.4 «Deterministische Bereichszuordnung & Concept-Hierarchie» (Implementierung):** `schema/compiler.md` → **Revision 2.1** (neue §5.7 „Deterministische Bereichszuordnung & Concept-Hierarchie": Routing-Regel textual-deterministisch — (a) First-Class-Link aus dem bestehenden `index.md`-Baum → Bereich `wiki//.md`, (b) Default Root-Ebene, neue Areas nur konsolidiert; nie Embedding/Vector, AD-7c/A0-10/AD-13; kanonische ID-Normalisierung AD-7a/A0-8 mit Beispieltabelle; Top-Level-Kollisions-Hold → fixierter §3.2, kein neues Prädikat, kein MOVE; file-relatives Link-Auflösungsmodell inkl. Out-of-Bundle-`..`-Containment; Area-`index.md`-Regel mit wörtlicher Punkt-11-Meldung `FAIL … Punkt 11: Index-Regel verletzt (Area ohne index.md=)` — kein inventiertes Label; Worked Example). Nachgeführt: §5.1 Pkt. 1, §5.3 Pkt. 3 (Index-Regel area-bewusst), §5.6 Pkt. 1/2/3/4/5 (file-relativ; `../`-Exklusion aufgelöst; Formel 3 mit Quell-Datei-Spur + in-Bundle-`..`-Auflösung + Containment — Out-of-Bundle-`..`-Escape wird `DANGLING`; Formel 4 neu auf `baseline_commit` `66451b6e6c9e139fb3aa3bbf4b01291e1e2d273a` (deklarierte `baseline_commit`-Werte der Spec-Frontmatter, nicht mehr Story-2.3-`7e1f449…`; Loop-2: Re-Baseline auf den Run-Kopf `862cf41`, s. obiger Review-Eintrag), Basename-Filter `grep -v "log.md$"`), §6 Pkt. 2, §6.6, §7, §8. `deferred-work.md`: drei Story-2.4-namige Einträge geschlossen (`umgesetzt`): bundlerelativ-vs-dateirelativ (→ §5.7 Pkt. 4 file-relativ), Cross-Page-Anker-Stale-Evidenz (→ Ist-Verhalten Fragment-Strip, keine Dangling-Ausgabe), künftiges Area-`log.md`-Baseline-Bruch (→ Formel 4 Basename-Filter). Neue Area `wiki/wissensarchitektur/` angelegt: `wiki/wissensarchitektur/index.md` (frontmatterlos, Vertrag §2/§6, Validator Punkt 10; verlinkt das Area-Concept in der gepinnten §5.6-Form) + `wiki/wissensarchitektur/source-material.md` (Area-Concept `type: concept`, `sources` s1=architecture-spine + s2=prd, §5.5-Inline-Verweise + Kontext-Marker, Body-Links auf Root-Concepts in file-relativer `../`-Form: `llm-wiki-prinzip.md`, `wissensarchitektur-trennung-states.md`, `knowledge-kompilation-inkrementell.md`). `wiki/index.md`: neue **Area-Sektion** verlinkt `wissensarchitektur/index.md` (die 3 bestehenden Root-Concept-Links + die 3 `../schema/`-Links byte-identisch, Null-Migration). **Formel-4-Re-Baseline:** Ist-Zählung auf dem neuen Baum = **38** (`log.md`-exkludiert; `grep -roE '\(raw/'`), Baseline-Extraktion aus `66451b6` = **30** (alter Baum, 4 nicht-`log.md`-Dateien: `index.md` + 3 Root-Concepts; `git ls-tree -r + git show`, Basename-`log.md`-Filter) — Dokumentation verlangt die aktuelle Baseline aus `66451b6` (`38 ≠ 30`, kein Fehlalarm: Zuwachs-Re-Baseline; Loop-2-Korrektur: Re-Baseline auf den Run-Kopf `862cf41`, `38 ≡ 38`, s. obiger Review-Eintrag); die exakte Ist-Zahl hängt am finalen Concept/Body-Stand und wird in der Spec-Verification des Runs belegt. `sprint-status.yaml`: `2-4-deterministische-bereichszuordnung-concept-hierarchie` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit diesem Eintrag statt). Validator-Lauf: alle **7** `wiki/`-Dateien SUCCESS (`index.md` + `log.md` + 3 Root-Concepts + Area-`index.md` + Area-Concept; Punkte 1/2/6/7/8/9/10/11/12/13/14, EC-1; die Spec-Verification nennt erwartungsseitig „6 `wiki/`-Dateien" — die Differenz erklärt sich durch das reservierte `log.md` (Protokoll, wird mitvalidiert, Punkt 9/10), die Validator-Effort-Zahl dieser erfolgten Ausführung ist 7). `schema/wiki-compiler.md`/`validator.md`/`raw/` unverändert (AD-3); keine neue §7-Klasse; kein Standalone (D-3). ## 2026-08-17 - **Story 2.3 «Concepts verlinken — eine erlaubte Linkform» (Implementierung):** Linkform auf **bundle-relativ mit `.md`-Endung** gepinnt (Rationale: die 3 bestehenden Concept-Links in `wiki/index.md` sind bereits in dieser Form → Null-Migration; Ziele sind explizite Dateien, auch mit Areas eindeutig; Standard-Markdown-Tools lösen ohne Konventionswissen auf — AD-7b, A0-9, FR-10, AD-8). Veränderte Dateien: `schema/compiler.md` → **Revision 1.8** (neue §5.6 „Concept-Links (Story 2.3)": Pin, Geltungsbereich Concept-Bodies + `index.md` mit Ausnahmen `raw/`-Provenienz (§5.5)/`../schema/`/`http`/Gleichseit-Anker, **vier** re-executierbare Selbsttest-Formeln (Bestands-, Form-, Dangling-, Kontakt-mit-`raw/`-Unverändert-Check, AD-17h), NFR-4-Regel, Worked Example; die „bis Story 2.3"-Klauseln in §5.3 Pkt. 3 + §5.5 Pkt. 1 referenzieren §5.6; §7-Bullet, §8-Normreferenzen AD-7b/AD-8/FR-10/A0-9 + Revisionslog 1.8), `wiki/wissensarchitektur-trennung-states.md` (zwei inhaltsbegründete Cross-Links in gepinnter Form: → `llm-wiki-prinzip.md`, → `knowledge-kompilation-inkrementell.md`, je mit §5.5-konformem Kontextsatz/Inline-`raw/`-Verweis; keine Frontmatter-/`sources`-Änderung), `deferred-work.md` (Linkform-Eintrag geschlossen). `wiki/index.md` unverändert (die 3 Concept-Links bereits in gepinnter Form; die 3 `../schema/`-Links außerhalb des Pin-Wirkungsbereichs). `sprint-status.yaml`: `2-3-concepts-verlinken-eine-erlaubte-linkform` `backlog` → **`in-progress`** (dieser Statuswechsel findet mit diesem Eintrag statt). Kontakt-mit-`raw/`-Unverändert: die Vorkommen-Zählung der Inline-`raw/`-Verweis-Muster unter `wiki/` (Selbsttest-Formel §5.6 Pkt. 3, Formel (4)) ist identisch zur aus `baseline_commit` `7e1f449` dynamisch extrahierten Baseline (**30**, `log.md`-exkludiert; `git ls-tree` + `git show`, deterministisch re-executierbar). Validator-Lauf: alle 5 `wiki/`-Dateien SUCCESS (Punkte 1/6/11/14, EC-1; der Punkt-11-Check bleibt strukturell unverändert und akzeptiert beide Schreibweisen — keine neue §7-Klasse, kein Validator-Change). - **Story 2.2 «Claim-granulare Provenienz dokumentieren» → `done` (bmad-code-review 2026-08-17, 4 Layer, abgeschlossen):** Review auf `bb32acd → story-2-2` — 1 `decision-needed` (D1 Referenzform → Option 1: Komma-Form als zulässige Variante), 12 `patch` (alle umgesetzt), 4 `defer`, 2 dismissed. `schema/compiler.md` → **Revision 1.7**: defekte Selbsttest-Grep-Formel behoben (ungeschlossene ERE `'(raw/|]\(raw/'` → `'\(raw/'`), Komma-Form + Multi-Beleg-Serialisierung in §5.5 Pkt.1, Relokations-Sub-Bullets als 1a/1b nummeriert, drei Marker-Muster, Forward-Referenz-Disambiguierung auf `Story 3.1: Inkrementellen Datenfluss implementieren`, §8-Normreferenzen um AD-4a/AD-9/AD-13/AD-14/AD-16/FR-16/A0-3 ergänzt. `wiki/knowledge-kompilation-inkrementell.md` Forward-Referenz-Zitat disambiguiert. Defer W2–W4 (Fragment-Existenz, Marker-Grammatik, `sources`-`id`-Eindeutigkeit — keine re-runnable Prüfung ohne Standalone, D-3) + W1 (sources-Closure) in `deferred-work.md`. Re-Verifikation: `sh -c "grep -nE '\(raw/' wiki/*.md"` 27 Treffer, alle 3 Diagramm-Marker + Forward-Referenz mit exaktem Token, `sources`-`id` je Concept eindeutig, `wiki-compiler.md`/`validator.md`/`raw/` unverändert. Klassifikation: `review-2-2-klassifikation.md`. `sprint-status.yaml`: Story 2.2 → `done`. - **Story 2.2 «Claim-granulare Provenienz dokumentieren» — Nachrüstung (Datei-Bodies, `index.md`, `log.md`):** `schema/compiler.md` um §5.5 „Claim-granulare Provenienz" erweitert (nach §5, vor §6): Inline-`raw/`-Verweis je belegter Aussage + `id`-Attribution (Vertrag §3.3), Kontext-Marker je Übernahme (übernommen aus `` (rohe Quelle) bzw. übernommen aus `` auf Basis von ``, jeweils „nicht eigenständig belegt"), eindeutiges `id`-Scoping je Concept, Selbsttest-Kriterien (AD-4a/4c, AD-13, AD-17h); Revisionslog (§8) → Revision 1.5 (Nachrüstung) bzw. 1.6 (Review-Patch-Runde: Stellen-Kennungs-Semantik, volle Pfade, Direktübernahme-Marker, worked example, korrigierte Grep-Formel), §7-Selbstbegrenzung entsprechend angepasst. `wiki/index.md` (Descriptions um `(aus )`), `wiki/knowledge-kompilation-inkrementell.md`, `wiki/llm-wiki-prinzip.md`, `wiki/wissensarchitektur-trennung-states.md` nachkonformiert — jede belegte Aussage trägt Inline-Verweis; Übernahmen tragen Kontext-Marker (keine Selbstreferenz, keine Concept-`id`-Fragmente `#s1`/`#s2`). **Diagramm-Quell-Deklaration:** Das ASCII-Diagramm in `wiki/knowledge-kompilation-inkrementell.md` (Datenfluss) stammt aus `raw/architecture-spine/architecture-spine-2026-08-14.md#AD-5` — zusätzlicher `sources`-Eintrag (`id: s2`) ergänzt; das Diagramm in `wiki/wissensarchitektur-trennung-states.md` (Sources → Compilation → Knowledge Bundle → Consumers) aus `raw/prd/prd-wow20-2026-08-14.md` (§ 8.3 Separation of Concerns) — zusätzlicher `sources`-Eintrag (`id: s2`) ergänzt. `sources`-`id` je Concept eindeutig; keine unautorisierten Keys. `wiki-compiler.md`/`validator.md`/`raw/` unverändert. Validator-Lauf: alle 5 `wiki/`-Dateien SUCCESS (Punkte 1/6/11/14, EC-1) — Story 2.2 `review`. - **Story 2.1 «Concepts aus Source Material erzeugen (OKF-Konform)» → `done` (Human-Review-Freigabe erteilt):** Nutzer hat die verbleibende Schwelle (menschliche Review-Freigabe) überschritten — Status `review` → `done`, `sprint-status.yaml` nachgeführt. Alle 8 ACs PASS, kein AC-/Vertrags-Blocker; offene Folge-Arbeit (autorisierte Validator-Rev 9) ist kein Story-2.1-Blocker und bleibt als Action-Item `code-review-2-1-item-2` in `deferred-work.md` verankert. - bmad-code-review Re-Run Story 2.1 (unabhängig, 4 Layer, Stand nach Validator-Rev-8): alle 8 ACs PASS, 17 Patch / 4 Defer / 2 Dismiss. 15 Patches umgesetzt — `schema/compiler.md` → Revision 1.4 (Prüfgrundlage Rev 8, §6.6-Referenzlabels §4.5/§4.2, §3.2 Kollision-Hold-Run-Fortsetzung, §5.3/§6.3 Rollback-Sequenz, Sprachkorrekturen), `wiki/log.md` (verlorener Bullet, Rev-8-Datum 08-17), `wiki/index.md` (Baumdiagramm um Root-Concepts-Ebene), Doku-/Referenz-Konsistenz (`deferred-work.md` Dedupe + n=21, `review-input-dryrun-…md` 16+2-Auflösung, `epic-2-context.md` AD-4c tautologisch, spec Verification/Change-Log, `sprint-status.yaml` closed-Datum). 2 Patches auf der gefrorenen `validator.md` (Rev 8) geholdert → nächste autorisierte Validator-Revision (Rev 9: Punkt-4-Grammatik `resolved=`-Token, Innen-Ebenen-Punkt-6-Fixture-Zeile; s. `deferred-work.md`). - **Story 2.1 «Concepts aus Source Material erzeugen (OKF-Konform)» → `review` (Freigabe zur Human-Review):** Option-A-Voraussetzung erfüllt — autorisierte Validator-Revision 8 ausgeführt und zertifiziert (s. Eintrag 2026-08-16). `spec-2-1-…`-Re-Review-Verdikt aktualisiert: Story ist `done`-fähig; einzige verbleibende Schwelle ist die menschliche Review-Freigabe (`review` → `done`). Action-Item `code-review-2-1-item-1-autorisierte-validator-revision-option` → `done` (Autorisations-Runde: `validator-revision-8-autorisationsrunde-f14-innen-ebenen.md`). `sprint-status.yaml`: Story 2.1 → `review`. ## 2026-08-16 - Autorisierte Validator-Revision 8 (Option-A-Heilung Story 2.1, ausgeführt 2026-08-17): `schema/validator.md` Revisionslog-Eintrag „Revision 8" + Header-Revisionszahl auf 8 angehoben (behebt OBS-1: Header „Revision 6" vs. Log „Revision 7"). Drei Änderungen: (1) F-14-Negativ-Fixture 4a in §7.1 (Punkt 4: `resource: README.md` außerhalb `raw/`, existierend → `FAIL … Punkt 4`; Retrospective F-14); (2) Innen-Ebenen-Key-Subset formalisiert — Punkt-6-Zelle verweist auf die §7.3-Isolations-Notiz (autorisiert, Revision 8); (3) Revisionslog nachgeführt. Vertrag `schema/wiki-compiler.md` und `schema/compiler.md` unverändert (keine neue §7-Invaliditätsklasse). Zertifizierung selbstgeprüft: Fixture 4a isoliert → FAIL Punkt 4 (resolved=README.md) (Punkt 3 nicht verletzt, keine anderen Punkte); Innen-Ebenen-Sample (`sources`-Eintrag mit `role: x` bei existierender `raw/`-Datei) → FAIL Punkt 6 (Key=role); reales Bundle (5 `wiki/`-Dateien) → SUCCESS (keine neu ausgelösten FAILs). - `schema/compiler.md` auf Revision 1.3 — §1-Überschrift ins Deutsche, Prüfgrundlage auf validator.md Revision 7 angeglichen, §6.6-canonical-Reihenfolge-Zeile von ✗- auf reine ✓-Vorgabe korrigiert (kein Validator-FAIL, Label §4.2 statt „§6.4"), §1.2/§1.4-Evidenz-Widerspruch aufgelöst (Artefakt-Ausnahme als dokumentarische Konvention). `wiki/log.md`-Demonstrationslauf-Einträge an Vertrags-§5-Format angeglichen (`- neu:` … angelegt (sources: …)). Story 2.1 bleibt `in-progress` (Option A: Heilung der validator.md-Rev-7-Klarstellung über die nächste autorisierte Validator-Revision). - Step-04-Review (Story 2.1): Nachschärfungen aus den drei Review-Layern (Blind Hunter, Edge Case Hunter, Verification Gap) angewendet — `schema/compiler.md` auf Revision 1.2 (Input-Regel auf AD-17a referenziert statt AD-17.2, `sources`-Eintrag-Key-Subset in §4.2/§6.5/§6.6 ergänzt, `status`-Absenz an Vertrag §3.6 angebunden, Bereichs-Ziel-Klarstellung bis Story 2.4, §6.6-Fehlerursachen korrigiert, AD-17f als Commit-Boundary sichtbar), `schema/validator.md` auf Revision 7 (§7.3-Isolations-Hinweis auf Innen-Ebenen-Key-Subset erweitert), `wiki/index.md`-Workspace-Absatz korrigiert (`schema/` = drei Artefakte: Vertrag, Validator, Compiler), `sprint-status.yaml`: Story 2.1 → `review` (Review begonnen). `at`-Zeitstempel der drei Concepts (`2026-08-16T09:23:33Z` = 11:23:33 Lokalzeit +0200) decken sich mit den Datei-Mutationszeitpunkten (11:24) — im Review geprüft. - neu: `llm-wiki-prinzip` angelegt (sources: raw/prd/prd-wow20-2026-08-14.md) — Root-Concept, Trust-Metadaten A0-20 (`generated { by: wow-compiler/0.1.0, at: }`, `verified` ungesetzt) - neu: `knowledge-kompilation-inkrementell` angelegt (sources: raw/epics/epics-2026-08-14.md) — Root-Concept, Trust-Metadaten A0-20 - neu: `wissensarchitektur-trennung-states` angelegt (sources: raw/architecture-spine/architecture-spine-2026-08-14.md) — Root-Concept, Trust-Metadaten A0-20 - Retrospective-Follow-up (AI-1/F-01): `schema/validator.md` auf Revision 3 — `at`-Nur-Datum-Toleranz zurückgenommen. `at: 2027-01-01` ist jetzt FAIL nach Punkt 14 (reine Datumsangabe ≠ ISO-8601-Datetime); Positiv-Fixture 14c neu mit `±HHMM`-Form (`+0200`) belegt. Vertrag `schema/wiki-compiler.md` unverändert (autorisiert). Validator-Zertifizierung zugehörig geprüft: Fixture 14c (Negativ) erzeugt FAIL. - Retrospective-Follow-up (AI-2/F-02): `schema/validator.md` auf Revision 4 — neue Fixture-Tabelle §7.3 für die §6-Fachprüfungen (EC-1 Existenz, EC-3 Kalender, stale_after-WARN, EC-11 non-md). Zertifizierung gegen erweiterte Fixtures selbstgeprüft — Ergebnis: PASS (je §6-Fixture isoliert geprüft, genau die angesprochene Prüfung löst aus; EC-1/EC-3-FAILs sind Run-FAIL, WARN ist Berichtskanal, non-md wird ignoriert ohne Verdikt). - Retrospective-Follow-up (AI-3/F-03): `schema/validator.md` auf Revision 5 — §3.2-Voraussetzungsprüfungen als fachliche Prüfklasse V-1/V-2 gelabelt (Verdikt `FAIL (Voraussetzung) … (V-1|V-2)` statt `FAIL (Struktur)`), §5-Grammatik/Selbstbegrenzung sowie §7.1/§7.3-Fixtures angeglichen. Zertifizierung: V-1/V-2-Fixtures selbstgeprüft — PASS (isolierte Auslösung; kein §7-Punkt-Nr.-Konflikt). - Retrospective-Follow-up (AI-4/F-09): `raw/*/source.md`-Provenienz korrigiert — `_bmad-output/` IST versioniert; Herkunft auf Commit `6cc667d` gestützt und SHA-256 der Herkunftsdatein aufgenommen (byte-identisch zur materialisierten Evidenz, geprüft). - Retrospective-Follow-up (AI-5/F-05): `schema/validator.md` auf Revision 6 — BOM-/Leerzeilen-Stripping der Frontmatter-Erkennung von Punkt 10 auf Punkte 2/8 ausgedehnt (einheitliche §3-Präambel). Zertifizierung: neue Positiv-Fixtures 2a/8b (BOM + Leerzeile vor `---`) → SUCCESS; geprüft gegen isolierte Samples — PASS. - Retrospective-Follow-up (AI-7): Defer-Kontexte gesichert — F-04, F-06, F-07, F-08, F-11, F-14 als Folge-Aufgaben in `deferred-work.md` notiert (mit Epic-2/3/Validator-Zuordnung); F-06/F-08 zusätzlich als „Offene Punkte" direkt im Validator (Rev. 6) verankert. - Retrospective-Follow-up (AI-6/F-10): Mechanische Validator-Verifikation nachgeschärft — spec-1-4-Verification enthält jetzt einen strengen, deterministischen Vertrag↔Validator↔Fixtures-Abgleich (14 Punkte, keine Punkt 15, Verifikations-Beleg-Tabelle) als Pflicht-Re-Check bei jeder Autorisierung. Bleibt innerhalb der D-3-Grenze (kein Standalone-Programm); dokumentarisch-mechanisch statt Existenz-Grep. ## 2026-08-15 - Validator-Zertifizierung: `schema/validator.md` (Revision 2) gegen die Referenz-Fixtures (§7) selbstgeprüft — Ergebnis: PASS (alle Negativ-Fixtures erzeugen FAIL, alle Positiv-Fixtures SUCCESS; maschinenlesbares Verdikt gemäß §5 bestätigt). Jede Negativ-Fixture wird je Fixture isoliert gegen ein sonst-valides Sample geprüft, sodass genau ihr zugehöriger Punkt auslöst (kein Vorab-FAIL durch andere Punkte).