From bbe620642650fdd0b170e437540581e6e523bee5 Mon Sep 17 00:00:00 2001 From: deus Date: Sun, 9 Aug 2026 19:18:03 +0000 Subject: [PATCH] Handover: English version, PO decisions E1=no E2=old E3=deferred --- handover_naechste_kampagne.md | 285 +++++++++++++++++----------------- 1 file changed, 144 insertions(+), 141 deletions(-) diff --git a/handover_naechste_kampagne.md b/handover_naechste_kampagne.md index 628af34..433a4c5 100644 --- a/handover_naechste_kampagne.md +++ b/handover_naechste_kampagne.md @@ -1,176 +1,179 @@ -# Handover: Nächste Kampagne — (a) English-Only + (b) Dual-Protokoll +# Handover: Next Campaign — (a) English-Only + (b) Dual-Protocol -An: neue deus-Sitzung · Von: deus (Kampagne Konformität 2026-07-28) · Datum: 2026-08-09 -PO-Auftrag: „(a) alle deutschen Begriffe (Code und Kommentare) durch englische ersetzen und -(b) Dual-Protokoll-Unterstützung für beide MCP-Fassungen implementieren." +To: new deus session · From: deus (2026-07-28 conformance campaign) · Date: 2026-08-09 +PO order: "(a) replace all German terms (code and comments) with English translations and +(b) implement dual-protocol support for both MCP versions." +PO decisions already made: **E1 = no, E2 = old, E3 = PO decides at delivery** (see §8). --- -## 0. Wo wir stehen (verifizierter Zustand, nicht Behauptung) +## 0. Where we stand (verified state, not claims) -- `konformitaet_2026_07_28.py lmcp.lua` → **27/27, exit 0**, attestiert (bullpen-attest, - URTEIL GRUEN, pruefling sha256 `856a07c4`, test sha256 `c90450a6240f133c…` — identisch mit - der Übergabe, Vertrag nicht abgeschwächt). Belege: `/root/harvest/abnahme_2026_07_28.md`, - Artefakte `/root/harvest/artefakte_konformitaet/`, Commit `6b4684f`, `/root/harvest.bundle`. -- Arbeitskopie: `/root/spec-2026-07-28/` (`lmcp.lua` 1829 Z, `server.lua` 1187 Z, `json.lua`, - `versions.lua`, `umschlag.lua`, Suite, `SPEC-AUSZUG.md`, `UEBERGABE.md`). - **Der laufende Raum-Server ist unberührt** — er läuft die ALTE Fassung (2025-06-18) mit - initialize. Auch in dieser Kampagne gilt: nur Arbeitskopie ändern, Deployment = Mensch. -- Alte Fassung vollständig implementiert in `/root/harvest/_lmcp_ref @ 3409a41` - (initialize/ping/logging/setLevel, Session-Auflösung) — die Referenz für Phase 2. +- `konformitaet_2026_07_28.py lmcp.lua` → **27/27, exit 0**, attested (bullpen-attest, + verdict GRUEN, impl sha256 `856a07c4`, test sha256 `c90450a6240f133c…` — identical to the + handoff, contract not weakened). Evidence: `/root/harvest/abnahme_2026_07_28.md`, + artifacts `/root/harvest/artefakte_konformitaet/`, commit `6b4684f`, `/root/harvest.bundle`. +- Working copy: `/root/spec-2026-07-28/` (`lmcp.lua` 1829 lines, `server.lua` 1187 lines, + `json.lua`, `versions.lua`, `umschlag.lua`, conformance suite, `SPEC-AUSZUG.md`, + `UEBERGABE.md`). + **The live room server is untouched** — it runs the OLD version (2025-06-18) with + initialize. This campaign likewise only touches the working copy; deployment is the PO's + call (E3). +- Old version fully implemented in `/root/harvest/_lmcp_ref @ 3409a41` + (initialize/ping/logging/setLevel, session resolution) — the reference for Phase 2. -## 1. Ziele und Reihenfolge — NICHT tauschen +## 1. Goals and order — do not swap -1. **(a) English-Only zuerst.** Mechanisch, null Verhaltensänderung, die Suite bleibt das - Regressionsnetz. Reine Umbenennung/Übersetzung erst, dann Logik — sonst vermischt du - Rename mit Feature und kleine Modelle entgleisen garantiert. -2. **(b) Dual-Protokoll danach.** SUPPORTED = beide Fassungen, fassungs-routende - Verteilung. Erst erweitert @testdesigner die Suite (Vertrag), dann implementiert die - Gesellschaft, zuletzt Integration + Attest. +1. **(a) English-only first.** Mechanical, zero behavior change, the suite stays the + regression net. Renames/translations first, logic later — mixing rename with feature + work is how small models derail. +2. **(b) Dual protocol after.** SUPPORTED = both versions, version-routed dispatch. + First @testdesigner extends the suite (the contract), then the society implements, + finally integration + attestation. -## 2. IST-Zustand: Inventar des Deutschen (verifiziert) +## 2. As-is: inventory of German terms (verified by scan) -| Datei | deutsche Identifiers | deutsche Kommentare | +| File | German identifiers | German comments | |---|---|---| -| `lmcp.lua` | `umschlag`, `kopie`, `gewuenscht`, `zulaessig`, `fehler`, `_fehler_status` (Z.1087), `_status_fuer_fehlercode` (Z.1095), `kodiert`, `e_meldung` (Z.1140) | vereinzelt, aber echt: Z.493 („Ohne dieses Feld faellt…"), Z.754 („eine fehlende von einer fehlerhaften URI…") — vollständige Inventur ist Phase-1-Arbeit (Suchmaske unten) | -| `umschlag.lua` | `M.pruefe`, `kopf`, `rumpf` (17 Vorkommen) | nein | -| `versions.lua` | `kopie` (3×, Kopie-Schutz in `check()`) | nein | -| `server.lua`, `json.lua` | 0 | 0 (sauber) | -| Suite (Python) | — | ja: „Fassungsaushandlung", „Koepfe", „Pflicht", „gestrichene Methoden" — **aber: Vertrag, siehe Entscheidung E1** | +| `lmcp.lua` | `umschlag`, `kopie`, `gewuenscht`, `zulaessig`, `fehler`, `_fehler_status` (L.1087), `_status_fuer_fehlercode` (L.1095), `kodiert`, `e_meldung` (L.1140) | scattered but real: L.493 ("Ohne dieses Feld faellt…"), L.754 ("eine fehlende von einer fehlerhaften URI…") — full inventory is Phase-1 work (search mask below) | +| `umschlag.lua` | `M.pruefe`, `kopf`, `rumpf` (17 occurrences) | none | +| `versions.lua` | `kopie` (3×, copy-protection in `check()`) | none | +| `server.lua`, `json.lua` | 0 | 0 (clean) | +| Suite (Python) | — | yes ("Fassungsaushandlung", "Koepfe", "Pflicht", "gestrichene Methoden") — **but: contract, decision E1 = keep as-is** | -Wichtig: Die Suite hat **0 Assertions auf `error.message`** — Meldungstexte im Server sind -frei übersetzbar, ohne den Vertrag zu brechen. User-facing Strings sind bereits englisch -(„Unsupported protocol version", „Method not found: …"). +Key facts: the suite has **0 assertions on `error.message`** — server message texts may be +translated freely without breaking the contract; user-facing strings are already English +("Unsupported protocol version", "Method not found: …"). -Suchmaske für die Rest-Inventur (Phase 1, erster Schritt): +Search mask for the remaining inventory (Phase 1, first step, Lua files only — NOT the suite): `grep -nE '[äöüßÄÖÜ]|(pruefe|kopf|rumpf|umschlag|kopie|fehler|gewuenscht|zulaessig|anfrage|antwort|methode|fassung|meldung|kodiert|entfernt|befehl|umgebung|ausgabe|schritt|wert|pruefung|sitzung)' lmcp.lua versions.lua umschlag.lua` -## 3. Phase 1: English-Only — Scope und Akzeptanz +## 3. Phase 1: English-only — scope and acceptance -Umbenennungen (verbindlich): -- `umschlag.lua` → `envelope.lua`; `M.pruefe` → `M.check`; `kopf` → `header`; `rumpf` → `body`. - (`require('umschlag')` in lmcp.lua Z.15 und alle Aufrufstellen mitziehen.) +Binding renames: +- `umschlag.lua` → `envelope.lua`; `M.pruefe` → `M.check`; `kopf` → `header`; `rumpf` → `body` + (update `require('umschlag')` at lmcp.lua L.15 and all call sites). - `versions.lua`: `kopie` → `copy`. - `lmcp.lua`: `_fehler_status` → `_error_status`, `_status_fuer_fehlercode` → `_status_for_error_code`, `kodiert` → `encoded`, `e_meldung` → `e_message`, - `gewuenscht` → `requested`, `zulaessig` → `allowed`, `fehler` (lokal) → `err`, - `kopie` (Z.480–487, resultType-Kopie) → `copy`, `umschlag` (lokal) → `envelope`. -- Alle deutschen Kommentare übersetzen (inkl. Z.493, Z.754). -- `_meta`-Schlüssel (`io.modelcontextprotocol/*`), JSON-RPC-Codes, Methodennamen, - HTTP-Status: **NICHT anfassen** — das sind Spez-Schlüssel. + `gewuenscht` → `requested`, `zulaessig` → `allowed`, `fehler` (local) → `err`, + `kopie` (L.480–487, resultType copy) → `copy`, `umschlag` (local) → `envelope`. +- Translate all German comments (incl. L.493, L.754). +- **Do NOT touch:** `_meta` keys (`io.modelcontextprotocol/*`), JSON-RPC codes, method + names, HTTP statuses — spec keys. -Akzeptanz pro Paket (jede Datei = EIN Paket, ein Modell, ein Pass): -1. `luac -p ` → parse ok. -2. Suite grün: `cd /root/spec-2026-07-28 && python3 konformitaet_2026_07_28.py lmcp.lua` → 27/27. -3. Smoke-Test (Rezept unten) → dieselben 6 Ergebnisse wie vorher. -4. Diff-Check: nur Umbenennung/Kommentare, KEINE Logikänderung (git diff gegen Vorher; - bei `kopie`-Kopie: Inhalt gleich, nur Name). +Acceptance per package (one file = ONE package, one model, one pass): +1. `luac -p ` → parses. +2. Suite green: `cd /root/spec-2026-07-28 && python3 konformitaet_2026_07_28.py lmcp.lua` → 27/27. +3. Smoke test (recipe in §7) → the same 6 results as before. +4. Diff check: renames/comments only, NO logic change (git diff against before; for the + `kopie` copy: same content, different name). -Trap Phase 1: „Ich verbessere nebenbei" ist verboten — jedes nicht-Rename-Delta ist ein -Fehler. Die Suite prüft Verhalten, nicht Innereien: ein rename-bedingter Logikfehler -(vertauschte Variable) kann grün bleiben — deshalb der Diff-Check. +Phase-1 trap: "improving things along the way" is forbidden — any non-rename delta is a +defect. The suite checks behavior, not internals: a rename-induced logic bug (swapped +variable) can stay green — hence the diff check. -## 4. Phase 2: Dual-Protokoll — Design +## 4. Phase 2: Dual protocol — design -Fassungen: **2025-06-18** (alt, implementiert, initialize vorhanden — heute auf dem -Raum-Server) und **2026-07-28** (neu, jetzt 27/27-konform, initialize gestrichen/SEP-2575). +Versions: **2025-06-18** (old, implemented, has initialize — today on the room server) and +**2026-07-28** (new, now 27/27-conformant, initialize removed per SEP-2575). -Bausteine: -1. `versions.lua`: `M.SUPPORTED = {"2025-06-18", "2026-07-28"}` (discover kopiert SUPPORTED → - Keystone-Check „enthaelt 2026-07-28" bleibt grün; `check()`-Vertrag unverändert: - nil/"" erlaubt, Unbekanntes → `{code=-32022, data={supported=}}`). -2. **Fassungs-Erkennung** am Request-Anfang: `MCP-Protocol-Version`-Kopf oder - `_meta["io.modelcontextprotocol/protocolVersion"]`. Keine Fassungs-Info → alte Fassung - (Rückwärtskompatibilität für die Bestandsklienten des Raums; PO-Entscheidung E2). -3. **Envelope-Pflicht nur für 2026-07-28-Klienten** (`umschlag`/`envelope`-Check bleibt, - aber fassungs-bedingt). Alte Klienten senden keine `Mcp-Method`/`MCP-Protocol-Version` - — für sie darf der Check nicht feuern. -4. **initialize/ping/logging/setLevel wieder aktiv, aber NUR für alte Klienten** (aus - `_lmcp_ref @ 3409a41` zurückholen, fassungs-gated). Ein 2026-07-28-Klient, der - `initialize` ruft, bekommt weiter `-32601` — DAS hält die `entfernt`-Checks grün - (die Suite sendet immer 2026-07-28). Fassungs-Routing ist Pflicht: nicht „sendet Kopf - ja/nein", sondern „welche Fassung". -5. Fassungs-Gate: Unbekanntes → -32022 + 400 + `data.supported` (beide) + `data.requested`. +Building blocks: +1. `versions.lua`: `M.SUPPORTED = {"2025-06-18", "2026-07-28"}` (discover copies SUPPORTED → + the keystone check "contains 2026-07-28" stays green; `check()` contract unchanged: + nil/"" allowed, unknown → `{code=-32022, data={supported=}}`). +2. **Version detection** at request start: `MCP-Protocol-Version` header or + `_meta["io.modelcontextprotocol/protocolVersion"]`. **No version info → OLD version + (E2, decided)** — the room's existing clients speak 2025-06-18 without headers. +3. **Envelope enforcement only for 2026-07-28 clients** (the `umschlag`/`envelope` check + stays but becomes version-conditional). Old clients send no `Mcp-Method`/version header + — the check must not fire for them. +4. **initialize/ping/logging/setLevel active again, ONLY for old clients** (restore from + `_lmcp_ref @ 3409a41`, version-gated). A 2026-07-28 client calling `initialize` still + gets `-32601` — THAT keeps the `entfernt` checks green (the suite always sends + 2026-07-28). Route by the version ANNOUNCED, not by "header present?". +5. Version gate: unknown → -32022 + 400 + `data.supported` (both) + `data.requested`. -Akzeptanz Phase 2: -- Bestehende Suite **unverändert 27/27** (nichts abgeschwächt). -- Neue erweiterte Suite (von @testdesigner, siehe unten): alte Fassung → discover listet - beide, initialize/ping funktionieren, kein Envelope-Zwang; neue Fassung → alle 27 - Verhalten wie gehabt; 1900-01-01 → -32022 mit beiden in `supported`. -- Attest für beide Suiten (`bullpen-attest --impl lmcp.lua --test `). +Acceptance: +- Existing suite **unchanged 27/27** (nothing weakened). +- New extended suite (by @testdesigner, §5): old version → discover lists both, + initialize/ping work, no envelope requirement; new version → all 27 behaviors as before; + 1900-01-01 → -32022 with both in `supported`. +- Attestation for both suites (`bullpen-attest --impl lmcp.lua --test `). -Trap Phase 2: Abschwächung der neuen Checks („das prüft jetzt eh niemand mehr") — -die 27 müssen stehen bleiben, die Keystone-Prüfung eingeschlossen. Und: Routing nach -„Kopf vorhanden?" ist falsch; maßgeblich ist die Fassungs-ANGABE. +Phase-2 trap: weakening the new-spec checks ("nobody will test that anyway") — the 27 must +stand, keystone included. And routing by "header present?" is wrong; the version ANNOUNCED +is what matters. -## 5. Gesellschafts-Routing (Bullpen) — Ausführung liegt bei der Gesellschaft +## 5. Society routing (bullpen) — execution belongs to the society -- **@testdesigner**: (a) Phase-2-Vertrag = erweiterte, fassungs-bewusste Suite - (alte-Fassung-Fälle oben); (b) das ist die Abnahme, keine Selbsttests in Coder-Paketen. -- **@coder**: Ein Paket = eine Datei / ein Baustein, mit Akzeptanzbefehl im Ticket - (kleine Modelle: bounded units, sonst Nicht-Konvergenz — in dieser Kampagne 3 Fehlschläge - in Folge wegen Selbsttest-Mechanik, dann Entscheidung C: die Suite ist der Test). -- **@foreman**: Orchestriert; Tickets mit PROBLEM/WHERE/TRAPS/STEP1(@testdesigner)/STEP2/ - „Dispatch, then END YOUR TURN." Ein grünes Wort zählt nicht — `bullpen-attest`-Zertifikat - verlangen (Checksumme des Tests, Container mit Shell, exit code als Urteil). -- **Integration in lmcp.lua = Operator-Arbeit** (wie in der letzten Kampagne vom PO - freigegeben), NICHT Coder-Arbeit. -- @reviewer-Runner ist defekt (opencode-Permission-Infra) — Ersatz-Abnahme ist das Attest. +- **@testdesigner**: (a) Phase-2 contract = extended version-aware suite (old-version cases + above); (b) that suite is the acceptance — no self-tests inside coder packages. New suite + code written in English (fresh code; PO goal (a) applies to code). +- **@coder**: one package = one file / one building block, acceptance command in the ticket + (small models: bounded units, else non-convergence — this campaign saw 3 consecutive + failures from self-test mechanics, then decision C: the suite is the test). +- **@foreman**: orchestrates; tickets with PROBLEM/WHERE/TRAPS/STEP1(@testdesigner)/STEP2/ + "Dispatch, then END YOUR TURN." A green word is not acceptance — demand the + `bullpen-attest` certificate (test checksum, container with a shell, exit code as verdict). +- **Integration into lmcp.lua = operator work** (as approved by the PO last campaign), not + coder work. +- @reviewer runner is broken (opencode-permission infra) — the attestation is the + substitute acceptance. -## 6. Traps (Erfahrung dieser Kampagne, unverändert gültig) +## 6. Traps (this campaign's experience, still valid) -- Grün ≠ richtig: Test lesen, bevor man ihm traut; Fortschritt = laufende Suite. -- Vertrag nie anfassen: Suite-Checksumme `c90450a6240f133c…` vor/nach jeder Etappe - prüfen (sha256-Vergleich als Nachweis; Gaming-Warnung des PO). -- Kein laufender Dienst anfassen: nur `/root/spec-2026-07-28/`. -- Selbsttest-Anforderung an Coder = Verschwendung (3 von 4 Fehlschlägen); die Suite ist der Test. -- 308 von curl im deus-Container war ein Shell-Fehler (`PORT=x && cmd &` backgroundet die - ganze Kette) — nicht als Infra-Problem verbuchen; einfach wie die Suite mit urllib testen. -- „Kopf-Fassung == _meta-Fassung" (Regel 5 des Envelopes) bleibt auch im Dual-Betrieb für - neue Klienten Pflicht. +- Green ≠ correct: read the test before trusting it; progress = the running suite. +- Never touch the contract: suite checksum `c90450a6240f133c…` before/after every stage + (sha256 comparison as proof; PO's gaming warning). +- Never touch a running service: only `/root/spec-2026-07-28/`. +- Self-test requirements on coder = waste (3 of 4 failures); the suite is the test. +- The 308-from-curl incident in the deus container was a shell bug (`PORT=x && cmd &` + backgrounds the whole chain) — not infra; test with urllib like the suite does. +- "Header version == _meta version" (envelope rule 5) stays mandatory for new clients even + in dual mode. -## 7. Mechanik & Betrieb +## 7. Mechanics & operations -- Raum: `set -a; . /etc/bullpen-room.env; set +a` (LMCP_HOST=10.115.156.241, PORT=8080); - posten via `lmcp-tool room_say from=deus to=@foreman body=…` + `secret=` aus - `/etc/bullpen/post-secret.d/deus` (python-subprocess funktioniert, Text nie auf der - Kommandozeile). Sender muss in TRUST stehen; Verifikation im Empfänger-Lurker-Log, - nie im eigenen ok:true. -- @foreman-Sitzung VOR Kampagnenstart zurücksetzen (`.session` im Lurker-Verzeichnis, - entsteht beim nächsten Poke neu) + Lurker neu starten. Lurkers resümieren ab gespeicherter - id — Nachricht vor Neustart = hinter ihnen, ggf. neu sagen. -- Eine Kampagne pro Sitzung. Eskalation nur lokal → `[free]`-Katalog, NIE bezahlt; - schlägt alles fehl: Paket UMFORMEN, nicht hochstufen. Präzise Sackgasse = Ergebnis. -- Smoke-Rezept (funktioniert, getestet 2026-08-09): `LMCP_PORT=

