diff --git a/schemas/aep/checkpoint-evidence.schema.json b/schemas/aep/checkpoint-evidence.schema.json new file mode 100644 index 0000000..71b9669 --- /dev/null +++ b/schemas/aep/checkpoint-evidence.schema.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://wasmagent.dev/schemas/aep/checkpoint-evidence.schema.json", + "title": "CheckpointEvidence", + "description": "Signed checkpoint/fork record — attests that a run's state was checkpointed (and optionally forked from a parent run), enabling verifiable resume and branch provenance. Carries the AEP envelope fields (schema_version, created_at_ms) plus checkpoint-specific keys.", + "type": "object", + "required": [ + "schema_version", + "created_at_ms", + "checkpoint_id", + "parent_run_id", + "state_digest" + ], + "properties": { + "schema_version": { + "type": "string", + "description": "Semver-like schema identifier, e.g. aep/v0.1" + }, + "trace_id": { + "type": "string", + "description": "Optional correlation ID linking related evidence records" + }, + "created_at_ms": { + "type": "number", + "description": "UTC epoch milliseconds when the record was created (checkpoint creation time)" + }, + "checkpoint_id": { + "type": "string", + "description": "Unique identifier for this checkpoint" + }, + "parent_run_id": { + "type": "string", + "description": "Identifier of the run this checkpoint was taken from" + }, + "fork_of": { + "type": [ + "string", + "null" + ], + "description": "Checkpoint_id this run was forked from, or null if this is not a fork" + }, + "state_digest": { + "type": "string", + "description": "Content digest of the checkpointed run state, for tamper-evident resume" + }, + "signature": { + "type": "object", + "description": "Optional tamper-evident signature over the record content", + "required": [ + "alg", + "key_id", + "sig" + ], + "properties": { + "alg": { + "type": "string", + "description": "Signature algorithm, e.g. ed25519" + }, + "key_id": { + "type": "string", + "description": "Identifier of the signing key" + }, + "sig": { + "type": "string", + "description": "Base64-encoded signature bytes" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/schemas/aep/replay-evidence.schema.json b/schemas/aep/replay-evidence.schema.json new file mode 100644 index 0000000..61bc6b2 --- /dev/null +++ b/schemas/aep/replay-evidence.schema.json @@ -0,0 +1,78 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://wasmagent.dev/schemas/aep/replay-evidence.schema.json", + "title": "ReplayEvidence", + "description": "Deterministic-replay attestation — records that a run was replayed from a fixed seed and produced a matching output, proving determinism. Carries the AEP envelope fields (schema_version, created_at_ms) plus replay-specific keys.", + "type": "object", + "required": [ + "schema_version", + "created_at_ms", + "run_id", + "seed", + "input_digests", + "output_digest", + "engine_version" + ], + "properties": { + "schema_version": { + "type": "string", + "description": "Semver-like schema identifier, e.g. aep/v0.1" + }, + "trace_id": { + "type": "string", + "description": "Optional correlation ID linking related evidence records" + }, + "created_at_ms": { + "type": "number", + "description": "UTC epoch milliseconds when the record was created" + }, + "run_id": { + "type": "string", + "description": "Identifier of the run being attested for deterministic replay" + }, + "seed": { + "type": "string", + "description": "The deterministic seed the run was replayed with" + }, + "input_digests": { + "type": "array", + "description": "Content digests of every input consumed by the replayed run, in a stable order", + "items": { + "type": "string" + } + }, + "output_digest": { + "type": "string", + "description": "Content digest of the replayed run's output; a match across replays proves determinism" + }, + "engine_version": { + "type": "string", + "description": "Version of the execution engine/runtime that performed the replay" + }, + "signature": { + "type": "object", + "description": "Optional tamper-evident signature over the record content", + "required": [ + "alg", + "key_id", + "sig" + ], + "properties": { + "alg": { + "type": "string", + "description": "Signature algorithm, e.g. ed25519" + }, + "key_id": { + "type": "string", + "description": "Identifier of the signing key" + }, + "sig": { + "type": "string", + "description": "Base64-encoded signature bytes" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/schemas/index.json b/schemas/index.json index 2bc43b1..d7983a1 100644 --- a/schemas/index.json +++ b/schemas/index.json @@ -1,7 +1,7 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "protocol": "AEP", - "description": "Registry of canonical WasmAgent protocol schemas \u2014 the single source of truth for every cross-repository contract. Downstream repos consume via @wasmagent/protocol (npm) and wasmagent-protocol (PyPI). Covers: AEP, compliance, AgentBOM, MCP Posture, Trust Passport.", + "description": "Registry of canonical WasmAgent protocol schemas — the single source of truth for every cross-repository contract. Downstream repos consume via @wasmagent/protocol (npm) and wasmagent-protocol (PyPI). Covers: AEP, compliance, AgentBOM, MCP Posture, Trust Passport.", "canonical_host": "https://wasmagent.dev/schemas/", "schemas": [ { @@ -21,7 +21,7 @@ "wasmagent-train-replay", "open-agent-audit" ], - "summary": "Runtime action evidence and run provenance record \u2014 the core Agent Evidence Protocol contract." + "summary": "Runtime action evidence and run provenance record — the core Agent Evidence Protocol contract." }, { "id": "evidence-envelope", @@ -39,7 +39,7 @@ "trace-pipeline", "open-agent-audit" ], - "summary": "Shared envelope base for all AEP evidence records \u2014 schema_version, trace_id, created_at_ms, and optional signature." + "summary": "Shared envelope base for all AEP evidence records — schema_version, trace_id, created_at_ms, and optional signature." }, { "id": "constraint-ir", @@ -55,7 +55,7 @@ "wasmagent-js", "trace-pipeline" ], - "summary": "Typed, repairable, prioritised constraint \u2014 superset of @wasmagent/core Criterion." + "summary": "Typed, repairable, prioritised constraint — superset of @wasmagent/core Criterion." }, { "id": "constraint-violation", @@ -151,7 +151,7 @@ "agent-trust-infra", "open-agent-audit" ], - "summary": "Agent Bill of Materials \u2014 machine-readable agent identity, capabilities, and trust metadata." + "summary": "Agent Bill of Materials — machine-readable agent identity, capabilities, and trust metadata." }, { "id": "mcp-posture", @@ -167,7 +167,7 @@ "agent-trust-infra", "open-agent-audit" ], - "summary": "MCP Posture \u2014 tool surface, permission grants, and risk signals for MCP servers." + "summary": "MCP Posture — tool surface, permission grants, and risk signals for MCP servers." }, { "id": "trust-passport", @@ -183,7 +183,39 @@ "agent-trust-infra", "open-agent-audit" ], - "summary": "Trust Passport \u2014 signed, expiring, verifiable trust-state artifact for AI agents." + "summary": "Trust Passport — signed, expiring, verifiable trust-state artifact for AI agents." + }, + { + "id": "replay-evidence", + "title": "ReplayEvidence", + "path": "schemas/aep/replay-evidence.schema.json", + "canonical_id": "https://wasmagent.dev/schemas/aep/replay-evidence.schema.json", + "version": "aep/v0.1", + "stability": "evolving", + "owners": [ + "wasmagent-protocol" + ], + "consumers": [ + "wasmagent-js", + "open-agent-audit" + ], + "summary": "Deterministic-replay attestation — run_id, seed, input_digests, output_digest, engine_version." + }, + { + "id": "checkpoint-evidence", + "title": "CheckpointEvidence", + "path": "schemas/aep/checkpoint-evidence.schema.json", + "canonical_id": "https://wasmagent.dev/schemas/aep/checkpoint-evidence.schema.json", + "version": "aep/v0.1", + "stability": "evolving", + "owners": [ + "wasmagent-protocol" + ], + "consumers": [ + "wasmagent-js", + "open-agent-audit" + ], + "summary": "Signed checkpoint/fork record — checkpoint_id, parent_run_id, fork_of, state_digest, created_at_ms." } ] } diff --git a/tests/fixtures/invalid/checkpoint-evidence/example.json b/tests/fixtures/invalid/checkpoint-evidence/example.json new file mode 100644 index 0000000..e03f595 --- /dev/null +++ b/tests/fixtures/invalid/checkpoint-evidence/example.json @@ -0,0 +1,6 @@ +{ + "schema_version": "aep/v0.1", + "created_at_ms": 1737600000000, + "checkpoint_id": "ckpt-xyz789", + "parent_run_id": "run-abc123" +} diff --git a/tests/fixtures/invalid/replay-evidence/example.json b/tests/fixtures/invalid/replay-evidence/example.json new file mode 100644 index 0000000..241d70c --- /dev/null +++ b/tests/fixtures/invalid/replay-evidence/example.json @@ -0,0 +1,10 @@ +{ + "schema_version": "aep/v0.1", + "created_at_ms": 1737600000000, + "run_id": "run-abc123", + "seed": "42", + "input_digests": [ + "sha256:aaaa1111" + ], + "engine_version": "wasmagent-runtime/1.4.2" +} diff --git a/tests/fixtures/valid/checkpoint-evidence/example.json b/tests/fixtures/valid/checkpoint-evidence/example.json new file mode 100644 index 0000000..f2fd5ca --- /dev/null +++ b/tests/fixtures/valid/checkpoint-evidence/example.json @@ -0,0 +1,9 @@ +{ + "schema_version": "aep/v0.1", + "trace_id": "trace-ckpt-001", + "created_at_ms": 1737600000000, + "checkpoint_id": "ckpt-xyz789", + "parent_run_id": "run-abc123", + "fork_of": null, + "state_digest": "sha256:dddd4444" +} diff --git a/tests/fixtures/valid/replay-evidence/example.json b/tests/fixtures/valid/replay-evidence/example.json new file mode 100644 index 0000000..317243a --- /dev/null +++ b/tests/fixtures/valid/replay-evidence/example.json @@ -0,0 +1,18 @@ +{ + "schema_version": "aep/v0.1", + "trace_id": "trace-replay-001", + "created_at_ms": 1737600000000, + "run_id": "run-abc123", + "seed": "42", + "input_digests": [ + "sha256:aaaa1111", + "sha256:bbbb2222" + ], + "output_digest": "sha256:cccc3333", + "engine_version": "wasmagent-runtime/1.4.2", + "signature": { + "alg": "ed25519", + "key_id": "key-001", + "sig": "base64sigexample==" + } +}