Files
lmcp/dispatch_p1_go2.md
T

6.1 KiB
Raw Blame History

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 15 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.methodbody.method, rumpf.paramsbody.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 kopfheader, rumpfbody 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,<fehlercode>,<meldung>
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.