Skip to content

v0.3: let a record name the agent manifest it ran under #483

Open

Description

@imran-siddique

A TRACE v0.2 record cannot say which approved agent deployment produced it. schema/trace-claim.json has no manifest field and the top level is additionalProperties: false, so a producer cannot add one. Agent Manifest spec §6.3.2 says TRACE envelopes MUST carry agent_manifest_id and manifest_verification_result, which a v0.2 record cannot satisfy, so the two specs disagree today.

This matters for external receipts too. A PACT receipt or any other authorization receipt can only reach a record through references[], and §3.1.2 says a verifier MUST NOT treat a resolved reference as attested evidence.

Proposal for v0.3: an optional top-level manifest object with id, digest and media_type, covered by the record signature. Two drafts already point this way: ManifestRef in schema/trace-token-experimental-v1.json and runtime.evidence.binds: "manifest-digest" in schema/trace-claim-v0.3-draft.json. One shape should serve both.

Open questions:

  • Does the record carry the verification result, or only the reference, leaving appraisal to the verifier?
  • Should the Agent Manifest §6.3.2 MUST be relaxed to match whatever v0.3 adopts?

Activity

  1. babyblueviper1 commented on Oct 9, 2026

    @babyblueviper1
    Contributor

    @imran-siddique on the first question, I'd carry only the reference and leave appraisal to the verifier, for the reason §3.1.2 already gives. A result the producer writes is an assertion about bytes the verifier can fetch and hash itself. If the record carries manifest_verification_result, a verifier that copies it forward reports verified on a manifest it never checked.

    Vectors for the shape you proposed, manifest {id, digest, media_type} inside the signed record: trace-manifest-ref-v0, 6 cases, offline checker (Python + cryptography), v0.2 embedded signatures over JCS.

    • Digest matches the resolved manifest bytes: established.
    • Digest mismatch (the id now resolves to a later deployment): fails, including when the signed record also says manifest_verification_result: verified.
    • Manifest not resolvable: not-established with a named reason, not a pass, and the record itself still verifies (rule 3 of §3.1.2).
    • manifest added after signing: the signature check fails before the manifest is looked at.
    • Control, no manifest: v0.2 behaviour unchanged.

    check.py --mutants also runs four wrong checkers (trusts the asserted result, treats unresolvable as a pass, skips the signature-first step, rejects the record when the manifest is unresolvable); each is caught by at least one case. It runs in CI on every push.

    It's the same pattern as poisoning_scan.subject_digest in agent-manifest #486: bind the subject by digest, and check the binding before the result.

    On the second question: with reference-only, §6.3.2 could keep its MUST for agent_manifest_id plus the digest, and make manifest_verification_result informative. If you want the vectors as v0.3 fixtures, I'll open the PR against conformance/.

  2. imran-siddique commented on Oct 12, 2026

    @imran-siddique
    MemberAuthor

    @babyblueviper1 reference-only, on both questions. Your six cases reproduce at 2cd4ae7, all four wrong checkers die, and m3 settles it: verified asserted over a digest that no longer matches.

    On the Agent Manifest side, agentrust-io/agent-manifest#498 adds agent_manifest_digest to section 6.3.2 and says a verifier MUST NOT report the producer's result as its own.

    Yes to the PR against conformance/ as v0.3 draft fixtures. Use the repo's rfc8785 dependency in place of the vendored _rfc8785, and leave CHANGELOG.md out; the entry gets written at merge.

  3. babyblueviper1 commented on Oct 12, 2026

    @babyblueviper1
    Contributor

    @imran-siddique the fixtures PR is #487: six fixtures under conformance/tests/vectors/manifest-ref-v0.3-draft/, signed through the repo's rfc8785, with CHANGELOG.md left out. The test states the draft rule as a small reference checker, and each of the four wrong checkers is caught. The records are byte-identical to the six cases above. The full conformance suite passes locally (718).

  4. imran-siddique commented on Oct 15, 2026

    @imran-siddique
    MemberAuthor

    Status at main 9392ec7. The six fixtures from #487 merged on 12 October (97852f0). On the other side, agentrust-io/agent-manifest#498 merged on 14 October (3c02529), so §6.3.2 now requires agent_manifest_digest and says a verifier MUST NOT report the producer's result as its own.

    The field itself has not landed. schema/trace-claim-v0.3-draft.json still has no top-level manifest, its only manifest hook is runtime.evidence.binds: "manifest-digest", and no conformance module reads the reference yet. The fixtures are ready for whichever PR adds the property.

  5. dinakarjs commented on Oct 16, 2026

    @dinakarjs
    Contributor

    Completed an independent interoperability audit of #538 at 75b5fbb: #538 (review).

    The remaining work is concrete, beyond adding the schema member:

    1. Select an evaluator digest contract. The draft accepts sha256 and sha384; merged Agent Manifest §6.3.2 names sha256. The existing fixture-only checker always hashes sha256. A correctly re-signed v0.3 record with a matching sha384 digest validates structurally and has a valid signature, yet that checker reports manifest-digest-mismatch. This is a test/reference-checker coverage limit, not a demonstrated production evaluator bug.
    2. Reconcile or explicitly distinguish the two reference shapes. The experimental token requires version=0.2 and media_type=application/agent-manifest+cose, restricts id to 255 characters, and permits sha256 only. The v0.3 shape forbids version, permits any nonempty media_type/id, and also accepts sha384. These objects cannot be copied between profiles unchanged.
    3. Integrate the selected contract into a conformance module; schema acceptance currently performs no resolution, byte binding or manifest appraisal. Retain the existing signed mismatch, unresolved, signature-first and no-manifest controls, and distinguish digest binding from verification under Agent Manifest §5.

    All observations were executed against the two actual subschemas and the fixture checker; #538's complete root and conformance suites pass. This supports its existing Refs wording and keeping this issue open. No profile choice or production implementation was made on behalf of maintainers.

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