# RFC-005: Trust Compiler MVP and Trust Card (Q2 2026) - Status: Active (`T1a`, `T1b`, `G3`, `P2a`, and `H1` are public in `v3.3.0`; `G4-A`, `P2c`, and `K1-A` Phase 1 are public in `v3.4.0`; `K2-A` Phase 1 is now public in `v3.5.0` as the current bounded MCP authorization-discovery slice) - Date: 2026-03-23 - Owner: Evidence / Product - Scope: bounded execution framing for `T1a` and `T1b` - Inputs: - [ADR-033: OTel-Native Trust Compiler Positioning](./ADR-033-OTel-Trust-Compiler-Positioning.md) - [ADR-006: Evidence Contract](./ADR-006-Evidence-Contract.md) - [ADR-008: Evidence Streaming](./ADR-008-Evidence-Streaming.md) - [ADR-025: Evidence-as-a-Product](./ADR-025-Evidence-as-a-Product.md) - [ADR-026: Protocol Adapters](./ADR-026-Protocol-Adapters.md) - [OWASP Agentic A1/A3/A5 C1 Mapping](../security/OWASP-AGENTIC-A1-A3-A5-C1-MAPPING.md) - [SYNTHESIS-TRUST-CHAIN-TRIFECTA-2026q2](./SYNTHESIS-TRUST-CHAIN-TRIFECTA-2026q2.md) ## 1. Context Assay now has enough substrate on `main` to turn a documentation thesis into a bounded product line: - OTel-style ingest and transformation already exist - evidence bundles and offline verification are shipped - signal-aware pack surfaces now exist for supported delegation context and supported containment degradation - the last release-line truth issue left after `P1` is closed on `main` via `3.2.3` What is missing is a productized bridge from "we collect evidence" to "we emit reviewable trust claims." This RFC defines that bridge in two steps: 1. `T1a` — make the evidence compiler line explicit and bounded 2. `T1b` — generate a Trust Card as the first iconic output artifact Current delivery status on `main`: - `T1a` is merged on `main` as the canonical `trust-basis.json` compiler output and low-level `assay trust-basis generate` surface - `T1b` is merged on `main` as deterministic `trustcard.json` / `trustcard.md` (`assay trustcard generate`) derived from the trust basis, without a second semantic classification layer - `G3` is merged on `main` as bounded authorization-context fields on supported MCP `assay.tool.decision` evidence (`auth_scheme`, `auth_issuer`, `principal`) with normalization that rejects JWT/Bearer credential material; Trust Basis emits **seven** claims (adds `authorization_context_visible`), and Trust Card JSON uses **`schema_version` `2`** (see [PLAN-G3](./PLAN-G3-AUTHORIZATION-CONTEXT-EVIDENCE-2026q2.md)) ## 1.5 Why This Wedge And Not The Alternatives This RFC assumes the following strategic comparison is already resolved: - **not another pack-first move**: packs matter, but they are downstream of claim and signal reality - **not another engine-first move**: heavier semantics are valuable later, but they are not the sharpest next wedge - **not dashboard-first**: dashboards help explain results, but they do not create the distinctive product category The Trust Compiler + Trust Card path is chosen because it best converts already-shipped evidence capabilities into a tangible product surface. ## 2. Goals ### Goal A — Productize Assay as a compiler, not a dashboard The MVP should clarify that Assay turns runtime truth into: - canonical evidence - bounded claim classification - portable proof-bearing outputs ### Goal B — Make claim provenance legible to humans and machines The first public-facing artifact should tell reviewers what is: - `verified` - `self_reported` - `inferred` - `absent` without requiring them to reverse-engineer bundle details by hand. ### Goal C — Preserve the bounded-claims discipline from `C2`, `E1`, `G1`, `G2`, and `P1` The MVP must not overclaim delegation validation, sandbox correctness, temporal correctness, or broad protocol security that the evidence cannot support. ## 2.5 North Star Constraints This RFC inherits the following hard constraints from ADR-033: - **claim-first, not dashboard-first** - **Assay canonical evidence is the truth layer** - **OTel is a first-class ingest path, not the sole semantic authority** - **Trust Card is evidence-classified, not score-first** - **the preferred order stays `T1a -> T1b -> G3 -> P2 -> K1 -> K2` before any broader next-pack expansion** - **Assay is not a tracing platform, eval platform, or observability dashboard** ## 3. Non-Goals This RFC does not include: - a tracing platform - a general observability dashboard - eval-as-a-service - a generic risk score as the primary output - new pack semantics in the same slice - new signal emitters in the same slice - delegation-chain validation, cryptographic chain verification, or temporal/reference semantics - a fully general OTel Collector processor before the basic compiler and Trust Card contracts are stable - any primary `trusted/untrusted` or scalar trust-score output - any primary aggregate maturity badge or badge-first UX ## 3.5 Primary Risks - **Abstractness**: without a concrete artifact, `trust compiler` is too architectural. `T1b` exists to solve this. - **Category drift**: it will be tempting to add dashboard-first or score-first surfaces because they are easier to market. This RFC explicitly rejects that as the main product lane. - **Standards volatility**: OTel/agent semconv will keep moving. Compiler inputs may evolve, but Assay's canonical evidence layer must remain the stable claim substrate. ## 4. T1a — OTel-Native Trust Compiler MVP Detailed execution framing for the first wave lives in [PLAN — T1a Trust Basis Compiler MVP](./PLAN-T1a-TRUST-BASIS-COMPILER-2026q2.md). ### 4.1 Objective Make the compiler model explicit: - **inputs**: OTel exports, Assay traces, protocol/runtime evidence - **compiler stage**: canonicalization, mapping, bounded claim basis - **outputs**: verifiable bundles plus a bounded machine-readable trust basis for higher-level artifacts `T1a` should produce a concrete canonical compiler-output artifact derived from a verified bundle. Working name for planning: `trust-basis.json`. ### 4.2 In Scope - define and document the official trust-compiler input surfaces already supported on `main` - define a bounded machine-readable claim basis contract that can be derived from a verified bundle - wire the compiler story through existing CLI and docs, not through a dashboard - keep the existing `ProfileCollector -> EvidenceMapper -> EvidenceEvent` architecture as the base path - treat OTel exports as inputs that map into Assay's canonical evidence layer rather than as the final truth contract - ensure new ingest paths are additive/translational and cannot semantically overrule claim classification outside canonical evidence - make the trust basis the place where claim classification happens, rather than in later rendering layers - keep `trust-basis.json` as the canonical compiler output that later Trust Card artifacts derive from ### 4.3 Out of Scope - replacing the existing bundle flow - emitting CloudEvents directly in the hot path - broadening pack semantics - introducing a collector-side processor/runtime before the claim basis contract is stable ### 4.4 Acceptance `T1a` is successful if: - Assay has a documented trust-compiler contract grounded in existing evidence surfaces - a verified bundle can produce a deterministic bounded machine-readable trust basis artifact - the trust basis uses evidence-level classifications instead of a single scalar score - existing bundle verification and lint flows remain the source of truth for lower-level evidence - `trust-basis.json` is treated as the canonical compiler output rather than an incidental intermediate file ### 4.5 Trust Basis Shape (MVP Planning Freeze) `T1a` does not need a final schema in this RFC, but it should converge on a small claim-first shape such as: ```json { "claims": [ { "id": "bundle_verified", "level": "verified", "source": "bundle_verification", "boundary": "bundle-wide", "note": null } ] } ``` Planning constraints for the trust basis: - each item has a stable claim key / `id` - claim classification uses `verified`, `self_reported`, `inferred`, or `absent` - each claim identifies its evidence source - each claim identifies its supported-flow or scope boundary - free-form notes remain optional and non-authoritative - canonical JSON output should use stable ordering and deterministic regeneration - the canonical artifact should not include wall-clock timestamps or other host-specific volatile fields - the canonical artifact should remain diff-friendly by default ## 5. T1b — Trust Card MVP ### 5.1 Objective Create the first iconic output artifact of the trust-compiler line. Suggested CLI: ```bash assay trustcard generate bundle.tar.gz ``` Suggested outputs: - `trustcard.json` - `trustcard.md` `trustcard.json` is the canonical Trust Card artifact derived from `trust-basis.json`. `trustcard.md` is a deterministic human-readable rendering of the same claim set. ### 5.2 Trust Card Claim Set Trust Card rendering must not invent new claim semantics. Claim classification happens in the trust basis / compiler stage, not in Markdown rendering. The first Trust Card should stay small and explicitly bounded. The shipped claim set is **seven** rows (fixed order in the trust basis; consumers must key by `id`, not positional length): - `bundle_verified` - `signing_evidence_present` - `provenance_backed_claims_present` - `delegation_context_visible` - `authorization_context_visible` (`G3`; Trust Card JSON `schema_version` **2**) - `containment_degradation_observed` - `applied_pack_findings_present` These claims may then be rendered into grouped sections for human readability, but the claim set should come first. ### 5.3 Trust Card Evidence Levels Each claim section should classify its status using the evidence levels from ADR-033: - `verified` - `self_reported` - `inferred` - `absent` Optional future summaries may exist, but the primary Trust Card artifact must remain evidence-classified first. ### 5.4 Non-Goals The Trust Card must not: - present itself as a universal security rating - imply chain integrity or chain completeness when only delegation context is visible - imply sandbox correctness when only degradation evidence is present - imply temporal/reference correctness that the engine does not support ### 5.5 Acceptance `T1b` is successful if: - a verified bundle can produce `trustcard.json` and `trustcard.md` - the Trust Card contains explicit evidence-level classifications - the language remains bounded and non-goal-aware - the Trust Card can be regenerated deterministically from the same verified bundle - the Trust Card does not reduce the primary result to a scalar score or binary `trusted/untrusted` label - `trustcard.json` remains the canonical artifact and `trustcard.md` remains a deterministic rendering of the same claim set ## 6. Follow-On Sequencing After `T1a`, `T1b`, and `G3` on `main`, the preferred sequence is: 1. `P2` — Protocol Claim Packs — **first slice `P2a`**: built-in companion pack `mcp-signal-followup` (MCP-001..003; MCP-001 shares G3 semantics with Trust Basis via `g3_authorization_context_present` in pack engine v1.2; see [PLAN-P2a](PLAN-P2a-MCP-SIGNAL-FOLLOWUP-CLAIM-PACK.md)) 2. **`H1` — Trust kernel alignment & release hardening** (before broadening protocol packs): shared predicate / classifier / Trust Card / pack / CLI alignment tests; single migration SSOT — see [PLAN-H1](PLAN-H1-TRUST-KERNEL-ALIGNMENT-RELEASE-HARDENING.md), [MIGRATION-TRUST-COMPILER-3.2.md](MIGRATION-TRUST-COMPILER-3.2.md) 3. further `P2` slices — **`P2b`**: built-in `a2a-signal-followup` (A2A-001..003; presence-only on `assay.adapter.a2a.*` per shipped adapter; [PLAN-P2b](PLAN-P2b-A2A-SIGNAL-FOLLOWUP-CLAIM-PACK.md)); see also [ROADMAP](../ROADMAP.md) *Steps 4–6 continue the sequence **after** `P2b` is on `main`. Step 7 remains explicitly deferred.* 4. **`G4` — A2A discovery / card evidence signal** (evidence-wave before the next A2A pack slice; adapter-first; not a companion pack): see [PLAN-G4](PLAN-G4-A2A-DISCOVERY-CARD-EVIDENCE-2026q2.md) 5. **`P2c` — A2A discovery/card follow-up pack** (productization after G4; companion pack rules aligned to G4 evidence — built-in `a2a-discovery-card-followup`, now public in **`v3.4.0`**; [PLAN-P2c](PLAN-P2c-A2A-DISCOVERY-CARD-FOLLOWUP-PACK.md)) 6. **`K1` — A2A handoff / delegation-route visibility evidence** (next formal wave after `P2c`; adapter-first; no pack in the same slice). `K1-A` Phase 1 is now the first public bounded A2A adapter seam in **`v3.4.0`**; see [PLAN-K1](PLAN-K1-A2A-HANDOFF-DELEGATION-ROUTE-EVIDENCE-2026q2.md) and [K1-A freeze](K1-A-PHASE1-FREEZE.md) 7. **`K2` — MCP authorization-discovery evidence** (current bounded evidence wave after `K1-A`; evidence-first; no pack in the same slice). `K2-A` Phase 1 is now public in `v3.5.0` as a bounded MCP import seam. See [PLAN-K2](PLAN-K2-MCP-AUTHORIZATION-DISCOVERY-EVIDENCE-2026q2.md), [K2-A formal freeze](K2-A-PHASE1-FREEZE.md), and [K2-A freeze prep](K2-A-PHASE1-FREEZE-PREP.md) 8. only later: further pack slices if `K1`, `K2`, or another evidence wave makes them honest; reference existence, temporal validity, capability attestation, richer compliance packs ## 7. Review Gates For Future Execution Future implementation slices under this RFC should hard-fail review if they: - turn the MVP into a tracing platform - turn the MVP into a dashboard project - introduce a magic trust score as the primary product surface - treat raw OTel semconv as the final trust schema instead of mapping through canonical evidence - add new protocol/security claims without backing signals - conflate delegation visibility with delegation validation - conflate degradation visibility with containment correctness - claim the compiler is a general observability replacement or generic eval suite ## 8. Open Questions - What is the smallest stable machine-readable "trust basis" schema that can sit between bundle verification and Trust Card generation? - Should the first collector-native deployment form factor be a CLI compiler only, or a sidecar/processor once the trust basis contract is stable? - Which minimal claim sections should be mandatory for `trustcard.json` v1? - What is the minimal stable claim key set for Trust Card v1?