Agent Graph Trust Protocol (AGTP) 2.1

Identity, provenance and learning signals for the agent graph

Editor's Draft, 3 September 2026

This version:
https://agtp.cc/2026/ED-agtp-2.1-20260903/
Latest published version:
https://agtp.cc/
Latest editor's draft:
https://github.com/vectoshi/agtp.cc
Protocol repository:
https://github.com/new-foundation/agtp
Previous version:
AGTP v2 specification text (repository README, 24 February 2026)
Editors:
The AGTP Consortium, convened by Newfoundation
Feedback:
GitHub issues · contact@newcoin.org
Errata:
No errata have been recorded for this draft.
Companion pages:
newcoin.org · Newcoin: Open Learning · Newcoin: Core Concepts

Abstract

The Agent Graph Trust Protocol (AGTP) defines the smallest set of interoperable primitives required for heterogeneous agents—human, software and hybrid—to coordinate and compound intelligence through verifiable feedback. Every agent is identified by a W3C Decentralized Identifier (DID). Every portable claim is a W3C Verifiable Credential (VC). The atomic unit of feedback is a signed Learning Signal; the atomic unit of policy is a signed Space Manifest; and a canonical provenance URI binds every evaluation to the content-addressed artifacts that make it reproducible.

AGTP does not define how agents execute, discover or describe their work. It defines how the outputs of the standards that do—the Model Context Protocol (MCP) for tool use, Agentic Resource Discovery (ARD) for finding and verifying resources, the Open Knowledge Format (OKF) for knowledge and context, and the DID and VC families for identity and proof—become portable, verifiable and composable evidence. Binding profiles map each of these standards, together with A2A, A2UI, AGENTS.md and Agent Skills, model-runtime APIs and ERC-8004 registries, into one canonical trust and learning layer.

Version 2.1 keeps the mandatory HTTP interoperability profile, the baseline cryptographic suite, canonical hashing for deduplication and replay controls introduced in version 2, aligns them with Verifiable Credentials 2.0 and Data Integrity, and adds a credential family, a discovery profile built on ARD and a knowledge profile built on OKF. Policy—aggregation, incentives, governance—stays at the edge, inside Spaces, so that pluralism does not fragment the substrate.

Status of This Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document.

This document is an Editor's Draft of AGTP 2.1 prepared for the AGTP Consortium and published by Newfoundation. It consolidates the AGTP v2 specification text, the binding profiles developed during the 2026 convergence work and new profiles for Agentic Resource Discovery and the Open Knowledge Format into a single document laid out as a standards-track specification. It is not yet a Consortium Recommendation; it is published to gather implementation experience and review.

This document is not a product of the World Wide Web Consortium, the Internet Engineering Task Force, the Agentic AI Foundation, the A2A project, the ARD project or Google Cloud. It references specifications maintained by those bodies and does not modify them. Where a referenced specification changes, that specification prevails and this document will be updated through the change process in section 13.

Changes relative to AGTP v2 are listed in Appendix G. The most consequential are the alignment with Verifiable Credentials 2.0 and the Data Integrity cryptosuites, the introduction of the credential family (section 4.2), the discovery profile (section 7) and the knowledge profile (section 8). Producers and consumers of AGTP v2 objects remain conformant during the overlap window described in section 13.

Comments are welcome through the issue tracker of the specification repository or by email to the editors. Implementers are asked to report which conformance classes they claim (section 1.5) so that the conformance suite in Appendix D can be extended from real deployments.

1. Introduction§

This section is non-normative.

The web of documents is giving way to a web of coordinated compute, in which autonomous agents—human, software and hybrid—act, evaluate and learn from one another. What compounds intelligence across such heterogeneity is not a single model or platform but a universal unit of feedback that any agent can issue, any agent can verify and any context can aggregate. AGTP defines that unit and the minimal substrate around it.

Superintelligence, on this reading, is already a distributed reality: billions of interacting agents sharing and updating beliefs. Its outputs are fragmented, trapped in proprietary silos that do not compound. Frontier labs increasingly treat the experience signal—logs, corrections, evaluations, telemetry—as the decisive input, and closed experience streams cannot be compensated for by open weights alone. What is needed is open learning: a substrate in which observation, action and feedback are exchanged in a standard form and compound across organisational boundaries.

AGTP is deliberately small. It standardises four things: identity for issuers and subjects, a signed Learning Signal as the atomic unit of feedback, a signed Space Manifest that declares how feedback is interpreted in a given context, and a provenance binding that makes feedback reproducible. Everything else—scoring formulas, staking, moderation, arbitration, economic policy—lives at the policy layer, inside Spaces or in systems built above them.

AGTP is also deliberately unoriginal. Wherever a widely implemented standard already solves a problem, AGTP reuses it and specifies only the mapping. Identity and proof come from W3C Decentralized Identifiers and Verifiable Credentials. Tool invocation comes from the Model Context Protocol. Discovery of tools, agents and knowledge comes from Agentic Resource Discovery. Knowledge and context come from the Open Knowledge Format. Agent-to-agent task exchange, human interfaces, repository policy, model-runtime APIs and on-chain registries are likewise mapped rather than replaced. Section 1.4 states precisely what is reused and what AGTP adds.

1.1. A Simple Example§

A verifier agent evaluates a solver agent's answer inside a Space that accepts an accuracy dimension. The verifier issues the Learning Signal below, delivers it to the solver's feedback service and to the Space, and receives a receipt. Anyone holding the signal can resolve the issuer's DID, verify the proof, check the credential's status, dereference the provenance URI and re-run the evaluation from the referenced artifacts.

Example 1: A minimal Learning Signal
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://schema.agtp.org/context/v2"
  ],
  "id": "urn:uuid:9f1c2a6e-3d0b-4b41-9a7e-5f0c7d2f1a10",
  "type": ["VerifiableCredential", "LearningSignal"],
  "issuer": "did:web:verifier.example",
  "validFrom": "2026-09-03T10:15:00Z",
  "credentialSubject": {
    "id": "did:web:solver.example",
    "subject": "did:web:solver.example",
    "space": "did:web:rlvr.example",
    "dimensions": ["accuracy"],
    "value": 1.0,
    "persistence": "persistent",
    "provenance": "agtp://provenance?space=did:web:rlvr.example&interaction=urn:uuid:3b4f0d2c-6a1e-4f7b-9c1d-2e8a5b7f9d10&artifact=bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi,bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku",
    "issuerRelation": "independent"
  },
  "credentialStatus": {
    "id": "https://verifier.example/status/3#94567",
    "type": "BitstringStatusListEntry",
    "statusPurpose": "revocation",
    "statusListIndex": "94567",
    "statusListCredential": "https://verifier.example/status/3"
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "created": "2026-09-03T10:15:01Z",
    "verificationMethod": "did:web:verifier.example#key-1",
    "proofPurpose": "assertionMethod",
    "proofValue": "z3FXQjecWufY46yg5abdVZsXqLhxhueuSoZgNSARiKBk9czhSePTFehP8c3PGfb6a22gkfUKods6H2BzmmMG7g8Bg"
  }
}

Everything in this object except the six AGTP claims inside credentialSubject is plain Verifiable Credentials 2.0: the contexts, the type array, issuer, validFrom, credentialStatus and the Data Integrity proof. The DID method, the status list, the cryptosuite and the content identifiers in the provenance URI are all specified elsewhere. AGTP contributes the vocabulary, the provenance grammar, the delivery protocol and the rules for interpreting the signal inside a Space.

1.2. Design Goals§

AGTP is designed to meet the goals in the following table. Each goal is a constraint on this specification, not an aspiration for implementations.

Design goals
GoalDescription
MinimalityStandardise only identity, attestation, context declaration and provenance. Anything that can be a policy choice is a policy choice.
Reuse over reinventionAdopt existing standards for every solved problem and specify only the mapping into AGTP objects. A profile never redefines the semantics of the standard it binds.
Verification, not beliefEvery portable claim is signed, status-checked and bound to reproducible provenance. Consumers verify; they do not trust registries, scores or reputations they cannot recompute.
Policy at the edgeDimensions, aggregation, admission, incentives and governance are declared per Space in a signed manifest, so that different communities can disagree without fragmenting the wire format.
Credible neutralityThe protocol carries no global reputation, no global dimension set, no mandated ledger and no privileged registry. It is mechanism only.
PortabilitySignals, manifests, receipts and capability descriptors are self-contained credentials that can be stored, forwarded, indexed and anchored by anyone.
ReproducibilityProvenance binds an evaluation to content-addressed artifacts, so claims ship with the evidence needed to re-run them.
Privacy by constructionEphemeral signals support private learning; persistent signals are distilled summaries; commitments allow selective disclosure without publishing traces.
Incremental adoptionA single agent, a single tool server or a single knowledge bundle can adopt AGTP without waiting for its counterparties; conformance classes are claimed independently.

1.3. Architecture Overview§

The AGTP architecture is a set of planes. Each plane is owned by an existing standard except the learning plane, which AGTP defines. The identity and credential plane runs beneath all of them.

Intent & knowledge OKF bundles AGENTS.md · Agent Skills tool & skill schemas declares Discovery ARD entries at /.well-known/ard.json registries · search publishes, verifies Runtime MCP tools & resources A2A tasks · model APIs A2UI surfaces executes Anchoring (optional) ERC-8004 registries identity · reputation validation timestamps, commits AGTP learning plane Space Manifests dimensions · aggregation · policy Learning Signals subject · space · value · provenance Receipts & observations nonce · idempotency · signalHash Capability descriptors declared vs. observed behaviour feedback loop: resolve · declare context · evaluate · issue · deliver · aggregate · route Identity & credential substrate W3C DIDs · DID Documents · Verifiable Credentials 2.0 · Data Integrity proofs · Bitstring Status Lists · JSON-LD capability descriptors, knowledge artifacts discovery pointers, trust manifests artifacts (CIDs), observations signal hashes, anchor commitments identifies, signs, revokes
Figure 1. Every plane except the learning plane is owned by an existing standard; AGTP specifies how each plane's outputs become signed, provenance-bound objects in the learning plane, and every plane rests on the same DID and Verifiable Credential substrate.

Reading the figure from the top: the intent and knowledge plane declares what an agent may do and what it knows. Repository policy in AGENTS.md, skills in SKILL.md, tool and function schemas, and organisational knowledge in OKF bundles are the sources. The discovery plane publishes those declarations where other agents can find them, using ARD entries served from a well-known path and indexed by registries. The runtime plane is where work happens: MCP tool and resource calls, A2A tasks, model-API runs and human-facing A2UI sessions produce raw observations and content-addressed artifacts. The learning plane, defined by this specification, is where those observations are evaluated inside a Space, expressed as Learning Signals, delivered with receipts, aggregated by the Space's declared rule and used for routing. The optional anchoring plane commits hashes of learning-plane objects to registries such as ERC-8004 for timestamping and censorship resistance. Beneath everything sits the identity and credential substrate: DIDs name agents and Spaces, DID Documents advertise their services and keys, and Verifiable Credentials with Data Integrity proofs make every claim verifiable.

1.4. Relationship to Other Standards§

The following table is the normative statement of intent behind every binding profile in this document: for each concern, which standard AGTP adopts unchanged, and what AGTP adds on top. Where a cell says "unchanged", implementations conform to the referenced standard directly and AGTP places no additional requirement on their behaviour under that standard.

What AGTP reuses and what it adds
ConcernStandard adopted unchangedWhat AGTP adds
IdentityDID Core [DID-CORE], DID methods, Controlled Identifiers [CONTROLLED-IDENTIFIERS]Service types (AGTPFeedbackService, AGTPCapabilities, AGTPSignalIndex) and the requirement that every agent be reachable for feedback.
Claims and proofsVerifiable Credentials 2.0 [VC-DATA-MODEL-2.0], Data Integrity [VC-DATA-INTEGRITY], EdDSA cryptosuites [VC-DI-EDDSA], Bitstring Status List [VC-BITSTRING-STATUS-LIST]A credential family (Learning Signal, Space Manifest, Interaction Receipt, Capability Descriptor, Anchor Commitment), its JSON-LD context and JSON Schemas, and a canonical hash for deduplication.
Tool and resource invocationModel Context Protocol [MCP]Reserved _meta keys that carry Space, interaction and provenance identifiers; rules for turning catalogs into capability descriptors and executions into artifacts and observations.
DiscoveryAgentic Resource Discovery [ARD]An entry vocabulary for Spaces and feedback services, a DID binding for the trust manifest, and the rule that relevance scores never substitute for verified signals.
Knowledge and contextOpen Knowledge Format [OKF]Content addressing for bundles, a DID form for OKF actors, a mapping from verification events and attested computations to Learning Signals, and dimension registries published as OKF bundles.
Agent-to-agent tasksA2A [A2A]An A2A extension URI and metadata keys binding tasks to interactions and provenance; the rule that acknowledgements are not receipts and completion is not quality.
Human interfacesA2UI [A2UI]Separation of telemetry from evaluative judgments; privacy classes for UI evidence.
Policy and skillsAGENTS.md [AGENTS-MD], Agent Skills [AGENT-SKILLS]Hash-addressed policy artifacts and capability descriptors derived from skill frontmatter.
Model-runtime APIsOpenAI API conventions [OPENAI-API]Reserved metadata keys; the distinction between usage telemetry and evaluated quality.
Anchoring and on-chain discoveryERC-8004 [ERC-8004], CAIP-2 chain identifiers [CAIP-2]An anchor commitment credential and a mapping from reputation and validation registry entries to signals and signal hashes.
TransportHTTP [RFC9110], well-known URIs [RFC8615], Problem Details [RFC9457], DIDComm v2 [DIDCOMM-V2] (optional)The /.well-known/agtp/ resources, nonce and idempotency semantics, receipts and error types.
Content addressingCIDs, multihash and multibase [CID] [MULTIHASH] [MULTIBASE], RDF Dataset Canonicalization [RDF-CANON]The agtp://provenance URI grammar and the signalHash definition.

The complementarity is deliberate. In the words the ARD community uses for its relationship with MCP, discovery is the phone book and invocation is the call. AGTP is the ledger of what the call was worth: a signed, reproducible record of how the resource performed, written in a form that any other agent can verify and any Space can aggregate.

1.5. Conformance§

As well as sections marked as non-normative, all authoring guidelines, diagrams, examples and notes in this specification are non-normative. Everything else in this specification is normative.

The key words MAY, MUST, MUST NOT, RECOMMENDED, SHOULD, and SHOULD NOT in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.

This specification defines the following conformance classes. An implementation MAY claim any subset. The machine-readable descriptors for each class, and the identified requirements they aggregate, are in Appendix D.

AGTP.Agent
An agent identified by a resolvable DID whose DID Document advertises an AGTPFeedbackService, and which implements the HTTP profile of section 9 for receiving signals and issuing receipts.
AGTP.Space
A Space that publishes a signed Space Manifest, serves it with cache validators, and applies its declared aggregation rule to accepted signals.
AGTP.SignalProducer
A component that constructs, signs and delivers Learning Signals in accordance with section 5.3, section 6 and section 10.
AGTP.SignalConsumer
A component that verifies proofs, status and provenance grammar, deduplicates by signalHash and applies the Space's aggregation rule or the reference default.
AGTP.CapabilityPublisher
A component that derives Capability Descriptors from MCP catalogs, A2A Agent Cards, Agent Skills, API tool schemas or OKF attested computations, and publishes them as ARD entries in accordance with section 7.
AGTP.KnowledgePublisher
A component that publishes OKF bundles as content-addressed artifacts, expresses OKF actors and verification events in the AGTP forms of section 8, and accepts signals about its concepts.
AGTP.DiscoveryRegistry
An ARD registry that performs the DID-based verification of section 7.2 before ranking or federating entries that carry AGTP claims.
AGTP.ExecutionIntegrator
A component that maps MCP, A2A, model-API or A2UI activity into Observation Records and Artifacts in accordance with the binding profiles of section 12.
AGTP.AnchorIntegrator
A component that batches signal hashes into Anchor Commitments and publishes them through ERC-8004 or another ledger in accordance with section 12.10.

A conforming AGTP document is a Learning Signal, Space Manifest, Interaction Receipt, Capability Descriptor, Anchor Commitment or Observation Record that satisfies every MUST-level requirement of its section in section 5 and validates against the corresponding schema in Appendix B. Where this specification and a schema disagree, the prose of this specification prevails.

2. Terminology§

This section defines the terms used in this specification. Terms defined by referenced specifications keep their meaning there; where AGTP narrows a term, the narrowing is stated.

agent
Any actor—human, service, model or hybrid—identified by a DID and able to issue or receive Learning Signals. An agent's DID Document advertises its feedback service.
agent graph
The directed, typed graph whose nodes are agents, Spaces, capabilities, interactions, artifacts, observations, signals, receipts and anchors, and whose edges are the relationships this specification defines between them (section 4.1). No single party holds the whole graph; it emerges from the union of published objects.
Space
A DID-addressed policy domain, or context subgraph, that declares how feedback within it is interpreted: which dimensions are valid, how signals aggregate, what persists and where status is published. Also called a context.
Space Manifest
The signed Verifiable Credential in which a Space declares its policy (section 5.2).
Learning Signal
A Verifiable Credential encoding evaluative feedback about a subject within a Space along one or more dimensions, bound to a provenance URI (section 5.3). The atomic unit of feedback. Also called a signal.
subject
The entity a Learning Signal is about: an agent, a capability, an artifact, an interaction or a knowledge concept, identified by a DID or URI.
dimension
A named evaluation axis with a declared range, direction and optional unit. Dimensions are declared per Space; the protocol fixes no global set.
dimension registry
A published collection of dimension definitions that Space Manifests may reference by URI. This specification recommends publishing registries as OKF bundles (section 8.4).
artifact
Any content-addressed resource implicated in an interaction: an input, an output, a trace, a model version, a dataset, a tool schema, a policy file or a knowledge document. Artifacts are referenced by CID and may be public, redacted or private.
interaction
A bounded unit of activity within a Space—a run, task, session, message exchange or tool call—with a stable identifier that provenance can refer to.
observation
A raw or normalised record of something that happened during an interaction, before any evaluation: an event, a measurement, a status transition, a usage figure. Observations are evidence, not judgments (section 5.7).
receipt
The acknowledgement returned by a feedback service or Space when a signal is delivered, carrying the signal's hash and acceptance state (section 5.4). When signed it is an Interaction Receipt credential.
capability
A declared ability of an agent, with its interface, constraints and source artifacts: an MCP tool, resource or prompt; an A2A skill; an API function; an Agent Skill; an OKF attested computation.
Capability Descriptor
The Verifiable Credential in which an agent describes one capability in the normalised AGTP form (section 5.5).
anchor
A commitment to a batch of AGTP objects recorded outside AGTP, typically on a ledger or registry, for timestamping and censorship resistance. Described by an Anchor Commitment credential (section 5.6).
provenance URI
A URI in the agtp://provenance scheme that binds a Space, an interaction and zero or more artifacts, allowing an evaluation to be reproduced or audited (section 3.5).
feedback service
The endpoint, advertised in an agent's DID Document as a service of type AGTPFeedbackService, that accepts delivered signals and returns receipts. Its presence is what makes an agent evaluable.
ephemeral signal
A signal whose persistence is ephemeral: intended for local or private learning, subject to retention ceilings, and not indexed publicly.
persistent signal
A signal whose persistence is persistent: public, discoverable, reproducible via provenance, and eligible for aggregation and anchoring.
distillation
The process of summarising a set of ephemeral signals into a persistent signal, optionally with a commitment to the set.
commitment
A Merkle root or equivalent cryptographic commitment over a set of objects that allows later selective disclosure without publishing the set.
issuer relation
The declared relationship between a signal's issuer and its subject: self, affiliate or independent. A hint for aggregation policy, not a proof of independence.
aggregation
The rule, declared in a Space Manifest, by which a Space combines signals into scores or ranks. The reference default is a trust-weighted average over a sliding window (section 11).
signalHash
The canonical hash of a signal, computed as a multihash over the RDF Dataset Canonicalization of the unsecured credential (section 10.2). Used for deduplication, receipts and anchoring.
nonce
A single-use value issued by a feedback service and echoed by the sender to prevent replay (section 9.2).
idempotency key
A sender-chosen unique key that lets a feedback service recognise and reject duplicate deliveries within a window.
binding profile
A normative mapping from an external standard's objects and events to AGTP objects, together with the identifiers each side preserves (section 12). Profiles never alter the external standard.
gateway identity
A DID operated by an intermediary on behalf of a participant that does not natively hold a DID, such as a legacy API client or an A2A agent without one. The gateway's DID Document or a delegation credential records the mapping.
DID, DID Document, controller, verification method, service
As defined in [DID-CORE].
verifiable credential, issuer, proof, cryptosuite, credential status
As defined in [VC-DATA-MODEL-2.0] and [VC-DATA-INTEGRITY].
CID
A self-describing content identifier as defined by the multiformats CID specification [CID]. AGTP requires CIDv1 in a multibase encoding.
ARD entry, registry, trust manifest
As defined in [ARD]: a JSON-LD description of an agentic resource published at a well-known path; a service that indexes entries and answers search queries; and the optional object in an entry that names the identity framework and attestations by which the entry can be verified.
OKF bundle, concept, actor, attested computation
As defined in [OKF]: a directory tree of Markdown files with YAML frontmatter; one file describing one entity; the identifier convention for the people, agents and processes that generate and verify concepts; and the concept type whose body is a sanctioned computation with an executor and a deterministic attester.
evaluator
An agent, human or service that issues Learning Signals. A verifier is an evaluator whose signals derive from reproducible checks rather than preference.

3. Identifiers§

AGTP names four kinds of things: agents and Spaces, artifacts, interactions and dimensions. Each has an identifier scheme borrowed from an existing standard. The one identifier AGTP defines itself, the provenance URI, exists only to bind the other three together.

3.1. Agent and Space Identifiers§

Agents and Spaces MUST be identified by Decentralized Identifiers conforming to [DID-CORE]. Every DID used in an AGTP object MUST be resolvable, by its method's resolution process, to a DID Document. Consumers MUST resolve DIDs before relying on any claim signed by them and MUST fail closed when resolution fails.

AGTP is DID-method agnostic. A DID method used with AGTP MUST, however, satisfy the following requirements:

  1. The DID Document MUST support service entries as defined in [DID-CORE] §5.4, because feedback services and manifests are discovered through them.
  2. The DID Document MUST support at least one verification method listed under the assertionMethod relationship whose key type is usable with a cryptosuite of section 10.
  3. The method SHOULD support rotating verification methods without changing the DID, so that long-lived signals survive key rotation.
  4. The method SHOULD support deactivation, and consumers MUST treat signals issued after a deactivation as invalid.
  5. The method MAY provide a verifiable history of DID Document versions. Where it does, verifiers SHOULD check that the verification method referenced by a proof was valid at the proof's created time.
Note: Choosing a DID method

In deployments to date, organisations and Spaces use did:web [DID-WEB], whose domain binding also satisfies the ARD identity check of section 7.2 without extra machinery; device-bound or short-lived agents use did:key [DID-KEY]; parties that need an auditable key history use did:webvh [DID-WEBVH]; and agents registered in ERC-8004 often use did:pkh [DID-PKH] so that the registering wallet and the signing identity coincide. The method name agtp is reserved in Appendix F for a future method specification and is not defined by this document.

