feat: disinto validate rejects CI steps with no timeout declared #1137
Labels
No labels
action
backlog
blocked
bug-report
cannot-reproduce
in-progress
in-triage
needs-triage
prediction/actioned
prediction/dismissed
prediction/unreviewed
priority
rejected
reproduced
tech-debt
underspecified
vision
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: disinto-admin/disinto#1137
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of the architectural response to the 2026-04-21 CI chaos-monkey cascade (Codeberg #843).
Problem
The proximate cause of the 4-hour factory freeze was a single
curlcall in.woodpecker/edge-subpath.ymlwith no--max-time. The Woodpecker agent's own ~1h step deadline was the only backstop, and with agent capacity=1 that was enough to starve the whole queue. Fix #1131 added timeout flags to that one curl. But the class of bug — a CI step with no wall-clock ceiling — is still reachable from every new.woodpecker/*.ymlfile agents and operators author.Per-step discipline is not a safety mechanism. The framework has to enforce it.
Desired behaviour
bin/disinto validate(and any CI-config generation path the factory uses) fails when a step in.woodpecker/**.ymlhas neither of:timeout:declaration (Woodpecker supports this per-step).Missing timeout → non-zero exit with actionable message:
Further: any
curl,wget,npm,yarn,pip,cargo,gem install,go get,brew installinvocation inside a step's commands that lacks an explicit per-command timeout flag (e.g.curl --max-time,wget --timeout) should also trigger a validator warning. External-network calls are the dominant flake surface; they need belt-and-suspenders on top of the step-level timeout.Fix sketch
bin/disinto validate(or add a newlint-cisubcommand invoked from validate) with a pass over every.woodpecker/*.yml.timeoutkey exists; if not, check workflow-level default; if not, emit error with file:step coordinates.commands:list: pattern-match known network-fetch binaries; if found without a timeout flag, emit warning with--max-time/--timeoutsuggestion.Acceptance
disinto validatefails on a repo that has even one step without a timeout..woodpecker/*.ymlfiles pass (back-populate timeouts before landing the check).curl https://example.comand clears when--max-time Nis added..disinto/docs/and in the validator's--helpoutput.shellcheck/yamllintclean.Out of scope
Related
disinto validaterejects CI steps with no timeout declared (#1137) #1149