Skip to content

conformance: worked emitter/consumer cases for trust-annotations#5

Open
Rul1an wants to merge 3 commits into
modelcontextprotocol:sammorrowdrums/extensions-scaffold-trust-ifc-actionfrom
Rul1an:conformance/trust-annotations-worked-cases
Open

conformance: worked emitter/consumer cases for trust-annotations#5
Rul1an wants to merge 3 commits into
modelcontextprotocol:sammorrowdrums/extensions-scaffold-trust-ifc-actionfrom
Rul1an:conformance/trust-annotations-worked-cases

Conversation

@Rul1an

@Rul1an Rul1an commented Jun 16, 2026

Copy link
Copy Markdown

These are the worked emitter/consumer cases from the #2 thread, now as runnable fixtures so the shape can be checked rather than asserted. Everything reproduces from examples.json alone.

The first family is the public-repo-with-private-subresource case. A world-public repository still serves things that are not world-readable, like a draft security advisory or the collaborator roster, so the emitter classifies the resource it returns rather than the container. The coarse sensitive boolean rides the wire and the four-level class sits out of band on a data-class.v1 evidenceRef. A world-readable resource makes no claim, unknown or mixed provenance classifies sensitive rather than defaulting to public from a repo-level shortcut, and a content-block annotation may refine a result-level claim but never weaken it.

The second exercises evidenceRef re-derivation for the policy-decision and sequence types: the small annotation stays on the wire while the rich record lives out of band, and a client holding the record recomputes the digest independently. Each is shown under both cbor/rfc8949 and jcs/rfc8785, and the same record under the two envelopes produces two distinct, each-recomputable digests, so neither canonicalization reads as the default.

python3 worked_cases.py --verify recomputes every digest from the committed records, checks the per-resource classification rule, and checks the content-block union semantics. There are no third-party dependencies: the JCS and canonical CBOR encoders are pure-Python and self-test against the RFCs' own published vectors before any digest is trusted. The value profile is restricted to strings, arrays, string-keyed maps, booleans, null and non-negative integers, so the float and number-format edge cases stay out of scope until the spec pins them.

I targeted this at the scaffold branch so the fixtures land next to the spec they validate. If you would rather merge #2 first, say the word and I will retarget to main.

SamMorrowDrums and others added 3 commits June 16, 2026 01:23
…sibling

Restructure the incubation into two extensions plus interchangeable data-labelling
schemes, shipped as a stack of three PRs:

- This PR (base): shared scaffolding + the trust-annotations extension.
- action-metadata moves to its own stacked PR.
- The IFC/FIDES work moves out of specification/draft/ entirely — it is one
  data-labelling scheme (ifc.fides.v1) that fills the trust-annotations
  evidenceRef slot, not an extension and not a sibling. It lands in a schemes/
  folder built to hold alternative approaches (data-class, capability tokens,
  cosigning, sequence-shape, attestation) so no single academic model is baked
  into the wire.

README, sep-disposition, related-work, trust-model, open-questions and the
decision log are reframed accordingly (two extensions + a schemes folder; the
range of candidate schemes drawn from the SEP-1913 thread and cited literature).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The posted SEP-1913 umbrella comment was updated to match the shipped
structure: two extensions plus a schemes/ folder, with FIDES as one
data-labelling scheme (ifc.fides.v1) rather than an extension/profile.
Bring docs/intent-comment.md back in sync as the source of record and
add the three stacked PR links (modelcontextprotocol#2 base, modelcontextprotocol#3 action-metadata, modelcontextprotocol#4 FIDES
scheme).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reproducible worked cases validating the agreed shape, requested on modelcontextprotocol#2:

- Emitter classification for a public repo serving a private subresource:
  per-resource sensitivity (draft advisory / collaborator roster -> sensitive
  even though the repo is public), world-readable -> no claim, unknown/mixed ->
  sensitive (never defaulted public from a repo-level shortcut), and content-block
  union semantics (refine, never weaken a result-level claim).
- evidenceRef re-derivation for type 'policy-decision' and 'sequence': the small
  annotation on the wire with the rich record out of band, the digest recomputed
  from the record under both cbor/rfc8949 and jcs/rfc8785 (the same record yields
  two distinct, each-recomputable digests; neither canonicalization is the default).

Everything reproduces from examples.json alone. No third-party dependencies: a
pure-Python JCS (RFC 8785) and a minimal canonical CBOR (RFC 8949 4.2.1) encoder,
self-tested against the RFCs' own published vectors before any digest is trusted.
Restricted value profile (strings, arrays, string-keyed maps, booleans, null,
non-negative integers; no floats / number-format edge cases).

Signed-off-by: Rul1an <roelschuurkes@gmail.com>
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.

2 participants