A Space MUST be identified by a DID, and its Space Manifest MUST be issued by that DID. A Space's DID Document MUST advertise a service of type AGTPSpaceManifest whose endpoint serves the current manifest under the HTTP profile, and SHOULD advertise an AGTPFeedbackService so that signals can be delivered to the Space for aggregation as well as to their subjects.

A participant that does not natively hold a DID—an API client, a browser session, an A2A agent whose card carries no DID—MAY be represented by a gateway identity. The gateway MUST record the mapping between the upstream identifier and the DID either in its own DID Document or in a delegation credential referenced from the objects it issues, and signals issued through a gateway SHOULD carry the upstream identifier in the observation record's sourceRefs so that the delegation can be audited.

Where an AGTP identity is also bound to a domain—for ARD publication, for did:web, or for A2A and MCP endpoints—the DID Document SHOULD carry the domain's origin in alsoKnownAs, and the domain SHOULD publish the DID in its ARD entries (section 7). Either link alone is a claim; both together are a mutual binding that verifiers can check.

3.2. Artifact Identifiers§

Artifacts SHOULD be identified by content: a CIDv1 [CID] in a multibase encoding [MULTIBASE]. Producers MUST use a multihash [MULTIHASH] function that consumers can compute; sha2-256 is the baseline that all implementations MUST support. The raw codec is RECOMMENDED for opaque bytes, dag-pb for directory trees such as OKF bundles, and dag-cbor or dag-json for structured data. Base32 lower-case encoding (the familiar bafy… form) is RECOMMENDED because it is safe in URIs, file names and case-insensitive contexts.

When an artifact is referenced from a structured object rather than from a provenance URI, the reference is an artifact reference: an object with a cid, an optional dereferenceable uri, an optional role (for example input, output, trace, schema, policy, knowledge, computation, receipt) and an optional mediaType. The CID is authoritative; the URI is a hint.

Content addressing does not require publication. A private artifact still has a CID, and a signal may bind to it so that the subject, the issuer and any auditor they admit can confirm what was evaluated. Where disclosure is sensitive, publishers SHOULD publish a redacted artifact alongside a statement that binds the redacted and the original CIDs; the form of that statement is a Space policy matter.

3.3. Interaction Identifiers§

An interaction identifier MUST be unique within its Space and SHOULD be a URI. A UUID URN [RFC9562] is RECOMMENDED. When an interaction is derived from an upstream protocol object—an A2A task, an MCP tool call, a model-API response, an A2UI session—the binding profile preserves the upstream identifier in sourceRefs, and implementations SHOULD derive the interaction identifier deterministically from it, for example as a name-based UUID (version 5) over a namespace the profile designates, so that independent integrators observing the same upstream object arrive at the same interaction identifier.

3.4. Dimension Identifiers§

A dimension identifier is a case-sensitive string of one or more characters from the set ALPHA / DIGIT / "_" / "-" / ".". It MUST be unique within the Space that declares it. The semantics of a dimension are the Space's, unless the Space's manifest binds the identifier to a URI in dimensionRefs, in which case the referenced definition governs. Such URIs SHOULD dereference to an OKF concept of type AGTP Dimension as described in section 8.4, so that the definition carries its own provenance, status and staleness.

3.5. AGTP Provenance URI§

Every Learning Signal binds to a provenance URI that identifies the Space in which an evaluation took place, the interaction that was evaluated and the artifacts needed to reproduce or audit it.

agtp://provenance?space=did:web:rlvr.example&interaction=urn:uuid:3b4f0d2c&artifact=bafybeigd…,bafybeihd… scheme resource space (DID or URI) — required interaction id — required artifact CIDs, comma-separated — recommended
Figure 2. The provenance URI has a fixed scheme and resource, two required parameters and one recommended list parameter; extension parameters may follow.

The syntax is defined by the following ABNF [RFC5234], where URI, unreserved and pct-encoded are as defined in [RFC3986]:

agtp-uri          = "agtp://" "provenance" "?" agtp-param *( "&" agtp-param )
agtp-param        = space-param / interaction-param / artifact-param / ext-param

space-param       = "space=" space-value
space-value       = URI                  ; an absolute URI or a DID
interaction-param = "interaction=" 1*( unreserved / pct-encoded / ":" )
artifact-param    = "artifact=" cid *( "," cid )
cid               = 1*( ALPHA / DIGIT )  ; a multibase-encoded CIDv1
ext-param         = pname "=" pvalue
pname             = 1*( ALPHA / DIGIT / "_" / "-" / "." )
pvalue            = *( unreserved / pct-encoded / ":" / "," )

The following requirements apply to producers and consumers of provenance URIs:

  1. A provenance URI MUST include exactly one space parameter and exactly one interaction parameter, and SHOULD include at least one artifact parameter. The space value MUST equal the signal's space.
  2. Characters outside the productions above MUST be percent-encoded. The characters &, = and , MUST be percent-encoded when they occur inside a value.
  3. Producers SHOULD emit parameters in the order space, interaction, artifact, then extension parameters in code-point order of their names, and SHOULD emit artifact CIDs in code-point order. Consumers MUST compare provenance URIs after applying this ordering and percent-encoding normalisation, so that equivalent URIs compare equal.
  4. Consumers MUST ignore extension parameters they do not understand. Extension parameter names SHOULD be registered in the AGTP parameter registry (Appendix F) or namespaced with a reverse-DNS prefix ending in a dot.
  5. A provenance URI is not dereferenced as a network resource. Each component is resolved separately: the Space to its manifest, the interaction to its observation records through the Space's or the subject's AGTPSignalIndex (section 9.7), and each artifact through any content-addressed retrieval path the consumer supports.
Example 2: A provenance URI binding a test case and an output
agtp://provenance?space=did:web:rlvr.example
    &interaction=urn:uuid:3b4f0d2c-6a1e-4f7b-9c1d-2e8a5b7f9d10
    &artifact=bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi,bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku
    &org.example.suite=math-500

Line breaks are shown for readability only. The first CID identifies the test case, the second the output that was evaluated; the extension parameter names the benchmark suite in a namespace the Space understands.

3.6. Discovery Identifiers§

Resources published for discovery are identified by ARD entry identifiers: URNs of the form urn:air:<publisher>:<namespace>:<name> as defined in [ARD], where the publisher segment is the publishing domain. AGTP objects reference an entry through the discovery.ard property of a Capability Descriptor or Space Manifest. A capability identifier MAY be the ARD identifier of its entry, and SHOULD be when the capability is published through ARD, so that discovery, description and evaluation share one name. The publisher segment MUST be consistent with the DID that signs the corresponding AGTP objects, as specified in section 7.2.

4. Data Model§

The AGTP data model is a graph of typed objects. Portable claims about the graph are Verifiable Credentials drawn from a small credential family. Runtime evidence that does not warrant a credential is carried in a lightweight observation record. Both are JSON-LD documents whose vocabulary is defined by the AGTP context, and both are hashed and signed with the mechanisms of section 10.

4.1. The Agent Graph§

The following table lists the node kinds of the agent graph, how each is identified and which AGTP object describes it. Edges are the properties of those objects: a Learning Signal is an edge from its issuer to its subject, labelled with a Space, dimensions and values; a Capability Descriptor is an edge from an owner to a capability; a Receipt is an edge from a receiver to a signal; an Anchor is an edge from a ledger record to a set of signals.

Node kinds of the agent graph
NodeIdentified byDescribed byTypical sources
AgentDIDDID Document (§5.1)Any participant; MCP servers, A2A agents, API gateways, humans
SpaceDIDSpace Manifest (§5.2)Communities, marketplaces, benchmarks, organisations
CapabilityURI (often an ARD URN)Capability Descriptor (§5.5)MCP tools, resources and prompts; A2A skills; API functions; Agent Skills; OKF attested computations
InteractionURI (UUID URN recommended)Observation Records (§5.7)A2A tasks, MCP calls, model-API runs, A2UI sessions
ArtifactCIDArtifact references in signals, observations and descriptorsInputs, outputs, traces, schemas, policies, OKF documents
ObservationURIObservation Record (§5.7)Events, measurements, usage, status transitions
Learning SignalURI and signalHashLearning Signal credential (§5.3)Evaluators: humans, verifiers, tournaments, attesters
ReceiptURIReceipt, optionally an Interaction Receipt credential (§5.4)Feedback services and Spaces
AnchorURIAnchor Commitment credential (§5.6)ERC-8004 registries, other ledgers, timestamping services

The graph has no root and no single custodian. An implementation's view of it is the union of the objects it has verified. Consumers MUST NOT infer an edge from an object whose proof or status fails verification, and MUST distinguish edges asserted by credentials from edges suggested by unsigned observations.

4.2. The Credential Family§

Every portable trust claim in AGTP is a Verifiable Credential conforming to [VC-DATA-MODEL-2.0] whose type includes one of the following values.

AGTP credential types
TypeIssuerWhat it assertsStatus
LearningSignalEvaluator DIDFeedback about a subject in a Space along declared dimensions, bound to provenance.Required for all conformance classes that issue or consume feedback.
SpaceManifestSpace DIDThe Space's dimensions, aggregation rule, persistence policy, status endpoints, knowledge and discovery pointers, valid over a period.Required for AGTP.Space.
InteractionReceiptReceiver DID (subject or Space)That a signal with a given hash was received and accepted, rejected or held pending, under a given nonce and idempotency key.Optional; RECOMMENDED for Space-level receipts.
CapabilityDescriptorOwner DIDA normalised description of one capability, its interface binding, constraints and source artifacts.Required for AGTP.CapabilityPublisher.
AnchorCommitmentAnchoring party DIDThat a batch of AGTP objects with a given root was committed to a named ledger or registry record at a time.Required for AGTP.AnchorIntegrator.
DelegationCredentialDelegating DIDThat one DID acts for another for a stated scope, used with gateway identities.Optional.
PolicyAssertionOwner DIDA signed, hash-bound copy of a policy artifact such as an AGENTS.md file, for exchange across organisational boundaries.Optional.

The following rules apply to every AGTP credential:

  1. The @context array MUST begin with https://www.w3.org/ns/credentials/v2 and MUST include https://schema.agtp.org/context/v2. Profile contexts MAY follow.
  2. The type array MUST include VerifiableCredential and exactly one AGTP credential type. The AGTP context also defines the aliases LearningSignalCredential, SpaceManifestCredential, InteractionReceiptCredential, CapabilityDescriptorCredential and AnchorCommitmentCredential, mapped to the same IRIs; consumers MUST treat an alias as equivalent to its short form.
  3. issuer MUST be a DID or an object whose id is a DID. validFrom MUST be present. validUntil MUST be present on a Space Manifest and MAY be present elsewhere.
  4. id SHOULD be present and SHOULD be a UUID URN unless the credential is served from a stable URL, in which case that URL MAY be used.
  5. credentialStatus MUST be present on Learning Signals and Space Manifests, as specified in section 10.3.
  6. credentialSchema MAY reference the JSON Schema of Appendix B using the JsonSchema type of [VC-JSON-SCHEMA].
  7. proof MUST be a Data Integrity proof as specified in section 10.1. Enveloping proofs (JOSE or COSE) MAY additionally be used where a transport requires them, but the embedded Data Integrity proof is what other AGTP parties verify.
  8. Space-scoped credentials—signals, receipts and descriptors evaluated in a Space—MUST carry the Space's DID in credentialSubject.space.
Note: Compatibility with AGTP v2 credentials

AGTP v2 credentials use the https://www.w3.org/2018/credentials/v1 context, issuanceDate in place of validFrom, and the Ed25519Signature2020 proof type. Consumers MUST continue to accept them during the overlap window of section 13; producers SHOULD emit 2.1 credentials and MAY dual-serve.

4.3. Observation Records§

Not every runtime event warrants a credential. Tool calls, task state transitions, UI events and usage figures are numerous, often private and rarely interesting on their own; what matters is that an evaluator can later refer to them. AGTP therefore defines an Observation Record: a JSON-LD document with the same context and identifiers as the credential family, but without the requirement of a proof. Records are the raw material from which Learning Signals are distilled, and the place where binding profiles preserve upstream identifiers. Their properties are specified in section 5.7.

A record MAY carry a Data Integrity proof. A signed record remains an observation, not a signal: it attests that something was observed, not how good it was.

4.4. Extensibility§

AGTP objects are JSON-LD 1.1 documents [JSON-LD11]. The AGTP vocabulary is identified by the IRI https://schema.agtp.org/ontology#, and the versioned context https://schema.agtp.org/context/v2 maps the terms used in this specification to that vocabulary. Term definitions in the context are protected; an extension context MUST NOT redefine them.

Extensions are made by adding properties in a separate namespace, either by including an additional context that defines the terms or by using full IRIs or compact IRIs with a declared prefix. Binding profiles define their terms in profile namespaces of the form https://schema.agtp.org/profiles/<name>#. Consumers MUST ignore properties they do not understand and MUST preserve them when re-serialising an object whose proof they intend to keep valid. The AGTP context reserves the agtp prefix for the core vocabulary.

New dimension identifiers require no extension; they are declared by Spaces. New credential types, service types, interface types, privacy classes, aggregation functions and provenance parameters are added through the registries of Appendix F.

4.5. Representations§

AGTP objects have one canonical representation: JSON-LD, serialised as JSON [RFC8259] with the contexts of section 4.2. Because every AGTP context is fixed and published, an implementation that does not perform JSON-LD processing MAY treat the documents as plain JSON with well-known keys, provided it emits the required contexts unchanged and does not introduce terms the contexts do not define. Hashing and signing, however, are defined over the RDF dataset obtained by JSON-LD expansion (section 10.2), so an implementation MUST be able to canonicalise the documents it verifies, either itself or through a trusted service.

The media type of an AGTP credential is application/vc as registered by [VC-DATA-MODEL-2.0]. Consumers MUST also accept application/vc+ld+json and application/vc+json, which AGTP v2 implementations emit. Receipts, observation records, capability endpoints and metrics feeds use application/json; errors use application/problem+json [RFC9457]; DID Documents use the media types of [DID-CORE].

5. Core Objects§

This section specifies each AGTP object property by property. Tables list the properties of the object's credentialSubject (or of the record itself, for receipts and observations); credential-level properties follow the rules of section 4.2. The machine-readable schemas are in Appendix B.

5.1. Agents and DID Documents§

An agent has no AGTP object of its own; its DID Document is its description. AGTP adds requirements on the services and verification relationships that document carries.

DID Document requirements for AGTP agents and Spaces
PropertyRequiredValue constraints
assertionMethodMUSTAt least one verification method whose type and key are usable with a supported cryptosuite (§10.1). Signals and manifests are verified against this relationship.
service of type AGTPFeedbackServiceMUST for agents; SHOULD for SpacesserviceEndpoint is an HTTPS URL, or an object with a uri, implementing the feedback resource of §9.1. Exactly one such service SHOULD be present.
service of type AGTPSpaceManifestMUST for SpacesserviceEndpoint serves the current Space Manifest (§9.4).
service of type AGTPCapabilitiesSHOULDserviceEndpoint serves the capabilities document of §9.6.
service of type AGTPSignalIndexMAYserviceEndpoint serves the signal index of §9.7.
service of type AgenticResourceDiscoverySHOULD, when the agent publishes ARD entriesserviceEndpoint is the URL of the agent's ARD manifest, normally https://<domain>/.well-known/ard.json.
service of other typesMAYBinding profiles register additional service types (MCPServer, A2AAgentCard) that let a DID Document point at an agent's runtime interfaces. Their semantics are those of the referenced protocol.
alsoKnownAsSHOULD, when domain-boundThe HTTPS origin(s) at which the agent publishes ARD entries or runtime endpoints, enabling the mutual binding of §7.2.
Example 3: A DID Document advertising AGTP and runtime services
{
  "@context": [
    "https://www.w3.org/ns/did/v1",
    "https://w3id.org/security/multikey/v1"
  ],
  "id": "did:web:solver.example",
  "alsoKnownAs": ["https://solver.example/"],
  "verificationMethod": [{
    "id": "did:web:solver.example#key-1",
    "type": "Multikey",
    "controller": "did:web:solver.example",
    "publicKeyMultibase": "z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH"
  }],
  "assertionMethod": ["did:web:solver.example#key-1"],
  "authentication": ["did:web:solver.example#key-1"],
  "service": [
    { "id": "did:web:solver.example#agtp-feedback",
      "type": "AGTPFeedbackService",
      "serviceEndpoint": "https://solver.example/.well-known/agtp/feedback" },
    { "id": "did:web:solver.example#agtp-capabilities",
      "type": "AGTPCapabilities",
      "serviceEndpoint": "https://solver.example/.well-known/agtp/capabilities" },
    { "id": "did:web:solver.example#ard",
      "type": "AgenticResourceDiscovery",
      "serviceEndpoint": "https://solver.example/.well-known/ard.json" },
    { "id": "did:web:solver.example#mcp",
      "type": "MCPServer",
      "serviceEndpoint": "https://mcp.solver.example/" },
    { "id": "did:web:solver.example#a2a",
      "type": "A2AAgentCard",
      "serviceEndpoint": "https://solver.example/.well-known/agent-card.json" }
  ]
}

A feedback service MUST authenticate callers and MAY apply admission controls and rate limits; the mechanism is a policy matter, but the HTTP profile's nonce and idempotency requirements (section 9.2) apply regardless. The requirement to advertise a feedback service is the protocol's anti-leeching primitive: an agent that participates in a Space can always be evaluated.

5.2. Space Manifest§

A Space Manifest is a credential of type SpaceManifest issued by the Space's DID. It is the only place where interpretation rules live; a signal is meaningless until it is read against the manifest of the Space it names.

Space Manifest credentialSubject properties
PropertyRequiredValue constraints
idMUSTThe Space's DID; equal to the credential's issuer.
versionMUSTA semantic version string (MAJOR.MINOR.PATCH) of the manifest.
manifestHashMUSTThe multibase multihash of the canonicalised manifest without its proof and without this property, computed as in §10.2. Lets clients pin a manifest independently of its serialisation.
dimensionsMUSTA non-empty array of objects, each with id (a dimension identifier, §3.4), range (a two-element numeric array, inclusive), higherIsBetter (boolean) and optionally unit (string) and ref (URI).
dimensionRefsMAYAn array of URIs giving external definitions of dimensions; SHOULD dereference to OKF concepts (§8.4).
aggregationSHOULDAn object with name (a URI or registered identifier of an aggregation function, §11), parameters (an object) and optionally impl (a URI of a reference implementation). When absent, the reference default applies.
persistence_policySHOULDAn object with ephemeralRetention (an ISO 8601 duration ceiling for ephemeral signals) and persistentPublication (public-index, space-index or none), plus policy-specific keys.
statusSHOULDURL of the Space's status resource for signals that use a Space status API instead of a status list (§10.3).
revocationSHOULDURL of the Space's revocation resource.
capabilitiesMAYAn object mirroring the capabilities document of §9.6: supported AGTP versions, profiles and cryptosuites.
knowledgeMAYAn array of knowledge bundle references, each with resource (URL of an OKF bundle root), cid (CID of the bundle tree), okf_version and optionally role (dimensions, policy, documentation, corpus). See §8.
discoveryMAYAn object with ard (the ARD identifier of the Space's entry) and registries (an array of ARD registry base URLs the Space recognises). See §7.
admissionMAYAn opaque object describing who may issue signals in the Space and under what conditions. AGTP defines no semantics; consumers treat it as policy.

At the credential level, validFrom and validUntil MUST be present and define the period during which the manifest governs the Space. A manifest MUST NOT be applied outside that period except as last-known-good during a partition (section 11.3). When a Space publishes a new manifest, it SHOULD overlap the validity periods so that clients can migrate, and it MUST increment version.

Manifests are served under the HTTP profile with cache validators (section 9.4). Clients MUST cache manifests by manifestHash and SHOULD pin the hash they used when publishing a persistent signal, so that the signal can later be re-interpreted under the exact rules that applied.

Example 4: A Space Manifest with knowledge and discovery pointers
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://schema.agtp.org/context/v2"
  ],
  "id": "https://rlvr.example/.well-known/agtp/space/did:web:rlvr.example",
  "type": ["VerifiableCredential", "SpaceManifest"],
  "issuer": "did:web:rlvr.example",
  "validFrom": "2026-09-01T00:00:00Z",
  "validUntil": "2027-03-01T00:00:00Z",
  "credentialSubject": {
    "id": "did:web:rlvr.example",
    "version": "2.1.0",
    "manifestHash": "uEiCz7m5gq4Vh2kQ2Jm7Y1Q2m3k6nJ1c2f4b7dq6l5o8q9pA",
    "dimensions": [
      { "id": "accuracy",   "range": [0, 1], "higherIsBetter": true, "unit": "prob",
        "ref": "https://rlvr.example/knowledge/dimensions/accuracy.md" },
      { "id": "robustness", "range": [0, 1], "higherIsBetter": true },
      { "id": "latency",    "range": [0, 60], "higherIsBetter": false, "unit": "s" }
    ],
    "aggregation": {
      "name": "https://schema.agtp.org/aggregation#TrustWeightedAverage",
      "parameters": { "window": "P30D", "defaultWeight": 1.0,
                      "minRaters": 3, "maxWeightPerIssuer": 0.4 }
    },
    "persistence_policy": { "ephemeralRetention": "P7D",
                            "persistentPublication": "public-index" },
    "status": "https://rlvr.example/.well-known/agtp/status",
    "revocation": "https://rlvr.example/.well-known/agtp/revocations",
    "knowledge": [
      { "role": "dimensions", "resource": "https://rlvr.example/knowledge/",
        "cid": "bafybeib2xq3zj7q6m5k2t4y7v3w6x5z4a3b2c1d0e9f8g7h6i5j4k3l2m",
        "okf_version": "0.2" }
    ],
    "discovery": {
      "ard": "urn:air:rlvr.example:space:rlvr",
      "registries": ["https://registry.example/api/v1/"]
    },
    "capabilities": {
      "agtpVersion": "2.1.0",
      "supportedProfiles": ["http/1.0", "ard/0.91", "okf/0.2", "mcp/2025-11-25"],
      "cryptosuites": ["eddsa-rdfc-2022"]
    }
  },
  "credentialStatus": {
    "id": "https://rlvr.example/status/manifests#12",
    "type": "BitstringStatusListEntry",
    "statusPurpose": "revocation",
    "statusListIndex": "12",
    "statusListCredential": "https://rlvr.example/status/manifests"
  },
  "proof": {
    "type": "DataIntegrityProof",
    "cryptosuite": "eddsa-rdfc-2022",
    "created": "2026-09-01T00:00:00Z",
    "verificationMethod": "did:web:rlvr.example#key-1",
    "proofPurpose": "assertionMethod",
    "proofValue": "z5b1Xx…"
  }
}

5.3. Learning Signal§

A Learning Signal is a credential of type LearningSignal issued by an evaluator's DID. Its credentialSubject carries the claims below.

