#!/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 '' -g '!log.md' wiki/ # grep-Form:grep -rl '' --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"