Skip to content

feat(scripts): fleet-status — freshness report over recorded input-hashes - #305

Merged
elronbandel merged 1 commit into
mainfrom
elron/fleet-status
Aug 9, 2026
Merged

feat(scripts): fleet-status — freshness report over recorded input-hashes#305
elronbandel merged 1 commit into
mainfrom
elron/fleet-status

Conversation

@elronbandel

Copy link
Copy Markdown
Contributor

Resolves #304. Rung 4 of #292's migration path (rules #293, hash primitive #298, label stamping #303).

What

The rule-14 comparison — the fleet's freshness becomes observable:

  • containers/scripts/fleet-status.sh — for every static bake target: derive the registry ref from the graph's context column (the dot-safe join key — bake target names mangle models/gpt-5.4), read eval.input-hash from the image config at a tag, classify fresh / stale / unlabeled / absent. Everything non-fresh is "changed" under rule 14 — the set the next release must rebuild or retag (rung 5's input).
  • .github/workflows/fleet-status.yml — dispatch-only, packages: read: runs the sweep against any tag, writes a per-verdict summary + a collapsible non-fresh list, warns on stale. Report-only; nothing gates. This is the report feat(release): end-of-run fleet inventory report (completeness + freshness) #233 wanted, keyed on content instead of build dates.
  • tests/static/fleet_status.rs — offline (stubs docker on PATH): proves every verdict and every registry read shape — manifest list with attestation entries (labels live in the per-arch config, never the index — feat(release): incremental combos — skip unchanged via a content-hash tag #239's measured trap), single-arch config object, labeled-but-hashless, absent — plus the dotted-model ref map, over the real repo's 153 targets.

Design notes

  • Combos are deliberately not read. A combo is stale iff one of its parents is (its hash is derived), so ~150 leaf reads cover the ~5,500-combo fleet — the audit-validated implication that keeps rung 5 off the thousands-of-registry-round-trips path.
  • Read path handles both shapes: imagetools inspect --format '{{json .Image}}' yields a platform-keyed map for manifest lists and a bare config for single-arch images; the jq filter selects linux/amd64 // linux/arm64 or falls through, ignoring unknown/unknown attestations.
  • Expected side is one fleet-hash run — graph and hashes share row order, so the join is a paste; inspects fan out over xargs -P.
  • First real dispatch doubles as the push-and-readback proof for feat(release): stamp eval.input-hash on every pushed image #303's labels (a dry run can't push, so the registry has no stamped images until the next real fleet dispatch; until then everything reads unlabeled/absent — which is exactly what rule 14 says it should).

Rules checked against

…shes (#304)

Rung 4 of the carried-forward ladder (#292): the rule-14 comparison.
containers/scripts/fleet-status.sh derives every static target's
registry ref from the graph's context column (dot-safe — target names
mangle models/gpt-5.4), reads eval.input-hash from the image config at
a tag via imagetools inspect --format '{{json .Image}}' (labels live in
the per-arch config, never the index; both manifest-list and single-arch
shapes handled, attestation entries ignored), and classifies each image
fresh / stale / unlabeled / absent — everything non-fresh is 'changed'
under rule 14 and is what the next release must rebuild or retag.

Combos are deliberately not read: a combo is stale iff a parent is (the
hashes are derived), so ~150 leaf reads cover the ~5,500-combo fleet.

.github/workflows/fleet-status.yml (dispatch-only, packages:read) runs
the sweep against any tag and writes a per-verdict summary + stale
warnings — the report #233 wanted, now keyed on content instead of
build dates. Report-only; nothing gates.

tests/static/fleet_status.rs proves every verdict and read shape
offline by stubbing docker on PATH: fresh via a manifest list with an
attestation entry, stale via a single-arch config, unlabeled, absent,
plus the dotted-model ref map, over the real repo's 153 targets.

Signed-off-by: Elron Bandel <elron.bandel@ibm.com>
@elronbandel
elronbandel merged commit c48470b into main Aug 9, 2026
6 checks passed
@elronbandel
elronbandel deleted the elron/fleet-status branch August 9, 2026 14:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

drift: delivery/RULES.md#14 — nothing compares recorded input-hashes against the repo (fleet freshness unobservable)

1 participant