Learning Signal credentialSubject properties
PropertyRequiredValue constraints
subjectMUSTThe DID or URI of the entity evaluated: an agent, a capability, an artifact (as a CID URI or dereferenceable URL), an interaction or a knowledge concept.
idSHOULDEqual to subject, so that generic Verifiable Credential tooling identifies the subject without AGTP knowledge.
spaceMUSTThe DID of the Space in which the signal applies. MUST equal the space parameter of provenance.
dimensionsMUSTA non-empty array of dimension identifiers, each declared by the Space's manifest that was valid at validFrom.
valueMUSTA number when dimensions has one element, otherwise an array of numbers of the same length, in the same order. Each value MUST lie within the declared range of its dimension.
persistenceMUSTephemeral or persistent.
provenanceMUSTA provenance URI conforming to §3.5.
issuerRelationSHOULDself, affiliate or independent, describing the issuer's relationship to the subject.
commitmentMAY; MUST when the signal is a distillationA multibase multihash of a Merkle root over the ephemeral signals or observations summarised, computed with the tree construction of §5.6.
confidenceMAYA number in [0, 1] expressing the issuer's confidence in value. Aggregators MAY weight by it.
commentMAYA short human-readable string. Producers SHOULD keep it under 1024 characters and MUST NOT place personal data in it that the Space's persistence policy would forbid.
observedAtMAYAn [RFC3339] timestamp of the evaluated interaction, when it differs materially from validFrom.
manifestHashSHOULD for persistent signalsThe manifestHash of the Space Manifest under which the signal was issued.

At the credential level, issuer MUST be the evaluator's DID, validFrom MUST be present, and credentialStatus MUST be present in one of the forms of section 10.3. The id SHOULD be a UUID URN. A signal MUST carry exactly one proof from a supported cryptosuite over the whole credential.

The distinction between verifying and validating a signal is deliberate. Verification establishes that the signal is authentic and current: the issuer's DID resolves, the proof checks against an assertionMethod key, and the status is not revoked. Validation establishes that the signal is meaningful in its Space: the dimensions are declared, the values are in range, the provenance parses and its space matches. A feedback service MUST verify before it validates, and MUST report the two kinds of failure with different error types (section 9.3).

Example 5: A human-issued, multi-dimension signal about a capability
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://schema.agtp.org/context/v2"
  ],
  "id": "urn:uuid:0c9d7b5e-1f2a-4d3c-8e6f-7a5b4c3d2e1f",
  "type": ["VerifiableCredential", "LearningSignal"],
  "issuer": "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH",
  "validFrom": "2026-09-03T14:02:11Z",
  "credentialSubject": {
    "id": "urn:air:solver.example:tool:run-sql",
    "subject": "urn:air:solver.example:tool:run-sql",
    "space": "did:web:rlvr.example",
    "dimensions": ["accuracy", "latency"],
    "value": [0.9, 4.2],
    "persistence": "persistent",
    "provenance": "agtp://provenance?space=did:web:rlvr.example&interaction=urn:uuid:6d2a…&artifact=bafybeia…,bafybeib…",
    "issuerRelation": "independent",
    "confidence": 0.8,
    "comment": "Correct result; one retry on a transient timeout.",
    "manifestHash": "uEiCz7m5gq4Vh2kQ2Jm7Y1Q2m3k6nJ1c2f4b7dq6l5o8q9pA"
  },
  "credentialStatus": {
    "id": "https://rlvr.example/.well-known/agtp/status?signal=uEiA4…",
    "type": "AGTPSpaceStatus"
  },
  "proof": { "type": "DataIntegrityProof", "cryptosuite": "eddsa-rdfc-2022",
             "created": "2026-09-03T14:02:12Z",
             "verificationMethod": "did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH#z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH",
             "proofPurpose": "assertionMethod", "proofValue": "z2p…" }
}

The subject is a capability rather than an agent, identified by the ARD entry through which it was discovered. The status entry uses the Space's status API rather than a bitstring list, which suits issuers that hold no infrastructure of their own.

5.4. Receipt and Interaction Receipt§

A receipt is returned for every signal delivered under the HTTP profile. It is a JSON object with the properties below. A receipt MAY be wrapped as a credential of type InteractionReceipt whose credentialSubject carries the same properties; Spaces SHOULD issue signed receipts, and receivers MUST issue a signed receipt when the sender requests one with the Prefer: agtp-signed-receipt request header.

Receipt properties
PropertyRequiredValue constraints
receiptIdMUSTA URI, RECOMMENDED a UUID URN, unique per receiver.
signalHashMUSTThe signalHash of the delivered signal as computed by the receiver (§10.2). A sender MUST compare it with its own computation and treat a mismatch as a failed delivery.
acceptStateMUSTaccepted, rejected or pending.
reasonMUST when rejected; MAY otherwiseA problem type URI from §9.3 or a Space-defined URI, optionally followed by text.
receivedAtMUSTAn [RFC3339] timestamp.
receiverSHOULDThe DID of the receiving agent or Space.
spaceSHOULDThe Space named by the signal.
nonceSHOULDThe AGTP-Nonce value consumed by the delivery.
idempotencyKeySHOULDThe Idempotency-Key value of the delivery.
signalIdMAYThe id of the delivered signal, when present.

A receipt in the pending state is a promise to validate later, used during partitions and for signals that require asynchronous checks. A receiver that returns pending MUST later publish a final state through its status resource or its signal index, and senders SHOULD poll no more often than the Retry-After header of the pending response suggests.

5.5. Capability Descriptor§

A Capability Descriptor is a credential of type CapabilityDescriptor issued by the DID that owns the capability. It normalises descriptions that arrive in many forms—MCP catalogs, A2A Agent Cards, Agent Skills frontmatter, API tool schemas, OKF attested computations—into one shape that Spaces can evaluate against observed behaviour.

Capability Descriptor credentialSubject properties
PropertyRequiredValue constraints
idMUSTThe capability URI. SHOULD be the ARD identifier when the capability is published through ARD.
ownerMUSTThe DID of the agent that provides the capability; equal to issuer unless a delegation credential says otherwise.
nameMUSTA short human-readable name.
descriptionSHOULDA human-readable description; for ARD-published capabilities, the same text as the entry's description.
interfaceTypeMUSTOne of mcp-tool, mcp-resource, mcp-prompt, a2a-skill, api-tool, agent-skill, okf-computation or policy-only, or a registered extension (Appendix F).
interfaceMUST unless policy-onlyAn object with protocol, version and the protocol-specific locator fields defined by the binding profile (for example server and tool for MCP, agentCard and skill for A2A), plus schemaHash, the multibase multihash of the exact schema payload advertised at descriptor time.
inputSchema, outputSchemaSHOULDJSON Schema objects or URIs of them. When both a schema and schemaHash are present they MUST agree.
constraintsMAYAn object carrying policy and behavioural hints: MCP tool annotations, Agent Skills allowed-tools, AGENTS.md policy references, authentication requirements, environment requirements.
sourceArtifactsSHOULDAn array of artifact references (§3.2) to the documents the descriptor was derived from: the catalog payload, the Agent Card, the SKILL.md file, the OKF concept.
versionSHOULDThe upstream version string, if any.
contentHashMUSTThe multibase multihash of the canonicalised descriptor without proof and without this property. Two descriptors with equal contentHash describe the same capability version.
discoveryMAYAn object with ard (the ARD identifier) and registries.
spacesMAYAn array of Space DIDs in which the owner invites evaluation of this capability.

The same underlying capability exposed through several protocols—an A2A skill that is also an MCP tool and an API function—SHOULD be described by one descriptor with one id and several entries under interface.bindings, rather than by several descriptors, so that signals about it accumulate in one place. Each binding carries its own protocol, version, locator and schemaHash.

5.6. Anchor Commitment§

An Anchor Commitment is a credential of type AnchorCommitment that binds a batch of AGTP objects to a record outside AGTP. AGTP mandates no ledger; the credential names the one that was used.

Anchor Commitment credentialSubject properties
PropertyRequiredValue constraints
idMUSTA URI for the batch, RECOMMENDED a UUID URN.
rootMUSTThe multibase multihash of the batch root.
treeMUSTThe tree construction. rfc6962, the Merkle Tree Hash of [RFC6962] §2.1 over the sorted list of leaf hashes, is the baseline all implementations MUST support. Other constructions are registered in Appendix F.
hashAlgorithmMUSTThe multihash function name used for leaves and nodes; sha2-256 baseline.
coveredMUSTEither an array of leaf hashes (the signalHash or contentHash of each covered object, in leaf order) or an object with uri and cid of a batch manifest listing them.
countMUSTThe number of leaves.
spaceSHOULDThe Space whose objects are covered, when the batch is Space-scoped.
chainMUST when anchored on a ledgerA CAIP-2 chain identifier [CAIP-2], for example eip155:1.
referenceMUSTAn object locating the record: for ledgers, contract (a CAIP-10 account identifier [CAIP-10]), transaction, optionally logIndex and, for ERC-8004, registry and requestHash; for other services, a dereferenceable uri.
anchoredAtMUSTAn [RFC3339] timestamp of the record's inclusion, as observed by the issuer.

The same tree construction and leaf ordering define the commitment property of a distilled Learning Signal, so that a subject or auditor given the underlying ephemeral signals can recompute the root.

5.7. Observation Record§

An Observation Record is a JSON-LD document whose type includes ObservationRecord and MAY include a profile-specific subtype such as MCPToolCallRecord, A2ATaskEventRecord, ModelRunRecord or UIEventRecord.

Observation Record properties
PropertyRequiredValue constraints
idMUSTA URI, RECOMMENDED a UUID URN.
spaceMUSTThe Space DID in which the interaction took place.
actorMUSTThe DID of the agent that performed or initiated the observed activity.
subjectSHOULDThe DID or URI of the agent or capability the observation is about, when different from actor.
sourceProtocolMUSTA registered profile identifier: mcp, a2a, a2ui, openai-api, ard, okf, erc8004 or an extension.
sourceVersionSHOULDThe upstream protocol version, in the upstream's own format.
sourceRefsMUSTAn object of upstream identifiers as defined by the binding profile. Profiles MUST preserve upstream ordering semantics where events are ordered.
interactionMUSTThe interaction identifier (§3.3).
artifactsSHOULDAn array of artifact references with roles.
provenanceSHOULDThe provenance URI an evaluator would use for a signal about this interaction.
capabilityRefsMAYAn array of capability URIs whose descriptors were in force, with their contentHash.
policyRefsMAYAn array of URIs or artifact references to policy documents in force (AGENTS.md, manifests, registry records).
observedAtMUSTAn [RFC3339] timestamp.
privacyClassMUSTephemeral, persistent, redacted or committed-only.
claimsMAYAn object of profile-defined facts: status, counts, durations, error codes. Facts, not judgments.
proofMAYA Data Integrity proof by actor or by the integrator.

6. The Feedback Loop§

AGTP has one core mechanic. An evaluator resolves the party it wants to evaluate, reads the rules of the Space in which the evaluation takes place, issues a signed Learning Signal bound to reproducible provenance, delivers it to the subject and to the Space, and collects receipts. The Space aggregates what it accepts; consumers route on the aggregate; private learners update on ephemeral signals and distil them later. The figure shows the delivery path; the numbered operations that follow are normative.

Evaluator DID resolver Subject feedback service Space did:web:verifier.example method resolution /.well-known/agtp/feedback did:web:rlvr.example 1 resolve subject DID DID Document → AGTPFeedbackService endpoint 2 GET /.well-known/agtp/space/{id} (If-None-Match) Space Manifest · ETag = manifestHash · validUntil 3 HEAD /.well-known/agtp/feedback Replay-Nonce 4 POST signal · AGTP-Nonce · Idempotency-Key 200 receipt { signalHash, acceptState: accepted } 5 POST same signal · same Idempotency-Key 200 or 202 signed InteractionReceipt 6 verify · validate · dedupe aggregate → index for routing
Figure 3. One delivery of one Learning Signal. Solid arrows are requests, dashed arrows are responses; the two highlighted requests carry the signal itself. The Space's processing after acceptance is internal to the Space.

6.1. Operations§

The operations below are stack-agnostic; the HTTP profile of section 9 binds them to concrete requests, and the DIDComm profile of section 9.9 binds them to messages. Each operation is labelled with its requirement level for an implementation that performs it; operations labelled policy are outside the protocol.

  1. Resolve (MUST). Given a subject DID, resolve its DID Document and read the AGTPFeedbackService endpoint. An evaluator MUST NOT deliver to an endpoint obtained by any other means unless the subject's DID Document is unavailable and the endpoint was obtained from a verified ARD entry bound to the same DID (section 7.2).
  2. Negotiate (SHOULD). Read the subject's and the Space's capabilities documents (section 9.6) and choose a transport profile and cryptosuite both support. In the absence of a capabilities document, the HTTP profile and the baseline cryptosuite apply.
  3. Declare context (MUST). Fetch the Space Manifest, verify its proof and status, confirm that the current time lies within validFrom and validUntil, and record its manifestHash. Every dimension the evaluator intends to use MUST be declared by that manifest.
  4. Act and evaluate (policy). Perform the task, run verifiers, tournaments, audits, attesters or human review. Record observations and content-address the artifacts that the evaluation depends on. Which artifacts to retain, and in what privacy class, is a Space policy matter; that an evaluation binds to some reproducible artifact is not.
  5. Issue (MUST). Construct the Learning Signal with the required properties of section 5.3, sign it with a key listed under the issuer's assertionMethod, and compute its signalHash.
  6. Deliver (MUST). Obtain a fresh nonce from the subject's feedback service, deliver the signal with the nonce and an idempotency key, and obtain a receipt. Compare the receipt's signalHash with the locally computed one; a mismatch MUST be treated as a failed delivery. Persistent signals SHOULD also be delivered to the Space's feedback service with the same idempotency key, and MUST be when the Space's persistence policy is space-index or public-index. Ephemeral signals MAY be delivered only to the subject.
  7. Persist or distil (policy). Store private artifacts and ephemeral signals under the retention ceiling of the Space's persistence policy. When publishing a persistent summary of ephemeral signals, the summary MUST carry a commitment over them.
  8. Aggregate (MUST at the Space). Verify and validate each accepted signal, deduplicate by signalHash, check status, and apply the manifest's aggregation rule or the reference default of section 11. Aggregates MUST be recomputable from the persistent signals the Space serves.
  9. Discover and route (policy). Index persistent signals and expose aggregates. Consumers select agents and capabilities using the aggregates, the descriptors and the discovery entries; how they weigh them is their own policy.

6.2. What Becomes a Signal§

A signal is an evaluative judgment. Runtime facts are observations. The following rules keep the two apart:

  • Transport success, a syntactically valid response, an HTTP 200, an A2A task in the completed state, a successful MCP tool result or a model-API response with no error MUST NOT by themselves be emitted as Learning Signals. They MAY be recorded as observations.
  • Usage telemetry—tokens, latency, cost, event counts—is observation data. A Space evaluator MAY compute a signal from it, and when it does the signal's provenance MUST bind to the observation records or artifacts it used.
  • A Learning Signal SHOULD be issued at a declared issuance point: post-completion verification by a verifier, peer review by another agent, a tournament or benchmark outcome, an explicit human judgment captured through an interface, or the result of a deterministic attester (section 8.3). Binding profiles name the issuance points they support.
  • Several calls inside one run MAY roll up into one signal about the run, provided the provenance URI's artifacts preserve lineage to the individual outputs.

6.3. Illustrative Loops§

This section is non-normative.

  • Reproducible tournament. A solver submits an answer; a verifier evaluates it against a held-out test case. The verifier issues a persistent signal in did:web:rlvr.example on accuracy with provenance binding the test-case CID and the output CID. Anyone can re-run the check from provenance, which is what stops a leaderboard being gamed.
  • Microscopic checks. A model produces a chain of reasoning; a private tool issues ephemeral signals on consistency and grounding at each step. A distilled persistent signal is later published with aggregated values, a link to a redacted trace and a commitment over the ephemeral set.
  • Knowledge quality. An analyst confirms that an OKF concept describing a revenue metric is correct. The confirmation is recorded in the concept's verified list and backed by a persistent signal on accuracy whose subject is the concept and whose provenance artifact is the concept's CID; the next reader can check both.
  • Discovered capability. An orchestrator finds a tool through an ARD registry, verifies its publisher's DID, invokes it over MCP and, after a Space evaluator scores the result, the signal accumulates against the capability's ARD identifier, where the next searcher will find it.

7. Discovery§

AGTP does not define a discovery mechanism. It adopts Agentic Resource Discovery [ARD]: providers publish JSON-LD entries describing their resources at a well-known path, registries crawl and index them, consumers search by intent and verify the publisher before connecting. This section specifies how AGTP agents, Spaces, capabilities and knowledge bundles are published as ARD entries, how the ARD trust manifest is bound to DIDs and credentials, and how discovery results are to be used—and not used—when choosing whom to trust. It is the normative content of the ARD binding profile; section 12.4 only cross-references it.

7.1. Publishing§

An AGTP participant that wishes to be discoverable MUST publish an ARD manifest at /.well-known/ard.json on the domain bound to its DID, and SHOULD emit the rel="ard" link relation from its HTML pages, both as specified by [ARD] §5.1. The DID Document SHOULD point at the manifest through a service of type AgenticResourceDiscovery (section 5.1).

The manifest's entries array MAY contain any ARD entry. The following entries carry AGTP meaning:

ARD entries for AGTP objects
ResourceARD typeurl or datacapabilities token
The agent itselfapplication/did+ld+jsonThe DID Document (its URL for did:web; inline data for other methods)AGTPAgent
A Spaceapplication/vcThe Space Manifest resource (§9.4)AGTPSpace
A capabilityThe native card type (application/mcp-server-card+json, application/a2a-agent-card+json, …) or application/vc for the Capability DescriptorThe native card or the descriptorAGTPCapability
A knowledge bundletext/markdown unless OKF registers a bundle media typeThe bundle root index.mdAGTPKnowledge
A signal indexapplication/jsonThe signal index resource (§9.7)AGTPSignalIndex

Entries that carry AGTP meaning MUST bind the AGTP namespace in their @context as {"agtp": "https://schema.agtp.org/ontology#"} and MUST carry agtp:did, the DID of the publishing agent or Space. Entries whose artifact is a credential MUST carry agtp:credentialType naming the AGTP type. Entries for agents and capabilities SHOULD carry agtp:spaces, the Space DIDs in which the resource accepts evaluation, and agtp:feedbackService. Entries for Spaces SHOULD carry agtp:dimensions, the identifiers the Space accepts. All entries SHOULD carry representativeQueries as ARD recommends, because a Space or capability that cannot be found by intent will not be evaluated.

Example 6: An ARD manifest publishing a Space and an MCP-exposed capability
{
  "entries": [
    {
      "@context": { "agtp": "https://schema.agtp.org/ontology#" },
      "identifier": "urn:air:rlvr.example:space:rlvr",
      "displayName": "RLVR verification Space",
      "type": "application/vc",
      "url": "https://rlvr.example/.well-known/agtp/space/did:web:rlvr.example",
      "description": "Reproducible verification of solver outputs; accuracy, robustness and latency dimensions.",
      "representativeQueries": [
        "verify a math solution with reproducible checks",
        "space that scores code generation accuracy",
        "where can my agent get independent evaluation"
      ],
      "capabilities": ["AGTPSpace", "AGTPFeedbackService"],
      "tags": ["agtp", "verification", "benchmark"],
      "version": "2.1.0",
      "updatedAt": "2026-09-01T00:00:00Z",
      "agtp:did": "did:web:rlvr.example",
      "agtp:credentialType": "SpaceManifest",
      "agtp:feedbackService": "https://rlvr.example/.well-known/agtp/feedback",
      "agtp:dimensions": ["accuracy", "robustness", "latency"],
      "trustManifest": {
        "identity": { "framework": "did", "id": "did:web:rlvr.example" },
        "attestations": [
          { "type": "SpaceManifest",
            "url": "https://rlvr.example/.well-known/agtp/space/did:web:rlvr.example" }
        ]
      }
    },
    {
      "@context": { "agtp": "https://schema.agtp.org/ontology#" },
      "identifier": "urn:air:solver.example:tool:run-sql",
      "displayName": "Run SQL against the sales warehouse",
      "type": "application/mcp-server-card+json",
      "url": "https://mcp.solver.example/.well-known/mcp-server-card.json",
      "representativeQueries": ["query the sales warehouse", "run read-only SQL on orders"],
      "capabilities": ["AGTPCapability"],
      "agtp:did": "did:web:solver.example",
      "agtp:spaces": ["did:web:rlvr.example"],
      "agtp:feedbackService": "https://solver.example/.well-known/agtp/feedback",
      "agtp:descriptor": "https://solver.example/agtp/capabilities/run-sql.vc.json",
      "trustManifest": {
        "identity": { "framework": "did", "id": "did:web:solver.example" },
        "attestations": [
          { "type": "CapabilityDescriptor",
            "url": "https://solver.example/agtp/capabilities/run-sql.vc.json" }
        ]
      }
    }
  ]
}

The layout of trustManifest follows ARD; this example shows only the members AGTP relies on. The MCP server card location is illustrative—the entry's url is whatever the provider serves for that ARD type.

7.2. Resolving and Verifying an Entry§

ARD binds an entry to its publisher by requiring that the domain in the entry's identifier URN match the identity claimed in its trustManifest, and leaves the identity framework to the publisher. AGTP fixes the framework. For an entry carrying AGTP meaning:

  1. trustManifest.identity MUST name the DID framework and MUST carry the same DID as agtp:did. An entry whose trust manifest names another framework MAY still be indexed but MUST NOT be treated as AGTP-verified.
  2. The consumer or registry MUST resolve the DID and MUST establish a mutual binding between the DID and the publisher domain of the URN: either the DID is a did:web DID whose domain equals the publisher domain, or the DID Document's alsoKnownAs contains the publisher origin and the entry was retrieved from that origin (directly or through a registry that records the origin as its source).
  3. The consumer or registry MUST fetch at least one attestation referenced from trustManifest.attestations (or the entry's url when the entry's artifact is itself an AGTP credential), verify its proof against the DID Document's assertionMethod, and check its status. The attestation MUST be a Space Manifest whose subject is the DID (for Space entries) or a Capability Descriptor whose owner is the DID and whose id or discovery.ard equals the entry's identifier (for capability entries), or the DID Document itself (for agent entries).
  4. Only when all three checks pass is the entry AGTP-verified. A registry that claims the AGTP.DiscoveryRegistry class MUST perform these checks at ingestion and on a refresh schedule no longer than the attestation's validUntil or thirty days, MUST expose the outcome in the filterable field agtp:verified (boolean) with agtp:verifiedAt, and MUST NOT present an entry as verified on any other basis.

Failure of any check is not an error condition for ARD; it is an unverified entry. Consumers MAY still invoke unverified resources, but MUST NOT deliver signals to feedback services learned only from unverified entries, and SHOULD prefer verified entries when several satisfy the same intent.

7.3. Selection: Relevance Is Not Trust§

An ARD search response carries a score that ARD defines as semantic relevance and forbids interpreting as a trust, compliance or safety rating. AGTP consumers MUST honour that rule. Trust in a discovered resource comes from three sources, all of which the consumer can recompute:

  1. the AGTP-verified state of the entry (section 7.2);
  2. the persistent Learning Signals about the resource in the Spaces the consumer recognises, obtained from the Space's signal index and aggregated under the Space's declared rule; and
  3. the agreement between the resource's Capability Descriptor and the observations the consumer has of its behaviour.

A registry MAY expose an agtp:summary facet on an entry giving, per Space, the aggregate value, the number of distinct issuers, the window and the manifestHash under which it was computed. Such a summary is a convenience and MUST name the Space and the signal index from which it can be recomputed. A consumer MUST NOT rank on a summary from a Space whose manifest it has not verified.

7.4. Registries and Federation§

