feat: Story 3.9 (Loop-2) — Deterministische Relevanz- & Reconcile-Routing schließen, review reif

§5.15 „Deterministische Relevanz- & Reconcile-Routing (Story 3.9)" in schema/compiler.md
(Revision 3.4): geschlossene Termgewinnung (AC-1), symmetrische Normalisierung +
literal-sichere Suche (AC-2), eine exklusive Routing-Tabelle UPDATE→CREATE→ORPHAN/HOLD→NO_OP
(AC-3, NO_OP als Update-Unter-Entscheidung), Raw-Immutability-Guard M/D/R→Run-FAIL (AC-4),
reservierte Zielpfade index/log/source/README→deterministischer Hold (AC-5), Zwei-Run-Identität
nicht-vakuum inkl. praktisch ausgeübter at-Exzeption (AC-6). §3.2-Pkt.-3d-Anker, §5.14-Pkt.-5-Scope
und §7-Bullet nachgeführt.

Review-Loop-2: 2 bad_spec (BS-L2-1 NO_OP-Leere-Candidate-Liste, BS-L2-2 Status-Codes R/C)
durch Re-Ableitung behoben; Step-04-Re-Review (2 frische Layer + Verification Gap) ohne
neuen Loopback (F-6 Lowercasing-Pkt.-1, F8 Guard-Abbruch real, F9 ableitungsbasierte
Term-Erwartung, F-22/F-27 BUNDLE-BYTE-Nachweis angewandt). Sandbox R-1..R-9 PASS, Exit 0.

Re-Derivation: deferred-work.md D-8/D-9 aufgegriffen; epic-3-context.md Z. 39 → Ist;
sprint-status.yaml Story-3.9 → review. AD-3 read-only + Erhaltungs-Invariante (nur
wiki/log.md) gewahrt. Suggested Review Order in Spec 3.9 angehängt.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Michael Tamse
2026-08-21 06:21:08 +02:00
co-authored by Claude
parent 2f079ee3c8
commit 73f2c9e71d
7 changed files with 1176 additions and 9 deletions
+1
View File
@@ -1,6 +1,7 @@
# Log
## 2026-08-20
- **Story 3.9 → Re-Ableitung Loop-2 + `in-progress` (Deterministische Relevanz- & Reconcile-Routing, 2026-08-20):** Loop-2-bad_spec-Loopback (bmad-code-review Re-Run — 2 bad_spec, 4 patch, 2 defer; kein intent_gap, kein Eingriff ins `<frozen-after-approval>`). **Kern-Defekte behoben:** **BS-L2-1** — NO_MATCH/leere Candidate-Liste ist bei **neuer Einheit** NICHT NO_OP, sondern **CREATE (Zelle 2) / ORPHAN-HOLD (Zelle 3)**; NO_OP (Zelle 4) bleibt ausschließlich **Unter-Entscheidung des Update-Pfads** (bestehende Evidenz identisch repräsentiert) — §5.15-Pkt.-3-Tabelle, §3.2-Pkt.-3d-Verweis-Anker und Sandbox R-3/R-5 in Einklang; **BS-L2-2** — Status-Codes geschlossen: **R (Rename)** einer committeten `raw/`-Datei = AD-3-Verletzung → **Guard-FAIL**, **C** zählt als **A** (Copy/neu), `--diff-filter=ACMR` dokumentiert die Zuordnung. **Weitere Loop-2-Auflagen:** P-L2-1 Sandbox-`norm()` auf die **eine** Kollaps-Definition (§3.2-Pkt.-1b) vereinheitlicht (keine vierte Pipeline); P-L2-2 R-2-`index.md`-Traversal **real** gefeuert (Fixture enthält den Term, Traversal-Exklusion negativ assertiert); P-L2-3 R-1-Diff↔Manifest-Äquivalenz um **Negativ-Zweig** ergänzt (divergentes Manifest → Run-FAIL vor Mutation); P-L2-4 R-8-**Zwei-Run-Hold über zwei getrennte Worktrees** (Behebung der Doppel-Read-Tautologie); P-L2-5 R-6/R-7-**Slug aus dem abgeleiteten Kandidaten** + `git ls-tree`-Schnittmengen-Fixture + entdoppelte tote `CAND`-Assertion (kein `|| true`); P-L2-6 R-9-Receipts um **`generated.at`-Feld + praktisch ausgeübte at-Exzeption** (legitime at-Abweichung ≠ AD-16; andere als-at-Differenz = HARD-FAIL). **Defer-Aufgriffe (Home Story 3.9):** D-8 (Mehrfach-Term-Vereinigung) und D-9 (Term-Ableitung aus dem `raw/`-Zuwachs + voller Kandidaten-Scan statt fester 2-Datei-Liste) in §5.15 Pkt. 1 / Sandbox R-1/R-5 realisiert. **Verankerung (`schema/compiler.md` Revision 3.4):** neue **§5.15** „Deterministische Relevanz- & Reconcile-Routing (Story 3.9)" (Pkt. 16) — Pkt. 1 **Termgewinnung** (geschlossen, geordnet, AC-1: Dateiname→Term-Mapping, Sidecar-Exklusion, Status-Codes A/M/D/R/C via `--diff-filter=ACMR`, §5.9-Pkt.-6-Diskrepanz-/Fallback-Kopplung, Diff↔Manifest-Äquivalenz, D-8-Mehrfach-Term-Vereinigung mit ≥2-Zeichen-Segmenten, Einzelzeichen-Segmente kein eigener Term, optional committetes Term-Manifest), Pkt. 2 **symmetrische Normalisierung + literal-sichere Suche** (AC-2, §3.2-Pkt.-1b-Kollaps-Klasse `[-–— _]``-`; `index.md`-Treffer → Traversal-Stufe, kein Concept-Kandidat), Pkt. 3 die **eine exklusive Routing-Tabelle** (AC-3: UPDATE → CREATE → ORPHAN/HOLD → NO_OP; NO_OP als Update-Unter-Entscheidung; Leere-Candidate-Absatz; Stufe-b-Zelle), Pkt. 4 **Raw-Immutability-Guard** (AC-4: M/D/**R** → Run-FAIL vor Mutation, A/C akzeptiert), Pkt. 5 **reservierte Zielpfade** (AC-5: `index`/`log`/`source`/`README` erschöpfend, deterministischer Hold, Ist-Dateimenge via `git ls-tree`-Schnittmenge), Pkt. 6 **Zwei-Run-Identität** (AC-6: positive UND negative Fixtures, Zwei-Worktree-Vergleich, praktisch ausgeübte `at`-Exzeption, kein hart codierter Erwartungswert). **§3.2**-Pkt.-3d-§5.15-**Verweis-Anker** nachgeführt; **§5.14**-Pkt.-5-Scope-Präzisierung (Story-3.9-ACs verankert); **§7**-Relevanzbestimmung-Bullet erweitert (Vorbehalt aufgelöst); Revisionslog **Revision 3.4**. **Re-Derivation:** `deferred-work.md` D-8/D-9 → **`aufgegriffen`**; `epic-3-context.md` Z. 39 → **Ist (§5.15 verankert)**; `sprint-status.yaml` Key `3-9-…`**`in-progress`** (finaler `review`/`done`-Flip im Step-04/05). **Sandbox-Nachweis:** `bash _bmad-output/implementation-artifacts/sandbox-3-9/run-sandbox.sh`**R-1..R-9 harte PASS, Exit 0** (inkl. R-1b R/C-Guard, R-5-CREATE-Bewertungsraum, R-8-Zwei-Worktree-Hold, R-9-at-Exzeption + Negativkontrolle). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag); **AD-3 read-only** (`schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/`/`schema/canonical-terms.md` unverändert); kein Standalone (D-3), keine neue §7-Invaliditätsklasse, keine Vertragsänderung; Umlaut-vs-Transkription bleibt benannter Defer; Hold-Ausbau (post-Reconcile-Orphan, Mehrziel) bleibt Story 3.10.
- **Story 3.8 → Review-Loop-3-Abschluss + `done` (Determinismus-Vertrag, bmad-code-review Re-Run 4 Layer — blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor, 2026-08-20):** Re-Review der Loop-2-zustands Implementation; **Triage:** 4 decision-needed / 13 patch / 6 defer / 7 dismissed; **keine intent_gap/bad_spec (kein Loopback).** **Nutzer-Entscheidungen D-1..D-4 = 1/1/1/1** (empfohlene Optionen): D-1 §5.14-Schließungs-Bullet macht den Z. 53 „Bekannte Determinismus-Lücke"-Bullet **superseded** (append-only-Superseded-Hinweis, kein Umbruch); D-2 Story-Status-Flip auf **`done`** nach Loop-3-Abschluss (Change-Proposal-Sequenzierung „3.9 → 3.10 / 3.11 → 3.12 → 3.8 Abschluss → 3.13 Abnahme" betrifft das **Epic-3-Abnahmegate (3.13)** — Story-3.8-Instruktionsverankerung abgeschlossen, 3.93.12-Verankerungen + 3.13-Abnahme bleiben offen, epic-3 in-progress); D-3 **autorisierte Neu-Verhandlung** des Frozen-Intents in geringfügigem Umfang: Typo „documenthuman" → „document-human" (spec Z. 24, dokumentiert); D-4 Hold-Home = **Story 3.10 (Epic 3)**, Korrektur-/Erweiterungs-**Klassifikation** = Epic-4-Interface/Story 4.1 (§5.10 Pkt. 8 präzisiert). **Patches (13):** P-1 SRO-/Code-Map-Anker auf IST-Zeilen (compiler.md 375/376/377/477; Code Map §5.14 365377, §7 424ff, §8 445, Rev 3.3 477; Sandbox 245/265/442/275/447/531); P-2/P-4 symmetrische Term-/Body-Normalisierung (identisch normalisiert vor Vergleich, kein host-abhängiges `-i`, Wortgrenze = Tool-Wortdefinition rg `-w`/`\b`) — §3.2 Pkt. 2a + `match_stufe_a` (Term + Body identisch normalisiert, `-i` entfernt, ASCII-Boundary `[^A-Za-z0-9]`); P-3 re-executierbare Zwei-Run-Formel als Receipt-Hashvergleich (git-diff-Formel = Austauschbar-Form derselben Eigenschaft) — §5.14 Pkt. 2; P-5 Sandbox-Fresh-Kontext-Restlücke textuell benannt (mechanisch simuliert; Nachweis echter frischer Kontexte = Story-3.13-Abnahmegate) — §5.14 Pkt. 2; P-6 Manifest-`generated_by` wird **konsumiert** (Guard + Konzepts-Frontmatter `by:` aus Manifest statt hart-codiert); P-7 **at-Ausnahme hart assertiert** (Wiederholungs-Schleife bei Wanduhr-Sekundenkollision erzwingt real unterschiedliche `at_cell`-Werte; `HARD-FAIL` statt stiller PASS) — re-executiert: `BEFUND: at-Ausnahme aktiv (assertiert)` mit real differierenden Wanduhrwerten; P-8 „vollständig pinbar"/„keine offene Frage" **ge scopet** (nur für die mit §5.14 geschlossenen Lücken; Umlaut-Defer + Story-3.9-ACs bewusst nicht damit geschlossen, sichtbar als benannte Defers/Geplante) — §5.14 Pkt. 5 + §7-Bullet; P-9 epics.md AC-2: „Determinismusfehler" = **AD-16-Klassifikationsdefekt** (AD-16-Kopplung nachgeführt, AC-Wortlaut erhalten); P-10 spec `review_loop_iteration: 0 → 2` (Counter ab Loop-3 gepflegt); P-11 epic-3-context.md Technical Decisions Z. 39/41/43 als **Zielzustand** markiert (Story 3.9/3.11/3.12 — noch nicht in compiler.md verankert, §3.2/§5.11 maßgeblich bis dahin); P-12 verifiziert + dokumentiert (epics.md enthält kein Literal „AD-17a..h"; die AD-17-Enums sind mit dem Change-Proposal konsistent — AD-17g liegt in Epic 4 Z. 101; kein Edit nötig); P-13 Spec Change Log Review-Loop-3 (append-only, nach Loop-2-Eintrag, vor `</frozen-after-approval>`). **Defers (6, → deferred-work.md append-only, Block „Deferred from: code review of spec-3-8… (2026-08-20)"):** D-5 Sandbox-Härtungs-Guards (8 Befunde), D-6 DET-1/2-Plan-Literale (Home: 3.13-Abnahme), D-7 `norm()`-Locale-Pinning, D-8 Mehrfach-Term-Union, D-9 Orphan-Term-Hand-Pin/feste 2-Datei-Scan (Home: 3.9), D-10 Umlaut-vs-Transkription im Match-Pfad (bereits „Aufgegriffen (teilweise)" offen). **Dismissed (7):** u. a. Blind-Hunter-Claim „alle Sandbox-SRO-Anker stale" — **widerlegt** (alle 6 exakt vor den eigenen Edits); übrige: Loop-1/2-Präzedenz-Doppelzählungen + by-design-Lesarten (Details im Spec Change Log). **Sandbox re-executiert:** `bash _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh`**DET-1..DET-8 harte PASS, Exit 0**; at-Ausnahme aktiv (assertiert, real unterschiedliche Wanduhr-`at`-Werte A vs. B); Manifest `generated_by` konsumiert; Witness nicht-vakuum (Baseline-SHA ≠ Run-SHA). **Spec-Frontmatter:** `status: 'done'`, `review_loop_iteration: 2`; Frozen-Intent nur im D-3-Umfang geändert (Typo, autorisiert). `sprint-status.yaml`-Key `3-8-…`**`done`** (D-2; Sequenzierungs-Hinweis im Key-Kommentar), `last_updated` → 08-20-2026 17:04. **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich `wiki/log.md` (dieser Eintrag); AD-3 read-only (`schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert).
- **Story 3.8 → Review-Loop-2-Abschluss + Step-05 (Determinismus-Vertrag, 2026-08-20):** Re-Review der Re-Open-Implementierung (3 Layer synchron — blind-hunter / edge-case-hunter-Retry / verification-gap; edge-case-hunter erste Ausgabe leer → per Re-Run ersetzt). **Triage:** keine intent_gap/bad_spec (kein Loopback); **10 Patch / 0 defer** / Rest Reject. Kern-Veranlassung: die drei Re-Open-ACs wurden als *nicht wirklich ausgeübt* erkannt (Manifest dekorativ/nie konsumiert; `at`-Maskierung **vor** dem Commit = stiller Ausschluss statt dokumentierter Ausnahme; kein `verified[]`-Feld; Receipt ohne Reihenfolge-/Entscheidungsfeld; Subshell ohne `set -e`). **Patches (ausschließlich `sandbox-3-8/run-sandbox.sh`):** DET-2 ganzheitlich gehärtet — `generated.at` wird als **reale Wanduhr-**Ausgabe je Lauf committet (`date -u`) und als `at_cell` im Receipt festgehalten; Normalisierung auf `AT` erst **beim Vergleich** (Hash über at-normalisierte Content-Projektion, §5.14 Pkt. 2 „ohne die maskierte at-Zeile"); Nach-Commit-Attestierung `committed_at == at_now`; Zwei-Run-Abgleich byte-identisch für alle deterministischen Receipt-Bestandteile, nur die zwei Ausnahme-Cells `at_cell`/`tree` dürfen differieren — die `at`-Varianz wird real demonstriert (Wanduhr `at` differiert in getrennten Worktree-Läufen); **kanonisches Eingabemanifest wird konsumiert/validiert** (abschnittsbewusste Extraktion `sources:`/`output_visible_run_identity:`, Baseline-Quellen-Existenz nach Input-Commit, HARD-FAIL bei fehlenden Keys); Receipt um **`order:`** und **`decisions:`** erweitert (§5.14 Pkt. 2) + Receipt-Nicht-Vakuum-Guard; Subshell **`set -e`** (kein false-PASS); `match_stufe_a` **literal-sicher** (Term regex-escaped, §3.2-Pkt.-2a/§5.14 Pkt. 5) + CRLF-tolerante Body-Extraktion; `cand`-Newline-Normalisierung; `log_bullet` **fail-hard** (mktemp/mv-Fehler nicht mehr geschluckt — ein verlorener log-Eintrag hätte Vakuum-Gleichheit durch identische Baseline-Hashes erzeugt); `git worktree prune` vor dem Add (Re-Run-Sicherheit); `git clean` fail-hard unter `set -e`. **Verifikation re-executiert:** `bash _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh`**DET-1..DET-8 harte PASS, Exit 0**; `BEFUND: at-Ausnahme aktiv` mit real unterschiedlichen Wanduhr-`at`-Werten (Lauf A vs. B), Witness nicht-vakuum (Baseline-SHA != Run-SHA); Validator-Verdikt (human-mechanisch, Rev 9, D-3): alle `wiki/`-Dateien SUCCESS (keine Inhalts-Mutation). **Erhaltungs-Invariante §5.9 Pkt. 5 gewahrt:** `git status --porcelain -- wiki/` zeigt ausschließlich diesen Eintrag in `wiki/log.md`; `schema/validator.md`/`schema/wiki-compiler.md`/`adapters/`/`raw/` unverändert (AD-3). Spec **Change Log Review-Loop-2** (append-only); Suggested Review Order auf gehärtete Sandbox-Anker aktualisiert. `sprint-status.yaml`-Key `3-8-…`**`review`** (Review-Start/Neu-Flip; finaler `done`-Flip Story-Konvention), `last_updated` → 08-20-2026 17:05; Spec-Frontmatter `status: 'in-review' → 'done'`, `review_loop_iteration: 0`.
- **Story 3.8 → Re-Open-Delta (Determinismus-Vertrag, genehmigtes Sprint-Change-Proposal 2026-08-20):** `_bmad-output/planning-artifacts/sprint-change-proposal-2026-08-20.md` (approved, ProMods, explizite Chat-Freigabe) nimmt Story 3.8 aus `review` nach `in-progress` zurück (Epics-Datei ACs Z. 357370). **§5.14-Wortlaut (Re-Open-Delta):** Zwei-Run-Bestätigungs-Mechanik umgestellt auf **zwei getrennte saubere Worktrees + frische Agent-Kontexte** (Q-6/A0-19 — eine zweite Ausführung in derselben Session genügt nicht), unter **kanonischem Eingabemanifest** (Baseline-Commit, geordnete Source-Eingaben, output-sichtbare Run-/Zeit-/Identitätswerte, A0-19) und mit **Run-Receipt** (Candidate-Liste, Reihenfolge, Plan, Entscheidungen, Output-Hashes) **außerhalb des Knowledge Bundle**; **keine hart codierten erwarteten Pläne/Concept-Bodies** und **keine pauschale `verified`-Maskierung** (einzige benannte Ausnahme bleibt der dokumentierte `generated.at`-Wanduhr-Gap, A0-20/§5.14 Pkt. 3). **Sandbox DET-2 umgebaut** (zwei getrennte Worktrees `wt-a`/`wt-b` + `manifest.yaml` + `receipts/run2a.receipt/run2b.receipt` außerhalb des Bundles; Candidate-Ableitung aus Git-State via deterministischem Stufe-a-Match, nicht hart codiert; Abgleich der beiden Receipts als tatsächlicher Zwei-Run-Vergleich, nicht-vakuum): `bash _bmad-output/implementation-artifacts/sandbox-3-8/run-sandbox.sh`**DET-1..DET-8 harte PASS, Exit 0** (Zwei-Run-Identität byte-identisch bis auf die benannte `at`-Ausnahme; Witness weicht von Baseline ab). `schema/compiler.md` §8 **Revision 3.3** (Re-Open-Klausel); §5.13-„in einer Session" unverändert (AD-6-Phasen-Disziplin, Fugen-Identität). **Validator-Verdikt** (human-mechanisch, `schema/validator.md` Rev 9, D-3 — kein CLI): alle `wiki/`-Dateien SUCCESS (keine Inhalts-Mutation). **Erhaltungs-Invariante §5.9 Pkt. 5:** `git status --porcelain -- wiki/` zeigt ausschließlich diesen Eintrag in `wiki/log.md`; `sprint-status.yaml``in-progress`; AD-3 read-only (validator/wiki-compiler/adapters/raw/ unverändert).