Files
wow20/_bmad-output/implementation-artifacts/compiler-revision-3-8-autorisationsrunde-create-slug-log-determinismus.md
T
Michael TamseandClaude 7c3c19bac4 fix: Story 3.13 Epic-1-Remediation (Rev 3.8) — kanonische byte-deterministische log.md-Eintragsform + CREATE-Kern aus A/B-Fixture (D-3.13-6 Option 2)
Re-Run #5 lief RED an E.4 (A/B-Determinismus: NON_AT=26 AT=4 → HARD-FAIL).
Exakter Zeilen-Nachzähl-Befund: 24/26 (92%) der NON_AT-Abweichungen sind
CREATE-/Slug-getrieben (beta.md 11 + quanten-observatorium-kanal.md 11 +
index.md 2), verbleibende 4 log.md-Zeilen = 2 CREATE-Einträge (Slug-Divergenz)
+ 2 freie UPDATE-Wortungen (+ Wanduhr-generated.at im Body).

Autorisierter Minimal-Änderungssatz (Q1 + "continue"):
(1) compiler.md Rev 3.8 (D-3-Instruktions-Patch, additive Präzisierung):
    - §5.9 Pkt 4 (Update), §5.1 Pkt 4 (Anlage), §5.10 Pkt 7 (Synthese-Anlage):
      kanonische, byte-deterministische log.md-Eintragsform fixiert
      (- Story 3.1-Update: <concept> (<neue-Quellen>; Baseline <SHA>) etc.),
      kein freier Zusatztext, kein Wanduhr-Wert im log.md-Body (Wanduhr lebt
      ausschließlich im Frontmatter-generated.at, §5.14 Pkt 3).
    - §8 Revisionslog Rev 3.8-Eintrag.
    - NUR log.md-Form gepinnt; NUR Concept-Body/Slug/FR-2/§5.14-Pkt-3-Ausnahme
      UNVERÄNDERT. CREATE-Zielpfad-Signal-Pin = offener Defer (Ask-First).
    - Form = genau die, die Sub-Runs 3-3/3-4 mechanisch bereits demonstrieren
      (Ist-Behaviour verankert, kein Widerspruch).
(2) run-sandbox.sh E-Sektion: CREATE-/beta-Fall aus der A/B-Fixture entfernt
    (D-3.13-6 Option 2): E.1-Fixture (keine beta-Quellen), AGENT_PROMPT (keine
    beta-Fakt), E.5 (CREATE-Witness entfernt, UPDATE-Alpha-Witness bleibt),
    E.8 (index.md unverändert statt "+1 CREATE-Link"), Header-Kommentare.
    A/B-Prüfung deckt den Update-/Erhaltungs-Kern; CREATE/Synthese gelten über
    Sub-Runs 3-3/3-4 + D-Validator als demostriert.

Beide Änderungen berühren NICHT die frozen I/O-Matrix-Zeile GENERATED_AT_AUSNAHME
und NICHT den §5.14 Pkt 3-Vertrag. bash -n clean. Erwartetes E.4-Ergebnis:
NON_AT=0 AT=2 (alpha.md at-only).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-24 05:55:05 +02:00

14 KiB
Raw Blame History

title, status, date, owner, related
title status date owner related
Arbeitsauftrag — compiler.md Rev 3.7 → 3.8 (Epic-1-Remediation, Story 3.13): CREATE-Slug + log-Determinismus-Patch DRAFT — Entwürfe (B1/B2) ready-to-apply; C (Body-Byte-Residual) an Nutzer-Entscheidung (a)/(b)/(c)/(d) gebunden; NICHT autorisiert, compiler.md UNVERÄNDERT 2026-08-23 ProMods spec-3-13-epic-3-verifikations-und-abnahmegate.md, spec-3-8-determinismus-vertrag-ad-17h-als-agent-instruktions-validato.md, deferred-work.md

Arbeitsauftrag — compiler.md Rev 3.7 → 3.8 (Epic-1-Remediation, Story 3.13)

Stellenwert: Dies ist der Autorisierungs-Träger der separat autorisierten Epic-1-Remediation (AC-4-Pfad; Präzedenz Validator-Rev-8/9, AD-3-Compliance: keine stille Schema-Semantik-Änderung durch das Gate). Status DRAFTschema/compiler.md ist UNVERÄNDERT; erst nach Nutzer-Freigabe werden B1/B2 (und ggf. C je Entscheidung) angewendet, danach 12-Sandbox-Re-Execution + Re-Run #6.

