#!/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 && r0) 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 auf Basis von , 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)"