Composition: Foxbook ↔ Concordia ↔ Sanctuary typed-reference schema #73
Replies: 4 comments
-
|
The three-layer framing is the right composition shape. I'll walk through your five open questions one at a time. Q1, container shape (CTEF-inside vs peer field): CTEF-inside is the right call. Concordia v0.4.0 already ships the generalized Q2, promote sth_at_verify_time + sth_signature to required: Keep optional in v1.0 and require in v2.0. Letting early integrators ship without the STH-anchor burden lowers the activation energy for v1.0 adoption. Once implementations exist and we have real-world data on the wire-cost vs policy-clarity tradeoff, ratchet to required in v2.0. The optional-deprecated phase you described is the right structural shape. Q3, verified_signing_key_hex semantics: Weaker semantic is right. The typed reference carries "this key is the active signing key per Foxbook at verify-time," which is a fact about Foxbook's log state, not a claim about any specific AgentCard signature. Downstream consumers (Concordia, Sanctuary, others) choose whether to re-verify the AgentCard JWS against that key per their own policy. The typed reference stays a clean fact about Foxbook; verification policy stays in the verdict layer where it belongs. Q4, in-band version field: In-band wins. Fourteen bytes is negligible at receipt scale, and the forward-compat benefit is real. Future implementations that don't share envelope context, or that read archived receipts from older Concordia versions, need to know which typed-reference schema they're parsing. Recommend Q5, multi-log federation: Defer to v2.0. The single-tl_url shape is correct for v1.0. When multi-vendor federation becomes real, the typed reference can gain an optional Integration surfaces confirmed: Concordia v0.4.0 carries the typed reference inside Composition posture: Concordia and Sanctuary compose with Foxbook independently. Neither depends on the other, and the composition partnership introduces no new cross-substrate dependencies. Cleanest for future implementors too. Ready to drill on any of the five. The strawman is solid ground to work from. |
Beta Was this translation helpful? Give feedback.
-
|
@eriknewton — solid pass. Walking through your answers in the same order. Net: I agree with all five positions. Three small refinements + one clarifying question. Q1 — Container shape: CTEF-inside Concordia's
|
Beta Was this translation helpful? Give feedback.
-
|
@cloakmaster substrate-mode posture is structurally correct. The trade you're naming (no per-call SLA, weeks-not-days review timing, frozen surface, compounding cross-impl reference cycle) is the right shape for an evidence-layer primitive. We're at the same tempo on our side post-v1.2. Acknowledging the three commitments shipped: verified_signing_key_hex on the verified branch of verifyAgentCard is the right surface for downstream consumers. One call returning tier plus did plus leafIndex plus signing key removes the second-lookup dance. Structured reason_code on the unverified branch with key-not-yet-logged as the rotation discriminator is a clean enforcement gate for any consumer that wants to retry after rotation propagates. On the typed-reference schema, our five answers from earlier in this thread still hold: CTEF-inside (Concordia's references[] is the canonical container for cross-vendor evidence references), optional in v1.0 then require in v2.0 (lower adoption barrier wins), weaker semantic on verification (downstream consumers choose JWS verification per their own policy), in-band version field, defer multi-log federation to v2.0. What we're queuing to consume the v1.0 strawman after thread consensus lands per ADR 0009: Sanctuary: a Foxbook-by-handle verifier surfaced as a Cooperative MCP capability for compliant agents that want AgentCard claims verified at runtime. Operator policy decides whether to require Foxbook verification or leave it informational; verification semantics stay Foxbook's per the Q3 answer above. Queued as a v1.3+ candidate. Symmetric integration entry on our side at docs/COMPOSE-WITH-SANCTUARY.md so any third party reaching for the three-layer composition can find both directions of the same story. Substrate tempo on our side too. Other identity-layer, evidence-layer, and verdict-layer participants are welcome to weigh in here; the cross-impl reference cycle compounds with each one that lands. Erik |
Beta Was this translation helpful? Give feedback.
-
|
@eriknewton — appreciate the substantive close on the v0.2.0 commitments + the reciprocal substrate-mode positioning. Same tempo on our side too; the cross-impl reference cycle compounding is exactly what ADR 0006 §4 named as the load-bearing structural mechanism, and Concordia + Sanctuary's queue (v0.5 references[] extension; v1.3+ Sanctuary Foxbook-by-handle verifier as Cooperative MCP capability; symmetric Reading your re-confirmation of the five answers + your concrete forward queue, the typed-reference v1.0 schema is converged from both sides. Calling consensus. Typed-reference v1.0 — final form{
"typed_reference_version": "1.0",
"tl_url": "https://transparency.foxbook.dev",
"leaf_index": 42,
"tl_leaf_canonical_hash": "<64-char lowercase hex>",
"verified_signing_key_hex": "<64-char lowercase hex>",
"sth_at_verify_time": {
"tree_size": 100,
"root_hash": "<64-char lowercase hex>",
"timestamp": "<ISO-8601>"
},
"sth_signature": "<compact-JWS, 3 base64url segments>"
}Field spec
Versioning + optionality rules
Container is Concordia's callHow the typed reference embeds inside Concordia's envelope ( Path to ratificationThe Foxbook side ratifies via in-place update of ADR 0009: strawman replaced with the schema above, status After ratification:
If anyone wants the typed reference as a formal JSON Schema artifact (separate from the markdown spec above), happy to add Open invitation preservedThe thread stays open. Other identity-layer, evidence-layer, and verdict-layer participants are welcome to weigh in — substantive nits in the 72h window land in the ratified schema; out-of-window comments land as v1.x additions or v2.0 candidates per the evolution rules above. — Benjamin |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Composition: Foxbook ↔ Concordia ↔ Sanctuary typed-reference schema
Context
A2A Discussion #1803 opened a three-layer framing that's now concrete enough to spec a cross-implementation surface against:
@eriknewton proposed the natural integration surface: a Concordia attestation envelope carries a typed reference to a Foxbook leaf as supporting evidence, so a Sanctuary-wrapped agent can cryptographically anchor "caller identity was Foxbook-verified at leaf N" inside the negotiation receipt.
This thread is the open spec venue for that typed reference. Public so it's reviewable, archival, and other identity-layer / evidence-layer / verdict-layer implementations can compose against the same shape.
Strawman: typed-reference schema v1.0
{ "tl_url": "https://transparency.foxbook.dev", "leaf_index": 42, "tl_leaf_canonical_hash": "<64-char lowercase hex SHA-256>", "verified_signing_key_hex": "<64-char lowercase hex Ed25519 public key>", "sth_at_verify_time": { "tree_size": 100, "root_hash": "<64-char lowercase hex>", "timestamp": "<ISO-8601>" }, "sth_signature": "<compact-JWS EdDSA, three base64url segments>" }Field-by-field
tl_url${tl_url}/inclusion/${leaf_index}and${tl_url}/rootto re-verify.leaf_indextl_url, uniquely identifies the leaf.tl_leaf_canonical_hashcanonical.tson the raw object). Lets the verifier detect log forks: recompute hash from live leaf, compare.verified_signing_key_hexverifyAgentCardon theverifiedbranch (@foxbook/sdk-claim). The key the verdict-layer uses to verify the AgentCard's JWS signature.sth_at_verify_time{tree_size, root_hash, timestamp}. Anchors temporal context.sth_signaturesth_at_verify_time(or equivalent serialization), signed by the log's signing key (public key at${tl_url}/.well-known/foxbook.json). Lets the verdict-layer authenticate the STH offline without trusting the integrator to have not falsified it.The optional fields exist for verdict-layer threat models that need offline verification or temporal anchoring. Verdict layers that always re-fetch from the live log can ignore them.
Versioning
Schema version
1.0. Evolution rules mirror Foxbook's ADR 0004:2.0with a migration window.versionfield inside the typed reference itself — keeps the wire shape minimal.(Open question 4 below revisits this.)
Negative-path scenarios
The interesting edge cases happen between assert-time (when Foxbook returned
verifiedand Concordia embedded the typed reference) and consume-time (when Sanctuary processes the receipt). Three concrete scenarios:1. Leaf revoked between assert-time and consume-time
verified at leaf N, key K.revocationleaf is appended at index M > N. Per Foxbook's ADR 0004 addendum-1, revocation is atomic: claim row deleted, leaf appended in the same transaction.What's "correct" depends on Sanctuary's policy:
${tl_url}/api/v1/claim/by-handle/...at T3. If revoked, reject — even though the receipt was valid at T1.The typed-reference should be rich enough to support all three policies.
sth_at_verify_timeenables temporal-anchor checks.tl_url + leaf_indexenable live re-verification. Verdict-layer policy is out of scope for the typed-reference itself.2. Signing-key rotation between assert-time and consume-time
Symmetric to revocation: a
signing-key-registrationleaf (per Foxbook's tl-leaf v1.2 / ADR 0004 addendum-3) is appended between T1 and T3. The receipt'sverified_signing_key_hexis now superseded.Same three policy options apply. The typed-reference's role is to be honest about what was true at T1, not to make policy decisions.
3. Log fork
A malicious or buggy log serves different bytes for the same
leaf_indexat different times. Concordia embedded the typed reference based on bytes seen at T1; Sanctuary fetches the live leaf at T3 and gets different bytes.tl_leaf_canonical_hashis the load-bearing field here. Sanctuary recomputes the hash from the live leaf's canonical bytes; if it doesn't match, the log has forked (or the integrator falsified the typed reference). Either way, reject.This is the case where the typed reference's integrity guarantees are stronger than re-fetching alone — a verifier with the typed reference can detect a fork class that a re-fetch-only verifier can't.
Open questions for the thread
Container shape: should the typed reference live inside the CTEF envelope (reusing Concordia's existing schema) or as a peer field at the envelope's top level? Both are viable; CTEF-inside is the more composable shape.
Promote optional fields?
sth_at_verify_time+sth_signatureare optional in this strawman because they add receipt size + verifier complexity. Should they be promoted to required for stronger default semantics? If yes, optional becomes "deprecated optional" for v1.0 backward compat then required in v2.0.verified_signing_key_hexsemantics: does the typed reference assert "the AgentCard was JWS-signed with this key" or only "this key is the active signing key per Foxbook at verify-time"? The latter is weaker and more honest — it shifts AgentCard-signature verification to Sanctuary. The former is stronger but requires Concordia to actually verify the AgentCard's JWS at verify-time.In-band version field? The strawman puts version in the containing envelope's context. An alternative is
"_version": "1.0"inside the typed reference itself. Wire-size cost: ~14 bytes per receipt. Forward-compat benefit: future Concordia/Sanctuary impls that don't share envelope context still know how to parse.Multi-log federation: the schema works for a single
tl_urlper typed reference. If the future is multi-vendor federated logs, do we need a way to express "verified against these N logs that all agreed"? Probably not for v1.0; can be additive later.What this is NOT
Next steps
Cross-implementation references in any of these directions are welcome and improve the strength of the cross-impl reference cycle. Foxbook's harness aggregator entry lists
claim_type_layer: identityfor any future implementor wanting to add the same shape.Engagement
hello@foxbook.devfor substantive offline conversations.cloakmaster/foxbookfor bugs in Foxbook's existing surface.cc @eriknewton — the thread is yours to shape too.
Beta Was this translation helpful? Give feedback.
All reactions