Free lane out of credits — parked, not failed
A Command Code worker (loop-commandcode-free-build, loop-commandcode-build) that gets 400 You have insufficient credits to make this request is parked instead of failing as a plain error: the lane gets an out-of-credits cooldown (24 h by default, CYBERINE_QUOTA_COOLDOWN_CREDITS_MS), the worker row in run.json carries parked: { kind, reason, until }, its detail reads Parked: ..., and cyberine digest <runId> prints one parked <worker>: out-of-credits, <reason> line (--json adds a parked array). The other workers of the run are not touched, and the next dispatch skips the lane without sending a request until the cooldown ends or cyberine cooldown clear <worker> lifts it.
cyberine digest <runId>
# parked loop-commandcode-free-build: out-of-credits, Command Code answered insufficient credits (...); lane parkedWhen the failover preflight times out at 3 seconds it now names the Command Code lanes whose credit state it could not read: preflight: skipped (headroom reads took over 3000ms; Command Code credit state unread for loop-commandcode-free-build, ...; dispatch continues).
Known Limitations and Deferred Work — free lane credits
- The match is the
insufficient credittext on a 400, 402 orBAD_REQUESTanswer; a provider that rewords it falls back to a plain worker error. - The lane stays classified
free (auth)in the billing table: it is free on the provider's terms while credits exist. The park is the only signal that the account ran dry. - A parked worker keeps
state: error; the park is a field on the row, not a new worker state.
Command Code over ACP (Agent Client Protocol)
Run recipe:
Wait for / digest a background run — cyberine wait, cyberine digest
A background run (cyberine run --bg, chat /run, npm run wf) prints a launch card that carries the run id (its first 8 characters). Two commands turn that id into a hands-off operator loop without...