Repository navigation
Answer a full query queue 429, as PHP does - #975
Conversation
PHP's WorkflowQueryTaskBroker catches QueryTaskQueueFullException and answers queryFailed(..., 'query_task_queue_full', message, 429), with the query refusal body and no Retry-After. Native answered a bare 503 refusal, so clients that back off on 429 treated a full queue as a server fault. Native now answers 429 with PHP's body (workflow_id, run_id, target_scope, query_name, result null, reason and message) and PHP's message: "Query task queue [<queue>] in namespace [<namespace>] reached the configured pending limit of <limit>." The limit is whichever native bound refused the query: MAX_PENDING open queries, or MAX_ENTRIES listed. The same answer covers a full open set at filing time. The cutover's internal refusal is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security bounded review of exact head The merge base is the protected-main commit that merged #965, and the resulting delta is exactly
Hosted checks are rerunning on this rebased exact head, so this is source clearance only. Final carry requires the terminal hosted result; any source change needs re-review. |
|
Security bounded source review of exact head The refusal remains inside the serialized admission transaction, creates no row on either bound, and now carries the exact workflow/run/query/queue/namespace context through the existing query-refusal envelope. The 16-open path reports 16; the open-set filing refusal is translated only from The regression proves 429, reason, exact context/body/message and the active 16 limit; all hosted checks on this head are terminal green. This is a bounded source clearance only: the branch is stacked on #965's merge commit and must be carried onto the eventual 3.0.3 main tip, with a zero-unexpected-diff readback and terminal checks, before merge/release clearance. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Security carry review at exact |
|
|
Security final clearance at exact carry head |



Review tier B: HTTP status and body parity on a single refusal. No storage, locking or auth change.
Stacked on #965 (follow-up to #964). Draft until #965 merges, after which the diff is only this change.
Change
PHP's
WorkflowQueryTaskBrokeranswersQueryTaskQueueFullExceptionwithqueryFailed(..., 'query_task_queue_full', $message, 429): the query refusal body, and noRetry-After. Native answered a bare 503, so clients that back off on 429 treated a full queue as a server fault.Native now answers 429 with PHP's body:
workflow_id,run_id,target_scope,query_name,result: null,reasonandmessage, plus the existing control-plane envelope.MAX_PENDING(16) orMAX_ENTRIES(64).No SDK change is needed: the reason is already in the control-plane contract's rejection reasons.
Tests
queries_bound_abandoned_requests_reclaim_expired_entries_and_deliver_worker_failurenow checks 429, the refusal body and the exact message. All 42 query execution tests pass on SQLite.🤖 Generated with Claude Code