From 3409a41d8534e00f30ea1f40fc35c176848c3bd9 Mon Sep 17 00:00:00 2001 From: marfrit Date: Sun, 9 Aug 2026 00:06:46 +0200 Subject: [PATCH] versions.lua: MCP protocol-version gate, built by the bullpen society Phase B, third attempt. The contract is the head of tests/phase_b_acceptance.lua; this is the module that satisfies it. M.SUPPORTED = {"2025-06-18"} -- and that list is not a guess. The acceptance test anchors it against a LIVE server: it calls initialize and compares M.SUPPORTED to the protocolVersion the server actually reports. The first attempt shipped {"2025-06-18","2025-11-25"} and passed 14/14, because the test then only compared the list against itself; lmcp does not speak 2025-11-25. Answering HTTP 200 to a version header proves nothing -- the same endpoint answers 200 to 1999-01-01. Provenance, all of it in marfrit/bullpen room.jsonl: #218/#234 @coder wrote the module (qwen3.6-coding), two passes rejected first: pass 1 implemented M.is_supported instead of the contract's M.check and embedded its own self-test; pass 2 arrived without a certificate. #246 @testdesigner refused to materialise the file in the clone root -- writing the subject and then greening it yourself collapses the implementer/tester split. The refusal was correct. #256 two certificates, both from container `testdesign`, same test (sha256 78a4758d706a2539, commit e8c18f1e3b03): empty state -> ROT rc 2 (subject absent) these bytes -> GRUEN rc 0, 17/17, live anchor included #283 @deus lifted it out through the room; sha256 byte-identical. sha256 of this file: e5bb0739b84a2354422842cc1be28d2d8ad407307b84e3f05e79faa30e68e5da --- versions.lua | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 versions.lua diff --git a/versions.lua b/versions.lua new file mode 100644 index 0000000..3dce55d --- /dev/null +++ b/versions.lua @@ -0,0 +1,36 @@ +-- versions.lua +-- Modul zur Versionspruefung gemaess LMCP-Vertrag + +local M = {} + +M.SUPPORTED = {"2025-06-18"} + +--- Prueft, ob eine Version unterstuetzt wird. +-- @param version Die zu pruefende Version (String oder nil) +-- @return boolean true wenn unterstuetzt, sonst false +-- @return table|nil Fehlerdetails bei Nichtunterstuetzung +function M.check(version) + -- (a) version == nil oder "" -> true, nil + if version == nil or version == "" then + return true, nil + end + + -- (b) exakter Treffer in M.SUPPORTED -> true, nil + for _, supported_version in ipairs(M.SUPPORTED) do + if version == supported_version then + return true, nil + end + end + + -- (c) alles andere -> false, { code = -32022, data = { supported = M.SUPPORTED } } + return false, { + code = -32022, + data = { + supported = M.SUPPORTED + } + } +end + +-- Keine neuen Globalen, keine Seiteneffekte, M.SUPPORTED wird nicht geaendert + +return M