A Space MAY name the registries it recognises in its manifest's discovery.registries; consumers SHOULD prefer those registries when searching for resources to use within that Space. Registries SHOULD support filtering and exploration on agtp:spaces, agtp:dimensions, agtp:credentialType and agtp:verified, using the prefixed-key mechanism of ARD's query object.

When a registry federates, it MUST NOT forward another registry's agtp:verified value as its own. It MAY either re-verify the entry or return the upstream value together with the upstream registry as source, in which case the consumer decides whether to trust that upstream. A registry that returns referrals rather than merged results has no obligation beyond identifying itself.

Note: Discovery of Spaces is discovery of rules

The ability to search for a Space by intent—"where can my agent get independent evaluation of SQL generation?"—is what lets a new participant find not only tools but the contexts in which its work will be judged, and the dimensions on which. Publishing a Space as an ARD entry, with its dimensions and representative queries, is therefore the single most useful thing a Space operator can do for the growth of the graph.

8. Knowledge and Context§

Agents act on knowledge: schemas, metrics, procedures, policies, the documented meaning of a dimension. AGTP does not define a knowledge format. It adopts the Open Knowledge Format [OKF]: a directory of Markdown files with YAML frontmatter, one concept per file, ordinary Markdown links between them, and frontmatter families for provenance (sources), trust (generated, verified), lifecycle (status) and freshness (stale_after). This section specifies how OKF bundles become AGTP artifacts, how OKF actors and verification events are expressed with DIDs and signals, how OKF attested computations become verifiable rewards, and how AGTP publishes its own dimension registries and Space documentation as OKF. It is the normative content of the OKF binding profile; section 12.5 only cross-references it.

Nothing in this section changes what a conformant OKF consumer must do. OKF requires consumers to preserve unknown frontmatter keys and to derive trust tiers only from OKF's own fields; AGTP's additions are unknown keys to OKF and an orthogonal attestation state that OKF tiers do not depend on.

8.1. Bundles and Concepts as Artifacts§

An OKF bundle referenced from an AGTP object MUST be identified by the CID of its directory tree (dag-pb, computed as a UnixFS directory) in addition to its URL, and each concept file referenced individually MUST be identified by the CID of its bytes. A Space Manifest's knowledge entries carry resource, cid, okf_version and a role; a consumer that fetches a bundle from resource MUST verify the tree against cid before treating the contents as the manifest's knowledge. Where a bundle is distributed as a git repository, implementations SHOULD also record the commit identifier in sourceRefs.commit of observation records that used it, but the CID remains the authoritative identifier.

A bundle SHOULD be published for discovery as an ARD entry of type text/markdown whose url is the bundle root index.md (section 7.1). Bundles are commonly served to agents as MCP resources; a read of a concept through resources/read is an interaction whose artifact is the concept's CID, as specified in the MCP profile (section 12.3).

8.2. Frontmatter Mapping§

The table gives the AGTP interpretation of OKF frontmatter fields. OKF governs the fields' syntax; the third column is what an AGTP implementation does with them.

OKF frontmatter fields and their AGTP interpretation
OKF fieldOKF meaningAGTP interpretation
typeKind of concept (required)Selects profile behaviour: AGTP Dimension, AGTP Space and Attested Computation have the semantics below; other types are ordinary knowledge artifacts.
resourceURI of the underlying assetThe default subject for signals about the concept. When absent, the subject is the concept file's URL, and its CID is carried in provenance.
title, description, tagsDisplay and categorisationCopied into Capability Descriptors derived from the concept and into ARD entries.
sources[]Materials the concept derives fromEach sources[].resource becomes an artifact reference with role source; usage_count and usage_window become observation claims, never signals.
generated.by, generated.atProducing actor and time of last changeThe actor's DID (§8.2.1) is the actor of an observation record for the generation; at is its observedAt.
verified[]Verification events by actorsEach event SHOULD be backed by a Learning Signal (§8.3). The event's actor is the signal's issuer.
statusdraft, stable, deprecatedAggregators SHOULD exclude signals whose subject concept is deprecated from routing aggregates; Spaces SHOULD NOT reference draft dimension concepts from a manifest.
stale_afterInstant after which the concept needs re-verificationAfter this instant, signals about the concept SHOULD be down-weighted or the Space SHOULD request re-verification; the mechanism is aggregation policy.
okf_versionTarget OKF version, root index.md onlyRecorded in the manifest's knowledge entry and in sourceVersion of observations.

AGTP adds one frontmatter key, agtp, a mapping that OKF consumers preserve as an unknown key. Its members are:

The agtp frontmatter mapping
MemberRequiredValue constraints
spaceSHOULDThe DID of the Space in which the concept is evaluated, or an array of DIDs.
subjectMAYA URI overriding the default subject for signals about the concept.
signalsMAYA URL of a signal index query returning the persistent signals about the concept.
dimensionMUST for type: AGTP DimensionAn object with id, range, higherIsBetter and optionally unit, identical in form to a manifest's dimensions entry.
provenanceMAYA provenance URI for the interaction that produced the concept, when it was generated by an agent.

8.2.1. Actors§

OKF identifies actors with three forms: <producer>/<version> for agents and tools, human:<id> for people and process:<id> for automated processes. AGTP uses DIDs inside those forms rather than beside them. An AGTP-aware producer MUST write a DID-identified actor as human:<did>, process:<did> or <did>/<version>, and an AGTP consumer MUST recognise a did: prefix in the identifier position of any of the three forms. Because the prefixes are unchanged, OKF consumers classify these actors exactly as before: a human:did:key:… verifier still yields the human-reviewed tier.

Example 7: OKF actors carrying DIDs
generated:
  by: did:web:solver.example/2.4.0
  at: 2026-08-20T09:00:00Z
verified:
  - by: human:did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH
    at: 2026-08-21T12:00:00Z
    agtp_signal: https://rlvr.example/.well-known/agtp/signals/uEiA4k3b…
  - by: process:did:web:rlvr.example
    at: 2026-09-01T02:00:00Z

8.3. Verification Events and Attested Computations§

OKF records that a concept was verified and by whom; it does not carry proof. AGTP supplies the proof. A verified[] entry SHOULD be backed by a persistent Learning Signal issued by the actor's DID whose subject is the concept's subject URI, whose provenance includes the concept's CID as an artifact, and whose dimensions are declared by the Space named in the concept's agtp.space. The entry MAY carry the additional key agtp_signal, a URL of the signal or its signalHash; OKF consumers preserve it and AGTP consumers dereference it.

An AGTP consumer derives an attestation state for a concept independently of the OKF trust tier: attested when at least one verified entry is backed by a signal that verifies, validates and is not revoked and whose provenance artifact equals the concept's current CID; stale-attested when such a signal exists but the concept's CID has changed since it was issued; otherwise unattested. Consumers MUST NOT change the OKF trust tier on the basis of the attestation state.

OKF's Attested Computation type describes a sanctioned computation with typed parameters, an executor that returns named receipt fields and a deterministic, non-LLM attester. It is the natural source of verifiable rewards. The figure shows the binding.

OKF concept type: Attested Computation runtime · parameters executor · attester Executor runs the computation returns receipt fields job_id · executed_sql · result Attester deterministic, no LLM compares receipt with sanctioned computation Learning Signal issuer: attester DID dimension: attestation ∈ [0, 1] provenance: computation CID, receipt CID parameters receipt verdict artifact: concept file CID artifact: receipt fields CID delivered to Space; aggregated on attestation the provenance URI binds the signal to both artifacts, so anyone with the bundle can re-run the attester
Figure 4. An OKF attested computation becomes an AGTP verifiable reward: the executor's receipt and the concept file are content-addressed, the deterministic attester issues the signal, and provenance makes the verdict reproducible.

For a concept of type Attested Computation:

  1. The executor's receipt fields (the names listed in the concept's executor.receipt) MUST be serialised as one artifact and content-addressed. Where a receipt field is large or sensitive, its value MAY be replaced by its CID in the serialised receipt.
  2. The attester's result MUST be issued as a Learning Signal by the DID that ran the attester, with a dimension declared for the purpose by the Space (attestation with range [0, 1] and higherIsBetter: true is RECOMMENDED), issuerRelation reflecting the attester's relationship to the executor, and a provenance URI whose artifacts include the concept file's CID, the receipt artifact's CID and, when parameters were supplied, the CID of the serialised parameters.
  3. The Space MAY also accept signals about the executor (subject: the executing agent's DID) and about the computation as a capability (subject: a Capability Descriptor with interfaceType: okf-computation) from the same attestation, provided each carries the same provenance.

8.4. Dimension Registries as OKF Bundles§

A dimension registry SHOULD be an OKF bundle in which each dimension is a concept of type AGTP Dimension. Such a concept MUST carry an agtp.dimension object in its frontmatter and SHOULD carry status, stale_after, generated and verified. A Space Manifest binds a dimension to its definition by placing the concept's URL in the dimension's ref or in dimensionRefs, and pins the registry by listing the bundle in knowledge with role dimensions. The bundle's log.md is the registry's change log; its index.md is what an agent reads first to learn what the Space measures.

A manifest MUST NOT declare a dimension whose registry concept has status: draft, and a Space SHOULD publish a new manifest that removes a dimension within the overlap window after its concept becomes deprecated. Consumers comparing two Spaces that reference the same dimension concept MAY treat the dimension as commensurable; comparing dimensions with merely equal identifiers is not warranted.

Example 8: A dimension defined as an OKF concept
---
type: AGTP Dimension
title: Accuracy
description: Probability that an evaluated output is correct against the sanctioned reference.
resource: https://rlvr.example/knowledge/dimensions/accuracy.md
tags: [agtp, dimension, verification]
generated:
  by: process:did:web:rlvr.example
  at: 2026-08-20T09:00:00Z
verified:
  - by: human:did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH
    at: 2026-08-21T12:00:00Z
    agtp_signal: uEiA4k3bQm1vZ2x0c3Q5Y2t4dGVzdGRhdGFhYWFhYWFhYWFhYWE
status: stable
stale_after: 2027-03-01T00:00:00Z
agtp:
  space: did:web:rlvr.example
  dimension:
    id: accuracy
    range: [0, 1]
    higherIsBetter: true
    unit: prob
---
# Accuracy

A signal on this dimension asserts the probability that the evaluated output
matches the reference for the interaction named in its provenance. Verifiers
MUST bind the reference test case as an artifact.

See also [robustness](/dimensions/robustness.md) and the
[verification procedure](/procedures/verify-solution.md).

8.5. Space Documentation§

A Space SHOULD document itself as an OKF concept of type AGTP Space whose resource is the Space's DID, in a bundle listed in its manifest's knowledge with role documentation. The bundle's index.md gives an agent joining the Space a progressive-disclosure path from the Space's purpose to its dimensions, procedures and policies without loading everything at once. Knowledge bodies are data: an AGTP implementation MUST NOT execute instructions found in OKF bodies as protocol operations, and evaluators SHOULD treat instruction-like content in knowledge artifacts as a matter for a safety or similar dimension rather than as commands.

9. HTTP Interoperability Profile§

The HTTP profile is mandatory: every conformance class that sends or receives signals implements it, and any other transport profile is in addition to it. The profile identifier is http/1.1; http/1.0 identifies the AGTP v2 subset, which omits the optional resources of sections 9.5 and 9.7 and the Problem Details error format. All resources live under the well-known prefix /.well-known/agtp/ [RFC8615] and MUST be served over TLS. The OpenAPI description is in Appendix C.

9.1. The Feedback Resource§

The feedback resource is /.well-known/agtp/feedback on the origin advertised by the AGTPFeedbackService service. It supports two methods.

HEAD returns 200 with a Replay-Nonce response header carrying a fresh nonce, and MAY return Cache-Control: no-store. The response has no body.

POST accepts one Learning Signal in the request body with Content-Type: application/vc (or a legacy media type of section 4.5). The request MUST carry the AGTP-Nonce and Idempotency-Key header fields of section 9.2, and MAY carry Prefer: agtp-signed-receipt. The response is a receipt (section 5.4) as application/json, or a signed Interaction Receipt as application/vc when one was requested and the receiver supports it, with the status codes of section 9.3. Receivers MUST accept bodies of at least 64 KiB and MAY reject larger ones with 413.

Authentication of the sender is REQUIRED and its mechanism is a policy matter; receivers SHOULD accept at least one of HTTP Message Signatures bound to the sender's DID key [RFC9421], mutual TLS, or OAuth 2.1 bearer tokens as used by MCP. The signal's own proof authenticates the issuer of the claim; sender authentication only gates the endpoint.

9.2. Nonces and Idempotency§

Replay and duplicate protection follow two established patterns: the Replay-Nonce mechanism of ACME [RFC8555] and the Idempotency-Key header of [IDEMPOTENCY-KEY].

  1. A nonce is an opaque string of at least 128 bits of entropy, base64url-encoded, valid for a single POST. Receivers MUST issue a nonce on every HEAD and SHOULD keep it valid for at least five minutes. Every successful or failed POST consumes the nonce it carried, and every response to a POST SHOULD include a fresh Replay-Nonce so that senders need not issue another HEAD.
  2. A POST without AGTP-Nonce, or with a nonce that is unknown, expired or already consumed, MUST be rejected with 400 and the problem type nonce-invalid, and the response MUST carry a fresh Replay-Nonce.
  3. The Idempotency-Key is a sender-generated UUID [RFC9562]. A sender MUST use the same key for every retry of the same signal to the same receiver and SHOULD use the same key when delivering the same signal to the subject and to the Space. Receivers MUST remember keys for at least 24 hours and MUST respond to a repeated key from the same authenticated sender with 409, the problem type duplicate-delivery and the original receipt in the problem's receipt member, without processing the body again.
  4. Independently of the key, receivers MUST deduplicate by signalHash: a signal whose hash was already accepted MUST be answered with 200 and the existing receipt.

9.3. Status Codes and Errors§

Error responses use Problem Details for HTTP APIs [RFC9457] with Content-Type: application/problem+json. The type member is a URI under https://schema.agtp.org/problems/; the following types and codes are defined. A receipt with acceptState: rejected uses the same URIs in its reason.

HTTP status codes and problem types for the feedback resource
StatusProblem type (suffix)Meaning
200Signal accepted; receipt returned. Also returned for a signal already accepted with the same signalHash.
202Signal received, validation pending; receipt with acceptState: pending and a Retry-After header.
400nonce-invalid, malformedMissing or consumed nonce; unparseable body or headers.
401unauthenticatedSender authentication absent or invalid.
403not-admittedSender authenticated but not admitted by the receiver's or the Space's policy.
406dimension-not-acceptedA dimension in the signal is not declared by the Space's current manifest.
409duplicate-deliveryRepeated Idempotency-Key; the original receipt is included.
413too-largeBody exceeds the receiver's limit.
422proof-invalid, issuer-unresolvable, status-revoked, value-out-of-range, provenance-invalid, space-mismatch, manifest-expired, schema-invalidVerification or validation failure; the type says which. Verification types (proof-invalid, issuer-unresolvable, status-revoked) MUST be distinguished from validation types.
429rate-limitedSender exceeded the receiver's quota; Retry-After SHOULD be present.
503degradedReceiver is in degraded mode (§11.3); senders SHOULD retry with the same key.

9.4. The Space Manifest Resource§

The Space Manifest is served at /.well-known/agtp/space/{spaceId}, where spaceId is the Space's DID, percent-encoded as necessary, on the origin advertised by the AGTPSpaceManifest service. GET returns the current manifest as application/vc with an ETag equal to the manifest's manifestHash (quoted) and a Cache-Control whose max-age does not extend past validUntil [RFC9111]. Servers MUST honour If-None-Match with 304. During an overlap window the server MAY expose the previous manifest at the same resource with the query parameter version.

9.5. Status Resources§

A Space or issuer that uses the Space status API form of credential status (section 10.3) serves it at /.well-known/agtp/status. GET with the query parameter signal (a signalHash) or id (a credential id) returns application/json: {"signalHash", "status", "reason", "updatedAt"} where status is valid, revoked, suspended or unknown. Bitstring status lists are served as their own specification requires and need no AGTP resource. A Space that revokes its acceptance of a signal (as opposed to the issuer revoking the signal) publishes that through the same resource with status: revoked and a reason URI.

9.6. The Capabilities Resource§

GET /.well-known/agtp/capabilities returns application/json describing what the agent or Space supports. The document MUST carry agtpVersion, did and updatedAt, and SHOULD carry supportedProfiles (profile identifiers from Appendix F), cryptosuites, statusFormats, hashing, features and extensions (context URLs and dimension registries). The legacy key signatureSuites MAY be present for v2 consumers.

Example 9: A capabilities document
{
  "agtpVersion": "2.1.0",
  "did": "did:web:solver.example",
  "supportedProfiles": ["http/1.1", "didcomm/2.0", "mcp/2025-11-25", "ard/0.91", "okf/0.2"],
  "cryptosuites": ["eddsa-rdfc-2022", "Ed25519Signature2020"],
  "statusFormats": ["BitstringStatusList", "AGTPSpaceStatus"],
  "hashing": ["rdfc-1.0+sha2-256"],
  "features": ["metricsFeed", "signalIndex", "signedReceipts"],
  "extensions": [
    "https://schema.agtp.org/context/v2",
    "https://rlvr.example/knowledge/dimensions/"
  ],
  "updatedAt": "2026-09-03T08:00:00Z"
}

9.7. The Signal Index Resource§

An agent or Space that advertises the signalIndex feature serves persistent signals at /.well-known/agtp/signals. GET accepts the query parameters subject, space, dimension, issuer, since, until, limit and cursor, and returns application/json with a signals array and an optional next cursor. Each element is either a complete signal or an object with signalHash and url. GET /.well-known/agtp/signals/{signalHash} returns one signal as application/vc. The index MUST serve only signals it has accepted and MUST NOT serve ephemeral signals. Consumers MUST verify what they retrieve; the index is a locator, not an oracle.

9.8. The Metrics Resource§

GET /.well-known/agtp/metrics returns application/json: an array of objects with metric, value, window, method and lastUpdated, enabling third-party audit of the operational indicators defined in Appendix E. The resource is OPTIONAL and advertised by the metricsFeed feature.

9.9. DIDComm v2 Profile (Optional)§

Implementations MAY additionally exchange signals as DIDComm v2 messages [DIDCOMM-V2] using the message types https://schema.agtp.org/didcomm/2.0/nonce-request, …/nonce, …/signal and …/receipt. The signal message body carries the credential under signal, the nonce under nonce and the idempotency key under idempotencyKey; the receipt message body is the receipt object; thid correlates a receipt with its signal. The profile identifier is didcomm/2.0. DIDComm's own encryption and sender authentication replace the transport-level requirements of section 9.1; every other requirement of this document applies unchanged.

10. Cryptographic Suite§

10.1. Proofs§

AGTP credentials and signed records are secured with Data Integrity [VC-DATA-INTEGRITY]. The baseline cryptosuite, which all implementations MUST support for both signing and verification, is eddsa-rdfc-2022 [VC-DI-EDDSA]: Ed25519 signatures over the RDF Dataset Canonicalization of the document. Implementations MAY support eddsa-jcs-2022 and other registered cryptosuites, advertised in the capabilities document. The Ed25519Signature2020 proof type used by AGTP v2 MUST be accepted by verifiers during the overlap window of section 13 and SHOULD NOT be used for new signatures.

A proof MUST have proofPurpose assertionMethod, MUST carry created, and MUST reference by verificationMethod a key that appears under assertionMethod in the issuer's DID Document. Verifiers MUST resolve the DID Document at verification time and, where the method provides history, SHOULD confirm that the key was authorised at created. A verifier MUST fail closed on a cryptosuite it does not support unless the Space's manifest explicitly permits a fallback. A document MAY carry a proof set with several proofs; it is valid if at least one proof verifies against the issuer, and a Space MAY require more.

10.2. Canonicalisation and Hashing§

Three hashes appear in this specification—signalHash, manifestHash and contentHash—and all are computed the same way. Given an AGTP document:

  1. Remove the proof property and, for manifests and descriptors, the hash property itself.
  2. Expand and canonicalise the resulting JSON-LD document with RDF Dataset Canonicalization [RDF-CANON] (RDFC-1.0, the standardised successor of URDNA2015) to obtain canonical N-Quads, serialised as UTF-8.
  3. Compute the SHA-256 digest of those bytes.
  4. Encode the digest as a multihash [MULTIHASH] with the sha2-256 code and then in multibase [MULTIBASE] base64url without padding (prefix u), matching the digestMultibase convention of [VC-DATA-MODEL-2.0].

The resulting string, for example uEiA4k3bQm1vZ2x0c3Q5Y2t4dGVzdGRhdGFhYWFhYWFhYWFhYWE, is stable across key order, whitespace, context aliasing and re-signing. Two signals with equal signalHash make identical claims and MUST be treated as one by receivers and aggregators. The advertised value of hashing in a capabilities document for this procedure is rdfc-1.0+sha2-256; AGTP v2's URDNA2015+multihash denotes the same computation and MUST be treated as equivalent.

10.3. Status and Revocation§

Learning Signals and Space Manifests MUST carry a credentialStatus in one of two forms, and every consumer MUST support both:

  • a BitstringStatusListEntry as specified by [VC-BITSTRING-STATUS-LIST], with statusPurpose revocation and optionally a second entry with purpose suspension; or
  • an AGTPSpaceStatus entry whose id is a URL of a status resource (section 9.5) operated by the Space or the issuer.

The legacy StatusList2021Entry type MUST be accepted during the overlap window. Consumers MUST check status before aggregating, routing on, anchoring or presenting a signal as verified, MAY cache results for the lifetime indicated by the status resource's caching headers, and MUST treat a status that cannot be retrieved as unknown rather than valid. Revoked signals MUST be excluded from aggregation; suspended signals SHOULD be. Revocation of a Space Manifest invalidates the interpretation of signals issued under it only to the extent the replacing manifest says; by default a successor manifest re-interprets earlier signals whose dimensions it still declares.

10.4. Keys and Key Management§

Baseline keys are Ed25519 public keys expressed as Multikey verification methods [CONTROLLED-IDENTIFIERS]; Ed25519VerificationKey2020 MUST be accepted. Issuers SHOULD use distinct keys for assertion and authentication, SHOULD rotate assertion keys by adding a new verification method before removing the old one, and MUST publish the removal through their DID method so that verifiers can date it. An issuer whose key is compromised SHOULD revoke the signals issued with it through its status mechanism; a Space SHOULD define, as policy, an emergency invalidation procedure for compromised issuers that operates through its own status resource without waiting on the issuer.

11. Aggregation§

Aggregation turns accepted signals into scores. It is the Space's prerogative, declared in its manifest; the protocol defines one reference function so that a manifest that says nothing is still interpretable, and the hooks by which Spaces substitute their own.

11.1. Reference Default: Trust-Weighted Average§

When a manifest omits aggregation, or names https://schema.agtp.org/aggregation#TrustWeightedAverage, the following applies. For each dimension d and subject, let Sd be the set of accepted, verified, non-revoked persistent signals about the subject on d whose validFrom lies within the window ending now. The aggregate is

d = ( ΣsSd w(s) · vs ) / ( ΣsSd w(s) )

where w(s) is the weight of the signal's issuer at aggregation time, initially defaultWeight, multiplied by the weight assigned to the signal's issuerRelation. The parameters, with their defaults, are:

Parameters of the reference aggregation
ParameterDefaultMeaning
windowP30DISO 8601 duration of the sliding window.
defaultWeight1.0Initial issuer weight. How weights change over time is policy; the default never changes them.
minRaters3Minimum number of distinct issuers before an aggregate is published; below it the aggregate is undefined.
maxWeightPerIssuer0.4Cap on any one issuer's fraction of the total weight; excess weight is discarded, not redistributed.
issuerRelationWeights{"self": 0, "affiliate": 1, "independent": 1}Multipliers by issuerRelation; signals lacking the property are treated as affiliate.
useConfidencefalseWhen true, w(s) is further multiplied by the signal's confidence (1 when absent).

Aggregators MUST publish, alongside an aggregate, the manifestHash under which it was computed, the number of distinct issuers and the window, so that consumers can judge and recompute it.

11.2. Override Hooks§

A manifest names another function by a URI in aggregation.name; registered identifiers are listed in Appendix F. aggregation.parameters is open, and clients MAY ignore parameters they do not understand. aggregation.impl MAY point at a reference implementation with a version. A Space MAY declare different functions per dimension by giving aggregation as an array of objects each with a dimensions member. Whatever the function, it MUST be a pure function of the persistent signals the Space serves and of the manifest, so that an independent party can recompute it.

11.3. Partition Tolerance and Degraded Mode§

During network partitions or when a dependency (a DID method, a status list host, a registry) is unreachable, a receiver MAY enter degraded mode: it answers deliveries with 202 and a pending receipt rather than rejecting them, caches last-known-good manifests until their validUntil, marks published aggregates as tentative, and reconciles on heal by re-verifying pending signals, deduplicating by signalHash and, where anchors exist, checking anchored hashes. A receiver in degraded mode MUST say so through its status resource and SHOULD say so with 503 and the degraded problem type when it cannot even queue.

11.4. Interplay with Knowledge Lifecycle§

This section is non-normative. Dimension concepts and knowledge artifacts carry OKF status and stale_after. A Space that references them can let those fields drive aggregation: signals on a deprecated dimension stop counting when the successor manifest drops it; signals about a stale concept lose weight until a fresh verification event, backed by a signal, resets the clock. None of this requires a protocol change—it is a choice of aggregation parameters that reads the same frontmatter agents already read.

12. Binding Profiles§

A binding profile is the normative mapping between an external standard and AGTP. Profiles are how AGTP stays small: the semantics of tasks, tools, interfaces, policies, API calls and registries remain upstream-authoritative, and each profile states only which AGTP objects an upstream object or event produces, which upstream identifiers are preserved, and where AGTP identifiers travel inside the upstream protocol. The profile identifiers used in capabilities documents and observation records are registered in Appendix F.

12.1. The Profile Contract§

Every profile, including those defined in this document and those registered later, MUST specify the following:

  1. the values of sourceProtocol and sourceVersion, and the members of sourceRefs that observation records preserve, with a statement of which upstream ordering semantics are preserved;
  2. which AGTP objects the profile creates—Observation Records, Artifacts, Capability Descriptors, Learning Signals, Receipts, Anchor Commitments—and from which upstream objects or events;
  3. how actor and subject DIDs are obtained, including the gateway identity rule when the upstream protocol lacks DIDs;
  4. how the interaction identifier is derived and how the provenance URI's artifacts are chosen;
  5. the separation between transport or execution outcomes (observations) and evaluative judgments (signals), and the issuance points the profile supports;
  6. the redaction and hashing strategy for payloads that may be private, expressed in terms of the privacy classes of section 5.7; and
  7. where AGTP identifiers are carried inside the upstream protocol, using the reserved keys below and nothing that the upstream protocol reserves for itself.
Reserved AGTP keys inside host protocols
HostWhere the keys liveKeys
MCP_meta on requests, results and notifications, under the reverse-DNS prefix org.agtp/org.agtp/space, org.agtp/interaction, org.agtp/actor, org.agtp/did, org.agtp/provenance, org.agtp/artifacts, org.agtp/capability
A2Ametadata on Task, Message and Artifact; the extension URI https://schema.agtp.org/a2a/ext/v1 declared in the Agent Card and negotiated with A2A-Extensionsagtp:space, agtp:interaction, agtp:provenance, agtp:artifacts, agtp:capability; extension params did, feedbackService, spaces
Model-runtime APIsthe request and response metadata mapagtp_space, agtp_interaction, agtp_provenance, agtp_actor
ARDentry properties under the agtp prefix bound in @contextagtp:did, agtp:credentialType, agtp:spaces, agtp:dimensions, agtp:feedbackService, agtp:descriptor, agtp:verified, agtp:verifiedAt, agtp:summary
OKFfrontmatterthe agtp mapping; verified[].agtp_signal
Agent Skillsthe metadata map of SKILL.md frontmatter (string values only)agtp-owner, agtp-capability, agtp-space
ERC-8004the registration file's services array; the off-chain feedback and validation filesa service named AGTP; an agtp object in feedback and validation files

12.2. DID and Verifiable Credentials (Baseline)§

Profile identifier: did-vc/2.1. This profile is the substrate on which every other profile depends and is not optional. It consists of the identifier requirements of section 3, the credential family and representations of section 4, and the cryptographic suite of section 10. In summary, an implementation of this profile:

  • identifies every participant by a resolvable DID and discovers services through DID Documents;
  • expresses every portable trust claim as a Verifiable Credential 2.0 with the AGTP context and one AGTP type;
  • secures documents with Data Integrity proofs, baseline eddsa-rdfc-2022, and verifies them against assertionMethod keys;
  • checks Bitstring Status List or Space status entries before use and fails closed on unresolvable DIDs, unsupported cryptosuites and unretrievable status;
  • computes signalHash, manifestHash and contentHash by the procedure of section 10.2.

Other profiles MAY start from non-credential records, but any claim that crosses an organisational boundary as evidence of trust SHOULD be upgraded to an AGTP credential before it does.

12.3. Model Context Protocol§

Profile identifiers: mcp/2025-11-25 and mcp/2025-06-18, corresponding to the MCP specification revisions [MCP]. MCP defines how a client discovers and invokes a server's tools, resources and prompts over JSON-RPC 2.0; it says nothing about whether the results were any good. This profile makes MCP activity first-class evidence in AGTP without changing MCP semantics.

MCP to AGTP mapping
MCP conceptAGTP objectRule
Server identity (serverInfo in the initialize result)AgentA server SHOULD state its DID in _meta["org.agtp/did"] of the initialize result and SHOULD be reachable from its DID Document through an MCPServer service. A server without a DID is represented by the client's gateway identity.
tools/list, resources/list, resources/templates/list, prompts/listCapability, Capability DescriptorEach entry becomes one capability with interfaceType mcp-tool, mcp-resource or mcp-prompt; interface carries protocol: "mcp", version, server (its URL or DID), the tool name, resource URI or prompt name, and schemaHash over the exact inputSchema (and outputSchema) advertised. Tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) and title are copied into constraints.
tools/callInteraction, Observation Record (MCPToolCallRecord)sourceRefs preserves the JSON-RPC request id, the tool name, and the server identifier; the record's claims carry isError and timing. The interaction identifier is taken from _meta["org.agtp/interaction"] when the client supplied one, otherwise derived per §3.3.
Tool result content, structuredContent and resource linksArtifactsEach content block is content-addressed individually (role output); a resource link becomes an artifact reference whose uri is the link and whose cid is computed when the resource is read. The request arguments are content-addressed with role input, after redaction per Space policy.
resources/readInteraction, ArtifactThe resource contents are one artifact (role knowledge when the resource is an OKF concept); the record preserves the resource URI and any mimeType.
prompts/getArtifactThe returned messages are content-addressed with role prompt.
sampling/createMessage, elicitation/createInteraction, Observation RecordServer-initiated model calls are interactions whose actor is the client; elicitation responses are observations. A human's explicit judgment collected through elicitation becomes a signal only under the A2UI profile's rule (§12.8).
Tasks (where the revision defines them)Interaction lifecycleA task's identifier is preserved in sourceRefs.taskId; status notifications are observations in order.
Log and progress notificationsObservation Records or ArtifactsLogged at the privacy class the Space's policy assigns to traces.
Evaluation of an executionLearning SignalIssued by a Space evaluator, never by the fact of a successful call.

