Skip to content

woodpecker decisions

Every woodpecker decision, by area. Generated from the decision files at build time.

ID Decision Status Record
DL-530 A queued workflow times out when its task has been runnable in Info.Pending longer than pending-timeout and no live agent matches its labels; for scale-from-zero pools this is age-only, and a hostname-pinned task never times out. Active (Matt, 2026-10-16) ../../pending-task-timeout.md#decisions
DL-531 pending-timeout defaults to 6h, on by default; 0 disables. Active (Matt, 2026-10-16) ../../pending-task-timeout.md#decisions
DL-532 A timed-out workflow and its pending steps end error with the reason in their Error fields, never canceled, which posts success. Active (Matt, 2026-10-16) ../../pending-task-timeout.md#decisions
DL-533 The sweep finalizes only the timed-out workflow and the dependents that can never run; running siblings and runs_on: failure dependents continue. Active (Matt, 2026-10-16) ../../pending-task-timeout.md#decisions
DL-534 An agent counts as live when NoSchedule is false and its LastContact is within pending-timeout. Active (Matt, 2026-10-16) ../../pending-task-timeout.md#decisions
ID Decision Status Record
DL-565 The reconciler owns only the pipeline’s aggregate check run (when StatusAggregate is on) and its meta check run (when StatusMeta is on and a pull request pipeline has a meta gate), matched by external_id wp1/<instance>/<number>/<kind>; per-workflow and informational runs and pull_request_closed pipelines are out of scope. Active (Matt, 2026-10-19) ../../status-reconciler.md#decisions
DL-566 An owned check run is repaired when its pipeline is terminal and the run is queued, in_progress or absent; a completed run with a conclusion unlike the stored verdict is counted as mismatch and not written. Liveness is never used. Active (Matt, 2026-10-19) ../../status-reconciler.md#decisions
DL-567 Delivered state is read from the check runs of the SHA, one list per owned name filtered by App, name and filter=all. Active (Matt, 2026-10-19) ../../status-reconciler.md#decisions
DL-568 A pull request pipeline’s head is read before its delivered state, so a stale head is superseded; a newer run of the name from another pipeline is also superseded; the later-owner store check and the head read run again under the key lock right before each repair write. Active (Matt, 2026-10-19) ../../status-reconciler.md#decisions
DL-569 Repairs reuse the cutover’s check-run poster with a single write attempt (a PATCH by run id, or a guarded create when absent) and never neutralize older runs; a refresher skip returns types.ErrSuperseded. Active (Matt, 2026-10-19) ../../status-reconciler.md#decisions
DL-570 The reconciler runs every 2m over terminal pipelines updated in the last 3h but not the last 2m. Active (Matt, 2026-10-18) ../../status-reconciler.md#decisions
DL-571 Handled pipelines are remembered in process, one entry per pipeline; a restart sweeps the lookback again. Active (Matt, 2026-10-18) ../../status-reconciler.md#decisions
DL-572 One pass sends at most 30 GitHub requests, token mints and retries included; quota below 20 % of the limit or a rate-limit error ends the pass. Active (Matt, 2026-10-18) ../../status-reconciler.md#decisions
DL-573 A pipeline whose repair write fails three times is gave_up; unhandled work that leaves the lookback is expired. Active (Matt, 2026-10-18) ../../status-reconciler.md#decisions
DL-574 The reconciler exports a results counter, a calls counter and a backlog gauge. Active (Matt, 2026-10-18) ../../status-reconciler.md#decisions
DL-575 Running the reconciler on more than one server replica is unsupported, because write ordering relies on a per-process key lock. Active (Matt, 2026-10-18) ../../status-reconciler.md#decisions
DL-576 Reconciler tests use a hand-written fake forge, since the generated MockForge lacks optional capabilities. Active (Matt, 2026-10-18) ../../status-reconciler.md#decisions