diff --git a/handover_naechste_kampagne.md b/handover_naechste_kampagne.md new file mode 100644 index 0000000..628af34 --- /dev/null +++ b/handover_naechste_kampagne.md @@ -0,0 +1,176 @@ +# Handover: Nächste Kampagne — (a) English-Only + (b) Dual-Protokoll + +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." + +--- + +## 0. Wo wir stehen (verifizierter Zustand, nicht Behauptung) + +- `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. + +## 1. Ziele und Reihenfolge — NICHT tauschen + +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. + +## 2. IST-Zustand: Inventar des Deutschen (verifiziert) + +| Datei | deutsche Identifiers | deutsche Kommentare | +|---|---|---| +| `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** | + +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: …"). + +Suchmaske für die Rest-Inventur (Phase 1, erster Schritt): +`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 + +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.) +- `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. + +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). + +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. + +## 4. Phase 2: Dual-Protokoll — 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). + +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`. + +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 `). + +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. + +## 5. Gesellschafts-Routing (Bullpen) — Ausführung liegt bei der Gesellschaft + +- **@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. + +## 6. Traps (Erfahrung dieser Kampagne, unverändert gültig) + +- 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. + +## 7. Mechanik & Betrieb + +- 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. + +## 8. PO-Entscheidungen, die vor Phase 2 nötig sind + +- **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). + +## 9. Referenzen + +- 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`