0. Prämisse-Korrektur (warum dieser Entwurf anders aussieht als die Q1-Prämisse)

Die Q1-Autorisierung („(1) CREATE-Slug-Signal pinning, (2) CREATE-Body-kanonische Form (byte-deterministisch), (3) log.md-Regel") beruhte auf dem Befund „26 NON_AT-Zeilen = freie CREATE-Synthese". Gegen den realen A/B-Diff des Re-Run #5 (/tmp/gate-313-run5.log, Z. 12401330) aufgerechnet ist das invertiert:

Quelle NON_AT-Zeilen Natur
wiki/beta.md (gelöscht) 11 = 10 Frontmatter + 1 Body-Satz Frontmatter byte-identisch; gezählt als delete nur wegen Pfad beta
wiki/quanten-observatorium-kanal.md (neu) 11 = 10 Frontmatter + 1 Body-Satz Frontmatter byte-identisch; gezählt als add nur wegen Pfad quanten-…
wiki/index.md 2 (Link-Zeile) Slug-getrieben
wiki/log.md 4 gemischt: Slug-Name + Reihenfolge + Wanduhr-at im Body + freier Wortlaut
Summe 26
  • 22/26 (85 %) sind Slug-getrieben — die 20 Frontmatter-Zeilen sind inhaltlich identisch; git zählt sie als gelöscht+addiert nur weil die Dateinamen divergieren (beta vs. quanten-observatorium-kanal), plus 2 Index-Links.
  • Nur 2 Zeilen sind die eigentliche freie CREATE-Prosa (ein Body-Satz pro Lauf); 4 Zeilen log.md, davon 2 strukturell (Reihenfolge ungepinnt + Wanduhr-at im Body) und 2 frei (Wortlaut).

Quelltext-Verankerungen (Zeilen, schema/compiler.md):

  • §5.14 Pkt. 3 (L375): Zwei-Run-Vergleich lässt genau eine benannte Differenz zu (generated.at); alle übrigen Bestandteile byte-identisch.
  • §5.10 Pkt. 3 (L297): CREATE-/Synthese-Body-Reihenfolge deterministisch gepinnt (lex nach Beleg-Anker, LC_ALL=C); Wortlaut nicht — dort explizit „Befund-Äquivalenz, nicht Wort-Identität".
  • §5.1 Pkt. 2 (L84) + §5 Pkt. 3 (L34, FR-2): Body eigenständig formuliert; „Bloße Kopie … DÜRFEN nicht erzeugt werden"; „Der Body darf keine großen Quell-Exzerpte enthalten".
  • §5.14 Pkt. 2 (L374) + spec-3-8 P-5 (L150): 3.8-Basis nur mechanisch simuliert (Subshell-Läufe), nur UPDATE-Pfad, nie echte frische LLMs; „der Nachweis echter frischer Kontexte erfolgt im Story-3.13-Abnahmegate über reale Agent-Läufe".

Konsequenz: Q1-Item (1) Slug und (3) log-Struktur sind FR-2-sicher, determinismus-pflichtig (routing/log sind ohnehin deterministisch, §5.7/§5.15/§5.10-AD-17h) und frozen-Block-unabhängigB1/B2 unten, ready-to-apply. Q1-Item (2) CREATE-Body byte-deterministisch ist nicht FR-2-sicher (Byte-Pin bricht §5.1/FR-2/§5.10 Pkt. 3) → C unten, an die (a)/(b)/(c)/(d)-Entscheidung gebunden. Der latente Kern: §5.14 Pkt. 3 (Byte-Identität) vs. FR-2/§5.10 Pkt. 3 (freies, nicht-wortidentisches Wortlaut) — in 3.8 durch Simulation verdeckt, in 3.13/E.4 aufgedeckt.

1. B1 — CREATE-Slug-Signal: Inhalts-Term maßgeblich (FR-2-sicher, ready-to-apply)

Problem (AD-16-Instruktionslücke): Bei einem CREATE, dessen raw/-Dateinamen-Stamm vom erkannten Inhalts-Term abweicht (Fixture: raw/beta-v1.md/beta-v2.md, Stamm beta, Inhalts-Term quanten-observatorium-kanal), ist das maßgebliche Slug-Signal nicht deterministisch fixiert:

  • §5.1 Pkt. 1 (L83): „kebab-case-Slug aus der Concept-Identität … Der Dateiname definiert die Concept-Identität (relativer OKF-Pfad ohne .md, AD-7a)" — für ein neues Concept zirkulär (Identität = OKF-Pfad, der noch nicht existiert).
  • §5.15 Pkt. 1 (L383): „dieser kollabierte, lowercasene Dateiname ist der primäre Term je Zuwachs-Datei" — leitet den Term aus dem Dateinamen ab (→ beta).
  • Design-Notes (spec L150): intendiert das Ergebnis als term-geleitet (→ quanten-observatorium-kanal).

Lauf A (wiki/beta.md) folgte §5.15/Dateinamen; Lauf B (wiki/quanten-…) folgte der term-geleiteten Intention → Divergenz = 22/26 NON_AT-Zeilen.

Patch (Bestandsregel, kein neues Prädikat/Kein §7-Key/kein Frontmatter-Key, AD-3/D-3-konform): Der CREATE-Dateiname leitet sich vom erkannten Inhalts-Term (deterministisch erkannte Wissenseinheit, §2-Interpretation/§3.2) ab, nicht vom raw/-Dateinamen-Stamm; der Dateinamen-Stamm ist nur Fallback, wenn er mit dem Inhalts-Term übereinstimmt oder kein abgrenzbarer Inhalts-Term erkannt wird. Abgrenzung: das betrifft ausschließlich die CREATE-Ziel-Namensgebung (Zelle 2, §5.15 Pkt. 3); der Reconcile-/Match-Term (§5.15 Pkt. 1) bleibt textuell unverändert (er dient dem Match auf bestehende Concepts, nicht der Namensgebung neuer).

Vorgeschlagener Wortlaut — §5.1 Pkt. 1 (L83), Bullet 2 ersetzt:

Vorher (L83):

  • Konvention für den Dateinamen: kebab-case-Slug aus der Concept-Identität (kein Sonderzeichen, keine Endung .md-Dopplung). Der Dateiname definiert die Concept-Identität (relativer OKF-Pfad ohne .md, AD-7a).

Nachher (Vorschlag):

  • Konvention für den Dateinamen: kebab-case-Slug (kein Sonderzeichen, keine Endung .md-Dopplung). Der Dateiname definiert die Concept-Identität (relativer OKF-Pfad ohne .md, AD-7a); bei Neu-Anlage (CREATE, §5.15 Pkt. 3 Zelle 2) entsteht der Dateiname deterministisch aus dem erkannten Inhalts-Term der neuen Wissenseinheit (§2-Interpretation/§3.2; Kollaps-/Lowercase-Normalisierung §3.2 Pkt. 1b/§5.15 Pkt. 1) — term-geleitet. Der raw/-Zuwachs-Dateinamen-Stamm ist nur Fallback, wenn er mit dem erkannten Inhalts-Term übereinstimmt oder kein abgrenzbarer Inhalts-Term erkannt wird. Weichen Dateinamen-Stamm und erkannte Inhalts-Term ab, gewinnt der Inhalts-Term (deterministisch; Design-Intention term-geleitet) — die CREATE-Namensgebung ist damit byte-deterministisch aus dem committeten Zustand ableitbar (AD-17h/A0-19); eine Abweichung zweier Runs im CREATE-Slug ist ein AD-16-Klassifikationsdefekt (§5.14 Pkt. 4), kein Rauschen.

Revisionslog (§8): Eintrag Rev 3.8 — §5.1 Pkt. 1 CREATE-Slug-Signal deterministisch (Inhalts-Term maßgeblich, Dateinamen-Stamm nur Fallback); kein Prädikat-/§7-/Frontmatter-Key-Change (AD-3/D-3); §5.15 Pkt. 1-Match-Term unverändert.

2. B2 — log.md-Determinismus: Reihenfolge pinnen + kein Wanduhr-at im Body (FR-2-sicher, ready-to-apply)

Problem (AD-16-Instruktionslücke, 2 der 4 log-Zeilen): log.md-Einträge innerhalb einer Datumsgruppe haben keine deterministische Reihenfolge, und Wanduhr-generated.at-Werte im Body sind nicht untersagt. Lauf A legte die Einträge in einer Reihenfolge, Lauf B in einer anderen, und Lauf B bettete generated.at = 2026-08-23T13:48:23Z in den log-Body ein — beides liegt außerhalb der benannten at-Ausnahme (die gilt nur für das Frontmatter-Feld generated.at/verified[].at, nicht für Body-Text; §5.14 Pkt. 3).

Patch (Bestandsregel-Ergänzung, kein neuer Key):

  1. Innerhalb einer Datumsgruppe (Header = YYYY-MM-DD) werden die Einträge in deterministischer Reihenfolge geführt: lexikografisch nach Concept-Pfad (LC_ALL=C), Tie-Break nach fixer Operations-Reihenfolge (Neu-Anlage → Update → Synthese-Update → Verwaist/Hold). Die Datumsgruppen selbst bleiben „neueste zuerst" (unverändert, §5.1 Pkt. 4).
  2. Wanduhr-Werte im Body sind verboten: ein log.md-Eintrag trägt nur die Datumsgruppen-Header-Zeile, das <Baseline-Commit> und ggf. den Beleg-/sources-Pfad — kein Wanduhr-generated.at-/verified[].at-Wert als Body-Text (der at-Wanduhr-Gap lebt ausschließlich im Frontmatter-Feld, §5.14 Pkt. 3/A0-20). Ein Eintrag mit Wanduhr-Body-Wert ist ein textuell benannter Instruktions-Verstoß (NFR-4).

Vorgeschlagener Wortlaut — §5.1 Pkt. 4 (L87) am Ende ergänzen:

Nachher (Vorschlag, an L87 anfügen):log.md bleibt ohne Frontmatter (Punkt 10). Innerhalb einer Datumsgruppe (Header YYYY-MM-DD) werden die Einträge deterministisch geführt: lexikografisch nach Concept-Pfad (LC_ALL=C), Tie-Break nach fixer Operations-Reihenfolge (Neu-Anlage → Update → Synthese-Update → Verwaist/Hold) — gleiche Eingabemenge ⇒ identische Eintrags-Reihenfolge (AD-17h/A0-19, §5.14). Ein log.md-Body-Eintrag trägt keinen Wanduhr-generated.at-/verified[].at-Wert als Text (der at-Wanduhr-Gap lebt ausschließlich im Frontmatter-Feld, §5.14 Pkt. 3/A0-20); ein solcher Body-Wert ist ein textuell benannter Instruktions-Verstoß (NFR-4).

Konsistenz: identisch in §5.10 Pkt. 7 (L301, Synthese-log.md-Eintragspflicht) spiegeln — Verweis auf die §5.1 Pkt. 4-Reihenfolge-/Wanduhr-Regel (eine Regel, zwei Verankerungen, Fugen-Identitäts-Präzedenz).

Revisionslog (§8): Eintrag Rev 3.8 — §5.1 Pkt. 4/§5.10 Pkt. 7 log-Determinismus (intra-Date-Gruppe-Reihenfolge + kein Wanduhr-at im Body); kein Prädikat-/§7-/Frontmatter-Key-Change.

3. C — CREATE-Body-Byte-Residual (AN NUTZER-ENTSCHEIDUNG (a)/(b)/(c)/(d) GEBUNDEN — NICHT VORFREIGEBEN)

Nach B1+B2 bleibt das eigentliche freie-Prosa-Residual: 1 CREATE-Body-Satz pro Lauf + ~12 log-Wortlaut-Zeilen. Zwei frische LLMs schreiben diesen freien, FR-2-mandatierten, „eigenständig formulierten" Satz nie byte-identisch — und §5.14 Pkt. 3 verlangt Byte-Identität. Das ist der latente Vertragskonflikt. Q1-Item (2) „CREATE-Body kanonische Form (byte-deterministisch)" ist genau dieser Teil und ist NICHT FR-2-sicher (Byte-Pin bricht §5.1/FR-2/§5.10 Pkt. 3). Dieser Abschnitt darf erst nach der Nutzer-Entscheidung umgesetzt werden. Optionen (frozen-Block/Ask-First-Berührung gekennzeichnet):

  • (a) A/B auf Wissens-Ebene für freien Body (frozen-Matrix-Zeile GENERATED_AT_AUSNAHME, spec L49 + AC-7)empfohlen, weil vertragself-konsistent (§5.10 Pkt. 3 sagt bereits „Befund-Äquivalenz, nicht Wort-Identität"): der freie CREATE-Body-Wortlaut wird als zweite benannte Ausnahme-Klasse neben at behandelt; Struktur (Slug/Frontmatter/sources/Provenanz-Anker/Claim-Abdeckung/Index-Link) bleibt byte-streng, freier Wortlaut per Claim-/Provenienz-Abdeckung (nicht byte-weise) verglichen. CREATE bleibt in der A/B-Fixture (AC-6 wie geschrieben). Berührt §5.14 Pkt. 3 (Ausnahme-Menge um zweite Klasse erweitern) + frozen spec L49.
  • (b) CREATE aus A/B-Fixture nehmen (revidiert D-3.13-6 Option 1 → 2) — A/B prüft nur den nachweislich byte-deterministischen UPDATE-Pfad; CREATE + Synthese gelten über Sandbox-Sub-Runs 3-3/3-4 als demostriert. AC-6-Auslegung: „Anlage neuer Wissenseinheit" über die Sub-Runs. Vertrag/frozen-Block/FR-2 unangetastet, kleinster Pfad; CREATE nicht mehr im echten frischen-Agenten-A/B-Nachweis.
  • (c) Kanonischer CREATE-Body (substanzieller compiler.md-Change) — CREATE-Body auf aus raw/ mechanisch abgeleitete Form pinnen (exakte Wortfolge der zuerst-belegenden Quelle, anchor-geordnet). Macht CREATE byte-determinisch, A/B bleibt streng. RISIKO: bricht vmtl. FR-2 („eigenständig formuliert, keine Kopie"); eigener breiterer Autorisationsrunde würdig.
  • (d) Teil-Patch liefern, Residual rot lassen — B1+B2 als Epic-1-Remediation geliefert (beseitigt die 22/26-Slug-Hauptursache — echter, dokumentierter Fortschritt); das kleine Prosa-Residual als benannter Defer an spätere Vertrags-Revision/Epic 4 → Gate bleibt rot auf einem kleinen, ehrlich verstandenen Rest; Story 3.13 in-progress.

4. Verifikationsplan (nach Anwendung der jeweils autorisierten Untermenge)

  1. bash -n + Voll-Lesedurchgang schema/compiler.md (keine Fugen-Identitäts-Brüche; alle §-Verweise intakt).
  2. 12 Sandbox-Suiten re-executieren (Sub-Runs, fail-fast; sandbox-3-1..3-12, je exit 0).
  3. Re-Run #6: grüner Voll-Lauf des Gates (_bmad-output/implementation-artifacts/sandbox-3-13/run-sandbox.sh, ~2.53.5 h, Background-Subagent, CLAUDE_BIN = echte winpty-freie claude.exe per P-3-Override, P-16-Floor 32000).
  4. Erwartetes A/B-Ergebnis je Option:
    • (a): E.4 NON_AT=0 (oder NON_AT nur in explizit als zweiter Ausnahme-Klasse ausgewiesenen Body-Wortlaut-Zellen), AT=4grün; F/G laufen (G-1..G-8 + Porcelain).
    • (b): E.4 NON_AT=0 AT=4 (nur UPDATE-Pfad alpha + gamma/index-Erhaltung) → grün; CREATE nicht in A/B (über Sub-Runs 3-3/3-4 belegt).
    • (c): E.4 NON_AT=0 AT=4 (CREATE-Body byte-deterministisch) → grün (vorausgesetzt FR-2-Verstoß als Semantik-Change autorisiert).
    • (d): E.4 NON_AT > 0, nur im kleinen Prosa-Residual → Gate rot, aber auf einem ehrlich isolierten Rest; Befund textuell benannt (NFR-4), Defer angelegt.
  5. AD-3-Porcelain: git status --porcelain des realen Ist-Baums nach Lauf leer; schema/-Diffs nur die autorisierten Rev-3.8-Änderungen; raw//adapters//validator.md/wiki-compiler.md/canonical-terms.md unverändert.

5. Freigabe-Punkte (Nutzer)

  • B1 (Slug) autorisieren? — FR-2-sicher, Q1-item(1), kein frozen-Block.
  • B2 (log-Determinismus) autorisieren? — FR-2-sicher, Q1-item(3), kein frozen-Block.
  • C (Body-Residual) = Option (a) / (b) / (c) / (d)? — (a) berührt frozen spec L49 + §5.14 Pkt. 3; (b) revidiert D-3.13-6; (c) breitere Autorisation (FR-2); (d) Defer.
  • danach: 12-Sandbox-Re-Execution + Re-Run #6 (Task #4/#5).