Summary
adapters/decisions/sqlite_decisions.py _parse_cursor swallows a parse failure and silently falls back to page 1 on a malformed cursor query param, instead of returning a clean 4xx. Fails SAFE (no crash, no wrong data) but diverges from ADR-0029's cursor-envelope contract and the "malformed input → clean 4xx" expectation.
Acceptance criteria
Origin: PR #107 (#47 backend) security review, non-blocking. Related: ADR-0029 D2.
Summary
adapters/decisions/sqlite_decisions.py_parse_cursorswallows a parse failure and silently falls back to page 1 on a malformedcursorquery param, instead of returning a clean 4xx. Fails SAFE (no crash, no wrong data) but diverges from ADR-0029's cursor-envelope contract and the "malformed input → clean 4xx" expectation.Acceptance criteria
cursoronGET /decisionsSHALL yield a 400/422, not a silent page-1 reset.Origin: PR #107 (#47 backend) security review, non-blocking. Related: ADR-0029 D2.