LMCP_TOKEN=konf-smoke - LMCP_HOST=127.0.0.1 LUA_PATH="/root/spec-2026-07-28/?.lua;;" lua5.4 server.lua`; URL - `http://127.0.0.1:

/mcp`; Header `Authorization: Bearer konf-smoke`, `Accept: - application/json, text/event-stream`, `MCP-Protocol-Version`, `Mcp-Method`; Antwort ist - SSE → `data: `-Zeile extrahieren. 6 Erwartungen: discover 200/supportedVersions; - 1900-01-01 → 400/-32022+data; 2025-06-18 → 400/-32022 (in Phase 1; ab Phase 2: 200 — - DAS ist der sichtbare Dual-Beleg); initialize → 404/-32601; ohne Mcp-Method → 400/-32020; - ohne _meta → 400/-32602. -- Attest: `cd /root/spec-2026-07-28 && bullpen-attest --impl lmcp.lua --test ` — - das menschenlesbare ABNAHME-Blatt ist das Zertifikat. +- Room: `set -a; . /etc/bullpen-room.env; set +a` (LMCP_HOST=10.115.156.241, PORT=8080); + post via `lmcp-tool room_say from=deus to=@foreman body=…` + `secret=` from + `/etc/bullpen/post-secret.d/deus` (python-subprocess works; never put text on the command + line). Sender must be in TRUST; verify in the RECIPIENT's lurker log, never in your own + ok:true. +- Reset @foreman's session BEFORE campaign start (`.session` in its lurker directory, + recreated on next poke) + restart its lurker. Lurkers resume from a stored id — a message + posted before a restart is behind them; say it again. +- One campaign per session. Escalation: local only → `[free]` catalogue, NEVER paid; if all + tiers fail, RESHAPE the package, don't escalate. A precise dead end is a result. +- Smoke recipe (tested 2026-08-09): `LMCP_PORT=

