go-jsonrpc-error-precedence-ordering
Wrote the solution to ~/solution.md.
Root cause: The HTTP handler has a fixed validation precedence. A worker moved the JSON-RPC version check (-32600) ahead of the session/resource lookup. Because {} is valid JSON but fails the version check, a request to a dead sessionId short-circuited to a -32600 envelope over HTTP 200 before the handler ever checked whether the session existed — so the guard tests expecting HTTP 410 + typed error code failed.
Correct precedence (per DF-CONSENSUS-25):
1. missing-param guard -> plain-text 400 (first, unchanged)
2. body parse -> -32700 (outranks resource state; needed to echo req id)
3. session/resource lookup -> 410 + typed code (must happen before version check)
4. version check -> -32600
5. dispatch
Fix: Cut the if req.JSONRPC != "2.0" { ... } block and paste it immediately after the if !h.SessionAlive(sessionID) { ... } block. Leave the missing-param, parse, and 410 paths untouched.
The document includes the before/after Go code, error-code constants, a full decision table, four runnable regression tests (TestStaleSessionWinsOverVersionCheck, TestParseErrorOutranksStaleSession, TestVersionCheckOnLiveSession, TestMissingParamPlainText), curl smoke checks, and a checklist.
# Evidence - Problem class: go-jsonrpc-error-precedence-ordering - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-25T16:39:11.274Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Consensus DF-CONSENSUS-25: JSON-RPC-over-HTTP handler for stale sessionId. Worker moved the -32600 version check BEFORE the session lookup, so a {}-bodied POST to a dead session returned the version error (HTTP 200 JSON-RPC envelope) instead of the resource-gone signal; guard tests expecting 410 failed. Rule that worked: parse errors (-32700) outrank resource state (need body parse to echo request id), but version errors (-32600) do NOT - move the version check AFTER the resource lookup so resource-gone (410 + typed error code) is detectable regardless of body validity. Keep the missing-param 400 plain-text path first as-is.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "go-jsonrpc-error-precedence-ordering", "provider": "openrouter", "solved_at": "2026-09-25T16:39:11.281Z", "version": ""}Wrote the solution to ~/solution.md.
Root cause: The HTTP handler has a fixed validation precedence. A worker moved the JSON-RPC version check (-32600) ahead of the session/resource lookup. Because {} is valid JSON but fails the version check, a request to a dead sessionId short-circuited to a -32600 envelope over HTTP 200 before the handler ever checked whether the session existed — so the guard tests expecting HTTP 410 + typed error code failed.
Correct precedence (per DF-CONSENSUS-25):
1. missing-param guard -> plain-text 400 (first, unchanged)
2. body parse -> -32700 (outranks resource state; needed to echo req id)
3. session/resource lookup -> 410 + typed code (must happen before version check)
4. version check -> -32600
5. dispatch
Fix: Cut the if req.JSONRPC != "2.0" { ... } block and paste it immediately after the if !h.SessionAlive(sessionID) { ... } block. Leave the missing-param, parse, and 410 paths untouched.
The document includes the before/after Go code, error-code constants, a full decision table, four runnable regression tests (TestStaleSessionWinsOverVersionCheck, TestParseErrorOutranksStaleSession, TestVersionCheckOnLiveSession, TestMissingParamPlainText), curl smoke checks, and a checklist.
# Evidence - Problem class: go-jsonrpc-error-precedence-ordering - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-25T16:39:11.274Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Consensus DF-CONSENSUS-25: JSON-RPC-over-HTTP handler for stale sessionId. Worker moved the -32600 version check BEFORE the session lookup, so a {}-bodied POST to a dead session returned the version error (HTTP 200 JSON-RPC envelope) instead of the resource-gone signal; guard tests expecting 410 failed. Rule that worked: parse errors (-32700) outrank resource state (need body parse to echo request id), but version errors (-32600) do NOT - move the version check AFTER the resource lookup so resource-gone (410 + typed error code) is detectable regardless of body validity. Keep the missing-param 400 plain-text path first as-is.", "environment": "", "language": "", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "go-jsonrpc-error-precedence-ordering", "provider": "openrouter", "solved_at": "2026-09-25T16:39:11.281Z", "version": ""}