I2664 — A run that has already failed is cancelled by itself, and a red on the trunk is fixed before anything else is prepared
Make the time from a red to its fix the thing the pipeline is built for: a run stops spending runners the moment it cannot be green, and the trunk's red has one carrier at once.
DONE wave 0 · p1 · implementation profile · parallel safe
Part of M004 — Performance is executable evidence, and the hot path does no canonical work twice.
Objective
Make the time from a red to its fix the thing the pipeline is built for: a run stops spending runners the moment it cannot be green, and the trunk's red has one carrier at once.
Why
The owner, 2026-10-13: 'keep fixing red jobs as they appear, cancel early failed pipelines at once, to be more efficient; make it an ADR, knowledge, rule, enforced through .ai; it must not happen again; turnaround speed is king.' That evening a validate run with two failed jobs kept nine more jobs running for twenty minutes while a deployment and a release waited for runners, and its failing log could not be read until it ended.
Current state
Measured 2026-10-13 on validate 38470127001 (master a3a67a307e): the pages job failed at 22:1x and rust (3) at 22:20Z; nine jobs ran on until the run was cancelled by hand at 22:23Z, and the log of the failed job was refused while the run was in progress. The failure was a crate test (tests/skills.rs requires every active skill to be named in its header) broken by a pull request merged with --admin whose lander had run the structure job and no rust lane. ADR 0155 clause 7 lets a lander cancel only its own branch's run, and nothing cancels a run that can no longer pass.
Desired state
The validate workflow ends a run at its first failed job unless the run is the trunk's and asked to finish for diagnosis; a failed job's log is read through the jobs API without waiting for the run. A lander's verdict before an --admin merge includes the crate's tests whenever the change adds or changes a record a crate test reads, and the gate that knows which records those are names them. A red on the trunk is announced with its carrier, and no landing is prepared on top of it until the fix is merged.
Scope
- .github/workflows/validate.yml
- scripts/ci-plan
- .ai/repo/rules/project/an-expedited-landing-is-the-owners-word.v1.md
- .ai/repo/adrs/0155-an-expedited-landing-is-the-owners-word.md
- docs/INTEGRATION.md
- docs/CI.md
- .ai/repo/project/issues/I2664.yaml
Out of scope
- Buying runners
- Publishing by artifact, which is I2660, and the runner bound of validation, which is I2662
Dependencies
None. This issue is a root of the graph.
What waits on this
Acceptance criteria
- A validate run on a branch is cancelled by the workflow itself when one of its jobs has failed, and a case holds the workflow to it
- The rule of expedited landings says which jobs a lander reads for which kind of change, and names the crate tests that read repository records (skills, rules, claims) as part of a record change
- Adding an active skill without naming it where the crate test requires is refused by a structure gate, not first by a rust lane an hour later
Validation
- bin/majordomus plan validate
- scripts/ci/github-check
- scripts/ci-plan --check
Evidence required
- a_failed_run_is_cancelled_case
- skill_named_by_crate_test_gate
Evidence
| covers | type | command | result | at commit |
|---|---|---|---|---|
| a_failed_run_is_cancelled_case | test | MJ_TEST_JOBS=2 bash test/run.sh 3019_a_failed_branch_run_cancels_itself | tests: 1 passed, 0 failed; six mutations of validate.yml each refused (run 2026-10-14 12:54Z on master 2ca25bb9cf plus this change) | 2ca25bb |
| skill_named_by_crate_test_gate | test | MJ_TEST_JOBS=2 bash test/run.sh 3020_an_active_skill_is_named_where_the_crate_test_demands && scripts/ci/skill-naming-check | tests: 1 passed, 0 failed; gate: 8 active skills, each named (run 2026-10-14 12:54Z on master 2ca25bb9cf plus this change) | 2ca25bb |
Timeline
- started
- 2026-10-14T12:55:10Z
- verified
- —
- completed
- 2026-10-14T12:55:14Z
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/I2664.yaml. Read it back with majordomus plan show I2664.