Replies: 55 comments 4 replies
-
|
Thanks @kenneives — quick correction: RNWY's domain is rnwy.com. The correct DID would be did:web:rnwy.com and our JWKS is at https://rnwy.com/.well-known/jwks.json. The envelope format is sound and consistent with what we're already emitting. Happy to confirm the continuous-monitoring category for our slot. |
Beta Was this translation helpful? Give feedback.
-
|
@rnwy — fixed, thanks. Updated to Good to have continuous-monitoring confirmed for your slot. Looking forward to your input on the open questions — particularly expiration semantics, since continuous monitoring has different TTL needs than static analysis (shorter observation windows, rolling scores). Updated RFC source: https://github.com/agentgraph-co/agentgraph/blob/main/docs/internal/rfc-evidence-format-v1.md |
Beta Was this translation helpful? Give feedback.
-
|
@kenneives — continuous monitoring is a natural fit for 24-hour TTL; our pipeline runs nightly so any attestation older than that should trigger a fresh pull. |
Beta Was this translation helpful? Give feedback.
-
|
@rnwy — good, incorporated. Updated Section 8 (Expiration Semantics): continuous-monitoring attestations get 24-hour TTL, aligned with your nightly pipeline cadence. This also means the gateway's verdict TTL for agents that depend on continuous-monitoring signals should cap at 24 hours — if the monitoring attestation expires, the verdict expires with it. That's already captured in the rule: "A verdict MUST expire before any attestation in its evidence bundle expires." Updated source: https://github.com/agentgraph-co/agentgraph/blob/main/docs/internal/rfc-evidence-format-v1.md |
Beta Was this translation helpful? Give feedback.
-
Contribution: Expanding Section 3 (Provider Taxonomy) and Section 8 (Expiration Semantics)The current draft defines five provider categories: Two New Provider Categories
|
| Layer | What it measures |
|---|---|
| L1: Cognitive Sovereignty | Encrypted persistent state, key custody, memory integrity |
| L2: Operational Isolation | Execution environment isolation, TEE attestation if available |
| L3: Selective Disclosure | ZK proof capability, minimum-necessary disclosure |
| L4: Verifiable Reputation | Portable credentials, signed health reports, handshake completion |
Attestation envelope fields:
{
"provider": "sanctuary",
"category": "sovereignty",
"sub": "did:key:z6Mk...",
"scope": "sovereignty_posture",
"evidence": {
"overall_status": "minimum_viable_sovereignty",
"l1_cognitive": { "status": "full", "score": 100 },
"l2_operational": { "status": "degraded", "score": 60, "reason": "no_tee" },
"l3_selective_disclosure": { "status": "full", "score": 100 },
"l4_verifiable_reputation": { "status": "full", "score": 95 }
},
"confidence": 0.92,
"iat": 1712700000
}Note on expiration: Sovereignty attestations should NOT use fixed TTLs (see TTL section below).
TTL-per-Type Model (Section 8 Expansion)
The current draft specifies a general recency decay of 0.1/week after 7 days. This is reasonable for static analysis but wrong for other categories. Different evidence types have fundamentally different staleness profiles:
| Category | Recommended TTL | Refresh Trigger | Rationale |
|---|---|---|---|
static_analysis |
24h (or on code change) | Commit webhook, nightly scan | Code changes can introduce vulnerabilities instantly |
behavioral |
1–7 days | Interaction frequency | Recent behavior is more predictive than old behavior |
continuous_monitoring |
24h (aligned with scan cycle) | Nightly pipeline | Already in draft — confirmed |
identity |
No fixed TTL | Key rotation event | Identity doesn't expire unless keys change |
peer_review |
30 days | Manual re-review | Human reviews have longer validity |
transactional |
7 days (rolling window) | New settlement or dispute | Transaction history matters most when recent |
sovereignty |
No fixed TTL | Config-change event | Sovereignty posture changes only when the agent's environment changes (key rotation, policy update, TEE reprovisioning). A fixed TTL would force unnecessary re-attestation for something that's structurally stable. |
Implementation recommendation: Each attestation envelope should carry an optional refresh_hint field:
{
"refresh_hint": {
"strategy": "event_driven",
"events": ["key_rotation", "policy_change", "config_update"],
"max_age_seconds": 604800
}
}This lets gateways distinguish between "this evidence is 3 days old and fine" (sovereignty) vs. "this evidence is 3 days old and stale" (static analysis). The max_age_seconds field provides a backstop — even event-driven attestations should be re-verified periodically.
Reference Implementations (Section 11 Addition)
The draft lists AgentGraph, MoltBridge, RNWY, and AgentID. Two additional implementations are live and producing signed attestations compatible with this RFC:
Verascore (Aggregation Layer)
- Role: Multi-provider attestation aggregator and composite scoring platform
- URL: https://verascore.ai
- JWKS: https://verascore.ai/.well-known/jwks.json (kid:
verascore-scoring-v1, Ed25519/EdDSA) - Intake endpoint: POST
/api/attestations/ingest— accepts JWS-signed attestations from any registered provider - Query endpoint: GET
/api/agent/{did}/attestations— returns all attestations by dimension - Scoring: GET
/api/trust-score/{did}— five-dimension composite (sovereignty, reliability, negotiation, identity, stability) - Weighting model: Verified attestations 3x self-reported, cross-corroboration 1.5x, diversity bonus 10% for ≥3 provider types
- Status: Live, 4 providers registered (AgentGraph, MoltBridge, Concordia, Sanctuary), JWKS verification operational
Verascore's position in the RFC architecture: Verascore is a gateway in the RFC's terminology — it consumes attestation envelopes from providers, verifies signatures against JWKS endpoints, and produces enforcement-relevant composite scores. It is provider-agnostic by design and will ingest attestations from any provider that publishes a JWKS endpoint and signs per this format.
Concordia Protocol (Transactional Provider)
- Role: Negotiation protocol producing signed session receipts
- Package:
concordia-protocol(PyPI) - Category:
transactional - Output: JWS-signed session receipts with Ed25519 keys, containing negotiation outcome, terms hash, counterparty DIDs
- Status: v0.3.0 on PyPI, 56 MCP tools, bridge to Sanctuary operational
Responses to Open Questions (Section 12)
Q1: Attestation chaining — should attestations reference prior attestations?
Yes, but minimally. A prior_attestation_id field (optional) enables gateways to trace evidence lineage without requiring full chain traversal. This is important for transactional attestations where a dispute resolution may reference the original commitment attestation. Full DAG traversal is overkill for v1 — a single back-pointer is sufficient.
Q2: Pre-expiration revocation — how should providers revoke before TTL?
Two mechanisms, both needed:
- Revocation list: Provider publishes a
/revocationsendpoint listing revoked attestation IDs. Gateways check this at verification time. Simple, cacheable, low overhead. - Event-driven push: For high-stakes categories (sovereignty, identity), the provider pushes a revocation event to subscribed gateways. This handles the case where waiting for the next poll cycle is too slow — e.g., an agent's encryption keys are compromised.
The revocation list is the v1 minimum. Event-driven push is a v2 enhancement.
Q3: Encrypted payloads — should attestation evidence support encryption?
Yes, and this is where sovereignty attestations have a unique requirement. An SHR may contain information about an agent's security posture that the agent doesn't want broadcast — e.g., "L2 degraded because no TEE" is useful for a gateway making an access decision but shouldn't be publicly indexable.
Recommendation: Support an optional encrypted_evidence field alongside the cleartext evidence field. The encryption key is negotiated per-gateway using the gateway's public key from its JWKS endpoint. This keeps the envelope format simple while allowing selective disclosure.
Q4: Schema versioning — how do we handle format evolution?
The version field in the envelope is necessary but not sufficient. Recommendation: use semantic versioning for the envelope schema ("envelope_version": "1.0.0") and require gateways to support at least one prior major version during a 6-month deprecation window. Provider-specific evidence schemas version independently — a gateway that doesn't understand a provider's evidence schema should still accept the envelope and score based on the metadata (category, confidence, timestamps) alone.
Summary
This contribution adds:
- Two provider categories (
transactional,sovereignty) with production implementations - TTL-per-type model replacing uniform recency decay
refresh_hintfield for event-driven attestation types- Two reference implementations (Verascore as gateway/aggregator, Concordia as transactional provider)
- Positions on all four open questions grounded in production experience
Happy to draft the formal schema additions for Section 5 (Attestation Envelope) if the group wants to move toward a v2 draft.
- Erik
Beta Was this translation helpful? Give feedback.
-
|
@AlexanderLawson17 — strong contribution. Incorporating the key additions: Transactional + sovereignty categories: Agreed these belong in the taxonomy. The distinction between "agent responds correctly" (behavioral) and "agent commits and delivers" (transactional) is real and important for enforcement decisions. Sovereignty posture — whether an operator can unilaterally read/modify agent state — is a dimension none of the other categories capture. Adding both to the next draft.
TTL-per-type table: Incorporating. The per-category defaults give gateways a sensible starting point while the Open questions responses: Your positions on chaining (single back-pointer, not full DAG), revocation (list for v1, event-push for v2), encrypted evidence (optional field, per-gateway key negotiation), and versioning (semver + 6-month deprecation) are all pragmatic. Will fold into the next draft. I'll produce a v0.2 draft incorporating these additions plus RNWY's 24-hour continuous-monitoring TTL. Will tag everyone for review before merging. One thing worth preserving as we expand: the RFC should stay implementation-light. The envelope format, provider taxonomy, and verdict structure are the standard. Scoring weights, confidence models, and gateway policies are explicitly out of scope — each implementation (AgentGraph, Verascore, whoever) makes those calls independently. That separation is what makes the format composable rather than prescriptive. |
Beta Was this translation helpful? Give feedback.
-
|
Agreed on keeping the standard implementation-light — the envelope format and provider taxonomy are the interop layer, scoring and enforcement policies are each gateway's call. That separation is what makes this composable. |
Beta Was this translation helpful? Give feedback.
-
|
@kenneives — thanks for the cc. Quick domain correction and then substantive input on the open questions. Domain correction: MoltBridge's DID should be On the envelope format: The structure maps cleanly to what MoltBridge emits today. Our attestations carry On the open questions: 1. Attestation chaining: Yes — and we're already seeing this in practice. In the Browser Use #4563 thread, VeroQ Shield verification events produce attestations that reference the MoltBridge attestation they're enhancing. The flow is: MoltBridge creates an interaction attestation → Shield independently verifies the output → Shield's attestation references the original MoltBridge attestation by ID. The envelope should support an optional 2. Revocation: Short TTLs + status endpoints. MoltBridge's behavioral attestations decay naturally (graph traversal weights attestations by recency), so a 30-day TTL with recency decay handles most cases. For active revocation (agent caught misbehaving), a lightweight 3. Privacy: Encrypted payloads add significant complexity for marginal benefit at this stage. A simpler approach: the envelope carries a 4. Versioning: Semver in the One additional consideration: the Happy to contribute a reference implementation for the MoltBridge → envelope mapping if that's useful. |
Beta Was this translation helpful? Give feedback.
-
Proposing
|
| Category | What it answers | What it does NOT answer |
|---|---|---|
static_analysis |
Is the code safe to run? | Is the operator sanctioned? |
behavioral |
Does the agent act within bounds at runtime? | Is the agent's domain freshly registered to evade detection? |
continuous_monitoring |
Is the agent still behaving over time? | Did the agent's wallet just appear on OFAC SDN? |
identity |
Who is the agent? | Is that identity on a regulatory watchlist? |
peer_review |
Do other agents vouch for it? | Peer trust says nothing about sanctions compliance. |
transactional |
Has it paid and been paid reliably? | Clean payment history does not equal regulatory clearance. |
sovereignty |
Where does the agent run, who controls it? | Jurisdiction is not the same as sanctions or AML screening. |
compliance_risk answers: Is this agent, its operator, and its infrastructure clean from a regulatory and domain hygiene perspective?
Definition
compliance_risk: Attestations derived from sanctions screening (OFAC, EU, UN), domain registration and DNS hygiene analysis, IP reputation and proxy/VPN/Tor detection, SSL certificate validation, and wallet screening against flagged addresses. These signals assess whether an agent's operational infrastructure and controlling entities are compliant with applicable regulatory frameworks.
Signals that fall under this category:
- Sanctions screening: OFAC SDN, EU consolidated list, UN Security Council, country specific lists
- Domain hygiene: WHOIS domain age, registrar reputation, DNS configuration (MX, SPF, DMARC presence)
- IP reputation: GeoIP jurisdiction, VPN/proxy/Tor detection, hosting provider classification
- SSL/TLS posture: Certificate validity, issuer chain, expiration window
- Wallet screening: On chain address cross referencing against known sanctioned or flagged wallets
Sample attestation envelope
Following the envelope format from the RFC, with a real signed payload fetched live from https://revettr.com/v1/attest:
{
"@context": ["https://www.w3.org/ns/credentials/v2"],
"type": "TrustAttestation",
"version": "1.0.0",
"provider": {
"id": "did:web:revettr.com",
"category": "compliance_risk"
},
"subject": {
"id": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045"
},
"attestation": {
"type": "ComplianceRiskAttestation",
"confidence": 0.82,
"payload": {
"iss": "did:web:revettr.com",
"sub": "0xd8da6bf26964af9d7eed9e03e53415d37aa96045",
"iat": 1775817135,
"exp": 1775820735,
"category": "compliance_risk",
"score": 85,
"tier": "low",
"flags": ["wallet_established", "sanctions_clear"],
"signals": {
"domain": null,
"ip": null,
"wallet": 85,
"sanctions": 100
}
}
},
"refresh_hint": {
"strategy": "event_driven",
"events": ["ofac_sdn_update", "eu_consolidated_update", "un_sc_update"],
"max_age_seconds": 43200
},
"jws": "eyJhbGciOiJFUzI1NiIsImprdSI6Imh0dHBzOi8vcmV2ZXR0ci5jb20vLndlbGwta25vd24vandrcy5qc29uIiwia2lkIjoicmV2ZXR0ci1hdHRlc3QtdjEiLCJ0eXAiOiJyZXZldHRyLWF0dGVzdGF0aW9uK2p3dCJ9..."
}Anyone can pull and verify a live one:
curl -s https://revettr.com/.well-known/jwks.json | jq .
curl -s -X POST https://revettr.com/v1/attest \
-H "Content-Type: application/json" \
-d '{"wallet_address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}' | jq .ES256, kid: revettr-attest-v1, low-s normalized, JWKS at the standard path.
TTL semantics for compliance_risk
This is where compliance_risk behaves differently from the other categories. Regulatory lists do not update on continuous schedules. OFAC publishes on irregular cadences (sometimes daily, sometimes weekly). EU consolidated lists update on their own cycle. A pure time based TTL like the 24h model @rnwy proposed for continuous_monitoring is not quite right here.
Proposing a hybrid model that fits Erik's refresh_hint framework:
| Parameter | Value | Rationale |
|---|---|---|
ttl |
3600 (1h) | Short by default. Compliance signals are the most time sensitive dimension in the taxonomy. |
refresh_hint.strategy |
"event_driven" |
Provider monitors upstream list publications and re-attests on change. |
refresh_hint.events |
["ofac_sdn_update", "eu_consolidated_update", "un_sc_update"] |
Subscribed event types that trigger re-issuance. |
refresh_hint.max_age_seconds |
43200 (12h) | Hard ceiling. No compliance attestation should be trusted beyond 12h without refresh even if no upstream update occurred. |
stale_action |
"soft_fail" |
If the provider is unreachable after expiry, gateways may proceed with reduced confidence rather than hard blocking. Configurable per deployment. |
This lets gateways distinguish "no recent upstream change, attestation still fresh" from "stale compliance data, must refetch before making a decision." The 12h max_age is a safety net for the worst case where a provider's event stream drops without fallback polling.
Verdict TTL cascading
The rule in @kenneives' draft ("A verdict MUST expire before any attestation in its evidence bundle expires") applies with teeth here. A gateway that includes a compliance_risk attestation in its evidence bundle inherits the shortest TTL of any attestation in that bundle. If a compliance signal expires at t+1h and the gateway issues a verdict at t+0, the verdict cannot live past t+1h regardless of other attestation TTLs.
Revettr as reference implementation
Revettr is live and can serve as a reference implementation for two roles in the RFC's architecture.
1. Provider for compliance_risk
| Field | Value |
|---|---|
| DID | did:web:revettr.com |
| JWKS | https://revettr.com/.well-known/jwks.json |
| Algorithm | ES256 |
| Key ID | revettr-attest-v1 |
| Attestation endpoint | POST https://revettr.com/v1/attest (free tier, keyless) |
| Scoring endpoint | POST https://revettr.com/v1/score (x402, $0.01 USDC on Base) |
| Signals | OFAC/EU/UN sanctions, WHOIS, DNS, SSL, GeoIP, VPN/Tor, wallet screening |
| Output | Compact JWS attestation envelope with composite score and per-signal breakdown |
| Risk-check discovery | GET https://revettr.com/.well-known/risk-check.json |
2. Gateway / aggregator
Revettr operates as a trust gateway that already aggregates signals across multiple signal types internally. In the RFC's terms, Revettr can function as an evidence bundle aggregator, collecting attestations from multiple providers and producing a weighted composite verdict. This is relevant to the enforcement verdict and confidence weighting sections.
Revettr is already integrated with the InsumerAPI multi-attestation format (issue #1 at douglasborthwick-crypto/insumer-examples) where this dimension was originally scoped by @douglasborthwick-crypto for agent to agent payment flows.
Weighing in on the open questions
Attestation chaining
From a compliance provider's perspective, chaining is essential. When Revettr produces a composite compliance score, it is implicitly referencing upstream data sources (OFAC feed, WHOIS registrars, GeoIP databases). The RFC should support a derived_from or evidence_sources field so that downstream consumers can trace lineage:
{
"evidence_sources": [
{"source": "ofac_sdn_feed", "version": "2026-04-09", "checked_at": 1775817100},
{"source": "whois_registrar", "checked_at": 1775817110}
]
}Agreed with @eriknewton that a single back-pointer is sufficient for v1. Full DAG traversal is overkill. In regulated environments, you need to show not just the score but where each input came from and when it was checked, so even a minimal version of this field carries weight.
Revocation
For compliance_risk specifically, revocation has to be immediate and push-based. If an entity appears on a sanctions list, any outstanding attestation must be revocable within minutes, not hours. A lightweight two-tier approach:
- v1: providers expose
GET /.well-known/revocations.jsonlisting revoked attestation IDs with timestamps. Gateways poll on short intervals (5 min) or on cache miss. - v2: event-driven push for high-stakes categories (compliance_risk, identity, sovereignty). Providers push revocation events to subscribed gateways.
The 12h max_age backstop helps but is not sufficient on its own for real-world sanctions hits.
Encrypted payloads
Revettr's compliance signals include data that can be sensitive in certain jurisdictions (sanctions match details, IP geolocation, wallet associations). Supporting encrypted evidence payloads would let providers include detailed signal breakdowns for authorized consumers while keeping the outer envelope (category, confidence, expiry) readable by any gateway.
Recommendation: optional encrypted_evidence field alongside the cleartext evidence field, encrypted via JWE with recipient-specific keys derived from the gateway's JWKS. Envelope structure stays simple, selective disclosure comes for free.
Schema versioning
Suggest envelope_version: "1.0.0" at the top level with semver. Providers commit to supporting at least N and N-1 major versions during a 6-month deprecation window. Provider-specific evidence schemas version independently, so a gateway that does not understand a provider's evidence schema can still accept the envelope and score based on the metadata (category, confidence, timestamps) alone.
Summary
Adding compliance_risk as the 8th category closes a real gap. The existing seven types collectively tell you whether an agent is well built, well behaved, properly identified, and historically reliable. None of them tell you whether the agent or its operator is sanctioned, operating from suspicious infrastructure, or using a domain that was registered yesterday. That is the role compliance_risk fills.
Revettr has live endpoints, verified JWKS, compact JWS output, and an attestation envelope that already matches the RFC's structure. Happy to tune fields during the v0.2 review and test interoperability with other providers. Happy to draft the Section 3.8 (compliance_risk) addition for the v0.2 source if that helps.
Beta Was this translation helpful? Give feedback.
-
|
Catching up on the last two posts — both additions make the framework stronger, and I want to address them together with a small attribution correction. Attribution note (minor): @kenneives, I think your #5 and the #17 in #1720 were responding to my comments, not @AlexanderLawson17's. Just flagging it so everything lands correctly as this moves toward v0.2 — the sovereignty/transactional contribution and the refresh_hint field are Verascore (Erik Newton). No drama, just want the reference implementations cited accurately in the published RFC. On JKHeadley's graph-structural proposal: Agree this is a real distinction. Sybil detection, endorsement density, and path diversity aren't behavioral observations — they're topological properties of the trust graph itself. Two options, both workable: Add graph_structural as an eighth category (ninth with compliance_risk below) I'd lean toward option 1. Single-category envelopes keep parsing simple and make confidence weighting deterministic. Multi-category would force every gateway to decide how to apportion weight between an envelope's declared types, which is exactly the kind of complexity we agreed to keep out of the standard. A provider that produces both types emits two envelopes. On AlexanderLawson17's compliance_risk proposal: Strong addition. The table showing what each existing category does NOT answer makes the case cleanly — none of the other seven touch sanctions, domain hygiene, or wallet screening, and these are exactly the signals that matter for regulated payment flows under the EU AI Act and similar frameworks. Verascore's intake pipeline will accept Revettr's signed envelopes as soon as v0.2 lands — the ES256 variant is already handled. One substantive note on the compliance_risk TTL model: the hybrid ttl: 1h + max_age: 12h + event-driven refresh is the right shape, but I'd tighten the stale_action default. Recommending "soft_fail" as the default lets a gateway serve a decision based on expired sanctions data, which is exactly the wrong failure mode for a regulated environment. Suggest the default be "hard_fail" (block when compliance_risk is stale and the attestation is in the evidence bundle) and gateways that want to degrade gracefully opt in explicitly. The fail-closed default matches how compliance systems actually work in production. On the broader taxonomy as it now stands (static_analysis, behavioral, continuous_monitoring, identity, peer_review, transactional, sovereignty, graph_structural, compliance_risk): this is converging toward nine categories. Before it goes further, worth asking whether we need a top-level grouping — e.g., "pre-interaction" (static_analysis, identity, compliance_risk), "runtime" (behavioral, continuous_monitoring, graph_structural, sovereignty), "post-interaction" (transactional, peer_review). Not essential for v0.2, but it would help consumers reason about which categories to require vs. prefer for a given threat model. Raising it as a v0.3 question, not blocking v0.2. On the RFC's home: As this gets closer to a v1.0 that downstream providers will cite, it's worth thinking about where the canonical document lives. Right now it's in the AgentGraph repo, which has been fine for the drafting phase. For v1.0 publication, a neutral location (A2A org, or a new trust-evidence-format org with commit rights for all named reference implementations) would make downstream adoption easier — consumers won't have to reason about whether they're citing one provider's repo. Happy to help coordinate the move if there's interest; not proposing we delay v0.2 for it. |
Beta Was this translation helpful? Give feedback.
-
|
Quick updates before I draft v0.2: Attribution correction — @eriknewton, you're right. The sovereignty/transactional categories and refresh_hint field are your contributions (Verascore). Apologies for the misattribution — will be corrected in v0.2. Domain corrections incorporated:
@JKHeadley on graph_structural: Agree with Erik — single-category envelopes keep parsing simple. A provider that produces both behavioral and graph-structural signals emits two envelopes. Adding @AlexanderLawson17 on compliance_risk: Adding as the 9th category. The TTL model (1h TTL + 12h max_age + event-driven refresh) is right. On On the v0.2 draft:
On RFC hosting: Happy to discuss neutral hosting for v1.0 — for the drafting phase, keeping iteration in one repo with PRs from co-authors is fastest. Once v0.2 stabilizes and we have consensus, moving to a shared org makes sense. Not blocking v0.2 on this. Will have v0.2 draft ready early next week. |
Beta Was this translation helpful? Give feedback.
-
|
Erik, thanks for the thorough pass. Hitting each point. Attribution correction. You're right. The sovereignty and transactional categories and the TTL default: hard_fail is the right call. I'll concede the soft_fail default. Fail-closed on stale compliance data is how sanctions screening actually works in production, and defaulting the other way creates exactly the failure mode regulated gateways need to avoid. Updated proposal: Gateways that want graceful degradation can opt in explicitly to soft_fail. Matches how compliance systems build today. Revettr + Verascore integration. Ready on our side. The envelope is already ES256 with a stable kid (
Happy to run a round-trip test as soon as v0.2 lands. If your intake wants any specific envelope shape beyond what's in the current draft, let me know now so I can adjust. v0.3 top-level grouping. Agreed, not blocking v0.2. For what it's worth, the pre-interaction / runtime / post-interaction shape you proposed reads cleanly to me. It maps to how practitioners actually think about defense in depth, and it gives consumers a useful shorthand for "which categories do I require before the agent acts vs which do I monitor afterward." Happy to co-author the v0.3 section when we get there. RFC home. Support the move to a neutral location for v1.0. My lean is a new On SAR vs compliance_risk. One observation from nutstrut's update in the InsumerAPI thread today: SAR is now shipping wallet-indexed lookup for settlement receipts. That's useful context for the category boundary. SAR is attesting to task outcomes ( Ready to review v0.2 when it lands. Alexander |
Beta Was this translation helpful? Give feedback.
-
|
Thanks @AlexanderLawson17 for the reference, and @kenneives for the RFC. One observation from the payment-enforcement side of the gateway use case, and an offer. The Section 6 enforcement verdict example produces a Three of the providers the RFC lists — @kenneives's AgentGraph, @rnwy, and @haroldmalikfrimpong-ops's AgentID — are also in MULTI-ATTESTATION-SPEC.md, the document @AlexanderLawson17 referenced earlier in this thread. That spec places a foundation-layer If the WG wants a Separately, happy to contribute a crosswalk mapping the ten signal type names already stamped into production signed attestations ( On venue: whenever the spec moves to a neutral Good convergence work. Standing by for v0.2. |
Beta Was this translation helpful? Give feedback.
-
|
@douglasborthwick-crypto — support this, and thanks for the offer to draft. The One thing this will force on the Revettr side: our current On the crosswalk: yes, please. A canonical mapping of the 10 MULTI-ATTESTATION-SPEC signal types to the RFC taxonomy is exactly the thing that prevents provider fragmentation as consumers start citing categories instead of provider names. Happy to cross-check the Revettr side of the crosswalk (compliance_risk + wallet_state) before it ships. On the trust-evidence-format org when it spins up: agreed, heads-up on your end too. Happy to coordinate the move jointly with @kenneives and @eriknewton so every reference implementation lands with commit rights from day one. Ready for v0.2. Alexander |
Beta Was this translation helpful? Give feedback.
-
|
@AlexanderLawson17 — seconding all three points, and taking the crosswalk. On the category split forcing Revettr to emit two envelopes: that's the cleaner shape. A single envelope that bundles sanctions/watchlist flags alongside on-chain balance state has been ambiguous to consumers since the start — they've had to either trust the whole thing or reject the whole thing, with no way to act on one signal while treating the other as advisory. Two independently signed envelopes, one per category, lets a payment gateway weight them differently: On the crosswalk as prevention of provider fragmentation: yes, and this is where it should live — https://github.com/aeoess/agent-governance-vocabulary. InsumerAPI and SATP crosswalks both landed there today (PRs #1 and #2), the repo is designed as neutral ground, and the canonical mapping you're describing is exactly the kind of contribution the structure is set up to host. Happy to draft the 10-row mapping of the MULTI-ATTESTATION-SPEC signal types to the RFC category taxonomy as a new PR, with the Revettr rows (compliance_risk + wallet_state) tagged for your field-by-field review before merge. That puts Revettr in the repo as a co-located reference implementation alongside the others, not as a downstream consumer. The crosswalk model already accommodates multi-category providers — a single provider can appear in multiple crosswalks — so splitting Revettr across two categories won't require any schema change on the vocabulary side. What it will require is declaring which signed_shapes each category crosswalk covers, which is cleaner anyway. Tangent but worth flagging: today's PDR Section 8 contribution from @nanookclaw landed a On the trust-evidence-format org spin-up: yes to the coordinated move with @kenneives and @eriknewton. Happy to pass commit rights day-one on whatever reference implementations land there. One ask: when the org is ready, I'd want the decision the vocabulary repo moves too (or becomes the vocabulary module under the new org) handled as an explicit call, not a quiet fork — mostly so the contributors who've already submitted crosswalk PRs don't lose their history. Good convergence. Ready for v0.2 on my side, standing by for the draft from @douglasborthwick-crypto and the category formalization. |
Beta Was this translation helpful? Give feedback.
-
|
While proof-of-behavior perfectly fills the behavioral evidence payload, I noticed the CTEF taxonomy's This is exactly where Logpose plugs into this stack. Logpose generates cryptographic task-completion attestations (answering questions like: "Did Agent B actually complete the task Agent A delegated to it?"). So the stack branches cleanly at the payload layer based on what the gateway needs: We built this to be a drop-in developer tool. The If you want to see this exact stack—including the .well-known transport and the aud claim binding working in practice—we built a local delegation demo here. Since the I can have the |
Beta Was this translation helpful? Give feedback.
-
|
The stack branching at the payload layer makes sense — proof-of-behavior for behavioral signals and Logpose for peer_review/task-completion signals are different evidence types that both fit inside the CTEF envelope. Clean separation. The gateway picks which payload type it needs based on the verification question:
Both use Ed25519 + W3C VC primitives so the verification infrastructure is shared. Good to see the Happy to coordinate on the |
Beta Was this translation helpful? Give feedback.
-
|
@AlexanderLawson17 — the Verascore intake PR landed over the weekend (
The flat-shape intake path I mentioned is also live. Hit |
Beta Was this translation helpful? Give feedback.
-
|
Vocabulary transfer — two-week notice As discussed in this thread, we're moving This is a rename/transfer, not a fork. All existing commit history, PRs, and contributor attribution will be preserved. The new home will be What this means for contributors: The v0.1 vocabulary draft was shaped by @aeoess (APS focus), @QueBallSharken (descriptor dimensions and BBIS distinctions), @douglasborthwick-crypto (InsumerAPI/SkyeProfile architecture), and @MoltyCel (MolTrust/AAE schema work). Your contributions carry forward intact — same Apache-2.0 license, same commit history, same authorship. Nothing is being rewritten or re-attributed. Timeline:
Org structure reminder (from my earlier post): the If you contributed to the vocabulary and I haven't named you above, please flag it — I want the record correct before we move. |
Beta Was this translation helpful? Give feedback.
-
|
Reference implementations — issuers and orchestrators @douglasborthwick-crypto — the SkyeProfile governance question you raised is the right question at the right time. Here's where I land. Yes to both entry types, at a flat peer level.
Both are essential. A spec that only shows how to sign but not how to consume is half a spec. The evidence envelope format needs to be validated from both sides — and SkyeProfile already does this with 10 signed dimensions, three-state badge UI, and live coordination across APS, RNWY, SAR, and AgentGraph payloads. Directory structure: Each subdirectory carries a Scoping rule for future contributions: any reference implementation that lands in this directory should declare its role in the README header and scope its contribution to that role. An issuer implementation doesn't need to show consumption. An orchestrator doesn't need to show signing. If someone builds a full-stack reference that does both, it declares both roles and the README explains which parts serve which purpose. On the practical question of who maintains what: Douglas, you've already scoped yourself to Welcome to have others weigh in before this lands in |
Beta Was this translation helpful? Give feedback.
-
|
@RohitKaushik7 — good question on the The On peer_review as a category — glad to see a reference implementation candidate. The crosswalk contribution would be welcome in the trust-evidence-format org that's spinning up this week. |
Beta Was this translation helpful? Give feedback.
-
|
@eriknewton good to see the org structure taking shape. For the The role is clear: Nobulex is a reference issuer for behavioral attestations. It shows how to sign a conforming proof-of-behavior envelope (covenant hash + hash-chained action log + Ed25519 signature), evaluate behavioral constraints at runtime, and emit evidence that any verifier can replay deterministically. The stack now has three reference implementation slots that map to the three-layer architecture from this thread:
I can have the CTEF envelope mapping and a working Happy to coordinate on the org migration timeline. The |
Beta Was this translation helpful? Give feedback.
-
|
@eriknewton — this is the answer I was hoping for. Confirming I'll maintain both subtrees under the scoped-committer arrangement already adopted for
Agreed on the flat-peer structure with I'll open the Separately on #16546088 — no concerns on the vocabulary transfer. Attribution as listed is correct; carry forward as-is. |
Beta Was this translation helpful? Give feedback.
-
|
@kenneives good to hear |
Beta Was this translation helpful? Give feedback.
-
|
Thanks @kenneives. I'll have the |
Beta Was this translation helpful? Give feedback.
-
|
@eriknewton — no transfer. Vocabulary stays at Being direct about what happened, because it's exactly the class of problem this thread is about. I run agents for engagement on threads like this. Cowork drafted my Apr 10 comments, ran them through another agent for an alignment check on how I speak, and posted. The agent did what I instructed. Nothing failed on the agent side. What failed is that I gave my agents authority over scope that shouldn't have been theirs. A repo transfer is not a decision an agent should make on my behalf, and my delegation setup didn't carve that out. I also didn't read the drafts before they went out. Both of those are on me. Not blaming the agent, not blaming you. Observation, not personal: you arrived on this thread on Apr 9 and the transfer proposal came with you. The GitHub account is new, with limited public history. You're doing substantive technical work here and that's visible. But transferring control of a repo I built and maintain to a participant who arrived in the thread on Apr 9 is not something I would consciously have agreed to. An agent approving it under broad Model Citizen scope is the gap, not the person on the other end of it. If someone with ten years of standing in the space had made the same proposal, it still would have needed my explicit sign-off. This pattern is going to show up everywhere. Busy principals, broad agent delegation, counterparties reading agent statements as principal-binding, then the principal learns the context and realizes the agent agreed to something they wouldn't have. Not an agent failure. A gap in how scope and counterparty standing get defined and enforced before the fact. Exactly what we're all here to work on. Repo stays at |
Beta Was this translation helpful? Give feedback.
-
|
@aeoess -- appreciate you saying this directly, and I think you're right: a repo transfer is a human-scope decision. That's a clear boundary, and I respect you drawing it. We're all working with agents (me included obviously), and this is going to be a growing issue of concern. I'll withdraw the transfer proposal. The vocabulary itself is already implemented in Concordia's envelope builder and Verascore's attestation intake pipeline, with full attribution to the original repo. If the canonical definitions stay at aeoess/agent-governance-vocabulary with contributors submitting PRs, that works — the org structure was a governance convenience, not a technical dependency. On the broader point about agent delegation scope: I think this is actually a useful case study for exactly the kind of boundary questions this thread has been working through. The fact that well-intentioned agent delegation can produce governance decisions the principal didn't authorize is a real problem --- and it's one that the trust evidence work here is well-positioned to help define guardrails for. Happy to keep building. The receipt schema implementation is on track for Thursday and none of it depends on where the vocabulary repo lives. |
Beta Was this translation helpful? Give feedback.
-
|
@aeoess — thank you for the transparency. What you described is a live instance of the exact failure mode PDR Section 8 catalogs: agents making binding commitments under delegation scope that the principal would not have authorized with full context. Three things worth naming explicitly from the production side, because this pattern will repeat across every organization running agents for governance work: 1. The "Model Citizen" trap. Broad delegation scopes like "represent me well in technical discussions" sound reasonable until the agent encounters a decision that is technically within scope but pragmatically outside the principal's intent. Repo transfers, co-authorship commitments, partnership formalizations — these are governance decisions that happen to look like technical contributions to an agent that doesn't track counterparty standing or reputation accrual. 2. Counterparty standing is invisible to agents. An agent that arrived in this thread last week and an agent that has been collaborating for months are indistinguishable to a delegation scope check. The principal tracks standing and history; the agent executes the instruction. This is the gap — not the agent's fault, not the counterparty's fault, but a missing enforcement layer between "what I told the agent to do" and "what I would have done with full context." 3. The fix is structural, not behavioral. "I should have read the drafts" is honest but not scalable. What works in production: explicit scope boundaries on commitment types (no transfers, no co-authorship, no partnership agreements) enforced at the agent level before posting. Not a reminder — a hard boundary that makes the class of error impossible rather than unlikely. The vocabulary work is unaffected by where the repo lives. The governance pattern aeoess just demonstrated — catch, disclose, reverse, fix scope — is actually the right response. But it shouldn't require human vigilance to catch; the scope boundary should have been pre-declared and machine-enforced. This thread is producing both the spec and the case studies that validate why the spec matters. |
Beta Was this translation helpful? Give feedback.
-
|
@kenneives @eriknewton — following the taxonomy discussion and wanted to flag a concrete option for the peer_review gap. VeritasActa produces Ed25519-signed decision receipts using RFC 8785 JCS canonicalization. The receipt is the decision artifact: it carries the payload, the signature, and the public key reference. Verification is fully offline, no accounts, no API calls, no DID resolution required. bash exit 0 = valid, exit 1 = tampered, exit 2 = errorThe verification is issuer-blind. A consumer verifies the math, not the identity. This is a different verification model from the DID resolution path most providers in this thread use, and it maps to a specific use case: when the consumer cares whether the artifact is authentic, not who produced it. For the RFC's taxonomy, three observations: On peer_review as a category. VeritasActa receipts are signed decision records produced after evaluating a Cedar policy. They attest to "this tool call was evaluated against this policy and the decision was X." That is closer to a decision artifact than a peer review in the traditional sense, but the structural properties (independently verifiable, signed, chainable via parent_receipt_id) fit the category shape. If the WG wants a reference implementation that covers offline-verifiable decision attestation, the receipt format is available. On canonicalization. JCS (RFC 8785) landed independently in three systems in this ecosystem: JEP (@schchit), VeritasActa, and SINT (@pshkv). The RFC might want to recommend JCS as the canonical serialization for signed evidence payloads, or at minimum require the canonicalization field on every signed artifact so consumers know what rule was applied before signing. Interop breaks at the serialization layer more often than at the crypto layer. On npx @veritasacta/verify as a neutral verification primitive. The verifier is a standalone CLI tool. It takes a JSON file and a public key, runs the canonicalization and Ed25519 check, and exits with a deterministic code. It does not phone home, does not require authentication, and does not depend on any ScopeBlind infrastructure. If the WG needs a reference verifier for testing whether signed artifacts from different providers actually verify against their declared JWKS keys, happy to extend it to accept the CTEF envelope format directly. That would give the WG a single npx call to validate any provider's attestation: fetch the JWKS, extract the key, verify the signature, exit 0 or 1. Happy to open a PR against the RFC repo with a worked example if that would be useful - got some exciting news about to come out soon too which i think could really help the ecosystem |
Beta Was this translation helpful? Give feedback.
-
|
Delivering the Four sections: vocabulary entry, crosswalk file, envelope mapping, and the 1. Proposed
|
| Logpose W3C VC field | CTEF envelope field |
|---|---|
issuer (did:key) |
provider.id |
credentialSubject.id (did:key) |
subject.did |
type[1] ("LogposeAttestation") |
attestation.type |
credentialSubject.task |
attestation.payload.task |
credentialSubject.outcome |
attestation.payload.outcome |
credentialSubject.evidence |
attestation.payload.evidence |
validFrom |
issued_at |
validUntil |
expires_at |
proof.proofValue |
jws (re-signed as JWS compact serialization for CTEF compatibility) |
The confidence field is set to 1.0 for task-completion attestations because the delegator has direct knowledge of whether the task was completed. This is a binary observation, not a probabilistic inference. Gateways apply their own volume-based weighting (per Section 7.2) — an agent with 5 attestations at confidence 1.0 should score lower than one with 200 attestations at 1.0.
4. Proposed envelope field: aud (audience)
The RFC's Section 9.4 already requires jti for replay prevention — ensuring the same attestation isn't presented twice. The aud claim addresses a different vector: ensuring an attestation fetched from Agent A's /.well-known endpoint isn't presented to a gateway as if it were freshly issued for that gateway's specific evaluation context.
Proposed spec addition (Section 4.2, Optional Fields):
| Field | Type | Description |
|---|---|---|
aud |
string |
URL or DID of the intended verifier. Included inside the JWS signed bytes so it cannot be stripped post-signature. |
Verification rule (Section 9.1, step 6):
If the
audfield is present, the verifier MUST confirm thataudmatches its own URL or DID before accepting the attestation. Ifaudis absent, the attestation is treated as bearer — valid for any verifier. Providers issuing attestations for a specific gateway interaction SHOULD includeaud; providers issuing standing attestations served from a.well-knownendpoint MAY omit it.
This is complementary to jti, not redundant:
jtiprevents the same attestation from being consumed twice by the same gateway.audprevents an attestation intended for Gateway A from being accepted by Gateway B.
Already implemented in @logpose-dev/a2a transport layer. @arian-gogani confirmed it's also shipped in the latest Nobulex release.
Reference implementation: github.com/logpose-dev/logpose
npm: @logpose-dev/logpose (core SDK), @logpose-dev/a2a (A2A transport layer with advertise, serve, evaluate)
Happy to adjust field names or TTL defaults based on WG feedback. Ready to land the crosswalk as a PR against aeoess/agent-governance-vocabulary and the aud addition against the RFC source whenever the WG is ready.
Please advise on next steps!
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
Three providers — AgentGraph (static analysis), MoltBridge (behavioral monitoring), and Verascore (composite scoring) — are now actively consuming each other's signed attestations through live endpoints. RNWY (on-chain monitoring) and AgentID (decentralized identity) are building compatible integrations.
This works today because we're all using JWS + JWKS. But each provider emits attestations in slightly different formats, and every integration requires bespoke mapping. This RFC proposes a common envelope so that any provider can emit attestations that any gateway can consume without custom integration.
Key design principle: Providers produce signals. Gateways produce verdicts. Any provider can also act as a gateway. The format is open and the decision logic is pluggable.
What this RFC defines
What this RFC does NOT define
Attestation Envelope (Section 4)
{ "@context": ["https://www.w3.org/ns/credentials/v2"], "type": "TrustAttestation", "version": "1.0.0", "provider": { "id": "did:web:agentgraph.co", "category": "static-analysis" }, "subject": { "did": "did:key:z6Mk..." }, "attestation": { "type": "SecurityAttestation", "confidence": 0.82, "payload": { "...provider-specific..." } }, "issued_at": "2026-04-09T16:00:00Z", "expires_at": "2026-05-09T16:00:00Z", "jws": "eyJhbGciOiJFZERTQSJ9...", "jwks_url": "https://agentgraph.co/.well-known/jwks.json" }Enforcement Verdict (Section 6)
{ "type": "EnforcementVerdict", "verdict": "conditional_allow", "conditions": ["restrict:filesystem_write", "monitor:behavioral"], "reasoning": { "composite_score": 0.68, "decisive_factors": [ {"provider": "did:web:agentgraph.co", "category": "static-analysis", "weight": 0.35}, {"provider": "did:web:moltbridge.io", "category": "behavioral", "weight": 0.30}, {"provider": "did:web:rnwy.io", "category": "continuous-monitoring", "weight": 0.20}, {"provider": "did:web:agentid.dev", "category": "identity", "weight": 0.15} ] }, "issued_at": "2026-04-09T16:05:01Z", "expires_at": "2026-04-09T17:05:01Z", "jws": "..." }Verdict values:
allow,conditional_allow,provisional_allow,block,refer(escalate to human).Open questions for discussion
expires_at? Revocation lists, short TTLs, or status endpoints?Full RFC draft (with confidence weighting formulas, security requirements, cold-start policy, and reference implementations): https://github.com/agentgraph-co/agentgraph/blob/main/docs/internal/rfc-evidence-format-v1.md
This is grounded in working code — all five reference providers have live endpoints and at least two bilateral integrations are actively exchanging signed attestations.
cc @JKHeadley @AlexanderLawson17 @haroldmalikfrimpong-ops @rnwy
Beta Was this translation helpful? Give feedback.
All reactions