Data Model: CI Pipeline Honesty — Actionable Fixes

This mission is CI tooling; the "entities" are the value objects the two extracted helpers compute over. No persistent storage.

#4360-B — shard completeness (reconcile_shards.py)

(37 total at base). Identity: (module, shard_index).

(all registry shards selected — legacy behaviour).

artifact produced by a component workflow.

shard absent from BOTH current and fallback ⇒ missing ⇒ complete = False (fatal).

fallback/backfill artifact does NOT satisfy a selected shard.

missing) if absent.

  • RegistryShard: module: str, shard_index: int — a row from the module-shard registry
  • SelectedSet: the shards the diff-scoped matrix chose for this run. None ⇒ full-mode
  • ShardArtifact: module, shard_index, fresh: bool (present in the current run) — coverage
  • CompletenessResult (the load-bearing output):
  • complete: bool
  • missing: list[RegistryShard]
  • Rule: a shard is required iff it is in SelectedSet (or SelectedSet is None). A required
  • Rule (must_be_fresh invariant): a SELECTED shard must be fresh in the current run; a
  • Rule: an UNSELECTED shard is optional — backfilled from a prior run if available, ignored (never

Invariant (NFR-001): complete = True requires every SELECTED shard fresh. No relaxation may let a selected-but-absent shard read complete.

#4208 — blocking classification (router_gate.py)

action_required (jobs-API vocabulary; needs-context only ever yields the first five, never timed_out`).

timed_out-as-a-form-of-cancelled all block); only the reported label distinguishes timed_out from cancelled.

  • JobConclusion: one of `success | failure | cancelled | timed_out | skipped | startup_failure |
  • BlockingEntry: job: str, conclusion: JobConclusion.
  • GateDecision:
  • blocking: dict[job, conclusion] — jobs whose conclusion ∈ blocking set.
  • blocks: bool — True iff blocking non-empty.
  • Rule: the blocking set membership is UNCHANGED from baseline (failure, cancelled, and

Invariant (NFR-001): blocks is byte-identical to baseline for every {failure, cancelled} input distribution; classification adds labels, never changes the verdict.

#4454 / #4212 — no new value objects

Pure config: #4454 adds routing globs (matched by the existing select_modules parser); #4212 adds shell exit-code capture + a terminal gate step. Their behaviour is pinned by the existing workflow-lint / gate-selection authority tests, not by a new data type.