LMCP_TOKEN=konf-smoke LMCP_HOST=127.0.0.1 + LUA_PATH="/root/spec-2026-07-28/?.lua;;" lua5.4 server.lua`; URL `http://127.0.0.1:

/mcp`; + headers `Authorization: Bearer konf-smoke`, `Accept: application/json, text/event-stream`, + `MCP-Protocol-Version`, `Mcp-Method`; response is SSE → extract the `data: ` line. + 6 expectations: discover 200/supportedVersions; 1900-01-01 → 400/-32022+data; + **2025-06-18 → Phase 1: 400/-32022; from Phase 2 on: 200 — that is the visible dual + proof**; initialize → 404/-32601; no Mcp-Method → 400/-32020; no _meta → 400/-32602. +- Attestation: `cd /root/spec-2026-07-28 && bullpen-attest --impl lmcp.lua --test ` — + the human-readable ABNAHME sheet is the certificate. -## 8. PO-Entscheidungen, die vor Phase 2 nötig sind +## 8. PO decisions (RESOLVED) -- **E1 Suite-Übersetzung**: Empfehlung NEIN (Vertrag = Integritätsanker, Checksummen-Beleg). - Falls doch gewünscht: als eigener, klar markierter Schritt NACH Phase 2, mit neuem - Checksummen-Stand dokumentiert. Phase 1 übersetzt nur den Server-Code. -- **E2 Klienten ohne Fassungsangabe**: Empfehlung = alte Fassung (Bestandsklienten des - Raums sprechen 2025-06-18, senden keine Köpfe — sonst bricht der Raum beim Rollout). -- **E3 Deployment**: wann/wo die neue lmcp.lua landet, entscheidet der Mensch; die - Arbeitskopie wird nur gebündelt (`harvest-bundle` → `/root/harvest.bundle`). -- **E4 Meldungstexte**: bleiben englisch (Suite prüft keine Texte; alte Raumklienten - matchen ggf. auf deutsche Meldungen — vor Phase-2-Deployment abklären). +- **E1 — translate the existing suite? NO (decided).** The suite is the contract and its + checksum is the integrity anchor; its German comments stay. Phase 1 translates the server + code only. (New suite code from @testdesigner is written in English.) +- **E2 — clients without version info? OLD (decided).** Default to 2025-06-18 for backward + compatibility with the room's existing clients; otherwise the room breaks on rollout. +- **E3 — deployment? OPEN (PO decides when the result is ready).** The working copy is only + bundled (`harvest-bundle` → `/root/harvest.bundle`); the PO decides where/when it lands. + Note for rollout: old room clients may match on German message texts — clarify before + deploying (message texts themselves stay English). -## 9. Referenzen +## 9. References -- Arbeitskopie: `/root/spec-2026-07-28/` · Artefakte: `/root/harvest/artefakte_konformitaet/` -- Alte Fassung: `/root/harvest/_lmcp_ref @ 3409a41` -- Kampagnen-Workspace: `/root/harvest` (Commit `6b4684f` = Stand 27/27) -- Vertrag: `konformitaet_2026_07_28.py`, sha256 `c90450a6240f133cec63d0989aa6bac777c5b61370217f06b53342ff8c70ff11` -- Anker lmcp.lua: Envelope-Block `_dispatch_post` (Z.1139–1166), `_fehler_status` Z.1087, - `_status_fuer_fehlercode` Z.1095, Session-Resolution-Initialize-Sonderfall Z.1198 - (für Phase 2: ersetzen durch fassungs-gated initialize aus 3409a41) -- Übergabe-Original: `/root/spec-2026-07-28/UEBERGABE.md`, Spec-Auszug `SPEC-AUSZUG.md` +- Working copy: `/root/spec-2026-07-28/` · Artifacts: `/root/harvest/artefakte_konformitaet/` +- Old version: `/root/harvest/_lmcp_ref @ 3409a41` +- Campaign workspace: `/root/harvest` (commit `6b4684f` = 27/27 state) +- Contract: `konformitaet_2026_07_28.py`, sha256 `c90450a6240f133cec63d0989aa6bac777c5b61370217f06b53342ff8c70ff11` +- lmcp.lua anchors: envelope block in `_dispatch_post` (L.1139–1166), `_fehler_status` L.1087, + `_status_fuer_fehlercode` L.1095, session-resolution initialize special case L.1198 + (for Phase 2: replace with version-gated initialize from 3409a41) +- Original handoff: `/root/spec-2026-07-28/UEBERGABE.md`, spec excerpt `SPEC-AUSZUG.md`