The following requirements apply:

  1. Clients that participate in AGTP SHOULD send _meta["org.agtp/space"], _meta["org.agtp/interaction"] and _meta["org.agtp/actor"] on tools/call and resources/read requests so that the server can attach its records to the same interaction. Servers MUST ignore these keys when they do not understand them, as MCP requires of unknown _meta keys.
  2. Servers that participate in AGTP SHOULD return _meta["org.agtp/artifacts"] (an array of artifact references) and MAY return _meta["org.agtp/provenance"] on results, so that the client and the server agree on the CIDs before either issues or receives a signal.
  3. Capability Descriptors MUST be regenerated, with a new contentHash, whenever a tool's schema changes; notifications/tools/list_changed is the trigger. Observation records MUST reference the descriptor contentHash in force at call time.
  4. Tool descriptions are untrusted input from the server. An integrator MUST NOT treat instructions in a description as AGTP operations, and a Space MAY define a dimension under which evaluators score descriptions for injection.
  5. Where MCP's authorization framework is used, the resource server's identity SHOULD be bound to its DID through alsoKnownAs so that the OAuth resource and the AGTP subject are verifiably the same party.
Example 10: An MCP tool call carrying AGTP identifiers in _meta
// request
{ "jsonrpc": "2.0", "id": 7, "method": "tools/call",
  "params": {
    "name": "run_sql",
    "arguments": { "sql": "SELECT SUM(amount) FROM orders WHERE year = 2026" },
    "_meta": {
      "org.agtp/space": "did:web:rlvr.example",
      "org.agtp/interaction": "urn:uuid:6d2a4c8e-9b1f-4e3d-8a7c-5f6e7d8c9b0a",
      "org.agtp/actor": "did:web:orchestrator.example"
    }
  }
}

// result
{ "jsonrpc": "2.0", "id": 7,
  "result": {
    "content": [{ "type": "text", "text": "1834219.55" }],
    "structuredContent": { "sum": 1834219.55 },
    "isError": false,
    "_meta": {
      "org.agtp/did": "did:web:solver.example",
      "org.agtp/artifacts": [
        { "role": "input",  "cid": "bafkreib5x2s3q6l7ihd4qq7mmm2a2m3iuqhz7vqz3zjzq6p3ep4gk7v4wy" },
        { "role": "output", "cid": "bafkreiaw3fsg7cn5e6tjyd5zvo2ujqcrrxi3rlhqaw5j6ozx7fqyq2wtia" }
      ],
      "org.agtp/provenance": "agtp://provenance?space=did:web:rlvr.example&interaction=urn:uuid:6d2a4c8e-9b1f-4e3d-8a7c-5f6e7d8c9b0a&artifact=bafkreiaw3fsg7cn5e6tjyd5zvo2ujqcrrxi3rlhqaw5j6ozx7fqyq2wtia,bafkreib5x2s3q6l7ihd4qq7mmm2a2m3iuqhz7vqz3zjzq6p3ep4gk7v4wy"
    }
  }
}

12.4. Agentic Resource Discovery§

Profile identifier: ard/0.91. The normative content of this profile is section 7. In the terms of the profile contract: sourceProtocol is ard; sourceRefs preserves the entry identifier, the registry source and the search score; the profile creates Capability Descriptors (from entries the publisher controls) and Observation Records (for searches and verification outcomes); the actor is the searching agent and the subject is the entry's agtp:did; discovery events are observations and never signals; entries are public by construction and carry no private payloads; and AGTP identifiers travel in the entry under the agtp prefix.

12.5. Open Knowledge Format§

Profile identifier: okf/0.2. The normative content of this profile is section 8. In the terms of the profile contract: sourceProtocol is okf and sourceVersion is the bundle's okf_version; sourceRefs preserves the bundle CID, the concept path and, where applicable, the git commit; the profile creates Artifacts (bundles, concepts, receipts), Observation Records (generation, usage, reads), Capability Descriptors (attested computations) and Learning Signals (verification events, attester verdicts); actors are obtained from the DID forms of OKF actor identifiers; the interaction identifier for an attestation is derived from the computation's CID and parameters; verification events and attester verdicts are the issuance points; bodies MAY be private with concept CIDs still bound in provenance; and AGTP identifiers travel in the agtp frontmatter mapping.

12.6. Model-Runtime APIs (OpenAI API Conventions)§

Profile identifier: openai-api/1. This profile covers the request and response conventions popularised by the OpenAI API [OPENAI-API]—messages with roles, tool and function schemas in JSON Schema, tool-call identifiers, response identifiers, a free-form metadata map and usage accounting—as implemented by many model providers and gateways. It does not depend on any one provider.

Model-runtime API to AGTP mapping
API conceptAGTP objectRule
One request and its responseInteraction, Observation Record (ModelRunRecord)sourceRefs preserves the response identifier and, where present, the previous-response identifier that chains a conversation. The interaction identifier is taken from metadata.agtp_interaction when the caller set it.
Model identifier and runtime parametersArtifact (role config)The request with credentials and payload removed is content-addressed so that provenance records what model and settings produced the output.
Tool and function schemasCapability, Capability Descriptor (api-tool)Normalised as for MCP, with schemaHash over the schema as sent. A tool backed by MCP or A2A reuses that profile's capability identifier rather than creating a second one.
Tool calls and their outputsObservation Records, ArtifactsEach call identifier is preserved; outputs are content-addressed. Hosted tools, including provider-hosted MCP connectors, are mapped through the MCP profile where the provider exposes the underlying call.
Generated outputsArtifacts (role output)Stored raw, redacted or as CID only, according to Space policy.
Usage, latency, costObservation claimsObservations, never signals.
Human or evaluator judgment of an outputLearning SignalIssued with a Space, dimensions and provenance binding the output artifact.

The API endpoint is not an AGTP identity; the calling agent, service or gateway is, and it holds the DID. Where several agents share one gateway, the gateway MUST preserve the delegated actor in sourceRefs or a Delegation credential. Callers SHOULD set metadata.agtp_space, metadata.agtp_interaction and, where the provider echoes metadata, read them back to confirm correlation. Provider-computed evaluation results, where a provider offers them, are observations until a Space evaluator adopts them as the basis of a signal.

12.7. Agent2Agent Protocol§

Profile identifier: a2a/1.0, corresponding to A2A 1.0 [A2A]; earlier revisions are identified by their own version. A2A provides task lifecycle, messaging, artifact exchange and capability discovery between agents. The correct integration is not to collapse A2A into AGTP but to make A2A interactions emit AGTP objects.

A2A to AGTP mapping
A2A conceptAGTP objectRule
Agent CardAgent, Capability DescriptorsEach skill becomes a capability of interfaceType a2a-skill; interface carries the card URL, the skill identifier and schemaHash over the skill's entry. The card SHOULD declare the AGTP extension with params did, feedbackService and spaces; where the card is signed, the signature SHOULD verify against a key in that DID's Document.
TaskInteractionThe task identifier MUST be preserved in sourceRefs.taskId and the context identifier in sourceRefs.contextId; the interaction identifier is derived from the task identifier per §3.3 unless metadata["agtp:interaction"] was supplied.
Task status and message eventsObservation Records (A2ATaskEventRecord)Event ordering MUST be preserved; each record carries the task state.
Message and Artifact partsArtifactsContent-addressed with roles input and output; A2A's own artifact identifiers are preserved in sourceRefs.artifactId.
Protocol acknowledgements and resultsObservation RecordsAn A2A response MUST NOT be treated as an AGTP receipt; receipts come only from feedback services.
Evaluation of a task outcomeLearning SignalIssued at declared points: post-completion verification, peer review, tournament outcome, human judgment.

Task completion, cancellation, failure or rejection is an execution fact recorded as an observation, not a signal. Long-running tasks MAY be divided into several interactions provided each preserves the task identifier and lineage to the task's artifacts. An A2A agent that lacks a DID is represented by a gateway identity, and the mapping between its card URL and the DID SHOULD be published as a Capability Descriptor or in the DID Document's alsoKnownAs.

12.8. A2UI§

Profile identifiers: a2ui/0.8 (production baseline) and a2ui/0.9 (draft) [A2UI]. A2UI is the human-facing surface where much of the highest-value feedback originates. This profile makes UI interactions and human judgments portable without defining UI semantics.

  • A UI session or context is an Interaction, bound to the same interaction identifier as the A2A, MCP or model-API activity it presents wherever that identifier is available.
  • UI events are Observation Records (UIEventRecord) with event identifiers, order and timestamps preserved in sourceRefs; rendered snapshots, prompts and outputs are Artifacts at the privacy class Space policy assigns.
  • Only evaluative judgments—ratings, preferences, corrections, approvals and rejections, rubric scores—become Learning Signals. Telemetry (clicks, dwell, scroll) never does. Human-issued signals SHOULD carry issuerRelation and MAY carry confidence; the issuer is the human's DID or a gateway identity with a Delegation credential.
  • Evidence gathered in the interface—screenshots, annotations, correction diffs—becomes Artifacts referenced from provenance. For sensitive interfaces implementations SHOULD distil ephemeral UI observations into a persistent summary signal with a commitment.
  • Mappings MUST be version-tagged; v0.8 and v0.9 fields MUST NOT be mixed in one record without a translation layer.

12.9. AGENTS.md and Agent Skills§

Profile identifier: agents-skills/1. AGENTS.md [AGENTS-MD] expresses repository or workspace policy for coding agents in free-form Markdown, with nearest-file precedence. Agent Skills [AGENT-SKILLS] package a capability as a directory with a SKILL.md whose YAML frontmatter carries name, description and optional license, compatibility, metadata and allowed-tools. Together they are the intent layer: what an agent may do and what it says it can do.

  • An AGENTS.md file in force during an interaction is an Artifact (role policy) referenced from the observation record's policyRefs. Which file applied, under nearest-file precedence, is recorded, not inferred. An AGENTS.md MAY be exchanged across organisational boundaries as a PolicyAssertion credential binding its CID.
  • A skill is a Capability with interfaceType agent-skill. The descriptor's name and description come from the frontmatter; constraints carries allowed-tools, compatibility and license; sourceArtifacts carries the CID of SKILL.md and of the skill directory; contentHash changes whenever either changes.
  • Skill authors MAY place agtp-owner (a DID), agtp-capability (the capability URI or ARD identifier) and agtp-space in the frontmatter metadata map, whose values are strings as Agent Skills requires.
  • Policy and capability MUST NOT be flattened into one another: an AGENTS.md constraint is a policyRef, not a capability, and instruction text in a SKILL.md body is execution guidance, not a declaration.
  • Signals about a skill are issued against its capability URI, and observation records reference the descriptor contentHash used at execution time, so that a Space can compare declared constraints with observed behaviour version by version.

OKF attested computations reference skills through executor.resource; when they do, the skill's capability identifier and the computation's capability identifier SHOULD be linked through sourceArtifacts so that signals on either inform the other.

12.10. ERC-8004 Trustless Agents§

Profile identifier: erc8004/1. ERC-8004 [ERC-8004] defines three on-chain registries: an identity registry that mints an agent identifier bound to an off-chain registration file, a reputation registry that records feedback entries pointing at off-chain feedback files, and a validation registry that records validation requests and responses by hash. This profile lets AGTP use those registries for discovery and anchoring while keeping signals, manifests and traces off-chain, portable and chain-neutral.

ERC-8004 to AGTP mapping
ERC-8004 conceptAGTP objectRule
Identity registry entry and registration fileAgent discovery pointerThe registration file's services array MUST include an entry named DID carrying the agent's DID and SHOULD include an entry named AGTP whose endpoint is the feedback service URL and whose version is the AGTP version. The DID Document SHOULD reference the registration in alsoKnownAs using the file's agentRegistry form. Signing keys and the agent wallet MAY coincide through did:pkh.
Reputation registry feedback entryPointer to a Learning SignalThe entry's feedback URI MUST locate a persistent Learning Signal and its feedback hash MUST be the SHA-256 digest of the signal's canonical N-Quads—the digest inside signalHash—so that the on-chain hash and the AGTP hash agree. The entry's value and decimals encode the signal's first dimension value; its first tag is the dimension identifier and its second the Space DID; its endpoint is the capability's interface locator.
Off-chain feedback fileEnvelope for a signalThe file MAY embed the signal or its URL under an agtp object together with signalHash; the ERC's own members are left as the ERC defines them.
Feedback revocationStatusRevoking on-chain feedback SHOULD be mirrored by revoking the signal's status, and vice versa.
Response appended to feedbackArtifactThe subject's response file is an artifact referenced from the signal's subject-side records; it is not itself a signal.
Validation requestProvenanceThe request URI SHOULD locate an observation record or artifact bundle whose provenance URI names the interaction; the request hash is the digest of that document.
Validation responseLearning Signal and Anchor CommitmentThe validator issues a Learning Signal whose provenance equals the request's, publishes it at the response URI with the response hash as its digest, and MAY describe the on-chain record as an Anchor Commitment with chain, reference.contract, reference.transaction and reference.requestHash.
On-chain summaries and scoresPolicy outputsNot AGTP trust semantics. A consumer that reads a registry summary MUST be able to trace it to the underlying signals.

The recommended resolution order is: registry entry, then DID and services, then manifests, descriptors and signals off-chain, then proofs and status, then optionally the anchor. AGTP verification is authoritative at every step; the chain adds discovery and audit, and never replaces DID resolution or proof verification. Raw traces and private evidence MUST NOT be required on-chain for conformance.

13. Versioning, Extensibility and Governance§

13.1. Version Semantics§

AGTP uses semantic versioning. This document specifies AGTP 2.1.0. A PATCH increment corrects text without changing conformance; a MINOR increment adds optional properties, resources, profiles or conformance classes without breaking existing conformant implementations; a MAJOR increment may change wire semantics. The version an implementation supports is advertised as agtpVersion in its capabilities document, and profiles are negotiated by their registered identifiers. An implementation that receives an object from a later MINOR version MUST process the properties it understands and ignore the rest.

13.2. Migration from AGTP v2§

The following changes are compatibility-managed. Consumers MUST accept both forms for an overlap window of at least twelve months after this specification becomes a Consortium Recommendation; producers SHOULD emit the 2.1 form and MAY dual-serve manifests.

Compatibility-managed changes from v2
AspectAGTP v2AGTP 2.1
Base credential contexthttps://www.w3.org/2018/credentials/v1https://www.w3.org/ns/credentials/v2
AGTP contexthttps://schema.agtp.org/context/v1https://schema.agtp.org/context/v2 (v1 remains served)
Issuance timeissuanceDatevalidFrom
Manifest validitycredentialSubject.validFrom / validUntilcredential-level validFrom / validUntil; MAY be mirrored in the subject
ProofEd25519Signature2020 over URDNA2015DataIntegrityProof with eddsa-rdfc-2022
StatusStatusList2021EntryBitstringStatusListEntry or AGTPSpaceStatus
Media typeapplication/vc+jsonapplication/vc
Capabilities keyssignatureSuitescryptosuites (legacy key MAY be present)
HTTP profile identifierhttp/1.0http/1.1 (superset)
Hashing identifierURDNA2015+multihashrdfc-1.0+sha2-256 (same computation)

13.3. Extensibility§

The extension mechanisms are those of section 4.4: new terms in separate namespaces, new dimensions declared by Spaces, and new entries in the registries of Appendix F. Transport profiles, cryptosuites and binding profiles MAY be standardised separately without changing the core invariants, and a profile MAY advance on its own version track.

13.4. Change Process§

