I2662 — Validation leaves the deployment a runner: a branch's checks never hold the pool a publication or a release record needs
Bound what validation may occupy, so that the two things only the trunk can do, publish and record a release, start when they are ready.
READY wave 0 · p1 · implementation profile · parallel safe
Part of M004 — Performance is executable evidence, and the hot path does no canonical work twice.
Ready. Every dependency is done, so majordomus plan start I2662 will be accepted.
Objective
Bound what validation may occupy, so that the two things only the trunk can do, publish and record a release, start when they are ready.
Why
The owner, 2026-10-13: 'investigate what is slow ... solve it systemically, prevent it next time' and 'this must be analysed and solved through .ai/; it must not happen again'. Measured that day: a merge reached production 45 to 61 minutes later, and two landings of the evening were not served an hour after they merged.
Current state
Measured 2026-10-13: jobs of the pages workflow waited 78 to 876 s for a runner in two finished runs and 20.5 minutes in a third, while several validate runs of branches were queued or running; each validate run starts about nineteen jobs. No rule says how much of the pool validation may take, and a run nobody will read is cancelled only by hand (ADR 0155 clause 7).
Desired state
The validate workflow declares how many of its jobs may run at once and cancels a branch's superseded run by itself; a run on the trunk, a deployment and a release run are never cancelled and never wait behind a branch's matrix. The wait of a pages job for a runner is recorded per run and has a declared bound.
Scope
- .github/workflows/validate.yml
- .github/workflows/pages.yml
- .ai/repo/ci/gates.yaml
- scripts/ci-plan
- docs/CI.md
- .ai/repo/project/issues/I2662.yaml
Out of scope
- Buying runners
- What the gates check
Dependencies
None. This issue is a root of the graph.
Acceptance criteria
- A new push to a branch cancels that branch's unfinished validate run; the trunk's runs are never cancelled
- The number of validate jobs running at once has a declared maximum, and a case holds the workflow to it
- Over a day of landings no pages job waits longer for a runner than the declared bound, read from the recorded timings
Validation
- bin/majordomus plan validate
- scripts/ci/github-check
- scripts/ci-plan --check
Evidence required
- runner_wait_per_pages_job_over_a_day
- superseded_run_cancelled_case
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I2662.yaml. Read it back with majordomus plan show I2662.