Skip to content

Records cite evidence by URI alone, so an appraisal cannot be reproduced against what was appraised #280

Description

@opento-suggestions

Spec section affected
§3.1 (Logical schema), §3.2 (Wire format), §3.3 (Verification), and §4.3
(Bindings TRACE adds), as carried by schema/trace-claim.json.

Problem

The observation

Four citation fields in the Trust Record carry a bare URI and no digest, so
what a record cites cannot be checked to be what was appraised.

At 5c69dc1, schema/trace-claim.json carries
four citation fields that are a bare URI with no digest member beside them:
appraisal.policy_ref ("URI to the appraisal policy used."),
transparency (the SCITT receipt URI), runtime.rim_uri, and
model.aibom_uri (appraisal.verifier is also a bare URI but names the
verifier rather than an artifact, and is not counted). Three surfaces pair the URI with a
digest: policy.policy_uri beside policy.bundle_hash,
tool_transcript.transcript_uri beside tool_transcript.hash, and
build_provenance.provenance_uri beside build_provenance.digest; the
references[].digest member is optional, "when the producer holds it at issue
time". The four are top-level fields of the record, not entries in
references; the rules #226 quotes for that mechanism
do not reach them. appraisal.policy_ref appears in spec/trace-v0.2.md once, at line
241, as an example value.

The one bound object shows the spec already knows how: policy.bundle_hash
is required, patterned ^sha(256:[0-9a-f]{64}|384:[0-9a-f]{96})$, described
as "SHA-256 or SHA-384 digest of the policy bundle in force at execution
time", and the spec prose states the binding in its own words (line 590):
"TRACE adds the binding: the policy bundle hash is sealed to the TEE
measurement". #276 (opened 2026-09-03) is doing the same work
for delegation.parent_record_hash, stating a preimage the schema alone left
open.

The consequence

A second verifier resolving the same URI at appraisal-check time verifies
whatever is deployed at that moment, not what was appraised. Where
resolution fails outright, #190 and now
#279 govern what the verifier records; where it
succeeds, nothing at this head makes "the same object" checkable. The tree
states the mechanism for schemas in its own words:

"A validator built from the bundle file alone resolves that by fetching the
published schema over the network, so it checks a nested statement against
whatever is deployed rather than against the file next to it, and with no
network it is unresolvable."
(tests/test_safe_integer_range.py lines 607-610 at
5c69dc1)

Where this has been raised

Proposed change

Decide one of three, on the record: digest binding of cited evidence is a
norm in v0.2; it is a profile option; or it is explicitly out of scope. Any
of the three closes this issue. Nothing is proposed beyond the decision: no
schema change is attached, and this is not a defect report. It is not
#279's question either: that tracker names how
absence is recorded, per surface; this one asks whether presence can be
bound.

Backward compatibility

  • Non-breaking (new optional field, informative addition)
  • Breaking (removes or changes required field, changes wire format, changes algorithm set)

Motivation

#271 made appraisal outcomes reproducible from
retained facts, and #279's fifth discipline (no
positive verdict by default) is the same rule one layer up; the citations
those outcomes rest on are the remaining unbound layer.

Measured at 5c69dc1, 2026-09-03T23:02:28Z: 21 open
issues and 6 open PRs, none holding this question.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions