diff --git a/dispatch_p1_go.md b/dispatch_p1_go.md new file mode 100644 index 0000000..8cdee13 --- /dev/null +++ b/dispatch_p1_go.md @@ -0,0 +1,124 @@ +GO vom Menschen — grind-Container neu gestartet (bullpen-coder mit max_tokens 65536, Modell-Kontext 64k). Bitte Package 1/2 (envelope.lua) unveraendert an @coder dispatchen, fortlaufende Job-Nummer ab 719. + +KAMPAGNE (a) ENGLISH-ONLY — KICKOFF, PACKAGE 1/2: envelope.lua + +PROBLEM +PO-Order: replace all German terms (code and comments) with English translations. Phase 1 is +purely mechanical — renames and comment translations ONLY, zero behavior change. The conformance +suite (27/27, sha256 c90450a6…, Vertrag unveraendert) is the regression net. Erste Stufe: +umschlag.lua wird zu envelope.lua (Dateiname + Modul-Funktion + Parameter), dann versions.lua, +dann lmcp.lua (Integration = Operator-Arbeit). KEINE Logik aendern. + +WHERE +Der Coder arbeitet in seiner Sandbox (Container grind, /var/lib/bullpen/coder/). Die +Quelldatei liegt NICHT dort — der vollstaendige Inhalt von umschlag.lua steht weiter unten +in diesem Ticket. Aus ihm entsteht envelope.lua. Die Zieldatei ist ein REINES Modul. + +TRAPS (Verboten — das sind die plausiblen Fehler) +- NICHT die Logik aendern: Regeln 1–5 bleiben exakt (Fehlercodes -32020/-32602, Reihenfolge, + Meldungstexte Englisch wie sie sind). Es sind NUR Identifier-Umbenennungen + Kommentar-Uebersetzung. +- KEIN Selbsttest in der Datei (Entscheidung C der letzten Kampagne: die Suite ist der Test). +- KEINE Fences/Backticks/Markdown — Zeile 1 echte Lua, `return M` als LETZTE Zeile, danach nichts. +- KEINE weiteren Funktionen, keine print-Ausgaben im Modul. +- Die Funktion heisst NEU `M.check` (nicht mehr `M.pruefe`), Parameter heissen NEU `header` + (nicht `kopf`) und `body` (nicht `rumpf`). Lua-Tabellenzugriffe `kopf[...]` → `header[...]`, + `rumpf.method` → `body.method`, `rumpf.params` → `body.params`. +- Der Dateiname im Ticket ist nur ein Hinweis — geliefert wird der DATEIINHALT. + +ANFORDERUNG (Zieldatei envelope.lua) +Nimm den untenstehenden Quelltext von umschlag.lua und erzeuge daraus envelope.lua: +1. Datei-Kommentarzeilen (oben, -- umschlag.lua … / -- Basis: job667.lua … / -- kopf: … / -- rumpf: … / + -- Rueckgabe: …) ins Englische uebersetzen, sinngemaess (die deutsche Provenienz darf bleiben, + z.B. "Based on job667.lua (coder run 5, #669)"). +2. `function M.pruefe(kopf, rumpf)` → `function M.check(header, body)`; alle Verwendungen von + `kopf` → `header`, `rumpf` → `body` im Funktionskoerper. +3. Inline-Kommentare (-- Regel 1 … -- Erfolg) ins Englische uebersetzen. +4. Regeln, Codes, Meldungstexte, Reihenfolge: UNVERAENDERT. +5. Struktur: `local M = {}` … `return M` (letzte Zeile). Kein Selbsttest. + +ABNAHME (Coder-seitig) +- Sandbox-Parse-Check: `lua5.4 envelope.lua` → exit 0, keine stderr. +- Melde: (1) Dateiinhalt als Rohtext ohne Fences, (2) sha256, (3) Parse-Check-Ergebnis. +- Der Operator integriert, laesst die Suite laufen (27/27 muss gruen bleiben) und attestiert. + +QUELLTEXT (umschlag.lua, komplett): +``` +-- umschlag.lua: Kopf-/Envelope-Pruefung nach Spec 2026-07-28 +-- Basis: job667.lua (coder Lauf 5, #669) — parst, reine Struktur, zwei +-- Defekte per Foreman-Review #671/#674 hier korrigiert: +-- Regel 3: mcp-name-KOPF wird geprueft (war nur params.name/uri) +-- Regel 4: _meta liegt unter rumpf.params._meta (war rumpf.meta) +local M = {} + +-- kopf: Tabelle der HTTP-Kopfzeilen, Namen KLEINGESCHRIEBEN, z.B. +-- {['mcp-method']='tools/list',['mcp-protocol-version']='2026-07-28'} +-- rumpf: dekodierte JSON-RPC-Anfrage als Lua-Tabelle +-- {jsonrpc='2.0',id=1,method='tools/list',params={_meta={...}}} +-- Rueckgabe: true,nil,nil | false,, +function M.pruefe(kopf, rumpf) + if not kopf or not rumpf then + return false, -32600, "Invalid Request" + end + + -- Regel 1: k['mcp-protocol-version'] fehlt + if not kopf['mcp-protocol-version'] then + return false, -32020, 'Missing required header: MCP-Protocol-Version' + end + + -- Regel 2: k['mcp-method'] fehlt + if not kopf['mcp-method'] then + return false, -32020, 'Missing required header: Mcp-Method' + end + + -- Regel 2: k['mcp-method'] ~= rumpf.method + if kopf['mcp-method'] ~= rumpf.method then + return false, -32020, 'Mcp-Method header does not match body' + end + + -- Regel 3: Mcp-Name-Kopf Pflicht bei tools/call, resources/read, prompts/get + local method = rumpf.method + local params = rumpf.params or {} + + if method == 'tools/call' or method == 'prompts/get' then + if not kopf['mcp-name'] or kopf['mcp-name'] ~= params.name then + return false, -32020, 'Mcp-Name header does not match body' + end + elseif method == 'resources/read' then + if not kopf['mcp-name'] or kopf['mcp-name'] ~= params.uri then + return false, -32020, 'Mcp-Name header does not match body' + end + end + + -- Regel 4: _meta-Pflichtfelder (liegen unter params._meta) + local meta = (rumpf.params or {})._meta or {} + if not meta['io.modelcontextprotocol/protocolVersion'] then + return false, -32602, 'Missing required _meta field: io.modelcontextprotocol/protocolVersion' + end + if not meta['io.modelcontextprotocol/clientCapabilities'] then + return false, -32602, 'Missing required _meta field: io.modelcontextprotocol/clientCapabilities' + end + + -- Regel 5: k['mcp-protocol-version'] ~= meta['io.modelcontextprotocol/protocolVersion'] + if kopf['mcp-protocol-version'] ~= meta['io.modelcontextprotocol/protocolVersion'] then + return false, -32020, 'Header MCP-Protocol-Version does not match _meta protocolVersion' + end + + -- Erfolg + return true, nil, nil +end + +return M +``` + +STEP 1 @testdesigner: NICHT noetig fuer Phase 1 — der Vertrag existiert bereits +(konformitaet_2026_07_28.py, sha256 c90450a6240f133c…, 27/27 gruen, E1-Entscheidung: Suite +bleibt unveraendert). @testdesigner kommt erst in Phase 2 (Dual-Protokoll-Suite) zum Zug. + +STEP 2 @coder: envelope.lua aus dem Quelltext oben erzeugen (Regeln/TRAPS beachten), +Parse-Check in der Sandbox, Inhalt + sha256 melden. + +CONSTRAINTS +- Nur /var/lib/bullpen/coder/ in der Sandbox. Kein laufender Dienst, keine anderen Dateien. +- Lieferung als Rohtext im Raum, keine Fences. + +Dispatch, then END YOUR TURN. diff --git a/dispatch_p1_go2.md b/dispatch_p1_go2.md new file mode 100644 index 0000000..65a4f1d --- /dev/null +++ b/dispatch_p1_go2.md @@ -0,0 +1,124 @@ +GO #2 — grind-Container neu gestartet, Patch in grind bestaetigt (MAXBODY 65536, Modell ctx 65536 laut Katalog). Bitte Package 1/2 (envelope.lua) erneut an @coder dispatchen, fortlaufende Job-Nummer. Erwartung: Datei NICHT leer (mind. ~2k chars). + +KAMPAGNE (a) ENGLISH-ONLY — KICKOFF, PACKAGE 1/2: envelope.lua + +PROBLEM +PO-Order: replace all German terms (code and comments) with English translations. Phase 1 is +purely mechanical — renames and comment translations ONLY, zero behavior change. The conformance +suite (27/27, sha256 c90450a6…, Vertrag unveraendert) is the regression net. Erste Stufe: +umschlag.lua wird zu envelope.lua (Dateiname + Modul-Funktion + Parameter), dann versions.lua, +dann lmcp.lua (Integration = Operator-Arbeit). KEINE Logik aendern. + +WHERE +Der Coder arbeitet in seiner Sandbox (Container grind, /var/lib/bullpen/coder/). Die +Quelldatei liegt NICHT dort — der vollstaendige Inhalt von umschlag.lua steht weiter unten +in diesem Ticket. Aus ihm entsteht envelope.lua. Die Zieldatei ist ein REINES Modul. + +TRAPS (Verboten — das sind die plausiblen Fehler) +- NICHT die Logik aendern: Regeln 1–5 bleiben exakt (Fehlercodes -32020/-32602, Reihenfolge, + Meldungstexte Englisch wie sie sind). Es sind NUR Identifier-Umbenennungen + Kommentar-Uebersetzung. +- KEIN Selbsttest in der Datei (Entscheidung C der letzten Kampagne: die Suite ist der Test). +- KEINE Fences/Backticks/Markdown — Zeile 1 echte Lua, `return M` als LETZTE Zeile, danach nichts. +- KEINE weiteren Funktionen, keine print-Ausgaben im Modul. +- Die Funktion heisst NEU `M.check` (nicht mehr `M.pruefe`), Parameter heissen NEU `header` + (nicht `kopf`) und `body` (nicht `rumpf`). Lua-Tabellenzugriffe `kopf[...]` → `header[...]`, + `rumpf.method` → `body.method`, `rumpf.params` → `body.params`. +- Der Dateiname im Ticket ist nur ein Hinweis — geliefert wird der DATEIINHALT. + +ANFORDERUNG (Zieldatei envelope.lua) +Nimm den untenstehenden Quelltext von umschlag.lua und erzeuge daraus envelope.lua: +1. Datei-Kommentarzeilen (oben, -- umschlag.lua … / -- Basis: job667.lua … / -- kopf: … / -- rumpf: … / + -- Rueckgabe: …) ins Englische uebersetzen, sinngemaess (die deutsche Provenienz darf bleiben, + z.B. "Based on job667.lua (coder run 5, #669)"). +2. `function M.pruefe(kopf, rumpf)` → `function M.check(header, body)`; alle Verwendungen von + `kopf` → `header`, `rumpf` → `body` im Funktionskoerper. +3. Inline-Kommentare (-- Regel 1 … -- Erfolg) ins Englische uebersetzen. +4. Regeln, Codes, Meldungstexte, Reihenfolge: UNVERAENDERT. +5. Struktur: `local M = {}` … `return M` (letzte Zeile). Kein Selbsttest. + +ABNAHME (Coder-seitig) +- Sandbox-Parse-Check: `lua5.4 envelope.lua` → exit 0, keine stderr. +- Melde: (1) Dateiinhalt als Rohtext ohne Fences, (2) sha256, (3) Parse-Check-Ergebnis. +- Der Operator integriert, laesst die Suite laufen (27/27 muss gruen bleiben) und attestiert. + +QUELLTEXT (umschlag.lua, komplett): +``` +-- umschlag.lua: Kopf-/Envelope-Pruefung nach Spec 2026-07-28 +-- Basis: job667.lua (coder Lauf 5, #669) — parst, reine Struktur, zwei +-- Defekte per Foreman-Review #671/#674 hier korrigiert: +-- Regel 3: mcp-name-KOPF wird geprueft (war nur params.name/uri) +-- Regel 4: _meta liegt unter rumpf.params._meta (war rumpf.meta) +local M = {} + +-- kopf: Tabelle der HTTP-Kopfzeilen, Namen KLEINGESCHRIEBEN, z.B. +-- {['mcp-method']='tools/list',['mcp-protocol-version']='2026-07-28'} +-- rumpf: dekodierte JSON-RPC-Anfrage als Lua-Tabelle +-- {jsonrpc='2.0',id=1,method='tools/list',params={_meta={...}}} +-- Rueckgabe: true,nil,nil | false,, +function M.pruefe(kopf, rumpf) + if not kopf or not rumpf then + return false, -32600, "Invalid Request" + end + + -- Regel 1: k['mcp-protocol-version'] fehlt + if not kopf['mcp-protocol-version'] then + return false, -32020, 'Missing required header: MCP-Protocol-Version' + end + + -- Regel 2: k['mcp-method'] fehlt + if not kopf['mcp-method'] then + return false, -32020, 'Missing required header: Mcp-Method' + end + + -- Regel 2: k['mcp-method'] ~= rumpf.method + if kopf['mcp-method'] ~= rumpf.method then + return false, -32020, 'Mcp-Method header does not match body' + end + + -- Regel 3: Mcp-Name-Kopf Pflicht bei tools/call, resources/read, prompts/get + local method = rumpf.method + local params = rumpf.params or {} + + if method == 'tools/call' or method == 'prompts/get' then + if not kopf['mcp-name'] or kopf['mcp-name'] ~= params.name then + return false, -32020, 'Mcp-Name header does not match body' + end + elseif method == 'resources/read' then + if not kopf['mcp-name'] or kopf['mcp-name'] ~= params.uri then + return false, -32020, 'Mcp-Name header does not match body' + end + end + + -- Regel 4: _meta-Pflichtfelder (liegen unter params._meta) + local meta = (rumpf.params or {})._meta or {} + if not meta['io.modelcontextprotocol/protocolVersion'] then + return false, -32602, 'Missing required _meta field: io.modelcontextprotocol/protocolVersion' + end + if not meta['io.modelcontextprotocol/clientCapabilities'] then + return false, -32602, 'Missing required _meta field: io.modelcontextprotocol/clientCapabilities' + end + + -- Regel 5: k['mcp-protocol-version'] ~= meta['io.modelcontextprotocol/protocolVersion'] + if kopf['mcp-protocol-version'] ~= meta['io.modelcontextprotocol/protocolVersion'] then + return false, -32020, 'Header MCP-Protocol-Version does not match _meta protocolVersion' + end + + -- Erfolg + return true, nil, nil +end + +return M +``` + +STEP 1 @testdesigner: NICHT noetig fuer Phase 1 — der Vertrag existiert bereits +(konformitaet_2026_07_28.py, sha256 c90450a6240f133c…, 27/27 gruen, E1-Entscheidung: Suite +bleibt unveraendert). @testdesigner kommt erst in Phase 2 (Dual-Protokoll-Suite) zum Zug. + +STEP 2 @coder: envelope.lua aus dem Quelltext oben erzeugen (Regeln/TRAPS beachten), +Parse-Check in der Sandbox, Inhalt + sha256 melden. + +CONSTRAINTS +- Nur /var/lib/bullpen/coder/ in der Sandbox. Kein laufender Dienst, keine anderen Dateien. +- Lieferung als Rohtext im Raum, keine Fences. + +Dispatch, then END YOUR TURN. diff --git a/status_hold_hardware.md b/status_hold_hardware.md index 4abeb64..bbc3c42 100644 --- a/status_hold_hardware.md +++ b/status_hold_hardware.md @@ -64,3 +64,15 @@ Das ist INFRA, keine Gesellschafts-Aufgabe und kein Task-Shape-Problem. - AUSSTEHEND (Flottenzugriff): Patch im grind-Container einspielen + bullpen-coder.service neustarten. Anleitung: /root/harvest/deploy_coder_65536.md. - Danach: Entwarnung an deus, Go des Menschen, dann re-dispatch P1 (envelope.lua) via @foreman. + +## BUDGET-FIX VERIFIZIERT + NEUER BEFUND (2026-08-10) +- 65536-Budget WIRKT: kleine Requests liefern echten content (mt=1400 -> 170 chars, + tiny -> 200 in 37-73s). Leerdatei-Muster (692/696/699/702/725) ist behoben. +- Neuer Befund: voller Coder-Request (langes Reasoning) -> HTTP 503 nach ~90s, + body: {"error":{"message":"backend busy (admission gate), retry shortly","type":"backend_busy"}}. + Das ist Admission-Gate-Lastabwurf, kein Request-Problem. Deckt sich mit + "Hardware ueberlastet" (Mensch). +- Dispatch #2 (ask 749, job 751) -> reply 754: codegen error 503. foreman hat gestoppt + (758), keine weiteren Dispatches ohne Entwarnung. +- Empfehlung: Gate abkuehlen lassen (keine parallelen Probes!), dann EIN sauberer + Re-Dispatch. deus probt nicht mehr parallel zum Coder.