Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2416

The ci verdict asks every selected gate for a receipt, and a gate whose step never ran is red

Where it stands

devtask.issue
Readiness
complete completion is recorded and every required evidence token is present
Status
DONE
Can start
not now
Milestone
Milestone status
ACTIVE
Wave
0
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
1 of 1
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2416

majordomus plan verify I2416

majordomus plan done I2416

What it is

Objective
Make scripts/ci/verdict green only when every gate the plan selected left a receipt from the step that ran it, every receipt `success`: a job's success is not a gate's, because a job carries many gates and a step its condition skipped does not fail the job. Cancelled, skipped, missing and absent never pass, and each has a fixture.
Why
CI Delivery V4 item V4-02-03 (the owner's mission, relayed by ce on 2026-10-10). The verdict decided from job results alone. scripts/ci/verdict already turned a selected gate red when its job was cancelled, skipped or absent, but a job reports `success` when one of its steps was skipped by its own `if:`, and validate.yml runs most gates in steps with conditions of their own, reading the plan's outputs rather than the plan. A selected gate whose step was skipped — a condition reading another output, a step id renamed, a gate moved to another job — passed without running. The cockpit job's vendoring step was even labelled with the site job's gate `cockpit-assets`, so its success would have answered for a skipped `--check`.
Now
scripts/ci/verdict reads the plan and the `needs` context only. scripts/ci/timed and scripts/ci/run-plan record timings, not outcomes. No artifact says which gate's step ran.
Wanted
Every gate job sets MJ_CI_RECEIPTS and uploads its receipts as ci-receipts-<job>: scripts/ci/timed and scripts/ci/run-plan append \"<gate><TAB><success|failure><TAB><source>\" per step and per gate, and a closing `if: always()` step records `steps.<id>.outcome` for each gate step that runs any other way. The ci job downloads every ci-receipts-* artifact and runs the verdict with --receipts, which is required. A selected gate whose job succeeded is red with no receipt, and red when any receipt is `skipped`, `cancelled`, `failure` or empty (read as `absent`); no receipts at all is red for every selected gate.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • A selected gate whose job succeeded and which left no receipt makes the verdict red, naming the gate and its job
  • A selected gate with a receipt `skipped`, `cancelled`, `failure` or an empty outcome makes the verdict red, naming the outcome, whatever its job reported
  • No receipts directory, or an empty one, is red for every selected gate; a verdict asked without --receipts is a usage error
  • A receipt of a gate the plan did not select changes nothing
  • scripts/ci/timed and scripts/ci/run-plan write one receipt per step and per gate they ran, and none for a gate run-plan skips
  • Every gate job of validate.yml uploads ci-receipts-<job>, and the ci job passes --receipts
Validation
bin/majordomus plan validateMJ_TEST_JOBS=4 bash test/run.sh 94_ci_plan 26_ci_wiringactionlint .github/workflows/validate.yml
Evidence required
receipt_verdict_fixtures
Evidence present
receipt_verdict_fixtures

Scope

Touches
scripts/ci/verdictscripts/ci/timedscripts/ci/run-plan.github/workflows/validate.ymltest/cases/94_ci_plan.shtest/cases/26_ci_wiring.sh
Not
Cancelling moot runs (V4-02-04), the build-once artifact (V4-03), case selection by impact (V4-04-01), the long tail (V4-04-02) and the 300 s budget (V4-05-04): the other items of the mission.Requiring receipts from each matrix lane by name: a gate is green with at least one receipt and every receipt `success`; which lanes must each report is not declared in the gate model.
Depends on
none
Priority
p1
Profile
implementation
Parallel safe
true
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-11
Updated
2026-10-14T08:00:55Z
Started
2026-10-14T08:00:49Z
Verified
unknown: the record declares no `verified_at`
Completed
2026-10-14T08:00:55Z

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

Nothing is wrong with these records.