You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
M2: curated mutually-exclusive query parameters — order+cursor refusal at the route boundary (V10) #28
Source: multi-agent review of PR #26, adversarial verification (CONFIRMED, severity 2, shipped-runtime). 2026-08-14. M-anchor: M2 breadth continuation — opens with a small decision batch because it adds curation surface, and curation changes are API reviews (ADR-0008).
The pinned message-list contract says of cursor: "Do not combine with order" (spec/openapi.json:4182-4195), and the pinned server returns InvalidCursorError for the pair (packages/server/src/handlers/message.ts:34-40). The SDK sends ?order=asc&cursor=cur and lets the server refuse; Q77 precedent places known query invariants at the route boundary instead.
Verifier-endorsed direction (do NOT hand-patch generated routes, do NOT put a universal guard on the hand-written ListRequest — session-list legitimately composes both and its contract test pins that):
Decision: an operation-level mutually-exclusive-query metadata row in fail-closed curation (OpenAPI carries this relation only as prose, so it cannot be derived mechanically).
OperationPlanBinder validates the named properties against the selected operation.
RoutesEmitter.EmitQueryComposition emits an ArgumentException guard before any query is built.
Binder/emitter snapshot coverage + a ListMessagesAsync contract test proving refusal happens before a request is sent.
Sealed as the issue's verifier-endorsed direction (research log Session 24): an operation-level mutually-exclusive-query curation row, fail-closed binder validation, route-boundary ArgumentException before any request, plus the no-send contract test. Session-list's legitimate order+cursor composition stays untouched. Executes with the M2 breadth continuation per the M3 plan's interleave note.
Session 29 / ADR-0013 (7f771eb) supersedes this behavior-premised curation decision. The pinned OpenAPI carries the order+cursor relation only as prose, so #54 removes the local mutual-exclusion row and no-send guard. The server's declared InvalidCursorError remains on the typed error path. Historical landing evidence remains valid; this comment records the planned correction.
Activity
docs(agents): hand off the M2 close-out — Q91 research, fix batch, me…
docs: seal Q92 (ADR-0010) and open M3 — simplicity-first construction…
Blind-Striker commentedon Aug 15, 2026
Sealed as the issue's verifier-endorsed direction (research log Session 24): an operation-level mutually-exclusive-query curation row, fail-closed binder validation, route-boundary ArgumentException before any request, plus the no-send contract test. Session-list's legitimate order+cursor composition stays untouched. Executes with the M2 breadth continuation per the M3 plan's interleave note.
feat: refuse curated mutually-exclusive query pairs at the route boun…
Blind-Striker commentedon Aug 17, 2026
Session 29 / ADR-0013 (7f771eb) supersedes this behavior-premised curation decision. The pinned OpenAPI carries the order+cursor relation only as prose, so #54 removes the local mutual-exclusion row and no-send guard. The server's declared InvalidCursorError remains on the typed error path. Historical landing evidence remains valid; this comment records the planned correction.