From 52f88fdc5f3ea0fe5323412ca3ba8b4a1bdbf549 Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Wed, 19 Aug 2026 13:21:48 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Story=203.2=20Code-Review-Loop-3-Patche?= =?UTF-8?q?s=20(bmad-code-review,=204=20Layer;=20Nutzer-Entscheidungen=20D?= =?UTF-8?q?-1/D-2/D-3/D-4/D-5=20=3D=201/1/1/1/1=20+=20P-1/P-2)=20=E2=80=94?= =?UTF-8?q?=20compiler.md=20Revision=202.7,=20=C2=A73.2-Pkt.-3b-lexikograf?= =?UTF-8?q?isch,=20canonical-terms-Lookup-Semantik=20+=20Invariante=20+=20?= =?UTF-8?q?Konflikt-Verfahren,=20Sandbox=20T5-T7=20+=20T1/T4-Asssertionen?= =?UTF-8?q?=20(7/7=20PASS),=20Stale-Beleg=20(b)=20korrigiert,=20Statuskett?= =?UTF-8?q?e=20in-progress=20=E2=86=92=20done,=20P-2-Typos,=20Story=20done?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- .../implementation-artifacts/deferred-work.md | 28 ++- .../sandbox-3-2/run-sandbox.sh | 227 +++++++++++++++++- ...xtual-deterministisch-umsetzen-grep-rip.md | 41 +++- .../sprint-status.yaml | 2 +- schema/canonical-terms.md | 8 +- schema/compiler.md | 7 +- wiki/log.md | 3 +- 7 files changed, 294 insertions(+), 22 deletions(-) diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index 732ad1c..c36c3ae 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -65,7 +65,7 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `_bmad-output/implementation-artifacts/spec-1-4-schema-validierung-für-bundle-implementieren.md` summary: Genau-eine-erlaubte-Linkform für den Punkt-11-Index-Check festlegen (mit vs. ohne `.md`-Endung) — Story 2.3. - evidence: Step-04-Review (Story 1.4, Loop 1): Der Validator-Punkt-11-Check akzeptiert beide Linkformen (relativer Bundle-Pfad mit oder ohne `.md`-Endung), weil die genau-eine-Form-Regel (A0-9/AD-7b) erst Story 2.3 definiert. Der Determinsmus-Anspruch des Validators bleibt gewahrt (beide Formen zählen als verlinkt); eine Endungs-Festlegung würde die abschließende §7-Liste erweitern und gehört in Story 2.3. + evidence: Step-04-Review (Story 1.4, Loop 1): Der Validator-Punkt-11-Check akzeptiert beide Linkformen (relativer Bundle-Pfad mit oder ohne `.md`-Endung), weil die genau-eine-Form-Regel (A0-9/AD-7b) erst Story 2.3 definiert. Der Determinismus-Anspruch des Validators bleibt gewahrt (beide Formen zählen als verlinkt); eine Endungs-Festlegung würde die abschließende §7-Liste erweitern und gehört in Story 2.3. status: umgesetzt (2026-08-17, Story 2.3) — Linkform in `schema/compiler.md` §5.6 gepinnt (bundle-relativ **mit** `.md`-Endung; Rationale: Null-Migration der 3 Concept-Links in `wiki/index.md`, explizite Datei-Ziele, Standard-Markdown-Tools — AD-7b/A0-9/FR-10/AD-8) inkl. vier re-executierbarer Selbsttest-Formeln (AD-17h). Der Validator bleibt strukturell unverändert (Punkt 11 akzeptiert beide Schreibweisen — Story-2.2-Präzedenz, D-3); die konsistente Nachführung der „Story 2.3"-Notizen in `schema/validator.md` (Punkt 11, §8) bleibt Rev-9-Kandidat (Eintrag unten). - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` @@ -81,7 +81,7 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein evidence: Retrospective F-04. - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` (F-06) - summary: `today`-Zeitzone für die `stale_after`-WARN (Validator §6.4) deterministisch festlegen — „heute in UTC abgeleitet" ist nicht hart definiert (Kalenderdatum des UTC-Zeitpunkts vs. lokaler Tag). Determinsmus-Anspruch (AD-17h) vor Epic-3 (Lifecycle-Konsequenz) sauber machen. + summary: `today`-Zeitzone für die `stale_after`-WARN (Validator §6.4) deterministisch festlegen — „heute in UTC abgeleitet" ist nicht hart definiert (Kalenderdatum des UTC-Zeitpunkts vs. lokaler Tag). Determinismus-Anspruch (AD-17h) vor Epic-3 (Lifecycle-Konsequenz) sauber machen. evidence: Retrospective F-06. - source_spec: `_bmad-output/implementation-artifacts/epic-1-retro-2026-08-15.md` (F-07) @@ -339,6 +339,28 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - source_spec: `schema/compiler.md` §3.2-Pkt.-1b (Story 3.2) summary: **Em-Dash-»—«-Varianten-Lücke der Normalisierung** — die Kollaps-Klasse `[-–_ ]` (En-Dash »–«, Bindestrich »-«, Unterstrich »_«, Leerzeichen) deckt den Em-Dash »—« **nicht** ab. Eine Schreibvariante mit Em-Dash (z. B. »wissen — relevanz«, aus dem Kontext einer externen Quelle eingelesen) fällt nicht unter den Kollaps und wird nicht zu einer identischen canonischen Form normalisiert — eine erkannte Synonym-/Determinismus-Lücke der Relevanzbestimmung (A0-18/A0-19). Wird nicht stillschweigend in §3.2 ergänzt, sondern als offene Determinismus-Frage an **Story 3.8** (Determinismus-Vertrag, AD-17h) übergeben; bis dahin wird ein nicht auflösbarer Em-Dash-Term **wie notiert** verwendet (Kollaps-normalisiert, kein stiller Ausschluss). - evidence: Story-3.2-Review-Umsetzung (2026-08-19) — §3.2-Pkt.-1b dokumentiert die Lücke explizit als »Konventionelle Determinismus-Lücke (aufgezeichnet, nicht still hinzugefügt)« und beruft sich auf diesen deferred-work-Eintrag als Handoff-Ziel. + evidence: Story-3.2-Review-Umsetzung (2026-08-19) — §3.2-Pkt.-1b dokumentiert die Lücke explizit als »Bekannte Determinismus-Lücke (aufgezeichnet, nicht still hinzugefügt)« und beruft sich auf diesen deferred-work-Eintrag als Handoff-Ziel. status: offen (Home: Story 3.8) +## Deferred from: code review of spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip (2026-08-19) + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **`§3.2`-Pkt.-2a: Wortgrenzen-/Frontmatter-Scope der Stufe-a-Match-Semantik ist offen** — die Grep/rg-Erhebung matcht ohne Wortgrenze (Substring: `alpha` trifft `alphabet`) und dateiweit inkl. YAML-Frontmatter (`sources[].resource`, `generated.by` — Provenanz-/Tool-Strings können nicht-thematische Concepts als Kandidaten markieren). Keine deterministischen Lücke im Ist-Sinn (das Verhalten ist reproduzierbar), aber die Match-Semantik ist nicht fixiert; zwei Producer-Readings sind möglich. Home: nächste Compiler-Instruktions-Revision, die §3.2 ohnehin berührt (oder Story 3.8, Determinismus-Vertrag-Abgleich). + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Edge-Case-Hunter + Verification-Gap-Layer): `schema/compiler.md:55` (Stufe-a-Form ohne `\b`/Frontmatter-Klausel) vs. §3.2-Intro („Concept-Bodies"). + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **`§3.2`-Pkt.-1b-ii: Kollaps-Reichweite bei aufeinanderfolgenden/führenden/trailenden Separatoren unbestimmt** — „jedes Vorkommen wird in einen einzelnen Bindestrich kollabiert" ist für Läufe (`a--b`), führende (`-x`) und trailende (`x-`) Separatoren nicht eindeutig (Kollaps auf genau ein `-` + Trim? oder 1:1-Ersatz?). Bis dahin ist die Normalisierung für solche Terme nicht vollständig pinbar (AD-17h-Nähe). Home: nächste Compiler-Instruktions-Revision (mit- oder in Story 3.8 zusammen mit der Em-Dash-Lücke, s. obiger Eintrag). + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Edge-Case-Hunter-Layer): `schema/compiler.md:51` (Pkt. 1b-ii). + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **Stufe-a-Treffer auf `index.md`-Pfade deterministisch aus der finalen Candidate-Liste entfernen** — Pkt. 2b definiert `index.md`-Treffer als Stufe-**b**-Trigger (gewurzelte Concept-Pfade sind die Stufe-b-Treffer), aber Pkt. 3b ordnet „Stufe-a-Treffer zuerst" ohne Fixierung, dass reine `index.md`-Stufe-a-Treffer *nicht* als Candidate (nicht-Concept-Pfad) in die finale Liste einfließen (Sandbox-T2-Ausgabe `index`+`alpha` illustriert den ungeklärten Fall; die Candidate-Liste ist per Definition auf Concept-Pfade beschränkt). Home: nächste Compiler-Instruktions-Revision, die §3.2 berührt. + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Blind-Hunter + Edge-Case-Hunter-Layer): `schema/compiler.md:55-56,60`; `_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh` T2-Kommentar. + status: offen + +- source_spec: `_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md` + summary: **Rev-2.5/2.6-Beleg-Klarigungen ohne Semantik-Auswirkung (Bündel)** — (a) Rev-2.5-Log-Zelle zitiert die `rg --exclude`-Form im aktiven Mechanismus-Teil ohne eigene Inline-Korrektur (Rev-2.6-Zelle erklärt sie nur — ein Producer, der nur Rev 2.5 liest, kopiert ein nicht-existentes Flag); (b) `sprint-status.yaml last_updated: 08-19-2026 07:10` liegt vor dem Story-3.2-Commit (09:16) — Zeitstempel dokumentiert nicht den Abschluss-Zeitpunkt (Story-3.1-Präzedenz: `last_updated` wird im Review-Loop-2-Commit ebenfalls nicht fortgeschrieben); (c) `compiler.md`-Revisionslog: Rev 2.6 steht über Rev 2.5 (chronologisch umgekehrt — Rev-2.6 wurde an der Einfüge-Stelle statt nach 2.5 angehängt); (d) Validator-Beleg „alle 7 `wiki/`-Dateien SUCCESS" als Aggregat ohne per-Datei-Liste (Spec-Verification Pkt. 4 verlangt „per-Datei-Verdikt als Ausführungs-Nachweis"; die Zählung 7 ist korrekt: 5 Root- + 2 Area-Concepts + log — re-executiert); (e) Rev-2.6-`git status`-Beleg listet `schema/canonical-terms.md` (neue Datei) und die `_bmad-output/`-Änderungen nicht, obwohl „`git status`" als Prüfgrundlage genannt wird; (f) Formel-4-Beleg: Ist-Zählung `38` ohne Baseline-`≡`-Partner (re-executiert: Ist = 38, korrekt — nur der Beleg-String ist unvollständig gegenüber der §5.6-Formel-4-Semantik „Ist ≡ Extraktion aus dem Baseline-Commit"). Home: nächste Log-/Nachweis-Runde (Story-3.3-Implementierungseintrag oder Story-3.2-Re-Review), keine Instruktions-Änderung nötig. + evidence: bmad-code-review Story 3.2 (2026-08-19, Loop 3, Blind-Hunter + Verification-Gap + Acceptance-Auditor-Layer): `wiki/log.md:4-5`, `schema/compiler.md:372-373`, `_bmad-output/implementation-artifacts/sprint-status.yaml:32`; re-executierte Formel-4-Zählung (38) und `ls wiki/` (7 `.md`-Dateien) bestätigen Korrektheit der Werte. + status: offen + diff --git a/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh b/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh index d33e2a6..8eb9310 100644 --- a/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh +++ b/_bmad-output/implementation-artifacts/sandbox-3-2/run-sandbox.sh @@ -1,9 +1,11 @@ #!/usr/bin/env bash # Story 3.2 — Sandbox-Tests der textuell-deterministischen Relevanzbestimmung (§3.2) # Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb32) -# Zweck: Membership-Pin + Zwei-Run-Identität + NO_MATCH (leere Candidate-Liste) -# + log.md-Kontaminations-Pin (der Term liegt AUCH in log.md — die Candidate-Liste -# bleibt trotzdem auf Concept-Pfade definiert, §3.2-Pkt.-2a). +# Zweck: Membership-Pin (T1) + Zwei-Run-Identität (T2) + NO_MATCH (T3) + +# log.md-Kontaminations-Pin (T1: der Term liegt AUCH in log.md — die +# Candidate-Liste bleibt trotzdem auf Concept-Pfade definiert, §3.2-Pkt.-2a) +# + LINK_FOLLOWING_ZYKLUS (T5) + TRAVERSAL_REACH_ONLY (T6) + +# TERM_ABLEITUNG_SYNONYM (T7); T1/T4 mit harten Assertions (Review-Patch P-1). set -u ROOT=$(mktemp -d /tmp/sb32-XXXXXX) SB="$ROOT/sb" @@ -74,6 +76,74 @@ terms() { # $1=Term; nutzt rg wenn vorhanden (native -g-Exklusion), sonst grep - # Normalisierung der Ausgabe: wiki/-Präfix + .md-Suffix strippen (§3.2-Pkt.-3a) normalize() { sed -e 's|^wiki/||' -e 's|\.md$||'; } +# ---------- Helfer: Stufe b/c (Erhebung) + Terminormalisierung (Review-Loop-2, D-2) ---------- +# Stufe b — index.md-Traversal (TRAVERSAL_REACH_ONLY, §3.2-Pkt.-2b): +# $1 = normalisierter Treffer-Name einer index.md (z. B. 'trafo/index' oder 'index'); +# gibt die darunter gewurzelten Concept-Pfade (normalisiert) aus — die Concept-Links +# der getroffenen index.md, file-relativ aufgelöst (§5.7-Pkt.-4). +traverse() { + local idx="wiki/$1.md" d tgt + d=$(dirname "$idx") + grep -oE '\]\([^)]+\.md\)' "$SB/$idx" 2>/dev/null | sed -e 's|^\](||' -e 's|)$||' | while read -r tgt; do + case "$tgt" in ./*) tgt=${tgt#./} ;; esac + printf '%s/%s\n' "$d" "$tgt" | sed -e 's|^wiki/||' -e 's|\.md$||' + done +} + +# Stufe c — Link-Following mit besuchter Menge (LINK_FOLLOWING_ZYKLUS, §3.2-Pkt.-2c): +# $@ = in Stufe a getroffene Concept-Pfade (normalisiert, z. B. 'sigma'); +# Concept-Links werden file-relativ verfolgt (§5.7-Pkt.-4); ein bereits besuchter +# Concept-Pfad wird nicht erneut besucht — Zyklen (A -> B -> A) enden, die +# Candidate-Liste bleibt endlich. Ausgabe: getroffene + erreichte Pfade, +# in Besuchsreihenfolge (Stufe a zuerst, dann Stufe c; §3.2-Pkt.-3b). +follow() { + local visited="$ROOT/visited.$$" seed f base tgt res + : > "$visited" + local queue=() + for seed in "$@"; do + printf '%s\n' "$seed" >> "$visited" + queue+=("$seed") + done + while [ "${#queue[@]}" -gt 0 ]; do + f="wiki/${queue[0]}.md" + queue=("${queue[@]:1}") + base=$(dirname "$f") + for tgt in $(grep -oE '\]\([^)]+\.md\)' "$SB/$f" 2>/dev/null | sed -e 's|^\](||' -e 's|)$||'); do + case "$tgt" in ./*) tgt=${tgt#./} ;; esac + res=$(printf '%s/%s\n' "$base" "$tgt" | sed -e 's|^wiki/||' -e 's|\.md$||') + grep -qx "$res" "$visited" && continue + printf '%s\n' "$res" >> "$visited" + queue+=("$res") + done + done + cat "$visited" +} + +# Terminormalisierung (§3.2-Pkt.-1b): (i) lowercasing; (ii) Binde-Varianten-Kollaps +# [-–_ ] -> - (jedes Vorkommen wird in einen einzelnen Bindestrich kollabiert). +# Normalisierte Form = die Form, die in der Registry gespeichert/verglichen wird. +norm_term() { printf '%s' "$1" | LC_ALL=C tr 'A-Z' 'a-z' | sed -e 's/[-–_ ]/-/g'; } + +# Registry-Lookup (§3.2-Pkt.-1b, canonical-terms.md-Format): +# $1 = normalisierter Term, $2 = Registry-Datei; gibt die canonische Form aus, +# oder — nicht auflösbar — den Term selbst (§3.2-Pkt.-1b: kein stiller Ausschluss). +lookup() { + awk -F'|' -v t="$1" ' + NR > 2 { + canon = $2; gsub(/^[ \t]+|[ \t]+$/, "", canon) + if (canon ~ /^—/) next + if (canon == t) { print canon; found = 1; exit } + vars = $3; gsub(/`/, " ", vars) + n = split(vars, a, ",") + for (i = 1; i <= n; i++) { + gsub(/^[ \t]+|[ \t]+$/, "", a[i]) + if (a[i] != "" && a[i] == t) { print canon; found = 1; exit } + } + } + END { if (!found) print t } + ' "$2" +} + # ===================================================================== runlabel() { echo; echo "########## $1 ##########"; } @@ -81,6 +151,13 @@ runlabel "T1: Membership-Pin — Term trifft Concept-Body UND log.md; Candidate- echo "--- Kandidaten-Erhebung: terms 'deterministische-relevanz-bestimmung' (Exklusions-Form) ---" terms 'deterministische-relevanz-bestimmung' | normalize echo "--- Erwartet: AUSSCHLIESSLICH 'alpha' (Concept-Pfad, ohne wiki/ + ohne .md) ---" +T1_OUT=$(terms 'deterministische-relevanz-bestimmung' | normalize) +if [ "$T1_OUT" = "alpha" ]; then + echo "RESULT: PASS (Candidate-Liste = [alpha]; log.md strukturell exkludiert, §3.2-Pkt.-2a)" +else + echo "FAIL: T1 — erwartet 'alpha', erhalten: '${T1_OUT}'" >&2 + exit 1 +fi echo "--- Kontaminations-Kontrolle: was OHNE Exklusion getroffen würde (rg-OHNE -g / grep-OHNE --exclude) ---" if command -v rg >/dev/null 2>&1; then rg -l 'deterministische-relevanz-bestimmung' wiki/ | normalize @@ -97,7 +174,7 @@ FIRST2=$(terms 'alpha' | normalize) SECOND2=$(terms 'alpha' | normalize) echo "Lauf 1 (Term deterministische-relevanz-bestimmung): $FIRST1" echo "Lauf 2 (Term deterministische-relevanz-bestimmung): $SECOND1" -echo "Lauf 1 (Term alpha): $FIRST2 # 'index' ist der legitime Stufe-b-Traversal-Treffer (Bundleroot verlinkt alpha.md), kein Kontaminations-Fehler" +echo "Lauf 1 (Term alpha): $FIRST2 # 'index' ist ein Stufe-a-Treffer auf wiki/index.md — Stufe b (TRAVERSAL_REACH_ONLY, §3.2-Pkt.-2b) löst die darunter gewurzelten Concept-Pfade als Candidate aus (index.md selbst ist KEIN Concept-Kandidat); kein Kontaminations-Fehler" echo "Lauf 2 (Term alpha): $SECOND2 # identische Ausgabe (Zwei-Run-Identität, AD-17h)" if [ "$FIRST1" = "$SECOND1" ] && [ "$FIRST2" = "$SECOND2" ]; then echo "RESULT: IDENTISCH (gleicher Git-State + gleiches Eingabeset -> identische Candidate-Liste, AD-17h)" @@ -133,10 +210,144 @@ generated: Gamma teilt den Term deterministische-relevanz-bestimmung (Stelle S-1). EOF git add -A; git commit -qm "Zuwachs gamma (teilt den Term)" -echo "--- Kandidaten-Erhebung (Term in alpha + gamma): ---" -terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort -echo "--- Erwartet: alpha, gamma (beide Concept-Pfade, lexikografisch; log ABGESCHNITTEN) ---" +echo "--- Kandidaten-Erhebung (Term in alpha + gamma; §3.2-Pkt.-3b: innerhalb jeder Stufe rein lexikografisch, LC_ALL=C): ---" +terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort | paste -sd, - +echo "--- Erwartet: alpha,gamma (beide Concept-Pfade, lexikografisch; log ABGESCHNITTEN) ---" +T4_OUT=$(terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort | paste -sd, -) +if [ "$T4_OUT" = "alpha,gamma" ]; then + echo "RESULT: PASS (Vereinigung beider Concept-Pfade, lexikografisch; log.md exkludiert)" +else + echo "FAIL: T4 — erwartet 'alpha,gamma', erhalten: '${T4_OUT}'" >&2 + exit 1 +fi + +# ===================================================================== +# T5-T7 (Review-Loop-2, D-2): Zyklen-Endlichkeit, Traversal-Only, Synonym-Auflösung +# ===================================================================== + +# ---------- T5: LINK_FOLLOWING_ZYKLUS — A -> B -> A endet endlich (besuchte Menge) ---------- +runlabel "T5: LINK_FOLLOWING_ZYKLUS — Zyklus alpha <-> omega endet endlich; Candidate-Liste endlich (§3.2-Pkt.-2c/3b)" +cat > wiki/omega.md <<'EOF' +--- +type: concept +sources: + - resource: raw/omega-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Omega verweist zirkular auf Alpha: [Alpha](alpha.md). +EOF +# Backlink: alpha -> omega (erzeugt den echten A->B->A-Zyklus, der die besuchte Menge übt): +printf '\nOmega-Verweis: [Omega](omega.md).\n' >> wiki/alpha.md +git add -A; git commit -qm "Zuwachs omega (Link-Zyklus alpha <-> omega)" +echo "--- Stufe a (Term zirkular): ---" +STAGE_A=$(terms 'zirkular' | normalize | LC_ALL=C sort | paste -sd, -) +echo "$STAGE_A" +echo "--- Stufe c (Follow aus Stufe a; ZYKLUS omega -> alpha -> omega ... MUSS enden): ---" +STAGE_C=$(follow omega) +echo "$STAGE_C" +# Deduplication über die besuchte Menge (sort -u: endliche, doppelungsfreie Menge — +# die Stufe-Ordnung a→c ist bereits in STAGE_A/STAGE_C sichtbar; hier wird die Endlichkeit geprüft): +T5_EXPECT="alpha,omega" +T5_LIST=$(printf '%s\n%s\n' "$STAGE_A" "$STAGE_C" | grep -v '^$' | LC_ALL=C sort -u | paste -sd, -) +if [ "$T5_LIST" = "$T5_EXPECT" ]; then + echo "RESULT: PASS (endlich, dedupliziert: omega, alpha — Zyklus endete; jeder Pfad genau einmal)" +else + echo "FAIL: T5 — erwartet '$T5_EXPECT', erhalten: '$T5_LIST'" >&2 + exit 1 +fi + +# ---------- T6: TRAVERSAL_REACH_ONLY — Term nur in index.md -> gewurzelte Concept-Pfade ---------- +runlabel "T6: TRAVERSAL_REACH_ONLY — Term 'trafo-gebiet' trifft NUR wiki/trafo/index.md -> gewurzelte Concept-Pfade sind die Treffer (index.md selbst kein Concept-Kandidat, §3.2-Pkt.-2b)" +mkdir -p wiki/trafo +cat > wiki/trafo/index.md <<'EOF' +# Trafo-Gebiet-Index +Dieses trafo-gebiet wird hier indexiert. +- [Delta](delta.md) +- [Epsilon](epsilon.md) +EOF +cat > wiki/trafo/delta.md <<'EOF' +--- +type: concept +sources: + - resource: raw/delta-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Delta-Body (trägt den Index-Term NICHT — nur der Index trägt ihn). +EOF +cat > wiki/trafo/epsilon.md <<'EOF' +--- +type: concept +sources: + - resource: raw/epsilon-v1.md + id: s1 +generated: + by: wow-compiler/0.1.0 + at: 2026-08-16T09:00:00Z +--- +Epsilon-Body (trägt den Index-Term NICHT — nur der Index trägt ihn). +EOF +git add -A; git commit -qm "Zuwachs trafo/Area (Index trägt den Term, Bodies nicht)" +echo "--- Stufe a (Term trafo-gebiet; nur index.md trifft — der Traversal-Trigger): ---" +STAGE_A=$(terms 'trafo-gebiet' | normalize) +echo "$STAGE_A" +echo "--- Stufe b (Traversal: gewurzelte Concept-Pfade der getroffenen index.md): ---" +STAGE_B=$(traverse 'trafo/index') +echo "$STAGE_B" +# Kandidaten = gewurzelte Concept-Pfade (lexikografisch; index.md selbst ist KEIN Concept-Kandidat): +T6_OUT=$(printf '%s\n' "$STAGE_B" | grep -v '^$' | LC_ALL=C sort | paste -sd, -) +if [ "$T6_OUT" = "trafo/delta,trafo/epsilon" ]; then + echo "RESULT: PASS (Candidate-Liste = gewurzelte Concept-Pfade; Index-Body-Trigger, kein Kontaminations-Fehler)" +else + echo "FAIL: T6 — erwartet 'trafo/delta,trafo/epsilon', erhalten: '$T6_OUT'" >&2 + exit 1 +fi + +# ---------- T7: TERM_ABLEITUNG_SYNONYM — Schreibvariante -> canonische Form -> Kandidaten ---------- +runlabel "T7: TERM_ABLEITUNG_SYNONYM — gezogene Schreibvariante wird über canonical-terms.md auf die canonische Form aufgelöst (Lookup auf normalisierter Form, §3.2-Pkt.-1b)" +mkdir -p "$ROOT/registry" +cat > "$ROOT/registry/canonical-terms.md" <<'EOF' +# Sandbox-Registry (Test-Doppel des canonical-terms-Formats; append-only, ein Eintrag = Canon + Varianten; +# D-5-Invariante: Canon- UND Varianten-Spalte tragen ausschliesslich NORMALISIERTE Formen) + +| canonische Form | erlaubte Schreibvarianten | Semantik | +|---|---|---| +| quanten-protocol | `quantenprotocol` | Sandbox-Semantik: Test-Synonymgruppe | +EOF +# Invariante-Check (D-5): keine normalisierte Form in beiden Spalten oder in zwei Einträgen: +# hier: 'quanten-protocol' nur Canon-Spalte, 'quantenprotocol' nur Varianten-Spalte — eindeutig. +# (Registry liegt ausserhalb des Sandbox-Git-Roots — sie modelliert den Git-State-Anteil des Resolvers; +# der Sandbox-Repo-Commit trägt sie deshalb nicht, hier nur Notiz statt Commit-Noise:) +echo "Registry (ausserhalb des Sandbox-Roots, modelliert den Resolver-Git-State): $ROOT/registry/canonical-terms.md" +echo "--- Gezogene Schreibvarianten (Roh-Notat): 'Quanten Protocol' + 'QuantenProtocol' ---" +RAW_A='Quanten Protocol' +RAW_B='QuantenProtocol' +NORM_A=$(norm_term "$RAW_A") +NORM_B=$(norm_term "$RAW_B") +echo "Normalisierung (§3.2-Pkt.-1b): '$RAW_A' -> '$NORM_A'; '$RAW_B' -> '$NORM_B'" +CANON_A=$(lookup "$NORM_A" "$ROOT/registry/canonical-terms.md") +CANON_B=$(lookup "$NORM_B" "$ROOT/registry/canonical-terms.md") +echo "Lookup: '$NORM_A' -> '$CANON_A'; '$NORM_B' -> '$CANON_B'" +if [ "$CANON_A" = "quanten-protocol" ] && [ "$CANON_B" = "quanten-protocol" ]; then + echo "RESULT: PASS (beide Varianten -> canonische Form 'quanten-protocol'; Auflösung auf normalisierter Form)" +else + echo "FAIL: T7 — erwartet 'quanten-protocol' für beide, erhalten: '$CANON_A' / '$CANON_B'" >&2 + exit 1 +fi +# Nicht aufgelöster Term wird wie notiert (Kollaps-normalisiert) verwendet — kein stiller Ausschluss: +CANON_MISS=$(lookup 'nicht-in-registry' "$ROOT/registry/canonical-terms.md") +if [ "$CANON_MISS" = 'nicht-in-registry' ]; then + echo "PASS (Negativ-Fall: 'nicht-in-registry' -> wie notiert, kein stiller Ausschluss)" +else + echo "FAIL: T7-Negativ — erwartet 'nicht-in-registry', erhalten: '$CANON_MISS'" >&2 + exit 1 +fi echo -echo "===== Sandbox abgeschlossen (alle 4 Tests) =====" +echo "===== Sandbox abgeschlossen (alle 7 Tests) =====" echo "Sandbox-Root: $ROOT" diff --git a/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md b/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md index 0de253e..a46a4d5 100644 --- a/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md +++ b/_bmad-output/implementation-artifacts/spec-3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip.md @@ -2,8 +2,8 @@ title: 'Relevanzbestimmung textual-deterministisch umsetzen (grep/ripgrep + Markdown-Traversal + Link-Following) (Story 3.2)' type: 'feature' created: '2026-08-19' -status: 'in-review' -review_loop_iteration: 2 +status: 'done' +review_loop_iteration: 3 baseline_commit: e3e7ec346df3e6190644d2c94e5cc7c42e6ed239 context: - _bmad-output/implementation-artifacts/epic-3-context.md @@ -71,13 +71,44 @@ context: - Given ein Ergebnis der Relevanzbestimmung, when es weiterverarbeitet wird, then ist es als nachvollziehbare Candidate-Liste (relative OKF Concept-Pfade ohne `.md`) verfügbar (AC-3). - Given die Instruktion, when geprüft, then bleibt `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), keine neue §7-Klasse, kein Standalone (D-3) — Validator läuft auf dem Ist-Bundle SUCCESS. +### Review Findings + +bmad-code-review Loop 3 (2026-08-19, 4 Layer: blind-hunter / edge-case-hunter / verification-gap / acceptance-auditor; Diff `e3e7ec3 → 3aa484b`, branch `story-3-2`). Triage: 5 `decision-needed`, 2 `patch`, 4 `defer` (→ `deferred-work.md`), 39 dismissed als Noise (u. a. doppelte Layer-Quellen pro Finding; `last_updated`-Zeitstempel = Story-3.1-Loop-2-Präzedenz; `deferred-work.md`-Bestands-Eintrag-in-Platz-Edit = vom frozen-Task-3-Defer-Handoff selbst befohlen; Em-Dash-Lücke bereits korrekt defer an Story 3.8; `sprint-status`-Key-Kürzung = Projekt-Schema; Sandbox-/tmp-Reste + `git add -A;`-Semikolon = Story-3.1-Sandbox-Muster-Präzedenz; `F17`-Home-„mit Story 3.2" = vorbestehend (Story-3.1-Review); `rg`-Verfügbarkeit im Audit-Environment = Audit-Beschränkung, keine Story-Lücke; `§5.6-Scan-Scope-Konvention`-Anker ist real (`compiler.md:157`); Formel-4-Ist-Zählung `38` re-executiert = `38`; „Validator 7 wiki/-Dateien" = korrekt, `ls wiki/` liefert 6 Einträge = 7 `.md`-Dateien (Area-Verz. zählt nicht); `canonical-terms.md`-Zwei-`[]`-Lesarten sind durch die Eröffnungs-Zeile + den Hinweis explizit aufgelöst; `A0-19`-Ergänzung in §8 = spec Change Log B5 als KEEP verankert). + +- [x] [Review][Decision] Status-Flip `backlog → done` gegen gefrorene Always-Klausel (`→ in-progress`) — keine dokumentierte Renegotiation [sprint-status.yaml:55] — **Option 1 umgesetzt:** `done` bestätigt; Statuskette `in-progress → done` als eigener dokumentierter Schritt in `wiki/log.md` (neue oberste Bullet, Loop-3/Rev-2.7-Zeile) + - Befund: Der gefrorene `Boundaries & Constraints`-Abschnitt (Always) verlangt `sprint-status.yaml`-Key → **`in-progress`**; der Commit setzt direkt **`done`**. Die nicht-gefrorene Spec-Tail (`Manual checks`) sagt zwar „`backlog → in-progress → done`", aber (a) der Zwischenschritt `in-progress` ist in keinem `wiki/log.md`-Eintrag als eigener dokumentierter Statuswechsel belegt (Rev-2.5-Log zitiert `backlog → in-progress`, Rev-2.6 zitiert keinen `done`-Flip), (b) der Review-Workflow-Skript-Sync (bmad-build `sprint status` + Story 3.1-Präzedenz: Review-Abschluss setzt `done` im selben Loop) legt nahe, dass `done` der intendierte Endzustand ist. Entweder wurde die Always-Klausel stillschweigend superseded (nicht dokumentiert) oder der Key ist falsch. + - Optionen: **1 (empfohlen)** — `done` bestätigt (Sprint-Sync-Konvention: Review-Loop-Abschluss setzt `done`); in den Rev-2.6-Log-Zeile den Statusflip `in-progress → done` als dokumentierten Schritt ergänzen (Lückenschluss der Statuskette, keine Status-Änderung). **2** — Key auf `in-progress` zurücknehmen; Story bleibt `in-progress` bis ein späterer Run den `done`-Flip belegt. +- [x] [Review][Decision] Sandbox deckt I/O-Matrix-Szenarien `LINK_FOLLOWING_ZYKLUS`, `TRAVERSAL_REACH_ONLY`, `TERM_ABLEITUNG_SYNONYM` nicht ab — Task-4-Checkbox `[x]` überdeklariert [run-sandbox.sh:1-142] — **Option 1 umgesetzt:** T5/T6/T7 ergänzt, T2-Kommentar korrigiert, re-executiert (alle 7 Tests PASS, exit 0); Beleg in `wiki/log.md` (Loop-3-Zeile) + - Befund: `run-sandbox.sh` implementiert T1 (Membership), T2 (Zwei-Run-Identität), T3 (NO_MATCH), T4 (Vereinigung). `LINK_FOLLOWING_ZYKLUS` hat **keinen** Test (der Sandbox-Baum enthält keine Concept-Links — die besuchte Menge wird nie geübt); `TRAVERSAL_REACH_ONLY` ist nur Nebenprodukt von T2 (Term `alpha` trifft `index.md`; als Kommentar, nicht als gepinntes Szenario — und die gepinnte Ausgabe `index`+`alpha` widerspricht der §3.2-3b-Ordnungs-Semantik, weil Stufe-b-Treffer *nach* Stufe-a-Treffern positioniert sind und `index` kein Concept-Pfad ist); `TERM_ABLEITUNG_SYNONYM` ist ungetestet (leere Registry → der Fallback „wie notiert" ist der Standardfall, aber die Kanonisierung selbst wird nie geübt). Die Execution-Task-4-Checkbox `[x]` und Spec-Verification Pkt. 3 deklariert die volle I/O-Matrix-Abdeckung. + - Optionen: **1 (empfohlen)** — Sandbox um T5 (LINK_FOLLOWING_ZYKLUS: A→B→A-Links, erwartete endliche, doppelungsfreie Liste), T6 (TRAVERSAL_REACH_ONLY: Term nur in `index.md`, erwartete gewurzelte Concept-Pfade) und T7 (TERM_ABLEITUNG_SYNONYM: Registry-Eintrag mit Variante → Auflösung auf canonische Form) erweitern; T2-Kommentar zu `index` korrigieren; dann re-executieren und den Beleg nachführen. **2** — nur die fehlenden Szenarien als `deferred-work.md`-Eintrag an die nächste Compiler-Instruktions-Revision (oder Story 3.8, die den Determinismus-Vertrag absichert) übergeben; Task-4-Checkbox-Notiz ehrlich nachführen. **3** — T6/T7 als Defer, T5 (besuchte Menge) als Patch jetzt (weil §3.2-2c die Endlichkeits-Garantie trägt). +- [x] [Review][Decision] `wiki/log.md`-Selbsttest-Beleg (b) beschreibt einen Sandbox-Baum, der nicht dem committierten `run-sandbox.sh` entspricht (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Verifikations-Falle (exakt B1 aus Loop 2) [wiki/log.md:5] — **Option 1 umgesetzt:** Beleg (b) gegen die echte Sandbox-Ausgabe neu belegt (neue Log-Zeile, append-only); Rev-2.5-Zeile bleibt historisch + - Befund: Der Rev-2.5-Log-Eintrag (b) behauptet: Term `quanten-protocol` auf `wiki/alpha.md`, `wiki/sub/beta.md`, `log.md`; Candidate-Liste `alpha`, `sub/beta`; Zwei-Run-Identität via SHA-256 `159092bb…`. Das committierte, re-executierbare `run-sandbox.sh` trägt durchgängig den Term `deterministische-relevanz-bestimmung`, **keinen** `sub/`-Baum (Beta ist root-level `beta.md`) und **keine** SHA-256-Berechnung. Der „re-executierte" Nachweis ist damit nicht aus dem verankerten Artefakt reproduzierbar — dieselbe Stale-Evidenz-Falle, die Story 3.2 (Loop-2-B1) gerade schließen sollte. + - Optionen: **1 (empfohlen)** — Log-Beleg (b) gegen die echte `run-sandbox.sh`-Ausgabe re-executiert neu belegen (Term/Pfade/Ergebnisse an den Script-Ist-Baum angleichen); historischer Rev-2.5-Zeile eine Korrektur-Fußnote als neue Log-Zeile anhängen (append-only-Vertrag §5 erlaubt neue Zeilen, nicht Edit — die Rev-2.5-Zelle bleibt historisch, die neue Zeile korrigiert). **2** — die Sandbox auf den log.md-belegten Baum (Term `quanten-protocol`, `sub/`-Area) ändern und neu ausführen (weicht vom bereits in Rev-2.6 referenzierten Script ab). +- [x] [Review][Decision] `§3.2`-Pkt.-3b-Ordnung: „Reihenfolge des ziehenden Terms" ist undefiniert für Mehrfach-Terme — AD-17h-Zwei-Run-Identität hängt an einer nicht fixierten Term-Ordnung [schema/compiler.md:60] — **Option 1 umgesetzt:** Pkt. 3b auf reine Lexikografie (LC_ALL=C) gehoben; Term-Auftritt nur für Verarbeitungsreihenfolge (Rev-2.7) + - Befund: Pkt. 3b ordnet Stufe-a-Treffer „in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break bei identischem Ort", während Pkt. 1c mehrere Terme je Einheit erlaubt. Die Reihenfolge der **Terme selbst** (Auftreten in der Evidenz? lexikografisch? §2-Interpretations-Reihenfolge?) ist nirgends festgelegt — zwei rechtmäßige Term-Ordnungen erzeugen zwei rechtmäßige, aber unterschiedliche Listen. Zusätzlich ist die Formulierung intern doppelt definiert („Reihenfolge des ziehenden Terms" vs. „innerhalb jeder Stufe lexikografisch aufsteigend"). + - Optionen: **1 (empfohlen)** — Pkt. 3b auf eine eindeutige Regel heben: Stufe-a-Treffer **rein lexikografisch (LC_ALL=C)**, Term-Auftritt dient nur der Verarbeitungs-/Interpretations-Reihenfolge, nicht der Listen-Ordnung (einfachste deterministische Form, kompatibel mit der „lexikografisch als Tie-Break"-Klausel). **2** — Term-Ordnung = lexikografisch über die gezogenen Terme, Stufe-a-Treffer in Term-Ordnung, dann lexikografisch (bewahrt die „Zuwachs-Sicht"-Semantik, ist etwas komplexer zu implementieren und zu beweisen). +- [x] [Review][Decision] `canonical-terms.md`-Registry-Lookup-Semantik ist unvollständig — Doppelbelegung von Varianten ist nicht deterministisch auflösbar, Lookup-Reihenfolge (vor/nach Kollaps, Groß/Klein) ist offen [schema/canonical-terms.md:25-35] — **Option 1 umgesetzt:** Lookup-Reihenfolge fixiert (normalisierte Form) + Eindeutigkeits-Invariante + Konflikt-Verfahren (Rev-2.7) + - Befund: (a) Zwei Einträge können dieselbe Schreibvariante mit unterschiedlichen canonischen Formen tragen — der Registry-Format-Abschnitt definiert keine Eindeutigkeits-Regel (kein „Variante in genau einem Eintrag", kein Konflikt-Verfahren; der „Append-only"-Regel-Abschnitt behandelt nur Umbenennungen). (b) Die Normalisierungs-Reihenfolge ist offen: lowercasing + `[-–_ ]`-Kollaps **vor** dem Registry-Lookup? Lookup auf der rohen Variante? Die Varianten-Spalte ist als „bündel-findend per `-`-Kollaps, lowercased" beschrieben, aber die verbindliche Lookup-Operation steht nicht da. Genau das ist der Kern des deterministischen Resolvers (AD-17h). + - Optionen: **1 (empfohlen)** — in `canonical-terms.md` Registry-Format ergänzen: (i) Lookup-Reihenfolge fixiert (lowercase → Kollaps → Lookup auf der normalisierten Form; die Varianten-Spalte trägt ebenfalls normalisierte Formen), (ii) Eindeutigkeits-Invariante „eine Variante in genau einem Eintrag" + Konflikt-Fall (Append nicht erlaubt; `deferred-work.md`-Handoff / Ask-First analog zur bestehenden Umbenennungs-Regel). **2** — nur (ii) ergänzen; (i) als `defer` an die nächste Registry-Befüllung (erstes Entry). +- [x] [Review][Patch] `run-sandbox.sh`: T1 (Membership-Pin) und T4 (Vereinigung) werden nur ausgegeben, nie als Pass/Fail geprüft — das gepinnte „exakte Candidate-Liste"-Verhalten (Task 4) wird nicht erzwungen [run-sandbox.sh:80-113, 136-141] — **umgesetzt:** T1/T4 tragen harte Asssertionen (`exit 1` bei Abweichung) + - Befund: T1 gibt die Candidate-Liste und „Erwartet: AUSSCHLIESSLICH 'alpha'" aus, vergleicht aber nie; T4 gibt `alpha, gamma` (gesortet) aus, prüft aber nicht gegen die Erwartung. Ein Regressions-Fall (z. B. `log` oder `index` rutscht in die Liste, oder `gamma` fehlt) beendet das Skript mit Exit 0 und „Sandbox abgeschlossen (alle 4 Tests)". T3 (NO_MATCH) und T2 (Zwei-Run-Identität) haben dagegen echte `if`-Checks mit `exit 1`. + - Fix: T1 `out=$(terms 'deterministische-relevanz-bestimmung' | normalize); [ "$out" = "alpha" ] || { echo "FAIL: …" >&2; exit 1; }`; T4 `out=$(terms '…' | normalize | LC_ALL=C sort | paste -sd, -); [ "$out" = "alpha,gamma" ] || { echo "FAIL: …" >&2; exit 1; }`. +- [x] [Review][Patch] Typos/Fehlzeichnungen im committeten normativen Text — `Determinsmus` (×4+ in `compiler.md`/`log.md`/`deferred-work.md`/Spec), `§3.2-beankert` (soll „§3.2-angeankert" sein), `Membrum` (soll „Mitglied" sein), `Konventionelle Determinismus-Lücke` (soll „Bekannte Determinismus-Lücke" sein — verweist auf `compiler.md:53`, wo es „Bekannte" heißt) [schema/compiler.md:351,373; wiki/log.md:5; deferred-work.md:342; spec:80,93,106] — **umgesetzt** (reiner Text-Patch; `raw/`-Source-Typo und der präexistierende `außschließlich`-Typo im 3.1-Log bleiben unberührt — out-of-scope) + - Befund: Keine AC-Auswirkung, aber der Text ist die committete Instruktion/der committete Nachweis. `Determinsmus` steht auch in der Source `raw/epics/` (3×), die Instruktion sollte den Begriff aber konsistent korrekt verwenden, wie es der Rest des Dokuments tut. `Resovierung` (spec:80,106) ist zusätzlich zu `Resolution`/`Auflösung` zu korrigieren. + - Fix: orthografische Korrektur in den genannten Zeilen (reiner Text-Patch, keine Semantik-Änderung). +- [x] [Review][Defer] `§3.2`-Pkt.-2a: Wortgrenzen-/Frontmatter-Scope der Stufe-a-Match-Semantik ist offen (Substring-Match ohne `\b`, Frontmatter-Treffer zählen mit) [schema/compiler.md:55] — deferred, pre-existing +- [x] [Review][Defer] `§3.2`-Pkt.-1b-ii: Kollaps bei aufeinanderfolgenden/führenden/trailenden Separatoren ist unbestimmt (`a--b`, `-x`) [schema/compiler.md:51] — deferred, pre-existing +- [x] [Review][Defer] Stufe-a-Treffer auf `index.md`-Pfade (z. B. T2 `index`) werden nicht deterministisch aus der finalen Candidate-Liste entfernt (Stufe-b-Re-Routing implizit, nicht fixiert) [schema/compiler.md:55-56] — deferred, pre-existing +- [x] [Review][Defer] Rev-2.5-/Rev-2.6-Log-Zeile und compiler.md-Revisionslog: Nachweis-Klärigungen ohne Semantik-Auswirkung — (a) Rev-2.5-Log-Zelle zitiert die (nun historisch korrigierte) `rg --exclude`-Form im aktiven Mechanismus-Teil, ohne eigene Inline-Korrektur (Rev-2.6-Zelle erklärt es nur), (b) `last_updated: 08-19-2026 07:10` liegt vor dem Commit-Zeitpunkt (09:16), (c) Rev-2.6 steht im Revisionslog **über** Rev-2.5 (chronologisch umgekehrt), (d) Validator-„7/7 SUCCESS" als Aggregat ohne per-Datei-Liste, (e) Rev-2.6-`git status`-Beleg listet `canonical-terms.md`/`_bmad-output/`-Änderungen nicht (nämte „`git status`" als Prüfgrundlage), (f) Formel-4-Ist-Zählung `38` ohne Baseline-`≡`-Partner (re-executiert: Ist = 38, korrekt; nur der Beleg-String ist unvollständig) [wiki/log.md:4-5; schema/compiler.md:372-373; sprint-status.yaml:32] — deferred, pre-existing + ## Spec Change Log +- **2026-08-19 (bmad-code-review Loop 3 — Review-Findings umgesetzt; 5 Decisions (alle Option 1) + 2 Patches + 4 Defers):** `schema/compiler.md` → **Revision 2.7**: (1) **D-4** — §3.2-Pkt.-3b-Ordnung auf **reine Lexikografie (LC_ALL=C)** gehoben; die Term-Verarbeitungsreihenfolge bestimmt nur die Interpretation/Erhebung, **nicht** die Listen-Ordnung (dieselbe Treffermenge → identische Liste, AD-17h/A0-19); (2) **D-5** — `schema/canonical-terms.md`: **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); (3) **D-1** — Statuskette `in-progress → done` als eigener dokumentierter Schritt in `wiki/log.md` (Sprint-Sync-Konvention; Story-3.1-Präzedenz); Key bleibt `done`; (4) **D-2 + P-1** — `run-sandbox.sh` um **T5** `LINK_FOLLOWING_ZYKLUS` (A↔B-Zyklus; besuchte Menge → endlich/doppelungsfrei), **T6** `TRAVERSAL_REACH_ONLY` (Term nur in Area-`index.md` → gewurzelte Concept-Pfade), **T7** `TERM_ABLEITUNG_SYNONYM` (Registry-Test-Doppel; beide Lookup-Pfade + Negativ-Fall) erweitert; T1/T4 mit harten Asssertionen; T2-Kommentar korrigiert; re-executiert: **alle 7 Tests PASS, exit 0**; (5) **D-3** — `wiki/log.md`-Selbsttest-Beleg (b) gegen die echte `run-sandbox.sh`-Ausgabe neu belegt (neue Log-Zeile, append-only; Rev-2.5-Zeile historisch unverändert); (6) **P-2** — Typos korrigiert (`Determinsmus`→`Determinismus`, `beankert`→`angeankert`, `Membrum`→`Mitglied`, `Konventionelle`→`Bekannte`, `Resovierung`→`Auflösung`; `raw/`-Source und der präexistierende 3.1-Log-Typo bleiben unberührt). **4 Defers** (Wortgrenzen-/Frontmatter-Scope; Separator-Kollaps-Reichweite; Stufe-a-`index.md`-Treffer aus finaler Liste; Rev-2.5/2.6-Beleg-Klärigungs-Bündel) in `deferred-work.md` (append-only, Sektion „Deferred from: code review of spec-3-2-… (2026-08-19)"). **Keine AC-Änderung, kein frozen-Schnittstellen-Change, kein Validator-/Vertrags-/`raw/`-Change (AD-3), keine neue §7-Klasse, kein Standalone (D-3).** Frontmatter: `status: 'done'`, `review_loop_iteration: 3`. `sprint-status.yaml`: Key `3-2-…` bleibt `done`, `last_updated` → 08-19-2026. - **2026-08-19 (bmad-code-review Loop 2 — bad_spec-Loopback):** 5 bad_spec-Findings ausgelöst, Code-Änderungen auf Baseline revertiert, nicht-gefrorene Spec-Tail-Sektionen geamendet: - **B1/VG-1 `log.md`-Kontamination:** `rg -l '' wiki/` ohne `--exclude=log.md` → `log.md` wird ab dem Moment selbst „Kandidat", in dem ein Log-Eintrag den Term zitiert; der Determinismus-Selbsttest verankert das A0-18-1-File-Find in einem Commit, das selbst `A0-18` enthält (Stale-Evidenz; Reproduzierbarkeits-Claim widerlegt sich selbst). Bekannt-bös: permanente Drift + falsches Verification-Expect. - **B2 Reihenfolge:** `rg -l`-Ausgabe-Reihenfolge (FS-Traversal) nicht auf Zuwachs-Sicht-Ordnung abbildbar; Stufe-b/c ohne definierte Position. Bekannt-bös: AC-2-Zwei-Run-Identität nur bei undokumentiertem `rg`-Tie-Break. - **B3 Resolver nicht enumeriert:** „eine canonische Form je Semantik" ohne committete Registry → Determinismus nicht pinbar. Bekannt-bös: gleiche Liste nur, wenn Resolver Teil des Git-States (nicht spezifiziert). - - **B4 Em/En-Dash:** Klassenliteral `[-–_ ]` deckt nur En-`–`, nicht Em-`—`; Kollaps-Reichweite inkonsistent. Bekannt-bös: Em-Varianten fallen nicht unter den Kollaps (Synonymlücke). **Gewählter Weg:** `-`-Kollaps bleibt; explizite `—`-Resovierung wird als offene Determinismus-Lücke in Step-4-Defer an Story 3.8 übergeben (nicht stillschweigend hinzugefügt). + - **B4 Em/En-Dash:** Klassenliteral `[-–_ ]` deckt nur En-`–`, nicht Em-`—`; Kollaps-Reichweite inkonsistent. Bekannt-bös: Em-Varianten fallen nicht unter den Kollaps (Synonymlücke). **Gewählter Weg:** `-`-Kollaps bleibt; explizite `—`-Auflösung wird als offene Determinismus-Lücke in Step-4-Defer an Story 3.8 übergeben (nicht stillschweigend hinzugefügt). - **B5 §8-A0-19-Claim:** Spec sagte „A0-19 steht bereits in §8", war im Ist-Baum nicht kommutiert; Implementierung ergänzte A0-19 (korrekt). Spec korrigiert, A0-19-Ergänzung als KEEP verankert (fehlleiten bei Re-Baseline verhindern). - **B6 NO_MATCH / §5.9-P2-Block-Scope:** werkt zusammen → zusammengefasst; in B1 und Task-Patch-Membership-Pin überführt. - **B7 §5.9-P2-Block-Zeiger:** nicht mehr nötig — die fixierte Stufe (a) `--exclude=log.md` macht den Zeiger redundant (kein log.md-Kandidat mehr); **verworfen** (keine unnötige Pflicht). @@ -90,7 +121,7 @@ context: **Term-Ziehverfahren — was deterministisch heißt:** Die Ziehung ist deterministisch, weil sie allein von der committeten Evidenz-Datei abhängt: (1) bedeutungstragende Fachbegriffe = Token-Folgen mit fachlicher Signifikanz, aus der §2-Interpretation benannt (nicht freie LLM-Auswahl); (2) Normalisierung über einen canonischen Schreibweisen-Resolver (lowercasing; `[-–_ ]`→`-`; eine canonische Form je Semantik); (3) mehrere Terme je Einheit erlaubt — Candidate-Liste = Vereinigung der Treffer über alle Terme, bereinigt über besuchte Menge; (4) kein stiller Ausschluss: nicht auflösbare Varianten werden wie notiert verwendet. Die Erhebung *mit festem Term* war schon in Rev-2.4.2 deterministisch — Story 3.2 macht zusätzlich die **Term-*Auswahl*** deterministisch (exakt der bisherige Vorbehalt). -**Determinismus-Referenz:** AD-17h und A0-19 sind bereits Normreferenzen in §8 Revision 2.4 (Story 3.1); Story 3.2 ergänzt **AD-13**, **A0-18** und **PRD OQ-3** (Architekturfrage „Compilation Scope"). A0-19 war im Ist-§8 (Baseline `e3e7ec3`) zwar nicht gelistet — die Implementierung fügt es als Determinismus-Referenz der Relevanzbestimmung hinzu (kein Verstoß, Design-KEEP: A0-19-Anker wird in §8 **und** §3.2 gesetzt; die frühere Spec-Formulierung „steht bereits" war falsch und ist hiermit korrigiert). `wiki/knowledge-kompilation-inkrementell.md:48` referenziert A0-18/AD-13 bereits; **zur Erhebung wird `wiki/log.md` ausgeschlossen** (`--exclude=log.md`, §5.6-Muster) — sonst wäre der eigene `log.md`-Eintrag bei jedem Term, den er zitiert, selbst „Kandidat" (A0-18/FR-12-Fall; die Candidate-Liste ist auf Concept-Pfade definiert, §5.9 Pkt. 5 behandelt `log.md` gesondert als erlaubtes Membrum). +**Determinismus-Referenz:** AD-17h und A0-19 sind bereits Normreferenzen in §8 Revision 2.4 (Story 3.1); Story 3.2 ergänzt **AD-13**, **A0-18** und **PRD OQ-3** (Architekturfrage „Compilation Scope"). A0-19 war im Ist-§8 (Baseline `e3e7ec3`) zwar nicht gelistet — die Implementierung fügt es als Determinismus-Referenz der Relevanzbestimmung hinzu (kein Verstoß, Design-KEEP: A0-19-Anker wird in §8 **und** §3.2 gesetzt; die frühere Spec-Formulierung „steht bereits" war falsch und ist hiermit korrigiert). `wiki/knowledge-kompilation-inkrementell.md:48` referenziert A0-18/AD-13 bereits; **zur Erhebung wird `wiki/log.md` ausgeschlossen** (`--exclude=log.md`, §5.6-Muster) — sonst wäre der eigene `log.md`-Eintrag bei jedem Term, den er zitiert, selbst „Kandidat" (A0-18/FR-12-Fall; die Candidate-Liste ist auf Concept-Pfade definiert, §5.9 Pkt. 5 behandelt `log.md` gesondert als erlaubtes Mitglied). **Determinismus-Selbsttest (Membership + Identität):** Der Selbsttest prüft nicht nur Zwei-Run-Identität, sondern zusätzlich, dass die Ausgabe **Mengen-Genauigkeit** hat (nur Concept-Pfade, `log.md` ausgeschlossen) — er wird gegen einen mini-Sandbox-Baum ausgeführt, der einen realen Term auf Concept-Bodies und `log.md` verteilt und die exakte Candidate-Liste als erwartete Ausgabe pindet. Damit ist die Stale-Verifikations-Falle („das Artefakt widerlegt sich selbst") geschlossen. @@ -103,7 +134,7 @@ context: - `rg -l '' -g '!log.md' wiki/` (rgs native Glob-Exklusionsform; `--exclude` ist kein rg-Flag — das GNU-grep-Äquivalent ist `grep -rl '' --exclude=log.md wiki/`) zweimal ausführen, Ausgaben **identisch** — deterministische Erhebung ohne `log.md`-Kontamination; z. B. `rg -l 'A0-18' -g '!log.md' wiki/` → genau `wiki/knowledge-kompilation-inkrementell.md` (ein Concept-Pfad, `log.md` ausgeschlossen); `rg -l 'A0-18' wiki/` **ohne** Exklusion hingegeben würde `wiki/log.md` mit-treffen (Selbstkontamination — genau der ausgeschlossene Fall). - mini-Sandbox-Baum (`_bmad-output/implementation-artifacts/sandbox-3-2/`, re-executierbar via `bash run-sandbox.sh` — Term auf Concept-Bodies **und** `log.md` verteilt): exakte Candidate-Liste (nur Concept-Pfade) wie erwartet; Normalisierung Strip `wiki/` + `.md` → relative OKF-Pfade; zwei aufeinanderfolgende Läufe liefern byte-identische Ausgaben (Zwei-Run-Identität, AD-17h). 4. **Validator-Lauf:** alle `wiki/`-Dateien SUCCESS (unverändert; reine Text-Instruktion, human-mechanisch ausgeführt, D-3) — per-Datei-Verdikt als Ausführungs-Nachweis im `log.md`-Eintrag. -5. **Resolver-Materialisierung:** `schema/canonical-terms.md` existiert (committete, append-only Registry: canon. Form + erlaubte Varianten); `grep -n "canonical-terms" schema/compiler.md` liefert die §3.2-Referenz.
_(Optionale Em-Dash-Prüfung: die Normalisierungs-Klasse deckt `-` ab; explizite `—`-Varianten-Resovierung ist eine erkannte Determinismus-Lücke → Story 3.8, s. Spec Change Log.)_ +5. **Resolver-Materialisierung:** `schema/canonical-terms.md` existiert (committete, append-only Registry: canon. Form + erlaubte Varianten); `grep -n "canonical-terms" schema/compiler.md` liefert die §3.2-Referenz.
_(Optionale Em-Dash-Prüfung: die Normalisierungs-Klasse deckt `-` ab; explizite `—`-Varianten-Auflösung ist eine erkannte Determinismus-Lücke → Story 3.8, s. Spec Change Log.)_ **Manual checks:** - §3 Pkt. 2 zeigt auf die neue §3.2-Mechanik; Term-Ziehverfahren + Kanonisierungs-Resolver textuell benannt; Candidate-Liste als relative OKF-Pfade ohne `.md`; Determinismus-Vertrag in der Instruktion; `compiler.md` §8-Revision 2.5 + 2.6 mit Abschlussklausel; kein `schema/validator.md`-/`schema/wiki-compiler.md`-/`raw/`-Diff; §7-Vorbehalt ohne „3.2"; `wiki/log.md`-Eintrag datiert mit Story-3.2-Semantik, Determinismus-Beleg, Statuswechsel `backlog → in-progress → done` (Patch-Note Rev 2.6 oben), per-Datei-Verdikt; `deferred-work.md`-epic-3-context-Eintrag als aufgegriffen markiert + Em-Dash-Defer (Story 3.8); `sprint-status.yaml` konsistent (`3-2-…` → done). diff --git a/_bmad-output/implementation-artifacts/sprint-status.yaml b/_bmad-output/implementation-artifacts/sprint-status.yaml index 1724c27..0b39b41 100644 --- a/_bmad-output/implementation-artifacts/sprint-status.yaml +++ b/_bmad-output/implementation-artifacts/sprint-status.yaml @@ -29,7 +29,7 @@ # - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended) # - Retrospective appends its action items to action_items; the status view surfaces open ones generated: 08-14-2026 00:00 -last_updated: 08-19-2026 07:10 +last_updated: 08-19-2026 13:14 project: wow20 project_key: NOKEY tracking_system: file-system diff --git a/schema/canonical-terms.md b/schema/canonical-terms.md index 7220770..d4fa287 100644 --- a/schema/canonical-terms.md +++ b/schema/canonical-terms.md @@ -15,11 +15,17 @@ Diese Datei ist die einzige committete Registry des **kanonischen Schreibweisen- Je Eintrag (eine Zeile in der Tabelle): - **canonische Form** — der normalisierte Term als Kebab-Case-Slug (Nur-Kleinbuchstaben `[a-z0-9-]`, `-`-Kollaps). Genau **eine** canonische Form je Semantik (A0-18). -- **erlaubte Schreibvarianten** — Schreibweisen, die auf die canonische Form normalisiert werden (bündel-findend per `-`-Kollaps: `[-–_ ]` → `-`, lowercased gemäß §3.2-Normalisierung). `[]` = keine weitere Variante (nur die canonische Form selbst gilt), bzw. noch keine Einträge committet. +- **erlaubte Schreibvarianten** — Schreibweisen, die auf die canonische Form normalisiert werden (bündel-findend per `-`-Kollaps: `[-–_ ]` → `-`, lowercased gemäß §3.2-Normalisierung). **Gespeicherte Form:** canonical-Form- und Variantenzeile tragen ausschließlich die **bereits normalisierte** Form (lowercased, `-`-gekollabst) — die Spalte enthält also nie das Roh-Notat, sondern dessen Normalisierungs-Resultat. `[]` = keine weitere Variante (nur die canonische Form selbst gilt), bzw. noch keine Einträge committet. - **Semantik** *(optional)* — disambiguierende Kurzangabe, warum dieser Term eine eigene canonische Form trägt (nur bei Bedarf; ergänzt die canonische Form, ist aber nicht Teil der Normalisierungslogik). +**Lookup-Verfahren (deterministische Reihenfolge):** Die Auflösung eines gezogenen Terms folgt exakt dieser Ordnung: (1) **lowercasing**; (2) **Binde-Varianten-Kollaps** `[-–_ ]` → `-` (§3.2 Pkt. 1b); (3) **Lookup der normalisierten Form** in der Registry — Treffer in der Spalte *canonische Form* oder in der Spalte *erlaubte Schreibvarianten* → Ergebnis ist die **canonische Form** desselben Eintrags. Ist die normalisierte Form nicht auffindbar, gilt der Term **wie notiert** (Kollaps-normalisiert; §3.2 Pkt. 1b — kein stiller Ausschluss). Normalisierung und Lookup sind dadurch vollständig deterministisch: gleiche Normalisierungs-Regeln + gleiche Registry (Git-State) → gleiche Auflösung. + +**Eindeutigkeits-Invariante:** Jede normalisierte Form kommt in der Registry **genau einmal** vor — als canonische Form **oder** als Variante eines Eintrags, nie in beiden Spalten und nie in zwei Einträgen (auch nicht als Canon eines Eintrags und Variante eines anderen). Wird diese Invariante verletzt, ist der Resolver-Zustand nicht eindeutig auflösbar. + **Append-only-Regel:** Neue Zeilen werden am Ende der Tabelle angehängt; ein bestehender Eintrag wird **nie** editiert. Muss eine Semantik umbenannt werden, wird das in `deferred-work.md` als Mapping-/AD-7d-Nähe-Fall notiert (Ask-First), nicht durch Edits in dieser Registry. +**Konflikt-Verfahren (keine stillen Anhängungen):** Soll ein neuer Eintrag eine normalisierte Form tragen, die bereits in der Registry vorkommt (Canon oder Variante — auch mit abweichender Semantik), wird **nicht** angehängt (das würde die Eindeutigkeits-Invariante verletzen): der Konflikt wird in `deferred-work.md` notiert und dem Nutzer als Ask-First-Frage vorgelegt (Analogie: Umbenennungsregel oben), bis eine Entscheidung eine eindeutige Auflösung erlaubt. + ## Registry | canonische Form | erlaubte Schreibvarianten | Semantik | diff --git a/schema/compiler.md b/schema/compiler.md index 09118a7..9b41799 100644 --- a/schema/compiler.md +++ b/schema/compiler.md @@ -57,7 +57,7 @@ Diese Sektion ist der **einzige Instruktions-Ort** der feinkörnigen, **textuell - **(c) Stufe c — Link-Following mit besuchter Menge:** Aus bereits als betroffen erhobenen Concepts folgt der Producer die Concept-Links (§5.6-Pin) auf weitere Concept-Pfade — file-relativ auflösen (§5.7 Pkt. 4), **jeder bereits besuchte Concept-Pfad wird nicht erneut besucht** (besuchte Menge): Zyklen (A → B → A) enden, die Candidate-Liste bleibt endlich (LINK_FOLLOWING_ZYKLUS). 3. **Candidate-Liste (Ausgabe) + Determinismus-Vertrag:** - **(a) Form:** Die Candidate-Liste ist die Menge der betroffenen Concept-Pfade als **relative OKF-Pfade ohne `.md`** (AD-7a). Normalisierung der Ausgabe: aus jedem Treffer `wiki/.md` werden `wiki/`-Präfix und `.md`-Suffix gestrippt (deterministischer Schritt → `wiki/knowledge-kompilation-inkrementell.md` wird `knowledge-kompilation-inkrementell`). - - **(b) Reihenfolge (Zuwachs-Sicht-Ordnung):** Die Erhebung ordnet die Candidate-Liste deterministisch in **Zuwachs-Sicht-Ordnung** — Stufe-a-Treffer zuerst (in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break bei identischem Ort), danach Stufe-b-Treffer, danach Stufe-c-Treffer; innerhalb jeder Stufe lexikografisch aufsteigend (LC_ALL=C bzw. deterministische byte-Ordnung, AD-17h). Die Stufe-b/c-Treffer sind damit **positional bestimmt** (nach allen Stufe-a-Treffern), nicht vom Dateisystem-Traversal abhängig. + - **(b) Reihenfolge (Zuwachs-Sicht-Ordnung):** Die Erhebung ordnet die Candidate-Liste deterministisch in **Zuwachs-Sicht-Ordnung** — Stufe-a-Treffer zuerst, danach Stufe-b-Treffer, danach Stufe-c-Treffer; **innerhalb jeder Stufe rein lexikografisch aufsteigend (LC_ALL=C bzw. deterministische byte-Ordnung, AD-17h)**. Die Reihenfolge des ziehenden Terms bestimmt nur die **Verarbeitungsreihenfolge** der Terme in Stufe a (Interpretation/Erhebung), **nicht** die Reihenfolge der Candidate-Liste: dieselbe Treffermenge → identische Liste, unabhängig davon, in welcher Reihenfolge die Terme gezogen/verarbeitet wurden (AD-17h/A0-19). Die Stufe-b/c-Treffer sind damit **positional bestimmt** (nach allen Stufe-a-Treffern), nicht vom Dateisystem-Traversal abhängig. - **(c) Keine Duplikate:** Vereinigung über alle Terme und Stufen, bereinigt über die besuchte Menge (Pkt. 1c/2c) — jeder Pfad erscheint genau einmal. - **(d) NO_MATCH:** Trifft kein Term ein bestehendes Concept, ist die Candidate-Liste **leer** → `UNTOUCHED_CONCEPT` (Story-3.1-Pfad): keine Mutation, kein `log.md`-Zusatz (leere Menge ist Teilmenge jeder erlaubten Menge — Ghost-Diff-negativ, §5.9 Pkt. 5). - **(e) Gleichheits-Identität:** Gleicher Git-State + gleiche Eingabemenge → identische Candidate-Liste, in identischer Reihenfolge (AD-17h/A0-19). Der Selbsttest (Membership + Zwei-Run-Identität) wird in der Story-Specifizierungs-Verifikation und im `wiki/log.md`-Nachweis belegt. @@ -348,7 +348,7 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - `schema/validator.md` — Prüfgrundlage (Story 1.4, Revision 9): §3 14 Punkte, §4 Normalform (Reihenfolge §4.1, ISO-8601 §4.3), §5 Verdikt, §6 Fachprüfungen (EC-1 Existenz, EC-3 Kalender, EC-11 non-md; Punkt-11-Area-Lesart formalisiert). - Architektur-Spine (raw/`architecture-spine`): AD-2/AD-3 (raw immutable), AD-4a (claim-granulare Provenienz, §5.5), AD-5 (inkrementelle Kompilation), AD-6 (Reason/Mutate-Trennung), AD-7a (Identität = OKF-Pfad ohne `.md`, §5.7), AD-7b (genau eine Linkform gepinnt, §5.6), AD-7c (deterministische Bereichszuordnung, §5.7), AD-7d (Renaming/Redirect-Pflicht — nicht in den ACs, Epic 3), AD-8 (Standard-Markdown-Links = Navigations-/Beziehungsschicht, §5.6), AD-9 (Progressive Discovery, §5.7/§5.8), AD-10 (agent-unabhängige Regeln), AD-11 (keine eigene Runtime), AD-13 (Retrieval gehört zu Consumers / Suche = Consumer-grep / keine Embedding-Bereichszuordnung, §5.7/§5.8; Relevanzbestimmung textuell-deterministisch, §3.2), AD-14 (Git liefert Historie, nicht Domain-State), AD-15 (Trust-Metadaten v1), AD-16 (Konflikte werden explizit bewahrt), AD-17a (nur veröffentlichte/committete Inhalte als Input), AD-17f (Commit-Boundary = Mutations-Boundary), AD-17h (Determinismus), D-3 (kein Standalone). - PRD (raw/prd): FR-2 (Sources vs. Curated), FR-5 (Concept-Erzeugung), FR-9 (OKF-Konformität), FR-10 (Concepts miteinander verlinken, §5.6), FR-11 (Progressive Discovery siehe PRD-§4.3-Zeile unten — Discovery-Pfad/gewurzelte Erreichbarkeit, §5.8), FR-16 (Consumer-Unabhängigkeit), NFR-3 (Agent Readability — Standard-Dateioperationen/grep über `wiki/`, §5.8 Pkt. 4), A-4 (nur lokale Sources). -- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies); **A0-6 (inkrementeller Datenfluss Interpret → Reconcile → Synthesize → Update, §0/§3/§5.9), FR-6 (Aktualisierung statt neuer Dateien, §3/§5.9), FR-12 (unverändertes Wissen bleibt erhalten, §5.9)**, **A0-18 (Deterministische Relevanzbestimmung — grep/ripgrep, `index.md`-Traversal, Link-Following, keine Embedding-/Vector-Infrastruktur; §3.2, AD-13, PRD OQ-3)**, **A0-19 (Determinsmus-Vertrag: gleicher Git-State + gleiche Eingabemenge → gleicher Bundle-State / gleiche Candidate-Liste in gleicher Reihenfolge; §3.2, AD-17h)**. +- Epics (raw/epics): Story-2.1-Ziel und -Abgrenzung zu Story 2.2–2.5; A0-3 (Kontext-Marker-Wortlaut, §5.5), A0-8 (Concept-Identität/Normalisierung, §5.7), A0-9 (eine erlaubte Linkform, §5.6), A0-10 (deterministische Bereichszuordnung, §5.7), A0-13 (Lease-Root-Scope); FR-6/FR-12/FR-14, A0-6/A0-7/A0-11/A0-18 (Belege der nachkonformierten Concept-Bodies); **A0-6 (inkrementeller Datenfluss Interpret → Reconcile → Synthesize → Update, §0/§3/§5.9), FR-6 (Aktualisierung statt neuer Dateien, §3/§5.9), FR-12 (unverändertes Wissen bleibt erhalten, §5.9)**, **A0-18 (Deterministische Relevanzbestimmung — grep/ripgrep, `index.md`-Traversal, Link-Following, keine Embedding-/Vector-Infrastruktur; §3.2, AD-13, PRD OQ-3)**, **A0-19 (Determinismus-Vertrag: gleicher Git-State + gleiche Eingabemenge → gleicher Bundle-State / gleiche Candidate-Liste in gleicher Reihenfolge; §3.2, AD-17h)**. - PRD §4.3 (FR-11 — progressive Discovery, §5.7 Pkt. 5/§5.8) und §8.2/§8.3 (Canonical State; Separation of Concerns), **PRD OQ-3 („Compilation Scope" — wie findet der Compiler relevante vorhandene Concepts; textuell-deterministische Relevanzbestimmung, §3.2; AD-13/A0-18; Muster `raw/architecture-spine/…md` §8.3)**. **Revisionslog:** @@ -370,5 +370,6 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A - **Revision 2.4 (2026-08-18, Story 3.1):** Neue Sektion **§5.9 „Inkrementelles Update bestehender Concepts (Story 3.1)"** eingefügt (nach §5.8, vor §6) — Update-Stimulus (Reconcile-Kandidatenliste), Mutationsmechanik (Erweitern/Präzisieren/Korrigieren; `sources` nur um echte neue Belege; `generated.at` = aktueller Run-Zeitstempel; `verified` unangetastet), Index-/Link-Form unverändert (§5.6-Pin), `log.md`-Eintragspflicht („Story 3.1-Update"-Markierung; Disagreement-Fälle bleiben dokumentiert, keine Korrektur-Klassifikation hier — Epic-4-Interface), **Erhaltungs-Invariante + deterministischer Diff-Selbsttest** (`git diff --stat -- wiki/` ⊆ betroffene Concepts ∪ `log.md` ∪ Index; Ghost-Diff = textuell benannter Instruktions-Verstoß, FT-6/FR-12), Run-Vorphase-Bausteine (Defer **R-1** Change-Detection via `git diff` auf `raw/` + SHA-256-Record aus `source.md`; Defer **P2** Pre-Run-Reconcile-Check-Block — Zielpfade, EC-1-Existenz, Kandidatenliste, V-1), Worked Example. **§3 Reconcile:** Pkt. 2 Kollision-Hold (bisheriger Epic-3-Abbruch bei bereits existierendem Concept) **ersetzt** durch **Update-Routing** (bestehende Wissenseinheit → Update-Kandidat im bestehenden Pfad; kein Duplikat, kein stummer Überschreib; AD-16-Default-Erhaltung) + **textuell-deterministische Kandidatenliste** (Konzept-/Term-Überschneidung via `grep`/`ripgrep`, `index.md`-Traversal, Link-Following — AD-13; feinkörniger Mechanismus Story 3.2). **§0-Aufruf:** sechs Phasen für Neu-Anlage- und Update-Variante präzisiert; Reconcile/Mutieren betreffen auch bestehende Concepts. **§5.7 Pkt. 3 / §5.8 Pkt. 2/3:** Top-Level-Referenz von „§3.2-Kollisions-Hold" auf das Update-Routing (§3 Pkt. 2, §5.9) nachgeführt (die bisherige Epic-3-Abbruch-Formulierung ist vollständig entfernt). **§7:** Update-Thema aus dem Epic-3-Vorbehalt **entlassen** (verbleibende 3.x-Themen benannt: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6, Relevanz-Verfeinerung → Story 3.2); Scope-Einleitung um die Update-Variante geöffnet. **§8:** Normreferenzen um A0-6/FR-6/FR-12 ergänzt. **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. - **Revision 2.4.1 (2026-08-18, Story 3.1, Step-04-Review-Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** §5.9-Konsolidierung aus den drei Review-Layern — (1) Prüfgrundlage auf `validator.md` **Revision 9** angehoben (§0-Header, §8-Link), §8-Verlusttext um die Punkt-11-Area-Lesart (Rev-9) ergänzt; (2) §5.9 Pkt. 5 Diff-Selbsttest operationalisiert (Probe `git diff --name-only -- wiki/` statt `--stat`; Ergebnismenge ⊆ **Kandidatenliste** (explizit §3 Pkt. 2) ∪ `log.md` ∪ nachgeführte `index.md`; Rücksetzhilfe „ob der Ghost auf einem Kandidatenpfad liegt"); Klarstellung, dass `schema/compiler.md`/`deferred-work.md` **außerhalb** `wiki/` liegen und daher nicht Teil der Diff-Probe sind — der Story-3.1-Nachweis ist `wiki/log.md` (Differenz zu den 4 volle `git status --porcelain`-Einträgen); Diff-Erwartung für das reine Body-Update in Pkt. 7 auf `git diff --name-only` umgestellt, Ergebnismenge `wiki/log.md` + `wissensarchitektur/source-material.md` (keine `index.md`); (3) §5.9 Pkt. 3-Widerspruch aufgelöst (Index-Regel unverändert, `log.md`-Eintragspflicht bleibt ausgeschlossen — Präzisierung „kein `log.md`-Zusatz" war falsch, korrekt „kein Index-Zusatz"); (4) §5.9 Pkt. 2 um **Mehrfach-Treffer-Konsolidierung** ergänzt (mehrere Einheiten → 1 Update/`log.md`-Eintrag/`at`; Verarbeitungsreihenfolge = Auftreten in der Zuwachs-Sicht); (5) §5.9 Pkt. 1/6-Anker §1.1/§1.4 → **§1 Pkt. 1/Pkt. 4** (die tatsächlichen Label; §5.8-Pkt-2-Formel-Zeile bleibt historisch); (6) Ghost-Diff **Konsequenz** + Commit-Boundary-Umsetzung definiert (Rück-Rollen vor Run-Gültigkeit, `log.md`-Kopplung als Abbruch-Vorlauf „korrigierter Teil-Run"); (7) Defer-**R-1**-Baseline festgelegt (HEAD der vorherigen Mutations-Boundary); (8) §5.9 Pkt. 7-Worked Example auf den **realen Ist-Baum** gehoben (`raw/epics/epics-2026-08-14.md#FR-12`, `rg -l 'FR-12'`; das fiktive `epics-2026-08-18.md`/`payload` entfernt); (9) §5.8-Pkt-3-Revision-Feinschliff — die Rev-9-Lücke ist geschlossen; die Markierung ist Pkt. 3. **Abschlussklausel der Patch-Runde:** 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. - **Revision 2.6 (2026-08-19, Story 3.2, Step-04-Review Loop 2, Patch-Runde; D-3-Instruktions-Patch, kein neuer Inhalt):** (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; die §4-Referenzen zeigen wieder auf eine existierende Sektion; der §3.2-Body blieb unverändert erhalten. (2) **rg-Flag-Defekt behoben (`--exclude` ist kein rg-Flag):** die Stufe-a-Form in §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. Verified: `rg -l "A0-18" -g "!log.md" wiki/` → nur `wiki/knowledge-kompilation-inkrementell.md`; **ohne** Exklusion trifft `rg -l "A0-18" wiki/` zusätzlich `wiki/log.md` (Selbstkontamination — der ausgeschlossene Fall, §3.2-Pkt.-2a). (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. (6) **§3-Pkt.-2/§3.2-Präambel/§7-Nennungen** der Exklusion auf die tool-korrekte Form angehoben. **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. (Rev-2.5-Log-Eintrag bleibt unverändert — dokumentiert den Zustand bei Veröffentlichung der Revision 2.5, inkl. der damaligen `--exclude`-Form; historische Korrektheit des Logs.) -- **Revision 2.5 (2026-08-19, Story 3.2):** Neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** eingefügt (nach §3, vor §4) — die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"): (1) **Term-Ziehverfahren** deterministisch (bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps; **kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`** — committete, append-only Registry (canon. Form + erlaubte Varianten), damit Bestandteil des Git-States und deterministisch pinbar; genau eine canon. Form je Semantik A0-18; kein stiller Ausschluss nicht auflösbarer Varianten — Verwendung wie notiert; mehrere Terme je Einheit → Vereinigung), (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (grep-Äquivalent `grep -rl … --exclude=log.md`; `log.md` **strukturell** exkludiert, Candidate-Liste auf Concept-Pfade definiert), (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 auflösen, §5.7 Pkt. 4; Zyklen enden, LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag (AD-17h/A0-19):** relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (nach Stufe-a; lexikografisch als deterministischer Tie-Break), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) in Spec-Verification und `wiki/log.md` belegt. **§3 Pkt. 2:** Story-3.2-Vorbehalt **aufgelöst** — Pkt. 2 bleibt Kern-Anker, die Erhebung zeigt auf die neue Sektion („Erhebung nach §3.2"), `rg -l '' --exclude=log.md wiki/` als Stufe-a-Form genannt. **§7:** Story-3.2-Vorbehalt **aufgelöst** (Relevanzbestimmung in §3.2 verankert; verbleibende 3.x-Themen: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen um **AD-13** (bereits gelistet, §3.2-beankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2) und **A0-19** (Determinsmus-Vertrag, §3.2 — war im Ist-§8 noch nicht gelistet, wird als Determinismus-Referenz ergänzt) sowie **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; **`schema/canonical-terms.md`** als nebengeordnete committete Resolver-Registry referenziert (kein `schema/`-Root-Change; gleiche read-only-Hierarchie, append-only). Em-Dash-`—`-Varianten-Lücke als offene Determinismus-Frage an **Story 3.8** übergeben (nicht stillschweigend ergänzt). **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. **`sprint-status.yaml`:** Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**. `wiki/log.md`-Eintrag (append-only, bestehende Bullets unverändert), `deferred-work.md`-epic-3-context-Eintrag → aufgegriffen (append-only), Determinismus-Selbsttest + Validator-Lauf (7/7 SUCCESS) siehe `wiki/log.md`-Nachweis. +- **Revision 2.5 (2026-08-19, Story 3.2):** Neue Sektion **§3.2 „Relevanzbestimmung (Story 3.2)"** eingefügt (nach §3, vor §4) — die **verbindliche Ausformulierung der §3-Pkt.-2-Kandidatenerhebung** („Erhebung nach §3.2"): (1) **Term-Ziehverfahren** deterministisch (bedeutungstragende Token-Folgen nach §2-Interpretation; Normalisierung lowercasing + `[-–_ ]`→`-`-Kollaps; **kanonischer Schreibweisen-Resolver `schema/canonical-terms.md`** — committete, append-only Registry (canon. Form + erlaubte Varianten), damit Bestandteil des Git-States und deterministisch pinbar; genau eine canon. Form je Semantik A0-18; kein stiller Ausschluss nicht auflösbarer Varianten — Verwendung wie notiert; mehrere Terme je Einheit → Vereinigung), (2) **dreistufige term-übergreifende Erhebung über `wiki/`** — (a) `rg -l '' --exclude=log.md wiki/` (grep-Äquivalent `grep -rl … --exclude=log.md`; `log.md` **strukturell** exkludiert, Candidate-Liste auf Concept-Pfade definiert), (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 auflösen, §5.7 Pkt. 4; Zyklen enden, LINK_FOLLOWING_ZYKLUS); (3) **Candidate-Liste + Determinismus-Vertrag (AD-17h/A0-19):** relative OKF-Pfade ohne `.md` (Strip `wiki/`-Präfix + `.md`-Suffix), **Zuwachs-Sicht-Ordnung** mit Reihenfolge auch für Stufe-b/c (nach Stufe-a; lexikografisch als deterministischer Tie-Break), keine Duplikate (besuchte Menge), NO_MATCH → leere Candidate-Liste → UNTOUCHED_CONCEPT (Story-3.1-Pfad); Determinismus-Selbsttest (Membership + Zwei-Run-Identität) in Spec-Verification und `wiki/log.md` belegt. **§3 Pkt. 2:** Story-3.2-Vorbehalt **aufgelöst** — Pkt. 2 bleibt Kern-Anker, die Erhebung zeigt auf die neue Sektion („Erhebung nach §3.2"), `rg -l '' --exclude=log.md wiki/` als Stufe-a-Form genannt. **§7:** Story-3.2-Vorbehalt **aufgelöst** (Relevanzbestimmung in §3.2 verankert; verbleibende 3.x-Themen: Synthese → Story 3.4, Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen um **AD-13** (bereits gelistet, §3.2-angeankert), **A0-18** (Deterministische Relevanzbestimmung, §3.2) und **A0-19** (Determinismus-Vertrag, §3.2 — war im Ist-§8 noch nicht gelistet, wird als Determinismus-Referenz ergänzt) sowie **PRD OQ-3** (Compilation Scope, §3.2) ergänzt; **`schema/canonical-terms.md`** als nebengeordnete committete Resolver-Registry referenziert (kein `schema/`-Root-Change; gleiche read-only-Hierarchie, append-only). Em-Dash-`—`-Varianten-Lücke als offene Determinismus-Frage an **Story 3.8** übergeben (nicht stillschweigend ergänzt). **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. **`sprint-status.yaml`:** Key `3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip` `backlog` → **`in-progress`**. `wiki/log.md`-Eintrag (append-only, bestehende Bullets unverändert), `deferred-work.md`-epic-3-context-Eintrag → aufgegriffen (append-only), Determinismus-Selbsttest + Validator-Lauf (7/7 SUCCESS) siehe `wiki/log.md`-Nachweis. - **Revision 2.4.2 (2026-08-19, Story 3.1, bmad-code-review Loop 2, 4 Layer; Nutzer-Entscheidungen D-1/D-2/D-3/D-4 = 1/1/1/1):** (1) **Diff-Selbsttest (Pkt. 5) operationalisiert + Blind-Spots geschlossen (D-1):** Probe erweitert auf `git diff --name-only -- wiki/` **plus** `git status --porcelain -- wiki/` (erfasst ungetrackte neue Dateien `??` — die Duplikat-Kontrolle „keine neue Datei" braucht diese Sicht; `git diff` allein ist blind für Untracked); **Probe-Zeitpunkt fixiert vor dem Commit** (am Ende des P2-Blocks, nach den Mutationen) — nach dem Commit wäre die Probe vacuous (leere Ausgabe, AD-17f); erlaubte Teilmenge-Menge um **Neu-Anlage-Zielpfade** (§5.1/§5.7) ergänzt — Misch-Runs (Neu-Anlage + Update im selben Run) markieren neu angelegte Pfade nicht fälschlich als Ghost-Diff; **Pfad-Normalisierung** definiert (Strip `wiki/`-Präfix + `.md`-Suffix vor dem Teilmenge-Vergleich, da Kandidaten/Ziel-Pfade als relative OKF-Pfade *ohne* `.md` definiert sind); **Rollback-Mechanik** für den Ghost-Diff deterministisch benannt (modifizierte Pfade via `git checkout -- `, ungetrackte neue Dateien gelöscht, Index via `git checkout -- `; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `` (HEAD der vorherigen Mutations-Boundary, AD-17f) wird vom Producer **im `wiki/log.md`-Run-Eintrag notiert** (voller SHA) — deterministisch auflösbar ohne Domain-State-Annahme an Git (AD-14); **Diskrepanz-Regel**: widersprechen `git diff`-Befund und SHA-256-Record derselben Datei, **gewinnt `git diff`** (Commit-Boundary-Prinzip), SHA-256 bleibt Sekundär-Fingerprint; **Fallback**: ohne vorherige Mutations-Boundary gelten alle `raw/`-Dateien als Zuwachs; Rev-2.4.1-Claim „derselbe Baseline-Commit wie Pkt. 5" **korrigiert** (die Pkt.-5-Probe trägt das Baseline-Commit-Argument jetzt explizit). (3) **INPUT_UNCOMMITTED-Abbruch (D-3) + Anker-Divergenz:** 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"** vor Interpretation und vor jeder Mutation (AD-17a, I/O-Matrix-`INPUT_UNCOMMITTED` — zuvor nur Referenz auf §1 Pkt. 1, keine Zustandsprüfung/Abbruchmeldung); die **Spec↔Anker-Divergenz** (frozen Spec zitiert 3× „§1.1", §1 ist eine nummerierte Liste Pkt. 1–4 ohne §1.1-Label; Rev-2.4.1 korrigierte nur die Anker *in* compiler.md) wird hier als dokumentierte Fußnote gesichert — die Spec bleibt frozen (nur per menschlicher Renegotiation änderbar). (4) **Sandbox-Edge-Test-Nachweis (D-4):** 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-executierbare Sandbox-Skripte mit **konkreten deterministischen Ausgaben** in der Spec-`## Verification`-Sektion (Sandbox-Beleg) verankert — die `wiki/log.md`- und `deferred-work.md`-Verweise („in der Spec-Verification enthalten") auflösbar. (5) **Instruktions-Präzisierungen:** P2-Block-**Zeitpunkt** (nach Reconcile, am Anfang der Mutationsphase; Diff-Probe am Block-Ende) — löst den Widerspruch „einmal an der Spitze erhoben" vs. „Kandidatenliste entsteht erst im Reconcile"; **No-Op-Kandidat**-Regel (Pkt. 2: Pfad, der die Evidenz bereits vollständig enthält → keine Mutation/kein `at`-Bump/kein `log.md`-Eintrag, byte-identisch — die engere Auslegung); **Mehrfach-Treffer-Reihenfolge** für *alle* Einheiten definiert (Zuwachs-Sicht-Ordnung; lexicografisch nur als Tie-Break bei identischem Ort — AD-17h); **Update-Pfad-Rollback** in §5.3 Pkt. 3 (modifizierte Pfade aus Baseline-Commit wiederherstellen); **`generated.at`↔AD-17h-Gap** explizit als offener Punkt mit Home Story 3.8 benannt (Wanduhr-`at` erzeugt bei gleichem Input unterschiedliche Bundle-States; Konvention bleibt bis dahin bindend, Wechsel = Ask-First); **Term-Ableitung** (Pkt. 2 (a)) als §2-Interpretation abgegrenzt — die Erhebung *mit festem Term* ist textuell-deterministisch, der Term-Mechanismus (Kanonisierung/Synonyme) 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` — Rev-2.4.1-Beispiel enthielt den Term nicht); stale-Anker `§3.2-Kollisionsprüfung` (Pkt. 3-Zuordnung) und `§3-Voraussetzungsprüfung` (P2-Block) sowie §5.8-Pkt.-3-Zeiger („Pkt. 1" → „Pkt. 2") nachgeführt. **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. +- **Revision 2.7 (2026-08-19, Story 3.2, Step-04-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; + 2 Patches; D-3-Instruktions-Patch, kein neuer Inhalt):** (1) **§3.2-Pkt.-3b-Ordnung auf reine Lexikografie gehoben (D-4):** Stufe-a-Treffer waren „in der Reihenfolge des ziehenden Terms, dann lexikografisch als deterministischer Tie-Break" — die Term-Ordnung selbst war für Mehrfach-Terme (Pkt. 1c) nirgends festgelegt, zwei rechtmäßige Term-Ordnungen erzeugten zwei unterschiedliche Listen (AD-17h-Lücke). Jetzt: **innerhalb jeder Stufe rein lexikografisch aufsteigend (LC_ALL=C)**; die Term-Verarbeitungsreihenfolge dient nur der Interpretation/Erhebung, **nicht** der Listen-Ordnung — dieselbe Treffermenge → identische Liste. (2) **`schema/canonical-terms.md`-Lookup-Semantik vervollständigt (D-5):** 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`-Handoff / Ask-First, analog zur Umbenennungs-Regel). (3) **Statuskette `in-progress → done` dokumentiert (D-1):** der Review-Loop-Abschluss-Flip `in-progress → done` (Sprint-Sync-Konvention, Story-3.1-Präzedenz) war in keinem `wiki/log.md`-Eintrag als eigener Schritt belegt — nachgeführt als neuer oberster `wiki/log.md`-Bullet (append-only; die gefrorene Always-Klausel `→ in-progress` beschreibt den Implementierungsstand, der Review-Abschluss `done` ist der übliche Folgezustand). (4) **Mini-Sandbox um T5/T6/T7 erweitert + T1/T4-Asssertionen + T2-Kommentar-Korrektur (D-2 + Patch P-1):** T5 `LINK_FOLLOWING_ZYKLUS` (A→B→A-Links; besuchte Menge → endliche, doppelungsfreie Liste), T6 `TRAVERSAL_REACH_ONLY` (Term nur in Area-`index.md` → gewurzelte Concept-Pfade als Kandidaten; `index.md` selbst ist kein Concept-Kandidat), T7 `TERM_ABLEITUNG_SYNONYM` (Registry-Test-Doppel: Schreibvarianten → canonische Form via Lookup auf normalisierter Form; Negativ-Fall: nicht auflösbar → wie notiert, kein stiller Ausschluss); T1/T4 tragen jetzt harte Pass/Fail-Asssertionen (`exit 1` bei Abweichung) — die exakte Candidate-Liste wird erzwungen, nicht nur ausgegeben; der T2-Kommentar zu `index` korrigiert (Stufe-a-Treffer auf `wiki/index.md` löst Stufe b aus; `index.md` ist kein Concept-Kandidat). (5) **Selbsttest-Beleg (b) gegen den realen Sandbox-Ist-Baum re-executiert (D-3):** der Rev-2.5-Log-Beleg (b) beschrieb einen nicht-committierten Baum (Term `quanten-protocol`, `sub/beta.md`, SHA-256 `159092bb…`) — Stale-Evidenz-Falle (B1-Präzedenz). Der Nachweis wird jetzt gegen die echte `run-sandbox.sh`-Ausgabe (Term `deterministische-relevanz-bestimmung`, root-level `alpha`/`beta`/`gamma`) neu belegt; der Rev-2.5-Eintrag bleibt historisch unverändert, die Korrektur steht als neuer `wiki/log.md`-Bullet (append-only). (6) **Typos im normativen Text korrigiert (Patch P-2):** `Determinsmus` → `Determinismus` (§8-Referenzen + Log-/Defer-Belege), `§3.2-beankert` → `§3.2-angeankert`, `Membrum` → `Mitglied` (Spec-Design-Notes), `Konventionelle Determinismus-Lücke` → `Bekannte Determinismus-Lücke` (Defer-Beleg; `compiler.md:53` sagt „Bekannte"), `Resovierung` → `Auflösung` (Spec-Change-Log/-Verification). **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. (Revisionslog-Reihenfolge-Anomalie 2.6/2.5 bleibt als dokumentierter Defer bestehen — nicht in dieser Runde umgeordnet.) diff --git a/wiki/log.md b/wiki/log.md index 9a959b4..9b29777 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -1,8 +1,9 @@ # Log ## 2026-08-19 +- **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** (Determinsmus-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.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