Files
wow20/_bmad-output/implementation-artifacts/sandbox-3-4/run-sandbox.sh
T

778 lines
44 KiB
Bash

#!/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)"