From a8b486d0f04b44344cdfa62e9cc32dfea0d49abd Mon Sep 17 00:00:00 2001 From: Michael Tamse Date: Fri, 21 Aug 2026 12:14:51 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Story=203.10=20=E2=80=94=20Inkrementell?= =?UTF-8?q?e=20Update-=20&=20Synthese-Erhaltung=20+=20Hold-Ausbau=20(bmad-?= =?UTF-8?q?code-review,=20Patch-Kaskade;=20kein=20Loopback)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../implementation-artifacts/deferred-work.md | 16 + .../epic-3-context.md | 2 +- .../sandbox-3-10/run-sandbox.sh | 738 ++++++++++++++++++ ...update-und-synthese-erhaltung-absichern.md | 144 ++++ .../sprint-status.yaml | 4 +- schema/compiler.md | 22 +- wiki/log.md | 1 + 7 files changed, 920 insertions(+), 7 deletions(-) create mode 100644 _bmad-output/implementation-artifacts/sandbox-3-10/run-sandbox.sh create mode 100644 _bmad-output/implementation-artifacts/spec-3-10-inkrementelle-update-und-synthese-erhaltung-absichern.md diff --git a/_bmad-output/implementation-artifacts/deferred-work.md b/_bmad-output/implementation-artifacts/deferred-work.md index f898edb..4e5c1d8 100644 --- a/_bmad-output/implementation-artifacts/deferred-work.md +++ b/_bmad-output/implementation-artifacts/deferred-work.md @@ -558,3 +558,19 @@ Noch nicht adressierte, aber real erkannte Arbeit — gesammelt aus Reviews. Ein - **`norm()`/`tr` ohne `LC_ALL`-Pinning (Sandbox-3.9, 952 Zeilen):** unter C/POSIX-Locale zerfällt die Byte-Klasse `[–—]` in {E2,80,93,94} (übermatcht z. B. `…`/`„`), `tr 'A-Z' 'a-z'` ist locale-abhängig → die Kanon-Form hängt am Host-Locale statt am committeten Git-State. — Defer-Grund: bekannter Story-3.8-Defer (D-7, Block oben „`norm()`-Locale-Pinning fehlt"), hier in den Sandbox-3.9-Scope ausgeweitet (alle R-Szenarien + R-9-Worktree-Läufe laufen auf derselben `norm()`); keine normative Instruktion-Semantik (Instruktion nennt Kollaps-Klasse + lowercasing, keine Locale-Bindung). Home: Sandbox-Härtung (gemeinsam mit den Story-3.8-Hard-Guards). — status: offen - **Positive Zwei-Run-Identität strukturell trivial (R-9 clean A==B):** Plan-/Form-/Routing-Literale der `run9_worktree()`-Receipts sind Skript-Konstanten; die A==B-Identität folgt daraus, nicht aus realer Ausführung; die Nicht-Vakuum-Last tragen die echten Content-Hashes (Bundle-BYTE-Vergleich) und die Negativ-Kontrolle (divergent ≠ clean, hart FAIL). — Defer-Grund: Präzedenz Story-3.8-Defer „DET-1/DET-2-Plan-/Form-Literale vs. AC-5 „nicht hart codiert"" (Block oben, Home: Story-3.13-Abnahme, echte Gate-Runs über die Instruktion); Story-3.9-Sandbox folgt demselben Demo-Muster. Home: Story-3.13-Abnahme. — status: offen + +## Aufgegriffen: Orphan voller Stufen b/c + Mehrziel (Story-3.9-Defer, Home Story 3.10) — Story 3.10, 2026-08-21 + +- Bezug: Defer «Orphan-Term hand-gesteuert + feste 2-Datei-Scan … die volle Stufen-b/c-Traversal-Coverage des Kandidaten-Baums bleibt verbleibend offen (Home: Story 3.13-Abnahme / Sandbox-Härtung — benannter Defer, keine instruktionsseitige Lücke, §5.15 Pkt. 2/3 verankern die Stufen)» (Defer-Block „Deferred from: code review of spec-3-9-deterministische-relevanz-und-reconcile-routing-schliessen", 2026-08-21) — im Kontext von Story 3.10 gezogen als Hold-Home des §5.16-Hold-Ausbaus (AC-8/NFR-7). +- Umsetzung: `schema/compiler.md` §5.16 Pkt. 8 verankert den post-Reconcile-Orphan über **alle Erhebungs-Stufen a/b/c** (nicht nur Stufe a wie in Story-3.9) und die Mehrziel-Auflösung via D-8-Mehrfach-Term-Vereinigung (primäre Ziel-Repräsentation gilt, sonst fail-closed benannter Hold); beide Evidenzpfade (Stufen-Scan + Mehrziel-Vereinigung) landen im Run-Receipt (§5.16 Pkt. 8, außerhalb Bundle §5.14 Pkt. 2). Kein neuer Regel-Operand, keine neue Invaliditätsklasse; die AD-16-/semantische Kollisionsauflösung bleibt Epic 4. +- Sandbox-Nachweis: Sandbox-3.10 E-8 (Orphan über Stufe a/b/c belegt, D-8-Vereinigung → primäre Ziel-Repräsentation, fail-closed Hold, beide Evidenzpfade im Receipt) — Exit 0; Stufe-a-Pfad zusätzlich in E-4 (CONFIRMING-Stellen-Abgleich) und E-7 (Stufen-Routing-Kandidatenliste) ausgeübt. +- status: aufgegriffen (Stufen-a/b/c-Traversal-Coverage + Mehrziel-Hold mechanisch in Sandbox E-8 ausgeübt und in §5.16 Pkt. 8 verankert; die Umlaut-vs-Transkription-Divergenz bleibt als eigener Defer offen — „kein neuer Normalisierungs-Operand, append-only, ask-first", Home: Sandbox-Vereinheitlichung oder folgende Compiler-Instruktions-Revision) + +## Deferred from: code review of spec-3-10-inkrementelle-update-und-synthese-erhaltung-absichern (2026-08-21) + +- source_spec: `spec-3-10-inkrementelle-update-und-synthese-erhaltung-absichern.md` + summary: Sandbox-3.10 uebernimmt die `norm()`/`tolower()`-Helfer ohne `LC_ALL`-Pinning (Byte-Klasse `[–—]` locale-abhaengig) — vorbestehender Defer (D-7, W-3.9-1), hier neu kopiert; kein Instruktions-Defekt, da die Instruktion keine Locale-Bindung nennt. + evidence: run-sandbox.sh (Sandbox-3.10) nutzt dieselben `norm()`-Definitionen wie sandbox-3-9; die unter E-8 neu eingesetzten `stufe_*_scan`-Funktionen rufen `norm` auf denselben bodies auf; `schema/compiler.md` §3.2-Pkt.-1b bindet die Kollaps-Klasse nicht an eine Locale. +- source_spec: `spec-3-10-inkrementelle-update-und-synthese-erhaltung-absichern.md` + summary: Die Sandbox-3.10 validiert ihre Erhaltungs-Invarianten ausschliesslich im isolierten /tmp-Baum (fixture-eigene `git status`-/`log.md`-Pruefungen); ein externer, gegen das reale committete Bundle (wiki/-+raw/) laufender Validator auf Abnahme-Ebene wird nicht ausgefuehrt. + evidence: run-sandbox.sh definiert `SB_DIR=/tmp/sandbox-3-10` und beruehrt nie den realen Ist-Baum (Kommentar Z. 55-58); die `wiki/`-nur-`log.md`-Invariante und die `raw/`-Unangetastetheit liegen ausserhalb der Sandbox — Home: Story-3.13-Abnahmegate. diff --git a/_bmad-output/implementation-artifacts/epic-3-context.md b/_bmad-output/implementation-artifacts/epic-3-context.md index 9367c7e..ac534e3 100644 --- a/_bmad-output/implementation-artifacts/epic-3-context.md +++ b/_bmad-output/implementation-artifacts/epic-3-context.md @@ -36,7 +36,7 @@ Der Compiler verarbeitet neues Source Material gegen das bestehende Knowledge Bu - **Inkrementeller Datenfluss (AD-5, A0-6):** Interpret → Reconcile → Synthesize → Update affected Concepts. Startpunkt ist immer das bestehende Bundle — niemals "Regenerate Everything" (SM-1, FT-6). - **Reason/Mutate-Trennung (AD-6, A0-7):** Logische Phasen Analyse → Reconcile → Plan Changes → Mutate → Validate. Keine eigene Workflow Engine; ein Agent kann die Phasen in einer Session durchführen, der beobachtbare Endzustand des Bundles muss auch bei Abbruch konsistent sein. -- **Deterministische Relevanz & Routing (A0-18):** Geschlossene, geordnete Term-Gewinnung bzw. explizites persistiertes Term-Manifest; Suchterm und Concept-Body werden identisch normalisiert und literal-sicher verglichen. Eine exklusive Routing-Tabelle unterscheidet `UPDATE`, `CREATE`, `ORPHAN/HOLD` und echten `NO_OP`; gleicher Git-State plus gleiches Eingabemanifest erzeugt dieselbe Candidate-Liste und Reihenfolge. *Ist (Story 3.9, 2026-08-20): in `schema/compiler.md` **§5.15** verankert (Termgewinnung geschlossen, eine exklusive Routing-Tabelle, Raw-Immutability-Guard, reservierte Zielpfade, Zwei-Run-Identität; §3.2 bleibt Erhebungs-Anker, §5.15 Pkt. 3 die Routing-Zuordnung).* +- **Deterministische Relevanz & Routing (A0-18):** Geschlossene, geordnete Term-Gewinnung bzw. explizites persistiertes Term-Manifest; Suchterm und Concept-Body werden identisch normalisiert und literal-sicher verglichen. Eine exklusive Routing-Tabelle unterscheidet `UPDATE`, `CREATE`, `ORPHAN/HOLD` und echten `NO_OP`; gleicher Git-State plus gleiches Eingabemanifest erzeugt dieselbe Candidate-Liste und Reihenfolge. *Ist (Story 3.9, 2026-08-20): in `schema/compiler.md` **§5.15** verankert (Termgewinnung geschlossen, eine exklusive Routing-Tabelle, Raw-Immutability-Guard, reservierte Zielpfade, Zwei-Run-Identität; §3.2 bleibt Erhebungs-Anker, §5.15 Pkt. 3 die Routing-Zuordnung).* *Ist (Story 3.10, 2026-08-21): die Erhaltungs-Absicherung der operativen Update-/Synthese-Schritte und der Hold-Ausbau sind in `schema/compiler.md` **§5.16** verankert (Inkrementelle Update- & Synthese-Erhaltung + Hold-Ausbau, Punkte 1–8: Kontinuitäts-Garantie AC-1, Korrigieren mit Run-Receipt-Trace AC-2, Schutzbestandteile & Byte-Identität AC-3, CONFIRMING-Konsolidierung ohne NO_OP AC-4, gemeinsame Wissensrepräsentation als Synthese-Erhaltung AC-5, byte-erhaltender NO_OP AC-6, Provenienz-/Link-Selbsttest aus aktuellem Run AC-7, benannter Hold über die Erhebungs-Stufen a/b/c + Mehrziel-Auflösung AC-8/NFR-7; Erhaltungs-Nachweis als re-executierbare Sandbox E-1..E-9, Exit 0; kein neuer Regel-Operand, keine §7-Klasse, kein Standalone — Umlaut-vs-Transkription bleibt benannter Defer).* - **Keine eigene LLM-Runtime:** Der ausführende agentische Host orchestriert den AD-17-Ablauf (Lease holen, innerhalb des geleasten Bereichs mutieren, committen, freigeben); keine separaten Prozesse oder ein Server (AD-11). - **Atomare Root-Scope-Lease (AD-17a/b, A0-12/13):** Producer behalten die Branch-Konvention `lease//`, akquirieren aber genau einen atomaren, scope-bezogenen Lock im clone-geteilten Zustand. Die Run-ID ist Lock-Inhalt, nicht Exklusivitätsschlüssel; konkurrierende Producer verschiedener IDs und Worktrees teilen denselben Root-Scope (`wiki/` inklusive `log.md`, `index.md` und aller Root-Dateien). *Zielzustand (Review-Loop-3, P-11): geplant für Story 3.11 (Sprint-Change-Proposal 2026-08-20) — die atomare Lock-Präzisierung ist noch nicht in `schema/compiler.md` §5.11 verankert; die bestehende §5.11-Verankerung (Branch-Konvention, Root-Scope-Lease) bleibt unverändert maßgeblich.* - **Fail-closed Kollisionsgrenze (AD-17c, A0-14):** Zwei Branches mit ungleichen Änderungen am selben Concept-Pfad werden nie textuell automatisch gemerged. Epic 3 erhält beide Commit-Hashes und den Scope in einem strukturierten Hold; AD-16-Klassifikation und semantische Auflösung sind Epic 4 / Story 4.x. diff --git a/_bmad-output/implementation-artifacts/sandbox-3-10/run-sandbox.sh b/_bmad-output/implementation-artifacts/sandbox-3-10/run-sandbox.sh new file mode 100644 index 0000000..29586d2 --- /dev/null +++ b/_bmad-output/implementation-artifacts/sandbox-3-10/run-sandbox.sh @@ -0,0 +1,738 @@ +#!/usr/bin/env bash +# ============================================================================ +# Sandbox Story 3.10 — Inkrementelle Update- & Synthese-Erhaltung + Hold-Ausbau +# (schema/compiler.md §5.16, Revision 3.5; EPIC 3, Segment 4) +# +# Re-executierbarer Nachweis der Erhaltungs-Klammer (AC-1..AC-8). Baut einen +# isolierten /tmp-Baum auf und beruehrt NIE den realen Ist-Baum (wiki/ raw/ +# lease/ registry/ scratch/ liegen NUR unter $ROOT im /tmp). Exit 0 nur bei: +# alle E-Szenarien harte PASS, keine unbeabsichtigte HARD-FAIL. +# +# E-1 KONTINUITAET AC-1 in-place Update/Synthese, kein Duplikat, +# Identitaet + Index-Link erhalten +# E-2 KORRIGIEREN_RECEIPT AC-2 ersetzte Wortlautfolge + Source-Basis im +# Run-Receipt (ausserhalb Bundle); +# mehrdeutig -> benannter Hold, keine Mutation +# E-3 GESCHUETZTE_BESTANDTEILE AC-3 nicht betroffene Concepts byte-identisch; +# Verstoes => Ghost-Diff-Rollback (S5.9 Pkt.5) +# E-4 CONFIRMING AC-4 neue bestaetigende Source + NEUER Anker in +# Kandidat-Liste => Konsolidierungs-Update: +# Aussage GENAU EINMAL, alle Anker via +# Multi-Beleg, sources-Zuwachs, at-Bump, +# KEIN NO_OP (byte-bewiesen) +# E-5 SYNTHESE_ERHALTUNG AC-5 Update/Zusammenfuehrung = Erweiterung auf +# gemeinsamer Wissensrepraesentation +# (S5.10-Pkt.-2/3/5), keine A|B-Aneinanderreihung +# E-6 NO_OP_BYTE_ERHALTEND AC-6 volle Evidenzanker-Menge bereits im Body +# => byte-erhaltender NO_OP (keine Mutation, +# kein at-Bump, kein sources-Zusatz); +# fehlender Anker => CONFIRMING (nicht NO_OP) +# E-7 SELBSTTEST_AKTUELLER_RUN AC-7 Provenienz-/Link-Selbsttest aus dem AKTUELLEN +# Run: Baseline = aktuelles , +# erwartete Deltas = Kandidaten-Liste (fuer +# die Erhebungs-Stufen a/b/c) u. Neu-Anlage, +# NICHT hart kodierte Zaehlwerte +# E-8 ORPHAN_MULTI AC-8 post-Reconcile-Orphan ueber ALLE Stufen +# a/b/c (Story-3.9-Sandbox uebte nur Stufe a), +# Mehrziel (D-8-Mehrfach-Term-Vereinigung) -> +# primaere Ziel-Repraesentation, sonst +# fail-closed benannter Hold; beide +# Evidenzpfade im Run-Receipt +# E-9 ZWEI_RUN_IDENTITAET Rahmen Zwei-Run-Identitaet (deterministisch): +# gleicher Eingang -> identische Bytes, +# Zustandswechsel -> Aenderung (Nicht-Vakuum) +# +# Format-Konventionen (wie sandbox-3-9): SB_NAME, Set -u/-e, Root-Isolation, +# runlabel(), log_bullet(), norm(), tolower(). LC_ALL=C fuer deterministische +# Sortierung. Fallback-Geldschrank: der reale Ist-Baum darf NIE angefasst werden. +# ============================================================================ + +set -u +set -e +set -o pipefail + +# ----- Sicherheitsnetz: alle Szenario-Baeume werden NUR unterhalb von SB_DIR +# angelegt; SB_DIR liegt fest in /tmp. Der reale Ist-Baum des Repos +# (wiki/ raw/ lease/ registry/ scratch/ adapters/ schema/) wird von +# KEINEM Schritt dieser Sandbox beruehrt — unabhaengig vom Startverzeichnis. +# ----------------------------------------------------------------------------- +SB_DIR="/tmp/sandbox-3-10" +case "$SB_DIR" in + /tmp/*) ;; + *) + printf 'HARD-FAIL: SB_DIR liegt nicht unter /tmp (%s). Sandbox abgebrochen.\n' "$SB_DIR" >&2 + exit 1 + ;; +esac + +SB_NAME="sb310" +SB_RUN_TS=$(date +%Y%m%d-%H%M%S) +RECEIPTS_DIR="$SB_DIR/receipts-$SB_RUN_TS" +mkdir -p "$RECEIPTS_DIR" + +PASS=0 +FAIL=0 +FAILED_NAMES="" + +log_bullet() { printf '%s\n' "$*"; } + +runlabel() { # runlabel