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

143 lines
5.5 KiB
Bash

#!/usr/bin/env bash
# Story 3.2 — Sandbox-Tests der textuell-deterministischen Relevanzbestimmung (§3.2)
# Re-executierbar: bash run-sandbox.sh (ab Workspace-Root; Sandbox unter /tmp/sb32)
# Zweck: Membership-Pin + Zwei-Run-Identität + NO_MATCH (leere Candidate-Liste)
# + log.md-Kontaminations-Pin (der Term liegt AUCH in log.md — die Candidate-Liste
# bleibt trotzdem auf Concept-Pfade definiert, §3.2-Pkt.-2a).
set -u
ROOT=$(mktemp -d /tmp/sb32-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"
# ---------- Mini-Baum: Concept-Bodies + log.md, die den EXAKTEN Test-Term tragen ----------
cat > wiki/index.md <<'EOF'
# Index
- [Alpha](alpha.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 verwendet deterministische-relevanz-bestimmung für den Abgleich.
EOF
cat > wiki/beta.md <<'EOF'
---
type: concept
sources:
- resource: raw/beta-v1.md
id: s1
generated:
by: wow-compiler/0.1.0
at: 2026-08-16T09:00:00Z
---
Beta beschreibt ein anderes, hier nicht betroffenes Thema.
EOF
# log.md trägt denselben Term — der Kontaminations-Fall, den die Exklusion entschärft:
cat > wiki/log.md <<'EOF'
# Log
## 2026-08-19
- Story-3.2-Update: alpha (raw/alpha-v2.md; deterministische-relevanz-bestimmung).
EOF
cat > raw/alpha-v1.md <<'EOF'
Evidenz v1: deterministische-relevanz-bestimmung (Stelle S-1).
EOF
cat > raw/beta-v1.md <<'EOF'
Evidenz v1: Beta-Thema (Stelle S-1).
EOF
git add -A
git commit -qm "Baseline"
BASE=$(git rev-parse HEAD)
echo "BASELINE-COMMIT: $BASE (Sandbox-Root: $ROOT; loeschbar: rm -rf $ROOT)"
echo
# ---------- Helfer: candidate-Erhebung mit tool-korrekter Exklusion (§3.2-Pkt.-2a) ----------
# rg-Form: rg -l '<term>' -g '!log.md' wiki/
# grep-Form:grep -rl '<term>' --exclude=log.md wiki/
terms() { # $1=Term; nutzt rg wenn vorhanden (native -g-Exklusion), sonst grep --exclude
if command -v rg >/dev/null 2>&1; then
rg -l "$1" -g '!log.md' wiki/
else
grep -rl "$1" --exclude=log.md wiki/
fi
}
# Normalisierung der Ausgabe: wiki/-Präfix + .md-Suffix strippen (§3.2-Pkt.-3a)
normalize() { sed -e 's|^wiki/||' -e 's|\.md$||'; }
# =====================================================================
runlabel() { echo; echo "########## $1 ##########"; }
runlabel "T1: Membership-Pin — Term trifft Concept-Body UND log.md; Candidate-Liste nur Concept-Pfade"
echo "--- Kandidaten-Erhebung: terms 'deterministische-relevanz-bestimmung' (Exklusions-Form) ---"
terms 'deterministische-relevanz-bestimmung' | normalize
echo "--- Erwartet: AUSSCHLIESSLICH 'alpha' (Concept-Pfad, ohne wiki/ + ohne .md) ---"
echo "--- Kontaminations-Kontrolle: was OHNE Exklusion getroffen würde (rg-OHNE -g / grep-OHNE --exclude) ---"
if command -v rg >/dev/null 2>&1; then
rg -l 'deterministische-relevanz-bestimmung' wiki/ | normalize
else
grep -rl 'deterministische-relevanz-bestimmung' wiki/ | normalize
fi
echo "--- OHNE Exklusion trifft es 'alpha' UND 'log' — die Exklusion (§3.2-Pkt.-2a) ist damit reell getestet ---"
# =====================================================================
runlabel "T2: Zwei-Run-Identität (AD-17h/A0-19) — zwei unabhängige Läufe, byte-identische Candidate-Liste"
FIRST1=$(terms 'deterministische-relevanz-bestimmung' | normalize)
SECOND1=$(terms 'deterministische-relevanz-bestimmung' | normalize)
FIRST2=$(terms 'alpha' | normalize)
SECOND2=$(terms 'alpha' | normalize)
echo "Lauf 1 (Term deterministische-relevanz-bestimmung): $FIRST1"
echo "Lauf 2 (Term deterministische-relevanz-bestimmung): $SECOND1"
echo "Lauf 1 (Term alpha): $FIRST2 # 'index' ist der legitime Stufe-b-Traversal-Treffer (Bundleroot verlinkt alpha.md), kein Kontaminations-Fehler"
echo "Lauf 2 (Term alpha): $SECOND2 # identische Ausgabe (Zwei-Run-Identität, AD-17h)"
if [ "$FIRST1" = "$SECOND1" ] && [ "$FIRST2" = "$SECOND2" ]; then
echo "RESULT: IDENTISCH (gleicher Git-State + gleiches Eingabeset -> identische Candidate-Liste, AD-17h)"
else
echo "RESULT: ABWEICHUNG (Determinismus-Vertrag verletzt)" >&2
exit 1
fi
# =====================================================================
runlabel "T3: NO_MATCH — Term trifft kein bestehendes Concept -> leere Candidate-Liste -> UNTOUCHED_CONCEPT"
echo "--- Kandidaten-Erhebung: terms 'vollkommen-neuer-gamma-termin' ---"
RES=$(terms 'vollkommen-neuer-gamma-termin' | normalize)
echo "Candidate-Liste: '${RES}' (leer = gewuenscht)"
if [ -z "$RES" ]; then
echo "RESULT: LEER (NO_MATCH -> UNTOUCHED_CONCEPT: keine Mutation, kein log.md-Zusatz; leere Menge ⊆ erlaubte Menge)"
else
echo "RESULT: FEHLER (erwartet leer)" >&2
exit 1
fi
# =====================================================================
runlabel "T4: Determinismus-Vertrag praktisch — Term in Mehrfach-Konzepten, Konsolidierung zur Vereinigung"
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 teilt den Term deterministische-relevanz-bestimmung (Stelle S-1).
EOF
git add -A; git commit -qm "Zuwachs gamma (teilt den Term)"
echo "--- Kandidaten-Erhebung (Term in alpha + gamma): ---"
terms 'deterministische-relevanz-bestimmung' | normalize | LC_ALL=C sort
echo "--- Erwartet: alpha, gamma (beide Concept-Pfade, lexikografisch; log ABGESCHNITTEN) ---"
echo
echo "===== Sandbox abgeschlossen (alle 4 Tests) ====="
echo "Sandbox-Root: $ROOT"