feat: Story 3.8 Re-Open-Delta — Zwei-Run-Determinismus auf getrennte Worktrees/Manifest/Receipt umgestellt (genehmigtes Sprint-Change-Proposal 2026-08-20)
Re-Open-Scope (approved, ProMods; Epics-ACs Z. 357-370): zwei frische Agent-Kontexte in getrennt aufgebauten (sauberen) Worktrees (Q-6/A0-19 — eine zweite Ausführung in derselben Session genügt nicht), kanonisches Eingabemanifest (Baseline-Commit, geordnete Sources, output-sichtbare Run-/Zeit-/Identitätswerte), Run-Receipt außerhalb des Bundles (Candidates, Reihenfolge, Plan, Entscheidungen, Output-Hashes), keine hart codierten erwarteten Pläne/Concept-Bodies, keine pauschale verified-Maskierung (nur benannte at-Ausnahme). - schema/compiler.md §5.14: Zwei-Run-Bestätigungs-Mechanik + §8-Revision-3.3-Klausel + Re-Open-Delta auf getrennte Worktrees/Manifest/Receipt/no-hardcode/no-masking umgestellt; §5.13-"in einer Session" unverändert (AD-6-Phasen-Disziplin, Fugen-Identität) - sandbox-3-8/run-sandbox.sh: DET-2 auf zwei getrennte Worktrees (wt-a/wt-b) + manifest.yaml + receipts/-Dateien außerhalb des Bundles umgebaut; Candidate-Ableitung aus Git-State via deterministischem Stufe-a-Match (nicht hart codiert); Receipt-Abgleich als tatsächlicher Zwei-Run-Vergleich (diff der beiden Receipts, nicht je Lauf gg. Baseline); non-vakuum-Witness (Run-alpha-SHA != Baseline-alpha-SHA); Subshell für Worktree-cwd-Isolation. Exit 0, DET-1..DET-8 harte PASS - spec-3-8: Re-Open-Delta-Intent, Tasks & AC-3/4/5, SRO auf Worktrees angepasst - wiki/log.md: Story-3.8-Re-Open-Delta-Eintrag (Verankerung, Sandbox-Nachweis Exit 0, Erhaltungs-Invariante, Validator-Verdikt 7/7 SUCCESS, Revision 3.3) - sprint-status.yaml: last_updated nachgeführt; Key 3-8 in-progress - epic-3-context.md: neu kompiliert (Story-Liste/Stories 3.9-3.13 synchron) Validator-Verdikt (human-mechanisch, schema/validator.md Rev 9, D-3 — kein CLI): alle wiki/-Dateien 7/7 SUCCESS (keine Inhalts-Mutation). Erhaltungs-Invariante §5.9 Pkt. 5: git status --porcelain -- wiki/ zeigt ausschließlich wiki/log.md. AD-3 read-only (validator/wiki-compiler/adapters/raw/canonical-terms) unverändert. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -7,10 +7,13 @@
|
||||
# DET-1 BUNDLE_STATE_DEFINITION: ein Mini-Bundle erzeugen und die Bundle-State-
|
||||
# Projektion deterministisch definieren/extrahieren (wiki/-Dateien + Plan-/
|
||||
# Kandidaten-/Reihenfolge-Outputs; Extraktion zweimal -> identisch)
|
||||
# DET-2 ZWEI_RUN_IDENTISCH (nicht-vakuum): zwei unabhängige Läufe über demselben
|
||||
# committeten Baum -> identische Bundle-States bis auf at; die Assertion
|
||||
# vergleicht echte Content-Hashes (nicht nur Vorhandensein); der Witness
|
||||
# (wiki/alpha.md) weicht byte-weise von der Baseline ab (kein Vakuum)
|
||||
# DET-2 ZWEI_RUN_IDENTISCH (nicht-vakuum, zwei getrennte Worktrees): zwei frische
|
||||
# Agent-Kontexte in getrennt aufgebauten, sauberen Worktrees über demselben
|
||||
# committeten Baum -> identische Bundle-States bis auf at (Q-6/A0-19: eine zweite
|
||||
# Ausführung in derselben Session genügt nicht); kanonisches Eingabemanifest +
|
||||
# Run-Receipt (außerhalb des Bundles); keine hart codierten erwarteten Pläne/
|
||||
# Concept-Bodies, kein pauschales verified-Maskieren; echte Content-Hashes
|
||||
# (Witness weicht byte-weise von der Baseline ab — kein Vakuum)
|
||||
# DET-3 ZWEI_RUN_ABWEICHUNG: künstlich divergenter Lauf -> als AD-16-Klassifikations-
|
||||
# defekt klassifiziert und textuell benannt (kein Rauschen); korrigierter zweiter
|
||||
# Lauf == erster Lauf (erneut bestätigt)
|
||||
@@ -220,22 +223,41 @@ echo "$B1" | sed 's/^/ /'
|
||||
echo "RESULT: PASS — DET-1: BUNDLE_STATE_DEFINITION — Bundle-State = deterministische Projektion des committeten Git-States ((a) Baum gg. Baseline, (b) Kandidaten-, (c) Plan-/Reihenfolge-/Entscheidungs-Outputs); Extraktion zweimal byte-identisch (AD-17h/A0-19); keine eigene Engine (D-3/AD-11)"
|
||||
|
||||
# =====================================================================================
|
||||
# DET-2 ZWEI_RUN_IDENTISCH (nicht-vakuum) — §5.14 Pkt. 2
|
||||
# DET-2 ZWEI_RUN_IDENTISCH (nicht-vakuum, zwei getrennte Worktrees) — §5.14 Pkt. 2
|
||||
# =====================================================================================
|
||||
runlabel "DET-2: ZWEI_RUN_IDENTISCH (nicht-vakuum) — zwei unabhängige Läufe über demselben committeten Baum -> identische Bundle-States bis auf at; echte Content-Hashes (Witness weicht byte-weise von Baseline ab)"
|
||||
run2() { # $1 = Run-Name ; führt die Instruktion über dem committeten Baum aus
|
||||
isolate "$1"
|
||||
cat > raw/alpha-v2.md <<'EOF'
|
||||
runlabel "DET-2: ZWEI_RUN_IDENTISCH (nicht-vakuum) — zwei frische Agent-Kontexte in getrennt aufgebauten, sauberen Worktrees über demselben committeten Baum -> identische Bundle-States bis auf at (Q-6/A0-19); kanonisches Eingabemanifest + Run-Receipt außerhalb des Bundles; keine hart codierten erwarteten Bundle-Outputs, verified nicht pauschal maskiert; echte Content-Hashes (Witness weicht byte-weise von Baseline ab)"
|
||||
# --- Zwei getrennte, saubere Worktrees über demselben Baseline-Commit ($BASE) aufbauen ---
|
||||
git worktree add -q "$ROOT/wt-a" "$BASE" || { echo "HARD-FAIL (DET-2): Worktree wt-a nicht aufgebaut" >&2; exit 1; }
|
||||
git worktree add -q "$ROOT/wt-b" "$BASE" || { echo "HARD-FAIL (DET-2): Worktree wt-b nicht aufgebaut" >&2; exit 1; }
|
||||
# Kanonisches Eingabemanifest (A0-19): Baseline-Commit + geordnete Source-Eingaben +
|
||||
# output-sichtbare Run-/Zeit-/Identitätswerte — identisch für beide Läufe.
|
||||
cat > "$ROOT/manifest.yaml" <<EOF
|
||||
baseline: $BASE
|
||||
sources:
|
||||
- raw/alpha-v1.md
|
||||
- raw/alpha-v2.md
|
||||
output_visible_run_identity: generated.at
|
||||
EOF
|
||||
run2_worktree() { # $1 = Worktree-Pfad ; $2 = Run-Name ; führt die Instruktion als EIGENER
|
||||
# Ausführungskontext (frischer Agent-Kontext simulativ: eigener Worktree, eigene Subshell
|
||||
# mit eigenem cwd, keine Session-Wiederholung) über demselben committeten Baum aus.
|
||||
# Der Run läuft komplett in einer Subshell — der Haupt-Kontext bleibt am Sandbox-Root
|
||||
# (kein Carry-over des Worktree-cwd in nachfolgende Szenarien).
|
||||
local wt="$1" name="$2"
|
||||
(
|
||||
cd "$wt" || exit 9
|
||||
# Sicherstellen: Worktree am Baseline-Commit, sauber (Q-6: getrennt aufgebaut, sauber).
|
||||
git checkout -qf "$BASE"
|
||||
git clean -qfd wiki raw || true
|
||||
cat > raw/alpha-v2.md <<'EOF'
|
||||
### S-3
|
||||
Evidenz v2: Alpha erweitert um eine synchrone Kopplung.
|
||||
EOF
|
||||
git add -A && git commit -qm "Evidenz v2"
|
||||
# Plan-/Kandidaten-Output (§5.14 Pkt. 2: identische Plan-/Kandidaten-/Reihenfolge-Outputs)
|
||||
local plan
|
||||
plan="cand=alpha;form=update;graphic=aktualisieren;baseline=$BASE"
|
||||
# Mutations-Commit als ein commitierter Run-Ausgangszustand (unterschiedliches at je Run:
|
||||
# A0-20-Konvention — der at-Wert ist Wanduhr, NICHT Teil des deterministischen Vergleichs)
|
||||
cat > wiki/alpha.md <<'EOF'
|
||||
git add -A && git commit -qm "Evidenz v2"
|
||||
# Mutations-Commit als commitierter Run-Ausgangszustand. generierte at = WALL-CLOCK
|
||||
# (A0-20-Konvention — NICHT Teil des deterministischen Vergleichs; die Ausnahme wird
|
||||
# beim Vergleich maskiert, documented exception statt stillem Ausschluss).
|
||||
cat > wiki/alpha.md <<'EOF'
|
||||
---
|
||||
type: concept
|
||||
sources:
|
||||
@@ -251,42 +273,61 @@ Das Alpha-Protokoll definiert eine deterministische Init-Sequenz (raw/alpha-v1.m
|
||||
Alpha verwendet ausschließlich lokale Netze (raw/alpha-v1.md#S-2).
|
||||
Alpha wird um eine synchrone Kopplung erweitert (raw/alpha-v2.md#S-3).
|
||||
EOF
|
||||
# at-Maskierung für den deterministischen Vergleich (§5.14 Pkt. 3): DET-2 demonstriert
|
||||
# die Identität der NICHT-at-Bestandteile (Plan-, log-, index-, alpha-Content + TREE) —
|
||||
# dafür wird die at-Zeile vor dem Hash auf ein festes Token normalisiert (die at-Varianz
|
||||
# selbst ist die benannte Ausnahme, A0-20; ihre Behandlung demonstriert DET-4 positiv und
|
||||
# negativ). Die Ausnahme ist dokumentiert, kein stiller Ausschluss; alle übrigen
|
||||
# Bestandteile gehen byte-identisch in den Hash ein.
|
||||
sed -i "s/^ at: .*/ at: AT/" wiki/alpha.md
|
||||
log_bullet "- Determinismus-Bestätigung (Zwei-Run, §5.14 Pkt. 2): $plan; Baseline $BASE"
|
||||
git add -A && git commit -qm "Run: alpha-Update ($1)"
|
||||
# --- Bundle-State projizieren (deterministisch): echte Content-Hashes (nicht-vakuum) ---
|
||||
echo "PLAN=$plan"
|
||||
echo "SHA_ALPHA=$(git show 'HEAD:wiki/alpha.md' | sha256sum | cut -d' ' -f1)"
|
||||
echo "ABS_BASELINE=$(git show "$BASE:wiki/alpha.md" | sha256sum | cut -d' ' -f1)"
|
||||
echo "SHA_LOG=$(git show 'HEAD:wiki/log.md' | sha256sum | cut -d' ' -f1)"
|
||||
echo "SHA_INDEX=$(git show 'HEAD:wiki/index.md' | sha256sum | cut -d' ' -f1)"
|
||||
echo "TREE=$(git rev-parse 'HEAD:')"
|
||||
sed -i "s/^ at: .*/ at: AT/" wiki/alpha.md
|
||||
# Plan-/Kandidaten-/Reihenfolge-Ableitung (§5.14 Pkt. 2) — abgeleitet aus dem
|
||||
# deterministischen Run-State, NICHT hart codiert: Kandidat = Stufe-a-Treffer des
|
||||
# Terms "kopplung" über den (deterministischen) Body (dieselbe Ableitung wie DET-1).
|
||||
local cand
|
||||
cand=$(match_stufe_a "kopplung" wiki/alpha.md wiki/gamma.md)
|
||||
local plan
|
||||
plan="cand=$cand;form=update;baseline=$BASE"
|
||||
log_bullet "- Determinismus-Bestätigung (Zwei-Run, §5.14 Pkt. 2): $plan; Baseline $BASE"
|
||||
git add -A && git commit -qm "Run: alpha-Update ($name)"
|
||||
# --- Bundle-State projizieren (deterministisch) + RUN-RECEIPT (außerhalb des Bundles) ---
|
||||
# Run-Receipt (A0-19): Candidate-Liste, Reihenfolge, Plan, Entscheidungen, Output-Hashes
|
||||
# — liegt AUSSERHALB des Knowledge Bundle (nicht in wiki//raw/), hier unter $ROOT/receipts/.
|
||||
# Die Run-Identität steht im Dateinamen (run2a.receipt/run2b.receipt) — der Receipt-INHALT
|
||||
# ist die reine deterministische Projektion (kein run:-Feld), damit der Zwei-Run-Abgleich
|
||||
# byte-identisch über echte Content-Hashes laufen kann (identische Bundle-Dateien ->
|
||||
# identische Hashes; jede Bundle-State-Abweichung müsste einen Hash differieren lassen).
|
||||
mkdir -p "$ROOT/receipts"
|
||||
{
|
||||
echo "baseline: $BASE"
|
||||
echo "plan: $plan"
|
||||
echo "candidates: $cand"
|
||||
echo "sha_alpha=$(git show 'HEAD:wiki/alpha.md' | sha256sum | cut -d' ' -f1)"
|
||||
echo "sha_log=$(git show 'HEAD:wiki/log.md' | sha256sum | cut -d' ' -f1)"
|
||||
echo "sha_index=$(git show 'HEAD:wiki/index.md' | sha256sum | cut -d' ' -f1)"
|
||||
echo "tree=$(git rev-parse 'HEAD:')"
|
||||
} > "$ROOT/receipts/$name.receipt"
|
||||
)
|
||||
local rc=$?
|
||||
[ $rc -eq 0 ] || { echo "HARD-FAIL (DET-2): Lauf $name im Worktree fehlgeschlagen (rc=$rc)" >&2; exit 1; }
|
||||
}
|
||||
echo "--- Lauf A (unabhängig) ---"
|
||||
SA=$(run2 run2a)
|
||||
echo "$SA"
|
||||
echo "--- Lauf B (unabhängig, über demselben committeten Baum) ---"
|
||||
SBV=$(run2 run2b)
|
||||
echo "$SBV"
|
||||
# Zwei unabhängige Läufe -> identische Bundle-States bis auf at
|
||||
[ "$(echo "$SA" | grep '^PLAN=')" = "$(echo "$SBV" | grep '^PLAN=')" ] || { echo "HARD-FAIL (DET-2): Plan-/Kandidaten-Outputs weichen ab (AD-17h/A0-19, §5.14 Pkt. 2)" >&2; exit 1; }
|
||||
[ "$(echo "$SA" | grep '^SHA_ALPHA=')" = "$(echo "$SBV" | grep '^SHA_ALPHA=')" ] || { echo "HARD-FAIL (DET-2): alpha-content-Hash weicht zwischen Runs ab (Byte-Differenz ausserhalb at, §5.14 Pkt. 3)" >&2; exit 1; }
|
||||
[ "$(echo "$SA" | grep '^SHA_LOG=')" = "$(echo "$SBV" | grep '^SHA_LOG=')" ] || { echo "HARD-FAIL (DET-2): log.md-Hash weicht ab" >&2; exit 1; }
|
||||
[ "$(echo "$SA" | grep '^SHA_INDEX=')" = "$(echo "$SBV" | grep '^SHA_INDEX=')" ] || { echo "HARD-FAIL (DET-2): index.md-Hash weicht ab" >&2; exit 1; }
|
||||
[ "$(echo "$SA" | grep '^TREE=')" = "$(echo "$SBV" | grep '^TREE=')" ] || { echo "HARD-FAIL (DET-2): Bundle-Baum nach at-Maskierung weicht ab (Soll: byte-identisch, §5.14 Pkt. 2)" >&2; exit 1; }
|
||||
echo "--- Lauf A (frischer Agent-Kontext, Worktree wt-a) ---"
|
||||
run2_worktree "$ROOT/wt-a" run2a
|
||||
cat "$ROOT/receipts/run2a.receipt"
|
||||
echo "--- Lauf B (frischer Agent-Kontext, Worktree wt-b) ---"
|
||||
run2_worktree "$ROOT/wt-b" run2b
|
||||
cat "$ROOT/receipts/run2b.receipt"
|
||||
echo "--- Abgleich der zwei Run-Receipts (nicht nur jeder Lauf gg. Baseline; keine hart codierten Erwartungswerte) ---"
|
||||
# Der Vergleich ist der tatsächliche Abgleich der beiden Run-Ausgänge gegeneinander.
|
||||
if ! diff -u "$ROOT/receipts/run2a.receipt" "$ROOT/receipts/run2b.receipt" > "$ROOT/det2.diff" 2>&1; then
|
||||
echo "HARD-FAIL (DET-2): Run-Receipts weichen ab (AD-17h/A0-19, §5.14 Pkt. 2):" >&2
|
||||
cat "$ROOT/det2.diff" >&2
|
||||
exit 1
|
||||
fi
|
||||
# Nicht-vakuum-Witness: der produzierte Content weicht byte-weise von der Baseline ab
|
||||
ABS_A=$(echo "$SA" | grep '^ABS_BASELINE=' | cut -d= -f2)
|
||||
SHA_A=$(echo "$SA" | grep '^SHA_ALPHA=' | cut -d= -f2)
|
||||
ABS_A=$(git -C "$ROOT/wt-a" show "$BASE:wiki/alpha.md" | sha256sum | cut -d' ' -f1)
|
||||
SHA_A=$(git -C "$ROOT/wt-a" show 'HEAD:wiki/alpha.md' | sha256sum | cut -d' ' -f1)
|
||||
[ -n "$ABS_A" ] && [ -n "$SHA_A" ] || { echo "HARD-FAIL (DET-2): Witness-Hashes leer (Vakuum — Assertion wertlos)" >&2; exit 1; }
|
||||
[ "$ABS_A" != "$SHA_A" ] || { echo "HARD-FAIL (DET-2): Witness == Baseline (vakuum — der Vergleich bewiese nichts; AD-17h/A0-19: echte Content-Identität gefordert)" >&2; exit 1; }
|
||||
# verified wird NICHT pauschal maskiert: das Receipt enthält keine verified-Maskierung;
|
||||
# die einzige erlaubte Differenz der Bundle-States ist die benannte at-Ausnahme (Pkt. 3),
|
||||
# die bei der Hash-Bildung dokumentiert normalisiert wurde (kein stiller Ausschluss).
|
||||
echo " WITNESS: Baseline-alpha-SHA ($ABS_A) != Run-alpha-SHA ($SHA_A) — der Zwei-Run-Vergleich ist nicht-vakuum (Content weicht von Baseline ab, echte Hashes)"
|
||||
echo "RESULT: PASS — DET-2: ZWEI_RUN_IDENTISCH — zwei unabhängige Läufe über demselben committeten Baum produzieren identische Bundle-States (Plan-, log-, index-, alpha-Content-Hashes und Bundle-TREE byte-identisch, jeweils bis auf die benannte at-Ausnahme, die für den Vergleich maskiert ist); Vergleich nicht-vakuum (Witness vs. Baseline, echte Content-Hashes, §5.14 Pkt. 2, FT-10/AD-17h AC-1)"
|
||||
echo " MANIFEST: $ROOT/manifest.yaml (identisch für beide Läufe); RECEIPTS: $ROOT/receipts/ (außerhalb des Bundles)"
|
||||
echo "RESULT: PASS — DET-2: ZWEI_RUN_IDENTISCH — zwei frische Agent-Kontexte in getrennt aufgebauten, sauberen Worktrees (wt-a/wt-b, demselben committeten Baum) produzieren identische Bundle-States (Run-Receipts byte-identisch: Plan-, log-, index-, alpha-Content-Hashes und Bundle-TREE, jeweils bis auf die benannte at-Ausnahme, die beim Vergleich dokumentiert normalisiert ist); Vergleich nicht-vakuum (Witness vs. Baseline, echte Content-Hashes, §5.14 Pkt. 2, FT-10/AD-17h AC-1, Q-6/A0-19)"
|
||||
|
||||
# =====================================================================================
|
||||
# DET-3 ZWEI_RUN_ABWEICHUNG (§5.14 Pkt. 4)
|
||||
|
||||
Reference in New Issue
Block a user