Skip to content

spec: image-trust contracts — measured, not asserted, for OS and agent images - #287

Merged
mdheller merged 1 commit into
mainfrom
spec/image-trust-measured
Aug 4, 2026
Merged

spec: image-trust contracts — measured, not asserted, for OS and agent images#287
mdheller merged 1 commit into
mainfrom
spec/image-trust-measured

Conversation

@mdheller

@mdheller mdheller commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Applies the Assay's measured-not-asserted discipline to images, unified across OS and agents (your ask: images measured the same way, for both).

The gap this closes

The estate already had Measurement (the "may I rely on this number" primitive with a gateEligible ceiling) — but:

  • OSImage.provenance / AgentPassport carry only asserted refs and booleans, no measured outcome of verifying them.
  • ImagePromotionGate.decision: approved was self-assertable — no gate-eligible evidence required. That's the exact F2 bug the Assay hardening removed, at image scale.
  • Agents had no image-artifact identity to measure.

What's added

  • ImageTrustReport — per-dimension measured checks (reproducibility, attestation_verify, sbom_completeness, signature_verify, measured_boot, provenance_depth), each carrying a Measurement via $ref, plus a render-time projectedTrust (ok/sad/bad). Unifies OS and agent images via subjectKind.
  • AgentImage — agent runtime-artifact identity + provenance, parallel to OSImage (distinct from process-level AgentPassport).
  • ImagePromotionGate — now requires trustReportRef when decision: approved (non-breaking if/then).

Reuse, not reinvention

Each check $refs Measurement.json, so Measurement's own invariants apply for free: a declared/assumed check is gate-ineligible by shape (can't reach ok), a measured one must name its instrument. measured_boot is fed by the existing BootProofRecord/AttestationEvidence.

Enforcement (all verified biting)

validate-image-trust-examples:

  • projection soundnessprojectedTrust recomputed from the checks;
  • gate soundnessapproved must reference a report projecting ok (the cross-document half if/then can't express).

Negative tests confirmed: approved-without-ref → rejected; declared+gateEligible → rejected (via the Measurement $ref); measured-without-instrument → rejected; a gate-eligible failure → bad; approved→sad-report → rejected. Passes the referential-integrity gate (338 schemas, all 136 $refs resolve). Examples: an ok OS image, a sad agent image (declared SBOM), an AgentImage, and the gate wired to the OS report.

Same shape as the Assay, one level over: AssayStandardReasoningAssay for claims; MeasurementImageTrustReportImagePromotionGate for images.

…t images

Applies the Assay's measured-not-asserted discipline to images. The estate
already had Measurement (may-I-rely-on-this-number, gateEligible ceiling) but
nothing forced an image's trust to be measured or the promotion gate to consume
it — and agents had no image-artifact identity at all.

- ImageTrustReport: per-dimension trust checks (reproducibility, attestation_verify,
  sbom_completeness, signature_verify, measured_boot, provenance_depth), each
  carrying a Measurement via $ref, plus a render-time projectedTrust ok/sad/bad.
  Unifies OS and agent images through subjectKind. Reusing Measurement by $ref
  means its invariants apply for free — a declared/assumed check cannot reach ok,
  a measured one must name its instrument (both verified biting).
- AgentImage: agent runtime-artifact identity + provenance parallel to OSImage,
  distinct from process-level AgentPassport — so agents are measured like OS images.
- ImagePromotionGate: requires trustReportRef when decision=approved (non-breaking
  if/then). The validator adds the cross-document rule: approved must reference a
  report projecting ok. Closes the self-assertable-approval gap (Assay F2) for images.

validate-image-trust-examples enforces projection soundness + gate soundness.
Passes the referential-integrity gate (338 schemas, all 136 $refs resolve).
5 negative tests confirmed biting; examples for an ok OS image + a sad agent image.
@mdheller
mdheller merged commit 1e46f7b into main Aug 4, 2026
9 checks passed
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.

1 participant