Skip to content

Bridge refusals and pickup stalls

The central ASGI observer records failed responses (400–599) under /bridge/v1/executions*, /bridge/v1/claims* and /bridge/v1/heartbeat, including the retired standalone POST (410), unmatched paths and unhandled exceptions. It stores only authenticated node attribution, method, registered route template, status, allowlisted error code and UUID path parameters. Request bodies, headers, tokens and response bodies are never stored. Unmatched paths use unmatched. An invalid JSON body or a response over 16 KiB uses unparsed; a JSON error code outside [a-z0-9_]{1,64} uses unknown.

Read recent failures with a read-only operator database connection:

SELECT created_at, node_id, method, route, status, error_code, execution_id, claim_id
FROM bridge_request_failures
WHERE created_at >= now() - interval '24 hours'
ORDER BY created_at DESC
LIMIT 100;

Add AND node_id = '<node UUID>'::uuid to focus on a known Mac. node_id is NULL when authentication did not succeed or the identity has no linked node. The retired POST never authenticates, so its node is NULL even with a bearer.

Recording is best-effort and runs in separate background tasks; the ASGI call does not wait for recording or cancellation cleanup. At most 32 records are in flight; excess records are dropped with a warning containing only the type. Pool acquisition, attribution lookup, INSERT and release share a two-second deadline, with one-second acquisition and query timeouts. Cancellation begins at the deadline, but a slot remains occupied until connection cleanup actually finishes. An error or timeout logs only the exception type and leaves the original status and body unchanged. Shutdown stops admission and cancels/drains the task set for at most two seconds before closing the pool; unfinished cleanup remains referenced and logs a warning. When the pool is unavailable, the 503 not_ready response has no record. This is not a complete audit ledger. Server Beat deletes records older than 14 days, at most 1000 per tick.

The table migration is 061_bridge_request_failures.sql. Its rename from 059 applies to fresh databases only: the earlier file was never deployed. It does not introduce a migration-history transition.

bridge.pickup is retired (S2); Server Beat no longer monitors background pickup or offered executions.