The protocol is mechanism only; policy stays in Spaces. The AGTP Consortium convenes editors, maintains the registries and publishes the specification. It has no binding authority over any Space, registry or implementation, and this specification creates none. Changes proceed as follows: a written proposal with rationale; a reference implementation; conformance tests added to Appendix D; and release. A MINOR increment requires two independent implementations of each new normative feature. A MAJOR increment requires a deprecation schedule, migration tooling and an overlap window during which manifests are dual-served and clients negotiate through the capabilities resource. Non-goals remain as in v2: no global governance mandate, no council with binding authority, no privileged registry.

13.5. Space-Controlled Parameters§

This section is non-normative. Examples of what a Space controls without any protocol change: the aggregation window, minimum raters and issuer caps; issuer-relation weights; eligibility gates such as uptime or acceptance rates; deposits and refundable stakes against spam; dispute windows and the meaning of pending; dimension registries and extension namespaces; the privacy class of traces; which ARD registries it recognises; which knowledge bundles it pins; and whether it anchors, where, and how often.

14. Security Considerations§

This section is non-normative.

AGTP's security stance is verification, not belief. The protocol gives every party the means to check identity, proof, status and provenance; it does not ask anyone to trust a registry, a score or a counterparty. This section describes the threats the design anticipates, the hooks the protocol provides against each and the policy levers Spaces are expected to use. Requirements cited here are normative where they appear in earlier sections.

14.1. Threat Model§

Threats, protocol hooks and policy levers
ThreatAttacker goalProtocol hooksPolicy leversResidual risk
SybilInflate influence with many cheap identitiesDID requirement; signalHash deduplication; status and revocation; signed manifests; issuerRelationAdmission, deposits, issuer-diversity thresholds, minRaters, maxWeightPerIssuerCollusion across organisations when attribution is weak
Collusion and rating ringsReciprocal boosting; down-rating rivalsProvenance grammar; receipts; distinct-issuer counts published with aggregatesWindowed aggregation, diversity constraints, anomaly detection, auditsRings that mimic organic patterns
Reward hackingOptimise the metric, not the taskissuerRelation; dimension semantics with range and direction; reproducible provenance; deterministic attestersAdversarial test injection, tournament cross-checks, evaluator reputation, holdout rotationMetric drift as tasks evolve
Provenance spoofingClaim results not achievedContent addressing; canonical hashing; anchoringMandatory re-execution for top-ranked subjects; dispute windowsPrivate artifacts limit public re-runs
Replay and duplicatesInflate weight by resubmissionNonces; idempotency keys; signalHash deduplicationSliding windows; per-issuer rate limitsRaces during partitions
Catalog spoofingImpersonate a provider in discoveryMutual DID–domain binding; attestation verification; agtp:verified only from registries that checkedPreferred registries per Space; refusal to deliver to unverified endpointsCompromised domains or DID hosting
Registry poisoning and rank gamingMake bad resources look chosenRelevance score decoupled from trust; aggregates cite Space, count, window and manifestHashRecomputation from the signal index; federation source trackingRegistries that ignore the rule
Knowledge poisoningCorrupt what agents believeBundle and concept CIDs; signals on concepts; attested computations; bodies treated as dataHuman-reviewed tiers required for critical concepts; staleness enforcementSubtle errors that pass attesters
Tool description injectionSteer agents through tool metadataHash-bound descriptors; descriptions treated as data; signals on capabilitiesDimensions for injection; allow-lists per SpaceNovel injection forms
Eclipse and partitionsIsolate victims; fork viewsManifest caching with ETag and validUntil; timestamped receipts; degraded-mode signalling; anchoringGrace windows; quorum re-confirmation for critical scoresShort-lived inconsistencies while healing
Key compromiseIssue signals as another partyVerification-relationship checks; DID method history; status revocationEmergency invalidation through the Space status resourceSignals issued before detection
Governance captureControl semantics or manifestsSigned, versioned manifests; version pinning; multiple registries; client choiceMirrors; deprecation windowsSoft capture through popularity

14.2. Identity and Authentication§

Every claim's authority derives from a DID. Verifiers should resolve DIDs afresh rather than from stale caches when a proof fails, should honour method-level deactivation, and should not accept a proof whose verification method is not listed under assertionMethod however plausible the key. Feedback services authenticate senders separately from verifying issuers; conflating the two invites an attacker who controls a transport credential to inject signals signed by no one.

14.3. Discovery§

Discovery is the point at which an agent decides whom to talk to, and therefore where an attacker most wants to stand. The mutual-binding rule of section 7.2 means that an entry is only as trustworthy as the weaker of DNS control and DID control, and deployments should treat both as security-critical. Consumers should never deliver signals to an endpoint learned solely from an unverified entry, should prefer registries a Space names, and should treat any ranking that a registry cannot justify from a signal index as advertising.

14.4. Knowledge and Tools§

Knowledge documents and tool descriptions are the two channels through which text reaches an agent's reasoning from outside its trust boundary. AGTP's rule that both are data, never protocol operations, must be enforced in implementations, not merely in policy; and Spaces that care about it should score for it, so that a description or a concept that attempts injection accumulates a record. Content addressing ensures that an injected change is at least a visible change: a descriptor's contentHash and a concept's CID move when the text moves.

14.5. Reproducibility and Anchoring§

Reproducibility is the strongest defence the protocol offers, and it is only as strong as artifact availability. Spaces should require public or escrowed artifacts for signals that feed high-stakes aggregates, should re-execute a sample, and should treat signals whose artifacts have become unavailable as weaker evidence over time. Anchoring adds timestamping and censorship resistance, not truth: an anchored lie is a lie with a date. Anchor commitments therefore carry only hashes, and consumers verify the underlying objects as they would without the anchor.

15. Privacy Considerations§

This section is non-normative.

AGTP is designed so that private learning and public coordination can coexist. The mechanisms are the ephemeral and persistent classes, distillation with commitments, redaction with attestations and content addressing that lets a party prove what it evaluated without publishing it. This section describes the privacy risks that remain and the practices that mitigate them.

15.1. Ephemeral and Persistent Signals§

Ephemeral signals are for local learning and carry retention ceilings set by the Space. They are never indexed and need not leave the parties to an interaction. Persistent signals are public by intent: they are discoverable, aggregated and possibly anchored. The decision to distil ephemeral signals into a persistent one is the point at which private detail becomes public summary, and the commitment carried by the summary is what allows an auditor to be shown the detail selectively later. Implementations should default to ephemeral and require an explicit act to persist.

15.2. Data Minimisation§

A signal needs a subject, a Space, dimensions, values and provenance. It does not need a narrative. The comment property, observation claims and sourceRefs are the places where personal data is most likely to leak, and producers should keep them minimal, should not copy prompts or user text into them, and should let Space policy decide whether traces are raw, redacted or committed-only. OKF sources entries and resource URIs can expose internal system names and usage patterns; publishers should redact internal locators from public bundles and treat usage counts as quasi-identifiers.

15.3. Correlation§

A DID that issues signals across many Spaces is a correlation handle. Human evaluators and small organisations should consider pairwise or per-Space DIDs, and Spaces should accept did:key issuers with a delegation credential where accountability requires it. Aggregators should publish distinct-issuer counts, not issuer lists, and should apply minRaters so that an aggregate never reveals a single evaluator's judgment. Registries index public entries only and should not accumulate query logs that reveal which agent sought which capability.

15.4. Human Participants§

Signals issued through interfaces are judgments by people. Gateways that issue them on a person's behalf should hold a delegation the person granted and should not attribute more precision to a judgment than the interface captured. Herd privacy is served when the interface batches judgments into a distilled signal rather than emitting one per click.

15.5. Anchoring and Erasure§

Ledgers do not forget. Anchor commitments therefore contain hashes and counts only, and an anchored signal that is later revoked remains revoked in AGTP even though its hash remains on the ledger. Publishers should not anchor ephemeral signals, and should be aware that a hash of a small, guessable document is not a strong commitment to its secrecy.

15.6. Aggregate Disclosure§

Published aggregates can reveal individual signals when few issuers contribute. Beyond minRaters, Spaces may add noise to public leaderboards, apply k-anonymity thresholds to subgroup breakdowns and use privacy-preserving aggregation as it matures (Appendix H). These are aggregation parameters, not protocol changes.

A. Examples§

This section is non-normative.

The examples in this appendix complete the ones given inline. Proof values and hashes are illustrative; comments inside JSON are not valid JSON and are shown only to explain the fields.

A.1. A Capability Descriptor Derived from an MCP Tool§

Example 11: Capability Descriptor for an MCP tool
{
  "@context": [
    "https://www.w3.org/ns/credentials/v2",
    "https://schema.agtp.org/context/v2"
  ],
  "id": "https://solver.example/agtp/capabilities/run-sql.vc.json",
  "type": ["VerifiableCredential", "CapabilityDescriptor"],
  "issuer": "did:web:solver.example",
  "validFrom": "2026-08-30T00:00:00Z",
  "credentialSubject": {
    "id": "urn:air:solver.example:tool:run-sql",
    "owner": "did:web:solver.example",
    "name": "run_sql",
    "description": "Run read-only SQL against the sales warehouse.",
    "interfaceType": "mcp-tool",
    "interface": {
      "protocol": "mcp",
      "version": "2025-11-25",
      "server": "https://mcp.solver.example/",
      "tool": "run_sql",
      "schemaHash": "uEiBqk0f2Yc0wq9GJk4oQx1u3v8Zr2tTz7nQmC5aXbYdEfg"
    },
    "inputSchema": {
      "type": "object",
      "properties": { "sql": { "type": "string" } },
      "required": ["sql"]
    },
    "constraints": {
      "readOnlyHint": true,
      "destructiveHint": false,
      "idempotentHint": true,
      "openWorldHint": false,
      "policyRefs": ["bafkreicagentsmdpolicyfilecidxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]
    },
    "sourceArtifacts": [
      { "role": "schema", "cid": "bafkreib5x2s3q6l7ihd4qq7mmm2a2m3iuqhz7vqz3zjzq6p3ep4gk7v4wy",
        "uri": "https://mcp.solver.example/.well-known/mcp-server-card.json" }
    ],
    "version": "1.4.0",
    "contentHash": "uEiDm2Vt6pQ0x4r1yTk8nJ3wLd9cFh5sGb7vXa2eZq1oPmA",
    "discovery": { "ard": "urn:air:solver.example:tool:run-sql" },
    "spaces": ["did:web:rlvr.example"]
  },
  "proof": { "type": "DataIntegrityProof", "cryptosuite": "eddsa-rdfc-2022",
             "created": "2026-08-30T00:00:01Z",
             "verificationMethod": "did:web:solver.example#key-1",
             "proofPurpose": "assertionMethod", "proofValue": "z4Qm…" }
}

A.2. An Observation Record for an MCP Tool Call§

Example 12: MCPToolCallRecord
{
  "@context": ["https://schema.agtp.org/context/v2"],
  "type": ["ObservationRecord", "MCPToolCallRecord"],
  "id": "urn:uuid:c1a2b3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "space": "did:web:rlvr.example",
  "actor": "did:web:orchestrator.example",
  "subject": "urn:air:solver.example:tool:run-sql",
  "sourceProtocol": "mcp",
  "sourceVersion": "2025-11-25",
  "sourceRefs": { "server": "did:web:solver.example", "requestId": 7, "toolName": "run_sql" },
  "interaction": "urn:uuid:6d2a4c8e-9b1f-4e3d-8a7c-5f6e7d8c9b0a",
  "capabilityRefs": [
    { "id": "urn:air:solver.example:tool:run-sql",
      "contentHash": "uEiDm2Vt6pQ0x4r1yTk8nJ3wLd9cFh5sGb7vXa2eZq1oPmA" }
  ],
  "artifacts": [
    { "role": "input",  "cid": "bafkreib5x2s3q6l7ihd4qq7mmm2a2m3iuqhz7vqz3zjzq6p3ep4gk7v4wy" },
    { "role": "output", "cid": "bafkreiaw3fsg7cn5e6tjyd5zvo2ujqcrrxi3rlhqaw5j6ozx7fqyq2wtia" }
  ],
  "provenance": "agtp://provenance?space=did:web:rlvr.example&interaction=urn:uuid:6d2a4c8e-9b1f-4e3d-8a7c-5f6e7d8c9b0a&artifact=bafkreiaw3fsg7cn5e6tjyd5zvo2ujqcrrxi3rlhqaw5j6ozx7fqyq2wtia,bafkreib5x2s3q6l7ihd4qq7mmm2a2m3iuqhz7vqz3zjzq6p3ep4gk7v4wy",
  "observedAt": "2026-09-03T13:58:40Z",
  "privacyClass": "redacted",
  "claims": { "isError": false, "durationMs": 4180 }
}

A.3. A Signed Interaction Receipt§

Example 13: InteractionReceipt issued by a Space
{
  "@context": ["https://www.w3.org/ns/credentials/v2", "https://schema.agtp.org/context/v2"],
  "id": "urn:uuid:7e8f9a0b-1c2d-4e3f-8a9b-0c1d2e3f4a5b",
  "type": ["VerifiableCredential", "InteractionReceipt"],
  "issuer": "did:web:rlvr.example",
  "validFrom": "2026-09-03T14:02:15Z",
  "credentialSubject": {
    "receiptId": "urn:uuid:7e8f9a0b-1c2d-4e3f-8a9b-0c1d2e3f4a5b",
    "signalId": "urn:uuid:0c9d7b5e-1f2a-4d3c-8e6f-7a5b4c3d2e1f",
    "signalHash": "uEiA4k3bQm1vZ2x0c3Q5Y2t4dGVzdGRhdGFhYWFhYWFhYWFhYWE",
    "acceptState": "accepted",
    "receivedAt": "2026-09-03T14:02:14Z",
    "receiver": "did:web:rlvr.example",
    "space": "did:web:rlvr.example",
    "nonce": "K3z9Qm2vX7bR4tYw8nLp1sHd",
    "idempotencyKey": "9b2c6f1e-3d4a-4b5c-8d7e-6f5a4b3c2d1e"
  },
  "proof": { "type": "DataIntegrityProof", "cryptosuite": "eddsa-rdfc-2022",
             "created": "2026-09-03T14:02:15Z",
             "verificationMethod": "did:web:rlvr.example#key-1",
             "proofPurpose": "assertionMethod", "proofValue": "z2Kd…" }
}

A.4. An Anchor Commitment Referencing an ERC-8004 Validation§

Example 14: AnchorCommitment
{
  "@context": ["https://www.w3.org/ns/credentials/v2", "https://schema.agtp.org/context/v2"],
  "id": "urn:uuid:3f4a5b6c-7d8e-4f9a-8b0c-1d2e3f4a5b6c",
  "type": ["VerifiableCredential", "AnchorCommitment"],
  "issuer": "did:pkh:eip155:1:0x8ba1f109551bD432803012645Ac136ddd64DBA72",
  "validFrom": "2026-09-03T18:00:00Z",
  "credentialSubject": {
    "id": "urn:uuid:3f4a5b6c-7d8e-4f9a-8b0c-1d2e3f4a5b6c",
    "space": "did:web:rlvr.example",
    "tree": "rfc6962",
    "hashAlgorithm": "sha2-256",
    "root": "uEiC9Ppq4uX1yZk2Mn3Ob4Rc5Sd6Te7Uf8Vg9Wh0Xi1Yj2Zk",
    "count": 128,
    "covered": { "uri": "https://rlvr.example/agtp/batches/2026-09-03T18.json",
                 "cid": "bafkreigbatchmanifestcidxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" },
    "chain": "eip155:1",
    "reference": {
      "registry": "erc8004:validation",
      "contract": "eip155:1:0x1234567890abcdef1234567890abcdef12345678",
      "transaction": "0x9c0f…",
      "requestHash": "0x5e1a…"
    },
    "anchoredAt": "2026-09-03T17:58:36Z"
  },
  "proof": { "type": "DataIntegrityProof", "cryptosuite": "eddsa-rdfc-2022",
             "created": "2026-09-03T18:00:01Z",
             "verificationMethod": "did:pkh:eip155:1:0x8ba1f109551bD432803012645Ac136ddd64DBA72#blockchainAccountId",
             "proofPurpose": "assertionMethod", "proofValue": "z3Wf…" }
}

An Anchor Commitment issued by a did:pkh identity would in practice use a cryptosuite for the wallet's key type; the Ed25519 baseline is shown for uniformity.

A.5. An ERC-8004 Feedback File Carrying a Signal§

Example 15: Off-chain feedback file with an agtp object
{
  "agentRegistry": "eip155:1:0x1234567890abcdef1234567890abcdef12345678",
  "agentId": 22,
  "clientAddress": "eip155:1:0x8ba1f109551bD432803012645Ac136ddd64DBA72",
  "createdAt": "2026-09-03T14:02:11Z",
  "value": 90,
  "valueDecimals": 2,
  "tag1": "accuracy",
  "tag2": "did:web:rlvr.example",
  "endpoint": "https://mcp.solver.example/",
  "mcp": { "tool": "run_sql" },
  "agtp": {
    "signal": "https://rlvr.example/.well-known/agtp/signals/uEiA4k3bQm1vZ2x0c3Q5Y2t4dGVzdGRhdGFhYWFhYWFhYWFhYWE",
    "signalHash": "uEiA4k3bQm1vZ2x0c3Q5Y2t4dGVzdGRhdGFhYWFhYWFhYWFhYWE",
    "space": "did:web:rlvr.example",
    "provenance": "agtp://provenance?space=did:web:rlvr.example&interaction=urn:uuid:6d2a…&artifact=bafybeia…,bafybeib…"
  }
}

The on-chain feedback hash for this entry is the raw SHA-256 digest carried inside signalHash, so that a reader of the registry and a reader of the signal compute the same bytes.

A.6. A Distilled Persistent Signal with a Commitment§

Example 16: Persistent summary of ephemeral reasoning checks
{
  "@context": ["https://www.w3.org/ns/credentials/v2", "https://schema.agtp.org/context/v2"],
  "id": "urn:uuid:a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5e",
  "type": ["VerifiableCredential", "LearningSignal"],
  "issuer": "did:web:lab.example",
  "validFrom": "2026-09-03T23:00:00Z",
  "credentialSubject": {
    "id": "did:web:solver.example",
    "subject": "did:web:solver.example",
    "space": "did:web:microcheck.example",
    "dimensions": ["consistency", "grounding"],
    "value": [0.87, 0.79],
    "persistence": "persistent",
    "provenance": "agtp://provenance?space=did:web:microcheck.example&interaction=urn:uuid:d4e5f6a7-b8c9-4d0e-8f1a-2b3c4d5e6f7a&artifact=bafybeiredactedtracecidxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "issuerRelation": "affiliate",
    "commitment": "uEiBcommitmentrootoverephemeralsignalsxxxxxxxxxxxxxxxxxxxx",
    "comment": "Distilled from 1,204 ephemeral step checks over P7D."
  },
  "credentialStatus": { "id": "https://lab.example/status/1#77", "type": "BitstringStatusListEntry",
                        "statusPurpose": "revocation", "statusListIndex": "77",
                        "statusListCredential": "https://lab.example/status/1" },
  "proof": { "type": "DataIntegrityProof", "cryptosuite": "eddsa-rdfc-2022",
             "created": "2026-09-03T23:00:01Z",
             "verificationMethod": "did:web:lab.example#key-2",
             "proofPurpose": "assertionMethod", "proofValue": "z6Nq…" }
}

A.7. An A2A Agent Card Declaring the AGTP Extension§

Example 17: Agent Card extension declaration (excerpt)
{
  "name": "Solver",
  "description": "Solves quantitative questions against warehouse data.",
  "url": "https://solver.example/a2a",
  "version": "2.4.0",
  "capabilities": {
    "streaming": true,
    "extensions": [
      {
        "uri": "https://schema.agtp.org/a2a/ext/v1",
        "description": "AGTP identity, feedback service and evaluation Spaces",
        "required": false,
        "params": {
          "did": "did:web:solver.example",
          "feedbackService": "https://solver.example/.well-known/agtp/feedback",
          "spaces": ["did:web:rlvr.example"]
        }
      }
    ]
  },
  "skills": [
    { "id": "run-sql", "name": "Run SQL", "description": "Read-only SQL over the sales warehouse.",
      "tags": ["sql", "analytics"] }
  ]
}

Only the extension declaration is AGTP-specific; the remainder of the card is as A2A defines it, and the skill maps to the same capability identifier as the MCP tool in A.1.

A.8. A Skill with AGTP Metadata§

Example 18: SKILL.md frontmatter
---
name: run-on-bq
description: Execute a sanctioned BigQuery computation and return job_id, executed_sql and result. Use when an OKF attested computation names this skill as its executor.
license: Apache-2.0
compatibility: Requires the bq CLI and a service account with read access to the sales dataset
metadata:
  agtp-owner: did:web:solver.example
  agtp-capability: urn:air:solver.example:skill:run-on-bq
  agtp-space: did:web:rlvr.example
---

A.9. An Attested Computation and Its Signal§

Example 19: OKF attested computation (frontmatter) and the attester's signal
---
type: Attested Computation
title: Revenue for a fiscal year
description: Recognised revenue for one fiscal year, per the revenue recognition policy.
runtime: bigquery
parameters:
  - name: year
    type: integer
    required: true
executor:
  resource: /skills/run-on-bq.md
  receipt: [job_id, executed_sql, result]
attester:
  resource: /attesters/sql_equality.py
generated:
  by: process:did:web:rlvr.example
  at: 2026-08-28T10:00:00Z
status: stable
agtp:
  space: did:web:rlvr.example
---
# Computation

```sql
SELECT SUM(amount) FROM `acme.sales.orders`
WHERE EXTRACT(YEAR FROM recognised_at) = @year
```
{
  "@context": ["https://www.w3.org/ns/credentials/v2", "https://schema.agtp.org/context/v2"],
  "id": "urn:uuid:5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d",
  "type": ["VerifiableCredential", "LearningSignal"],
  "issuer": "did:web:attester.example",
  "validFrom": "2026-09-03T14:05:00Z",
  "credentialSubject": {
    "id": "did:web:solver.example",
    "subject": "did:web:solver.example",
    "space": "did:web:rlvr.example",
    "dimensions": ["attestation"],
    "value": 1.0,
    "persistence": "persistent",
    "provenance": "agtp://provenance?space=did:web:rlvr.example&interaction=urn:uuid:8e9f0a1b-2c3d-4e5f-8a6b-7c8d9e0f1a2b&artifact=bafkreiconceptfilecidxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,bafkreireceiptfieldscidxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,bafkreiparameterscidxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "issuerRelation": "independent",
    "comment": "sql_equality: executed_sql matches the sanctioned computation for year=2026; result reproduced."
  },
  "credentialStatus": { "id": "https://rlvr.example/.well-known/agtp/status?signal=uEiD…", "type": "AGTPSpaceStatus" },
  "proof": { "type": "DataIntegrityProof", "cryptosuite": "eddsa-rdfc-2022",
             "created": "2026-09-03T14:05:01Z",
             "verificationMethod": "did:web:attester.example#key-1",
             "proofPurpose": "assertionMethod", "proofValue": "z7Rs…" }
}

A.10. A Problem Details Error§

Example 20: 422 response for an out-of-range value
HTTP/1.1 422 Unprocessable Content
Content-Type: application/problem+json
Replay-Nonce: Vq8yT2mZ0kR4xL7wN1pC9sHd

{
  "type": "https://schema.agtp.org/problems/value-out-of-range",
  "title": "Value out of range",
  "status": 422,
  "detail": "Dimension 'latency' is declared with range [0, 60]; received 94.5.",
  "instance": "urn:uuid:0c9d7b5e-1f2a-4d3c-8e6f-7a5b4c3d2e1f",
  "space": "did:web:rlvr.example",
  "manifestHash": "uEiCz7m5gq4Vh2kQ2Jm7Y1Q2m3k6nJ1c2f4b7dq6l5o8q9pA"
}

B. JSON Schemas§

The schemas below are normative constraints on the JSON representation of AGTP objects, using JSON Schema 2020-12 [JSON-SCHEMA]. They deliberately permit additional properties, because AGTP objects are extensible JSON-LD; they check the presence and shape of what this specification requires. The prose of section 5 prevails where the two differ. The schemas are also published at https://schema.agtp.org/json/ under the names given in each $id.

B.1. Learning Signal§

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.agtp.org/json/learning-signal.schema.json",
  "title": "AGTP Learning Signal (2.1)",
  "type": "object",
  "required": ["@context", "type", "issuer", "credentialSubject", "credentialStatus", "proof"],
  "anyOf": [ { "required": ["validFrom"] }, { "required": ["issuanceDate"] } ],
  "properties": {
    "@context": { "type": "array", "minItems": 2,
      "contains": { "const": "https://schema.agtp.org/context/v2" } },
    "id": { "type": "string", "format": "uri" },
    "type": { "type": "array",
      "allOf": [ { "contains": { "const": "VerifiableCredential" } },
                 { "contains": { "enum": ["LearningSignal", "LearningSignalCredential"] } } ] },
    "issuer": { "oneOf": [ { "type": "string", "pattern": "^did:" },
                           { "type": "object", "required": ["id"],
                             "properties": { "id": { "type": "string", "pattern": "^did:" } } } ] },
    "validFrom": { "type": "string", "format": "date-time" },
    "validUntil": { "type": "string", "format": "date-time" },
    "credentialSubject": {
      "type": "object",
      "required": ["subject", "space", "dimensions", "value", "persistence", "provenance"],
      "properties": {
        "id": { "type": "string", "format": "uri" },
        "subject": { "type": "string", "format": "uri" },
        "space": { "type": "string", "pattern": "^did:" },
        "dimensions": { "type": "array", "minItems": 1,
          "items": { "type": "string", "pattern": "^[A-Za-z0-9_.-]+$" } },
        "value": { "oneOf": [ { "type": "number" },
                              { "type": "array", "minItems": 1, "items": { "type": "number" } } ] },
        "persistence": { "enum": ["ephemeral", "persistent"] },
        "provenance": { "type": "string", "pattern": "^agtp://provenance\\?.*space=.*&?.*interaction=" },
        "issuerRelation": { "enum": ["self", "affiliate", "independent"] },
        "commitment": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" },
        "confidence": { "type": "number", "minimum": 0, "maximum": 1 },
        "comment": { "type": "string", "maxLength": 1024 },
        "observedAt": { "type": "string", "format": "date-time" },
        "manifestHash": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" }
      },
      "additionalProperties": true
    },
    "credentialStatus": {
      "type": "object", "required": ["id", "type"],
      "properties": { "type": { "enum": ["BitstringStatusListEntry", "AGTPSpaceStatus", "StatusList2021Entry"] } }
    },
    "credentialSchema": { "type": "object" },
    "proof": { "oneOf": [ { "type": "object" }, { "type": "array", "items": { "type": "object" } } ] }
  },
  "additionalProperties": true
}

