Skip to content

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

coverstypecommandresultat commit
a_failed_run_is_cancelled_casetestMJ_TEST_JOBS=2 bash test/run.sh 3019_a_failed_branch_run_cancels_itselftests: 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_gatetestMJ_TEST_JOBS=2 bash test/run.sh 3020_an_active_skill_is_named_where_the_crate_test_demands && scripts/ci/skill-naming-checktests: 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.

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