Skip to content

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.

Searches the titles and descriptions of every page this site publishes.