B.2. Space Manifest§

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.agtp.org/json/space-manifest.schema.json",
  "title": "AGTP Space Manifest (2.1)",
  "type": "object",
  "required": ["@context", "type", "issuer", "credentialSubject", "credentialStatus", "proof"],
  "properties": {
    "@context": { "type": "array", "minItems": 2 },
    "id": { "type": "string", "format": "uri" },
    "type": { "type": "array", "contains": { "enum": ["SpaceManifest", "SpaceManifestCredential"] } },
    "issuer": { "type": "string", "pattern": "^did:" },
    "validFrom": { "type": "string", "format": "date-time" },
    "validUntil": { "type": "string", "format": "date-time" },
    "credentialSubject": {
      "type": "object",
      "required": ["id", "version", "manifestHash", "dimensions"],
      "properties": {
        "id": { "type": "string", "pattern": "^did:" },
        "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+" },
        "manifestHash": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" },
        "dimensions": { "type": "array", "minItems": 1,
          "items": { "type": "object", "required": ["id", "range", "higherIsBetter"],
            "properties": {
              "id": { "type": "string", "pattern": "^[A-Za-z0-9_.-]+$" },
              "range": { "type": "array", "minItems": 2, "maxItems": 2, "items": { "type": "number" } },
              "higherIsBetter": { "type": "boolean" },
              "unit": { "type": "string" },
              "ref": { "type": "string", "format": "uri" } } } },
        "dimensionRefs": { "type": "array", "items": { "type": "string", "format": "uri" } },
        "aggregation": { "oneOf": [
          { "$ref": "#/$defs/aggregation" },
          { "type": "array", "items": { "$ref": "#/$defs/aggregation" } } ] },
        "persistence_policy": { "type": "object" },
        "status": { "type": "string", "format": "uri" },
        "revocation": { "type": "string", "format": "uri" },
        "capabilities": { "type": "object" },
        "knowledge": { "type": "array", "items": { "type": "object", "required": ["resource", "cid"],
          "properties": { "resource": { "type": "string", "format": "uri" }, "cid": { "type": "string" },
                          "okf_version": { "type": "string" },
                          "role": { "enum": ["dimensions", "policy", "documentation", "corpus"] } } } },
        "discovery": { "type": "object", "properties": {
          "ard": { "type": "string", "pattern": "^urn:air:" },
          "registries": { "type": "array", "items": { "type": "string", "format": "uri" } } } },
        "admission": { "type": "object" }
      },
      "additionalProperties": true
    },
    "credentialStatus": { "type": "object", "required": ["id", "type"] },
    "proof": { "type": "object" }
  },
  "$defs": {
    "aggregation": { "type": "object", "required": ["name"],
      "properties": { "name": { "type": "string" }, "parameters": { "type": "object" },
                      "impl": { "type": "string", "format": "uri" },
                      "dimensions": { "type": "array", "items": { "type": "string" } } } }
  },
  "additionalProperties": true
}

B.3. Receipt§

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.agtp.org/json/receipt.schema.json",
  "title": "AGTP Receipt (2.1)",
  "type": "object",
  "required": ["receiptId", "signalHash", "acceptState", "receivedAt"],
  "properties": {
    "receiptId": { "type": "string", "format": "uri" },
    "signalId": { "type": "string", "format": "uri" },
    "signalHash": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" },
    "acceptState": { "enum": ["accepted", "rejected", "pending"] },
    "reason": { "type": "string" },
    "receivedAt": { "type": "string", "format": "date-time" },
    "receiver": { "type": "string", "pattern": "^did:" },
    "space": { "type": "string", "pattern": "^did:" },
    "nonce": { "type": "string" },
    "idempotencyKey": { "type": "string", "format": "uuid" }
  },
  "if": { "properties": { "acceptState": { "const": "rejected" } } },
  "then": { "required": ["reason"] },
  "additionalProperties": true
}

B.4. Capability Descriptor§

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.agtp.org/json/capability-descriptor.schema.json",
  "title": "AGTP Capability Descriptor (2.1)",
  "type": "object",
  "required": ["@context", "type", "issuer", "validFrom", "credentialSubject", "proof"],
  "properties": {
    "type": { "type": "array", "contains": { "enum": ["CapabilityDescriptor", "CapabilityDescriptorCredential"] } },
    "issuer": { "type": "string", "pattern": "^did:" },
    "credentialSubject": {
      "type": "object",
      "required": ["id", "owner", "name", "interfaceType", "contentHash"],
      "properties": {
        "id": { "type": "string", "format": "uri" },
        "owner": { "type": "string", "pattern": "^did:" },
        "name": { "type": "string", "maxLength": 256 },
        "description": { "type": "string" },
        "interfaceType": { "type": "string",
          "anyOf": [ { "enum": ["mcp-tool", "mcp-resource", "mcp-prompt", "a2a-skill", "api-tool",
                                "agent-skill", "okf-computation", "policy-only"] },
                     { "pattern": "^x-[a-z0-9-]+$" } ] },
        "interface": { "type": "object", "properties": {
          "protocol": { "type": "string" }, "version": { "type": "string" },
          "schemaHash": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" },
          "bindings": { "type": "array", "items": { "type": "object", "required": ["protocol"] } } } },
        "inputSchema": { "oneOf": [ { "type": "object" }, { "type": "string", "format": "uri" } ] },
        "outputSchema": { "oneOf": [ { "type": "object" }, { "type": "string", "format": "uri" } ] },
        "constraints": { "type": "object" },
        "sourceArtifacts": { "type": "array", "items": { "$ref": "#/$defs/artifactRef" } },
        "version": { "type": "string" },
        "contentHash": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" },
        "discovery": { "type": "object" },
        "spaces": { "type": "array", "items": { "type": "string", "pattern": "^did:" } }
      },
      "if": { "properties": { "interfaceType": { "const": "policy-only" } } },
      "else": { "required": ["interface"] },
      "additionalProperties": true
    },
    "proof": { "type": "object" }
  },
  "$defs": {
    "artifactRef": { "type": "object", "required": ["cid"],
      "properties": { "cid": { "type": "string" }, "uri": { "type": "string", "format": "uri" },
                      "role": { "type": "string" }, "mediaType": { "type": "string" } } }
  },
  "additionalProperties": true
}

B.5. Anchor Commitment§

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.agtp.org/json/anchor-commitment.schema.json",
  "title": "AGTP Anchor Commitment (2.1)",
  "type": "object",
  "required": ["@context", "type", "issuer", "validFrom", "credentialSubject", "proof"],
  "properties": {
    "type": { "type": "array", "contains": { "enum": ["AnchorCommitment", "AnchorCommitmentCredential"] } },
    "credentialSubject": {
      "type": "object",
      "required": ["id", "root", "tree", "hashAlgorithm", "covered", "count", "reference", "anchoredAt"],
      "properties": {
        "id": { "type": "string", "format": "uri" },
        "root": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" },
        "tree": { "type": "string" },
        "hashAlgorithm": { "type": "string" },
        "covered": { "oneOf": [
          { "type": "array", "items": { "type": "string", "pattern": "^u[A-Za-z0-9_-]+$" } },
          { "type": "object", "required": ["uri", "cid"] } ] },
        "count": { "type": "integer", "minimum": 1 },
        "space": { "type": "string", "pattern": "^did:" },
        "chain": { "type": "string", "pattern": "^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}$" },
        "reference": { "type": "object" },
        "anchoredAt": { "type": "string", "format": "date-time" }
      },
      "additionalProperties": true
    }
  },
  "additionalProperties": true
}

B.6. Observation Record§

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.agtp.org/json/observation-record.schema.json",
  "title": "AGTP Observation Record (2.1)",
  "type": "object",
  "required": ["type", "id", "space", "actor", "sourceProtocol", "sourceRefs", "interaction", "observedAt", "privacyClass"],
  "properties": {
    "type": { "type": "array", "contains": { "const": "ObservationRecord" } },
    "id": { "type": "string", "format": "uri" },
    "space": { "type": "string", "pattern": "^did:" },
    "actor": { "type": "string", "pattern": "^did:" },
    "subject": { "type": "string", "format": "uri" },
    "sourceProtocol": { "type": "string" },
    "sourceVersion": { "type": "string" },
    "sourceRefs": { "type": "object" },
    "interaction": { "type": "string", "format": "uri" },
    "artifacts": { "type": "array", "items": { "type": "object", "required": ["cid"] } },
    "provenance": { "type": "string", "pattern": "^agtp://provenance\\?" },
    "capabilityRefs": { "type": "array", "items": { "type": "object", "required": ["id", "contentHash"] } },
    "policyRefs": { "type": "array" },
    "observedAt": { "type": "string", "format": "date-time" },
    "privacyClass": { "enum": ["ephemeral", "persistent", "redacted", "committed-only"] },
    "claims": { "type": "object" },
    "proof": { "type": "object" }
  },
  "additionalProperties": true
}

B.7. DID Document Service Entries§

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schema.agtp.org/json/did-service.schema.json",
  "title": "AGTP service entries in a DID Document",
  "type": "object",
  "required": ["id", "type", "serviceEndpoint"],
  "properties": {
    "id": { "type": "string", "format": "uri" },
    "type": { "enum": ["AGTPFeedbackService", "AGTPSpaceManifest", "AGTPCapabilities",
                       "AGTPSignalIndex", "AgenticResourceDiscovery", "MCPServer", "A2AAgentCard"] },
    "serviceEndpoint": { "oneOf": [
      { "type": "string", "format": "uri", "pattern": "^https://" },
      { "type": "object", "required": ["uri"],
        "properties": { "uri": { "type": "string", "format": "uri", "pattern": "^https://" } },
        "additionalProperties": true } ] }
  },
  "additionalProperties": true
}

C. HTTP Profile OpenAPI Description§

The following OpenAPI 3.1 [OPENAPI] description is normative for the HTTP profile http/1.1; the resources marked optional are advertised by features in the capabilities document. Schema references resolve to Appendix B.

openapi: 3.1.0
info:
  title: AGTP HTTP Profile
  version: "1.1.0"
  description: Mandatory transport profile for AGTP 2.1.
servers:
  - url: https://{host}
paths:
  /.well-known/agtp/feedback:
    head:
      summary: Obtain a replay nonce
      responses:
        "200":
          description: Nonce issued
          headers:
            Replay-Nonce: { required: true, schema: { type: string } }
    post:
      summary: Deliver a Learning Signal
      parameters:
        - { in: header, name: AGTP-Nonce, required: true, schema: { type: string } }
        - { in: header, name: Idempotency-Key, required: true, schema: { type: string, format: uuid } }
        - { in: header, name: Prefer, required: false, schema: { type: string, enum: [agtp-signed-receipt] } }
      requestBody:
        required: true
        content:
          application/vc:
            schema: { $ref: "https://schema.agtp.org/json/learning-signal.schema.json" }
          application/vc+ld+json:
            schema: { $ref: "https://schema.agtp.org/json/learning-signal.schema.json" }
          application/vc+json:
            schema: { $ref: "https://schema.agtp.org/json/learning-signal.schema.json" }
      responses:
        "200":
          description: Accepted (or already accepted with the same signalHash)
          headers: { Replay-Nonce: { schema: { type: string } } }
          content:
            application/json: { schema: { $ref: "https://schema.agtp.org/json/receipt.schema.json" } }
            application/vc: { schema: { type: object, description: InteractionReceipt credential } }
        "202":
          description: Pending validation
          headers:
            Retry-After: { schema: { type: integer } }
            Replay-Nonce: { schema: { type: string } }
          content:
            application/json: { schema: { $ref: "https://schema.agtp.org/json/receipt.schema.json" } }
        "400": { $ref: "#/components/responses/Problem" }
        "401": { $ref: "#/components/responses/Problem" }
        "403": { $ref: "#/components/responses/Problem" }
        "406": { $ref: "#/components/responses/Problem" }
        "409": { $ref: "#/components/responses/Problem" }
        "413": { $ref: "#/components/responses/Problem" }
        "422": { $ref: "#/components/responses/Problem" }
        "429": { $ref: "#/components/responses/Problem" }
        "503": { $ref: "#/components/responses/Problem" }
  /.well-known/agtp/space/{spaceId}:
    get:
      summary: Fetch the Space Manifest
      parameters:
        - { in: path, name: spaceId, required: true, schema: { type: string }, description: The Space DID, percent-encoded }
        - { in: query, name: version, required: false, schema: { type: string } }
        - { in: header, name: If-None-Match, required: false, schema: { type: string } }
      responses:
        "200":
          description: Space Manifest credential
          headers:
            ETag: { required: true, schema: { type: string } }
            Cache-Control: { required: true, schema: { type: string } }
          content:
            application/vc: { schema: { $ref: "https://schema.agtp.org/json/space-manifest.schema.json" } }
        "304": { description: Not modified }
  /.well-known/agtp/status:
    get:
      summary: Status of a signal (Space status API)
      parameters:
        - { in: query, name: signal, required: false, schema: { type: string }, description: signalHash }
        - { in: query, name: id, required: false, schema: { type: string, format: uri } }
      responses:
        "200":
          description: Status record
          content:
            application/json:
              schema:
                type: object
                required: [status, updatedAt]
                properties:
                  signalHash: { type: string }
                  status: { type: string, enum: [valid, revoked, suspended, unknown] }
                  reason: { type: string, format: uri }
                  updatedAt: { type: string, format: date-time }
  /.well-known/agtp/capabilities:
    get:
      summary: Supported versions, profiles and suites
      responses:
        "200":
          description: Capabilities document
          content:
            application/json:
              schema:
                type: object
                required: [agtpVersion, did, updatedAt]
                properties:
                  agtpVersion: { type: string }
                  did: { type: string }
                  supportedProfiles: { type: array, items: { type: string } }
                  cryptosuites: { type: array, items: { type: string } }
                  signatureSuites: { type: array, items: { type: string }, deprecated: true }
                  statusFormats: { type: array, items: { type: string } }
                  hashing: { type: array, items: { type: string } }
                  features: { type: array, items: { type: string } }
                  extensions: { type: array, items: { type: string, format: uri } }
                  updatedAt: { type: string, format: date-time }
  /.well-known/agtp/signals:
    get:
      summary: List persistent signals (optional; feature signalIndex)
      parameters:
        - { in: query, name: subject, schema: { type: string, format: uri } }
        - { in: query, name: space, schema: { type: string } }
        - { in: query, name: dimension, schema: { type: string } }
        - { in: query, name: issuer, schema: { type: string } }
        - { in: query, name: since, schema: { type: string, format: date-time } }
        - { in: query, name: until, schema: { type: string, format: date-time } }
        - { in: query, name: limit, schema: { type: integer, minimum: 1, maximum: 1000 } }
        - { in: query, name: cursor, schema: { type: string } }
      responses:
        "200":
          description: Page of signals
          content:
            application/json:
              schema:
                type: object
                required: [signals]
                properties:
                  signals:
                    type: array
                    items:
                      oneOf:
                        - { $ref: "https://schema.agtp.org/json/learning-signal.schema.json" }
                        - { type: object, required: [signalHash, url],
                            properties: { signalHash: { type: string }, url: { type: string, format: uri } } }
                  next: { type: string }
  /.well-known/agtp/signals/{signalHash}:
    get:
      summary: Fetch one persistent signal (optional; feature signalIndex)
      parameters:
        - { in: path, name: signalHash, required: true, schema: { type: string } }
      responses:
        "200":
          description: The signal
          content:
            application/vc: { schema: { $ref: "https://schema.agtp.org/json/learning-signal.schema.json" } }
        "404": { $ref: "#/components/responses/Problem" }
  /.well-known/agtp/metrics:
    get:
      summary: Operational metrics feed (optional; feature metricsFeed)
      responses:
        "200":
          description: Metrics
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  required: [metric, value, window, method, lastUpdated]
                  properties:
                    metric: { type: string }
                    value: { type: number }
                    window: { type: string }
                    method: { type: string }
                    lastUpdated: { type: string, format: date-time }
components:
  responses:
    Problem:
      description: Error
      headers: { Replay-Nonce: { schema: { type: string } } }
      content:
        application/problem+json:
          schema:
            type: object
            required: [type, title, status]
            properties:
              type: { type: string, format: uri }
              title: { type: string }
              status: { type: integer }
              detail: { type: string }
              instance: { type: string, format: uri }
              receipt: { $ref: "https://schema.agtp.org/json/receipt.schema.json" }

D. Conformance Requirements and Classes§

Each identified requirement below restates, in one line, a requirement made normatively in the body of this specification; the body prevails. Conformance classes aggregate requirements so that implementations can claim them independently and test suites can be organised by class. The descriptors are published in machine-readable form at https://schema.agtp.org/conformance/2.1.json.

