feat: Story 3.4 Review-Loop-1-Patches (bmad-code-review, 3 Layer; kein Loopback) — §5.10: Reflektiertheits-Selbsttest-Zeilenanfangs-Muster, Body-Reihenfolge deterministisch (Beleg-Anker LC_ALL=C), Konsolidierungs-Kriterium, Duplikat-Fall + Orphan-Kontrolle (Pkt. 8), N2/N3-Nachweise; Sandbox S1-S6+N1-N3+FW (10 Szenarien, Exit 0): ??-Sicht lebendig, S5-Ghost-HARD-FAIL, N1-Stimulus-Kommentar, N2 Disagreement (AD-16), N3 AD-4c-Kontext-Marker; 4 Defers → deferred-work.md; log.md 10/10 PASS; Spec done + Suggested Review Order; sprint-status done
This commit is contained in:
@@ -391,3 +391,25 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein
|
|||||||
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.
|
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
|
status: offen
|
||||||
|
|
||||||
|
|
||||||
|
## Deferred from: code review of spec-3-4-wissen-aus-mehreren-sources-synthetisieren (Story 3.4, 2026-08-19)
|
||||||
|
|
||||||
|
- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md`
|
||||||
|
summary: **AD-16-Disagreement- und AD-4c-Übernahme-Marker-Pfad erst in der Sandbox demonstriert, nicht als reale Bundle-Demonstration** — die zwei vom Verification-Gap-Layer als „unbeobachtete Vertragsverpflichtungen" markierten Zweige (§5.10 Pkt. 3 AD-16-Default, Pkt. 4 AD-4c) sind durch die neuen Sandbox-Szenarien **N2 (Disagreement: beide Behauptungen + je Beleg bleiben, kein `(e; f)`-Falsch-Multi-Beleg, `Disagreement:`-log-Eintrag)** und **N3 (AD-4c-Kontext-Marker: „übernommen aus `gamma` auf Basis von `raw/gamma-v1.md#S-1`, nicht eigenständig belegt"; übernommene Quelle nicht in `sources`)** hart assertiert. Eine **reale** Disagreement- oder Übernahme-Synthese im echten Bundle bleibt Aufgabe der Epic-4-Stories (4.1 Klassifikation, 4.2 Disagreements in `log.md`), die hier bewusst nicht vorweggenommen wird (Story-3.4-Boundaries: keine Korrektur-Klassifikation, kein reales Bundle-Testmaterial). Home: Epic-4 (Story 4.1/4.2) — reale Anwendung der Sandbox-verankerten Mechanik.
|
||||||
|
evidence: Step-04-Review (2026-08-19, Verification-Gap-Layer) — Kernbefund „AD-16-Disagreement-Pfad untested" + „AD-4c-Übernahme-Marker untested"; geschlossen durch `_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh` N2/N3 (Exit 0, 10 Szenarien).
|
||||||
|
status: offen (Home: Epic-4)
|
||||||
|
|
||||||
|
- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md`
|
||||||
|
summary: **Orphan-Kontrolle (§5.10 Pkt. 8) textuell verankert, aber nicht in der Sandbox demonstriert** — die Regel „neu committete `raw/`-Evidenz ohne Ziel-Pfad-Treffer bleibt unzugeordnet und wird in `log.md` als verwaist protokolliert" ist Teil der Pkt.-8-Erhaltungs/Determinismus-Ebene; das Review wies darauf hin, dass der Orphan-Fall (Zuwachs ohne Kandidaten-Treffer) kein eigenes Sandbox-Szenario hat. Die Negativ-Kontroll-Dichte der Sandbox (S3 Reflektiertheit, S5 `??`-Sicht/Struktur, N1 No-Op, N2/N3) deckt die übrigen Pkt.-8-Aspekte; ein Orphan-Szenario wurde zugunsten des verbleibenden Review-Scopes nicht ergänzt. Home: Story 3.8 (Reconcile-Orphan-Politik) oder Epic-4 — verwaiste Evidenz-Politik als Folge-Story.
|
||||||
|
evidence: Step-04-Review (2026-08-19, Blind-Hunter-Layer) — Befund „unknown/orphaned raw evidence path without target"); `schema/compiler.md` §5.10 Pkt. 8 (Orphan-Kontrolle, in dieser Runde formuliert).
|
||||||
|
status: offen (Home: Story 3.8)
|
||||||
|
|
||||||
|
- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md`
|
||||||
|
summary: **Sandbox-Evidenztexte transkribieren Umlaute, die Concept-Bodies nutzen Umlaut-Schreibweisen (Determinismus-Hazard für den Term-Abgleich)** — die Story-3.4-Sandbox setzt den bekannten Story-3.2-/Sandbox-Normalisierungs-Hazard fort (already known: Em-Dash-Lücke + Umlaut vs. Transkription, Home Story 3.8). Die §3.2-Normalisierung (lowercasing + `[-–_ ]`-Kollaps) deckt Umlaut-Divergenzen („Schlüssel" vs. „Schluessel") nicht; die Sandbox-Bodies (Umlaut) vs. raw-Evidenz (Transkription, z. B. „Bestaetigungen", „Repraesentationen") nutzen bewusst beide Schreibweisen. Home: Story 3.8 (Determinismus-Vertrag, Normalisierungs-Vollständigkeit) oder Sandbox-Vereinheitlichung in einer Folge-Story — kein Instruktions-Defekt.
|
||||||
|
evidence: Step-04-Review (2026-08-19, Verification-Gap-Layer): `run-sandbox.sh` N2 (`Quorum-Bestaetigungen`) / S6 / S2/`Sitzungsschluessel` etc.; §3.2-Pkt.-1b-Kollaps-Klasse ohne Umlaut-/Em-Dash.
|
||||||
|
status: offen (Home: Story 3.8)
|
||||||
|
|
||||||
|
- source_spec: `_bmad-output/implementation-artifacts/spec-3-4-wissen-aus-mehreren-sources-synthetisieren.md`
|
||||||
|
summary: **Frozen Spec-Intent-Typo „Nickel" im §5.10-Form-Wahl-Aufgaben-Pfad (Story-3.3-Defer U2/U7-Empfehlung)** — der Intent-Satz „Nickel die Story-3.3-Defer U2/U7-Empfehlung (…) im Sandbox auf" enthält „Nickel" statt „Nimm/Trage … auf" (oder „Schließe … auf"); er sitzt im `<frozen-after-approval>`-Block des Specs, dessen Text erst nach humaner Re-Negotiation geändert werden darf. Kein Instruktions-Defekt (der Sandbox-/authored-Text ist korrekt — FW-Szenario implementiert die Empfehlung inhaltlich). Home: Spec-Re-Negotiation (Ask-First: menschliche Autorisierung) oder Akzeptanz als kosmetischer Frozen-Fehler.
|
||||||
|
evidence: Step-04-Review (2026-08-19, Blind-Hunter-Layer): `spec-3-4-…md` Zeile ~18 (frozen Intent) — „Nickel die Story-3.3-Defer U2/U7-Empfehlung … auf".
|
||||||
|
status: offen
|
||||||
|
|||||||
@@ -0,0 +1,777 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Story 3.4 — Sandbox-Tests der Synthese-Dimension (§5.10, Revision 2.9)
|
||||||
|
# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb34)
|
||||||
|
# Zweck: die Synthese-Mechanik (§5.10) als re-executierbarer Run-Demonstrator
|
||||||
|
# durchspielen — Neu-Anlage aus 2+ raw/-Quellen mit sources >= 2 + gemischten
|
||||||
|
# Belegen (S1), Multi-Beleg-Konsolidierung (S2), Negativ-Kontrolle
|
||||||
|
# Aneinanderreihung / Reflektiertheits-Selbsttest (S3), Synthese-Update auf
|
||||||
|
# bestehendem Concept-Pfad (S4), Struktur-/Frontmatter-Invariante (S5),
|
||||||
|
# NO_OP-Synthese (N1: Evidenz bereits im Body -> volle Byte-Identitaet),
|
||||||
|
# Zwei-Run-Identitaet (S6, AD-17h/A0-19) + die Form-Wahl-Klassifikationsprobe
|
||||||
|
# (Story-3.3-Defer U2/U7: prueft die §5.9-Abgrenzungs-Reihenfolge
|
||||||
|
# Korrigieren -> Praezisieren -> Erweitern -> No-Op an einer gemischten Einheit).
|
||||||
|
# Erhaltungs-Invariante (§5.9 Pkt. 5) als HARDE Assertion; Frontmatter-
|
||||||
|
# Konformitaet (Vertrag §3.3/§3.4-Subset) je erzeugtem/aktualisiertem Concept.
|
||||||
|
# Linux-Sandbox-Semantik auf einem /tmp-Baum — NIE der reale wiki/-Baum.
|
||||||
|
set -u
|
||||||
|
ROOT=$(mktemp -d /tmp/sb34-XXXXXX)
|
||||||
|
SB="$ROOT/sb"
|
||||||
|
mkdir -p "$SB/wiki" "$SB/raw"
|
||||||
|
cd "$SB"
|
||||||
|
git init -q
|
||||||
|
git config user.email "sandbox@test"
|
||||||
|
git config user.name "Sandbox"
|
||||||
|
|
||||||
|
# ---------- Basis-Baum (committete Ausgangslage = Baseline-Commit) ----------
|
||||||
|
# Mini-Bundle mit zwei Bereichs-Index-freien Root-Concepts + Bundleroot as the
|
||||||
|
# Referenz: ein bereits bestehendes Concept `gamma` (nicht betroffen, Kontrolle).
|
||||||
|
# gamma ist das nicht-betroffene Kontroll-Concept (Ghost-Diff-Kontrolle, S3/S5).
|
||||||
|
# Die Synthese-Einheiten (S1: neu; S4: Update auf bestehendem Pfad alpha) werden
|
||||||
|
# je Szenario aus zwei committeten raw/-Quellen gespeist.
|
||||||
|
cat > wiki/index.md <<'EOF'
|
||||||
|
# Index
|
||||||
|
- [Alpha](alpha.md)
|
||||||
|
- [Gamma](gamma.md)
|
||||||
|
EOF
|
||||||
|
cat > wiki/alpha.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/alpha-v1.md
|
||||||
|
id: s1
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-16T09:00:00Z
|
||||||
|
---
|
||||||
|
Das Alpha-Protokoll definiert eine deterministische Init-Sequenz (raw/alpha-v1.md#S-1).
|
||||||
|
Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2).
|
||||||
|
EOF
|
||||||
|
cat > wiki/gamma.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/gamma-v1.md
|
||||||
|
id: s1
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-16T09:00:00Z
|
||||||
|
---
|
||||||
|
Gamma beschreibt ein anderes, hier nicht betroffenes Thema.
|
||||||
|
EOF
|
||||||
|
cat > wiki/log.md <<'EOF'
|
||||||
|
# Log
|
||||||
|
EOF
|
||||||
|
# Bereits bestehende raw/-Dateien (Baseline-Baum)
|
||||||
|
cat > raw/alpha-v1.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz v1: deterministische Init-Sequenz.
|
||||||
|
### S-2
|
||||||
|
Evidenz v1: ausschließlich lokale Netze.
|
||||||
|
EOF
|
||||||
|
cat > raw/gamma-v1.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz v1: Gamma-Thema.
|
||||||
|
EOF
|
||||||
|
git add -A
|
||||||
|
git commit -qm "Baseline"
|
||||||
|
BASE=$(git rev-parse HEAD)
|
||||||
|
echo "BASELINE-COMMIT: $BASE"
|
||||||
|
echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)"
|
||||||
|
echo
|
||||||
|
|
||||||
|
runlabel() { echo; echo "########## $1 ##########"; }
|
||||||
|
# Isolation: Worktree auf BASE zuruecksetzen (kein Carry-over ueber Szenarien)
|
||||||
|
isolate() { git checkout -q -b "$1" "$BASE" 2>/dev/null || git checkout -q "$1"; git reset -q --hard "$BASE"; git clean -qfd wiki raw; }
|
||||||
|
|
||||||
|
# Erhaltungs-Invariante-Probe (D-1-Form, §5.9 Pkt. 5): Baseline-Diff + porcelain,
|
||||||
|
# normalisiert (wiki/-Praefix + .md-Suffix gestrippt, LC_ALL=C-sortiert)
|
||||||
|
probe() {
|
||||||
|
{ git diff --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } \
|
||||||
|
| sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u
|
||||||
|
}
|
||||||
|
inv_set() { probe | LC_ALL=C sort -u | paste -sd' ' -; }
|
||||||
|
|
||||||
|
# ---------- Harte Assertion der Erhaltungs-Invariante (§5.9 Pkt. 5) ----------
|
||||||
|
# assert_invariant: bricht bei Verstoß hart ab (exit 1; positive Erwartung).
|
||||||
|
# assert_invariant_ok: Non-Exiting-Variante (exit-code: 0 = Invariante gehalten,
|
||||||
|
# 1 = verletzt) — für Negativ-Kontrollen, die NUR erkennen sollen (§5.9 Pkt. 5,
|
||||||
|
# Verstoß textuell benannt, NFR-4), ohne dass die Assertion selbst den Run beendet.
|
||||||
|
inv_viol() { # $1=expected ; liefert 0, wenn erlaubte-Menge konsistent (keine Verletzung), !=0 sonst; msg auf stderr
|
||||||
|
# Alle Eintraege (getrackt wie ungetrackt) unter wiki/ muessen in $expected sein.
|
||||||
|
# Ungetrackte Eintraege ($??) sind NUR dann ein Verstoss, wenn sie ausserhalb der
|
||||||
|
# erlaubten Menge liegen (Pkt. 8: "keine neue Datei AUSSER echten Ziel-Pfaden" —
|
||||||
|
# legitime neue Ziel-Pfade sind in $expected enthalten; alle anderen sind Duplikat/
|
||||||
|
# Ghost-Diff). Die Dublette "keine neue Datei UEBERHAUPT" wuerde legitime neue
|
||||||
|
# Ziel-Pfade faelschlich verwerfen und ist hier bewusst NICHT formuliert.
|
||||||
|
local expected="$1" p u bad=0
|
||||||
|
got=$(inv_set)
|
||||||
|
for p in $got; do
|
||||||
|
case " $expected " in
|
||||||
|
*" $p "*) ;;
|
||||||
|
*) echo "HARD-FAIL (Erhaltungs-Invariante §5.9 Pkt. 5): '$p' ist kein Ghost-Diff-negativer Eintrag — erlaubte Menge: {$expected}" >&2; bad=1;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
for u in $(git status --porcelain -- wiki/ | grep '^??' | awk '{print $2}'); do
|
||||||
|
u=$(echo "$u" | sed -e 's|^wiki/||' -e 's|\.md$||')
|
||||||
|
case " $expected " in
|
||||||
|
*" $u "*) ;;
|
||||||
|
*) echo "HARD-FAIL (Duplikat/Ghost-Diff): ungetrackte neue Datei '$u' liegt ausserhalb der erlaubten Ziel-Pfade {$expected} (Pkt. 8)" >&2; bad=1;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
return $bad
|
||||||
|
}
|
||||||
|
assert_invariant() { # positive Erwartung: Verstoß => HARD-FAIL + Exit 1
|
||||||
|
if inv_viol "$1"; then
|
||||||
|
echo "RESULT: PASS — Probe erfüllt; keine neue Datei; kein Ghost-Diff"
|
||||||
|
else
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
# assert_frontmatter_ok: Non-Exiting-Variante von assert_frontmatter (wie oben:
|
||||||
|
# exit-code 0 = konform, 1 = Verstoß) für Negativ-Kontrollen, die erkennen sollen
|
||||||
|
# (Vertrag §3.3/§3.4-Subset, P2-Element (6)) — ohne den Run abzubrechen.
|
||||||
|
assert_frontmatter_ok() {
|
||||||
|
( assert_frontmatter "$@" ) >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------- Frontmatter-Konformitaet (Vertrag §3.3/§3.4, §6.5) ----------
|
||||||
|
# $1=Datei; $2...=erwartete sources[].resource-Werte (in beliebiger Reihenfolge;
|
||||||
|
# der Determinismus der sources-Reihenfolge wird separat in S1/S4 geprueft).
|
||||||
|
assert_frontmatter() {
|
||||||
|
local f="$1"; shift
|
||||||
|
local r bad=0
|
||||||
|
local v
|
||||||
|
v=$(awk '
|
||||||
|
/^---$/{n++; if(n==2) exit; next}
|
||||||
|
/^[A-Za-z_][A-Za-z0-9_-]*:/{
|
||||||
|
k=$0; sub(/:.*/,"",k)
|
||||||
|
if (k=="sources") top="sources"
|
||||||
|
else if (k=="generated" || k=="verified") top="genver"
|
||||||
|
else top="other"
|
||||||
|
if (k!="type" && k!="sources" && k!="generated" && k!="verified" && k!="status" && k!="stale_after") print "TOP_UNBEFUGT:" k
|
||||||
|
if (seenk[k]++) print "DUP_KEY:" k
|
||||||
|
r=0
|
||||||
|
if (k=="type") r=1; else if (k=="sources") r=2; else if (k=="generated") r=3
|
||||||
|
else if (k=="verified") r=4; else if (k=="status") r=5; else if (k=="stale_after") r=6
|
||||||
|
if (r>0 && r<lastr) print "ORDER_VIOLATION:" k
|
||||||
|
if (r>0) lastr=r
|
||||||
|
next
|
||||||
|
}
|
||||||
|
/^[[:space:]]/{
|
||||||
|
gsub(/^[[:space:]]+/,""); sub(/^- /,""); gsub(/^[[:space:]]+/,"");
|
||||||
|
if (match($0, /^[A-Za-z_][A-Za-z0-9_-]*:/)) {
|
||||||
|
ik=substr($0,1,RLENGTH-1)
|
||||||
|
if (top=="sources" && ik!="resource" && ik!="id" && ik!="title" && ik!="author" && ik!="usage_count" && ik!="last_modified") print "INNER_UNBEFUGT:" ik
|
||||||
|
if (top=="genver" && ik!="by" && ik!="at") print "INNER_UNBEFUGT:" ik
|
||||||
|
if (top=="other") print "INNER_UNBEFUGT:" ik
|
||||||
|
}
|
||||||
|
}
|
||||||
|
' "$f")
|
||||||
|
if [ -n "$v" ]; then
|
||||||
|
echo "HARD-FAIL (Frontmatter-Subset, Vertrag §3.3/§3.4/§3.5): $v in $f" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
grep -qE '^type: concept$' "$f" || { echo "HARD-FAIL: type=concept fehlt in $f" >&2; exit 1; }
|
||||||
|
grep -qE "^ at: [0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(Z|[+-][0-9]{2}:?[0-9]{2})$" "$f" || { echo "HARD-FAIL: generated.at ist keine volle ISO-8601-Datetime in $f" >&2; exit 1; }
|
||||||
|
for r in "$@"; do
|
||||||
|
grep -qF " - resource: $r" "$f" || { echo "HARD-FAIL: sources-Eintrag 'resource: $r' fehlt in $f" >&2; exit 1; }
|
||||||
|
done
|
||||||
|
echo "RESULT: PASS — Frontmatter-Konformitaet $f (Subset ok, generated.at volles Datetime)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# ---------- Synthese-Helfer (deterministisch; at gepinnt fuer Zwei-Run-Identitaet) ----------
|
||||||
|
AT_NEW="2026-08-19T12:00:00Z"
|
||||||
|
bump_at() { sed -i "s|^ at: .*| at: $AT_NEW|" "$1"; }
|
||||||
|
# add_source: Fuegt einen sources-Eintrag an seiner LEXIKOGRAFISCHEN Position ein
|
||||||
|
# (§5.10 Pkt. 2/8: die sources-Liste ist deterministisch nach `resource` sortiert,
|
||||||
|
# LC_ALL=C, AD-17h/A0-19 — nie appended). Einfuege-Zeile: erste `resource:`-Zeile,
|
||||||
|
# deren Wert lexikografisch > $res ist; sonst generated:-Zeile (Ende der sources-Liste).
|
||||||
|
# Die Einfuege-Position selbst wird ueber assert_sources_lex haert verifiziert.
|
||||||
|
add_source() { # $1=Datei $2=resource $3=id
|
||||||
|
local f="$1" res="$2" id="$3" ln
|
||||||
|
grep -qF " - resource: $res" "$f" && return 0 # bereits vorhanden -> kein Duplikat
|
||||||
|
ln=$(LC_ALL=C awk -v r="$res" '
|
||||||
|
$1=="-" && $2=="resource:" { name=$3; gsub(/\r/,"",name); if (name > r) { print NR; exit } }
|
||||||
|
/^generated:/ { print NR; exit }
|
||||||
|
' "$f")
|
||||||
|
[ -n "$ln" ] || ln=$(grep -n '^generated:' "$f" | head -1 | cut -d: -f1)
|
||||||
|
sed -i "${ln}i\\ - resource: $res\n id: $id" "$f"
|
||||||
|
}
|
||||||
|
# assert_sources_lex: verifiziert, dass die sources-resource-Werte in Datei-Reihenfolge
|
||||||
|
# exakt der LC_ALL=C-lexikografischen Ordnung entsprechen (§5.10 Pkt. 2 / Pkt. 8,
|
||||||
|
# AD-17h/A0-19 — deterministisch, unabhaengig von Datei-/Verarbeitungsreihenfolge).
|
||||||
|
assert_sources_lex() { # $1=Datei
|
||||||
|
local f="$1" file_order sorted_order
|
||||||
|
file_order=$(display_sources "$f")
|
||||||
|
sorted_order=$(display_sources "$f" | LC_ALL=C sort)
|
||||||
|
if [ "$file_order" != "$sorted_order" ]; then
|
||||||
|
echo "HARD-FAIL (sources-Reihenfolge, §5.10 Pkt. 2/8): die sources-Liste in $f ist nicht lexikografisch nach resource (LC_ALL=C) sortiert" >&2
|
||||||
|
echo " Datei-Reihenfolge: $file_order" >&2
|
||||||
|
echo " LC_ALL=C-Ordnung: $sorted_order" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "RESULT: PASS — sources-Liste $f ist lexikografisch nach resource sortiert (LC_ALL=C, AD-17h/A0-19)"
|
||||||
|
}
|
||||||
|
# display_sources: gibt die sources-resource-Zeilen in Datei-Reihenfolge aus
|
||||||
|
display_sources() { grep -E '^ - resource: ' "$1"; }
|
||||||
|
|
||||||
|
log_anlage() { # $1=Concept-Pfad $2=quelle(n)
|
||||||
|
printf '\n## 2026-08-19\n- Synthese-Anlage: %s (%s; Baseline %s)\n' "$1" "$2" "$BASE" >> wiki/log.md
|
||||||
|
}
|
||||||
|
log_update() { # $1=Concept-Pfad $2=quelle(n)
|
||||||
|
printf '\n## 2026-08-19\n- Story 3.1-Update: %s (%s; Baseline %s)\n' "$1" "$2" "$BASE" >> wiki/log.md
|
||||||
|
}
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "S1: NEU-ANLAGE — zwei raw/-Quellen desselben Themas -> EIN Synthese-Concept (sources >= 2, gemischte Belege; FR-7 AC-1/AC-2)"
|
||||||
|
isolate s1
|
||||||
|
cat > raw/synth-a.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz a: das Delta-Protokoll kapselt die Zustands-Replikation.
|
||||||
|
### S-2
|
||||||
|
Evidenz a: Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz.
|
||||||
|
EOF
|
||||||
|
cat > raw/synth-b.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz b: Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus.
|
||||||
|
### S-2
|
||||||
|
Evidenz b: das Delta-Protokoll kapselt die Zustands-Replikation.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/synth-a.md + raw/synth-b.md (zwei Quellen, ein Thema)"
|
||||||
|
echo "--- Synthese-Stimulus: zwei belegende raw/-Quellen (§5.10 Pkt. 1), Ziel-Pfad unbelegt -> Neu-Anlage via §5.7 ---"
|
||||||
|
echo "--- EIN Synthese-Concept delta: gemeinsame Repraesentation statt getrennter Zusammenfassungen (AC-1) ---"
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-a.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-b.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1).
|
||||||
|
Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz (raw/synth-a.md#S-2).
|
||||||
|
Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus (raw/synth-b.md#S-1).
|
||||||
|
EOF
|
||||||
|
sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md
|
||||||
|
log_anlage delta "raw/synth-a.md + raw/synth-b.md"
|
||||||
|
# KEIN git add -A auf wiki/: delta.md bleibt ungetrackt ($??) — die Pkt.-8-
|
||||||
|
# Duplikat-Kontrolle (über die ??-Sicht) wird so LEBENDIG geprüft (die Erhaltungs-
|
||||||
|
# Invarianz-Probe liest git-diff + porcelain beides aus).
|
||||||
|
echo "--- Assertion: sources >= 2 (jede belegende Quelle ein Eintrag), lexikografisch nach resource (LC_ALL=C, Pkt. 2/8) ---"
|
||||||
|
grep -qF ' - resource: raw/synth-a.md' wiki/delta.md || { echo "HARD-FAIL: sources-Eintrag raw/synth-a.md fehlt" >&2; exit 1; }
|
||||||
|
grep -qF ' - resource: raw/synth-b.md' wiki/delta.md || { echo "HARD-FAIL: sources-Eintrag raw/synth-b.md fehlt" >&2; exit 1; }
|
||||||
|
assert_sources_lex wiki/delta.md
|
||||||
|
echo "--- Assertion: gemischte claim-granulare Provenienz (§5.5) je Aussage — eine Repraesentation, Belege aus beiden Quellen ---"
|
||||||
|
grep -qF '(raw/synth-a.md#S-1)' wiki/delta.md || { echo "HARD-FAIL: Inline-Beleg raw/synth-a.md#S-1 fehlt" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/synth-a.md#S-2)' wiki/delta.md || { echo "HARD-FAIL: Inline-Beleg raw/synth-a.md#S-2 fehlt" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/synth-b.md#S-1)' wiki/delta.md || { echo "HARD-FAIL: Inline-Beleg raw/synth-b.md#S-1 fehlt" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: keine per-Source-Zusammenfassungs-Struktur (AC-4, Reflektiertheits-Selbsttest Pkt. 5) ---"
|
||||||
|
if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then
|
||||||
|
echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur im Synthese-Concept (FR-7 AC-4)" >&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "RESULT: PASS — keine 'Quelle A: ... / Quelle B: ...'-Struktur; Aussagen tragen Provenienz-Tags"
|
||||||
|
fi
|
||||||
|
echo "--- Index-Link (Punkt 11) + log.md-Anlage-Eintrag (Pkt. 7: vollständige Multi-Source-sources-Liste im Eintrag) ---"
|
||||||
|
grep -qF -- '- [Delta](delta.md)' wiki/index.md || { echo "HARD-FAIL: delta fehlt in wiki/index.md (Punkt 11)" >&2; exit 1; }
|
||||||
|
grep -qF 'Synthese-Anlage: delta' wiki/log.md || { echo "HARD-FAIL: Anlage-Eintrag in log.md fehlt" >&2; exit 1; }
|
||||||
|
grep -qF 'raw/synth-a.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-a.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; }
|
||||||
|
grep -qF 'raw/synth-b.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-b.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; }
|
||||||
|
echo "--- Probe (Erhaltungs-Invariante §5.9 Pkt. 5; erlaubt: delta + index + log) ---"; probe
|
||||||
|
assert_invariant "delta index log"
|
||||||
|
assert_frontmatter wiki/delta.md raw/synth-a.md raw/synth-b.md
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "S2: KONSOLIDIERUNG — redundante Aussage aus zwei Quellen -> EINE konsolidierte Aussage mit Multi-Beleg (FR-7 AC-3, AD-4)"
|
||||||
|
isolate s2
|
||||||
|
cat > raw/synth-c.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz c: Delta-relevante Sitzungsschluessel unterliegen einer festen Lebensdauer.
|
||||||
|
### S-3
|
||||||
|
Evidenz c: Delta-Repraesentationen sind unveraenderlich nach Quorum-Bestaetigung.
|
||||||
|
EOF
|
||||||
|
cat > raw/synth-d.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz d: Delta-relevante Sitzungsschluessel unterliegen einer festen Lebensdauer.
|
||||||
|
### S-4
|
||||||
|
Evidenz d: Delta-Repraesentationen speichern den konsolidierten Zustand.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/synth-c.md + raw/synth-d.md (redundanter Befund)"
|
||||||
|
echo "--- Synthese: die redundante Aussage (Sitzungsschluessel) existiert in BEIDEN Quellen (§5.10 Pkt. 3) ---"
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-c.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-d.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Delta-relevante Sitzungsschluessel unterliegen einer festen Lebensdauer (raw/synth-c.md#S-1; raw/synth-d.md#S-1).
|
||||||
|
Delta-Repraesentationen sind unveraenderlich nach Quorum-Bestaetigung (raw/synth-c.md#S-3).
|
||||||
|
Delta-Repraesentationen speichern den konsolidierten Zustand (raw/synth-d.md#S-4).
|
||||||
|
EOF
|
||||||
|
sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md
|
||||||
|
log_anlage delta "raw/synth-c.md + raw/synth-d.md"
|
||||||
|
# KEIN git add -A auf wiki/: delta.md ungetrackt ($??, legitimer Ziel-Pfad) —
|
||||||
|
# Pkt.-8-Duplikat-Kontrolle über die ??-Sicht wird lebendig geprüft.
|
||||||
|
echo "--- Assertion: EINE konsolidierte Aussage mit Multi-Beleg (Semikolon-Form, voller Pfad je Beleg); keine Beleg-Tilgung (AD-4) ---"
|
||||||
|
[ "$(grep -c 'Sitzungsschluessel' wiki/delta.md)" -eq 1 ] || { echo "HARD-FAIL: redundante Aussage wurde nicht zu einer Aussage konsolidiert (FR-7 AC-3)" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/synth-c.md#S-1; raw/synth-d.md#S-1)' wiki/delta.md || { echo "HARD-FAIL: Multi-Beleg-Semikolon-Form fehlt oder ein Beleg wurde getilgt (AD-4)" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/synth-c.md#S-3)' wiki/delta.md || { echo "HARD-FAIL: Einzelbeleg c#S-3 fehlt" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/synth-d.md#S-4)' wiki/delta.md || { echo "HARD-FAIL: Einzelbeleg d#S-4 fehlt" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: Reflektiertheit (AC-4) + sources-Ordnung (Pkt. 2/8) ---"
|
||||||
|
if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then
|
||||||
|
echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur (FR-7 AC-4)" >&2; exit 1
|
||||||
|
else
|
||||||
|
echo "RESULT: PASS — konsolidierte Aussage mit Multi-Beleg (kein Provenienz-Verlust), keine per-Source-Struktur"
|
||||||
|
fi
|
||||||
|
assert_sources_lex wiki/delta.md
|
||||||
|
echo "--- log-Anlage-Eintrag (Pkt. 7): vollständige Multi-Source-Liste (c + d) im Eintrag ---"
|
||||||
|
grep -qF 'raw/synth-c.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-c.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; }
|
||||||
|
grep -qF 'raw/synth-d.md' wiki/log.md || { echo "HARD-FAIL: Multi-Source-Quelle raw/synth-d.md fehlt im log.md-Anlage-Eintrag (Pkt. 7)" >&2; exit 1; }
|
||||||
|
echo "--- Probe (erlaubt: delta + index + log) ---"; probe
|
||||||
|
assert_invariant "delta index log"
|
||||||
|
assert_frontmatter wiki/delta.md raw/synth-c.md raw/synth-d.md
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "S3: NEGATIV-KONTROLLE ANEINANDERREIHUNG — 'Quelle A: ... / Quelle B: ...' wird vom Reflektiertheits-Selbsttest erkannt und vor Run-Abschluss umgebaut (FR-7 AC-4, NFR-7/NFR-4)"
|
||||||
|
isolate s3
|
||||||
|
echo "--- simuliertes (fehlerhaftes) Synthese-Ergebnis: per-Source-Zusammenfassungs-Struktur (verboten, §5.10 Pkt. 5) ---"
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-a.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-b.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Quelle A: das Delta-Protokoll kapselt die Zustands-Replikation.
|
||||||
|
Quelle B: Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus.
|
||||||
|
EOF
|
||||||
|
echo "--- Reflektiertheits-Selbsttest (Pkt. 5, grepbasiert): erwartet: Befund 'Quelle A:' wird erkannt (nicht vacuous, NFR-7) ---"
|
||||||
|
if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then
|
||||||
|
echo "BEFUND: Aneinanderreihungs-Struktur erkannt (Selbsttest-FAIL, textuell benannt, NFR-7/NFR-4)"
|
||||||
|
else
|
||||||
|
echo "HARD-FAIL (Reflektiertheits-Selbsttest): per-Source-Struktur wurde NICHT erkannt — Mechanik vacuous (FR-7 AC-4)" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "--- Producer-Umbau vor Run-Abschluss (NFR-4): die Aussagen werden integriert, je Aussage mit Provenienz-Tag (§5.5) ---"
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-a.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-b.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1).
|
||||||
|
Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus (raw/synth-b.md#S-1).
|
||||||
|
EOF
|
||||||
|
sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md
|
||||||
|
log_anlage delta "raw/synth-a.md + raw/synth-b.md"
|
||||||
|
# KEIN git add -A auf wiki/: delta.md ungetrackt ($??, legitimer Ziel-Pfad) —
|
||||||
|
# Pkt.-8-Duplikat-Kontrolle über die ??-Sicht wird lebendig geprüft.
|
||||||
|
echo "--- Assertion: nach dem Umbau ist der Selbsttest leer (Integration hergestellt), nicht nur vertuscht ---"
|
||||||
|
if grep -qE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then
|
||||||
|
echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur nach Umbau noch vorhanden (FR-7 AC-4)" >&2; exit 1
|
||||||
|
else
|
||||||
|
echo "RESULT: PASS — Aneinanderreihung erkannt und durch integrierte, provenance-versehene Aussagen ersetzt (NFR-4: textuell benannt, vor Run-Abschluss behoben)"
|
||||||
|
fi
|
||||||
|
echo "--- Probe (erlaubt: delta + index + log) ---"; probe
|
||||||
|
assert_invariant "delta index log"
|
||||||
|
assert_frontmatter wiki/delta.md raw/synth-a.md raw/synth-b.md
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "S4: SYNTHESE-UPDATE — Synthese-Einheit trifft bestehenden Concept-Pfad -> §5.9-Formwahl + sources-Zuwachs um die zweite Quelle"
|
||||||
|
isolate s4
|
||||||
|
cat > raw/alpha-v2.md <<'EOF'
|
||||||
|
### S-3
|
||||||
|
Evidenz v2 (neue Aussage): Alpha ergaenzt die deterministische Init-Sequenz um einen zusaetzlichen Sync-Schritt.
|
||||||
|
EOF
|
||||||
|
cat > raw/alpha-v3.md <<'EOF'
|
||||||
|
### S-3
|
||||||
|
Evidenz v3 (neue Aussage): Alpha-Repraesentationen wachsen um einen kompakten Rotationsindex.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/alpha-v2.md + raw/alpha-v3.md (zwei Quellen, Thema Alpha)"
|
||||||
|
echo "--- Synthese-Stimulus: zwei belegende raw/-Quellen zum selben Thema (Alpha) treffen den bestehenden Pfad alpha (Kandidatenliste §3 Pkt. 2) -> §5.9-Update ---"
|
||||||
|
echo "--- §5.9-Formwahl: neue belegte Aussagen (kein Ersatz, keine Schaerfung bestehender Formulierung) -> ERWEITERN (erste zutreffende Form) ---"
|
||||||
|
cat >> wiki/alpha.md <<'EOF'
|
||||||
|
Alpha ergänzt die deterministische Init-Sequenz um einen zusätzlichen Sync-Schritt (raw/alpha-v2.md#S-3).
|
||||||
|
Alpha-Repräsentationen wachsen um einen kompakten Rotationsindex (raw/alpha-v3.md#S-3).
|
||||||
|
EOF
|
||||||
|
add_source wiki/alpha.md raw/alpha-v2.md s2
|
||||||
|
add_source wiki/alpha.md raw/alpha-v3.md s3
|
||||||
|
bump_at wiki/alpha.md
|
||||||
|
log_update alpha "raw/alpha-v2.md + raw/alpha-v3.md"
|
||||||
|
# KEIN git add -A auf wiki/: alpha.md + log.md bleiben modifiziert-ungetrackt
|
||||||
|
# (porcelain ' M '); die Pkt.-8-??-Probe und der git-diff-Baseline-Vergleich
|
||||||
|
# lesen Worktree-Zustand, kein Staging nötig (isolate resettet je Szenario).
|
||||||
|
echo "--- Assertion: sources-Zuwachs um beide Quellen (>= 2 belegende Quellen, §5.10 Pkt. 2); bestehende Eintraege unveraendert ---"
|
||||||
|
grep -qF ' - resource: raw/alpha-v1.md' wiki/alpha.md || { echo "HARD-FAIL: bestehender sources-Eintrag alpha-v1 verloren (keine Entfernung ohne Beleg)" >&2; exit 1; }
|
||||||
|
grep -qF ' - resource: raw/alpha-v2.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-v2 fehlt" >&2; exit 1; }
|
||||||
|
grep -qF ' - resource: raw/alpha-v3.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-v3 fehlt" >&2; exit 1; }
|
||||||
|
assert_sources_lex wiki/alpha.md
|
||||||
|
echo "--- Assertion: gemischte Belege neu (v2/v3), bestehende belegte Aussagen byte-identisch (Struktur-Erhaltungsregel Erweitern, §5.9 Pkt. 2) ---"
|
||||||
|
grep -qF '(raw/alpha-v2.md#S-3)' wiki/alpha.md || { echo "HARD-FAIL: Beleg alpha-v2#S-3 fehlt" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/alpha-v3.md#S-3)' wiki/alpha.md || { echo "HARD-FAIL: Beleg alpha-v3#S-3 fehlt" >&2; exit 1; }
|
||||||
|
grep -qF 'Das Alpha-Protokoll definiert eine deterministische Init-Sequenz (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 wurde beim Synthese-Update umgeschrieben (Struktur-Erhaltung)" >&2; exit 1; }
|
||||||
|
grep -qF 'Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 2 wurde beim Synthese-Update umgeschrieben (Struktur-Erhaltung)" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: log.md-Eintrag 'Story 3.1-Update' (Pkt. 7) + Reflektiertheit (AC-4) ---"
|
||||||
|
grep -qF 'Story 3.1-Update: alpha' wiki/log.md || { echo "HARD-FAIL: Story 3.1-Update-Eintrag in log.md fehlt (Pkt. 7)" >&2; exit 1; }
|
||||||
|
if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/alpha.md; then
|
||||||
|
echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur (FR-7 AC-4)" >&2; exit 1
|
||||||
|
else
|
||||||
|
echo "RESULT: PASS — Synthese-Update: ein Ziel-Pfad, sources-Zuwachs s2+s3, gemischte Belege, bestehende Aussagen byte-identisch"
|
||||||
|
fi
|
||||||
|
echo "--- Probe (Pkt. 5; erlaubt: alpha (Update) + log — der Index-Link bleibt unveraendert, §5.9 Pkt. 3) ---"; probe
|
||||||
|
assert_invariant "alpha log"
|
||||||
|
assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-v2.md raw/alpha-v3.md
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "S5: STRUKTUR-/FRONTMATTER-INVARIANTE — unbefugter Key oder nicht-lexikografische sources verletzt die Synthese-Struktur-Ebene (Pkt. 8, §5.9 Pkt. 5-Struktur-Ebene; P2-Element (6))"
|
||||||
|
isolate s5
|
||||||
|
echo "--- simulierter Verstoß: unbefugter Frontmatter-Key 'foo' in einem Synthese-Concept ---"
|
||||||
|
# Setup als regelkonforme Anlage (delta + Index-Link + log-Eintrag) — die Pfad-
|
||||||
|
# Set-Ebene ist damit legitim; der VERSTOSS sitzt ausschließlich in der Struktur-
|
||||||
|
# Ebene (unbefugter Key 'foo:', Vertrag §3.3/§3.4-Subset, P2-Element (6)).
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-a.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-b.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
foo: bar
|
||||||
|
---
|
||||||
|
Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1).
|
||||||
|
EOF
|
||||||
|
sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md
|
||||||
|
log_anlage delta "raw/synth-a.md + raw/synth-b.md"
|
||||||
|
# KEIN git add -A auf wiki/: delta.md ungetrackt — die Pkt.-8-??-Sicht wird
|
||||||
|
# in diesem Struktur-Szenario selbst geprüft.
|
||||||
|
echo "--- Assertions (erwartet: Frontmatter-Subset-HARD-FAIL, Verstoß textuell benannt, NFR-4; non-exiting Variante, denn der Szenario-Zweck ist das ERKENNEN, nicht eine positive Invarianten-Erwartung) ---"
|
||||||
|
# (a) Path-Set-Ebene: die Erhaltungs-Invariante selbst muss hier GEHALTEN sein
|
||||||
|
# (delta/index/log sind legitime Einträge); andernfalls wäre der Szenario-
|
||||||
|
# Zustand selbst schon inkonsistent (Pkt. 8, §5.9 Pkt. 5) — dann HARD-FAIL.
|
||||||
|
if inv_viol "delta index log"; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
echo "HARD-FAIL (Struktur-Ebene): Erhaltungs-Invariante unerwartet verletzt (unbefugter Pfad / neue Datei) — Szenario-Zustand inkonsistent (Pkt. 8)" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# (b) Struktur-Ebene: der unbefugte Key 'foo:' MUSS erkannt werden (P2-Element (6),
|
||||||
|
# Vertrag §3.3/§3.4-Subset) — wenn nicht, ist die Erkennungs-Mechanik vacuous.
|
||||||
|
if assert_frontmatter_ok wiki/delta.md; then
|
||||||
|
echo "HARD-FAIL (Struktur-Ebene): unbefugter Frontmatter-Key wurde NICHT erkannt (P2-Element (6))" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
# (c) Pkt.-8-??-Negativkontrolle: eine UNGETRACKTE neue Datei AUSSERHALB der
|
||||||
|
# erlaubten Ziel-Pfade {delta index log} MUSS als Duplikat/Ghost-Diff
|
||||||
|
# HARD-FAILn (Pkt. 8 „keine neue Datei außer echten Ziel-Pfaden"; Story-
|
||||||
|
# 3.3-U9-Muster) — erkennt inv_viol die Verletzung, ist die Kontrolle
|
||||||
|
# nicht vacuous; erst danach ist die Setup-Zeile (virtueller Ortungs-
|
||||||
|
# Re-Run) zu entfernen und der Zustand für die positive Probe wiederherzustellen.
|
||||||
|
echo "--- Pkt.-8-??-Negativkontrolle: ungetrackte Nicht-Ziel-Datei muss als Duplikat/Ghost-Diff HARD-FAILn ---"
|
||||||
|
cat > wiki/ghost.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-a.md
|
||||||
|
id: s1
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Ghost-Diff-Versuch: keine echte Ziel-Pfad-Berechtigung.
|
||||||
|
EOF
|
||||||
|
echo "--- Probe mit erwartet-negativer Sicht: git-diff zeigt ghost + delta/index/log; ??-Sicht listet ghost + delta ---"
|
||||||
|
{ git diff --name-only "$BASE" -- wiki/ ; git diff --cached --name-only "$BASE" -- wiki/ ; git status --porcelain -- wiki/ | awk '{print $2}'; } \
|
||||||
|
| sed -e 's|^wiki/||' -e 's|\.md$||' | LC_ALL=C sort -u | paste -sd' ' -
|
||||||
|
if inv_viol "delta index log"; then
|
||||||
|
# inv_viol = 0 => KEINE Verletzung gemeldet => ghost.md wurde NICHT erkannt
|
||||||
|
# (die ??-Sicht/der Diff ignorieren die Nicht-Ziel-Datei) => Kontrolle vacuous
|
||||||
|
echo "HARD-FAIL (Pkt. 8-??-Probe): ghost.md ausserhalb der erlaubten Ziel-Pfade wurde NICHT als Duplikat/Ghost-Diff erkannt — Kontrolle vacuous" >&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
# inv_viol != 0 => Verletzung gemeldet => ghost.md als Duplikat/Ghost-Diff erkannt
|
||||||
|
echo "BEFUND: ghost.md als Duplikat/Ghost-Diff erkannt (inv_viol meldet Verletzung, NFR-4) — Pkt.-8-??-Kontrolle ist nicht vacuous"
|
||||||
|
fi
|
||||||
|
rm wiki/ghost.md
|
||||||
|
echo "RESULT: PASS — unbefugter Key im Synthese-Concept wird als Struktur-Verstoß erkannt (Frontmatter-Subset-HARD-FAIL, textuell benannt); Pkt.-8-??-Negativkontrolle nicht vacuous"
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "N1: NO_OP-SYNTHESE — Evidenz bereits vollständig im Body: keine Form greift -> No-Op (Nicht-Form), volle Byte-Identität (§5.10 Pkt. 3/8, §5.9 Pkt. 2)"
|
||||||
|
isolate n1
|
||||||
|
# Eine ZWEITE committete Quelle desselben Themas mit REDUNDANTER Evidenz: die
|
||||||
|
# Aussage (deterministische Init-Sequenz) existiert bereits im Body — belegt aus
|
||||||
|
# alpha-v1#S-1 (Baseline-Beleg; alpha-v1 ist die bestehende Evidenzbasis, NICHT
|
||||||
|
# Zuwachs). Die Zuwachs-Quelle alpha-syno.md (Anker #S-3) paraphrasiert dieselbe
|
||||||
|
# erkannte Wissenseinheit — kein neuer Befund, keine Schaerfung, kein Ersatz ->
|
||||||
|
# die Abgrenzungs-Reihenfolge §5.9 Pkt. 2 greift auf keiner Update-Form; die
|
||||||
|
# Synthese-Einheit läuft auf NO-OP (keine Form-Anwendung, keine Mutations-Phase
|
||||||
|
# — im Zweifel greift eine Form, engere Auslegung No-Op).
|
||||||
|
cat > raw/alpha-syno.md <<'EOF'
|
||||||
|
### S-3
|
||||||
|
Evidenz (synonym wiedergegeben): das Alpha-Protokoll definiert eine deterministische Init-Sequenz.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/alpha-syno.md (redundante Evidenz zum Thema Alpha)"
|
||||||
|
echo "--- Synthese-Stimulus: die ZUWACHS-Quelle alpha-syno.md + die bestehende Evidenzbasis (alpha-v1, Baseline) belegen dasselbe Thema — die neue committete Evidenz (§1 Pkt. 1) ist alpha-syno.md ---"
|
||||||
|
echo "--- Abgrenzung §5.9 Pkt. 2: kein Ersatz / keine Schaerfung / keine NEUE belegte Aussage -> NO-OP (Nicht-Form) ---"
|
||||||
|
echo "--- RUN (No-Op): keine Mutations-Phase -> Bundle byte-identisch zum Baseline (kein Eintrag, kein at-Bump, kein sources-Zusatz) ---"
|
||||||
|
ALPHA_BEFORE=$(sha256sum wiki/alpha.md | cut -d' ' -f1)
|
||||||
|
LOG_BEFORE=$(sha256sum wiki/log.md | cut -d' ' -f1)
|
||||||
|
INDEX_BEFORE=$(sha256sum wiki/index.md | cut -d' ' -f1)
|
||||||
|
AT_BEFORE=$(grep -E '^ at: ' wiki/alpha.md)
|
||||||
|
# Die Mutations-Phase unterbleibt ex definitione; der Nachweis ist die volle
|
||||||
|
# Byte-Identität des Bundles (grept nichts, schreibt nichts, committet nichts).
|
||||||
|
ALPHA_AFTER=$(sha256sum wiki/alpha.md | cut -d' ' -f1)
|
||||||
|
LOG_AFTER=$(sha256sum wiki/log.md | cut -d' ' -f1)
|
||||||
|
INDEX_AFTER=$(sha256sum wiki/index.md | cut -d' ' -f1)
|
||||||
|
AT_AFTER=$(grep -E '^ at: ' wiki/alpha.md)
|
||||||
|
[ "$ALPHA_BEFORE" = "$ALPHA_AFTER" ] || { echo "HARD-FAIL (No-Op): alpha.md wurde trotz No-Op geaendert (byte-Identitaet, §5.9 Pkt. 2 / §5.10 Pkt. 3)" >&2; exit 1; }
|
||||||
|
[ "$LOG_BEFORE" = "$LOG_AFTER" ] || { echo "HARD-FAIL (No-Op): log.md wurde trotz No-Op geaendert (kein Eintrag, Pkt. 7-Negation)" >&2; exit 1; }
|
||||||
|
[ "$INDEX_BEFORE" = "$INDEX_AFTER" ] || { echo "HARD-FAIL (No-Op): index.md wurde trotz No-Op geaendert (kein neuer Link, Punkt-11-Negation)" >&2; exit 1; }
|
||||||
|
[ "$AT_BEFORE" = "$AT_AFTER" ] || { echo "HARD-FAIL (No-Op): generated.at-Bump trotz No-Op (kein at-Bump, §5.9 Pkt. 2)" >&2; exit 1; }
|
||||||
|
grep -qF ' - resource: raw/alpha-syno.md' wiki/alpha.md && { echo "HARD-FAIL (No-Op): sources-Zuwachs trotz No-Op (kein sources-Zusatz, §5.9 Pkt. 2)" >&2; exit 1; }
|
||||||
|
grep -q 'Synthese-Anlage\|Story 3.1-Update' wiki/log.md && { echo "HARD-FAIL (No-Op): log-Eintrag trotz No-Op (kein Eintrag)" >&2; exit 1; }
|
||||||
|
echo "--- Probe: erwartet LEER (Ghost-Diff-negativ; ein No-Op erzeugt keinen Diff, §5.9 Pkt. 5) ---"; probe
|
||||||
|
assert_invariant ""
|
||||||
|
echo "RESULT: PASS — No-Op-Synthese: byte-identisch (alpha/index/log), kein at-Bump, kein sources-Zusatz, kein log-Eintrag, keine neue Datei"
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "N2: DISAGREEMENT (AD-16-Default, §5.10 Pkt. 3/7) — widersprüchliche Aussagen aus zwei Quellen werden NICHT still zusammengeführt; beide Behauptungen bleiben + Disagreement-Eintrag in log.md (Epic-4-Interface)"
|
||||||
|
isolate n2
|
||||||
|
# Zwei committete Quellen mit DISKREPANTEM Inhalt zur selben erkannten
|
||||||
|
# Wissenseinheit (Quorum-Konsens): Quelle A behauptet „synchrone Bestätigung",
|
||||||
|
# Quelle B „asynchrone Bestätigung". AD-16-Default: kein stilles Zusammenführen
|
||||||
|
# zu einer scheinbar eindeutigen Aussage; die widersprüchlichen Aussagen bleiben
|
||||||
|
# als Bestand bestehen (je mit ihrem Beleg/Beschreibungsstil + §5.5-Marker).
|
||||||
|
cat > raw/synth-e.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz e: Quorum-Bestaetigungen erfolgen synchron.
|
||||||
|
### S-5
|
||||||
|
Evidenz e: Synchrone Quorum-Bestaetigungen halten die Replikate konsistent.
|
||||||
|
EOF
|
||||||
|
cat > raw/synth-f.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz f: Quorum-Bestaetigungen erfolgen asynchron.
|
||||||
|
### S-6
|
||||||
|
Evidenz f: Asynchrone Quorum-Bestaetigungen erhoehen die Latenz.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/synth-e.md + raw/synth-f.md (diskrepanter Befund zum selben Thema)"
|
||||||
|
echo "--- Synthese-Stimulus: zwei belegende Quellen desselben Themas mit WIDERSPRECHLICHEM Befund (S-1) ---"
|
||||||
|
echo "--- AD-16-Default (§5.10 Pkt. 3): KEINE stille Konsolidierung zu einer scheinbar eindeutigen Aussage; beide Behauptungen bleiben ---"
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-e.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-f.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Quorum-Bestaetigungen erfolgen synchron (raw/synth-e.md#S-1).
|
||||||
|
Quorum-Bestaetigungen erfolgen asynchron (raw/synth-f.md#S-1).
|
||||||
|
EOF
|
||||||
|
sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md
|
||||||
|
# Disagreement-Eintrag (AD-16/§5.10 Pkt. 7, Epic-4-Interface): mutierter
|
||||||
|
# Concept-Pfad + die beiden konfligierenden Belege + Baseline-Commit.
|
||||||
|
printf '\n## 2026-08-19\n- Disagreement: delta — raw/synth-e.md#S-1 vs. raw/synth-f.md#S-1 (kein stilles Zusammenfuehren, AD-16; Baseline %s)\n' "$BASE" >> wiki/log.md
|
||||||
|
# KEIN git add -A auf wiki/: delta.md + log.md ungetrackt-modifiziert (??-Sicht lebendig).
|
||||||
|
echo "--- Assertion: BEIDE Behauptungen bleiben erhalten (kein stilles Zusammenfuehren, keine Beleg-Tilgung AD-4) ---"
|
||||||
|
grep -qF 'Quorum-Bestaetigungen erfolgen synchron (raw/synth-e.md#S-1).' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Aussage e#S-1 wurde still entfernt oder umgeschrieben (AD-16)" >&2; exit 1; }
|
||||||
|
grep -qF 'Quorum-Bestaetigungen erfolgen asynchron (raw/synth-f.md#S-1).' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Aussage f#S-1 wurde still entfernt oder umgeschrieben (AD-16)" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/synth-e.md#S-1)' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Beleg e#S-1 fehlt (AD-4)" >&2; exit 1; }
|
||||||
|
grep -qF '(raw/synth-f.md#S-1)' wiki/delta.md || { echo "HARD-FAIL (Disagreement): Beleg f#S-1 fehlt (AD-4)" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: KEINE falsche Multi-Beleg-Konsolidierung der widerspruchlichen Aussagen (kein '(e; f)'-Zusammenfuehren) ---"
|
||||||
|
if grep -qF '(raw/synth-e.md#S-1; raw/synth-f.md#S-1)' wiki/delta.md; then
|
||||||
|
echo "HARD-FAIL (Disagreement): widerspruechliche Aussagen wurden als ein Multi-Beleg zusammengefuehrt (AD-16-Default verletzt, Schein-Eindeutigkeit)" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "--- Assertion: Disagreement-Eintrag in log.md (Pkt. 7, AD-16, Epic-4-Interface) ---"
|
||||||
|
grep -qF 'Disagreement: delta' wiki/log.md || { echo "HARD-FAIL (Disagreement): Disagreement-Eintrag in log.md fehlt (§5.10 Pkt. 7)" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: Reflektiertheit (AC-4) + sources-Lexikografie ---"
|
||||||
|
if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then
|
||||||
|
echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur trotz Disagreement (FR-7 AC-4)" >&2; exit 1
|
||||||
|
fi
|
||||||
|
assert_sources_lex wiki/delta.md
|
||||||
|
echo "--- Probe (erlaubt: delta + index + log) ---"; probe
|
||||||
|
assert_invariant "delta index log"
|
||||||
|
assert_frontmatter wiki/delta.md raw/synth-e.md raw/synth-f.md
|
||||||
|
echo "RESULT: PASS — Disagreement: beide Behauptungen + je Beleg bleiben; kein stilles Zusammenfuehren (AD-16-Default); log.md-Disagreement-Eintrag (Epic-4-Interface)"
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "N3: AD-4c-UEBERNAHME-MARKER (Kontext-Marker, §5.10 Pkt. 4) — übernommene Formulierung aus einem bestehenden Concept traegt den §5.5-Kontext-Marker, nie alleinige Provenienz"
|
||||||
|
isolate n3
|
||||||
|
# Eine Synthese-Einheit übernimmt eine Formulierung aus einem BESTEHENDEN Concept
|
||||||
|
# (gamma): sie ist eine Kontext-/Synthese-Umformulierung, NICHT eigenständig
|
||||||
|
# gegen die Zuwachs-Quelle belegt. AD-4c: kein bestehendes Concept ist alleinige
|
||||||
|
# Provenienz eines anderen — die Übernahme trägt den §5.5-Kontext-Marker und
|
||||||
|
# bleibt textuell auf die Quelle des übernommenen Concepts rückverfolgbar.
|
||||||
|
cat > raw/synth-g.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz g: Delta-Operationen respektieren die gamma-Kopplung.
|
||||||
|
EOF
|
||||||
|
cat > raw/synth-h.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz h: Delta-Operationen verlangen die gamma-Kopplungs-Pruefung.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/synth-g.md + raw/synth-h.md (Uebernahme-Thema)"
|
||||||
|
echo "--- Synthese-Einheit: zwei Zuwachs-Quellen (synth-g/h) zum selben Thema; die Kopplungs-Formulierung wird aus dem bestehenden Concept gamma uebernommen (AD-4c) ---"
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-g.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-h.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Delta-Operationen respektieren die Gamma-Kopplung (raw/synth-g.md#S-1).
|
||||||
|
Delta-Operationen verlangen die Gamma-Kopplungs-Pruefung (raw/synth-h.md#S-1).
|
||||||
|
Gamma-Kopplung: übernommen aus gamma auf Basis von raw/gamma-v1.md#S-1, nicht eigenständig belegt.
|
||||||
|
EOF
|
||||||
|
sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md
|
||||||
|
log_anlage delta "raw/synth-g.md + raw/synth-h.md"
|
||||||
|
# KEIN git add -A auf wiki/: delta.md + log.md ungetrackt-modifiziert (??-Sicht lebendig).
|
||||||
|
echo "--- Assertion: die uebernommene Formulierung traegt den §5.5-Kontext-Marker (Muster „übernommen aus <Concept> auf Basis von <source>, nicht eigenständig belegt“) ---"
|
||||||
|
grep -qF 'übernommen aus gamma auf Basis von raw/gamma-v1.md#S-1, nicht eigenständig belegt' wiki/delta.md || { echo "HARD-FAIL (AD-4c): Kontext-Marker fehlt oder falsch (Muster §5.10 Pkt. 4 / §5.5-Pkt.-2)" >&2; exit 1; }
|
||||||
|
grep -qF 'nicht eigenständig belegt' wiki/delta.md || { echo "HARD-FAIL (AD-4c): 'nicht eigenständig belegt'-Klausel fehlt (§5.10 Pkt. 4)" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: die eigenständig belegten Aussagen tragen KEINEN Kontext-Marker (Marker gilt nur für übernommene Formulierungen, Pkt. 4) ---"
|
||||||
|
grep -qE '^.*raw/synth-g\.md#S-1\).*übernommen aus' wiki/delta.md && { echo "HARD-FAIL (AD-4c): eigenständig belegte Aussage traegt faelschlich den Kontext-Marker (§5.10 Pkt. 4)" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: Reflektiertheit + sources-Lexikografie + kein gamma-Duplikat ---"
|
||||||
|
if grep -nE 'Quelle [A-Z]:|Source [A-Z]:' wiki/delta.md; then
|
||||||
|
echo "HARD-FAIL (Reflektiertheit): per-Source-Struktur (FR-7 AC-4)" >&2; exit 1
|
||||||
|
fi
|
||||||
|
assert_sources_lex wiki/delta.md
|
||||||
|
grep -qF ' - resource: raw/gamma-v1.md' wiki/delta.md && { echo "HARD-FAIL (AD-4c): gamma-v1 als eigene sources-Quelle eingetragen — die Quelle des übernommenen Concepts ist nur im Kontext-Marker, nicht als source (AD-4c)" >&2; exit 1; }
|
||||||
|
echo "--- Probe (erlaubt: delta + index + log) ---"; probe
|
||||||
|
assert_invariant "delta index log"
|
||||||
|
assert_frontmatter wiki/delta.md raw/synth-g.md raw/synth-h.md
|
||||||
|
echo "RESULT: PASS — AD-4c-Uebernahme: Kontext-Marker traegt Concept + Basis-Quelle + 'nicht eigenständig belegt'; gamma bleibt nicht Quellen-Provenienz von delta"
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "S6: ZWEI-RUN-IDENTITAET (AD-17h/A0-19) — gleicher Git-State + gleiches Eingabeset -> identischer Synthese-Vorgang"
|
||||||
|
run_synthese() { # $1 = Branchname; mutiert Worktree, dann git add -A (Staging)
|
||||||
|
isolate "$1"
|
||||||
|
cat > raw/synth-a.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz a: das Delta-Protokoll kapselt die Zustands-Replikation.
|
||||||
|
### S-2
|
||||||
|
Evidenz a: Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz.
|
||||||
|
EOF
|
||||||
|
cat > raw/synth-b.md <<'EOF'
|
||||||
|
### S-1
|
||||||
|
Evidenz b: Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus.
|
||||||
|
### S-2
|
||||||
|
Evidenz b: das Delta-Protokoll kapselt die Zustands-Replikation.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/synth-a.md + raw/synth-b.md"
|
||||||
|
cat > wiki/delta.md <<'EOF'
|
||||||
|
---
|
||||||
|
type: concept
|
||||||
|
sources:
|
||||||
|
- resource: raw/synth-a.md
|
||||||
|
id: s1
|
||||||
|
- resource: raw/synth-b.md
|
||||||
|
id: s2
|
||||||
|
generated:
|
||||||
|
by: wow-compiler/0.1.0
|
||||||
|
at: 2026-08-19T12:00:00Z
|
||||||
|
---
|
||||||
|
Das Delta-Protokoll kapselt die Zustands-Replikation (raw/synth-a.md#S-1).
|
||||||
|
Delta-Replikatbestaetigungen durchlaufen eine deterministische Quorum-Sequenz (raw/synth-a.md#S-2).
|
||||||
|
Delta-Betrieb setzt einen synchronen Konsens-Dienst voraus (raw/synth-b.md#S-1).
|
||||||
|
EOF
|
||||||
|
sed -i 's|^# Index$|# Index\n- [Delta](delta.md)|' wiki/index.md
|
||||||
|
log_anlage delta "raw/synth-a.md + raw/synth-b.md"
|
||||||
|
git add -A # Staging — die Mutationen sind Teil des Runs (Commit-Boundary = Mutations-Boundary)
|
||||||
|
}
|
||||||
|
run_synthese s6a
|
||||||
|
A_DELTA=$(sha256sum wiki/delta.md | cut -d' ' -f1)
|
||||||
|
A_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1)
|
||||||
|
A_INDEX=$(sha256sum wiki/index.md | cut -d' ' -f1)
|
||||||
|
git commit -qm "Run A (Synthese-Neu-Anlage)"
|
||||||
|
A_DELTA_COM=$(git show HEAD:wiki/delta.md | sha256sum | cut -d' ' -f1)
|
||||||
|
run_synthese s6b
|
||||||
|
B_DELTA=$(sha256sum wiki/delta.md | cut -d' ' -f1)
|
||||||
|
B_LOG=$(sha256sum wiki/log.md | cut -d' ' -f1)
|
||||||
|
B_INDEX=$(sha256sum wiki/index.md | cut -d' ' -f1)
|
||||||
|
git commit -qm "Run B (Synthese-Neu-Anlage)"
|
||||||
|
B_DELTA_COM=$(git show HEAD:wiki/delta.md | sha256sum | cut -d' ' -f1)
|
||||||
|
echo "Run A (delta.md): $A_DELTA ; Run B (delta.md): $B_DELTA"
|
||||||
|
echo "Run A (log.md): $A_LOG ; Run B (log.md): $B_LOG"
|
||||||
|
echo "Run A (index.md): $A_INDEX ; Run B (index.md): $B_INDEX"
|
||||||
|
echo "Run A commit (delta.md): $A_DELTA_COM ; Run B commit (delta.md): $B_DELTA_COM"
|
||||||
|
if [ "$A_DELTA" = "$B_DELTA" ] && [ "$A_LOG" = "$B_LOG" ] && [ "$A_INDEX" = "$B_INDEX" ] && [ "$A_DELTA_COM" = "$B_DELTA_COM" ]; then
|
||||||
|
echo "RESULT: PASS — zwei unabhaengige Synthese-Runs ueber dieselben zwei Quellen -> identisches Ergebnis (AD-17h/A0-19)"
|
||||||
|
else
|
||||||
|
echo "HARD-FAIL (Determinismus-Vertrag): Synthese-Run A und Run B weichen ab" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# =====================================================================
|
||||||
|
runlabel "FW: FORM-WAHL-KLASSIFIKATIONSPROBE (Story-3.3-Defer U2/U7) — gemischte Synthese-Einheit an der §5.9-Abgrenzungs-Reihenfolge Korrigieren -> Praezisieren -> Erweitern -> No-Op"
|
||||||
|
isolate fw
|
||||||
|
# Eine Synthese-Einheit mit KORRIGIERENDEM Anteil: ersetzt die bestehende belegte
|
||||||
|
# Aussage (Netze) als fehlerhaft/ueberholt -> erste zutreffende Form = KORRIGIEREN.
|
||||||
|
cat > raw/alpha-k1.md <<'EOF'
|
||||||
|
### S-2
|
||||||
|
Evidenz k1 (Korrektur): Alpha kann seit v2 auch isolierte Netze bedienen.
|
||||||
|
EOF
|
||||||
|
cat > raw/alpha-k2.md <<'EOF'
|
||||||
|
### S-2
|
||||||
|
Evidenz k2 (staerkt den Korrektur-Befund): die Netzbeschraenkung ist aufgehoben.
|
||||||
|
EOF
|
||||||
|
git add -A; git commit -qm "Zuwachs: raw/alpha-k1.md + raw/alpha-k2.md (korrigierende Synthese-Einheit)"
|
||||||
|
echo "--- Einheit traegt zugleich neuen Beleg (S-1 bleibt) und Ersetzungs-Befund (S-2) ---"
|
||||||
|
echo "--- Abgrenzungs-Reihenfolge §5.9 Pkt. 2: (1) Ersetzung fehlerhaft/ueberholt -> KORRIGIEREN (erste zutreffende Form; die uebrigen Textgenauigkeits-Rahmen gelten je Teilbestand) ---"
|
||||||
|
sed -i 's|^Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2)\.|Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2) — überholt durch: Alpha kann seit v2 auch isolierte Netze bedienen (raw/alpha-k1.md#S-2; raw/alpha-k2.md#S-2).|' wiki/alpha.md
|
||||||
|
add_source wiki/alpha.md raw/alpha-k1.md s2
|
||||||
|
add_source wiki/alpha.md raw/alpha-k2.md s3
|
||||||
|
bump_at wiki/alpha.md
|
||||||
|
log_update alpha "raw/alpha-k1.md + raw/alpha-k2.md"
|
||||||
|
# KEIN git add -A auf wiki/: alpha.md + log.md modifiziert-ungetrackt (Probe
|
||||||
|
# liest git-diff + porcelain); isolate resettet je Szenario.
|
||||||
|
echo "--- Assertion: Abloesung mit Ersetzungsbeleg (keine stille Loeschung, AD-16-Default), alter Wortlaut erhalten, Multi-Beleg im Ersatz ---"
|
||||||
|
grep -qF 'Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2)' wiki/alpha.md || { echo "HARD-FAIL: alter Wortlaut wurde still geloescht (AD-16, Korrigieren-Struktur-Erhaltung)" >&2; exit 1; }
|
||||||
|
grep -qF 'überholt durch: Alpha kann seit v2 auch isolierte Netze bedienen (raw/alpha-k1.md#S-2; raw/alpha-k2.md#S-2)' wiki/alpha.md || { echo "HARD-FAIL: Ersetzungsbeleg fehlt oder ist kein Multi-Beleg (Form-Wahl-Klassifikation)" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: Nebenbefund (Aussage 1) bleibt byte-identisch (kein stiller Umbau, Textgenauigkeits-Rahmen) ---"
|
||||||
|
grep -qF 'Das Alpha-Protokoll definiert eine deterministische Init-Sequenz (raw/alpha-v1.md#S-1).' wiki/alpha.md || { echo "HARD-FAIL: Aussage 1 beim Korrigieren flankierend umgeschrieben" >&2; exit 1; }
|
||||||
|
echo "--- Assertion: sources >= 2 (beide korrigierende Quellen) + lexikografische Ordnung ---"
|
||||||
|
grep -qF ' - resource: raw/alpha-k1.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-k1 fehlt" >&2; exit 1; }
|
||||||
|
grep -qF ' - resource: raw/alpha-k2.md' wiki/alpha.md || { echo "HARD-FAIL: sources-Zuwachs alpha-k2 fehlt" >&2; exit 1; }
|
||||||
|
assert_sources_lex wiki/alpha.md
|
||||||
|
echo "--- Probe (erlaubt: alpha + log) ---"; probe
|
||||||
|
assert_invariant "alpha log"
|
||||||
|
assert_frontmatter wiki/alpha.md raw/alpha-v1.md raw/alpha-k1.md raw/alpha-k2.md
|
||||||
|
echo
|
||||||
|
echo "===== Sandbox abgeschlossen (S1-S6 + N1-N3 + Form-Wahl-Probe) ====="
|
||||||
|
echo "Sandbox-Root: $ROOT (loeschbar: rm -rf $ROOT)"
|
||||||
|
|
||||||
+142
@@ -0,0 +1,142 @@
|
|||||||
|
---
|
||||||
|
title: 'Wissen aus mehreren Sources synthetisieren — gemischte claim-granulare Provenienz operationalisieren (Story 3.4)'
|
||||||
|
type: 'feature'
|
||||||
|
created: '2026-08-19'
|
||||||
|
status: 'done'
|
||||||
|
review_loop_iteration: 0
|
||||||
|
baseline_commit: 9b256fa5adc22fceb1e28a07efbf4504e0004878
|
||||||
|
context:
|
||||||
|
- _bmad-output/implementation-artifacts/epic-3-context.md
|
||||||
|
---
|
||||||
|
|
||||||
|
<frozen-after-approval reason="human-owned intent — do not modify unless human renegotiates">
|
||||||
|
|
||||||
|
## Intent
|
||||||
|
|
||||||
|
**Problem:** §5.9 verankert die Update-Formen einzelner Concepts (Story 3.1/3.3), §4 die `sources`-Liste. Unoperativ bleibt die **Synthese-Dimension (FR-7, AD-4, A0-3)**: wie der Producer mehrere Sources zum selben Thema zu **einer** gemeinsamen Wissensrepräsentation mit **gemischter, claim-granularer Provenienz** zusammenführt — statt getrennter Zusammenfassungen (FR-7). Es fehlt eine deterministische Anleitung für (a) die Erkennung einer Synthese-Einheit (≥ 2 belegende `raw/`-Quellen), (b) die Konsolidierung redundanter Aussagen **ohne** Provenienz-Verlust (Multi-Beleg, §5.5), und (c) den reflektierten Wissensstand (keine Aneinanderreihung von Source-Zusammenfassungen, FR-7 AC-4). Der §7-Synthese-Vorbehalt (`:343`) zeigt auf Story 3.4.
|
||||||
|
|
||||||
|
**Approach:** Story 3.4 verankert die Synthese-Mechanik als neue Sektion **§5.10 „Synthese aus mehreren Sources (Story 3.4)"** (nach §5.9, vor §6, Revision 2.9): deterministische Regeln für Synthese-Einheit, gemeinsame Zielrepräsentation (ein Concept-Pfad, `sources`-Liste ≥ 2), claim-granulare gemischte Provenienz mit Multi-Beleg-Konsolidierung (§5.5) und Reflektiertheits-Selbsttest (keine per-Source-Zusammenfassungs-Struktur). Zusätzlich eine **re-executierbare Sandbox** (`sandbox-3-4/run-sandbox.sh`, Muster Story-3.3): demonstriert einen echten Synthese-Run aus 2+ `raw/`-Quellen (Neu-Anlage + Update-Pfad) und assertet die Invarianten hart (sources ≥ 2, Multi-Beleg je konsolidierter Aussage, keine Aneinanderreihung, Erhaltungs-Invariante §5.9-Pkt.-5, Zwei-Run-Identität AD-17h). Nickel die Story-3.3-Defer U2/U7-Empfehlung (Form-Wahl-Klassifikationsprobe) im Sandbox auf. Keine Inhalts-Mutation des realen Bundles (AD-3); kein neues `raw/`-Material; kein Standalone (D-3).
|
||||||
|
|
||||||
|
## Boundaries & Constraints
|
||||||
|
|
||||||
|
**Always:**
|
||||||
|
- **Instruktions-Story (D-3):** Verankerung ausschließlich in `schema/compiler.md` §5.10 als deterministischer Text. Kein executable, kein Standalone, keine neue §7-Invaliditätsklasse, kein Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3).
|
||||||
|
- **Synthese ist Querschnitt-Dimension, keine fünfte Update-Form:** Die §5.9-Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` (Story 3.3) bleibt die **sole** Form-Wahl; Synthese erweitert die Ausführung um gemischte Provenienz + Konsolidierung (bei Update auf ein bestehendes Concept) bzw. die Neu-Anlage mit Multi-Source-`sources` (bei neuer Einheit).
|
||||||
|
- **Gemischte claim-granulare Provenienz (AD-4a/4b, A0-3):** jede belegte Aussage des Synthese-Concepts bleibt auf `raw/` zurückführbar; Konsequenz von AD-4c — kein bestehendes Concept ist alleinige Provenienz eines anderen; Übernahmen aus bestehenden Concepts tragen den §5.5-Kontext-Marker („übernommen aus `<Concept>` auf Basis von `<source>`, nicht eigenständig belegt").
|
||||||
|
- **Konsolidierung ohne Provenienz-Verlust (FR-7 AC-3):** redundante Informationen werden zu einer Aussage konsolidiert, die **alle** betroffenen Inline-Belege trägt (Multi-Beleg, §5.5-Serialisierung) — keine stille Beleg-Tilgung (AD-4).
|
||||||
|
- **Reflektierter Wissensstand (FR-7 AC-4):** keine per-Source-Zusammenfassungs-Blöcke („Quelle A: … / Quelle B: …"-Struktur); der Body trägt integrierte, je Aussage provenance-tags versehene Aussagen — textuell per Selbsttest prüfbar.
|
||||||
|
- **Determinismus (AD-17h/A0-19):** Ziel-Pfad (via §3.2/§5.7), `sources`-Liste (lexikografisch nach `resource`, LC_ALL=C) und Konsolidierung folgen deterministisch aus der committeten Evidenz; gleicher Git-State + gleiche Eingabemenge → identischer Synthese-Vorgang. `generated.at`-Wanduhr-Gap bleibt offene A0-20-Konvention (Home Story 3.8).
|
||||||
|
- **Struktur-Erhaltung (FR-6/AC-2, Story 3.3):** die §5.9-Pkt.-2-Struktur-Erhaltungsregeln gelten je berührtem Pfad unverändert (Frontmatter-Subset, keine stille Löschung, §5.6-Pin unverändert, Inline-Verweise gültig soweit Beleg Body-Bestand).
|
||||||
|
- **Erhaltungs-Invariante (AD-5/FT-6):** der §5.9-Pkt.-5-Diff-Selbsttest gilt für Synthese-Runs unverändert (Pfad-Menge ⊆ Kandidatenliste ∪ Neu-Anlage ∪ `log.md` ∪ Index; keine neue Datei außer echten Ziel-Pfaden).
|
||||||
|
- `sprint-status.yaml`: Key `3-4-wissen-aus-mehreren-sources-synthetisieren` → **in-progress** (bei Implementierung).
|
||||||
|
|
||||||
|
**Ask First:** Inhalts-Mutation des realen Bundles (Demo per Sandbox) · AD-7d-Renames · §5.6-Linkform-Änderung · Validator-/Vertrags-/`raw/`-Change · Leasing-Ausweitung (3.5/3.6-Scope) · Synthese als fünfte Update-Form (Abgrenzung ändern) · per-Source-Concepts als zulässige Anlageform.
|
||||||
|
|
||||||
|
**Never:** Änderungen an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3) · neue §7-Invaliditätsklasse · Standalone (D-3) · getrennte Zusammenfassungs-Concepts je Quelle (FR-7) · Duplikat-Anlage eines bestehenden Pfads · „Regenerate Everything" (AD-5) · stille Provenienz-Tilgung oder stille Konsolidierung widersprechender Aussagen ohne Ersetzungsbeleg (AD-16) · Embeddings/Vector im Compiler-Kern (AD-13).
|
||||||
|
|
||||||
|
## I/O & Edge-Case Matrix
|
||||||
|
|
||||||
|
| Scenario | Input / State | Expected Output / Behavior | Error Handling |
|
||||||
|
|----------|--------------|---------------------------|----------------|
|
||||||
|
| HAPPY_SYNTHESE_NEUANLAGE | Zwei committete `raw/`-Quellen zum selben Thema (neue Einheit, kein Ziel-Pfad belegt) | **Ein** neues Concept (gemeinsame Repräsentation): `sources`-Liste ≥ 2 (je Quelle ein Eintrag, lexikografisch nach `resource`), claim-granulare gemischte Inline-Provenienz je Aussage, §5.5-Form; kein per-Source-Summary | NO_MATCH → §5.9/§3.2-Pfad (keine Synthese-Dimension) |
|
||||||
|
| HAPPY_SYNTHESE_KONSOLIDIERUNG | Redundante Aussage in beiden Quellen | **Eine** konsolidierte Aussage mit Multi-Beleg auf alle betroffenen Quellen (§5.5-Semikolon-Form) — keine Provenienz-Dropped | Quellen-EC-1 fehlt → Run-FAIL (Validator), keine Mutation |
|
||||||
|
| HAPPY_SYNTHESE_UPDATE | Synthese-Einheit trifft bestehenden Concept-Pfad | §5.9-Formwahl normal (Erweitern/Präzisieren/Korrigieren), `sources`-Zuwachs um die zweite Quelle, gemischte Belege; Struktur-Erhaltungsregeln gelten | bestehende belegte Aussage als Anker fehlt → Prüfung ob Erweitern |
|
||||||
|
| NO_OP_SYNTHESE | Evidenz bereits vollständig im Body | No-Op (Nicht-Form): byte-identität, kein Eintrag, kein `at`-Bump | im Zweifel greift eine Form (engere Auslegung No-Op) |
|
||||||
|
| ANEINANDERREIHUNG_NEGATIV | Struktur „Quelle A: … / Quelle B: …" | **Instruktions-Selbsttest-FAIL** (Reflektiertheits-Kriterium, NFR-7): textuell benannter Befund, vor Run-Abschluss behoben | kein stiller Vorbeilass (NFR-4) |
|
||||||
|
| STRUKTUR_ERHALT | Synthese-Update greift in Body mit belegten Aussagen | Struktur unverändert (Subset, Verweise, Linkform); kein unbefugter Key | Verstoß → textuell benannt + Rollback (§5.9 Pkt. 5) |
|
||||||
|
| SYNTHESE_OVERLAP_FORMCROSS | Eine Einheit trägt zugleich neue + schärfende Aussage | §5.9-Abgrenzungs-Reihenfolge wählt die erste zutreffende Form; Textgenauigkeits-Rahmen der übrigen gelten je Teilbestand | — (AD-17h: deterministisch) |
|
||||||
|
|
||||||
|
</frozen-after-approval>
|
||||||
|
|
||||||
|
## Code Map
|
||||||
|
|
||||||
|
- `schema/compiler.md` — **primär mutiert** (D-3):
|
||||||
|
- Neue Sektion **§5.10** (nach §5.9, vor §6): Synthese-Stimulus (≥ 2 belegende Quellen per §2-Interpretation), ein-Ziel-Repräsentation (§5.7-Routing), `sources`-Liste (≥ 2, lexikografisch nach `resource`, LC_ALL=C — deterministisch, AD-17h), gemischte claim-granulare Provenienz (je Aussage Inline-`raw/`-Verweis §5.5; konsolidierte Aussagen mit Multi-Beleg), Reflektiertheits-Selbsttest (keine per-Source-Zusammenfassungs-Struktur; Muster-Termane wie „nicht eigenständig belegt"), Übernahme aus bestehenden Concepts mit §5.5-Kontext-Marker (AD-4c: nie alleinige Provenienz), §5.6-Pin unverändert, `log.md`-Eintragspflicht („Story 3.1-Update" bei Update; Anlage-Eintrag bei neuem Synthese-Concept), Erhaltungs-Invariante (Diff-Probe §5.9 Pkt. 5 gilt), Determinismus-Vertrag.
|
||||||
|
- §7 (`:343`): Synthese-Vorbehalt **auflösen** („→ §5.10 verankert (Story 3.4)").
|
||||||
|
- §8 Revisionslog (`:382`): **Revision 2.9** mit Abschlussklausel.
|
||||||
|
- `_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh` — **neu** (re-executierbar, Muster Story-3.3-Sandbox): Mini-Bundle mit 2 `raw/`-Quellen zum selben Thema; Szenarien S1–S6 (Neu-Anlage mit sources ≥ 2 + gemischten Belegen · Konsolidierung mit Multi-Beleg · Negativ-Kontrolle Aneinanderreihung · Synthese-Update auf bestehendem Pfad · Struktur-/Frontmatter-Invariante · Zwei-Run-Identität AD-17h) + **N1** (NO_OP-Synthese: Evidenz bereits im Body → volle Byte-Identität, kein at-Bump, kein sources-Zusatz, kein log-Eintrag) + **Form-Wahl-Klassifikationsprobe** (Story-3.3-Defer U2/U7: überprüft die §5.9-Abgrenzungs-Reihenfolge an einer gemischten Einheit). Harte Pass/Fail-Assertionen (exit 1), Erhaltungs-Invariante, `??`-Sicht, `assert_frontmatter` (Muster Story-3.3).
|
||||||
|
- `wiki/log.md` — **append** (append-only, Vertrag §5): Story-3.4-Eintrag (Verankerung, Sandbox-Nachweis, Statuswechsel, Validator-Verdikt); bestehende Bullets unverändert.
|
||||||
|
- `_bmad-output/implementation-artifacts/sprint-status.yaml` — **mutiert**: Key `3-4-…` (`:57`) → `in-progress` (→ `done` bei Story-Abschluss).
|
||||||
|
- `schema/validator.md`, `schema/wiki-compiler.md`, `raw/…` — **read-only** (AD-3). Keine Concept-Inhalts-Mutation (Demonstration per Sandbox).
|
||||||
|
|
||||||
|
## Tasks & Acceptance
|
||||||
|
|
||||||
|
**Execution:**
|
||||||
|
- [x] `schema/compiler.md` — §5.10 Synthese-Sektion einfügen (Stimulus, ein-Ziel-Repräsentation, `sources`-Liste, gemischte claim-granulare Provenienz + Multi-Beleg-Konsolidierung, Reflektiertheits-Selbsttest, AD-4c-Marker, §5.6-Pin, log.md, Erhaltungs-Invariante, Determinismus) · §7-Vorbehalt auflösen · §8 Revision 2.9; ohne Change an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/`.
|
||||||
|
- [x] `sandbox-3-4/run-sandbox.sh` — Synthese-Run-Demonstrator (Neu-Anlage + Update, Konsolidierung, Negativ-Kontrolle Aneinanderreihung, NO_OP-Synthese, Form-Wahl-Probe, Struktur-Invariante, Zwei-Run-Identität); harte Pass/Fail-Assertionen; Exit 0.
|
||||||
|
- [x] `wiki/log.md` — Story-3.4-Eintrag (append-only): Verankerung, Sandbox-Nachweis, Statuswechsel, per-Datei-Validator-Verdikt.
|
||||||
|
- [x] `sprint-status.yaml` — Key `3-4-…` → in-progress.
|
||||||
|
|
||||||
|
**Acceptance Criteria:**
|
||||||
|
- Given mehrere Sources zum selben Thema, when der Run synthetisiert, then entsteht eine gemeinsame Wissensrepräsentation statt mehrerer getrennter Zusammenfassungen (AC-1; FR-7) — §5.10-Stimulus + ein-Ziel-Regel, Sandbox belegt (eine Datei, keine per-Source-Summary).
|
||||||
|
- Given eine Synthese aus mehreren Sources, when das Ergebnis erzeugt wird, then übernimmt es gemischte, claim-granulare Provenienz der beteiligten Sources (AC-2; AD-4, A0-3) — Inline-Verweise §5.5 je Aussage, Konsolidierung mit Multi-Beleg.
|
||||||
|
- Given redundante Informationen aus mehreren Sources, when sie synthetisiert werden, then werden sie konsolidiert, ohne Provenienz zu verlieren (AC-3; FR-7) — §5.10-Konsolidierungsregel, Sandbox-S2.
|
||||||
|
- Given das resultierende Concept, when es geprüft wird, then reflektiert es den erkannten Wissensstand — keine bloße Aneinanderreihung (AC-4; FR-7) — Reflektiertheits-Selbsttest, Negativ-Kontrolle S3.
|
||||||
|
- Given die Instruktion, when geprüft, then bleiben `schema/validator.md`/`schema/wiki-compiler.md`/`raw/` unverändert (AD-3), keine neue §7-Klasse, kein Standalone (D-3), keine fünfte Update-Form (Abgrenzungs-Reihenfolge §5.9 unverändert), kein Leasing-Scope — Validator auf Ist-Bundle SUCCESS (7/7 unverändert).
|
||||||
|
|
||||||
|
## Spec Change Log
|
||||||
|
|
||||||
|
**Review-Loop-1 (2026-08-19, bmad-code-review, 3 Subagenten — blind-hunter / edge-case-hunter / verification-gap; kein Loopback, `review_loop_iteration` bleibt 0):** Klassifikation — **kein intent_gap, kein bad_spec** (frozen Intent + Approach eingehalten); **patch** (auto-fixiert, siehe unten) + **defer** (4 Einträge → `deferred-work.md` append-only: AD-16/AD-4c-reale-Anwendung-Home-Epic-4, Orphan-Kontrolle-Home-3.8, Umlaut/Em-Dash-Normalisierung-Sandbox-Home-3.8, Frozen-„Nickel"-Typo-Re-Negotiation) + **reject** (noise: diff-Artifakt-Basename, SHA-Reproduzierbarkeit via `$BASE`-ID). **Patches (alle verifiziert):** (1) `schema/compiler.md` §5.10 — Reflektiertheits-Selbsttest-Muster auf Zeilenanfangs-Label erweitert (`^(Quelle|Source) [A-Z][A-Za-z0-9_ -]*:` — mehrbuchstabige/nummerierte Quell-Labels); **Body-Reihenfolge deterministisch** (lexikografisch über Beleg-Anker, LC_ALL=C) + **Konsolidierungs-Kriterium** (Befund-Äquivalenz über dieselbe erkannte Wissenseinheit) explizit; Duplikat-Fall + Orphan-Kontrolle in Pkt. 8; Stil-/Genus-Korrekturen (`sole`→`einzige`, `der Update`→`das Update`, `sources`-Pluspunkt→`sources`-Zuwachs); Sandbox-N2/N3-Nachweise in Pkt. 3/4. (2) **Sandbox `run-sandbox.sh` (jetzt 10 Szenarien S1–S6 + N1–N3 + FW, Exit 0):** `git add -A`-wiki-Staging aus S1/S2/S3/S4/S5/FW entfernt → die Pkt.-8-`??`-Sicht wird **lebendig** geprüft; **S5-Pkt.-8-`??`-Negativkontrolle** neu (ungetrackte Nicht-Ziel-Datei `ghost.md` → Duplikat/Ghost-Diff-HARD-FAIL, nicht vacuous — Story-3.3-U9-Muster); **N1**-Stimulus-Kommentar korrigiert (alpha-v1 = Baseline-Evidenzbasis, nicht Zuwachs); **N2 Disagreement** (AD-16-Default, beide Behauptungen + je Beleg, kein Falsch-Multi-Beleg, `Disagreement:`-log-Eintrag) + **N3 AD-4c-Übernahme-Marker** (Kontext-Marker-Muster, eigenständig belegte Aussagen ohne Marker, übernommene Quelle nicht in `sources`) als neue Szenarien (schließen die Verification-Gap-Kernbefunde „AD-16-Pfad untested"/„AD-4c-Marker untested"); S1/S2-log.md-Assertionen um die **vollständige Multi-Source-Liste** erweitert. (3) `wiki/log.md`: Audit/Sandbox-Zählung auf 10 korrigiert, Scenario-Typo, „zum Audit-Zeitpunkt"-Qualifikation. (4) `sprint-status.yaml last_updated`-Präzision auf `08-19-2026 16:40` fortgeschrieben (HEAD-Format `HH:MM`, siehe Story-3.3-Präzedenzleistung 13:21). (5) `deferred-work.md` — 4 Spec-3.4-Einträge append-only. **Nach-Review-Abschluss (dieser Flip):** Spec `status: 'in-review' → 'done'`; `sprint-status.yaml` Key `3-4-…` `in-progress → done`.
|
||||||
|
|
||||||
|
## Design Notes
|
||||||
|
|
||||||
|
**Warum §5.10, nicht §5.9-erweiterung:** Synthese ist die **Erzeugungs-/Zusammenführungs-Dimension** (mehrere Quellen → eine Repräsentation) — keine der in §5.9 definierten Einzel-Update-Formen. §5.9 bleibt der Update-Pfad für einzelne bestehende Concepts; §5.10 erweitert die Ausführung um gemischte Provenienz + Konsolidierung (Querschnitt) und die Neu-Anlage mit Multi-Source-`sources`. Das spiegelt den §7-Vorbehalt (`:343`) als eigenständiges Thema.
|
||||||
|
|
||||||
|
**Multi-Beleg-Konsolidierung (das Kernstück):** Eine Aussage, die aus mehreren Quellen redundanz-belegt ist, wird zu EINER Aussage konsolidiert, die §5.5-Multi-Beleg trägt (`(raw/a.md#X; raw/b.md#Y)` — Semikolon-Form, voller Pfad je Beleg). Keine Beleg-Tilgung (AD-4). Widersprüche (diskrepanter Inhalt) bleiben gemäß AD-16 erhalten — kein stilles Zusammenführen zu scheinbar eindeutigen Aussagen (NFR-7, FR-8; Epic-4-Interface: Disagreement in `log.md`).
|
||||||
|
|
||||||
|
**Reflektiertheits-Selbsttest (FR-7 AC-4):** textuell prüfbar — der Body enthält keine per-Source-Zusammenfassungs-Sektionen (keine Struktur „Quelle A: … / Quelle B: …"); jede Aussage trägt ihren Provenienz-Tag. Der Selbsttest grep-basiert: keine Zeile, die nur einen Quell-Label abschnittsstrukturiert.
|
||||||
|
|
||||||
|
**`sources`-Reihenfolge:** deterministisch lexikografisch nach `resource` (LC_ALL=C) — unabhängig von Verarbeitungs- oder Datei-Reihenfolge (AD-17h; konsistent zur §3.2-Pkt.-3b-Lexikografie-Ordnung und zur §5.9-Tie-Break-Logik).
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
**Commands (re-executierbar, ab Workspace-Root):**
|
||||||
|
1. `bash _bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh` — expected: alle Szenarien S1–S6 + N1 + Form-Wahl-Probe mit harten Pass/Fail-Assertionen, Erhaltungs-Invariante erzwungen, Exit 0.
|
||||||
|
2. `grep -n "Synthese aus mehreren Sources\|Revision 2.9" schema/compiler.md` — liefert die Synthese-Sektion + Revisionslog-Eintrag.
|
||||||
|
3. Read-only (AD-3): `git status --porcelain` zeigt keinen Change an `schema/validator.md`/`schema/wiki-compiler.md`/`raw/`.
|
||||||
|
4. Validator-Lauf: alle `wiki/`-Dateien SUCCESS (unverändert, keine Inhalts-Mutation).
|
||||||
|
|
||||||
|
**Manual checks:**
|
||||||
|
- §5.10 trägt Stimulus, ein-Ziel-Regel, `sources`-Liste, gemischte Provenienz, Multi-Beleg-Konsolidierung, Reflektiertheits-Kriterium, AD-4c-Marker, §5.6-Pin, `log.md`-Regel, Erhaltungs-Invariante, Determinismus; §7-Vorbehalt `:343` auf §5.10 aufgelöst; §8-Rev-2.9 mit Abschlussklausel; kein `validator.md`/`wiki-compiler.md`/`raw/`-Diff; kein neuer Standalone (D-3) / keine neue §7-Klasse; §5.9-Abgrenzungs-Reihenfolge unverändert (Synthese = Querschnitt, keine fünfte Form); `wiki/log.md`-Eintrag datiert mit Story-3.4-Semantik + Sandbox-Nachweis + Statuswechsel + Verdikt; `sprint-status.yaml` konsistent.
|
||||||
|
|
||||||
|
## Suggested Review Order
|
||||||
|
|
||||||
|
*(Befüllt nach Review-Abschluss durch step-04. Review-Loop 1 abgeschlossen: kein Loopback, 4 Defers; Status → `done`.)*
|
||||||
|
|
||||||
|
**Synthese-Mechanik (compiler.md §5.10)**
|
||||||
|
|
||||||
|
- Verankerung der Synthese-Dimension — Stimulus, ein-Ziel-Regel, gemischte Provenienz, Reflektiertheit, Erhaltungs-Invariante.
|
||||||
|
[`compiler.md:290`](../../schema/compiler.md#L290)
|
||||||
|
|
||||||
|
- Pkt. 8 — Determinismus-Vertrag: `??`-Duplikat-Kontrolle, Orphan-Fall, `generated.at`-Gap (Home 3.8).
|
||||||
|
[`compiler.md:301`](../../schema/compiler.md#L301)
|
||||||
|
|
||||||
|
**§7/§8-Auflösung**
|
||||||
|
|
||||||
|
- Pkt. 3/4 — AD-16-Disagreement (N2) + AD-4c-Übernahme-Marker (N3) als Sandbox-Nachweise verankert.
|
||||||
|
[`compiler.md:296`](../../schema/compiler.md#L296)
|
||||||
|
|
||||||
|
- Revisionslog 2.9 — Abschlussklausel (AD-3, keine neue §7-Klasse, keine fünfte Update-Form) + Review-Loop-1-Notiz.
|
||||||
|
[`compiler.md:396`](../../schema/compiler.md#L396)
|
||||||
|
|
||||||
|
**Sandbox-Nachweis (re-executierbar)**
|
||||||
|
|
||||||
|
- 10 Szenarien S1–S6 + N1–N3 + FW, harte Erhaltungs-Invariante je Probe; Export & Pass-Statistik.
|
||||||
|
[`run-sandbox.sh:226`](sandbox-3-4/run-sandbox.sh#L226)
|
||||||
|
|
||||||
|
- N2 — AD-16-Disagreement (beide Behauptungen + Disagreement-Eintrag); N3 — AD-4c-Marker.
|
||||||
|
[`run-sandbox.sh:562`](sandbox-3-4/run-sandbox.sh#L562)
|
||||||
|
|
||||||
|
- FW — Form-Wahl-Klassifikationsprobe (Story-3.3-Defer U2/U7) + Zwei-Run-Identität (S6).
|
||||||
|
[`run-sandbox.sh:740`](sandbox-3-4/run-sandbox.sh#L740)
|
||||||
|
|
||||||
|
**Provenienz & Status**
|
||||||
|
|
||||||
|
- Story-Abschluss + Review-Loop-1-Audit — `done`-Flip, 10/10 PASS, 4 Defers.
|
||||||
|
[`log.md:4`](../../wiki/log.md#L4)
|
||||||
|
|
||||||
|
- Implementierungs-Nachweis — Revision 2.9-Eintrag, Validator-Verdikt 7/7 SUCCESS.
|
||||||
|
[`log.md:6`](../../wiki/log.md#L6)
|
||||||
|
|
||||||
|
- Statuskette `in-progress → done` + `last_updated`-Präzision.
|
||||||
|
[`sprint-status.yaml:57`](sprint-status.yaml#L57)
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
# - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended)
|
# - Dev moves story to 'review', then runs code-review (fresh context, different LLM recommended)
|
||||||
# - Retrospective appends its action items to action_items; the status view surfaces open ones
|
# - Retrospective appends its action items to action_items; the status view surfaces open ones
|
||||||
generated: 08-14-2026 00:00
|
generated: 08-14-2026 00:00
|
||||||
last_updated: 08-19-2026 13:21
|
last_updated: 08-19-2026 16:40
|
||||||
project: wow20
|
project: wow20
|
||||||
project_key: NOKEY
|
project_key: NOKEY
|
||||||
tracking_system: file-system
|
tracking_system: file-system
|
||||||
@@ -54,7 +54,7 @@ development_status:
|
|||||||
3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done
|
3-1-inkrementellen-datenfluss-implementieren-interpret-reconcile: done
|
||||||
3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: done
|
3-2-relevanzbestimmung-textual-deterministisch-umsetzen-grep-rip: done
|
||||||
3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: done
|
3-3-bestehende-concepts-erweitern-präzisieren-korrigieren: done
|
||||||
3-4-wissen-aus-mehreren-sources-synthetisieren: backlog
|
3-4-wissen-aus-mehreren-sources-synthetisieren: done
|
||||||
3-5-leasing-dirty-tree-schutz-für-konkurrierende-producer-umsetz: backlog
|
3-5-leasing-dirty-tree-schutz-für-konkurrierende-producer-umsetz: backlog
|
||||||
3-6-lease-staleness-recovery-basis-absichern: backlog
|
3-6-lease-staleness-recovery-basis-absichern: backlog
|
||||||
3-7-reason-mutate-trennung-und-konsistenz-endzustand-sicherstell: backlog
|
3-7-reason-mutate-trennung-und-konsistenz-endzustand-sicherstell: backlog
|
||||||
|
|||||||
+16
-2
@@ -287,6 +287,19 @@ Diese Sektion ist der **einzige Instruktions-Ort** der Update-Mutationsmechanik
|
|||||||
- **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2); (6) **Struktur-Erhaltungs-Check (Story-3.3-Ergänzung als zusätzliches textuelles Element):** vor dem Commit prüft der Producer an den betroffenen Concept-Pfaden, dass keinerlei unbefugte Keys im Frontmatter entstanden sind (Vertrag §3.3/§3.4-Subset, §6.5-Kriterium-1), **keine stille Löschung** bestehender belegter Aussagen/Provenienz erfolgt ist (AD-16, Pkt. 2 „Korrigieren"-Form) und **keine Links** verändert oder ohne echte Beziehung neu gesetzt wurden (§5.6-Pin, Pkt. 3); Verstöße sind textuell benannt (NFR-4) und vor dem Commit zu beheben; die Kandidatenliste bleibt **die** Liste gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite Erhebung nach der Mutation). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**.
|
- **Pre-Run-Reconcile-Check-Block (Defer P2):** Vor jeder Mutation durchläuft der Producer den gebündelten Vorprüf-Block und hält ihn textuell fest: (1) **Input-Zustand** (AD-17a, I/O-Matrix `INPUT_UNCOMMITTED`; Review-Loop-2-D-3): Working-Copy von `raw/` und `wiki/` gegen HEAD prüfen — bei Abweichung (uncommitteder Zustand) bricht der Run mit dem **textuell benannten Abbruch „published/committed Input erforderlich"** ab, **vor** Interpretation und vor jeder Mutation (keine Mutation gegen Zwischenstände); (2) Ziel-Pfade (Ausgangs-Kandidatenliste, §3 Pkt. 2); (3) Quellen-Existenz (EC-1 via Validator-Punkt: jede referenzierte `raw/`-Datei existiert als Datei); (4) Betroffenheits-Kandidatenliste (§3 Pkt. 2, textuell-deterministisch); (5) `wiki/index.md`-V-1-Vorbedingung (fehlende Bundleroot → Run-FAIL, §3 Pkt. 3, Vertrag §2); (6) **Struktur-Erhaltungs-Check (Story-3.3-Ergänzung als zusätzliches textuelles Element):** vor dem Commit prüft der Producer an den betroffenen Concept-Pfaden, dass keinerlei unbefugte Keys im Frontmatter entstanden sind (Vertrag §3.3/§3.4-Subset, §6.5-Kriterium-1), **keine stille Löschung** bestehender belegter Aussagen/Provenienz erfolgt ist (AD-16, Pkt. 2 „Korrigieren"-Form) und **keine Links** verändert oder ohne echte Beziehung neu gesetzt wurden (§5.6-Pin, Pkt. 3); Verstöße sind textuell benannt (NFR-4) und vor dem Commit zu beheben; die Kandidatenliste bleibt **die** Liste gegen die der Diff-Selbsttest (Pkt. 5) prüft (keine zweite Erhebung nach der Mutation). Dieser Block ist der in `deferred-work.md` als P2 notierte Pre-Plan-Schritt und wird durch Story 3.1 als Teil des inkrementellen Runs ausgeführt. **Zeitpunkt (Review-Loop-2-Präzisierung):** der Block wird **nach Reconcile (2) und vor Mutieren (4)**, am **Anfang der Mutationsphase**, einmal pro Run durchgeführt — die Kandidatenliste (Elemente 2/4) existiert zu diesem Zeitpunkt bereits; die **Diff-Probe (Pkt. 5) läuft am Ende desselben Blocks, nach den Mutationen, vor dem Commit**.
|
||||||
7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' -g '!log.md' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`, `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, `<Baseline-Commit>`-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert).
|
7. **Worked Example (an die reale Ist-Lage gebunden, re-executiert; Review-Loop-2-Korrektur):** Ein Run mit neuer committeter Evidenz `raw/epics/epics-2026-08-14.md#FR-12` (Zuwachs über die bisher verarbeitete Stelle hinaus; die Kennung FR-12 existiert real in der Datei) trifft über `rg -l 'FR-12' -g '!log.md' wiki/` das bestehende Root-Concept `wiki/knowledge-kompilation-inkrementell.md` (Term-/Konzept-Überschneidung — re-executierter Befund: der Grep-Ausgabe-Pfad ist `knowledge-kompilation-inkrementell`, `wiki/log.md` exkludiert gemäß §3.2-Pkt.-2a; das Rev-2.4.1-Beispiel `wissensarchitektur/source-material.md` enthielt den Term **nicht** und ist damit korrigiert). Der Run aktualisiert diesen Pfad (Body-Erweiterung mit neuem §5.5-Inline-Beleg `(raw/epics/epics-2026-08-14.md#FR-12)`, `sources`-Ergänzung um diesen `resource` — sofern nicht bereits deklariert, sonst No-Op gemäß Pkt. 2, `generated.at` = aktueller Run-Zeitstempel, `log.md`-Eintrag „Story 3.1-Update"). Die Diff-Probe (Pkt. 5, `<Baseline-Commit>`-Form) zeigt ausschließlich `log` und `knowledge-kompilation-inkrementell` (betroffen, normalisiert) — kein Ghost-Diff, keine `index.md` im Diff (der Index-Link bleibt unverändert).
|
||||||
|
|
||||||
|
## 5.10 Synthese aus mehreren Sources (Story 3.4)
|
||||||
|
|
||||||
|
Diese Sektion ist der **Instruktions-Ort der Synthese-Dimension** (AD-4, FR-7): wie der Producer mehrere `raw/`-Quellen desselben Themas zu **einer** gemeinsamen Wissensrepräsentation mit **gemischter, claim-granularer Provenienz** zusammenführt — statt getrennter Zusammenfassungen je Quelle (FR-7). Sie ist eine weitere Spezifikations-Ebene der Mutationsphase §5 (nach §5.9, vor §6), geschlossen auf dem §7-Vorbehalt (Story 3.4). Sie fügt **kein** Prädikat, **keine** neue §7-Invaliditätsklasse, **keinen** `schema/wiki-compiler.md`-/`schema/validator.md`-/`raw/`-Change hinzu (AD-3) und **keinen** Standalone (D-3). Synthese ist eine **Querschnitt-Dimension, keine fünfte Update-Form**: die §5.9-Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` bleibt die **einzige** Form-Wahl (§5.9 Pkt. 2); Synthese erweitert die Ausführung um gemischte Provenienz + Konsolidierung (bei Update auf ein bestehendes Concept) bzw. um die Neu-Anlage mit Multi-Source-`sources` (bei neuer Einheit). Eine Synthese ist ein Compilation-Vorgang wie die Anlage/das Update: sie unterliegt denselben Phasen (§0: Interpretieren → Reconcile → Synthetisieren → Mutieren → Validieren), derselben Commit-Boundary = Mutations-Boundary (AD-17f, §0/§5.3) und derselben Validator-Erfolgsbedingung (§6).
|
||||||
|
|
||||||
|
1. **Synthese-Stimulus (Input der Synthese-Dimension):** Der Stimulus ist eine **Synthese-Einheit**: mindestens **zwei belegende `raw/`-Quellen** (§2-Interpretation) zum **selben Thema** (dieselbe erkannte Wissenseinheit, dieselbe Semantik — gemessen über Term-/Konzept-Überschneidung nach §3.2 bzw. die §2-Pkt.-2-Mehrquellen-Regel: eine Wissenseinheit kann aus mehreren Abschnitten/Dokumenten stammen). Deterministische Erkennung: die neue committete Evidenz (§1 Pkt. 1, AD-17a) enthält ≥ 2 `raw/`-Dateien, deren abgegrenzte Einheiten auf **dieselbe** Zielrepräsentation auflösen. Eine einzelne Quelle bleibt auf dem §5.9-/§3.2-Pfad (Anlage mit `sources`-Zuwachs bzw. Update) — **keine** Synthese-Dimension. Der Stimulus verarbeitet ausschließlich **published/committed** Input (R-1-Change-Detection, §5.9 Pkt. 6).
|
||||||
|
2. **Ein-Ziel-Repräsentation (gemeinsame Wissensrepräsentation, FR-7 AC-1):** Mehrere Quellen zum selben Thema erzeugen **ein einziges** Synthese-Concept über **einen** Ziel-Pfad (§5.7-Routing; bei neuem Thema über §5.1/§5.7-Neu-Anlage, bei bestehendem Pfad über das §5.9-Update). **Getrennte Zusammenfassungs-Concepts je Quelle sind verboten** (FR-7) — es entsteht nie eine per-Source-Concept-Menge. Die `sources`-Liste des Synthese-Concepts trägt **≥ 2 Einträge** (je belegende Quelle ein Eintrag), **deterministisch lexikografisch nach `resource` sortiert (LC_ALL=C)** — unabhängig von Verarbeitungs- oder Datei-Reihenfolge (AD-17h/A0-19; konsistent zur §3.2-Pkt.-3b-Lexikografie-Ordnung und zur §5.9-Tie-Break-Logik). Bei Update auf ein bestehendes Concept wächst `sources` um die zweite/weitere Quelle (Frontmatter-Regel §5.9 Pkt. 2 „`sources` nur um echte neue Belege ergänzen"; bestehende Einträge bleiben unverändert).
|
||||||
|
3. **Gemischte claim-granulare Provenienz (AD-4a/4b, A0-3):** Jede belegte Aussage des Synthese-Concepts bleibt auf `raw/` zurückführbar — der Body trägt **je Aussage einen Inline-`raw/`-Verweis in §5.5-Form** (`(raw/<datei.md>#<stellen-kennung>)` bzw. Komma-Form; voller Pfad je Beleg). **Konsolidierung ohne Provenienz-Verlust (FR-7 AC-3, AD-4):** redundante Informationen aus mehreren Quellen — dieselbe Aussage, von mehreren Quellen unabhängig belegt — werden zu **einer** Aussage konsolidiert, die **alle** betroffenen Belege trägt (**Multi-Beleg**, §5.5-Pkt.-1-Semikolon-Form: `(raw/a.md#X; raw/b.md#Y)` — voller Pfad je Beleg). **Keine stille Beleg-Tilgung** (AD-4): eine konsolidierte Aussage listet jeden ursprünglichen Beleg. **AD-16-Default:** widersprüchliche Aussagen (diskrepanter Inhalt) werden **nicht** still zu scheinbar eindeutigen Aussagen zusammengeführt, sondern bleiben Bestand und werden als Disagreement in `log.md` explizit abgelegt (Pkt. 7; Epic-4-Interface, Story 4.1 — keine Korrektur-Klassifikation hier vorweggenommen; Sandbox-Szenario N2 demonstriert beide Behauptungen + Disagreement-Eintrag). **Body-Reihenfolge deterministisch (AD-17h/A0-19):** die Positionierung der konsolidierten Aussagen im Body folgt der **lexikografischen Ordnung (LC_ALL=C) ihrer Beleg-Anker** (`raw/<datei.md>#<stellen-kennung>`, voller Pfad), nicht einer Verarbeitungs- oder Datei-Reihenfolge — gleicher Git-State + gleiche Eingabemenge ⇒ identische Aussagen-Reihenfolge. Das Konsolidierungs-Erkennungs-Kriterium („dieselbe Aussage") ist die sachlich äquivalente inhaltliche Formulierung über **dieselbe erkannte Wissenseinheit** (Befund-Äquivalenz, nicht Wort-Identität; abgegrenzt über §2-Interpretation/dieselbe Semantik) — sie ist pro Befund eindeutig aus dem Quell-Text der Einheit begründbar.
|
||||||
|
4. **Übernahme aus bestehenden Concepts (AD-4c — nie alleinige Provenienz):** Übernimmt das Synthese-Concept Formulierungen aus bestehenden Concepts (Kontext-/Synthese-Umformulierung, nicht eigenständig gegen `raw/` belegt), trägt die übernommene Aussage den **§5.5-Kontext-Marker** (Pkt. 2, Muster „übernommen aus `<Concept>` auf Basis von `<source>`, nicht eigenständig belegt") — **kein bestehendes Concept ist alleinige Provenienz eines anderen**. Die Quelle des übernommenen Concepts bleibt damit textuell rückverfolgbar; die Direktübernahme aus `raw/` (ohne Zwischen-Concept) verwendet das Muster „übernommen aus `<source>` (rohe Quelle), nicht eigenständig belegt". **Sandbox-Szenario N3** demonstriert den Kontext-Marker („übernommen aus `gamma` auf Basis von `raw/gamma-v1.md#S-1`, nicht eigenständig belegt") und prüft, dass die Quelle des übernommenen Concepts **nicht** als eigene `sources`-Quelle eingetragen wird (AD-4c).
|
||||||
|
5. **Reflektierter Wissensstand (FR-7 AC-4, NFR-7):** Der Body trägt **integrierte, je Aussage provenance-tags versehene Aussagen** — **keine per-Source-Zusammenfassungs-Struktur** (keine Blöcke „Quelle A: … / Quelle B: …"). **Reflektiertheits-Selbsttest (textuell deterministisch, grepbasiert):** es existiert **keine** Zeile, die einen Quell-Label abschnittsstrukturiert — das Muster ist ein Zeilenanfangs-Label „`Quelle <Label>:`"/„`Source <Label>:`" (einbuchstabig, mehrbuchstabig oder mit Ziffer/Unterstrich suffigiert), grepbasiert `grep -nE '^(Quelle|Source) [A-Z][A-Za-z0-9_ -]*:' <Synthese-Concept>` liefert leer; jede Aussage trägt ihren Provenienz-Tag (§5.5). Ein Befund (Aneinanderreihung) ist ein **Instruktions-Selbsttest-FAIL** (NFR-7, kein stiller Vorbeilass — NFR-4): der Producer stellt den Body vor Run-Abschluss so um, dass die Integration erfüllt ist.
|
||||||
|
6. **§5.6-Pin unverändert:** Synthese fügt **keine neue Linkform** und **keine** neuen `index.md`-Links ohne echte, inhaltsbegründete Beziehung hinzu — §5.6-Pin (genau-eine-Linkform, file-relativ mit `.md`-Endung) und §5.9 Pkt. 3 (kein neuer Index-Link bei reinem Body-Update) gelten unverändert. **Form-Wahl-Klassifikationsprobe (Defer U2/U7, Story 3.3):** eine Synthese-Einheit, die zugleich neue + schärfende + ersetzende Anteile trägt (Form-Überlapp), wird per §5.9-Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` **strikt pro Evidenz-Einheit** der **ersten zutreffenden Form** zugeordnet (deterministisch, AD-17h); die Textgenauigkeits-Rahmen der übrigen Formen gelten für die jeweiligen Teilbestandteile unverändert.
|
||||||
|
7. **`log.md`-Eintragspflicht (Vertrag §5):** Jede Synthese wird als datumsgruppierter Eintrag in `wiki/log.md` dokumentiert. Ein Synthese-**Update** auf ein bestehendes Concept führt den Eintrag „**Story 3.1-Update**" (Disagreement-Fälle als Disagreement-Eintrag mit dem mutierten Concept-Pfad, AD-16b); eine Synthese-**Neu-Anlage** eines neuen Synthese-Concepts führt einen **Anlage-Eintrag** (disambiguierbar von Update-Einträgen). Der Eintrag verknüpft das erzeugte Concept mit der **vollständigen Multi-Source-`sources`-Liste** und hält den `<Baseline-Commit>` (R-1, §5.9 Pkt. 6) fest.
|
||||||
|
8. **Erhaltungs-Invariante & Determinismus-Vertrag (AD-17h/A0-19):** Der **§5.9-Pkt.-5-Diff-Selbsttest gilt für Synthese-Runs unverändert**: die mutierten/neu angelegten Pfade sind eine Teilmenge von (Kandidatenliste ∪ Neu-Anlage-Zielpfade ∪ `log.md` ∪ nachgeführte `index.md`) — **keine neue Datei außer echten Ziel-Pfaden** (Duplikat-Kontrolle via `??`-Sicht, `git status --porcelain -- wiki/`). Gleicher Git-State + gleiche Eingabemenge → identischer Synthese-Vorgang (Ziel-Pfad via §3.2/§5.7, `sources`-Liste lexikografisch nach `resource` LC_ALL=C, Konsolidierung und Form-Zuordnung wie Pkt. 3/6); der `generated.at`-Wanduhr-Gap (gleiches Eingabeset, unabhängige Runs, verschiedene `at`) bleibt offene A0-20-Konvention mit Home **Story 3.8** (§5.9 Pkt. 2, `generated.at`-Konvention) — unverändert bindend. **Duplikat-Fall (Synchronisation zwischen Concepts und Evidenzbasis):** ein `raw/`-Quellpfad erscheint **nur einmal** in einer `sources`-Liste — ein bestehender Eintrag derselben `resource` wird **nicht** doppelt angelegt (die Neuanlage eines Synthese-Concepts setzt voraus, dass kein bestehendes Concept dieselbe Quelle bereits mit derselben Stellen-Kennung als Beleg nutzt; für Update-Fälle gilt das §5.9-Pkt.-2-Prinzip „bestehende Einträge bleiben unverändert" — der Zuwachs einer Quelle, die bereits existiert, wird niemals doppelt eingetragen). **Unzugeordnete/verwaiste Evidenz (Orphan-Kontrolle):** neu committete `raw/`-Evidenz ohne Ziel-Pfad-Treffer bleibt **unzugeordnet** (weder still getilgt noch hintenherum als eigenes Concept angelegt) und wird in `log.md` als verwaist protokolliert — kein Banner/keine stille Vorbearbeitung; Story 3.8/Epic-4 können die Reconcile-Orphan-Politik präzisieren.
|
||||||
|
|
||||||
## 6. Validieren (mechanische Bestätigung)
|
## 6. Validieren (mechanische Bestätigung)
|
||||||
|
|
||||||
1. Nach Abschluss aller Mutationen wird das gesamte Bundle gemäß `schema/validator.md` geprüft (§3 14 Punkte je Datei + §6-Fachprüfungen; Verdikt-Grammatik §5).
|
1. Nach Abschluss aller Mutationen wird das gesamte Bundle gemäß `schema/validator.md` geprüft (§3 14 Punkte je Datei + §6-Fachprüfungen; Verdikt-Grammatik §5).
|
||||||
@@ -334,13 +347,13 @@ Interpretations-Hinweis: Die „✗"-Zeilen zeigen die deterministische Fehlerur
|
|||||||
|
|
||||||
## 7. Selbstbegrenzung (Scope der Instruktion)
|
## 7. Selbstbegrenzung (Scope der Instruktion)
|
||||||
|
|
||||||
Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in Areas gemäß §5.7 sowie das inkrementelle Update bestehender Concepts gemäß §3 + §5.9** begrenzt. Folgendes verbleibt in anderen Stories und wird hier **nicht** vorweggenommen:
|
Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in Areas gemäß §5.7, das inkrementelle Update bestehender Concepts gemäß §3 + §5.9 sowie die Synthese mehrerer `raw/`-Quellen zu einer gemeinsamen Wissensrepräsentation gemäß §5.10** begrenzt. Folgendes verbleibt in anderen Stories und wird hier **nicht** vorweggenommen:
|
||||||
|
|
||||||
- **Claim-granulare Provenienz** je belegter Aussage (Inline-`raw/`-Verweise, Kontext-Marker) — in **§5.5** dieser Instruktion verankert (Story 2.2; AD-4a, A0-3). Keine neue §7-Klasse, kein Standalone, keine Vertragsänderung.
|
- **Claim-granulare Provenienz** je belegter Aussage (Inline-`raw/`-Verweise, Kontext-Marker) — in **§5.5** dieser Instruktion verankert (Story 2.2; AD-4a, A0-3). Keine neue §7-Klasse, kein Standalone, keine Vertragsänderung.
|
||||||
- **Deterministische Area-Zuordnung & Concept-Hierarchie** (Anlage von `wiki/<area>/index.md` + `wiki/<area>/<concept>.md`) — in **§5.7** dieser Instruktion verankert (Story 2.4; AD-7c, A0-10, A0-8, AD-13). Keine neue §7-Klasse, kein Validator-Change.
|
- **Deterministische Area-Zuordnung & Concept-Hierarchie** (Anlage von `wiki/<area>/index.md` + `wiki/<area>/<concept>.md`) — in **§5.7** dieser Instruktion verankert (Story 2.4; AD-7c, A0-10, A0-8, AD-13). Keine neue §7-Klasse, kein Validator-Change.
|
||||||
- **Progressive Discovery über `index.md`** (Navigation, Area-Indizes) — in **§5.8** dieser Instruktion verankert (Story 2.5; AD-9, FR-11, AD-13, NFR-3). **Suche** bleibt konsumenten-/extern-seitig (Consumer-grep über `wiki/`, §5.8 Pkt. 4 — kein Bundle-/Instruktions-Thema mehr). Keine neue §7-Klasse, kein Schema-/Validator-Change.
|
- **Progressive Discovery über `index.md`** (Navigation, Area-Indizes) — in **§5.8** dieser Instruktion verankert (Story 2.5; AD-9, FR-11, AD-13, NFR-3). **Suche** bleibt konsumenten-/extern-seitig (Consumer-grep über `wiki/`, §5.8 Pkt. 4 — kein Bundle-/Instruktions-Thema mehr). Keine neue §7-Klasse, kein Schema-/Validator-Change.
|
||||||
- **Eine genau-eine-Linkform** (file-relativ mit `.md`-Endung, in Areas `../`-fähig) — in **§5.6** dieser Instruktion gepinnt (Story 2.3; AD-7b, A0-9, FR-10; Auflösungsmodell §5.7 Pkt. 4) — der Punkt-11-Check des Validators akzeptiert bis auf Weiteres beide Schreibweisen (strukturell unverändert, Story-2.2-Präzedenz).
|
- **Eine genau-eine-Linkform** (file-relativ mit `.md`-Endung, in Areas `../`-fähig) — in **§5.6** dieser Instruktion gepinnt (Story 2.3; AD-7b, A0-9, FR-10; Auflösungsmodell §5.7 Pkt. 4) — der Punkt-11-Check des Validators akzeptiert bis auf Weiteres beide Schreibweisen (strukturell unverändert, Story-2.2-Präzedenz).
|
||||||
- **Synthese über mehrere Concepts** (mehrere Sources → eine gemeinsame Wissensrepräsentation mit gemischter, claim-granularer Provenienz) → **Epic 3, Story 3.4** (AD-4, FR-7). Die Verankerung des inkrementellen Datenflusses (Erweitern/Präzisieren/Korrigieren einzelner bestehender Concepts) bleibt **§3 + §5.9** überlassen und ist dort bereits verankert (Story 3.1) — sie ist damit aus diesem Vorbehalt entlassen.
|
- **Synthese über mehrere Sources** (mehrere `raw/`-Quellen → eine gemeinsame Wissensrepräsentation mit gemischter, claim-granularer Provenienz) — **in §5.10** dieser Instruktion verankert (Story 3.4; AD-4, FR-7). Die Verankerung des inkrementellen Datenflusses (Erweitern/Präzisieren/Korrigieren einzelner bestehender Concepts) bleibt **§3 + §5.9** überlassen und ist dort bereits verankert (Story 3.1). Beide sind damit aus diesem Vorbehalt entlassen.
|
||||||
- **Leasing / Dirty-Tree-Schutz** für konkurrierende Producer → **Story 3.5/3.6** (AD-17a..f, A0-12..A0-16); die bestehende Commit-Boundary = Mutations-Boundary-Regel (§0/§5.3, AD-17f) bleibt in v1 bestehender Schutz.
|
- **Leasing / Dirty-Tree-Schutz** für konkurrierende Producer → **Story 3.5/3.6** (AD-17a..f, A0-12..A0-16); die bestehende Commit-Boundary = Mutations-Boundary-Regel (§0/§5.3, AD-17f) bleibt in v1 bestehender Schutz.
|
||||||
- **Relevanzbestimmung** (feinkörniger Relevanz-Findungsmechanismus der Kandidatenerhebung) — in **§3.2** dieser Instruktion verankert (Story 3.2; Term-Ziehverfahren + Kanonisierungs-Resolver `schema/canonical-terms.md`, drei Erhebungs-Stufen grep/ripgrep + `index.md`-Traversal + Link-Following mit besuchter Menge, `log.md`-Exklusion, Candidate-Liste als relative OKF-Pfade ohne `.md`, Determinismus-Vertrag AD-17h/A0-19). Keine neue §7-Klasse, kein Schema-/Validator-Change; die Em-Dash-`—`-Varianten-Lücke ist als Determinismus-Frage an Story 3.8 übergeben.
|
- **Relevanzbestimmung** (feinkörniger Relevanz-Findungsmechanismus der Kandidatenerhebung) — in **§3.2** dieser Instruktion verankert (Story 3.2; Term-Ziehverfahren + Kanonisierungs-Resolver `schema/canonical-terms.md`, drei Erhebungs-Stufen grep/ripgrep + `index.md`-Traversal + Link-Following mit besuchter Menge, `log.md`-Exklusion, Candidate-Liste als relative OKF-Pfade ohne `.md`, Determinismus-Vertrag AD-17h/A0-19). Keine neue §7-Klasse, kein Schema-/Validator-Change; die Em-Dash-`—`-Varianten-Lücke ist als Determinismus-Frage an Story 3.8 übergeben.
|
||||||
- **Standalone-Compiler / eigene LLM-Runtime / MCP** → verboten in v1 (D-3, D-4, AD-11).
|
- **Standalone-Compiler / eigene LLM-Runtime / MCP** → verboten in v1 (D-3, D-4, AD-11).
|
||||||
@@ -380,3 +393,4 @@ Diese Instruktion ist auf die **Erzeugung neuer Concepts auf Root-Ebene und in A
|
|||||||
- **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 <Baseline-Commit> -- 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 -- <wiki/pfad>`, ungetrackte neue Dateien gelöscht, Index via `git checkout -- <index>`; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `<Baseline-Commit>` (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.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 <Baseline-Commit> -- 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 -- <wiki/pfad>`, ungetrackte neue Dateien gelöscht, Index via `git checkout -- <index>`; §5.3/§6.3-Teilzustand-Rollback greift daneben unverändert). (2) **R-1-Baseline deterministisch + Abweichungsregel (D-2):** `<Baseline-Commit>` (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.)
|
- **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.)
|
||||||
- **Revision 2.8 (2026-08-19, Story 3.3):** §5.9-Update-Formen **operationell ausformuliert** (dieselbe Evidenz + formale Struktur → identisches Update-Ergebnis, AD-17h/A0-19): (1) **Pkt. 2 — Präzisierungsebene je Update-Form** (als Sub-Bullet an die Commit-Boundary-Regel angefügt; der frozen Story-3.1-Regeltext bleibt textuell **unverändert** als normative Basis, die operationellen Regeln sind die Ausführungs-Ebene darunter — keine Re-Negotiation): je Form **(a) Abgrenzungskriterium** (aus der committeten Evidenz: neue belegte Aussage → Erweitern; Schärfung einer bestehenden Formulierung/Abgrenzung ohne Ersatz → Präzisieren; Ersetzung einer fehlerhaften/überholten → Korrigieren; keines davon → No-Op, engere Auslegung), **(b) Struktur-Erhaltungsregel** (das Geschützte — Frontmatter-Subset nur als `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen) und **(c) Textgenauigkeits-Rahmen für Präzisieren** (Schärfen an der Aussage, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). (2) **Pkt. 5 — Erhaltungs-Invariante um den Struktur-Erhaltungs-Bezug ergänzt:** die Diff-Probe verifiziert zwei Ebenen — die Pfad-Mengen-Ebene (bestehender Teilmenge-Vergleich) und die **Struktur-Ebene je berührtem Pfad** (pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft: Frontmatter-Subset, keine Umschreibung belegter Aussagen außerhalb der Formen, Inline-Verweise, Linkform — Verstöße textuell benannt (NFR-4), vor dem Commit zu beheben, sonst Ghost-Diff mit Rollback). (3) **Pkt. 6 — P2-Check-Block um den Struktur-Erhaltungs-Check erweitert** (Element (6), zusätzliches textuelles Element: keine unbefugten Keys — Vertrag §3.3/§3.4-Subset, keine stille Löschung — AD-16/„Korrigieren"-Form, Links unverändert/keine neuen ohne echte Beziehung — §5.6-Pin; Verstöße textuell benannt (NFR-4) und vor dem Commit behoben). (4) **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert; kein Leasing-Scope (AC-4 → Story 3.5/3.6, AD-17.3-Hinweis unverändert in §7). **`sprint-status.yaml`:** Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` bleibt **`in-progress`** (Review-Abschluss `done` erfolgt gemäß Workflow-Konvention durch den Review-Schritt). Sandbox-Nachweis und per-Datei-Validator-Verdikt siehe `wiki/log.md`-Eintrag (Story 3.3, Revision 2.8).
|
- **Revision 2.8 (2026-08-19, Story 3.3):** §5.9-Update-Formen **operationell ausformuliert** (dieselbe Evidenz + formale Struktur → identisches Update-Ergebnis, AD-17h/A0-19): (1) **Pkt. 2 — Präzisierungsebene je Update-Form** (als Sub-Bullet an die Commit-Boundary-Regel angefügt; der frozen Story-3.1-Regeltext bleibt textuell **unverändert** als normative Basis, die operationellen Regeln sind die Ausführungs-Ebene darunter — keine Re-Negotiation): je Form **(a) Abgrenzungskriterium** (aus der committeten Evidenz: neue belegte Aussage → Erweitern; Schärfung einer bestehenden Formulierung/Abgrenzung ohne Ersatz → Präzisieren; Ersetzung einer fehlerhaften/überholten → Korrigieren; keines davon → No-Op, engere Auslegung), **(b) Struktur-Erhaltungsregel** (das Geschützte — Frontmatter-Subset nur als `sources`-Zuwachs um echten neuen Beleg + `generated.at`-Bump; bestehende belegte Aussagen nicht umgeschrieben ohne dass Präzisieren/Korrigieren greift; §5.5-Inline-Verweise gültig soweit Beleg Body-Bestand; §5.6-Linkform unverändert, keine neuen Links außer bei echten Beziehungen) und **(c) Textgenauigkeits-Rahmen für Präzisieren** (Schärfen an der Aussage, kein Satz-Umbau, kein Neuschreiben ohne Ersetzungsbeleg). (2) **Pkt. 5 — Erhaltungs-Invariante um den Struktur-Erhaltungs-Bezug ergänzt:** die Diff-Probe verifiziert zwei Ebenen — die Pfad-Mengen-Ebene (bestehender Teilmenge-Vergleich) und die **Struktur-Ebene je berührtem Pfad** (pro betroffenem Concept-Pfad über die Pkt.-2-Regeln geprüft: Frontmatter-Subset, keine Umschreibung belegter Aussagen außerhalb der Formen, Inline-Verweise, Linkform — Verstöße textuell benannt (NFR-4), vor dem Commit zu beheben, sonst Ghost-Diff mit Rollback). (3) **Pkt. 6 — P2-Check-Block um den Struktur-Erhaltungs-Check erweitert** (Element (6), zusätzliches textuelles Element: keine unbefugten Keys — Vertrag §3.3/§3.4-Subset, keine stille Löschung — AD-16/„Korrigieren"-Form, Links unverändert/keine neuen ohne echte Beziehung — §5.6-Pin; Verstöße textuell benannt (NFR-4) und vor dem Commit behoben). (4) **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; Commit-Boundary-Regel unverändert; kein Leasing-Scope (AC-4 → Story 3.5/3.6, AD-17.3-Hinweis unverändert in §7). **`sprint-status.yaml`:** Key `3-3-bestehende-concepts-erweitern-präzisieren-korrigieren` bleibt **`in-progress`** (Review-Abschluss `done` erfolgt gemäß Workflow-Konvention durch den Review-Schritt). Sandbox-Nachweis und per-Datei-Validator-Verdikt siehe `wiki/log.md`-Eintrag (Story 3.3, Revision 2.8).
|
||||||
|
- **Revision 2.9 (2026-08-19, Story 3.4):** Neue Sektion **§5.10 „Synthese aus mehreren Sources (Story 3.4)"** eingefügt (nach §5.9, vor §6) — die **verbindliche Verankerung der Synthese-Dimension** (AD-4, FR-7): (1) **Synthese-Stimulus** (≥ 2 belegende `raw/`-Quellen desselben Themas per §2-Interpretation → eine Synthese-Einheit; einzelne Quelle bleibt auf §5.9-/§3.2-Pfad), (2) **Ein-Ziel-Repräsentation (§5.7-Routing; FR-7 AC-1)** — ein Synthese-Concept über einen Ziel-Pfad, `sources`-Liste ≥ 2 Einträge, **deterministisch lexikografisch nach `resource` (LC_ALL=C, AD-17h)**, getrennte Zusammenfassungs-Concepts je Quelle verboten; (3) **gemischte claim-granulare Provenienz (AD-4a/4b, A0-3)** — je Aussage Inline-`raw/`-Verweis §5.5, **Multi-Beleg-Konsolidierung** (§5.5-Semikolon-Form, voller Pfad je Beleg; keine Beleg-Tilgung AD-4), **AD-16-Default** (widersprüchliche Aussagen bleiben, Disagreement in `log.md`; Sandbox-N2); (4) **AD-4c-Übernahme-Marker** („übernommen aus `<Concept>` auf Basis von `<source>`, nicht eigenständig belegt" — nie alleinige Provenienz; Sandbox-N3); (5) **Reflektiertheits-Selbsttest** (FR-7 AC-4/NFR-7) — keine per-Source-Zusammenfassungs-Struktur („Quelle A: …"), grepbasiert `grep -nE 'Quelle [A-Z]:|Source [A-Z]:'`, Selbsttest-FAIL → textuell benannt (NFR-4) und vor Run-Abschluss behoben; (6) **§5.6-Pin unverändert** + **Form-Wahl-Klassifikationsprobe (Story-3.3-Defer U2/U7)** — Überlapp-Einheiten an die §5.9-Abgrenzungs-Reihenfolge `Korrigieren → Präzisieren → Erweitern → No-Op` (erste zutreffende Form), Textgenauigkeits-Rahmen der übrigen je Teilbestand; (7) **`log.md`-Eintragspflicht** („Story 3.1-Update" bei Update, Anlage-Eintrag bei neuem Synthese-Concept; Multi-Source-Liste + `<Baseline-Commit>`); (8) **Erhaltungs-Invariante (§5.9 Pkt. 5 gilt) + Determinismus-Vertrag** (Ziel-Pfad via §3.2/§5.7, `sources`-Lexikografie, Konsolidierung/Form-Zuordnung; `generated.at`-Wanduhr-Gap bleibt A0-20-Konvention, Home Story 3.8). **§7:** Synthese-Vorbehalt **aufgelöst** (in §5.10 verankert; verbleibende 3.x-Themen: Leasing/Dirty-Tree → Story 3.5/3.6). **§8:** Normreferenzen bleiben unverändert (AD-4/AD-4a/FR-7/A0-3 sind bereits über §5.5/Roh-Normreferenzen abgedeckt; AD-4c-Kontext-Marker weiterhin §5.5). **Abschlussklausel:** Keine Änderung an `schema/wiki-compiler.md`/`schema/validator.md`/`raw/` (AD-3); **keine neue §7-Invaliditätsklasse**; **kein Standalone** (D-3); keine Vertragsänderung; **keine fünfte Update-Form** (Abgrenzungs-Reihenfolge §5.9 unverändert, Synthese = Querschnitt); kein Leasing-Scope; Commit-Boundary-Regel unverändert. **`sprint-status.yaml`:** Key `3-4-wissen-aus-mehreren-sources-synthetisieren` → **`in-progress`**. Sandbox-Nachweis (S1–S6 + N1–N3 + Form-Wahl-Probe = 10 Szenarien, Exit 0) und per-Datei-Validator-Verdikt siehe `wiki/log.md`-Eintrag (Story 3.4, Revision 2.9). **Review-Loop-1-Patches (bmad-code-review, 3 Layer; dieser Eintrag nachgeführt):** Reflektiertheits-Selbsttest-Muster auf Zeilenanfangs-Label erweitert (`^(Quelle|Source) [A-Z][A-Za-z0-9_ -]*:` — mehrbuchstabige/nummerierte Quell-Labels werden ebenso erkannt); **Body-Reihenfolge deterministisch** (Aussagen-Positionierung lexikografisch über die Beleg-Anker, AD-17h) + **Konsolidierungs-Kriterium** (Befund-Äquivalenz über dieselbe erkannte Wissenseinheit) explizit; Stil-/Genus-Korrekturen (`sole`→`einzige`, `der Update`→`das Update`, `sources`-Pluspunkt→`sources`-Zuwachs). Keine Änderung an Normreferenzen, §7, Abschlussklausel.
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user