Sibling POST handlers 500 on malformed JSON (parse-JSON-or-400 asymmetry) #21
Open
opened 2026-08-02 14:15:47 -07:00 by vh
·
0 comments
No Branch/Tag Specified
main
diag/r30-gap-injection-harness
diag/r30-phi0-step-response
diag/r29-pad-series
graphify-tooling
v0.22.3
v0.22.2
v0.22.1
v0.22.0
v0.21.20
v0.21.19
v0.21.18
v0.21.17
v0.21.16
v0.21.15
v0.21.14
v0.21.13
v0.21.12
v0.21.11
v0.21.10
v0.21.9
v0.21.8
v0.21.7
v0.21.6
v0.21.5
v0.21.4
v0.21.3
v0.21.2
v0.21.1
v0.21.0
v0.20.17
v0.20.16
v0.20.15
v0.20.14
v0.20.13
v0.20.12
v0.20.11
v0.20.10
v0.20.9
v0.20.8
v0.20.7
v0.20.6
v0.20.5
v0.20.4
v0.20.3
v0.20.2
v0.20.1
v0.20.0
v0.19.9
v0.19.8
v0.19.7
v0.19.6
v0.19.5
v0.19.4
v0.19.3
v0.19.2
v0.19.1
v0.19.0
v0.18.11
v0.18.10
v0.18.9
v0.18.8
v0.18.7
v0.18.6
v0.18.5
v0.18.4
v0.18.3
v0.18.2
v0.18.1
v0.18.0
v0.17.17
v0.17.16
v0.17.15
v0.17.14
v0.17.13
v0.17.12
v0.17.11
v0.17.10
v0.17.9
v0.17.8
v0.17.7
v0.17.6
v0.17.5
v0.17.4
v0.17.3
v0.17.2
v0.17.1
v0.17.0
v0.16.1
v0.16.0
v0.15.1
v0.15.0
v0.14.2
v0.14.1
v0.14.0
v0.13.0
v0.12.0
v0.11.0
v0.10.0
v0.9.0
v0.8.2
v0.8.1
v0.8.0
v0.7.1
v0.7.0
v0.6.5
v0.6.4
v0.6.3
v0.6.2
v0.6.1
v0.6.0
v0.5.1
v0.5.0
v0.4.1
v0.4.0
v0.3.0
v0.2.1
v0.2.0
v0.1.0
Labels
Clear labels
blocked-needs-contract
blocked-needs-dependency
bug
cli
documentation
duplicate
enhancement
invalid
needs-architect-decision
needs-info
needs-triage
observability
ready-for-agent
sse-client
task
tui
wontfix
Sleipnir refuses dispatch — issue-scoped contract missing
Sleipnir holds dispatch — INV-029 dependency-aware gate
Something is not working
Command-line surface (--send, --new, --session, etc.)
Docs / contract / spec work
Duplicate of another issue
New feature or improvement
Not a real issue
Escalated for a design call
More info required from reporter
Newly filed, not yet sorted
Log-pane / debug-surface work (persona, admin events, Bifrost, tools)
Gates AFK dispatch via Sleipnir (applied by /sleipnir-preflight)
SSE consumer module (src/ratatoskr/sse_client.py)
Implementation task
Textual app shell + presenters
Accepted as not-fixing
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: vh/ratatoskr#21
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
_tts_endpointnow guards its JSON body (bad JSON / non-str → deterministic 400; untrustedfields degrade, never 500). Its sibling POST handlers do NOT:
_create_session_endpoint(
server.py:188) and_submit_turn_endpoint(server.py:~294) callawait request.json()with no guard, so a malformed JSON body raises
json.JSONDecodeError→ an uncaught 500.Surfaced by the heid code-review + bug-hunt panels on the TTS chunking work (2026-08-02;
Regin F4 / Kimi F5): the validation asymmetry is now that every POST handler EXCEPT
_tts_endpoint500s on malformed JSON. Pre-existing (unchanged code), so deliberately outof scope for the TTS commit (
d59f907) — filing as the follow-up.Repro:
POST /api/sessionswith bodynot json{→ 500 (want 400)POST /api/turns/{sid}with bodynot json{→ 500 (want 400)POST /api/ttswith bodynot json{→ 400 (the correct shape)Fix: hoist a shared "parse JSON body or 400" helper and route all POST handlers through it
(mirrors
_tts_endpoint'stry: await request.json() except (json.JSONDecodeError, ValueError): → 400).Low-risk, additive; each handler keeps its own field validation.
Provenance: heid panels — code-review thread
01KZ21MCC0FKQP59NFZPXCK17B, bug-hunt thread01KZ21RNYH1DPSCPKWVXB9YTVQ.