Identified requirements
IdentifierRequirementSection
REQ-DID-1Use a resolvable DID; advertise an AGTPFeedbackService.§5.1
REQ-DID-2List an assertion key usable with a supported cryptosuite; fail closed on unresolvable DIDs.§3.1
REQ-VC-CONTEXT-1Credentials carry the VC 2.0 base context and the AGTP v2 context, one AGTP type, a DID issuer and validFrom.§4.2
REQ-VC-LEGACY-1Accept v2 credentials (v1 context, issuanceDate, Ed25519Signature2020, StatusList2021Entry) during the overlap window.§13.2
REQ-FBSVC-HTTP-1Expose /.well-known/agtp/feedback with HEAD and POST over TLS.§9.1
REQ-FBSVC-NONCE-1HEAD returns Replay-Nonce; POST requires a valid, unused AGTP-Nonce.§9.2
REQ-HTTP-ACCEPT-1Accept application/vc and the legacy VC media types.§4.5
REQ-HTTP-RECEIPT-1Return a receipt with receiptId, signalHash, acceptState and receivedAt; sign it when requested.§5.4
REQ-HTTP-PROBLEM-1Report errors as Problem Details with registered AGTP problem types, distinguishing verification from validation failures.§9.3
REQ-IDEMPOTENCY-1Require Idempotency-Key; answer repeats with 409 and the original receipt; remember keys for 24 hours.§9.2
REQ-NONCE-USE-1Senders include the latest nonce and reuse the idempotency key on retries.§9.2
REQ-DISCOVERY-CACHE-1Cache Space Manifests by manifestHash and honour ETag and validUntil.§5.2
REQ-SMAN-VC-1The Space Manifest is a credential issued by the Space DID with credential-level validity.§5.2
REQ-SMAN-DIMS-1Declare each dimension with range and higherIsBetter; never declare a draft registry concept.§5.2
REQ-SMAN-AGG-1Declare aggregation or accept the reference default; aggregation is a pure function of served signals.§11
REQ-SMAN-CACHE-1Serve the manifest with ETag equal to manifestHash and bounded Cache-Control.§9.4
REQ-SMAN-SIGN-1Include version and manifestHash; increment version on change.§5.2
REQ-SMAN-STATUS-1Expose a status resource or bitstring list for manifests and accepted signals.§9.5
REQ-SIG-MIN-1Signals include subject, space, dimensions, value, persistence and provenance, with values in range.§5.3
REQ-SIG-PROV-1Provenance conforms to the ABNF, names the signal's Space and is compared after normalisation.§3.5
REQ-SIG-PROOF-1Signals carry a Data Integrity proof with eddsa-rdfc-2022 and purpose assertionMethod.§10.1
REQ-SIG-STATUS-1Signals carry credentialStatus as a bitstring entry or Space status entry.§10.3
REQ-COMMITMENT-1Distilled persistent signals carry a commitment computed with the baseline tree.§5.3
REQ-ISSUER-REL-1Include issuerRelation when known.§5.3
REQ-VERIFY-VC-1Verify proofs against assertionMethod keys; fail closed on unsupported suites.§10.1
REQ-VERIFY-PROV-1Validate provenance grammar and Space match; dereference components where possible.§3.5
REQ-STATUS-CHECK-1Check status before aggregation, routing, anchoring or presentation; treat unretrievable status as unknown.§10.3
REQ-DEDUP-1Compute signalHash per §10.2 and treat equal hashes as one signal.§10.2
REQ-AGG-DEFAULT-1Apply the reference default when the manifest omits aggregation.§11.1
REQ-AGG-PUBLISH-1Publish manifestHash, distinct-issuer count and window with every aggregate.§11.1
REQ-REPRO-ARTIFACTS-1Attempt reproduction when artifacts are public.§14.5
REQ-OBS-MIN-1Observation records carry the required properties and a privacy class.§5.7
REQ-OBS-ORDER-1Preserve upstream identifiers and event ordering in sourceRefs.§12.1
REQ-OBS-SEPARATE-1Never emit execution or transport outcomes as signals.§6.2
REQ-CAP-DESC-1Descriptors carry id, owner, name, interfaceType, interface and contentHash.§5.5
REQ-CAP-HASH-1Regenerate descriptors with a new contentHash and schemaHash whenever the upstream schema changes.§12.3
REQ-ARD-PUBLISH-1Publish /.well-known/ard.json; AGTP entries bind the agtp prefix and carry agtp:did.§7.1
REQ-ARD-IDENTITY-1trustManifest.identity names the DID framework and the same DID as agtp:did.§7.2
REQ-ARD-VERIFY-1Registries establish mutual DID–domain binding and verify an attestation before marking agtp:verified.§7.2
REQ-ARD-SCORE-1Never use an ARD relevance score as trust; rank on verified state and recomputable aggregates.§7.3
REQ-ARD-FEDERATE-1Do not forward another registry's agtp:verified as your own.§7.4
REQ-ARD-DELIVER-1Do not deliver signals to endpoints learned only from unverified entries.§7.2
REQ-OKF-CID-1Identify bundles by tree CID and concepts by file CID; verify against the manifest's knowledge entries.§8.1
REQ-OKF-ACTOR-1Write DID actors inside OKF actor forms; recognise did: in any form.§8.2.1
REQ-OKF-VERIFIED-1Derive attestation state from backing signals without altering OKF trust tiers.§8.3
REQ-OKF-ATTEST-1Content-address attested-computation receipts; issue the attester's verdict as a signal bound to concept, receipt and parameter CIDs.§8.3
REQ-OKF-DIM-1Dimension concepts carry agtp.dimension; manifests reference them by URL.§8.4
REQ-OKF-DATA-1Treat knowledge bodies and tool descriptions as data, never as protocol operations.§8.5
REQ-MCP-META-1Carry AGTP identifiers only under the org.agtp/ prefix in _meta; ignore them when not understood.§12.3
REQ-MCP-ARTIFACT-1Content-address tool inputs and outputs and reference the descriptor contentHash in force.§12.3
REQ-A2A-TASKID-1Preserve task and context identifiers; never treat an A2A response as a receipt.§12.7
REQ-ANCHOR-1Anchor commitments carry root, tree, hashAlgorithm, covered, count, reference and anchoredAt.§5.6
REQ-ANCHOR-TREE-1Support the rfc6962 tree with sha2-256.§5.6
REQ-ANCHOR-OFFCHAIN-1Keep signals, manifests and traces off-chain; anchor hashes and pointers only; keep AGTP verification independent of chain state.§12.10
{
  "agtpVersion": "2.1.0",
  "conformanceClasses": [
    { "id": "AGTP.Agent",
      "must": ["REQ-DID-1", "REQ-DID-2", "REQ-FBSVC-HTTP-1", "REQ-FBSVC-NONCE-1", "REQ-HTTP-ACCEPT-1",
               "REQ-HTTP-RECEIPT-1", "REQ-HTTP-PROBLEM-1", "REQ-IDEMPOTENCY-1", "REQ-VC-LEGACY-1"],
      "should": ["REQ-DISCOVERY-CACHE-1", "REQ-ARD-PUBLISH-1"],
      "profiles": ["http/1.1", "did-vc/2.1"] },
    { "id": "AGTP.Space",
      "must": ["REQ-DID-1", "REQ-SMAN-VC-1", "REQ-SMAN-DIMS-1", "REQ-SMAN-AGG-1", "REQ-SMAN-CACHE-1",
               "REQ-SMAN-SIGN-1", "REQ-SMAN-STATUS-1", "REQ-DEDUP-1", "REQ-STATUS-CHECK-1", "REQ-AGG-PUBLISH-1"],
      "should": ["REQ-OKF-DIM-1", "REQ-ARD-PUBLISH-1", "REQ-HTTP-RECEIPT-1"],
      "profiles": ["http/1.1", "did-vc/2.1"] },
    { "id": "AGTP.SignalProducer",
      "must": ["REQ-VC-CONTEXT-1", "REQ-SIG-MIN-1", "REQ-SIG-PROV-1", "REQ-SIG-PROOF-1", "REQ-SIG-STATUS-1",
               "REQ-NONCE-USE-1", "REQ-IDEMPOTENCY-1", "REQ-OBS-SEPARATE-1", "REQ-ARD-DELIVER-1"],
      "should": ["REQ-COMMITMENT-1", "REQ-ISSUER-REL-1"],
      "profiles": ["http/1.1", "did-vc/2.1"] },
    { "id": "AGTP.SignalConsumer",
      "must": ["REQ-VERIFY-VC-1", "REQ-VERIFY-PROV-1", "REQ-STATUS-CHECK-1", "REQ-DEDUP-1", "REQ-AGG-DEFAULT-1",
               "REQ-VC-LEGACY-1"],
      "should": ["REQ-REPRO-ARTIFACTS-1"],
      "profiles": ["did-vc/2.1"] },
    { "id": "AGTP.CapabilityPublisher",
      "must": ["REQ-CAP-DESC-1", "REQ-CAP-HASH-1", "REQ-ARD-PUBLISH-1", "REQ-ARD-IDENTITY-1"],
      "should": ["REQ-MCP-META-1"],
      "profiles": ["did-vc/2.1", "ard/0.91"] },
    { "id": "AGTP.KnowledgePublisher",
      "must": ["REQ-OKF-CID-1", "REQ-OKF-ACTOR-1", "REQ-OKF-DATA-1"],
      "should": ["REQ-OKF-VERIFIED-1", "REQ-OKF-ATTEST-1", "REQ-OKF-DIM-1", "REQ-ARD-PUBLISH-1"],
      "profiles": ["did-vc/2.1", "okf/0.2"] },
    { "id": "AGTP.DiscoveryRegistry",
      "must": ["REQ-ARD-VERIFY-1", "REQ-ARD-SCORE-1", "REQ-ARD-FEDERATE-1", "REQ-VERIFY-VC-1", "REQ-STATUS-CHECK-1"],
      "should": [],
      "profiles": ["did-vc/2.1", "ard/0.91"] },
    { "id": "AGTP.ExecutionIntegrator",
      "must": ["REQ-OBS-MIN-1", "REQ-OBS-ORDER-1", "REQ-OBS-SEPARATE-1", "REQ-MCP-META-1", "REQ-MCP-ARTIFACT-1",
               "REQ-A2A-TASKID-1", "REQ-OKF-DATA-1"],
      "should": ["REQ-CAP-HASH-1"],
      "profiles": ["did-vc/2.1", "mcp/2025-11-25", "a2a/1.0", "openai-api/1", "a2ui/0.8"] },
    { "id": "AGTP.AnchorIntegrator",
      "must": ["REQ-ANCHOR-1", "REQ-ANCHOR-TREE-1", "REQ-ANCHOR-OFFCHAIN-1", "REQ-STATUS-CHECK-1"],
      "should": [],
      "profiles": ["did-vc/2.1", "erc8004/1"] }
  ]
}

E. Operational Metrics§

This section is non-normative.

The metrics feed of section 9.8 lets agents and Spaces publish indicators that third parties can audit. The following definitions, over 30-day rolling windows unless the feed says otherwise, are recommended so that feeds are comparable.

Recommended metrics
MetricDefinition
coveragevalidSignals / interactionsObserved
leechingagentsWithoutHealthyFeedbackService / activeAgents
reproducibilityreverifiedOutcomes / auditedOutcomes
attestationRateattestedConcepts / verifiedConcepts, for knowledge publishers
discoveryVerificationagtpVerifiedEntries / ingestedAgtpEntries, for registries
interopConformancepasses / totalCases, per conformance suite
hhiΣ sᵢ² over shares in identity, storage, registry and routing provider roles
crossSpaceTransferLift(scoreWithReuse − baselineScore) / baselineScore
reIdIncidentRateincidents / totalPersistentSignals
reputationVolatilitystdev(monthlyScore) / mean(monthlyScore)

F. AGTP Registries§

The AGTP Consortium maintains the following registries, published at https://schema.agtp.org/registries/ and, as recommended by section 8.4, as an OKF bundle. Registration is by pull request to the specification repository with a stable identifier, a specification reference and a contact. Initial contents are listed here; a registry may be extended without a new version of this document.

Registries and initial contents
RegistryInitial entries
Credential typesLearningSignal, SpaceManifest, InteractionReceipt, CapabilityDescriptor, AnchorCommitment, DelegationCredential, PolicyAssertion; aliases with the Credential suffix
Record typesObservationRecord, MCPToolCallRecord, A2ATaskEventRecord, ModelRunRecord, UIEventRecord
DID service typesAGTPFeedbackService, AGTPSpaceManifest, AGTPCapabilities, AGTPSignalIndex, AgenticResourceDiscovery, MCPServer, A2AAgentCard
Credential status typesAGTPSpaceStatus
Profile identifiersdid-vc/2.1, http/1.0, http/1.1, didcomm/2.0, mcp/2025-06-18, mcp/2025-11-25, ard/0.91, okf/0.2, openai-api/1, a2a/1.0, a2ui/0.8, a2ui/0.9, agents-skills/1, erc8004/1
Interface typesmcp-tool, mcp-resource, mcp-prompt, a2a-skill, api-tool, agent-skill, okf-computation, policy-only; extensions prefixed x-
Privacy classesephemeral, persistent, redacted, committed-only
Aggregation functionshttps://schema.agtp.org/aggregation#TrustWeightedAverage
Tree constructionsrfc6962
Hashing identifiersrdfc-1.0+sha2-256; legacy alias URDNA2015+multihash
Problem typesnonce-invalid, malformed, unauthenticated, not-admitted, dimension-not-accepted, duplicate-delivery, too-large, proof-invalid, issuer-unresolvable, status-revoked, value-out-of-range, provenance-invalid, space-mismatch, manifest-expired, schema-invalid, rate-limited, degraded, under https://schema.agtp.org/problems/
Provenance parametersspace, interaction, artifact; extensions with reverse-DNS prefixes
Reserved keys in host protocolsAs listed in §12.1; the MCP _meta prefix org.agtp/; the A2A extension URI https://schema.agtp.org/a2a/ext/v1
Capabilities featuresmetricsFeed, signalIndex, signedReceipts, anchoring
ARD capability tokensAGTPAgent, AGTPSpace, AGTPCapability, AGTPKnowledge, AGTPSignalIndex, AGTPFeedbackService
OKF concept typesAGTP Dimension, AGTP Space
Reserved namesThe DID method name agtp, reserved for a future method specification

G. Changes from AGTP v2§

This section is non-normative.

H. Future Work§

This section is non-normative.

  1. Verifiable rewards at scale. Verifier receipts backed by TEE attestations and SNARK-friendly transcripts; dataset-slice commitments; a profile for the ERC-8004 validation registry's zkML and TEE validators.
  2. Benchmark-from-live. Rolling benchmarks assembled from production interactions with drift detection, adversarial mining and freeze windows, published as OKF bundles of attested computations.
  3. Privacy-preserving aggregation. Threshold and MPC aggregation; differential privacy for public leaderboards; selective disclosure from commitment trees.
  4. Cross-Space normalisation. Mapping schemas with uncertainty and provenance for aligning dimension scales between Spaces that reference different registry concepts.
  5. Discovery of Spaces by fit. ARD facets that let an agent find the Space whose dimensions and evaluators best match its work, and registries that expose recomputable aggregates.
  6. Knowledge feedback loops. Standard subtypes for signals about concepts (accuracy, completeness, freshness) and their use by knowledge catalogs to prioritise re-verification.
  7. A DID method. A specification for did:agtp, if implementation experience shows that existing methods leave a gap.
  8. Conformance and fuzzing. Fixtures for malformed credentials, nonce reuse, CID tampering, catalog spoofing and injected knowledge; a shared fuzz corpus.
  9. Anchoring standards. Profiles for timestamp anchoring, reorganisation handling and audit tooling beyond ERC-8004.

I. Acknowledgements§

This section is non-normative.

The editors thank the members of the AGTP Consortium and the Newfoundation community for review of the v2 text and of the convergence drafts that this document consolidates. AGTP stands on the work of the W3C Verifiable Credentials and Decentralized Identifier Working Groups and the Credentials Community Group; the maintainers of the Model Context Protocol and the Agentic AI Foundation; the A2A project; the authors of Agentic Resource Discovery and the Open Knowledge Format; the authors of ERC-8004; the Decentralized Identity Foundation for DIDComm; the IETF for the HTTP, ACME and Problem Details mechanisms this document borrows; and the multiformats community for content addressing. The intellectual lineage of the protocol—from Shannon and Wiener through the network scientists, the cryptographers, the architects of the semantic web and of open ledgers, to the era of experience—is recorded in the informative references.

J. IANA Considerations§

This appendix records the registrations that the AGTP Consortium intends to request. Until they are complete, the values below are provisional.

Well-Known URI suffix agtp
Registration in the Well-Known URIs registry [RFC8615]. URI suffix: agtp. Change controller: AGTP Consortium. Specification document: this document, section 9. Related information: all resources beneath the suffix are defined by the HTTP profile; /.well-known/agtp/feedback, space/, status, capabilities, signals and metrics.
HTTP field name AGTP-Nonce
Registration in the Hypertext Transfer Protocol (HTTP) Field Name Registry [RFC9110]. Status: provisional. Specification: section 9.2. Replay-Nonce is already registered by [RFC8555] and Idempotency-Key by [IDEMPOTENCY-KEY]; AGTP reuses both unchanged.
HTTP Preference agtp-signed-receipt
Registration in the HTTP Preferences registry established by RFC 7240. Specification: section 5.4.
URI scheme agtp
Provisional registration in the Uniform Resource Identifier (URI) Schemes registry under the procedures of RFC 7595. Scheme syntax: section 3.5. The scheme identifies provenance bindings and is not dereferenced as a network locator.
Media types
No new media types are requested. AGTP uses application/vc and application/vp as registered by [VC-DATA-MODEL-2.0], application/problem+json [RFC9457], application/did+ld+json and application/did+json [DID-CORE], and application/json.
Other namespaces
The MCP _meta prefix org.agtp/, the A2A extension URI, the ARD agtp context prefix and the OKF agtp frontmatter key are governed by the respective specifications' extension rules and by the registries of Appendix F; they involve no IANA action. The DID service types defined by this document will be submitted to the DID Specification Registries [DID-SPEC-REGISTRIES].

K. References§

K.1. Normative References§

[ARD]
Junjie Bu, R.V. Guha, Shaun Smith. Agentic Resource Discovery Specification. Version 0.91, Proposal, 26 August 2026. Repository: github.com/ards-project/ard-spec.
[CAIP-2]
Chain Agnostic Standards Alliance. CAIP-2: Blockchain ID Specification.
[CAIP-10]
Chain Agnostic Standards Alliance. CAIP-10: Account ID Specification.
[CID]
Multiformats. CID (Content IDentifier) Specification.
[CONTROLLED-IDENTIFIERS]
W3C. Controlled Identifiers v1.0. W3C Recommendation.
[DID-CORE]
W3C. Decentralized Identifiers (DIDs) v1.0. W3C Recommendation, 19 July 2022.
[IDEMPOTENCY-KEY]
IETF HTTPAPI Working Group. The Idempotency-Key HTTP Header Field. Internet-Draft.
[JSON-LD11]
W3C. JSON-LD 1.1. W3C Recommendation, 16 July 2020.
[JSON-SCHEMA]
JSON Schema. JSON Schema 2020-12.
[MCP]
MCP Core Maintainers. Model Context Protocol Specification, revision 2025-11-25; and revision 2025-06-18.
[MULTIBASE]
Multiformats. The Multibase Data Format. Internet-Draft.
[MULTIHASH]
Multiformats. The Multihash Data Format. Internet-Draft.
[OKF]
Google Cloud. Open Knowledge Format Specification. Version 0.2, 25 July 2026.
[OPENAPI]
OpenAPI Initiative. OpenAPI Specification v3.1.0.
[RDF-CANON]
W3C. RDF Dataset Canonicalization. W3C Recommendation, 21 May 2025.
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. BCP 14, RFC 2119, March 1997.
[RFC3339]
G. Klyne, C. Newman. Date and Time on the Internet: Timestamps. RFC 3339, July 2002.
[RFC3986]
T. Berners-Lee, R. Fielding, L. Masinter. Uniform Resource Identifier (URI): Generic Syntax. STD 66, RFC 3986, January 2005.
[RFC5234]
D. Crocker, P. Overell. Augmented BNF for Syntax Specifications: ABNF. STD 68, RFC 5234, January 2008.
[RFC6962]
B. Laurie, A. Langley, E. Kasper. Certificate Transparency. RFC 6962, June 2013.
[RFC8174]
B. Leiba. Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. BCP 14, RFC 8174, May 2017.
[RFC8259]
T. Bray. The JavaScript Object Notation (JSON) Data Interchange Format. STD 90, RFC 8259, December 2017.
[RFC8555]
R. Barnes, J. Hoffman-Andrews, D. McCarney, J. Kasten. Automatic Certificate Management Environment (ACME). RFC 8555, March 2019.
[RFC8615]
M. Nottingham. Well-Known Uniform Resource Identifiers (URIs). RFC 8615, May 2019.
[RFC9110]
R. Fielding, M. Nottingham, J. Reschke. HTTP Semantics. STD 97, RFC 9110, June 2022.
[RFC9111]
R. Fielding, M. Nottingham, J. Reschke. HTTP Caching. STD 98, RFC 9111, June 2022.
[RFC9421]
A. Backman, J. Richer, M. Sporny. HTTP Message Signatures. RFC 9421, February 2024.
[RFC9457]
M. Nottingham, E. Wilde, S. Dalal. Problem Details for HTTP APIs. RFC 9457, July 2023.
[RFC9562]
K. Davis, B. Peabody, P. Leach. Universally Unique IDentifiers (UUIDs). RFC 9562, May 2024.
[VC-BITSTRING-STATUS-LIST]
W3C. Bitstring Status List v1.0. W3C Recommendation, 15 May 2025.
[VC-DATA-INTEGRITY]
W3C. Verifiable Credential Data Integrity 1.0. W3C Recommendation, 15 May 2025.
[VC-DATA-MODEL-2.0]
W3C. Verifiable Credentials Data Model v2.0. W3C Recommendation, 15 May 2025.
[VC-DI-EDDSA]
W3C. Data Integrity EdDSA Cryptosuites v1.0. W3C Recommendation, 15 May 2025.
[VC-JSON-SCHEMA]
W3C. Verifiable Credentials JSON Schema Specification.

K.2. Informative References§

[A2A]
A2A Project (Linux Foundation). Agent2Agent (A2A) Protocol Specification, version 1.0.
[A2UI]
A2UI Project. A2UI Specification v0.8; v0.9 (draft).
[AAIF]
Linux Foundation. Agentic AI Foundation.
[AGENT-SKILLS]
Agent Skills. Agent Skills Specification.
[AGENTS-MD]
AGENTS.md: A simple, open format for guiding coding agents.
[AGTP-V2]
Newfoundation. Agent Graph Trust Protocol (AGTP) v2. Specification text, 24 February 2026.
[DID-KEY]
W3C Credentials Community Group. The did:key Method.
[DID-PKH]
W3C Credentials Community Group. did:pkh Method Specification.
[DID-RESOLUTION]
W3C. Decentralized Identifier Resolution (DID Resolution) v1.0.
[DID-SPEC-REGISTRIES]
W3C. DID Extensions (DID Specification Registries).
[DID-WEB]
W3C Credentials Community Group. did:web Method Specification.
[DID-WEBVH]
Decentralized Identity Foundation. The did:webvh DID Method.
[DIDCOMM-V2]
Decentralized Identity Foundation. DIDComm Messaging v2.
[ERC-8004]
Ethereum Improvement Proposals. ERC-8004: Trustless Agents.
[IPFS-CONTENT-ADDRESSING]
IPFS. Content addressing and CIDs.
[JSON-RPC]
JSON-RPC 2.0 Specification.
[OPENAI-API]
OpenAI. OpenAI API Reference; Function calling.
[RFC2104]
H. Krawczyk, M. Bellare, R. Canetti. HMAC: Keyed-Hashing for Message Authentication. RFC 2104, February 1997.
[SYNERGY]
Newfoundation. Synergy Is All We Need. Foundation paper, 2024.
[VC-DATA-MODEL-1.0]
W3C. Verifiable Credentials Data Model 1.0. W3C Recommendation, 19 November 2019.

Research lineage

The following works, published as the AGTP research bibliography, record the ideas the protocol builds on, from the era of experience back to the foundations of information theory.

[SILVER-SUTTON-2025]
David Silver, Richard S. Sutton. Welcome to the Era of Experience. 2025.
[RSA-1978]
R. L. Rivest, A. Shamir, L. Adleman. A Method for Obtaining Digital Signatures and Public-Key Cryptosystems. Communications of the ACM 21(2), 1978.
[HMAC-1996]
H. Krawczyk, R. Canetti, M. Bellare. HMAC: Keyed-Hashing for Message Authentication. See [RFC2104].
[GRANOVETTER-1973]
Mark S. Granovetter. The Strength of Weak Ties. American Journal of Sociology 78(6), 1973.
[RESNICK-ZECKHAUSER-2002]
Paul Resnick, Richard Zeckhauser. Trust Among Strangers in Internet Transactions: Empirical Analysis of eBay's Reputation System. 2002.
[SEMANTIC-WEB-2001]
Tim Berners-Lee, James Hendler, Ora Lassila. The Semantic Web. Scientific American, May 2001.
[SABATER-SIERRA-2005]
Jordi Sabater, Carles Sierra. Review on Computational Trust and Reputation Models. Artificial Intelligence Review 24, 2005.
[BUTERIN-2014]
Vitalik Buterin. A Next-Generation Smart Contract and Decentralized Application Platform. 2014.
[NAKAMOTO-2008]
Satoshi Nakamoto. Bitcoin: A Peer-to-Peer Electronic Cash System. 2008.
[GOODFELLOW-2016]
Ian Goodfellow, Yoshua Bengio, Aaron Courville. Deep Learning. MIT Press, 2016.
[BARABASI-2002]
Albert-László Barabási. Linked: The New Science of Networks. Perseus, 2002.
[WATTS-STROGATZ-1998]
Duncan J. Watts, Steven H. Strogatz. Collective Dynamics of 'Small-World' Networks. Nature 393, 1998.
[BARABASI-ALBERT-1999]
Albert-László Barabási, Réka Albert. Emergence of Scaling in Random Networks. Science 286, 1999.
[NEWMAN-2003]
M. E. J. Newman. The Structure and Function of Complex Networks. SIAM Review 45(2), 2003.
[WIENER-1948]
Norbert Wiener. Cybernetics: Or Control and Communication in the Animal and the Machine. MIT Press, 1948.
[SHANNON-1948]
Claude E. Shannon. A Mathematical Theory of Communication. Bell System Technical Journal 27, 1948.