JSON schemas & media types¶
The consolidated index of every normative JSON Schema in the Agent Cartridge standard (SPEC §13) and the provisional RFC 6838 vendor-tree media names used for each artifact on the wire.
Provisional media names
The application/vnd.acx.* names are part of the interoperable ACX public draft but are not yet
IANA-registered. Registration or migration follows the public
governance process; the project does not imply registry status.
All schemas use JSON Schema draft 2020-12. The $id
is the stable, canonical identifier a validator resolves — it is a URL namespace, not a fetch target.
The physical files ship in the repo under schemas/.
$id vs. file path
The $id (e.g. https://acx.dev/schema/rom-manifest.v1.json) is what an in-toto predicate or a $ref points at. The file on disk (schemas/container-amp-integrity.schema.json) is what you validate against. Every normative schema now uses the single https://acx.dev/ namespace.
Schema index¶
Each row maps a format block to its schema title, canonical $id, and the file you validate against. Follow the block link for the field-by-field format page.
| Block | Schema title | $id |
File under schemas/ |
|---|---|---|---|
| Container & Integrity | ACX ROM Integrity Manifest (DSSE payload) | https://acx.dev/schema/rom-manifest.v1.json |
container-amp-integrity.schema.json |
| Identity, Signing & Trust | ACX Trust Registry (public keys only) | https://acx.dev/schema/trust-registry/v1 |
identity-signing-trust.schema.json |
| Skill Bundle | ACX Skill Index Descriptor (acx_skill row) |
https://acx.dev/schemas/skill-descriptor/1 |
skill-bundle.schema.json |
| Capability record | CapabilityRecord | https://acx.dev/schema/capability/1 |
capability-sellable-claim.schema.json |
| Memory Partition | AcxMemoryRecord | https://acx.dev/schema/memory-record.v1.json |
memory-partition.schema.json |
| Package Spec | ACX Package Spec (acx.package-spec/1) |
https://acx.dev/schema/package-spec.v1.json |
package-spec.schema.json |
| LanceDB Memory | ACX LanceDB Memory Schema (acx.lance-memory/1) |
https://acx.dev/schema/lance-memory.v1.json |
lance-memory.schema.json |
| Harness Requirements | AcxHarnessRequirements | https://acx.dev/schemas/harness-requirements.v1.json |
harness-requirements.schema.json |
| Loop + Context Policy | ACX Loop + Context Policy | https://acx.dev/schemas/loop-context-policy/1 |
loop-policy-context-policy.schema.json |
| ACX Workflow | ACX Workflow — Conditional Agentic Loop (acx.cal/1) |
https://acx.dev/schema/cal.v1.json |
cal.schema.json |
| Workflow participation | ACX CAL Skill Set (acx.cal-skillset/1) |
https://acx.dev/schema/cal-skillset.v1.json |
cal-skillset.schema.json |
| ACX Agent Graph | ACX Agent Graph — knowledge, reporting, and loop convergence (acx.agent-graph/1) |
https://acx.dev/schema/agent-graph.v1.json |
agent-graph.schema.json |
| Provable Character Level | AcxLevelCredential | https://acx.dev/schema/level-credential.v1.json |
provable-character-level.schema.json |
| Registry discovery | ACX Registry Index (acx.registry-index/1) |
https://acx.dev/schema/registry-index.v1.json |
registry-index.schema.json |
| Registry lifecycle | ACX Registry Status Ledger (acx.registry-status/1) |
https://acx.dev/schema/registry-status.v1.json |
registry-status.schema.json |
Top-level required and $defs¶
The nested $defs are the reusable sub-schemas the standard reuses across the envelope, trust registry, and harness handshake.
| Schema | Top-level required |
$defs |
|---|---|---|
| ROM Integrity Manifest | specVersion, cartridgeId, applicationId, userVersion, embeddingEngine, objects |
— |
| Trust Registry | schemaVersion, keys |
DsseEnvelope, InTotoStatement, CartridgePredicate, NamespaceProof, TrustedKey |
| Skill Index Descriptor | name, description, sqlar_path, content_sha256, resources, schema_version |
— |
| CapabilityRecord | schemaVersion, id, taskType, stack, domain, proficiency, evidenceRefs, sampleCount, lastDemonstratedAt, createdAt, updatedAt |
— |
| AcxMemoryRecord | id, title, summary, sourceType, portable, codebaseFingerprint, repoId, repoLabel, projectLabel, timestamp, impact, xpAwarded, tags, artifactFingerprint, zone |
— |
| ACX Package Spec | schemaVersion, cartridgeId, specVersion, embeddingEngine, artifacts |
eight closed role profiles: identity, memoryBaseline, memoryVectors, skills, capabilities, harness, loopContext, level |
| ACX LanceDB Memory Schema | schemaVersion, format, table, embeddingEngine, distanceMetric, columns |
— |
| AcxHarnessRequirements | schemaVersion, mcp, model, requiredTools |
harnessCompliance, toolRoleContract, capabilityScope, fsScopes, netScopes |
| Loop + Context Policy | schemaVersion, loop, context |
MissionRule, ResourceLimits, RetrievalStrategy, ContextCategory |
| ACX Workflow | schemaVersion, id, participants, start, nodes, edges |
cartridgeRef, slot, racItem, variable, limits, task, gateway, event, completion, condition, edge, integrity |
| ACX CAL Skill Set | schemaVersion, plays |
play, reference |
| ACX Agent Graph | schemaVersion, id, actors, knowledge, routes, limits |
actor, selector, knowledgeModule, route, trigger, expectation, loopBinding, convergencePoint, graphLimits, integrity |
| AcxLevelCredential | @context, type, issuer, validFrom, credentialSubject, credentialStatus, proof |
— |
| ACX Registry Index | schemaVersion, generatedAt, artifact counts and collections |
artifact discovery-card definitions |
| ACX Registry Status Ledger | schemaVersion, updatedAt, entries |
identity, statusEntry |
Validate locally
The schemas are plain files — point any draft-2020-12 validator at them. The reference implementation is zero-dependency (Node ≥ 22.5.0 node:sqlite + node:crypto); the test suite asserts real artifacts against these schemas, e.g. "§8 harness-requirements manifest matches its schema (requiredTools, no forbidden keys)" and "§7.6 stored memory payload carries schema-required zone + artifactFingerprint" (see Proofs).
Media-type registry¶
Media types live in the RFC 6838 vendor tree (application/vnd.acx.*) plus three borrowed types from adjacent standards: in-toto, DSSE, and W3C Verifiable Credentials. Each names one concrete artifact.
| Media type | Names | Format page |
|---|---|---|
application/vnd.acx.cartridge |
The .acx cartridge (family type) |
Container & Integrity |
application/vnd.acx.cartridge.v1 |
OCI image artifactType for a cartridge |
Distribution |
application/vnd.acx.cartridge.layer.v1+sqlite |
The single SQLite layer inside the OCI manifest | Distribution |
application/vnd.acx.rom-manifest.v1+json |
The content-addressed ROM manifest (in-toto predicate content) | Container & Integrity |
application/vnd.in-toto+json |
DSSE payloadType — the in-toto Statement v1 wrapping the ROM manifest |
Signing & Trust |
application/vnd.dsse.envelope.v1+json |
The DSSE envelope {payloadType, payload, signatures} |
Signing & Trust |
application/vnd.acx.trust-registry.v1 |
The public-keys-only trust registry | Signing & Trust |
application/vnd.acx.harness-requirements.v1+json |
The host handshake requirements manifest | Harness Requirements |
application/vnd.acx.harness-compliance.v1+json |
The host's compliance response | Harness Requirements |
application/vnd.acx.loop-context-policy.v1+json |
The loop + context policy document | Loop + Context |
application/vnd.acx.workflow.v1+json |
A signed, shareable acx.cal/1 agent-team workflow |
Loop engineering |
application/vnd.acx.agent-graph.v1+json |
A signed team information architecture: knowledge ownership, reporting routes, and loop convergence | Agent Graph |
application/vnd.acx.registry-index.v1+json |
Deterministic registry discovery projection | Sharing over git |
application/vnd.acx.registry-status.v1+json |
Advisory lifecycle status keyed by immutable artifact identity | Sharing over git |
application/vnd.acx.level-attestation.v1 |
An independent verifier's level attestation | Provable Level |
application/vnd.acx.benchmark.v1 |
A sealed benchmark with held-out slice | Provable Level |
application/vc |
The W3C VC 2.0 / Open Badges 3.0 level credential | Provable Level |
Specified vs. running
The crypto, trust-taxonomy, scrub-gate, TrueSkill gating, and credential machinery are fully real and proven. But several media types name artifacts that are specified normatively and are host-side in the reference impl: application/vnd.acx.cartridge.v1 / …layer.v1+sqlite (OCI push runtime), application/vnd.acx.harness-requirements.v1+json / …harness-compliance.v1+json (the handshake runtime), and application/vnd.acx.loop-context-policy.v1+json (a loop-policy evaluator). The reference benchmark solver is deterministic and pluggable — a production verifier plugs in a real sandboxed agent run.
How the signing types compose¶
Cartridges, workflows, and Agent Graphs use the same standards-shaped stack: a JCS-addressed subject, an in-toto
Statement, and a DSSE envelope with payloadType = application/vnd.in-toto+json. For a cartridge, the
predicate carries the ROM manifest and the subject digest is manifest_hash; for a workflow, the predicate
binds its canonical digest, id, version, publisher, and signing time. Agent Graphs bind the same identity
fields under their distinct acx.agent-graph-signature/1 integrity profile.
flowchart TD
A["ROM bytes (live)"] -->|"recompute, content-addressed"| B["ROM manifest<br/>application/vnd.acx.rom-manifest.v1+json"]
B -->|"predicate"| C["in-toto Statement v1<br/>subject.digest = manifest_hash"]
C -->|"payload, payloadType = application/vnd.in-toto+json"| D["DSSE envelope<br/>{payloadType, payload, signatures}"]
D -->|"ed25519, keyid = ed25519:hex(sha256(DER SPKI))"| E["signature"]
flowchart TD
W["Workflow JSON without integrity"] -->|"RFC 8785 / JCS + sha256"| H["workflow digest"]
H --> S["in-toto Statement<br/>id · version · publisher · signedAt"]
S --> D["DSSE envelope + Ed25519 signature"]
D --> I["integrity block<br/>acx.workflow-signature/1"]
flowchart TD
G["Agent Graph JSON without integrity"] -->|"RFC 8785 / JCS + sha256"| H["graph digest"]
H --> S["in-toto Statement<br/>id · version · publisher · signedAt"]
S --> D["DSSE envelope + Ed25519 signature"]
D --> I["integrity block<br/>acx.agent-graph-signature/1"]
The manifest hash is recomputed from live bytes, never self-declared. From the proof transcript:
rom_manifest_hash: sha256:1726cf1e6025c166e06dc839a5cbae6c900f0ffa3e0b1235be8b78e88ee09943
cartridge ROM digest: sha256:1726cf1e6025c166e06dc839a5cbae6c900f0ffa3e0b1235be8b78e88ee09943
keyid: ed25519:17bb8c9290fd2a3d0c3a434ad0e99544d809dbff1540d64be0bab2274df14f66
strip-to-ROM proves the ROM was never mutated by hash equality across a re-export:
rom hash before strip: sha256:f479be021b8ea2e55cc6e3e33b95df9d151196548dfc854dedbe578be7120642
rom hash after strip: sha256:f479be021b8ea2e55cc6e3e33b95df9d151196548dfc854dedbe578be7120642
Resolved contradictions¶
The block specs were reconciled during the §13 appendix pass. The load-bearing resolutions:
Six resolved contradictions (SPEC §13)
- DSSE
payloadType— resolved to in-toto Statement v1 as thepayloadType; the ROM manifest is the predicate content (not the payloadType). (§4.2) keyiddefinition — resolved to the content-addressed formed25519:<hex sha256(DER SPKI)>;publisherIdlives in the predicate/registry, not the keyid. (§4.2)artifactFingerprintslice length — resolved to 10; the reference impl re-keys from a live 12. (§7.3)vec0dimension — thevectorsDDL is a per-engine template; dimension comes fromacx.embedding_engine.dimand the vector index is never signed. (§3.5)- OCI vendor tree — resolved to
application/vnd.acx.*normatively (notapplication/vnd.agentibus.*). (§11) - ROM digest naming — the ROM
manifest_hashandpackageHashare the same value, unified as "the ROMmanifest_hash, which is this format'spackageHash." (§3.3, §4.1)
Not signed
The vec0 vector index is a per-engine template and is excluded from the ROM manifest — it is re-indexed on import from the always-present JSON baseline. In the reference impl a plain table stands in for vec0.
See also¶
- CLI reference — the commands that emit and verify these artifacts.
- Conformance — the numbered
§12.xassertions each schema must satisfy. - Proofs — the verbatim transcript the hashes above come from.