From d6b204f3efe15c7abd51f689c7194a926533e851 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:07:02 -0500 Subject: [PATCH 01/16] feat: add familiar embodiment binding profile Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- CHANGELOG.md | 21 +++ README.md | 8 + SPEC.md | 6 + rfcs/RFC-0001-familiar-contract.md | 62 +++++++ .../familiar-embodiment-binding.schema.json | 130 +++++++++++++++ tests/conformance/README.md | 5 + .../conformance/embodiment-bindings/README.md | 12 ++ .../negative/01-ambiguous-alias.json | 100 ++++++++++++ .../negative/02-stale-cached-revision.json | 93 +++++++++++ .../negative/03-revoked-revision.json | 92 +++++++++++ .../negative/04-retired-dispatch.json | 92 +++++++++++ .../negative/05-principal-mismatch.json | 92 +++++++++++ .../negative/06-tampered-bundle-digest.json | 92 +++++++++++ .../07-degraded-history-dispatch.json | 92 +++++++++++ .../08-unauthorized-history-dispatch.json | 92 +++++++++++ .../negative/09-revocation-before-commit.json | 93 +++++++++++ .../negative/10-unknown-field.json | 93 +++++++++++ .../negative/11-malformed-structure.json | 1 + .../negative/12-tampered-binding-digest.json | 92 +++++++++++ .../positive/01-active-direct.json | 92 +++++++++++ .../positive/02-unique-alias-resolution.json | 99 ++++++++++++ .../03-retired-historical-record.json | 92 +++++++++++ .../positive/04-restoration-with-lineage.json | 92 +++++++++++ .../05-new-revision-same-familiar.json | 92 +++++++++++ .../positive/06-fork-new-root.json | 92 +++++++++++ .../positive/07-succession.json | 92 +++++++++++ .../positive/08-direct-coven-session.json | 92 +++++++++++ .../positive/09-scheduled-automation-run.json | 92 +++++++++++ .../10-scheduled-automation-attempt.json | 92 +++++++++++ .../11-psyche-delegated-execution.json | 92 +++++++++++ .../12-degraded-historical-bundle.json | 92 +++++++++++ ...13-privacy-authorized-historical-read.json | 92 +++++++++++ .../14-privacy-unauthorized-read-denied.json | 92 +++++++++++ .../positive/15-revocation-after-commit.json | 93 +++++++++++ tests/conformance/run-conformance.sh | 62 ++++++- validators/README.md | 8 + validators/validate.js | 151 ++++++++++++++++++ 37 files changed, 2876 insertions(+), 1 deletion(-) create mode 100644 schemas/familiar-embodiment-binding.schema.json create mode 100644 tests/conformance/embodiment-bindings/README.md create mode 100644 tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json create mode 100644 tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json create mode 100644 tests/conformance/embodiment-bindings/negative/03-revoked-revision.json create mode 100644 tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json create mode 100644 tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json create mode 100644 tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json create mode 100644 tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json create mode 100644 tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json create mode 100644 tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json create mode 100644 tests/conformance/embodiment-bindings/negative/10-unknown-field.json create mode 100644 tests/conformance/embodiment-bindings/negative/11-malformed-structure.json create mode 100644 tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json create mode 100644 tests/conformance/embodiment-bindings/positive/01-active-direct.json create mode 100644 tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json create mode 100644 tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json create mode 100644 tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json create mode 100644 tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json create mode 100644 tests/conformance/embodiment-bindings/positive/06-fork-new-root.json create mode 100644 tests/conformance/embodiment-bindings/positive/07-succession.json create mode 100644 tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json create mode 100644 tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json create mode 100644 tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json create mode 100644 tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json create mode 100644 tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json create mode 100644 tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json create mode 100644 tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json create mode 100644 tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json diff --git a/CHANGELOG.md b/CHANGELOG.md index c738073..ff14887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,27 @@ This project uses [Semantic Versioning](https://semver.org/). --- +## [Unreleased] + +### Added + +- **`familiar.embodiment_binding.v1`** — A universal, versioned, + privacy-minimized JSON profile for proving the stable familiar root and exact + identity revision embodied by one direct session, automation run/attempt, or + Psyche-delegated execution. It is explicitly separate from scheduler + lifecycle and protected-action authority. +- **`schemas/familiar-embodiment-binding.schema.json`** and semantic + `--embodiment-binding` validation — Canonical digest/reference equality, + lineage, revision status and validity, alias cardinality, principal + consistency, historical-read privacy, revocation races, and immutable + final-check/commit verification fail closed. +- **Embodiment-binding conformance lane** — 15 positive and 12 negative + vectors covering active, retired/restored, continuation, fork, succession, + direct/automation/Psyche targets, degraded history, privacy authorization, + tampering, ambiguity, stale/revoked revisions, and malformed data. + +--- + ## [0.7.0] — 2026-07-26 Draft minor under the **v0.5.0** §6.3 rule (unchanged through v0.6.0): rescopes an existing normative MUST and promotes the reference `ward_hash` leaf construction to a normative definition. Closes both findings of the v0.6.0 post-merge review (beads `threads-8gg`, `threads-df9`). diff --git a/README.md b/README.md index 898b866..d7d9e8d 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,13 @@ These are not soft design preferences. Each one has architectural implications, 4. Run `npm install` to install the reference validator's TOML parser and JSON Schema validator. 5. For a v0.7.0 structural-conformance claim, run both `node validators/validate.js ./your-directory` and `npm test` +**If you're binding a concrete execution:** validate its independently +consumable embodiment record with +`node validators/validate.js --embodiment-binding ./binding.json`. The +[`familiar.embodiment_binding.v1` schema](schemas/familiar-embodiment-binding.schema.json) +proves the selected root and exact identity revision without copying sensitive +identity content; it does not grant authority or define scheduler lifecycle. + **If you're evaluating a familiar:** - Five properties. All five. Fewer than five is an agent, not a familiar. - Protected surface: can the familiar modify its own `SOUL.md` without human authorization? If yes, it's not compliant. @@ -97,6 +104,7 @@ schemas/ identity.schema.json ← JSON Schema for IDENTITY.md ward.schema.json ← JSON Schema for ward.toml role.schema.json ← JSON Schema for ROLE.md + familiar-embodiment-binding.schema.json ← Exact root/revision execution binding examples/ sage/ ← Sage (canonical structurally conformant familiar directory) minimal/ ← Lumen (minimal structurally conformant familiar directory) diff --git a/SPEC.md b/SPEC.md index 4687601..be87b7f 100644 --- a/SPEC.md +++ b/SPEC.md @@ -5,6 +5,12 @@ > ⚠️ **This document is preserved for reproducibility.** The current normative specification is [RFC-0001 v0.7.0](rfcs/RFC-0001-familiar-contract.md), which uses RFC 2119 keywords (MUST/SHOULD/MAY), references the conformance suite at [`tests/conformance/`](tests/conformance/), and hardens the authority-layer separation requirement. > > If you are looking for the current spec, go to [`rfcs/RFC-0001-familiar-contract.md`](rfcs/RFC-0001-familiar-contract.md). This file remains for historical and citation purposes. +> +> **Current profile addendum:** the universal +> [`familiar.embodiment_binding.v1`](schemas/familiar-embodiment-binding.schema.json) +> profile is normative as specified in [RFC-0001 §10.2](rfcs/RFC-0001-familiar-contract.md#102-familiar-embodiment-binding-profile). +> It records an exact root/revision embodiment for a concrete execution; it +> does not modify this historical identity, role, soul, or Ward text. --- diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index a00161b..93807ae 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -495,6 +495,68 @@ These gaps are intentional. The file-level conformance suite verifies the **stru --- +## 10.2 Familiar embodiment binding profile + +`familiar.embodiment_binding.v1`, defined by +[`schemas/familiar-embodiment-binding.schema.json`](../schemas/familiar-embodiment-binding.schema.json), +is a universal, independently consumable JSON profile. It proves which stable +familiar root and *exact identity revision* a direct session, automation +run/attempt, or Psyche-delegated execution embodies. It binds identity to a +concrete target; it is **not** scheduler-lifecycle state, and it grants, +changes, or proves no protected-action authority. + +A binding **MUST** carry an opaque `bindingId`, stable opaque +`familiarRootId`, exact `identityRevisionId`, and monotonic `lineagePosition`. +It **MUST** record a JCS/RFC 8785 canonical identity-declaration digest, bundle +digest, and `urn:sha256:` content-addressed historical bundle reference. The +resolver **MUST** reject malformed digest encodings or unequal bundle digest and +reference. Bindings **MUST NOT** copy identity declarations, memory, +relationships, credentials, or other sensitive contents: opaque identifiers +and digests are the default. `privacy.classification` is therefore +`metadata-only`, with an explicit minimum-retention class. + +`lineageEvidence` **MUST** distinguish genesis, same-familiar revision, +restoration, fork/new-root, and succession. A continuation has the immediately +preceding position and same root; restoration additionally follows a retired +predecessor. A fork/new-root and succession begin position zero on a distinct +root and name their distinct predecessor and relationship. These records +describe continuity evidence only: a fork/new-root is not silently a +continuation, and succession is not an alias for the predecessor familiar. + +The record **MUST** state revision-recorded time, valid-time interval, decision +status (`active`, `retired`, `revoked`, or `superseded`), authenticated +principal (and optional project/scope), target type and correlation target, +binding purpose, schema/profile/policy versions, issued/decision timestamps, +and resolver/verifier identities. `identityMeaning` **MUST** be `unchanged`; +the purpose only contextualizes embodiment and cannot alter identity meaning. +The target's principal **MUST** equal the authenticated principal. + +Aliases are non-authoritative resolution evidence only. When an alias is used, +resolution **MUST** yield exactly one root, and that root **MUST** equal the +recorded root. Ambiguity, stale cache, malformed or tampered digest, invalid or +unverifiable revision, or principal mismatch **MUST** fail closed. The exact +revision is selected at dispatch or session creation, never frozen during +routine authoring. + +A new dispatch or session creation is eligible only when the selected revision +is active, currently valid, verified, and not revoked. Retired, superseded, and +revoked revisions remain meaningful historical records but are not new +dispatch authority. A restored revision is a new active revision with explicit +restoration lineage. Historical verification may be `verified`, `degraded`, +`unavailable`, or `unverifiable`; only `verified` may authorize current +dispatch. An unauthorized historical read **MUST** be recorded as unavailable +historical verification, not treated as authority. + +The resolver and verifier **MUST** perform the final eligibility check and +immutable binding commit on the same snapshot/transaction boundary. The +committed binding digest **MUST** recompute from JCS canonical bytes (excluding +only the digest and its redundant commit-verification field), and the commit +**MUST** attest to that exact digest before launch success. A revocation before +commit rejects the launch; revocation strictly after an immutable commit does +not rewrite that historical binding, but prevents later dispatches. Integrity +and authenticated attestation are mandatory, while cryptographic key-policy +verification remains the verifier's policy responsibility. + ## 11. Changelog ### v0.7.0 (2026-07-26) diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json new file mode 100644 index 0000000..d927fca --- /dev/null +++ b/schemas/familiar-embodiment-binding.schema.json @@ -0,0 +1,130 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/OpenCoven/familiar-contract/schemas/familiar-embodiment-binding.schema.json", + "title": "Familiar Embodiment Binding v1", + "description": "A privacy-minimized, versioned dispatch or historical-verification record proving the exact stable familiar root and identity revision embodied by one concrete execution. It is not a scheduler lifecycle record or protected-action authorization.", + "type": "object", + "additionalProperties": false, + "required": ["profile", "schemaVersion", "bindingId", "familiar", "identityBundle", "revisionRecordedAt", "validTime", "statusAtDecision", "principal", "target", "bindingPurpose", "identityMeaning", "issuedAt", "decisionAt", "policyVersion", "resolver", "verifier", "historicalVerification", "revocation", "commit", "integrity", "authentication", "privacy"], + "properties": { + "profile": { "const": "familiar.embodiment_binding.v1" }, + "schemaVersion": { "$ref": "#/definitions/version" }, + "bindingId": { "type": "string", "minLength": 1 }, + "familiar": { + "type": "object", "additionalProperties": false, + "required": ["familiarRootId", "identityRevisionId", "lineagePosition", "lineageEvidence"], + "properties": { + "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, + "lineagePosition": { "type": "integer", "minimum": 0 }, + "lineageEvidence": { + "type": "object", "additionalProperties": false, + "required": ["relationship", "rootEvidence"], + "properties": { + "relationship": { "enum": ["genesis", "same_familiar_revision", "restoration", "fork_new_root", "succession"] }, + "rootEvidence": { "enum": ["genesis", "continued", "fork", "succession"] }, + "predecessor": { + "type": "object", "additionalProperties": false, + "required": ["familiarRootId", "identityRevisionId", "lineagePosition", "status"], + "properties": { + "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, + "lineagePosition": { "type": "integer", "minimum": 0 }, + "status": { "enum": ["active", "retired", "revoked", "superseded"] } + } + } + } + } + } + }, + "aliasResolution": { + "type": "object", "additionalProperties": false, + "required": ["alias", "authoritative", "resolvedRootIds"], + "properties": { + "alias": { "type": "string", "minLength": 1 }, + "authoritative": { "const": false }, + "resolvedRootIds": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/opaqueId" } } + } + }, + "identityBundle": { + "type": "object", "additionalProperties": false, + "required": ["canonicalization", "declarationDigest", "bundleDigest", "historicalBundleRef"], + "properties": { + "canonicalization": { "const": "jcs-rfc8785" }, + "declarationDigest": { "$ref": "#/definitions/digest" }, + "bundleDigest": { "$ref": "#/definitions/digest" }, + "historicalBundleRef": { "type": "string", "pattern": "^urn:sha256:[0-9a-f]{64}$" } + } + }, + "revisionRecordedAt": { "$ref": "#/definitions/timestamp" }, + "validTime": { + "type": "object", "additionalProperties": false, "required": ["notBefore"], + "properties": { "notBefore": { "$ref": "#/definitions/timestamp" }, "notAfter": { "$ref": "#/definitions/timestamp" } } + }, + "statusAtDecision": { + "type": "object", "additionalProperties": false, "required": ["status", "decisionTime"], + "properties": { "status": { "enum": ["active", "retired", "revoked", "superseded"] }, "decisionTime": { "$ref": "#/definitions/timestamp" } } + }, + "principal": { + "type": "object", "additionalProperties": false, "required": ["authenticatedPrincipalId"], + "properties": { "authenticatedPrincipalId": { "$ref": "#/definitions/opaqueId" }, "projectId": { "$ref": "#/definitions/opaqueId" }, "scopeId": { "$ref": "#/definitions/opaqueId" } } + }, + "target": { + "type": "object", "additionalProperties": false, "required": ["targetType", "targetId", "authenticatedPrincipalId"], + "properties": { + "targetType": { "enum": ["direct_session", "automation_run", "automation_attempt", "psyche_delegated_execution"] }, + "targetId": { "$ref": "#/definitions/opaqueId" }, + "authenticatedPrincipalId": { "$ref": "#/definitions/opaqueId" } + } + }, + "bindingPurpose": { "enum": ["dispatch", "session_creation", "historical_verification"] }, + "identityMeaning": { "const": "unchanged" }, + "issuedAt": { "$ref": "#/definitions/timestamp" }, + "decisionAt": { "$ref": "#/definitions/timestamp" }, + "policyVersion": { "type": "string", "minLength": 1 }, + "resolver": { "$ref": "#/definitions/actor" }, + "verifier": { "$ref": "#/definitions/actor" }, + "historicalVerification": { + "type": "object", "additionalProperties": false, "required": ["state", "readAuthorization"], + "properties": { "state": { "enum": ["verified", "degraded", "unavailable", "unverifiable"] }, "readAuthorization": { "enum": ["authorized", "not_authorized", "not_requested"] } } + }, + "revocation": { + "type": "object", "additionalProperties": false, "required": ["outcome"], + "properties": { "outcome": { "enum": ["none", "before_commit", "after_commit"] }, "revokedAt": { "$ref": "#/definitions/timestamp" } } + }, + "commit": { + "type": "object", "additionalProperties": false, "required": ["snapshotId", "state", "finalValidityCheckAt", "committedAt", "verifiedBindingDigest"], + "properties": { + "snapshotId": { "$ref": "#/definitions/opaqueId" }, "state": { "const": "committed" }, + "finalValidityCheckAt": { "$ref": "#/definitions/timestamp" }, "committedAt": { "$ref": "#/definitions/timestamp" }, + "verifiedBindingDigest": { "$ref": "#/definitions/hash" } + } + }, + "integrity": { + "type": "object", "additionalProperties": false, "required": ["algorithm", "canonicalization", "bindingDigest"], + "properties": { "algorithm": { "const": "sha-256" }, "canonicalization": { "const": "jcs-rfc8785" }, "bindingDigest": { "$ref": "#/definitions/hash" } } + }, + "authentication": { + "type": "object", "additionalProperties": false, "required": ["method", "signerId", "signature"], + "properties": { "method": { "enum": ["signature", "mTLS-attestation", "authenticated-channel"] }, "signerId": { "$ref": "#/definitions/opaqueId" }, "signature": { "type": "string", "minLength": 1 } } + }, + "privacy": { + "type": "object", "additionalProperties": false, "required": ["classification", "retention", "containsSensitiveIdentityContent"], + "properties": { "classification": { "const": "metadata-only" }, "retention": { "enum": ["dispatch-audit-minimum", "historical-verification-minimum"] }, "containsSensitiveIdentityContent": { "const": false } } + } + }, + "definitions": { + "opaqueId": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*:[A-Za-z0-9._:-]+$" }, + "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" }, + "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T" }, + "hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, + "digest": { + "type": "object", "additionalProperties": false, "required": ["algorithm", "value"], + "properties": { "algorithm": { "const": "sha-256" }, "value": { "$ref": "#/definitions/hash" } } + }, + "actor": { + "type": "object", "additionalProperties": false, "required": ["id", "version"], + "properties": { "id": { "$ref": "#/definitions/opaqueId" }, "version": { "$ref": "#/definitions/version" } } + } + } +} diff --git a/tests/conformance/README.md b/tests/conformance/README.md index c64d5c5..0d5365a 100644 --- a/tests/conformance/README.md +++ b/tests/conformance/README.md @@ -12,3 +12,8 @@ npm test Convention: `positive/-/` cases should PASS when run with `node validators/validate.js `. `negative/-/` cases should FAIL for the documented reason in that case's `CASE.md`. The `audit-records/` lane holds single-record JSON fixtures (not claimant directories) checked by `validators/check-audit-records.js` against `schemas/audit-record.schema.json`, including worked SHA-256 test-vector recomputation — see [`audit-records/README.md`](audit-records/README.md). Structural conformance for a claimant directory additionally requires `node validators/validate.js ` and `npm test`. A claim of v0.7.0 structural conformance = the claimant directory passes `node validators/validate.js ` and this fixture suite passes under `npm test`. + +`embodiment-bindings/` is a separate JSON-vector lane for the universal +`familiar.embodiment_binding.v1` profile. It exercises the semantic checks that +JSON Schema alone cannot express, including canonical digest recomputation, +lineage, eligibility, alias cardinality, and revocation-commit ordering. diff --git a/tests/conformance/embodiment-bindings/README.md b/tests/conformance/embodiment-bindings/README.md new file mode 100644 index 0000000..2d55617 --- /dev/null +++ b/tests/conformance/embodiment-bindings/README.md @@ -0,0 +1,12 @@ +# Embodiment-binding conformance vectors + +Each JSON file is one independently consumable +`familiar.embodiment_binding.v1` document. Run an individual vector with: + +```bash +node validators/validate.js --embodiment-binding path/to/vector.json +``` + +The `positive/` vectors are dispatch-eligible bindings or non-authority +historical records that must validate. The `negative/` vectors must fail +closed. The full set runs under `npm test`. diff --git a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json new file mode 100644 index 0000000..1bc32b1 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json @@ -0,0 +1,100 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-01-ambiguous-alias", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "f65c28ac630fb3be6954dd7296667e94594f74ed49bf911f193368b16c1992e3" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "f65c28ac630fb3be6954dd7296667e94594f74ed49bf911f193368b16c1992e3" + }, + "aliasResolution": { + "alias": "Sage", + "authoritative": false, + "resolvedRootIds": [ + "familiar-root:oak", + "familiar-root:ash" + ] + } +} diff --git a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json new file mode 100644 index 0000000..31c706e --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json @@ -0,0 +1,93 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-02-stale-cached-revision", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z", + "notAfter": "2026-09-03T08:59:59Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "f0c89e078e7ec61cde5a0e0aef3279ba1137376562f04c7bd3de649e0459e9ac" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "f0c89e078e7ec61cde5a0e0aef3279ba1137376562f04c7bd3de649e0459e9ac" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json new file mode 100644 index 0000000..b306236 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-03-revoked-revision", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "revoked", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "0ff168d9ba3b128178eec41507952c4f6452f1b5901ce742d42dbb4bc4a78dab" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "0ff168d9ba3b128178eec41507952c4f6452f1b5901ce742d42dbb4bc4a78dab" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json new file mode 100644 index 0000000..facd67c --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-04-retired-dispatch", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "131d91a548b550e0eb9aea94c3e080d135966ab1d7ea5fdaff7f02c7f5f29923" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "131d91a548b550e0eb9aea94c3e080d135966ab1d7ea5fdaff7f02c7f5f29923" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json new file mode 100644 index 0000000..18f2054 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-05-principal-mismatch", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:other" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "bff39c20083ee4dda4efd5520e541d45d77c4e4138ae4f40ee434263bb2c6dbf" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "bff39c20083ee4dda4efd5520e541d45d77c4e4138ae4f40ee434263bb2c6dbf" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json new file mode 100644 index 0000000..2bca30e --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-06-tampered-bundle-digest", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "0076ec4c6a4558ddc629d6840844e6c1420c9a16291fa5a53a0c9892fdd21e4e" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "0076ec4c6a4558ddc629d6840844e6c1420c9a16291fa5a53a0c9892fdd21e4e" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json new file mode 100644 index 0000000..bbe20d5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-07-degraded-history-dispatch", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "e5f3e79a57a203864aa52d45c83ada3275da9de72b48abaf821cf56159c97a33" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "e5f3e79a57a203864aa52d45c83ada3275da9de72b48abaf821cf56159c97a33" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json new file mode 100644 index 0000000..ca5edaf --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-08-unauthorized-history-dispatch", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "unavailable", + "readAuthorization": "not_authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "048a60ad00cce46558e347e6083552f15411855f4ff6fd044b31a4b64a64f35d" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "048a60ad00cce46558e347e6083552f15411855f4ff6fd044b31a4b64a64f35d" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json new file mode 100644 index 0000000..7e992e7 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json @@ -0,0 +1,93 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-09-revocation-before-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "before_commit", + "revokedAt": "2026-09-03T08:59:59Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "219c381e4dd539c2ee2f18710ba8a41b8111671b30d51d5724dd47f3bd2318ae" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "219c381e4dd539c2ee2f18710ba8a41b8111671b30d51d5724dd47f3bd2318ae" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json new file mode 100644 index 0000000..71d1a17 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json @@ -0,0 +1,93 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-10-unknown-field", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "79da9916bbdc50311ddee5c56e04a802d6affe59e957151236a5aa85f23ea2bb" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "79da9916bbdc50311ddee5c56e04a802d6affe59e957151236a5aa85f23ea2bb" + }, + "unknownField": "must-fail-closed" +} diff --git a/tests/conformance/embodiment-bindings/negative/11-malformed-structure.json b/tests/conformance/embodiment-bindings/negative/11-malformed-structure.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/11-malformed-structure.json @@ -0,0 +1 @@ +[] diff --git a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json new file mode 100644 index 0000000..e1bb9b2 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-12-tampered-binding-digest", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/01-active-direct.json b/tests/conformance/embodiment-bindings/positive/01-active-direct.json new file mode 100644 index 0000000..80fc57b --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/01-active-direct.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-active-direct-001", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "661a3c2676cf1f0b3ace41d20a550a008638ee21df3f62d3de3359b974a060fa" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "661a3c2676cf1f0b3ace41d20a550a008638ee21df3f62d3de3359b974a060fa" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json new file mode 100644 index 0000000..d3925db --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json @@ -0,0 +1,99 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-02-unique-alias-resolution", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "8c41a31d12a321abe617ec606f79efee79091f373c84ab65bb6a544e0ea3cedc" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "8c41a31d12a321abe617ec606f79efee79091f373c84ab65bb6a544e0ea3cedc" + }, + "aliasResolution": { + "alias": "Sage", + "authoritative": false, + "resolvedRootIds": [ + "familiar-root:oak" + ] + } +} diff --git a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json new file mode 100644 index 0000000..0b64706 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-03-retired-historical-record", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "3880592f9517927995f2c11b794738d8f0a55b1797166c97a256a333376ef8ee" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "3880592f9517927995f2c11b794738d8f0a55b1797166c97a256a333376ef8ee" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json new file mode 100644 index 0000000..1adc5a5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-04-restoration-with-lineage", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "restoration", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "retired" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "44ae3c488737c545be3a942809602235b7a65a0a659f8d54a2f5d7a236cc4046" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "44ae3c488737c545be3a942809602235b7a65a0a659f8d54a2f5d7a236cc4046" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json new file mode 100644 index 0000000..54dbc68 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-05-new-revision-same-familiar", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "7def8c04878dab4fb8c0c4fa740c96b1c744549cce976477cf6fd10ef7cc11e6" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "7def8c04878dab4fb8c0c4fa740c96b1c744549cce976477cf6fd10ef7cc11e6" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json new file mode 100644 index 0000000..392fe18 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-06-fork-new-root", + "familiar": { + "familiarRootId": "familiar-root:maple", + "identityRevisionId": "familiar-revision:maple:0", + "lineagePosition": 0, + "lineageEvidence": { + "relationship": "fork_new_root", + "rootEvidence": "fork", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "status": "active" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "a1482d3d96937513e4fec0e3b3d6c2c884dc687c85c147205bd87270fb3ed992" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "a1482d3d96937513e4fec0e3b3d6c2c884dc687c85c147205bd87270fb3ed992" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/07-succession.json b/tests/conformance/embodiment-bindings/positive/07-succession.json new file mode 100644 index 0000000..ac8f758 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/07-succession.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-07-succession", + "familiar": { + "familiarRootId": "familiar-root:willow", + "identityRevisionId": "familiar-revision:willow:0", + "lineagePosition": 0, + "lineageEvidence": { + "relationship": "succession", + "rootEvidence": "succession", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "status": "retired" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "6dc722cb84b604165d954ebead2f71efc45cd3806dac81c40789fc11f69264b8" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "6dc722cb84b604165d954ebead2f71efc45cd3806dac81c40789fc11f69264b8" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json new file mode 100644 index 0000000..9a9be57 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-08-direct-coven-session", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:direct-001", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "ba46879f93547b392a0c380249996ece0525e4352f177539b3cdad32c159822e" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "ba46879f93547b392a0c380249996ece0525e4352f177539b3cdad32c159822e" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json new file mode 100644 index 0000000..90b6c9e --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-09-scheduled-automation-run", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "automation_run", + "targetId": "automation-run:nightly-001", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "cbb764445e44cee1e93aadefc9cce4c2fb4d7c08c53620dd695b8dd7cddb6c1e" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "cbb764445e44cee1e93aadefc9cce4c2fb4d7c08c53620dd695b8dd7cddb6c1e" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json new file mode 100644 index 0000000..e1c5fea --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-10-scheduled-automation-attempt", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "automation_attempt", + "targetId": "automation-attempt:nightly-001-1", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "3a6ef7f0aca0d63a895ac88ece5dfe11d860e1676388aaf59d3658df5198ddae" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "3a6ef7f0aca0d63a895ac88ece5dfe11d860e1676388aaf59d3658df5198ddae" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json new file mode 100644 index 0000000..a2a1858 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-11-psyche-delegated-execution", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "psyche_delegated_execution", + "targetId": "psyche-execution:delegated-001", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "36dfd5aef6357fb9fd0f79f729bc59cd447ade8305b064e2d2ca8b5edc98bbbb" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "36dfd5aef6357fb9fd0f79f729bc59cd447ade8305b064e2d2ca8b5edc98bbbb" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json new file mode 100644 index 0000000..3b41847 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-12-degraded-historical-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "3c780189b15ccf06fab916c610564d8a36fa55396e8f4a8b33eba5d1dd382049" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "3c780189b15ccf06fab916c610564d8a36fa55396e8f4a8b33eba5d1dd382049" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json new file mode 100644 index 0000000..b51cbbe --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-13-privacy-authorized-historical-read", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "936015ca9c0a1dd2a1f8fde6d12f0798929dc60e3cef4045aa52cbd0eb7ea1d5" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "936015ca9c0a1dd2a1f8fde6d12f0798929dc60e3cef4045aa52cbd0eb7ea1d5" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json new file mode 100644 index 0000000..354df07 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json @@ -0,0 +1,92 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-14-privacy-unauthorized-read-denied", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "unavailable", + "readAuthorization": "not_authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "8afdae522a61b4000d01a3cb4fc079947e8705a84eac94f6d1746834b3263638" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "8afdae522a61b4000d01a3cb4fc079947e8705a84eac94f6d1746834b3263638" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json new file mode 100644 index 0000000..583e879 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json @@ -0,0 +1,93 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-15-revocation-after-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded" + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "after_commit", + "revokedAt": "2026-09-03T09:00:01Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "b4e512b1bcc8d986cd000ae48de41a7eb1d4e95afa9fe7fa72b83e12ba990f20" + }, + "authentication": { + "method": "signature", + "signerId": "authority:oak", + "signature": "attested:opaque" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "b4e512b1bcc8d986cd000ae48de41a7eb1d4e95afa9fe7fa72b83e12ba990f20" + } +} diff --git a/tests/conformance/run-conformance.sh b/tests/conformance/run-conformance.sh index 9a1d0a3..1a0b1fe 100755 --- a/tests/conformance/run-conformance.sh +++ b/tests/conformance/run-conformance.sh @@ -4,6 +4,9 @@ # For each negative/: `node validators/validate.js ` MUST exit non-zero # The audit-record lane: `node validators/check-audit-records.js` MUST exit 0 # (positive records validate + worked vectors recompute; negative records fail). +# The embodiment-binding lane: every positive JSON vector MUST pass +# `node validators/validate.js --embodiment-binding`, while every negative one +# MUST fail. # Reports counts and exits 0 only if all cases behave as expected. set -u @@ -24,7 +27,7 @@ run_case() { expected=$2 label=$3 - output_file=$(mktemp "${TMPDIR:-/tmp}/familiar-conformance.XXXXXX") + output_file="$SUITE_DIR/.conformance-output.$$" node "$VALIDATOR" "$case_path" >"$output_file" 2>&1 status=$? @@ -57,6 +60,44 @@ negative expected fail but passed: ${label}" rm -f "$output_file" } +run_binding_case() { + vector_path=$1 + expected=$2 + label=$3 + + output_file="$SUITE_DIR/.conformance-output.$$" + node "$VALIDATOR" --embodiment-binding "$vector_path" >"$output_file" 2>&1 + status=$? + + if [ "$expected" = "pass" ]; then + binding_positive_total=$((binding_positive_total + 1)) + if [ "$status" -eq 0 ]; then + binding_positive_passed=$((binding_positive_passed + 1)) + printf 'PASS expected: %s\n' "$label" + else + unexpected=$((unexpected + 1)) + details="${details} +embodiment positive expected pass but failed: ${label}" + printf 'UNEXPECTED fail: %s\n' "$label" + sed 's/^/ /' "$output_file" + fi + else + binding_negative_total=$((binding_negative_total + 1)) + if [ "$status" -ne 0 ]; then + binding_negative_failed=$((binding_negative_failed + 1)) + printf 'FAIL expected: %s\n' "$label" + else + unexpected=$((unexpected + 1)) + details="${details} +embodiment negative expected fail but passed: ${label}" + printf 'UNEXPECTED pass: %s\n' "$label" + sed 's/^/ /' "$output_file" + fi + fi + + rm -f "$output_file" +} + printf 'Familiar Contract conformance suite\n\n' for case_path in "$SUITE_DIR"/positive/*; do @@ -73,6 +114,23 @@ done printf '\n' +binding_positive_total=0 +binding_positive_passed=0 +binding_negative_total=0 +binding_negative_failed=0 + +for vector_path in "$SUITE_DIR"/embodiment-bindings/positive/*.json; do + [ -f "$vector_path" ] || continue + run_binding_case "$vector_path" "pass" "embodiment-bindings/positive/$(basename "$vector_path")" +done + +for vector_path in "$SUITE_DIR"/embodiment-bindings/negative/*.json; do + [ -f "$vector_path" ] || continue + run_binding_case "$vector_path" "fail" "embodiment-bindings/negative/$(basename "$vector_path")" +done + +printf '\n' + audit_records_status="READY" if ! node "$ROOT_DIR/validators/check-audit-records.js"; then audit_records_status="BROKEN" @@ -84,6 +142,8 @@ fi printf '\nResults:\n' printf ' positive: %s/%s passed\n' "$positive_passed" "$positive_total" printf ' negative: %s/%s failed correctly\n' "$negative_failed" "$negative_total" +printf ' embodiment positive: %s/%s passed\n' "$binding_positive_passed" "$binding_positive_total" +printf ' embodiment negative: %s/%s failed correctly\n' "$binding_negative_failed" "$binding_negative_total" printf ' audit-records: %s\n' "$audit_records_status" printf ' unexpected: %s\n' "$unexpected" diff --git a/validators/README.md b/validators/README.md index 5c2471e..e9d9e1e 100644 --- a/validators/README.md +++ b/validators/README.md @@ -11,6 +11,7 @@ A Node.js CLI that checks one claimant directory for the familiar-contract v0.7. ```bash node validators/validate.js +node validators/validate.js --embodiment-binding ``` ### Examples @@ -42,6 +43,7 @@ node validators/validate.js --help | `MEMORY.md` | Existence | Persistent Memory (required; missing is a violation) | | `audit/*.json` | Optional §5.6 audit-record samples validated against `schemas/audit-record.schema.json` (§5.6.1 hash encodings); absence of `audit/` is not a violation, a present-but-empty `audit/` is | Bounded Authority, Persistent Memory | | Cross-file | Name consistency between SOUL.md and ward.toml | Consistency | +| Embodiment binding | `familiar.embodiment_binding.v1` schema, canonical digest, lineage, dispatch eligibility, principal, alias, revocation, and immutable-commit semantics | Exact execution embodiment | ## Output @@ -81,6 +83,12 @@ There are no warnings for missing required files; `MEMORY.md` absence is a failu This validator checks whether one claimant directory satisfies the required file-level declarations for v0.7.0. That claimant-directory run is necessary, but not sufficient, for a structural-conformance claim: you must also run `bash tests/conformance/run-conformance.sh` so the bundled reference validator is shown to accept the positive fixtures and reject the negative fixtures for the same contract version. Full conformance additionally requires runtime Ward enforcement beyond this file-level check, and missing `MEMORY.md` is a violation, not a warning. +The explicit embodiment-binding mode validates one portable JSON record. It +fails closed for non-unique aliases, stale or non-active revisions, degraded +history used as current authority, principal mismatches, digest tampering, and +pre-commit revocation. It accepts degraded/unavailable history only as a +non-authority historical-verification record. + ## For CI Integration ```yaml diff --git a/validators/validate.js b/validators/validate.js index 2f35bde..e0f716f 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -21,6 +21,7 @@ const fs = require('fs'); const path = require('path'); const TOML = require('@iarna/toml'); const Ajv = require('ajv'); +const crypto = require('crypto'); // ── Helpers ────────────────────────────────────────────────────────────────── @@ -34,6 +35,132 @@ function violation(file, field, message) { return { file, field, message }; } +// ── familiar.embodiment_binding.v1 validation ─────────────────────────────── + +const embodimentBindingSchema = JSON.parse(fs.readFileSync( + path.join(__dirname, '..', 'schemas', 'familiar-embodiment-binding.schema.json'), 'utf8' +)); +const validateEmbodimentBindingSchema = new Ajv({ allErrors: true, strict: false }) + .compile(embodimentBindingSchema); + +function canonicalJson(value) { + if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`; + if (isObject(value)) { + return `{${Object.keys(value).sort().map(key => `${JSON.stringify(key)}:${canonicalJson(value[key])}`).join(',')}}`; + } + return JSON.stringify(value); +} + +function bindingDigest(binding) { + const committed = JSON.parse(JSON.stringify(binding)); + delete committed.integrity.bindingDigest; + delete committed.commit.verifiedBindingDigest; + return crypto.createHash('sha256').update(canonicalJson(committed), 'utf8').digest('hex'); +} + +function isTimestamp(value) { + return typeof value === 'string' && !Number.isNaN(Date.parse(value)); +} + +function validateEmbodimentBinding(binding, file) { + const violations = []; + if (!isObject(binding)) return [violation(file, 'shape', 'An embodiment binding must be one JSON object.')]; + if (!validateEmbodimentBindingSchema(binding)) { + return (validateEmbodimentBindingSchema.errors || []).map(error => + violation(file, `schema ${error.instancePath || '/'} [${error.keyword}]`, error.message || 'schema violation') + ); + } + + const { familiar, identityBundle, statusAtDecision, principal, target, historicalVerification, revocation, commit, integrity } = binding; + const times = [binding.revisionRecordedAt, binding.validTime.notBefore, binding.validTime.notAfter, + statusAtDecision.decisionTime, binding.issuedAt, binding.decisionAt, commit.finalValidityCheckAt, commit.committedAt, + revocation.revokedAt].filter(Boolean); + if (times.some(value => !isTimestamp(value))) violations.push(violation(file, 'timestamps', 'All present timestamps must be valid RFC 3339 date-times.')); + const at = value => new Date(value).getTime(); + + if (identityBundle.historicalBundleRef !== `urn:sha256:${identityBundle.bundleDigest.value}`) { + violations.push(violation(file, 'identityBundle.historicalBundleRef', 'The content-addressed historical bundle reference must exactly carry bundleDigest.value.')); + } + if (integrity.bindingDigest !== bindingDigest(binding)) { + violations.push(violation(file, 'integrity.bindingDigest', 'The SHA-256 digest of the JCS-canonical binding bytes (with integrity.bindingDigest and the redundant commit verification omitted) does not match.')); + } + if (commit.verifiedBindingDigest !== integrity.bindingDigest) { + violations.push(violation(file, 'commit.verifiedBindingDigest', 'The immutable commit must verify the exact committed binding digest.')); + } + if (binding.aliasResolution) { + const roots = binding.aliasResolution.resolvedRootIds; + if (roots.length !== 1 || roots[0] !== familiar.familiarRootId) { + violations.push(violation(file, 'aliasResolution', 'Aliases are non-authoritative evidence and must resolve to exactly the declared familiar root.')); + } + } + if (principal.authenticatedPrincipalId !== target.authenticatedPrincipalId) { + violations.push(violation(file, 'target.authenticatedPrincipalId', 'The target principal must equal the authenticated binding principal.')); + } + if (isTimestamp(binding.revisionRecordedAt) && isTimestamp(binding.decisionAt) && at(binding.revisionRecordedAt) > at(binding.decisionAt)) { + violations.push(violation(file, 'revisionRecordedAt', 'The revision cannot be recorded after the binding decision.')); + } + if (isTimestamp(binding.validTime.notBefore) && isTimestamp(binding.decisionAt) && at(binding.validTime.notBefore) > at(binding.decisionAt)) { + violations.push(violation(file, 'validTime.notBefore', 'The revision is not yet valid at the decision time.')); + } + if (binding.validTime.notAfter && isTimestamp(binding.validTime.notAfter) && isTimestamp(binding.decisionAt) && at(binding.validTime.notAfter) < at(binding.decisionAt)) { + violations.push(violation(file, 'validTime.notAfter', 'The revision is stale at the decision time.')); + } + if (isTimestamp(commit.finalValidityCheckAt) && isTimestamp(commit.committedAt) && at(commit.finalValidityCheckAt) > at(commit.committedAt)) { + violations.push(violation(file, 'commit', 'The final validity check and binding commit must share an immutable snapshot boundary; the check cannot follow commit.')); + } + + const lineage = familiar.lineageEvidence; + const predecessor = lineage.predecessor; + if (lineage.relationship === 'genesis' && (familiar.lineagePosition !== 0 || lineage.rootEvidence !== 'genesis' || predecessor)) { + violations.push(violation(file, 'familiar.lineageEvidence', 'Genesis requires position 0, genesis root evidence, and no predecessor.')); + } + if (['same_familiar_revision', 'restoration'].includes(lineage.relationship)) { + if (!predecessor || lineage.rootEvidence !== 'continued' || predecessor.familiarRootId !== familiar.familiarRootId || + predecessor.lineagePosition !== familiar.lineagePosition - 1) { + violations.push(violation(file, 'familiar.lineageEvidence', 'Same-familiar continuation/restoration requires the immediately preceding revision on the same root.')); + } + } + if (lineage.relationship === 'restoration' && (!predecessor || predecessor.status !== 'retired')) { + violations.push(violation(file, 'familiar.lineageEvidence', 'Restoration requires a retired predecessor on the same familiar root.')); + } + if (['fork_new_root', 'succession'].includes(lineage.relationship) && + (!predecessor || familiar.lineagePosition !== 0 || predecessor.familiarRootId === familiar.familiarRootId || + lineage.rootEvidence !== (lineage.relationship === 'fork_new_root' ? 'fork' : 'succession'))) { + violations.push(violation(file, 'familiar.lineageEvidence', 'Fork/new-root and succession require position 0, a distinct predecessor root, and matching root evidence.')); + } + + const isAuthorityAttempt = ['dispatch', 'session_creation'].includes(binding.bindingPurpose); + if (isAuthorityAttempt && statusAtDecision.status !== 'active') { + violations.push(violation(file, 'statusAtDecision.status', 'Only an active revision is eligible for a new dispatch or session creation.')); + } + if (isAuthorityAttempt && historicalVerification.state !== 'verified') { + violations.push(violation(file, 'historicalVerification.state', 'Degraded, unavailable, or unverifiable history is never authority for a new dispatch.')); + } + if (historicalVerification.readAuthorization === 'not_authorized' && + (historicalVerification.state !== 'unavailable' || binding.bindingPurpose !== 'historical_verification')) { + violations.push(violation(file, 'historicalVerification', 'An unauthorized historical read must be recorded as unavailable historical verification, never as dispatch authority.')); + } + if (revocation.outcome === 'before_commit') { + violations.push(violation(file, 'revocation', 'A revocation observed before commit must fail closed and cannot produce a binding.')); + } + if (revocation.outcome === 'after_commit') { + if (!revocation.revokedAt || !isTimestamp(revocation.revokedAt) || !isTimestamp(commit.committedAt) || at(revocation.revokedAt) <= at(commit.committedAt)) { + violations.push(violation(file, 'revocation', 'An after-commit revocation must be timestamped strictly after the immutable commit.')); + } + } + return violations; +} + +function validateEmbodimentBindingFile(filePath) { + let binding; + try { + binding = JSON.parse(fs.readFileSync(filePath, 'utf8')); + } catch (error) { + return [violation(filePath, 'syntax', `JSON syntax violation: ${error.message}`)]; + } + return validateEmbodimentBinding(binding, filePath); +} + // ── SOUL.md parser ──────────────────────────────────────────────────────────── // SOUL.md is a Markdown file with conventions-based structure. // We check for required sections/patterns, not strict frontmatter. @@ -420,6 +547,7 @@ ${bold('familiar-contract validator')} — checks a familiar directory for spec ${bold('Usage:')} npm install node validate.js + node validate.js --embodiment-binding ${bold('Examples:')} node validate.js examples/sage @@ -433,6 +561,7 @@ ${bold('Checks:')} • MEMORY.md — Persistent Memory (required; missing is a violation) • audit/*.json — Optional §5.6 audit-record samples (JSON Schema; §5.6.1 hash encodings) • Cross-file — Name consistency between SOUL.md and ward.toml + • Embodiment binding — exact root/revision dispatch binding and its integrity ${bold('Exit codes:')} 0 — PASS (all checks pass) @@ -441,6 +570,28 @@ ${bold('Exit codes:')} process.exit(0); } + if (args[0] === '--embodiment-binding') { + if (args.length !== 2) { + console.error(red('Error: --embodiment-binding requires exactly one JSON file path.')); + process.exit(1); + } + const filePath = path.resolve(args[1]); + if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile()) { + console.error(red(`Error: Binding file not found: ${filePath}`)); + process.exit(1); + } + const bindingViolations = validateEmbodimentBindingFile(filePath); + if (bindingViolations.length === 0) { + console.log(green(bold('✓ PASS')) + ' — Embodiment binding validation passed.'); + process.exit(0); + } + console.log(red(bold(`✗ FAIL`)) + ` — ${bindingViolations.length} embodiment-binding violation${bindingViolations.length !== 1 ? 's' : ''}:`); + for (const v of bindingViolations) { + console.log(` ${red('✗')} ${bold(v.field)}\n ${v.message}`); + } + process.exit(1); + } + const dirPath = path.resolve(args[0]); if (!fs.existsSync(dirPath)) { From f118cdb8c05988a9d2f375396b8b8be3c690471a Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:21:17 -0500 Subject: [PATCH 02/16] fix: verify embodiment binding evidence Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- CHANGELOG.md | 9 +- README.md | 1 + rfcs/RFC-0001-familiar-contract.md | 44 +++++ .../familiar-embodiment-binding.schema.json | 36 ++-- schemas/familiar-identity-bundle.schema.json | 49 +++++ tests/conformance/README.md | 5 + .../bundles/01-active-direct.json | 58 ++++++ .../bundles/01-ambiguous-alias.json | 58 ++++++ .../bundles/02-stale-cached-revision.json | 58 ++++++ .../bundles/02-unique-alias-resolution.json | 58 ++++++ .../bundles/03-retired-historical-record.json | 58 ++++++ .../bundles/03-revoked-revision.json | 58 ++++++ .../bundles/04-restoration-with-lineage.json | 58 ++++++ .../bundles/04-retired-dispatch.json | 58 ++++++ .../05-new-revision-same-familiar.json | 58 ++++++ .../bundles/05-principal-mismatch.json | 58 ++++++ .../bundles/06-fork-new-root.json | 58 ++++++ .../bundles/06-tampered-bundle-digest.json | 58 ++++++ .../bundles/07-succession.json | 58 ++++++ .../bundles/08-direct-coven-session.json | 58 ++++++ .../bundles/09-revocation-before-commit.json | 58 ++++++ .../bundles/09-scheduled-automation-run.json | 58 ++++++ .../10-scheduled-automation-attempt.json | 58 ++++++ .../bundles/10-unknown-field.json | 58 ++++++ .../11-psyche-delegated-execution.json | 58 ++++++ .../bundles/12-tampered-binding-digest.json | 58 ++++++ ...3-cached-superseded-apparently-active.json | 58 ++++++ ...13-privacy-authorized-historical-read.json | 58 ++++++ .../14-unverifiable-authentication.json | 58 ++++++ .../bundles/15-lineage-self-predecessor.json | 58 ++++++ .../bundles/15-revocation-after-commit.json | 58 ++++++ .../bundles/16-timezone-missing.json | 58 ++++++ .../bundles/17-malformed-calendar-time.json | 58 ++++++ .../bundles/18-tombstone-without-purge.json | 58 ++++++ .../20-revocation-at-commit-outcome-none.json | 58 ++++++ .../embodiment-bindings/manifest.json | 9 + .../negative/01-ambiguous-alias.json | 38 +++- .../negative/02-stale-cached-revision.json | 38 +++- .../negative/03-revoked-revision.json | 38 +++- .../negative/04-retired-dispatch.json | 38 +++- .../negative/05-principal-mismatch.json | 38 +++- .../negative/06-tampered-bundle-digest.json | 38 +++- .../07-degraded-history-dispatch.json | 38 +++- .../08-unauthorized-history-dispatch.json | 38 +++- .../negative/09-revocation-before-commit.json | 38 +++- .../negative/10-unknown-field.json | 40 +++- .../negative/12-tampered-binding-digest.json | 34 +++- ...3-cached-superseded-apparently-active.json | 112 +++++++++++ .../14-unverifiable-authentication.json | 112 +++++++++++ .../negative/15-lineage-self-predecessor.json | 112 +++++++++++ .../negative/16-timezone-missing.json | 112 +++++++++++ .../negative/17-malformed-calendar-time.json | 112 +++++++++++ .../negative/18-tombstone-without-purge.json | 112 +++++++++++ .../19-verified-history-missing-bundle.json | 112 +++++++++++ .../20-revocation-at-commit-outcome-none.json | 113 +++++++++++ .../positive/01-active-direct.json | 38 +++- .../positive/02-unique-alias-resolution.json | 38 +++- .../03-retired-historical-record.json | 38 +++- .../positive/04-restoration-with-lineage.json | 38 +++- .../05-new-revision-same-familiar.json | 38 +++- .../positive/06-fork-new-root.json | 38 +++- .../positive/07-succession.json | 38 +++- .../positive/08-direct-coven-session.json | 38 +++- .../positive/09-scheduled-automation-run.json | 38 +++- .../10-scheduled-automation-attempt.json | 38 +++- .../11-psyche-delegated-execution.json | 38 +++- .../12-degraded-historical-bundle.json | 38 +++- ...13-privacy-authorized-historical-read.json | 38 +++- .../14-privacy-unauthorized-read-denied.json | 38 +++- .../positive/15-revocation-after-commit.json | 38 +++- .../16-unverifiable-historical-bundle.json | 112 +++++++++++ tests/conformance/run-conformance.sh | 34 +++- validators/README.md | 13 ++ validators/validate.js | 180 ++++++++++++++---- 74 files changed, 3773 insertions(+), 284 deletions(-) create mode 100644 schemas/familiar-identity-bundle.schema.json create mode 100644 tests/conformance/embodiment-bindings/bundles/01-active-direct.json create mode 100644 tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json create mode 100644 tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json create mode 100644 tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json create mode 100644 tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json create mode 100644 tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json create mode 100644 tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json create mode 100644 tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json create mode 100644 tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json create mode 100644 tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json create mode 100644 tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json create mode 100644 tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json create mode 100644 tests/conformance/embodiment-bindings/bundles/07-succession.json create mode 100644 tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json create mode 100644 tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json create mode 100644 tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json create mode 100644 tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json create mode 100644 tests/conformance/embodiment-bindings/bundles/10-unknown-field.json create mode 100644 tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json create mode 100644 tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json create mode 100644 tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json create mode 100644 tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json create mode 100644 tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json create mode 100644 tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json create mode 100644 tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json create mode 100644 tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json create mode 100644 tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json create mode 100644 tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json create mode 100644 tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json create mode 100644 tests/conformance/embodiment-bindings/manifest.json create mode 100644 tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json create mode 100644 tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json create mode 100644 tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json create mode 100644 tests/conformance/embodiment-bindings/negative/16-timezone-missing.json create mode 100644 tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json create mode 100644 tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json create mode 100644 tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json create mode 100644 tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json create mode 100644 tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json diff --git a/CHANGELOG.md b/CHANGELOG.md index ff14887..6364bd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,14 @@ This project uses [Semantic Versioning](https://semver.org/). lineage, revision status and validity, alias cardinality, principal consistency, historical-read privacy, revocation races, and immutable final-check/commit verification fail closed. -- **Embodiment-binding conformance lane** — 15 positive and 12 negative +- **Detached historical bundles and cryptographic verification** — + `familiar.identity_bundle.v1` retains canonical identity/soul (and optional + Ward) components under restricted verifier access; the validator recomputes + component/bundle digests and verifies non-circular Ed25519 attestations. + Resolution snapshots, strict RFC 3339 timestamps, authenticated lineage + edges, retention tombstone/purge evidence, and a fixed error-code conformance + manifest close stale-cache and vector-integrity gaps. +- **Embodiment-binding conformance lane** — 16 positive and 20 negative vectors covering active, retired/restored, continuation, fork, succession, direct/automation/Psyche targets, degraded history, privacy authorization, tampering, ambiguity, stale/revoked revisions, and malformed data. diff --git a/README.md b/README.md index d7d9e8d..1bdbcdf 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ schemas/ ward.schema.json ← JSON Schema for ward.toml role.schema.json ← JSON Schema for ROLE.md familiar-embodiment-binding.schema.json ← Exact root/revision execution binding + familiar-identity-bundle.schema.json ← Detached retained historical identity bundle examples/ sage/ ← Sage (canonical structurally conformant familiar directory) minimal/ ← Lumen (minimal structurally conformant familiar directory) diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 93807ae..84dd95d 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -515,6 +515,17 @@ relationships, credentials, or other sensitive contents: opaque identifiers and digests are the default. `privacy.classification` is therefore `metadata-only`, with an explicit minimum-retention class. +The independently consumable detached historical record is +`familiar.identity_bundle.v1`, defined by +[`schemas/familiar-identity-bundle.schema.json`](../schemas/familiar-identity-bundle.schema.json). +It **MUST** retain canonical JSON identity- and soul-declaration components +(and MAY retain a Ward declaration), their individual SHA-256 digests, its +root/revision/position, and a SHA-256 digest of the canonical bundle. A +verifier supplied this bundle **MUST** recompute every component and bundle +digest, then match them to the binding declaration digest, bundle digest, and +URN. A missing bundle is distinguishable from a present bundle; only the former +may yield explicit `degraded`, `unavailable`, or `unverifiable` history. + `lineageEvidence` **MUST** distinguish genesis, same-familiar revision, restoration, fork/new-root, and succession. A continuation has the immediately preceding position and same root; restoration additionally follows a retired @@ -531,6 +542,15 @@ and resolver/verifier identities. `identityMeaning` **MUST** be `unchanged`; the purpose only contextualizes embodiment and cannot alter identity meaning. The target's principal **MUST** equal the authenticated principal. +All recorded, valid, resolution, decision, final-check, commit, issue, and +revocation times **MUST** be strict RFC 3339 calendar times with a `Z` or +numeric offset. Recorded time describes when evidence was observed; valid time +describes when the revision was eligible and the two are not interchangeable. +The resolution snapshot **MUST** bind root, revision, lineage position, bundle +digest, and status; its snapshot id **MUST** be the final-check/commit snapshot. +Resolution precedes final validity check, which precedes decision, commit, and +issuance; the decision timestamp and `statusAtDecision.decisionTime` are equal. + Aliases are non-authoritative resolution evidence only. When an alias is used, resolution **MUST** yield exactly one root, and that root **MUST** equal the recorded root. Ambiguity, stale cache, malformed or tampered digest, invalid or @@ -547,6 +567,20 @@ restoration lineage. Historical verification may be `verified`, `degraded`, dispatch. An unauthorized historical read **MUST** be recorded as unavailable historical verification, not treated as authority. +`authentication` **MUST** be a Node-core-verifiable Ed25519 public-key +attestation: DER/SPKI public key and base64 signature over the hexadecimal +SHA-256 binding digest. The binding digest is calculated from JCS canonical +binding bytes with the entire `integrity` and `authentication` members omitted +(and the redundant commit digest-verification field omitted). No private key +appears in either profile. An invalid encoding or unverifiable signature +**MUST** fail closed for dispatch and session creation. + +Lineage predecessors **MUST** name a content-addressed predecessor bundle and +an authenticated Ed25519 transition edge. The verifier **MUST** reject a +self-predecessor, repeated/non-monotonic position, root/revision mismatch, or +relation/root-evidence mismatch. Thus continuation, restoration, fork/new-root, +and succession are mechanically—not merely narratively—distinct. + The resolver and verifier **MUST** perform the final eligibility check and immutable binding commit on the same snapshot/transaction boundary. The committed binding digest **MUST** recompute from JCS canonical bytes (excluding @@ -557,6 +591,16 @@ not rewrite that historical binding, but prevents later dispatches. Integrity and authenticated attestation are mandatory, while cryptographic key-policy verification remains the verifier's policy responsibility. +Retention is lifecycle evidence, not a license to replicate identity content. +The binding carries metadata-only classification plus retention time, +tombstone/erasure state, and replica/device-purge state; a tombstoned or erased +record **MUST** carry erasure evidence, and requested replica or device +revocation **MUST** remain pending or complete rather than disappear. The +detached bundle records restricted-historical-identity classification and +authorized/denied verifier access. A denied reader **MUST NOT** receive +component content and records unavailable history. Tombstone, erasure, or purge +does not alter already-recorded time or valid-time facts. + ## 11. Changelog ### v0.7.0 (2026-07-26) diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index d927fca..2aacfc6 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -5,7 +5,7 @@ "description": "A privacy-minimized, versioned dispatch or historical-verification record proving the exact stable familiar root and identity revision embodied by one concrete execution. It is not a scheduler lifecycle record or protected-action authorization.", "type": "object", "additionalProperties": false, - "required": ["profile", "schemaVersion", "bindingId", "familiar", "identityBundle", "revisionRecordedAt", "validTime", "statusAtDecision", "principal", "target", "bindingPurpose", "identityMeaning", "issuedAt", "decisionAt", "policyVersion", "resolver", "verifier", "historicalVerification", "revocation", "commit", "integrity", "authentication", "privacy"], + "required": ["profile", "schemaVersion", "bindingId", "familiar", "resolutionSnapshot", "identityBundle", "revisionRecordedAt", "validTime", "statusAtDecision", "principal", "target", "bindingPurpose", "identityMeaning", "issuedAt", "decisionAt", "policyVersion", "resolver", "verifier", "historicalVerification", "revocation", "commit", "integrity", "authentication", "privacy"], "properties": { "profile": { "const": "familiar.embodiment_binding.v1" }, "schemaVersion": { "$ref": "#/definitions/version" }, @@ -16,7 +16,7 @@ "properties": { "familiarRootId": { "$ref": "#/definitions/opaqueId" }, "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, - "lineagePosition": { "type": "integer", "minimum": 0 }, + "lineagePosition": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "lineageEvidence": { "type": "object", "additionalProperties": false, "required": ["relationship", "rootEvidence"], @@ -25,18 +25,29 @@ "rootEvidence": { "enum": ["genesis", "continued", "fork", "succession"] }, "predecessor": { "type": "object", "additionalProperties": false, - "required": ["familiarRootId", "identityRevisionId", "lineagePosition", "status"], + "required": ["familiarRootId", "identityRevisionId", "lineagePosition", "status", "identityBundleRef", "transition"], "properties": { "familiarRootId": { "$ref": "#/definitions/opaqueId" }, "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, - "lineagePosition": { "type": "integer", "minimum": 0 }, - "status": { "enum": ["active", "retired", "revoked", "superseded"] } + "lineagePosition": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "status": { "enum": ["active", "retired", "revoked", "superseded"] }, + "identityBundleRef": { "type": "string", "pattern": "^urn:sha256:[0-9a-f]{64}$" }, + "transition": { "$ref": "#/definitions/authentication" } } } } } } }, + "resolutionSnapshot": { + "type": "object", "additionalProperties": false, + "required": ["snapshotId", "resolvedAt", "familiarRootId", "identityRevisionId", "lineagePosition", "bundleDigest", "status"], + "properties": { + "snapshotId": { "$ref": "#/definitions/opaqueId" }, "resolvedAt": { "$ref": "#/definitions/timestamp" }, "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, "lineagePosition": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "bundleDigest": { "$ref": "#/definitions/hash" }, "status": { "enum": ["active", "retired", "revoked", "superseded"] } + } + }, "aliasResolution": { "type": "object", "additionalProperties": false, "required": ["alias", "authoritative", "resolvedRootIds"], @@ -104,19 +115,16 @@ "type": "object", "additionalProperties": false, "required": ["algorithm", "canonicalization", "bindingDigest"], "properties": { "algorithm": { "const": "sha-256" }, "canonicalization": { "const": "jcs-rfc8785" }, "bindingDigest": { "$ref": "#/definitions/hash" } } }, - "authentication": { - "type": "object", "additionalProperties": false, "required": ["method", "signerId", "signature"], - "properties": { "method": { "enum": ["signature", "mTLS-attestation", "authenticated-channel"] }, "signerId": { "$ref": "#/definitions/opaqueId" }, "signature": { "type": "string", "minLength": 1 } } - }, + "authentication": { "$ref": "#/definitions/authentication" }, "privacy": { - "type": "object", "additionalProperties": false, "required": ["classification", "retention", "containsSensitiveIdentityContent"], - "properties": { "classification": { "const": "metadata-only" }, "retention": { "enum": ["dispatch-audit-minimum", "historical-verification-minimum"] }, "containsSensitiveIdentityContent": { "const": false } } + "type": "object", "additionalProperties": false, "required": ["classification", "retention", "containsSensitiveIdentityContent", "recordedAt", "tombstoneState", "replicaPurgeState"], + "properties": { "classification": { "const": "metadata-only" }, "retention": { "enum": ["dispatch-audit-minimum", "historical-verification-minimum"] }, "containsSensitiveIdentityContent": { "const": false }, "recordedAt": { "$ref": "#/definitions/timestamp" }, "tombstoneState": { "enum": ["live", "tombstoned", "erased"] }, "replicaPurgeState": { "enum": ["not_requested", "pending", "complete"] }, "erasureEvidence": { "type": "string", "minLength": 1 }, "deviceRevocationEvidence": { "type": "string", "minLength": 1 } } } }, "definitions": { "opaqueId": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*:[A-Za-z0-9._:-]+$" }, "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" }, - "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T" }, + "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$" }, "hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "digest": { "type": "object", "additionalProperties": false, "required": ["algorithm", "value"], @@ -126,5 +134,9 @@ "type": "object", "additionalProperties": false, "required": ["id", "version"], "properties": { "id": { "$ref": "#/definitions/opaqueId" }, "version": { "$ref": "#/definitions/version" } } } + ,"authentication": { + "type": "object", "additionalProperties": false, "required": ["method", "signerId", "publicKey", "signature"], + "properties": { "method": { "const": "ed25519" }, "signerId": { "$ref": "#/definitions/opaqueId" }, "publicKey": { "type": "string", "pattern": "^[A-Za-z0-9+/]+={0,2}$" }, "signature": { "type": "string", "pattern": "^[A-Za-z0-9+/]+={0,2}$" } } + } } } diff --git a/schemas/familiar-identity-bundle.schema.json b/schemas/familiar-identity-bundle.schema.json new file mode 100644 index 0000000..3438331 --- /dev/null +++ b/schemas/familiar-identity-bundle.schema.json @@ -0,0 +1,49 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/OpenCoven/familiar-contract/schemas/familiar-identity-bundle.schema.json", + "title": "Familiar Historical Identity Bundle v1", + "type": "object", + "additionalProperties": false, + "required": ["profile", "canonicalization", "familiarRootId", "identityRevisionId", "lineagePosition", "recordedAt", "components", "bundleDigest", "retention"], + "properties": { + "profile": { "const": "familiar.identity_bundle.v1" }, + "canonicalization": { "const": "jcs-rfc8785" }, + "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, + "lineagePosition": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, + "recordedAt": { "$ref": "#/definitions/timestamp" }, + "components": { + "type": "array", "minItems": 2, + "items": { + "type": "object", "additionalProperties": false, + "required": ["componentId", "mediaType", "content", "digest"], + "properties": { + "componentId": { "enum": ["identity-declaration", "soul-declaration", "ward-declaration"] }, + "mediaType": { "const": "application/json" }, + "content": { "type": "object" }, + "digest": { "$ref": "#/definitions/digest" } + } + } + }, + "bundleDigest": { "$ref": "#/definitions/digest" }, + "retention": { + "type": "object", "additionalProperties": false, + "required": ["classification", "verifierAccess", "recordedAt", "tombstoneState", "replicaPurgeState"], + "properties": { + "classification": { "const": "restricted-historical-identity" }, + "verifierAccess": { "enum": ["authorized", "denied"] }, + "recordedAt": { "$ref": "#/definitions/timestamp" }, + "tombstoneState": { "enum": ["live", "tombstoned", "erased"] }, + "replicaPurgeState": { "enum": ["not_requested", "pending", "complete"] }, + "erasureEvidence": { "type": "string", "minLength": 1 }, + "deviceRevocationEvidence": { "type": "string", "minLength": 1 } + } + } + }, + "definitions": { + "opaqueId": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*:[A-Za-z0-9._:-]+$" }, + "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$" }, + "hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, + "digest": { "type": "object", "additionalProperties": false, "required": ["algorithm", "value"], "properties": { "algorithm": { "const": "sha-256" }, "value": { "$ref": "#/definitions/hash" } } } + } +} diff --git a/tests/conformance/README.md b/tests/conformance/README.md index 0d5365a..3168551 100644 --- a/tests/conformance/README.md +++ b/tests/conformance/README.md @@ -17,3 +17,8 @@ A claim of v0.7.0 structural conformance = the claimant directory passes `node v `familiar.embodiment_binding.v1` profile. It exercises the semantic checks that JSON Schema alone cannot express, including canonical digest recomputation, lineage, eligibility, alias cardinality, and revocation-commit ordering. +`embodiment-bindings/manifest.json` is a required fixed inventory: the runner +fails if a mandatory vector is missing, added without registration, or rejects +for a reason other than its listed semantic error code. Detached identity +bundles in `embodiment-bindings/bundles/` exercise retained-component digest +recomputation and Ed25519 attestation without private-key material. diff --git a/tests/conformance/embodiment-bindings/bundles/01-active-direct.json b/tests/conformance/embodiment-bindings/bundles/01-active-direct.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/01-active-direct.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json b/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json b/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json new file mode 100644 index 0000000..5a22671 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:maple", + "identityRevisionId": "familiar-revision:maple:0", + "lineagePosition": 0, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:maple", + "identityRevisionId": "familiar-revision:maple:0", + "lineagePosition": 0, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "e97cb110eb3ded123930545fe90cb20ce705c61419aa11f5a23f7f447e4ed079" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json new file mode 100644 index 0000000..d8b3fd7 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Tampered" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/07-succession.json b/tests/conformance/embodiment-bindings/bundles/07-succession.json new file mode 100644 index 0000000..8855ab2 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/07-succession.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:willow", + "identityRevisionId": "familiar-revision:willow:0", + "lineagePosition": 0, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:willow", + "identityRevisionId": "familiar-revision:willow:0", + "lineagePosition": 0, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "b4ce2e6913e66f082a0974207a12067ca850b0585fbc8ae8abc2d39a57d39504" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json b/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json b/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json b/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json new file mode 100644 index 0000000..538dc7c --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json @@ -0,0 +1,58 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + } + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + } + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + } + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + } +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json new file mode 100644 index 0000000..c31dc22 --- /dev/null +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -0,0 +1,9 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "positive": [ + {"expected":"positive","file":"01-active-direct.json","errorCode":null},{"expected":"positive","file":"02-unique-alias-resolution.json","errorCode":null},{"expected":"positive","file":"03-retired-historical-record.json","errorCode":null},{"expected":"positive","file":"04-restoration-with-lineage.json","errorCode":null},{"expected":"positive","file":"05-new-revision-same-familiar.json","errorCode":null},{"expected":"positive","file":"06-fork-new-root.json","errorCode":null},{"expected":"positive","file":"07-succession.json","errorCode":null},{"expected":"positive","file":"08-direct-coven-session.json","errorCode":null},{"expected":"positive","file":"09-scheduled-automation-run.json","errorCode":null},{"expected":"positive","file":"10-scheduled-automation-attempt.json","errorCode":null},{"expected":"positive","file":"11-psyche-delegated-execution.json","errorCode":null},{"expected":"positive","file":"12-degraded-historical-bundle.json","errorCode":null},{"expected":"positive","file":"13-privacy-authorized-historical-read.json","errorCode":null},{"expected":"positive","file":"14-privacy-unauthorized-read-denied.json","errorCode":null},{"expected":"positive","file":"15-revocation-after-commit.json","errorCode":null},{"expected":"positive","file":"16-unverifiable-historical-bundle.json","errorCode":null} + ], + "negative": [ + {"expected":"negative","file":"01-ambiguous-alias.json","errorCode":"E_ALIAS"},{"expected":"negative","file":"02-stale-cached-revision.json","errorCode":"E_STALE"},{"expected":"negative","file":"03-revoked-revision.json","errorCode":"E_STATUS"},{"expected":"negative","file":"04-retired-dispatch.json","errorCode":"E_STATUS"},{"expected":"negative","file":"05-principal-mismatch.json","errorCode":"E_PRINCIPAL"},{"expected":"negative","file":"06-tampered-bundle-digest.json","errorCode":"E_COMPONENT_DIGEST"},{"expected":"negative","file":"07-degraded-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"08-unauthorized-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"09-revocation-before-commit.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"10-unknown-field.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"11-malformed-structure.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"12-tampered-binding-digest.json","errorCode":"E_BINDING_DIGEST"},{"expected":"negative","file":"13-cached-superseded-apparently-active.json","errorCode":"E_SNAPSHOT"},{"expected":"negative","file":"14-unverifiable-authentication.json","errorCode":"E_AUTHENTICATION"},{"expected":"negative","file":"15-lineage-self-predecessor.json","errorCode":"E_LINEAGE"},{"expected":"negative","file":"16-timezone-missing.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"17-malformed-calendar-time.json","errorCode":"E_TIMESTAMP"},{"expected":"negative","file":"18-tombstone-without-purge.json","errorCode":"E_RETENTION"},{"expected":"negative","file":"19-verified-history-missing-bundle.json","errorCode":"E_BUNDLE_MISSING"},{"expected":"negative","file":"20-revocation-at-commit-outcome-none.json","errorCode":"E_REVOCATION"} + ] +} diff --git a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json index 1bc32b1..de88eaf 100644 --- a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json +++ b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,24 +77,28 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "f65c28ac630fb3be6954dd7296667e94594f74ed49bf911f193368b16c1992e3" + "bindingDigest": "b49f07cfa67836556be417683b4c86a837aaf08e57157bab266c44f25ad5102a" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "wBqKzTRoreQNhAB22eEWcJUukRIcj9ajvX4z85B5E7V0j8OkoTCccd/uz7qxcywZHEQ2DAr7QcmfhskNIlo6AA==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "f65c28ac630fb3be6954dd7296667e94594f74ed49bf911f193368b16c1992e3" + "verifiedBindingDigest": "b49f07cfa67836556be417683b4c86a837aaf08e57157bab266c44f25ad5102a" }, "aliasResolution": { "alias": "Sage", @@ -96,5 +107,14 @@ "familiar-root:oak", "familiar-root:ash" ] + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json index 31c706e..a34d493 100644 --- a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json +++ b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -71,23 +78,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "f0c89e078e7ec61cde5a0e0aef3279ba1137376562f04c7bd3de649e0459e9ac" + "bindingDigest": "551d4d71952a9b00aa3e9c46fe26045d4cfcf9cd862b1457da4c74cdc9f7c6cd" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "lTyixJiuN/uKjmuOYxYQU4Tb74iYvtwgkNLuxBYZ75wr9UYzMTDQ2Zy+FK6N4M4cf0+kprCmrE0lgv7smUKcAA==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "f0c89e078e7ec61cde5a0e0aef3279ba1137376562f04c7bd3de649e0459e9ac" + "verifiedBindingDigest": "551d4d71952a9b00aa3e9c46fe26045d4cfcf9cd862b1457da4c74cdc9f7c6cd" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json index b306236..dc360f7 100644 --- a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json +++ b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "0ff168d9ba3b128178eec41507952c4f6452f1b5901ce742d42dbb4bc4a78dab" + "bindingDigest": "bf955cc9b8fc50468104a799cb3e71c41b207c0f95a24e380b50a933efb00467" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "2tzL8NaNdzCwP6i0ZNPh+fuYV0m0M7RdqcZ9J4BYrm2oRmtTtgXsqmSRXHXLwheYIXy2gt2Atsl48ceG9rGIAA==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "0ff168d9ba3b128178eec41507952c4f6452f1b5901ce742d42dbb4bc4a78dab" + "verifiedBindingDigest": "bf955cc9b8fc50468104a799cb3e71c41b207c0f95a24e380b50a933efb00467" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "revoked" } } diff --git a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json index facd67c..7783f67 100644 --- a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "131d91a548b550e0eb9aea94c3e080d135966ab1d7ea5fdaff7f02c7f5f29923" + "bindingDigest": "3d275aae9c037c5dbad12e1ac706172a702f7a6600c5f6840e57324a028d19a1" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "zdRijeDM2/FJtsUKq9BkX4UOigFO+gg3RKPBy7imMMoMKQhKhkwEOwFjPF6KoTFk/28Ignf/+hjsEi5Q/2GqBw==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "131d91a548b550e0eb9aea94c3e080d135966ab1d7ea5fdaff7f02c7f5f29923" + "verifiedBindingDigest": "3d275aae9c037c5dbad12e1ac706172a702f7a6600c5f6840e57324a028d19a1" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "retired" } } diff --git a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json index 18f2054..323c63d 100644 --- a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json +++ b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "bff39c20083ee4dda4efd5520e541d45d77c4e4138ae4f40ee434263bb2c6dbf" + "bindingDigest": "5857cb8974f127852ad70a1423a262b6bfc1aefd004a82d90631c692fdb03c7c" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "lkyBM5GIAu/nsvn1lqzMSTL0J5jEMSQLHLCR/Zef0Y1Gfk5oX6lz86iQ+6SrDpK/bnMBMDaiHxXNxEcaUppaCQ==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "bff39c20083ee4dda4efd5520e541d45d77c4e4138ae4f40ee434263bb2c6dbf" + "verifiedBindingDigest": "5857cb8974f127852ad70a1423a262b6bfc1aefd004a82d90631c692fdb03c7c" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json index 2bca30e..9028a3d 100644 --- a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json +++ b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "0076ec4c6a4558ddc629d6840844e6c1420c9a16291fa5a53a0c9892fdd21e4e" + "bindingDigest": "9eccc341991f04d7245dcee72d4a9a624a15b9359b07ff4f94a37eccc955152d" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "o5+MXuZoIMCZ5OLUDyZ4bERRiwKI0R71izzKcrGDXudCePp/IgFrgsNRMjn7tIV7/Pxkc3OXgxEiAJYxOETzDQ==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "0076ec4c6a4558ddc629d6840844e6c1420c9a16291fa5a53a0c9892fdd21e4e" + "verifiedBindingDigest": "9eccc341991f04d7245dcee72d4a9a624a15b9359b07ff4f94a37eccc955152d" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json index bbe20d5..2ed2fbb 100644 --- a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "e5f3e79a57a203864aa52d45c83ada3275da9de72b48abaf821cf56159c97a33" + "bindingDigest": "e37670c6e9ec2a38e0179ac5d931a9b3d654cdd84815d7096b48a78b18c5a2fb" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "wzyU2CRQiIdVQnd6IApoM4UarSgqSVLCOiupHuJLMEcCMQ1e41QbSndPjlOnMt//DI9I5+2fAb0Tve/wnhEWAQ==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "e5f3e79a57a203864aa52d45c83ada3275da9de72b48abaf821cf56159c97a33" + "verifiedBindingDigest": "e37670c6e9ec2a38e0179ac5d931a9b3d654cdd84815d7096b48a78b18c5a2fb" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json index ca5edaf..eb3532b 100644 --- a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "048a60ad00cce46558e347e6083552f15411855f4ff6fd044b31a4b64a64f35d" + "bindingDigest": "b59030f86b559d12c9ebe814e0a624b6f33c33705b829ccba2e4bd2a2e02bc75" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "gBzdGUAr14ST5W0cwvwemRSZLQsN6F6loUYqb4zU8i9eF2SSgV0Zj+xnl+ySYabFlqv1CNh2ImT5MIFdIrCXBw==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "048a60ad00cce46558e347e6083552f15411855f4ff6fd044b31a4b64a64f35d" + "verifiedBindingDigest": "b59030f86b559d12c9ebe814e0a624b6f33c33705b829ccba2e4bd2a2e02bc75" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json index 7e992e7..f8eed68 100644 --- a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json +++ b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -71,23 +78,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "219c381e4dd539c2ee2f18710ba8a41b8111671b30d51d5724dd47f3bd2318ae" + "bindingDigest": "a87c8617057cf81cfea0f3be8557c456ce15d4c91ba961a93470327d9f24858f" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "rrBxBiIcfYsrg6VcsW0KmDJoC0AHoHVtj1nYoUwaB8OXGW8qDseERxZP0p/3MnFRWr1sua0szoxtOT2lfYbGDA==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "219c381e4dd539c2ee2f18710ba8a41b8111671b30d51d5724dd47f3bd2318ae" + "verifiedBindingDigest": "a87c8617057cf81cfea0f3be8557c456ce15d4c91ba961a93470327d9f24858f" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json index 71d1a17..d7020ea 100644 --- a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json +++ b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,24 +77,37 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "79da9916bbdc50311ddee5c56e04a802d6affe59e957151236a5aa85f23ea2bb" + "bindingDigest": "3fedbf76221ef052c432ed463d6582706531bde908a2f876949a48bc43c3088c" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "fde/kW09gactNcYmEQfHcbCs+SJRDlrC83FJD3vfspn8MboiOGlQEx8ZbUX0vXCOfpNfa2wJ2+SDENrukdvwAA==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "79da9916bbdc50311ddee5c56e04a802d6affe59e957151236a5aa85f23ea2bb" + "verifiedBindingDigest": "3fedbf76221ef052c432ed463d6582706531bde908a2f876949a48bc43c3088c" }, - "unknownField": "must-fail-closed" + "unknownField": "must-fail-closed", + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } } diff --git a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json index e1bb9b2..3125968 100644 --- a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json +++ b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -73,14 +80,18 @@ "bindingDigest": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "5hlAnfFVFKmus/ffnP17hNKoPDaIWBA5vyu5h8Q/W/DF57W6WvhfArRudJwpddbz1/edPbX5Bg4Y14xQX5+XDA==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", @@ -88,5 +99,14 @@ "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", "verifiedBindingDigest": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json new file mode 100644 index 0000000..64fcff9 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-13-cached-superseded-apparently-active", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAoKiXgjuEYgbMNMdlMnkf3AimPxEAOQwVz6x94KNnk18=", + "signature": "iKZxvICZ3w62LzAVeAyPXQPL/5//Zc1tMR0WiyDLKSuj5deYdkjTkPkJQyZkR8tWVQ6IoY4S8pydBJJAMcLiBA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "afb083cc10f325405d0439d0a350910326ff474196e60ecfbf1c7cd72bbec181" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAoKiXgjuEYgbMNMdlMnkf3AimPxEAOQwVz6x94KNnk18=", + "signature": "E+8/kZMFTa61UsK3HfZkxh0HQ2ut6673gXIL8SnMJiI779QldqUzHceFxFU5M913i5u1/9aMNovjVizDFpXICw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "afb083cc10f325405d0439d0a350910326ff474196e60ecfbf1c7cd72bbec181" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "superseded" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json new file mode 100644 index 0000000..8d05564 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-14-unverifiable-authentication", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "a782781ac543a47d40ff440a257f8b18b7827d123661725807f55525f7550996" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "AAAA" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "a782781ac543a47d40ff440a257f8b18b7827d123661725807f55525f7550996" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json new file mode 100644 index 0000000..0772263 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-15-lineage-self-predecessor", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "17c64dbf4c733f8f4a5854e02c48b2a55682beeb2724a0f091060b3fee32d7d2" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "6mjfwxq8iwpLLUX8+76+SBr4i7KDYWYVjPysck6OywiIcXBoDHqfxAB8Nz809r2h7hApcTXS3YQsnMowY7bACg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "17c64dbf4c733f8f4a5854e02c48b2a55682beeb2724a0f091060b3fee32d7d2" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json new file mode 100644 index 0000000..e1ed22d --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-16-timezone-missing", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "f52ac432607a3f88e3d37919a3eb14db3c0bc0d2fcf6980ac19000c00bdef119" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "qMTTjBCZ5dAhFE6qxJbZ9NTGNVIQpLQKT2WHMdUWg9LLqv3W4C51eofCtsEchKf+ssZdn8/g22yDNYgDn3FNCg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "f52ac432607a3f88e3d37919a3eb14db3c0bc0d2fcf6980ac19000c00bdef119" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json new file mode 100644 index 0000000..c3f876b --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-17-malformed-calendar-time", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-02-30T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "9ec9edd640f539dfb0d83fc65dd04a5d3aa23bf21fdb56d404e0653d7d980c29" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "ZpKVvGIHF/moPW/JjunvwF+GUMDfh/1DRVVAWoxLWEg81nNSQj++jnEyhQtxRnB+NYsOtKS2JkXloF7To6gcBQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "9ec9edd640f539dfb0d83fc65dd04a5d3aa23bf21fdb56d404e0653d7d980c29" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json new file mode 100644 index 0000000..011f186 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-18-tombstone-without-purge", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAGQdy8d9paWebvqE4Bp4MVff7vGj1sFLL/fE81gGvzHU=", + "signature": "kCKoPgG1VYeYI6pJln0lhb1gdjHKZGfRRofFZYvHZzwq0q/OzJ18NkhC6IuWPZEMY5dKM3nFquuRWRv7H3TXDg==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "802a2518820f40671c942c61d473fc09902b4f1673c1a76b876436f5c6857988" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAGQdy8d9paWebvqE4Bp4MVff7vGj1sFLL/fE81gGvzHU=", + "signature": "7KKPPjkbT6RqT0FayIvfNXyWb48To963LgTUjZH6ongaDzk7V1Tp6jptjblr/xYnsuK5HNgc3uBSFaR1lTb2Dg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "tombstoned", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "802a2518820f40671c942c61d473fc09902b4f1673c1a76b876436f5c6857988" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json new file mode 100644 index 0000000..76848b2 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA8Senjamn1OPlnIXwyP2pxf94IWCLlt837KKuJ/Qeyjo=", + "signature": "Zw4H08ZdI0vEdkzmvK8Eor8rJMdisqPYP8E3GY0RsCIcyZNnVXMEw09BdG0bgRLkKaEq1oCKPTS6X3a7gufTDA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "4103c86c1e185da6ba9d44b4ce7dc9eeee37315ddaa4c65a88e3d0affd65b5fe" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA8Senjamn1OPlnIXwyP2pxf94IWCLlt837KKuJ/Qeyjo=", + "signature": "pCtj0B/ifeRWfSLoArde/CySkg0by942Dx1VQGd4bIYfI3VXjZ80XZE5Od06Gz/PM03lPnD8ZJ7MiYXd8gisCQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "4103c86c1e185da6ba9d44b4ce7dc9eeee37315ddaa4c65a88e3d0affd65b5fe" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json new file mode 100644 index 0000000..12d4c4c --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json @@ -0,0 +1,113 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAyTmYJ8RlSSJ4h/IAWhf9U2U6GqDotWUAgiocZrNu/WE=", + "signature": "FSS7OC4QtaSasgfpOAL+9FeNwUcajsh2+J3iuYZq9uSvvTTUBGs+DGsZmZ7S94Mk2NoeRxHkHOvulCjOje53BA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none", + "revokedAt": "2026-09-03T09:00:00Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "e5eeca76eded039b328e423d6a4311b23eeec12b3f0dcd742036ed1f80eded72" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAyTmYJ8RlSSJ4h/IAWhf9U2U6GqDotWUAgiocZrNu/WE=", + "signature": "niDBy6G9/maUFylPrdsDy+hP0OWzOnf7fq1SIy2AW0029QqVBETEynnK/hJSY0cNy2yegpu9BQsHTpnUGj6FBQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "e5eeca76eded039b328e423d6a4311b23eeec12b3f0dcd742036ed1f80eded72" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/01-active-direct.json b/tests/conformance/embodiment-bindings/positive/01-active-direct.json index 80fc57b..f4e0b60 100644 --- a/tests/conformance/embodiment-bindings/positive/01-active-direct.json +++ b/tests/conformance/embodiment-bindings/positive/01-active-direct.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "661a3c2676cf1f0b3ace41d20a550a008638ee21df3f62d3de3359b974a060fa" + "bindingDigest": "47f66e02291f1463d5b1ab7692d28a2b6beff312f9bcfe9e10c5e14a585377b2" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "xvifuOOIfsa5d3MXGCC1ztYhXCSUphiDV9IusKHHwH9fORjr23jsGOh72znZwjaRD4ntudpkcjVJvPngpmPuAw==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "661a3c2676cf1f0b3ace41d20a550a008638ee21df3f62d3de3359b974a060fa" + "verifiedBindingDigest": "47f66e02291f1463d5b1ab7692d28a2b6beff312f9bcfe9e10c5e14a585377b2" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json index d3925db..a87288d 100644 --- a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json +++ b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,24 +77,28 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "8c41a31d12a321abe617ec606f79efee79091f373c84ab65bb6a544e0ea3cedc" + "bindingDigest": "7849a6064428f7b78ed297898ecd3dfefe498862410b66db4f80807e86404996" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "2EZpy7r1GQrc0wjKTNfnAyB/GDXzNx/OllsaD/+kWTepmgyl61ou7yV0Tpomr4a3myKlerlQy1EfFDTeSSOSCg==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "8c41a31d12a321abe617ec606f79efee79091f373c84ab65bb6a544e0ea3cedc" + "verifiedBindingDigest": "7849a6064428f7b78ed297898ecd3dfefe498862410b66db4f80807e86404996" }, "aliasResolution": { "alias": "Sage", @@ -95,5 +106,14 @@ "resolvedRootIds": [ "familiar-root:oak" ] + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json index 0b64706..fce6c91 100644 --- a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json +++ b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "3880592f9517927995f2c11b794738d8f0a55b1797166c97a256a333376ef8ee" + "bindingDigest": "fdef0c17aef7aa107a953b45755c5d3e6480d41372913b7b7d7b6d5956f223cd" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "XPhGtMCOruwL9YNDqL9W1UgFIKtYd5G8sKwcNs8CR4wD3t41sQPNRWP/9DNLbqJ8yMwjuPR9EqK/7OLXoAR8DQ==" }, "privacy": { "classification": "metadata-only", "retention": "historical-verification-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "3880592f9517927995f2c11b794738d8f0a55b1797166c97a256a333376ef8ee" + "verifiedBindingDigest": "fdef0c17aef7aa107a953b45755c5d3e6480d41372913b7b7d7b6d5956f223cd" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "retired" } } diff --git a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json index 1adc5a5..0b511f8 100644 --- a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json +++ b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "retired" + "status": "retired", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "44ae3c488737c545be3a942809602235b7a65a0a659f8d54a2f5d7a236cc4046" + "bindingDigest": "fdde16db734bb0e192bc25b1704021db0a17fa65be15ecd2809301130c3be127" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "abNH72ueQqdEEf0OD+T3IAklDqpllTTM1bJW7GVY0zsAoS6t542TjX/I2x7DXOzyY7hXhRoeK1RLJtM+f0drBw==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "44ae3c488737c545be3a942809602235b7a65a0a659f8d54a2f5d7a236cc4046" + "verifiedBindingDigest": "fdde16db734bb0e192bc25b1704021db0a17fa65be15ecd2809301130c3be127" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json index 54dbc68..999543c 100644 --- a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json +++ b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "7def8c04878dab4fb8c0c4fa740c96b1c744549cce976477cf6fd10ef7cc11e6" + "bindingDigest": "408e28123ed2bfd9819d8e81427139586aa5a1db7a725df04dcb1d709dbe1e28" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "L7YyIjNGTk615iAeo3n4A84UUIpCX50sdw+bFqTvE4MXzwHtlilx1jgdyOmAiHGJLkIldmJ5L9/4pIE8hu0ZCw==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "7def8c04878dab4fb8c0c4fa740c96b1c744549cce976477cf6fd10ef7cc11e6" + "verifiedBindingDigest": "408e28123ed2bfd9819d8e81427139586aa5a1db7a725df04dcb1d709dbe1e28" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json index 392fe18..69a050e 100644 --- a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json +++ b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "status": "active" + "status": "active", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "e97cb110eb3ded123930545fe90cb20ce705c61419aa11f5a23f7f447e4ed079" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a1482d3d96937513e4fec0e3b3d6c2c884dc687c85c147205bd87270fb3ed992" + "bindingDigest": "93158adeb4c3b5bbdd48d4685ff47a5b38b5bf722fe9b42b96e13497e5fd4634" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "5KeBZpK7+WvhlCcxRK+E/3aUCz5jN/ClZnvzB712VFCNTjwU9L/rU/fD0eoQBW7G4v/JlYU7uHlRBoyJ2EhdAg==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a1482d3d96937513e4fec0e3b3d6c2c884dc687c85c147205bd87270fb3ed992" + "verifiedBindingDigest": "93158adeb4c3b5bbdd48d4685ff47a5b38b5bf722fe9b42b96e13497e5fd4634" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:maple", + "identityRevisionId": "familiar-revision:maple:0", + "lineagePosition": 0, + "bundleDigest": "83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/07-succession.json b/tests/conformance/embodiment-bindings/positive/07-succession.json index ac8f758..3f30c13 100644 --- a/tests/conformance/embodiment-bindings/positive/07-succession.json +++ b/tests/conformance/embodiment-bindings/positive/07-succession.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "status": "retired" + "status": "retired", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "b4ce2e6913e66f082a0974207a12067ca850b0585fbc8ae8abc2d39a57d39504" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "6dc722cb84b604165d954ebead2f71efc45cd3806dac81c40789fc11f69264b8" + "bindingDigest": "61c2a601dec64d9dc484a91634127939f02ba73f2d5a67e5f22559d42a1fbfd6" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "tGOK6kZ7PmYLVyVa4tijGPJFUIHokzANtVtQMIMaWQ0MJQ+GR2oy7m9RcioQ4jT5/SxQ+uGpcNik7SdAzbs4CQ==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "6dc722cb84b604165d954ebead2f71efc45cd3806dac81c40789fc11f69264b8" + "verifiedBindingDigest": "61c2a601dec64d9dc484a91634127939f02ba73f2d5a67e5f22559d42a1fbfd6" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:willow", + "identityRevisionId": "familiar-revision:willow:0", + "lineagePosition": 0, + "bundleDigest": "533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json index 9a9be57..15773c3 100644 --- a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json +++ b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ba46879f93547b392a0c380249996ece0525e4352f177539b3cdad32c159822e" + "bindingDigest": "610514b91202b9be05bfac4d770946d737e249f57c91a8d5f36c6852bc55f69d" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "H/jqvMRSOPFIRLltBUcGqF2RHAD0C+V84Wo05B0+EI1qlbzGJ9lTahGx6S33uNLiAFWettSBF7U81IgOitYjAw==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ba46879f93547b392a0c380249996ece0525e4352f177539b3cdad32c159822e" + "verifiedBindingDigest": "610514b91202b9be05bfac4d770946d737e249f57c91a8d5f36c6852bc55f69d" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json index 90b6c9e..27706d2 100644 --- a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json +++ b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "cbb764445e44cee1e93aadefc9cce4c2fb4d7c08c53620dd695b8dd7cddb6c1e" + "bindingDigest": "84a015b55e2645c3d7e9e3361c1e59f928fb69cc12a737a8c1feba32aeca531e" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "fEw7bN60bEXGrO+AjXzD1qNX65B4X7MPQfE2VSwmffB/lOFLh4Nl+ZPGBUjSOLvHU7lOLiKhYYjPwb8I7N7+Bg==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "cbb764445e44cee1e93aadefc9cce4c2fb4d7c08c53620dd695b8dd7cddb6c1e" + "verifiedBindingDigest": "84a015b55e2645c3d7e9e3361c1e59f928fb69cc12a737a8c1feba32aeca531e" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json index e1c5fea..3fe1cd1 100644 --- a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json +++ b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "3a6ef7f0aca0d63a895ac88ece5dfe11d860e1676388aaf59d3658df5198ddae" + "bindingDigest": "014be7f40c72b52769e59bf3fbac48af67a97a6998917a9c6c372853ea151e33" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "asWk3sjP9kWLwTPj1JM7zQoInd3SZV3vxuHIYECXoa5RwGbHae2Q7Y3V0M2LJTwaJCKLyNwrTbuHerm9QdorAA==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "3a6ef7f0aca0d63a895ac88ece5dfe11d860e1676388aaf59d3658df5198ddae" + "verifiedBindingDigest": "014be7f40c72b52769e59bf3fbac48af67a97a6998917a9c6c372853ea151e33" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json index a2a1858..c42343b 100644 --- a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json +++ b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "36dfd5aef6357fb9fd0f79f729bc59cd447ade8305b064e2d2ca8b5edc98bbbb" + "bindingDigest": "9a4eefe6edd8ac0c39b7073e720226f68c3442942adf0b1359a3e652a175dc25" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "CHl5RRyx0b8a9odBg9PloZ+4W7IsWd1ZUyiRbhD5iuyo9HH0+EEPABMtb3nKuHLXC42E9WJjRY7KvOqpda7zAg==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "36dfd5aef6357fb9fd0f79f729bc59cd447ade8305b064e2d2ca8b5edc98bbbb" + "verifiedBindingDigest": "9a4eefe6edd8ac0c39b7073e720226f68c3442942adf0b1359a3e652a175dc25" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json index 3b41847..a7fb229 100644 --- a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "3c780189b15ccf06fab916c610564d8a36fa55396e8f4a8b33eba5d1dd382049" + "bindingDigest": "17df05628e1466725b1a3a768deaf99e2cbbc30657d97294d49d7174c551bb86" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "Gw/O9bilLJsunHb26c3kGEKx0p/SbgM/LZdZg/e1i6q6nbJBq7uTYErmQuuc3M5lmgGbuzmsThMSJNk7aidlDw==" }, "privacy": { "classification": "metadata-only", "retention": "historical-verification-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "3c780189b15ccf06fab916c610564d8a36fa55396e8f4a8b33eba5d1dd382049" + "verifiedBindingDigest": "17df05628e1466725b1a3a768deaf99e2cbbc30657d97294d49d7174c551bb86" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json index b51cbbe..d7ae893 100644 --- a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json +++ b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "936015ca9c0a1dd2a1f8fde6d12f0798929dc60e3cef4045aa52cbd0eb7ea1d5" + "bindingDigest": "9c428bac1d64b7f21f42f503ae44c50e63204000edd6e340c8d0771a7a7f0098" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "02E9DD+VMrS9FGYntcp8bc8O9cuJjIJMyBSumDqaq9svIiof5iV0YQE8GvzP4KJZ8Uo80wkRfuFv4IW7YfxHDQ==" }, "privacy": { "classification": "metadata-only", "retention": "historical-verification-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "936015ca9c0a1dd2a1f8fde6d12f0798929dc60e3cef4045aa52cbd0eb7ea1d5" + "verifiedBindingDigest": "9c428bac1d64b7f21f42f503ae44c50e63204000edd6e340c8d0771a7a7f0098" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json index 354df07..c8e890e 100644 --- a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json +++ b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -70,23 +77,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "8afdae522a61b4000d01a3cb4fc079947e8705a84eac94f6d1746834b3263638" + "bindingDigest": "ea08790d16682e671a9b761a0283e4132ed1e7d16516126db0ed96816f5cb4b2" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "rhAqcy19DjNW0B0wuJa5M/ECZiXdpKmGvmD0rfQay6dVnGQyStJ3lAQo3yY6zS/EhNArDU+meDCAk8UQYLiHCg==" }, "privacy": { "classification": "metadata-only", "retention": "historical-verification-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "8afdae522a61b4000d01a3cb4fc079947e8705a84eac94f6d1746834b3263638" + "verifiedBindingDigest": "ea08790d16682e671a9b761a0283e4132ed1e7d16516126db0ed96816f5cb4b2" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json index 583e879..62b2e48 100644 --- a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json +++ b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json @@ -13,7 +13,14 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:2", "lineagePosition": 2, - "status": "superseded" + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + } } } }, @@ -21,13 +28,13 @@ "canonicalization": "jcs-rfc8785", "declarationDigest": { "algorithm": "sha-256", - "value": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" }, "bundleDigest": { "algorithm": "sha-256", - "value": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, - "historicalBundleRef": "urn:sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -71,23 +78,36 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "b4e512b1bcc8d986cd000ae48de41a7eb1d4e95afa9fe7fa72b83e12ba990f20" + "bindingDigest": "ff141a5d5f7c40553fa5208a9f26a354c83550989eb99ecdd24b9192df35300c" }, "authentication": { - "method": "signature", + "method": "ed25519", "signerId": "authority:oak", - "signature": "attested:opaque" + "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "signature": "nvyykqKHuiEFjJ46jMXZBhjyeuxrdPIMLafWvhpzJ4+m0mbGT0dGtp7grRzYa8RdAvY0iGbuuwgtdPDGSzQGAw==" }, "privacy": { "classification": "metadata-only", "retention": "dispatch-audit-minimum", - "containsSensitiveIdentityContent": false + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" }, "commit": { "snapshotId": "snapshot:oak-dispatch-001", "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "b4e512b1bcc8d986cd000ae48de41a7eb1d4e95afa9fe7fa72b83e12ba990f20" + "verifiedBindingDigest": "ff141a5d5f7c40553fa5208a9f26a354c83550989eb99ecdd24b9192df35300c" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" } } diff --git a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json new file mode 100644 index 0000000..6a0e30a --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json @@ -0,0 +1,112 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAXhqYyci8lIYaO/15XhBe9YeZngrmGxRdkumlMMv27Xs=", + "signature": "SPmlmVag5+8FkSinsl8AffDijUVe0bRc2AjwM26PTkrr7vzQrOa26rVdsliglhMjXDQzXCldqZlgG22TrqM8AA==" + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "unverifiable", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "38ba41a3b7e10725d0863e036fe63fd88c419150f22a683cf649dad4febe7116" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAXhqYyci8lIYaO/15XhBe9YeZngrmGxRdkumlMMv27Xs=", + "signature": "8TkILVVEB/XqMe6R0nVl7FsJf0YX6o4srVMQf9x2tqiOna/dlfylQMgCRGygmuu3PIR5GJNthhU6CuH8AKs5BQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "38ba41a3b7e10725d0863e036fe63fd88c419150f22a683cf649dad4febe7116" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active" + } +} diff --git a/tests/conformance/run-conformance.sh b/tests/conformance/run-conformance.sh index 1a0b1fe..09efa4d 100755 --- a/tests/conformance/run-conformance.sh +++ b/tests/conformance/run-conformance.sh @@ -64,9 +64,15 @@ run_binding_case() { vector_path=$1 expected=$2 label=$3 + expected_code=$4 output_file="$SUITE_DIR/.conformance-output.$$" - node "$VALIDATOR" --embodiment-binding "$vector_path" >"$output_file" 2>&1 + bundle_path="$SUITE_DIR/embodiment-bindings/bundles/$(basename "$vector_path")" + if [ -f "$bundle_path" ]; then + node "$VALIDATOR" --embodiment-binding "$vector_path" --historical-bundle "$bundle_path" >"$output_file" 2>&1 + else + node "$VALIDATOR" --embodiment-binding "$vector_path" >"$output_file" 2>&1 + fi status=$? if [ "$expected" = "pass" ]; then @@ -83,7 +89,7 @@ embodiment positive expected pass but failed: ${label}" fi else binding_negative_total=$((binding_negative_total + 1)) - if [ "$status" -ne 0 ]; then + if [ "$status" -ne 0 ] && grep -Fq "[$expected_code]" "$output_file"; then binding_negative_failed=$((binding_negative_failed + 1)) printf 'FAIL expected: %s\n' "$label" else @@ -119,14 +125,34 @@ binding_positive_passed=0 binding_negative_total=0 binding_negative_failed=0 +MANIFEST="$SUITE_DIR/embodiment-bindings/manifest.json" +if ! node -e ' +const fs = require("fs"), path = require("path"), manifest = JSON.parse(fs.readFileSync(process.argv[1])); +const root = path.dirname(process.argv[1]); +const expected = new Set([...manifest.positive, ...manifest.negative].map(v => `${v.expected}/${v.file}`)); +const actual = new Set(["positive", "negative"].flatMap(kind => fs.readdirSync(path.join(root, kind)).filter(f => f.endsWith(".json")).map(f => `${kind}/${f}`))); +if (!manifest.positive.every(v => v.expected === "positive" && v.errorCode === null) || !manifest.negative.every(v => v.expected === "negative" && typeof v.errorCode === "string") || expected.size !== actual.size || [...expected].some(f => !actual.has(f)) || [...actual].some(f => !expected.has(f))) process.exit(1); +' "$MANIFEST"; then + unexpected=$((unexpected + 1)) + details="${details} +embodiment manifest is missing, malformed, or does not exactly enumerate every vector" + printf 'UNEXPECTED manifest: embodiment-bindings\n' +fi + +binding_code() { + node -e 'const m=require(process.argv[1]); const v=[...m.positive,...m.negative].find(v => v.expected === process.argv[2] && v.file === process.argv[3]); process.stdout.write(v ? (v.errorCode || "") : "E_MANIFEST")' "$MANIFEST" "$1" "$2" +} + for vector_path in "$SUITE_DIR"/embodiment-bindings/positive/*.json; do [ -f "$vector_path" ] || continue - run_binding_case "$vector_path" "pass" "embodiment-bindings/positive/$(basename "$vector_path")" + name=$(basename "$vector_path") + run_binding_case "$vector_path" "pass" "embodiment-bindings/positive/$name" "$(binding_code positive "$name")" done for vector_path in "$SUITE_DIR"/embodiment-bindings/negative/*.json; do [ -f "$vector_path" ] || continue - run_binding_case "$vector_path" "fail" "embodiment-bindings/negative/$(basename "$vector_path")" + name=$(basename "$vector_path") + run_binding_case "$vector_path" "fail" "embodiment-bindings/negative/$name" "$(binding_code negative "$name")" done printf '\n' diff --git a/validators/README.md b/validators/README.md index e9d9e1e..287ba37 100644 --- a/validators/README.md +++ b/validators/README.md @@ -89,6 +89,19 @@ history used as current authority, principal mismatches, digest tampering, and pre-commit revocation. It accepts degraded/unavailable history only as a non-authority historical-verification record. +Pass a detached, independently consumable historical identity bundle to +recompute the retained component and bundle digests and verify the binding: + +```bash +node validators/validate.js --embodiment-binding binding.json \ + --historical-bundle historical-bundle.json +``` + +Bindings use an Ed25519 DER/SPKI public key and base64 signature over a +SHA-256 JCS binding digest. The digest excludes the complete `integrity` and +`authentication` members, so verification is non-circular; no private key is +accepted or stored in the profile. + ## For CI Integration ```yaml diff --git a/validators/validate.js b/validators/validate.js index e0f716f..1c6c400 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -42,6 +42,15 @@ const embodimentBindingSchema = JSON.parse(fs.readFileSync( )); const validateEmbodimentBindingSchema = new Ajv({ allErrors: true, strict: false }) .compile(embodimentBindingSchema); +const identityBundleSchema = JSON.parse(fs.readFileSync( + path.join(__dirname, '..', 'schemas', 'familiar-identity-bundle.schema.json'), 'utf8' +)); +const validateIdentityBundleSchema = new Ajv({ allErrors: true, strict: false }) + .compile(identityBundleSchema); + +function bindingViolation(code, field, message) { + return violation('embodiment-binding', `[${code}] ${field}`, message); +} function canonicalJson(value) { if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`; @@ -53,112 +62,210 @@ function canonicalJson(value) { function bindingDigest(binding) { const committed = JSON.parse(JSON.stringify(binding)); - delete committed.integrity.bindingDigest; + delete committed.integrity; + delete committed.authentication; delete committed.commit.verifiedBindingDigest; return crypto.createHash('sha256').update(canonicalJson(committed), 'utf8').digest('hex'); } function isTimestamp(value) { - return typeof value === 'string' && !Number.isNaN(Date.parse(value)); + if (typeof value !== 'string') return false; + const match = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|([+-])(\d{2}):(\d{2}))$/); + if (!match) return false; + const [year, month, day, hour, minute, second] = match.slice(1, 7).map(Number); + const offsetHour = match[9] === undefined ? 0 : Number(match[9]); + const offsetMinute = match[10] === undefined ? 0 : Number(match[10]); + const calendar = new Date(Date.UTC(year, month - 1, day)); + return month >= 1 && month <= 12 && hour <= 23 && minute <= 59 && second <= 59 + && offsetHour <= 23 && offsetMinute <= 59 + && calendar.getUTCFullYear() === year && calendar.getUTCMonth() === month - 1 && calendar.getUTCDate() === day; +} + +function verifyEd25519(authentication, digest) { + try { + return crypto.verify(null, Buffer.from(digest, 'hex'), { + key: Buffer.from(authentication.publicKey, 'base64'), format: 'der', type: 'spki' + }, Buffer.from(authentication.signature, 'base64')); + } catch (_) { + return false; + } +} + +function digestObject(value) { + return crypto.createHash('sha256').update(canonicalJson(value), 'utf8').digest('hex'); } -function validateEmbodimentBinding(binding, file) { +function validateHistoricalBundle(bundle, binding) { const violations = []; - if (!isObject(binding)) return [violation(file, 'shape', 'An embodiment binding must be one JSON object.')]; + if (!isObject(bundle) || !validateIdentityBundleSchema(bundle)) { + return [bindingViolation('E_BUNDLE_SCHEMA', 'historicalBundle', 'The detached historical bundle is malformed.')]; + } + const idsMatch = bundle.familiarRootId === binding.familiar.familiarRootId + && bundle.identityRevisionId === binding.familiar.identityRevisionId + && bundle.lineagePosition === binding.familiar.lineagePosition; + if (!idsMatch) violations.push(bindingViolation('E_BUNDLE_IDENTITY', 'historicalBundle', 'The detached bundle does not identify the bound root, revision, and lineage position.')); + const seen = new Set(); + for (const component of bundle.components) { + if (seen.has(component.componentId) || component.digest.value !== digestObject(component.content)) { + violations.push(bindingViolation('E_COMPONENT_DIGEST', 'historicalBundle.components', 'Every unique retained component digest must recompute from its canonical content.')); + break; + } + seen.add(component.componentId); + } + if (!seen.has('identity-declaration') || !seen.has('soul-declaration')) { + violations.push(bindingViolation('E_COMPONENT_REQUIRED', 'historicalBundle.components', 'Historical bundles retain identity-declaration and soul-declaration components.')); + } + const copy = JSON.parse(JSON.stringify(bundle)); + delete copy.bundleDigest; + const computedBundleDigest = digestObject(copy); + if (bundle.bundleDigest.value !== computedBundleDigest || + binding.identityBundle.bundleDigest.value !== computedBundleDigest || + binding.identityBundle.declarationDigest.value !== bundle.components.find(c => c.componentId === 'identity-declaration')?.digest.value) { + violations.push(bindingViolation('E_BUNDLE_DIGEST', 'historicalBundle.bundleDigest', 'The detached bundle and its retained identity declaration must recompute to the bound digests.')); + } + if (bundle.retention.verifierAccess !== 'authorized') { + violations.push(bindingViolation('E_BUNDLE_ACCESS', 'historicalBundle.retention', 'A supplied detached bundle must be authorized for verifier access.')); + } + if (bundle.retention.tombstoneState !== 'live' && + (!bundle.retention.erasureEvidence || bundle.retention.replicaPurgeState === 'not_requested')) { + violations.push(bindingViolation('E_RETENTION', 'historicalBundle.retention', 'Tombstoned or erased bundles require erasure evidence and a requested replica purge.')); + } + return violations; +} + +function validateEmbodimentBinding(binding, file, historicalBundle) { + const violations = []; + if (!isObject(binding)) return [bindingViolation('E_SCHEMA', 'shape', 'An embodiment binding must be one JSON object.')]; if (!validateEmbodimentBindingSchema(binding)) { return (validateEmbodimentBindingSchema.errors || []).map(error => - violation(file, `schema ${error.instancePath || '/'} [${error.keyword}]`, error.message || 'schema violation') + bindingViolation('E_SCHEMA', `schema ${error.instancePath || '/'} [${error.keyword}]`, error.message || 'schema violation') ); } - const { familiar, identityBundle, statusAtDecision, principal, target, historicalVerification, revocation, commit, integrity } = binding; - const times = [binding.revisionRecordedAt, binding.validTime.notBefore, binding.validTime.notAfter, + const { familiar, resolutionSnapshot, identityBundle, statusAtDecision, principal, target, historicalVerification, revocation, commit, integrity } = binding; + const times = [binding.revisionRecordedAt, binding.validTime.notBefore, binding.validTime.notAfter, resolutionSnapshot.resolvedAt, statusAtDecision.decisionTime, binding.issuedAt, binding.decisionAt, commit.finalValidityCheckAt, commit.committedAt, revocation.revokedAt].filter(Boolean); - if (times.some(value => !isTimestamp(value))) violations.push(violation(file, 'timestamps', 'All present timestamps must be valid RFC 3339 date-times.')); + if (times.some(value => !isTimestamp(value))) violations.push(bindingViolation('E_TIMESTAMP', 'timestamps', 'All present timestamps must be strict RFC 3339 calendar date-times with an offset or Z.')); const at = value => new Date(value).getTime(); if (identityBundle.historicalBundleRef !== `urn:sha256:${identityBundle.bundleDigest.value}`) { - violations.push(violation(file, 'identityBundle.historicalBundleRef', 'The content-addressed historical bundle reference must exactly carry bundleDigest.value.')); + violations.push(bindingViolation('E_BUNDLE_REFERENCE', 'identityBundle.historicalBundleRef', 'The content-addressed historical bundle reference must exactly carry bundleDigest.value.')); } if (integrity.bindingDigest !== bindingDigest(binding)) { - violations.push(violation(file, 'integrity.bindingDigest', 'The SHA-256 digest of the JCS-canonical binding bytes (with integrity.bindingDigest and the redundant commit verification omitted) does not match.')); + violations.push(bindingViolation('E_BINDING_DIGEST', 'integrity.bindingDigest', 'The SHA-256 digest of JCS-canonical binding bytes with the entire integrity/authentication members and redundant commit digest verification omitted does not match.')); } if (commit.verifiedBindingDigest !== integrity.bindingDigest) { - violations.push(violation(file, 'commit.verifiedBindingDigest', 'The immutable commit must verify the exact committed binding digest.')); + violations.push(bindingViolation('E_COMMIT_DIGEST', 'commit.verifiedBindingDigest', 'The immutable commit must verify the exact committed binding digest.')); + } + if (!verifyEd25519(binding.authentication, integrity.bindingDigest)) violations.push(bindingViolation('E_AUTHENTICATION', 'authentication', 'The Ed25519 public key and signature do not verify the binding digest.')); + if (resolutionSnapshot.snapshotId !== commit.snapshotId || resolutionSnapshot.familiarRootId !== familiar.familiarRootId || + resolutionSnapshot.identityRevisionId !== familiar.identityRevisionId || resolutionSnapshot.lineagePosition !== familiar.lineagePosition || + resolutionSnapshot.bundleDigest !== identityBundle.bundleDigest.value || resolutionSnapshot.status !== statusAtDecision.status) { + violations.push(bindingViolation('E_SNAPSHOT', 'resolutionSnapshot', 'The immutable resolution snapshot must bind root, revision, lineage position, bundle digest, and decision status.')); } if (binding.aliasResolution) { const roots = binding.aliasResolution.resolvedRootIds; if (roots.length !== 1 || roots[0] !== familiar.familiarRootId) { - violations.push(violation(file, 'aliasResolution', 'Aliases are non-authoritative evidence and must resolve to exactly the declared familiar root.')); + violations.push(bindingViolation('E_ALIAS', 'aliasResolution', 'Aliases are non-authoritative evidence and must resolve to exactly the declared familiar root.')); } } if (principal.authenticatedPrincipalId !== target.authenticatedPrincipalId) { - violations.push(violation(file, 'target.authenticatedPrincipalId', 'The target principal must equal the authenticated binding principal.')); + violations.push(bindingViolation('E_PRINCIPAL', 'target.authenticatedPrincipalId', 'The target principal must equal the authenticated binding principal.')); } if (isTimestamp(binding.revisionRecordedAt) && isTimestamp(binding.decisionAt) && at(binding.revisionRecordedAt) > at(binding.decisionAt)) { - violations.push(violation(file, 'revisionRecordedAt', 'The revision cannot be recorded after the binding decision.')); + violations.push(bindingViolation('E_ORDERING', 'revisionRecordedAt', 'The revision cannot be recorded after the binding decision.')); } if (isTimestamp(binding.validTime.notBefore) && isTimestamp(binding.decisionAt) && at(binding.validTime.notBefore) > at(binding.decisionAt)) { - violations.push(violation(file, 'validTime.notBefore', 'The revision is not yet valid at the decision time.')); + violations.push(bindingViolation('E_STALE', 'validTime.notBefore', 'The revision is not yet valid at the decision time.')); } if (binding.validTime.notAfter && isTimestamp(binding.validTime.notAfter) && isTimestamp(binding.decisionAt) && at(binding.validTime.notAfter) < at(binding.decisionAt)) { - violations.push(violation(file, 'validTime.notAfter', 'The revision is stale at the decision time.')); + violations.push(bindingViolation('E_STALE', 'validTime.notAfter', 'The revision is stale at the decision time.')); } if (isTimestamp(commit.finalValidityCheckAt) && isTimestamp(commit.committedAt) && at(commit.finalValidityCheckAt) > at(commit.committedAt)) { - violations.push(violation(file, 'commit', 'The final validity check and binding commit must share an immutable snapshot boundary; the check cannot follow commit.')); + violations.push(bindingViolation('E_ORDERING', 'commit', 'The final validity check cannot follow the immutable commit.')); + } + if (isTimestamp(resolutionSnapshot.resolvedAt) && isTimestamp(commit.finalValidityCheckAt) && isTimestamp(binding.decisionAt) && isTimestamp(commit.committedAt) && + !(at(resolutionSnapshot.resolvedAt) <= at(commit.finalValidityCheckAt) && at(commit.finalValidityCheckAt) <= at(binding.decisionAt) && at(binding.decisionAt) <= at(commit.committedAt) && at(commit.committedAt) <= at(binding.issuedAt)) || + statusAtDecision.decisionTime !== binding.decisionAt) { + violations.push(bindingViolation('E_ORDERING', 'decisionAt', 'Snapshot resolution, final validity check, decision, commit, and issue must be ordered; statusAtDecision.decisionTime equals decisionAt.')); } const lineage = familiar.lineageEvidence; const predecessor = lineage.predecessor; + if (predecessor && predecessor.identityRevisionId === familiar.identityRevisionId) { + violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence.predecessor', 'A lineage predecessor must be a distinct identity revision.')); + } if (lineage.relationship === 'genesis' && (familiar.lineagePosition !== 0 || lineage.rootEvidence !== 'genesis' || predecessor)) { violations.push(violation(file, 'familiar.lineageEvidence', 'Genesis requires position 0, genesis root evidence, and no predecessor.')); } if (['same_familiar_revision', 'restoration'].includes(lineage.relationship)) { if (!predecessor || lineage.rootEvidence !== 'continued' || predecessor.familiarRootId !== familiar.familiarRootId || - predecessor.lineagePosition !== familiar.lineagePosition - 1) { - violations.push(violation(file, 'familiar.lineageEvidence', 'Same-familiar continuation/restoration requires the immediately preceding revision on the same root.')); + predecessor.lineagePosition !== familiar.lineagePosition - 1 || predecessor.identityRevisionId === familiar.identityRevisionId || + !predecessor.identityBundleRef || !predecessor.transition || !verifyEd25519(predecessor.transition, predecessor.identityBundleRef.slice('urn:sha256:'.length))) { + violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Same-familiar continuation/restoration requires an authenticated, content-addressed edge from the immediately preceding distinct revision on the same root.')); } } if (lineage.relationship === 'restoration' && (!predecessor || predecessor.status !== 'retired')) { - violations.push(violation(file, 'familiar.lineageEvidence', 'Restoration requires a retired predecessor on the same familiar root.')); + violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Restoration requires a retired predecessor on the same familiar root.')); } if (['fork_new_root', 'succession'].includes(lineage.relationship) && - (!predecessor || familiar.lineagePosition !== 0 || predecessor.familiarRootId === familiar.familiarRootId || + (!predecessor || !predecessor.identityBundleRef || !predecessor.transition || + !verifyEd25519(predecessor.transition, predecessor.identityBundleRef.slice('urn:sha256:'.length)) || + familiar.lineagePosition !== 0 || predecessor.familiarRootId === familiar.familiarRootId || lineage.rootEvidence !== (lineage.relationship === 'fork_new_root' ? 'fork' : 'succession'))) { - violations.push(violation(file, 'familiar.lineageEvidence', 'Fork/new-root and succession require position 0, a distinct predecessor root, and matching root evidence.')); + violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Fork/new-root and succession require authenticated, content-addressed predecessor evidence, position 0, a distinct root, and matching root evidence.')); } const isAuthorityAttempt = ['dispatch', 'session_creation'].includes(binding.bindingPurpose); if (isAuthorityAttempt && statusAtDecision.status !== 'active') { - violations.push(violation(file, 'statusAtDecision.status', 'Only an active revision is eligible for a new dispatch or session creation.')); + violations.push(bindingViolation('E_STATUS', 'statusAtDecision.status', 'Only an active revision is eligible for a new dispatch or session creation.')); } if (isAuthorityAttempt && historicalVerification.state !== 'verified') { - violations.push(violation(file, 'historicalVerification.state', 'Degraded, unavailable, or unverifiable history is never authority for a new dispatch.')); + violations.push(bindingViolation('E_HISTORY', 'historicalVerification.state', 'Degraded, unavailable, or unverifiable history is never authority for a new dispatch.')); } if (historicalVerification.readAuthorization === 'not_authorized' && (historicalVerification.state !== 'unavailable' || binding.bindingPurpose !== 'historical_verification')) { - violations.push(violation(file, 'historicalVerification', 'An unauthorized historical read must be recorded as unavailable historical verification, never as dispatch authority.')); + violations.push(bindingViolation('E_HISTORY', 'historicalVerification', 'An unauthorized historical read must be recorded as unavailable historical verification, never as dispatch authority.')); + } + if (binding.privacy.tombstoneState !== 'live' && + (!binding.privacy.erasureEvidence || binding.privacy.replicaPurgeState === 'not_requested')) { + violations.push(bindingViolation('E_RETENTION', 'privacy', 'Tombstoned or erased binding metadata requires erasure evidence and a requested replica purge.')); + } + if (historicalBundle) violations.push(...validateHistoricalBundle(historicalBundle, binding)); + if (!historicalBundle && historicalVerification.state === 'verified') { + violations.push(bindingViolation('E_BUNDLE_MISSING', 'historicalBundle', 'Verified history requires a supplied detached historical bundle.')); } if (revocation.outcome === 'before_commit') { - violations.push(violation(file, 'revocation', 'A revocation observed before commit must fail closed and cannot produce a binding.')); + violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revocation observed before commit must fail closed and cannot produce a binding.')); + } + if (revocation.revokedAt && isTimestamp(revocation.revokedAt) && isTimestamp(commit.committedAt) && at(revocation.revokedAt) <= at(commit.committedAt) && isAuthorityAttempt) { + violations.push(bindingViolation('E_REVOCATION', 'revocation.revokedAt', 'Any revocation at or before decision/commit rejects dispatch regardless of the asserted outcome.')); } if (revocation.outcome === 'after_commit') { if (!revocation.revokedAt || !isTimestamp(revocation.revokedAt) || !isTimestamp(commit.committedAt) || at(revocation.revokedAt) <= at(commit.committedAt)) { - violations.push(violation(file, 'revocation', 'An after-commit revocation must be timestamped strictly after the immutable commit.')); + violations.push(bindingViolation('E_REVOCATION', 'revocation', 'An after-commit revocation must be timestamped strictly after the immutable commit.')); } } return violations; } -function validateEmbodimentBindingFile(filePath) { +function validateEmbodimentBindingFile(filePath, historicalBundlePath) { let binding; try { binding = JSON.parse(fs.readFileSync(filePath, 'utf8')); } catch (error) { - return [violation(filePath, 'syntax', `JSON syntax violation: ${error.message}`)]; + return [bindingViolation('E_JSON', 'syntax', `JSON syntax violation: ${error.message}`)]; } - return validateEmbodimentBinding(binding, filePath); + let historicalBundle; + if (historicalBundlePath) { + try { + historicalBundle = JSON.parse(fs.readFileSync(historicalBundlePath, 'utf8')); + } catch (error) { + return [bindingViolation('E_BUNDLE_SCHEMA', 'historicalBundle', `JSON syntax violation: ${error.message}`)]; + } + } + return validateEmbodimentBinding(binding, filePath, historicalBundle); } // ── SOUL.md parser ──────────────────────────────────────────────────────────── @@ -547,7 +654,7 @@ ${bold('familiar-contract validator')} — checks a familiar directory for spec ${bold('Usage:')} npm install node validate.js - node validate.js --embodiment-binding + node validate.js --embodiment-binding [--historical-bundle ] ${bold('Examples:')} node validate.js examples/sage @@ -571,8 +678,8 @@ ${bold('Exit codes:')} } if (args[0] === '--embodiment-binding') { - if (args.length !== 2) { - console.error(red('Error: --embodiment-binding requires exactly one JSON file path.')); + if (args.length !== 2 && (args.length !== 4 || args[2] !== '--historical-bundle')) { + console.error(red('Error: --embodiment-binding requires a JSON file and optionally --historical-bundle .')); process.exit(1); } const filePath = path.resolve(args[1]); @@ -580,7 +687,12 @@ ${bold('Exit codes:')} console.error(red(`Error: Binding file not found: ${filePath}`)); process.exit(1); } - const bindingViolations = validateEmbodimentBindingFile(filePath); + const historicalBundlePath = args[3] && path.resolve(args[3]); + if (historicalBundlePath && (!fs.existsSync(historicalBundlePath) || !fs.statSync(historicalBundlePath).isFile())) { + console.error(red(`Error: Historical bundle file not found: ${historicalBundlePath}`)); + process.exit(1); + } + const bindingViolations = validateEmbodimentBindingFile(filePath, historicalBundlePath); if (bindingViolations.length === 0) { console.log(green(bold('✓ PASS')) + ' — Embodiment binding validation passed.'); process.exit(0); From 32c5679ee1bde3096b0c37897d1a200996019ae6 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:22:51 -0500 Subject: [PATCH 03/16] fix: bind authenticated lineage transitions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 3 ++- .../familiar-embodiment-binding.schema.json | 13 ++++++++++- .../negative/01-ambiguous-alias.json | 22 ++++++++++++------- .../negative/02-stale-cached-revision.json | 22 ++++++++++++------- .../negative/03-revoked-revision.json | 22 ++++++++++++------- .../negative/04-retired-dispatch.json | 22 ++++++++++++------- .../negative/05-principal-mismatch.json | 22 ++++++++++++------- .../negative/06-tampered-bundle-digest.json | 22 ++++++++++++------- .../07-degraded-history-dispatch.json | 22 ++++++++++++------- .../08-unauthorized-history-dispatch.json | 22 ++++++++++++------- .../negative/09-revocation-before-commit.json | 22 ++++++++++++------- .../negative/10-unknown-field.json | 22 ++++++++++++------- .../negative/12-tampered-binding-digest.json | 18 ++++++++++----- ...3-cached-superseded-apparently-active.json | 22 ++++++++++++------- .../14-unverifiable-authentication.json | 20 +++++++++++------ .../negative/15-lineage-self-predecessor.json | 22 ++++++++++++------- .../negative/16-timezone-missing.json | 22 ++++++++++++------- .../negative/17-malformed-calendar-time.json | 22 ++++++++++++------- .../negative/18-tombstone-without-purge.json | 22 ++++++++++++------- .../19-verified-history-missing-bundle.json | 22 ++++++++++++------- .../20-revocation-at-commit-outcome-none.json | 22 ++++++++++++------- .../positive/01-active-direct.json | 22 ++++++++++++------- .../positive/02-unique-alias-resolution.json | 22 ++++++++++++------- .../03-retired-historical-record.json | 22 ++++++++++++------- .../positive/04-restoration-with-lineage.json | 22 ++++++++++++------- .../05-new-revision-same-familiar.json | 22 ++++++++++++------- .../positive/06-fork-new-root.json | 22 ++++++++++++------- .../positive/07-succession.json | 22 ++++++++++++------- .../positive/08-direct-coven-session.json | 22 ++++++++++++------- .../positive/09-scheduled-automation-run.json | 22 ++++++++++++------- .../10-scheduled-automation-attempt.json | 22 ++++++++++++------- .../11-psyche-delegated-execution.json | 22 ++++++++++++------- .../12-degraded-historical-bundle.json | 22 ++++++++++++------- ...13-privacy-authorized-historical-read.json | 22 ++++++++++++------- .../14-privacy-unauthorized-read-denied.json | 22 ++++++++++++------- .../positive/15-revocation-after-commit.json | 22 ++++++++++++------- .../16-unverifiable-historical-bundle.json | 22 ++++++++++++------- validators/README.md | 5 +++++ validators/validate.js | 19 +++++++++++++--- 39 files changed, 522 insertions(+), 282 deletions(-) diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 84dd95d..6b70f96 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -576,7 +576,8 @@ appears in either profile. An invalid encoding or unverifiable signature **MUST** fail closed for dispatch and session creation. Lineage predecessors **MUST** name a content-addressed predecessor bundle and -an authenticated Ed25519 transition edge. The verifier **MUST** reject a +an authenticated Ed25519 transition edge that signs its relationship, +predecessor digest, and successor root/revision. The verifier **MUST** reject a self-predecessor, repeated/non-monotonic position, root/revision mismatch, or relation/root-evidence mismatch. Thus continuation, restoration, fork/new-root, and succession are mechanically—not merely narratively—distinct. diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index 2aacfc6..503f8ef 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -32,7 +32,7 @@ "lineagePosition": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "status": { "enum": ["active", "retired", "revoked", "superseded"] }, "identityBundleRef": { "type": "string", "pattern": "^urn:sha256:[0-9a-f]{64}$" }, - "transition": { "$ref": "#/definitions/authentication" } + "transition": { "$ref": "#/definitions/transition" } } } } @@ -138,5 +138,16 @@ "type": "object", "additionalProperties": false, "required": ["method", "signerId", "publicKey", "signature"], "properties": { "method": { "const": "ed25519" }, "signerId": { "$ref": "#/definitions/opaqueId" }, "publicKey": { "type": "string", "pattern": "^[A-Za-z0-9+/]+={0,2}$" }, "signature": { "type": "string", "pattern": "^[A-Za-z0-9+/]+={0,2}$" } } } + ,"transition": { + "type": "object", "additionalProperties": false, + "required": ["relationship", "predecessorBundleDigest", "successorFamiliarRootId", "successorIdentityRevisionId", "authentication"], + "properties": { + "relationship": { "enum": ["same_familiar_revision", "restoration", "fork_new_root", "succession"] }, + "predecessorBundleDigest": { "$ref": "#/definitions/hash" }, + "successorFamiliarRootId": { "$ref": "#/definitions/opaqueId" }, + "successorIdentityRevisionId": { "$ref": "#/definitions/opaqueId" }, + "authentication": { "$ref": "#/definitions/authentication" } + } + } } } diff --git a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json index de88eaf..823abde 100644 --- a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json +++ b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEApPUdZ11F7GxEfw5dlpEu3qRJ4utDx5gQBcjFkOLpwB0=", + "signature": "OeeVo7lsP4Y0eR/Y0aUP7hZp0aj3c4TNeaSf9F/YTKpLYyOfrdW68VpIb43qXfAi7ByqOF5zsba2MJM7+SxRDA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "b49f07cfa67836556be417683b4c86a837aaf08e57157bab266c44f25ad5102a" + "bindingDigest": "95f2a620eac1540c6c6faff80b09524c4f84d6ac6093a28024da15ec0138a9e1" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "wBqKzTRoreQNhAB22eEWcJUukRIcj9ajvX4z85B5E7V0j8OkoTCccd/uz7qxcywZHEQ2DAr7QcmfhskNIlo6AA==" + "publicKey": "MCowBQYDK2VwAyEApPUdZ11F7GxEfw5dlpEu3qRJ4utDx5gQBcjFkOLpwB0=", + "signature": "EBXID5aOBbH7JTU2RUIc8Xo7aRUTZAOnljclwEiFQnSjSnJTiefCWeMlQuNTyA6SF7LUEHLfPfj4xWud2mK9Ag==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "b49f07cfa67836556be417683b4c86a837aaf08e57157bab266c44f25ad5102a" + "verifiedBindingDigest": "95f2a620eac1540c6c6faff80b09524c4f84d6ac6093a28024da15ec0138a9e1" }, "aliasResolution": { "alias": "Sage", diff --git a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json index a34d493..8c434b2 100644 --- a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json +++ b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAqVbY2JlnPJYxJWWGjCOMqkh24m3t5MnQhZRCYkECHl8=", + "signature": "y4aDNvK5Csv2z2qsbtI2ZJyFfe0r5+op6LiMQLfWP3iFzGNCHBnlRh8zd0/sORiO2zrCC0ghqaMZsj/jdLhzBw==" + } } } } @@ -78,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "551d4d71952a9b00aa3e9c46fe26045d4cfcf9cd862b1457da4c74cdc9f7c6cd" + "bindingDigest": "0c5d1b5f895775165d4b9a5709daab469015a0d63ab03a39906ddcacedbbbd56" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "lTyixJiuN/uKjmuOYxYQU4Tb74iYvtwgkNLuxBYZ75wr9UYzMTDQ2Zy+FK6N4M4cf0+kprCmrE0lgv7smUKcAA==" + "publicKey": "MCowBQYDK2VwAyEAqVbY2JlnPJYxJWWGjCOMqkh24m3t5MnQhZRCYkECHl8=", + "signature": "83PUltxU6HjSd9/bw3KSYHMD8vq8q/3qkEQDR4o4Ew30PdkPqC59VLqaZp37n5G8zYyfAf/2uaMpXhxc9ZNTAw==" }, "privacy": { "classification": "metadata-only", @@ -99,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "551d4d71952a9b00aa3e9c46fe26045d4cfcf9cd862b1457da4c74cdc9f7c6cd" + "verifiedBindingDigest": "0c5d1b5f895775165d4b9a5709daab469015a0d63ab03a39906ddcacedbbbd56" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json index dc360f7..e0f4489 100644 --- a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json +++ b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAm/w7WCeA4C7Ct++BZAo/VgtswcJp68qaHu+C/kOshQI=", + "signature": "X+PO+Sy5fzCxpTvtm0WzRTjRZdTY7vqG/VxkA2OyuWC9gA1VXDoDtI0OT52PpI5raRWEVtt44GrmKIFzRY+7Bw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "bf955cc9b8fc50468104a799cb3e71c41b207c0f95a24e380b50a933efb00467" + "bindingDigest": "cae1554f4da30cd9cfb44ec687ef104a4e9a861cae9244aafc87c76e308ddf6a" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "2tzL8NaNdzCwP6i0ZNPh+fuYV0m0M7RdqcZ9J4BYrm2oRmtTtgXsqmSRXHXLwheYIXy2gt2Atsl48ceG9rGIAA==" + "publicKey": "MCowBQYDK2VwAyEAm/w7WCeA4C7Ct++BZAo/VgtswcJp68qaHu+C/kOshQI=", + "signature": "zepriAfp5o1hijceOgZC6JLk7hDTkoTPny6v/WfnN+H4hNF3jZi+ptOXvkVsnZ/oq+Ap/nEa4mQMfcHmC+qXCg==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "bf955cc9b8fc50468104a799cb3e71c41b207c0f95a24e380b50a933efb00467" + "verifiedBindingDigest": "cae1554f4da30cd9cfb44ec687ef104a4e9a861cae9244aafc87c76e308ddf6a" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json index 7783f67..029babe 100644 --- a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA2c6gx3lLfHIwsfGdE9OimUd1PkFsqA3VyxOI9IVQfPE=", + "signature": "GQU1HnX1DWhD1wLegPGpvYO1/mpmUJ2awjWTSgWqTcwbIEAHi1M4pgDi8tIcP8FiG7Oz2ZHADg1c/VfOBjJKBw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "3d275aae9c037c5dbad12e1ac706172a702f7a6600c5f6840e57324a028d19a1" + "bindingDigest": "73958f8c1cccb1966c3a9f774bd89d899aaa02ebcd5e2c48a297f7139611ded0" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "zdRijeDM2/FJtsUKq9BkX4UOigFO+gg3RKPBy7imMMoMKQhKhkwEOwFjPF6KoTFk/28Ignf/+hjsEi5Q/2GqBw==" + "publicKey": "MCowBQYDK2VwAyEA2c6gx3lLfHIwsfGdE9OimUd1PkFsqA3VyxOI9IVQfPE=", + "signature": "pnZCStQldWNTqxNNtTMfnH+k9kuLBTXNJHq6KIWNCfnjbgIFn3VVcMtH25RfEsxo/HEJv0/ibUl3uzQElWzUCA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "3d275aae9c037c5dbad12e1ac706172a702f7a6600c5f6840e57324a028d19a1" + "verifiedBindingDigest": "73958f8c1cccb1966c3a9f774bd89d899aaa02ebcd5e2c48a297f7139611ded0" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json index 323c63d..d854543 100644 --- a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json +++ b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAl7io/oY1ZRrywzyfu89CNfEEPu4YROcJebkeg18WxWA=", + "signature": "d8agIopu9pNRFZsepN8JLh/qD7pO5CuiBqUjwK3tpWQkeHn5YfT2Ke2CxoHoLuznFV6fARg84el7UdhM3zb4Dw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "5857cb8974f127852ad70a1423a262b6bfc1aefd004a82d90631c692fdb03c7c" + "bindingDigest": "83f60a76901584912c586a3c7ee948f0e653bfca2e7adaa91f25d5f6b3a5b89e" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "lkyBM5GIAu/nsvn1lqzMSTL0J5jEMSQLHLCR/Zef0Y1Gfk5oX6lz86iQ+6SrDpK/bnMBMDaiHxXNxEcaUppaCQ==" + "publicKey": "MCowBQYDK2VwAyEAl7io/oY1ZRrywzyfu89CNfEEPu4YROcJebkeg18WxWA=", + "signature": "uXcE475pl/Nl0a9Zp/noLSdv7x4O+WA6cfQd9Y3qlVPQqDEpxJMaH22XypmAyzPVjqwsZnsXSi7csbS5x4rVDQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "5857cb8974f127852ad70a1423a262b6bfc1aefd004a82d90631c692fdb03c7c" + "verifiedBindingDigest": "83f60a76901584912c586a3c7ee948f0e653bfca2e7adaa91f25d5f6b3a5b89e" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json index 9028a3d..8beba6e 100644 --- a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json +++ b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAD7bt17XdL+SsRNse2FrRmwe2Dz5slKOMISYELUK6/j0=", + "signature": "dESlz50B3LMqMGbrJWsBnDT2hN1S07Ff9w65fS0K3oT8KFSIASbHZZi88o/X9Af1K/75+Z2Fm4yvUKBuq7EzBg==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "9eccc341991f04d7245dcee72d4a9a624a15b9359b07ff4f94a37eccc955152d" + "bindingDigest": "c696ff7cb9a4e14e59cd6814c5c39057f2f2dbcf15a51ecd33b082626ddf8b48" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "o5+MXuZoIMCZ5OLUDyZ4bERRiwKI0R71izzKcrGDXudCePp/IgFrgsNRMjn7tIV7/Pxkc3OXgxEiAJYxOETzDQ==" + "publicKey": "MCowBQYDK2VwAyEAD7bt17XdL+SsRNse2FrRmwe2Dz5slKOMISYELUK6/j0=", + "signature": "bP9v0Fg9Y5T6tVR0SmXCSzc10W9ZpJZG/MVracbU+I6IqV/nqWLNclbaqvuMgjRxK6UGLKAH8DNQedwlkfATAA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "9eccc341991f04d7245dcee72d4a9a624a15b9359b07ff4f94a37eccc955152d" + "verifiedBindingDigest": "c696ff7cb9a4e14e59cd6814c5c39057f2f2dbcf15a51ecd33b082626ddf8b48" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json index 2ed2fbb..8afedf6 100644 --- a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAZmMpfFv4sNavXGaFt4RI4sgZ8Uht7XSTlWY5OP8iFSk=", + "signature": "KlrXdeNz6+QHUiG6D+5qq8Te3D2Zk4X5JaUXTiZHAsQ5ErcaM443DpXzVpDNeXVBdkfDPi/g2tRdaQESjv4/DA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "e37670c6e9ec2a38e0179ac5d931a9b3d654cdd84815d7096b48a78b18c5a2fb" + "bindingDigest": "ea651208b087e2cf9638a6deab54ca3cd64f2aebc71f944b5e57665a83bbde09" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "wzyU2CRQiIdVQnd6IApoM4UarSgqSVLCOiupHuJLMEcCMQ1e41QbSndPjlOnMt//DI9I5+2fAb0Tve/wnhEWAQ==" + "publicKey": "MCowBQYDK2VwAyEAZmMpfFv4sNavXGaFt4RI4sgZ8Uht7XSTlWY5OP8iFSk=", + "signature": "g3UAMV1tlug4wZTL1oDil9brkyX+eXoJ/Sk2oWeHNNUxysNQwdH2vlHVcZbtZ2m0MRymhF35wQSTF5YDdzcRAA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "e37670c6e9ec2a38e0179ac5d931a9b3d654cdd84815d7096b48a78b18c5a2fb" + "verifiedBindingDigest": "ea651208b087e2cf9638a6deab54ca3cd64f2aebc71f944b5e57665a83bbde09" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json index eb3532b..bfa00c5 100644 --- a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfHo7QxHOjE3p7op6OwRJj0+H35PqJttH5CUUJAaOge0=", + "signature": "FDWV5jSgS/sknNG+eRvrwUV6guRTm14Ynca1ZQckOnRMiUlIGfAw5n4VBe1BAOon6YqCy6w6VcpXV14h6RdUAg==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "b59030f86b559d12c9ebe814e0a624b6f33c33705b829ccba2e4bd2a2e02bc75" + "bindingDigest": "cddfe1c3820f2e2c5f4beba0b0f629b9a3663cbde3731f0fe591c19472abccd2" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "gBzdGUAr14ST5W0cwvwemRSZLQsN6F6loUYqb4zU8i9eF2SSgV0Zj+xnl+ySYabFlqv1CNh2ImT5MIFdIrCXBw==" + "publicKey": "MCowBQYDK2VwAyEAfHo7QxHOjE3p7op6OwRJj0+H35PqJttH5CUUJAaOge0=", + "signature": "S5oQcvR5IcBB8vem1HXW2PX+yPPf3EddbtUyXTcbE96+tuMZlmlrM01HTRofhPU8CzNX1l5DGWSdpe5EygW6AA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "b59030f86b559d12c9ebe814e0a624b6f33c33705b829ccba2e4bd2a2e02bc75" + "verifiedBindingDigest": "cddfe1c3820f2e2c5f4beba0b0f629b9a3663cbde3731f0fe591c19472abccd2" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json index f8eed68..d1e0116 100644 --- a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json +++ b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA2Xw3I8BVxOe2SXOYZxfPnme9KdOYKyHtaPm30+F2crc=", + "signature": "//SvBWQdyATNJCpsjA5zpsWZZQOPre+HduWeRXJr6nZc/n1X4j7i0lgUGEcOcS3q/H08ELrNoI11iQVF1WzRBQ==" + } } } } @@ -78,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a87c8617057cf81cfea0f3be8557c456ce15d4c91ba961a93470327d9f24858f" + "bindingDigest": "1002748544e0d05b9a5aae10a8a2a7748a080e66f4f5b5e1cfee3ac4fdb8cda1" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "rrBxBiIcfYsrg6VcsW0KmDJoC0AHoHVtj1nYoUwaB8OXGW8qDseERxZP0p/3MnFRWr1sua0szoxtOT2lfYbGDA==" + "publicKey": "MCowBQYDK2VwAyEA2Xw3I8BVxOe2SXOYZxfPnme9KdOYKyHtaPm30+F2crc=", + "signature": "F4xuIbqlXIrvsHCdEwwt0l9a9xVZt1MtcObSLu0e6j/w4Yj972OPS8qQMf36QTiTDnFIlf7dTW+yuB/Va7W/AA==" }, "privacy": { "classification": "metadata-only", @@ -99,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a87c8617057cf81cfea0f3be8557c456ce15d4c91ba961a93470327d9f24858f" + "verifiedBindingDigest": "1002748544e0d05b9a5aae10a8a2a7748a080e66f4f5b5e1cfee3ac4fdb8cda1" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json index d7020ea..f875ea5 100644 --- a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json +++ b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAQkG/VhNV6PMLDJkTpqALVYWkatDr13W0qMC0vTbjnT8=", + "signature": "b1r0aYcFh+xhfIdkL0qt1lUfE/mzAmZ0487eRPygreXZb3kyy0MRV6FNHZ3FvuABB/9NRRbFxhKN8ifsJqS3Bg==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "3fedbf76221ef052c432ed463d6582706531bde908a2f876949a48bc43c3088c" + "bindingDigest": "87836ad9467f1f1ef7f09e804a3ab54c0d4e0dc28f8b9f8d7267b6269edfce58" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "fde/kW09gactNcYmEQfHcbCs+SJRDlrC83FJD3vfspn8MboiOGlQEx8ZbUX0vXCOfpNfa2wJ2+SDENrukdvwAA==" + "publicKey": "MCowBQYDK2VwAyEAQkG/VhNV6PMLDJkTpqALVYWkatDr13W0qMC0vTbjnT8=", + "signature": "axTPAritAC4jOpiQCpV0E5T8nJV5MRAdy1kSC8RPkidPFWCOt29CnTDTJFkWONrd4lbIXksiSkAGeN8Mn8llDw==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "3fedbf76221ef052c432ed463d6582706531bde908a2f876949a48bc43c3088c" + "verifiedBindingDigest": "87836ad9467f1f1ef7f09e804a3ab54c0d4e0dc28f8b9f8d7267b6269edfce58" }, "unknownField": "must-fail-closed", "resolutionSnapshot": { diff --git a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json index 3125968..d295ac2 100644 --- a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json +++ b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAGhimXyWyVIb0RbfE+TBBVaHvzFaIbf6zuPxKShSWmVU=", + "signature": "8UwA2yJDDGLbOdEsU9SOd3vv5RZDW5MoAEnxPq1kqza7NsEtr3CVry2/4RWb6s+pNRlJM/5jxrTsruC4RtK/DQ==" + } } } } @@ -82,8 +88,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "5hlAnfFVFKmus/ffnP17hNKoPDaIWBA5vyu5h8Q/W/DF57W6WvhfArRudJwpddbz1/edPbX5Bg4Y14xQX5+XDA==" + "publicKey": "MCowBQYDK2VwAyEAGhimXyWyVIb0RbfE+TBBVaHvzFaIbf6zuPxKShSWmVU=", + "signature": "WNmeTHadfaxA9DP+XnOIpVxNL1aEWJFeyWah/zlBwiWO8IXPa9o/okuoKPeCto2RkI/DlTncs5bwXqrOkqznBA==" }, "privacy": { "classification": "metadata-only", diff --git a/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json index 64fcff9..94ad482 100644 --- a/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json +++ b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAoKiXgjuEYgbMNMdlMnkf3AimPxEAOQwVz6x94KNnk18=", - "signature": "iKZxvICZ3w62LzAVeAyPXQPL/5//Zc1tMR0WiyDLKSuj5deYdkjTkPkJQyZkR8tWVQ6IoY4S8pydBJJAMcLiBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA9ENoNuwG/9O5adMaRW4074UJnReLQ+XRjOKFPx4XkC4=", + "signature": "jlFV6NVwCoZZAt4Tk5dZgLFEJaOOBK5MBeHjVf5ILq8kz21UDRP9sIvvMD7F7EWQ9ovZoj3NRBpt/mzThOyOAQ==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "afb083cc10f325405d0439d0a350910326ff474196e60ecfbf1c7cd72bbec181" + "bindingDigest": "cf58b3f711c1563e16f30169af376b3601e0e7b99974c9918ff30879d09e51d7" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAoKiXgjuEYgbMNMdlMnkf3AimPxEAOQwVz6x94KNnk18=", - "signature": "E+8/kZMFTa61UsK3HfZkxh0HQ2ut6673gXIL8SnMJiI779QldqUzHceFxFU5M913i5u1/9aMNovjVizDFpXICw==" + "publicKey": "MCowBQYDK2VwAyEA9ENoNuwG/9O5adMaRW4074UJnReLQ+XRjOKFPx4XkC4=", + "signature": "ffKmO8S4RaxEhqatGBcpLfbZbPBoPXM/vIpwtwiBSksXC8Y/HsjVF/dxMv9XFn+J0KyqEFVMDT0djV+maA1yAA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "afb083cc10f325405d0439d0a350910326ff474196e60ecfbf1c7cd72bbec181" + "verifiedBindingDigest": "cf58b3f711c1563e16f30169af376b3601e0e7b99974c9918ff30879d09e51d7" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json index 8d05564..534bc71 100644 --- a/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json +++ b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAupp2j8awiKTi/N/CLZT8EJfC+RJYr7jY70aWAEor8t8=", + "signature": "uB/Uhz8risixGusieSjw/1IXci36wel6lUkhtLGsvvalk1Y351RhRyZHNoom6nCvosb7cbnpNdFLMMkbA2bOBA==" + } } } } @@ -77,12 +83,12 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a782781ac543a47d40ff440a257f8b18b7827d123661725807f55525f7550996" + "bindingDigest": "37a174dc2a7d2276959b630fc878d81e988d86ab1ad645b6af547d3106df30e2" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", + "publicKey": "MCowBQYDK2VwAyEAupp2j8awiKTi/N/CLZT8EJfC+RJYr7jY70aWAEor8t8=", "signature": "AAAA" }, "privacy": { @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a782781ac543a47d40ff440a257f8b18b7827d123661725807f55525f7550996" + "verifiedBindingDigest": "37a174dc2a7d2276959b630fc878d81e988d86ab1ad645b6af547d3106df30e2" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json index 0772263..d2f088a 100644 --- a/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json +++ b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAMYr64EGRpOcWYRCGPnhq2QoK22ZBuRuTaME9tnKdMqY=", + "signature": "hP63Mkh/RWXa2O7uTx9moQJG09+v7ap7+X/ng3e1aqm2DRZpisMaOREOCXyqNck9BBPp5Z/cJbAgNL94p1orDw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "17c64dbf4c733f8f4a5854e02c48b2a55682beeb2724a0f091060b3fee32d7d2" + "bindingDigest": "929dcad68ccdf9ef85ff6468fa15ccd3bc82ec5eea6b5cf683f7c575a68d3308" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "6mjfwxq8iwpLLUX8+76+SBr4i7KDYWYVjPysck6OywiIcXBoDHqfxAB8Nz809r2h7hApcTXS3YQsnMowY7bACg==" + "publicKey": "MCowBQYDK2VwAyEAMYr64EGRpOcWYRCGPnhq2QoK22ZBuRuTaME9tnKdMqY=", + "signature": "HjF5qtA9IM4Ot1EGPA7/hqwOXiUP5PpnIY/Wm7TJvu6beN2xG3+r0lBHnBMrKfoCoyaZuTHflfbPTl++EHwiAg==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "17c64dbf4c733f8f4a5854e02c48b2a55682beeb2724a0f091060b3fee32d7d2" + "verifiedBindingDigest": "929dcad68ccdf9ef85ff6468fa15ccd3bc82ec5eea6b5cf683f7c575a68d3308" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json index e1ed22d..cee7fbf 100644 --- a/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json +++ b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAMnSUQFVBoKN3x8sgcJsaZdrazZdrCUN8Whep21iYD9s=", + "signature": "Xt3nyoaeOf1C8qOiFtqFu303D5y30X/ufHuDmj00oKGAbjzPPyHiFplWLX5zZcPH71iExVMHl6t1FfC/oTUCBA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "f52ac432607a3f88e3d37919a3eb14db3c0bc0d2fcf6980ac19000c00bdef119" + "bindingDigest": "3ad5c2044186a7e1b3ccc548b7c63c09f7726e2851918f4d71c03b13c5f86d8e" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "qMTTjBCZ5dAhFE6qxJbZ9NTGNVIQpLQKT2WHMdUWg9LLqv3W4C51eofCtsEchKf+ssZdn8/g22yDNYgDn3FNCg==" + "publicKey": "MCowBQYDK2VwAyEAMnSUQFVBoKN3x8sgcJsaZdrazZdrCUN8Whep21iYD9s=", + "signature": "0hR1jA111Bt/b7iil4TwmVeK7ODrlgYgy8LEys1AGFqGyAcJKA5Fu+QnohMwn0vtcuJfZ4aFaQOHHkoME44MBQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "f52ac432607a3f88e3d37919a3eb14db3c0bc0d2fcf6980ac19000c00bdef119" + "verifiedBindingDigest": "3ad5c2044186a7e1b3ccc548b7c63c09f7726e2851918f4d71c03b13c5f86d8e" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json index c3f876b..145fade 100644 --- a/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json +++ b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAcwiF75AbYbBc1hlY1aXhlXLrVGbJRnWcBHbfdLv8oGg=", + "signature": "Hpdoh0emDrv6oBgEnBxOmZN2uTU3iQpJHXa338+i7zomYmADir4v4z8eTNXPnnplS0ROEmP4G2Y1e1MTk6X8Bg==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "9ec9edd640f539dfb0d83fc65dd04a5d3aa23bf21fdb56d404e0653d7d980c29" + "bindingDigest": "f26c8808dac50a7fc0589345449ad114ae2ac09babc7e6d47de9689ead3f6212" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "ZpKVvGIHF/moPW/JjunvwF+GUMDfh/1DRVVAWoxLWEg81nNSQj++jnEyhQtxRnB+NYsOtKS2JkXloF7To6gcBQ==" + "publicKey": "MCowBQYDK2VwAyEAcwiF75AbYbBc1hlY1aXhlXLrVGbJRnWcBHbfdLv8oGg=", + "signature": "6rV1aAhdI7MLc1WsKiF1nKgh3NWR88gZoaiQoU13Fe0T4KgPfLmF/iV6ntW3MTNqfPwPqDv9sQaEW848hvYtAA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "9ec9edd640f539dfb0d83fc65dd04a5d3aa23bf21fdb56d404e0653d7d980c29" + "verifiedBindingDigest": "f26c8808dac50a7fc0589345449ad114ae2ac09babc7e6d47de9689ead3f6212" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json index 011f186..ab91d68 100644 --- a/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json +++ b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAGQdy8d9paWebvqE4Bp4MVff7vGj1sFLL/fE81gGvzHU=", - "signature": "kCKoPgG1VYeYI6pJln0lhb1gdjHKZGfRRofFZYvHZzwq0q/OzJ18NkhC6IuWPZEMY5dKM3nFquuRWRv7H3TXDg==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfChkRiqsJcH2j8F0STWhzF5R5QUt9Q117RKwGEIwk0g=", + "signature": "uo4JXfKK8dDHuHW939wAKNPgpSLe0yt8TXvXnd3u++0fugpgVrTJyfw5518O1ESHwEJpw//ciWPUj75TGobRBg==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "802a2518820f40671c942c61d473fc09902b4f1673c1a76b876436f5c6857988" + "bindingDigest": "1005977b71a5077209fcac8e2f278820a272c2a2385d55d22d907e83ba58a865" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAGQdy8d9paWebvqE4Bp4MVff7vGj1sFLL/fE81gGvzHU=", - "signature": "7KKPPjkbT6RqT0FayIvfNXyWb48To963LgTUjZH6ongaDzk7V1Tp6jptjblr/xYnsuK5HNgc3uBSFaR1lTb2Dg==" + "publicKey": "MCowBQYDK2VwAyEAfChkRiqsJcH2j8F0STWhzF5R5QUt9Q117RKwGEIwk0g=", + "signature": "dPr1V7lpPVAnl/8ulPOlYwQrwVsKUKfFekMH20Z2eHhRq2TXcfL4aJL79UrLAKu89S91ZUtZH3g91l3+XPvOCQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "802a2518820f40671c942c61d473fc09902b4f1673c1a76b876436f5c6857988" + "verifiedBindingDigest": "1005977b71a5077209fcac8e2f278820a272c2a2385d55d22d907e83ba58a865" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json index 76848b2..591fa4a 100644 --- a/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json +++ b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA8Senjamn1OPlnIXwyP2pxf94IWCLlt837KKuJ/Qeyjo=", - "signature": "Zw4H08ZdI0vEdkzmvK8Eor8rJMdisqPYP8E3GY0RsCIcyZNnVXMEw09BdG0bgRLkKaEq1oCKPTS6X3a7gufTDA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAs8tp+BBdgcbrvF6IeR01NpQGa0GAZsZWjoe2dgyR91s=", + "signature": "gtO14zycW4EiWhrnCOlc/a+II49Zjqn2FeR3Qq0GoljGHe7MplBKRp12WY9kylru98t38mhp8tOdMbsLr1knDw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "4103c86c1e185da6ba9d44b4ce7dc9eeee37315ddaa4c65a88e3d0affd65b5fe" + "bindingDigest": "28c479661e382571cfbb814653e26be7b83168c7af86e71a3e4ac52cb3bd675b" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA8Senjamn1OPlnIXwyP2pxf94IWCLlt837KKuJ/Qeyjo=", - "signature": "pCtj0B/ifeRWfSLoArde/CySkg0by942Dx1VQGd4bIYfI3VXjZ80XZE5Od06Gz/PM03lPnD8ZJ7MiYXd8gisCQ==" + "publicKey": "MCowBQYDK2VwAyEAs8tp+BBdgcbrvF6IeR01NpQGa0GAZsZWjoe2dgyR91s=", + "signature": "QXMpbkTaiozTVIuu6WaON43yg5NfumOWYZ8ktZNexQGNHE6mjnNSG7fYw29evPoKD5y3c0ReV3J+56GGuuaCAw==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "4103c86c1e185da6ba9d44b4ce7dc9eeee37315ddaa4c65a88e3d0affd65b5fe" + "verifiedBindingDigest": "28c479661e382571cfbb814653e26be7b83168c7af86e71a3e4ac52cb3bd675b" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json index 12d4c4c..1882d1d 100644 --- a/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json +++ b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAyTmYJ8RlSSJ4h/IAWhf9U2U6GqDotWUAgiocZrNu/WE=", - "signature": "FSS7OC4QtaSasgfpOAL+9FeNwUcajsh2+J3iuYZq9uSvvTTUBGs+DGsZmZ7S94Mk2NoeRxHkHOvulCjOje53BA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEATNtwUKsqlk0RzQarzXL1ibmpqYMT0i3dyFA6Lcihl9Y=", + "signature": "2gDdhpnfYj+ReIBUuqx7waiMYtKKV38k4SR/7dJmcSyE7Z86/3jaz2IrLpkLmREiVQqRZ5t9QI3WryqLxjBiAg==" + } } } } @@ -78,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "e5eeca76eded039b328e423d6a4311b23eeec12b3f0dcd742036ed1f80eded72" + "bindingDigest": "84c7af446882cc6049610fcacd7a096e009e25ced9732fdfdf27ab0ffbe5f959" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAyTmYJ8RlSSJ4h/IAWhf9U2U6GqDotWUAgiocZrNu/WE=", - "signature": "niDBy6G9/maUFylPrdsDy+hP0OWzOnf7fq1SIy2AW0029QqVBETEynnK/hJSY0cNy2yegpu9BQsHTpnUGj6FBQ==" + "publicKey": "MCowBQYDK2VwAyEATNtwUKsqlk0RzQarzXL1ibmpqYMT0i3dyFA6Lcihl9Y=", + "signature": "yhFspqc2HkzZ7WTB/KQ3CC6XvXxzUe6pbpTX0bs1I35ZpCVn4BE2Z5h8SbZ0lSBhWhibqJdwyM6k42ttCub6Dw==" }, "privacy": { "classification": "metadata-only", @@ -99,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "e5eeca76eded039b328e423d6a4311b23eeec12b3f0dcd742036ed1f80eded72" + "verifiedBindingDigest": "84c7af446882cc6049610fcacd7a096e009e25ced9732fdfdf27ab0ffbe5f959" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/01-active-direct.json b/tests/conformance/embodiment-bindings/positive/01-active-direct.json index f4e0b60..241fd18 100644 --- a/tests/conformance/embodiment-bindings/positive/01-active-direct.json +++ b/tests/conformance/embodiment-bindings/positive/01-active-direct.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAg3EKIsENulMA020V6PQWVby8vzKS2dQmYnK9QcW2iS0=", + "signature": "Q8ByQzdh4f+jqRa1alXb6ta46xT8UpZfKp+vJ91DvLoGii2G1LrCpmDof66VGmDLnmQAqYvyF16SIWY9Kt1vDw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "47f66e02291f1463d5b1ab7692d28a2b6beff312f9bcfe9e10c5e14a585377b2" + "bindingDigest": "2bd8f371da4d27410e81d5af18189a7a1943273c6d528f2a989e9521cd35e8b1" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "xvifuOOIfsa5d3MXGCC1ztYhXCSUphiDV9IusKHHwH9fORjr23jsGOh72znZwjaRD4ntudpkcjVJvPngpmPuAw==" + "publicKey": "MCowBQYDK2VwAyEAg3EKIsENulMA020V6PQWVby8vzKS2dQmYnK9QcW2iS0=", + "signature": "n+SDfC4ekX6TCp6uRs3ZixfcRfYmxRdtGGnov3r9pD/jxihvAZAYvOrfcBItrlkZ0jeYuNker4BqHaF1D1xkDQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "47f66e02291f1463d5b1ab7692d28a2b6beff312f9bcfe9e10c5e14a585377b2" + "verifiedBindingDigest": "2bd8f371da4d27410e81d5af18189a7a1943273c6d528f2a989e9521cd35e8b1" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json index a87288d..2436c1a 100644 --- a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json +++ b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAoIM1QChAlVY8y4bHrWizmYNQDJr2cxws7hwDGkhl/gI=", + "signature": "6Hw7PiVlqwLFH45bqnZ7qxD72mGIG7arAarGnhr10MbWI2+Xo0WULjp2quFDEUj4PoksadZq6K2LlVhPUzOqAQ==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "7849a6064428f7b78ed297898ecd3dfefe498862410b66db4f80807e86404996" + "bindingDigest": "8a87502d0b4ca340e0993aebd17ab59a922d44f6f6b58140edeb2b3d97667279" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "2EZpy7r1GQrc0wjKTNfnAyB/GDXzNx/OllsaD/+kWTepmgyl61ou7yV0Tpomr4a3myKlerlQy1EfFDTeSSOSCg==" + "publicKey": "MCowBQYDK2VwAyEAoIM1QChAlVY8y4bHrWizmYNQDJr2cxws7hwDGkhl/gI=", + "signature": "3omFX9YPDcEPFJB5vQa+f8OYpB+HwrNaM+RuDhPa/5OojwycXfzwS+cxuuwTXJPpCL78dEPIJHl509aahUGgDQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "7849a6064428f7b78ed297898ecd3dfefe498862410b66db4f80807e86404996" + "verifiedBindingDigest": "8a87502d0b4ca340e0993aebd17ab59a922d44f6f6b58140edeb2b3d97667279" }, "aliasResolution": { "alias": "Sage", diff --git a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json index fce6c91..f20e0a3 100644 --- a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json +++ b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAE9/foTbRtFek2KwxRzCRuRuM6W6j8kIzaHkepla/Ao4=", + "signature": "BvOvy2qlK+kUyrLZgVdZVu8+CrxkXvtr67C98w49eCTRhR7a4oqX+gGY2lw8JQTJ/Z6QrR/C2y0LmFTaeKzRDw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "fdef0c17aef7aa107a953b45755c5d3e6480d41372913b7b7d7b6d5956f223cd" + "bindingDigest": "dba441d371b780599689807f5a14aa0ed0ae8d32efc2a0951be4cd194c8ff250" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "XPhGtMCOruwL9YNDqL9W1UgFIKtYd5G8sKwcNs8CR4wD3t41sQPNRWP/9DNLbqJ8yMwjuPR9EqK/7OLXoAR8DQ==" + "publicKey": "MCowBQYDK2VwAyEAE9/foTbRtFek2KwxRzCRuRuM6W6j8kIzaHkepla/Ao4=", + "signature": "QPYdPQlnrib7mW0pYDdKkvkHWpt2BFLyEPLJtxvNQg5QQEoAXcnzGs/5c+LBujTcy4F6hVTrJgc8LM+T0lgZCQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "fdef0c17aef7aa107a953b45755c5d3e6480d41372913b7b7d7b6d5956f223cd" + "verifiedBindingDigest": "dba441d371b780599689807f5a14aa0ed0ae8d32efc2a0951be4cd194c8ff250" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json index 0b511f8..d7808f1 100644 --- a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json +++ b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json @@ -16,10 +16,16 @@ "status": "retired", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "restoration", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAHRc2dLdoAMRHEU3qnnE175hxWHT6qyPuzXouuteKyxk=", + "signature": "wr8OsVPGKAL0EYTbSvrreU1Q/MKtSLFY4KIVTlyMwaEvgtBzCaIridHebikENqFO1+Q0HXQyfGnfbkSnyBi6BA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "fdde16db734bb0e192bc25b1704021db0a17fa65be15ecd2809301130c3be127" + "bindingDigest": "671b0ea113712c0d2094ccd38d8a1beed91efbdbe2316c22cbd4e79fc11cfe79" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "abNH72ueQqdEEf0OD+T3IAklDqpllTTM1bJW7GVY0zsAoS6t542TjX/I2x7DXOzyY7hXhRoeK1RLJtM+f0drBw==" + "publicKey": "MCowBQYDK2VwAyEAHRc2dLdoAMRHEU3qnnE175hxWHT6qyPuzXouuteKyxk=", + "signature": "u5hhKgyBIUt+eSqd6YH1GTEKfBkm/HcfxgM/udsZi4xqLhdJ7PKZ/auPqp/QiHd+lnDToSspI1gBedfZn4/zAQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "fdde16db734bb0e192bc25b1704021db0a17fa65be15ecd2809301130c3be127" + "verifiedBindingDigest": "671b0ea113712c0d2094ccd38d8a1beed91efbdbe2316c22cbd4e79fc11cfe79" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json index 999543c..e5413ee 100644 --- a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json +++ b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAF5HUWMNkYvV18H0+0LNmp0Ry7KlVy2Rd3S5XRW1LM6I=", + "signature": "D6zI3ZqlYYwK8QRM6m/RJ/ahnYCB8XGGSF4+VTMxnUnq6OrrCR1HdOTur6Uc756rRFUf8CPl6oMasN+52dbjAg==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "408e28123ed2bfd9819d8e81427139586aa5a1db7a725df04dcb1d709dbe1e28" + "bindingDigest": "1f23291db91045333bfb17be90501a3c931fcec2fd724ffae77759dc1cde9db8" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "L7YyIjNGTk615iAeo3n4A84UUIpCX50sdw+bFqTvE4MXzwHtlilx1jgdyOmAiHGJLkIldmJ5L9/4pIE8hu0ZCw==" + "publicKey": "MCowBQYDK2VwAyEAF5HUWMNkYvV18H0+0LNmp0Ry7KlVy2Rd3S5XRW1LM6I=", + "signature": "rqVLVAdGZF7Ty5raC28g7x0xvWS3i9POW3SvLJAyPpVD0MYrHyyXYGAjnpVBWqzd36kId5wzjR5H2XLS/g0/Bw==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "408e28123ed2bfd9819d8e81427139586aa5a1db7a725df04dcb1d709dbe1e28" + "verifiedBindingDigest": "1f23291db91045333bfb17be90501a3c931fcec2fd724ffae77759dc1cde9db8" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json index 69a050e..158a7bb 100644 --- a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json +++ b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json @@ -16,10 +16,16 @@ "status": "active", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "fork_new_root", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:maple", + "successorIdentityRevisionId": "familiar-revision:maple:0", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAyC9LtfC3oM6dVV8HGg1l68UDWhDESynH43aroQmhk2I=", + "signature": "Xxq580n1CtszQIkoLORSEsDPXDVv6L6sZysIbbkK1v132+rc5MoMGyWscJnlP6VOHF1FCkueNPAb4rrK329mDA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "93158adeb4c3b5bbdd48d4685ff47a5b38b5bf722fe9b42b96e13497e5fd4634" + "bindingDigest": "2bc9bc46be75cfc3378985270fad46a85773d7ae11762c90e7e1cf5c3be57541" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "5KeBZpK7+WvhlCcxRK+E/3aUCz5jN/ClZnvzB712VFCNTjwU9L/rU/fD0eoQBW7G4v/JlYU7uHlRBoyJ2EhdAg==" + "publicKey": "MCowBQYDK2VwAyEAyC9LtfC3oM6dVV8HGg1l68UDWhDESynH43aroQmhk2I=", + "signature": "CffkuHAF5AyKeVFaimRaTjfN1KIz8I6DyYaZ1bryVZZ1queasnau3STA6t98jqqRFkNefMV8URxuDhTC+/H/AA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "93158adeb4c3b5bbdd48d4685ff47a5b38b5bf722fe9b42b96e13497e5fd4634" + "verifiedBindingDigest": "2bc9bc46be75cfc3378985270fad46a85773d7ae11762c90e7e1cf5c3be57541" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/07-succession.json b/tests/conformance/embodiment-bindings/positive/07-succession.json index 3f30c13..fd4cd6f 100644 --- a/tests/conformance/embodiment-bindings/positive/07-succession.json +++ b/tests/conformance/embodiment-bindings/positive/07-succession.json @@ -16,10 +16,16 @@ "status": "retired", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "succession", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:willow", + "successorIdentityRevisionId": "familiar-revision:willow:0", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEArV9IFUcLykGOFrIxSgjLBvZSSGegbN4Udj7nPvyDbSI=", + "signature": "+0xNy3Rs5P6dow1RFrvcySL9qzBZSNh+unPK3DtkCRCxt5p07KvayUSbm4bBBdAbShdJbI8bi2oQavyXCS8yAw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "61c2a601dec64d9dc484a91634127939f02ba73f2d5a67e5f22559d42a1fbfd6" + "bindingDigest": "b28691dafc74c656dbf940f4c53ddaad453ecd2ec1aca0011c46c9368c65537c" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "tGOK6kZ7PmYLVyVa4tijGPJFUIHokzANtVtQMIMaWQ0MJQ+GR2oy7m9RcioQ4jT5/SxQ+uGpcNik7SdAzbs4CQ==" + "publicKey": "MCowBQYDK2VwAyEArV9IFUcLykGOFrIxSgjLBvZSSGegbN4Udj7nPvyDbSI=", + "signature": "GXbAvdZwsMBWCZu5kVhoOwnJN6gpQTeNbJ75m2BTQzDBMw1Fyhf0ZcIqY+GRQogZwbmpkT2rKlV7awUjrOirDw==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "61c2a601dec64d9dc484a91634127939f02ba73f2d5a67e5f22559d42a1fbfd6" + "verifiedBindingDigest": "b28691dafc74c656dbf940f4c53ddaad453ecd2ec1aca0011c46c9368c65537c" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json index 15773c3..bdc8c23 100644 --- a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json +++ b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA+Av3tywGkLvIp4IU/cTkUQPxDBS2BrsDMUIbsXKwbOU=", + "signature": "h0zH/sjHtItbC9QU4II0aFpnp9Vjb5ksgdW8o15me0Jq+So3lqFVxVh0EpLxMk53hJszLN5k3bJh3MMy63HrCA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "610514b91202b9be05bfac4d770946d737e249f57c91a8d5f36c6852bc55f69d" + "bindingDigest": "60d47c75d1c952ada6bbbd412a02ed61226035058e02f1731741862747289809" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "H/jqvMRSOPFIRLltBUcGqF2RHAD0C+V84Wo05B0+EI1qlbzGJ9lTahGx6S33uNLiAFWettSBF7U81IgOitYjAw==" + "publicKey": "MCowBQYDK2VwAyEA+Av3tywGkLvIp4IU/cTkUQPxDBS2BrsDMUIbsXKwbOU=", + "signature": "gA2p2N5HKUZF0yvp+ULcqRaEQOx8IGubKy5/pXOXgMDaqHksCfVaVY3cWIUbZGZWTqOuV118KTkylvqUjpXkAA==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "610514b91202b9be05bfac4d770946d737e249f57c91a8d5f36c6852bc55f69d" + "verifiedBindingDigest": "60d47c75d1c952ada6bbbd412a02ed61226035058e02f1731741862747289809" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json index 27706d2..3795fce 100644 --- a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json +++ b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAvX++y9mckDzsCmnxD34KlU758pDibRljhjRvojGNk9Q=", + "signature": "kwCb1GZvg8w6NDEkfSP1l/OGwllCHpQQARDXZlRvOeKZzJmXAW6rkOs+yijrxY2wU/prEweDtiJabgyU8FnkCw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "84a015b55e2645c3d7e9e3361c1e59f928fb69cc12a737a8c1feba32aeca531e" + "bindingDigest": "39b64e8de92329a84bc22d5701b0f525bc61d6bac43dbc133a48e887588b7b95" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "fEw7bN60bEXGrO+AjXzD1qNX65B4X7MPQfE2VSwmffB/lOFLh4Nl+ZPGBUjSOLvHU7lOLiKhYYjPwb8I7N7+Bg==" + "publicKey": "MCowBQYDK2VwAyEAvX++y9mckDzsCmnxD34KlU758pDibRljhjRvojGNk9Q=", + "signature": "JS3ECTkLNCp3Y8vvbwMucc0+5Q3Er0aS/g6Vd1jF061KVCx1DMWH9/+cHk9brqFRJplqoUH+Jw3XVe7FBwG8Aw==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "84a015b55e2645c3d7e9e3361c1e59f928fb69cc12a737a8c1feba32aeca531e" + "verifiedBindingDigest": "39b64e8de92329a84bc22d5701b0f525bc61d6bac43dbc133a48e887588b7b95" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json index 3fe1cd1..6f5d6f4 100644 --- a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json +++ b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALG7wYXETSVCHvzFhJrvNmcCPrCZO/NKeV+ovFJoiSaI=", + "signature": "iOE8GMGd+62Dj0I/9ntxtG4pM4hLlTJ1fabyaDGHB+d5Tj99GqrumLkWzZdtgrbOId/Cb9pO+5Fr8wCuxTs0DA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "014be7f40c72b52769e59bf3fbac48af67a97a6998917a9c6c372853ea151e33" + "bindingDigest": "65769ff3398b3196c743bc79f87f00cb58c57a28c1ced902aeb9af3101c38733" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "asWk3sjP9kWLwTPj1JM7zQoInd3SZV3vxuHIYECXoa5RwGbHae2Q7Y3V0M2LJTwaJCKLyNwrTbuHerm9QdorAA==" + "publicKey": "MCowBQYDK2VwAyEALG7wYXETSVCHvzFhJrvNmcCPrCZO/NKeV+ovFJoiSaI=", + "signature": "P3LO3PWAST1qVRQnFIOIzEWHmnVP71KcIr3ZwwYhYIUyLcINtEfHv66zMLWXr12T4GPH/df8m5YkQL4diLDtCw==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "014be7f40c72b52769e59bf3fbac48af67a97a6998917a9c6c372853ea151e33" + "verifiedBindingDigest": "65769ff3398b3196c743bc79f87f00cb58c57a28c1ced902aeb9af3101c38733" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json index c42343b..592a30e 100644 --- a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json +++ b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA66n11LnedlvPM6Iubs1tccbgkw+XWDIzWK2K34D7K2o=", + "signature": "hTG5hXTX/DctgRH138jbxgYoqLzXDGaNmFj5JKKvxoIK7jIRUmRH+NxcoL5J1MqiqQyhuh+Py5jBiNZn6UCuBA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "9a4eefe6edd8ac0c39b7073e720226f68c3442942adf0b1359a3e652a175dc25" + "bindingDigest": "f342ca63732c709d740cbd54b62a374f66456df3a271db367f4cf049230a59ee" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "CHl5RRyx0b8a9odBg9PloZ+4W7IsWd1ZUyiRbhD5iuyo9HH0+EEPABMtb3nKuHLXC42E9WJjRY7KvOqpda7zAg==" + "publicKey": "MCowBQYDK2VwAyEA66n11LnedlvPM6Iubs1tccbgkw+XWDIzWK2K34D7K2o=", + "signature": "lWT7AJsk6Edjgg5+m2rTXwdeJScNhuYB7GwGK+FtMyJGj+lf7H3VIT2egao/6Eg1gilQBBJ4FSLkk8nHrenVDw==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "9a4eefe6edd8ac0c39b7073e720226f68c3442942adf0b1359a3e652a175dc25" + "verifiedBindingDigest": "f342ca63732c709d740cbd54b62a374f66456df3a271db367f4cf049230a59ee" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json index a7fb229..a9bb9d8 100644 --- a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAjvLbRBQgp/Glw9MPGWV4CrhSs+p9t1FbVaigSe5hKbg=", + "signature": "jWL2TWEgHw9MsgB6bFc5nUpezzwwuHDnW0bfoV/wplZ59Nty246EtwWh5Rrn8b6PKH5F+/geFoHU77J/ySNYBA==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "17df05628e1466725b1a3a768deaf99e2cbbc30657d97294d49d7174c551bb86" + "bindingDigest": "ee3556999b2f82ad17ea1a0b605072d0aceb6cdc4adabe2098cd2baeb3035fef" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "Gw/O9bilLJsunHb26c3kGEKx0p/SbgM/LZdZg/e1i6q6nbJBq7uTYErmQuuc3M5lmgGbuzmsThMSJNk7aidlDw==" + "publicKey": "MCowBQYDK2VwAyEAjvLbRBQgp/Glw9MPGWV4CrhSs+p9t1FbVaigSe5hKbg=", + "signature": "qpD793GZQ5wqr6WHGh5NwVnLRMcYIX3dma1MQqXbfnl4UuN5PvEDvyzHnUIFz7dRLGHhUMFIfDOeMNDNg+ONAg==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "17df05628e1466725b1a3a768deaf99e2cbbc30657d97294d49d7174c551bb86" + "verifiedBindingDigest": "ee3556999b2f82ad17ea1a0b605072d0aceb6cdc4adabe2098cd2baeb3035fef" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json index d7ae893..c87bad0 100644 --- a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json +++ b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAgjXq6iqeiqqbCBeOImCa+M4WPgEmUfQOoraw6qIh7K8=", + "signature": "RwYOmOHok17jzi2Gb+77kt46dbejwmDqi3N3C/XGkbygtQ3jJZQGmSIpSKbrFGcAHRoR4Z2xyvS09wllJ9eRDw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "9c428bac1d64b7f21f42f503ae44c50e63204000edd6e340c8d0771a7a7f0098" + "bindingDigest": "0e67783f123f649966ca51969f2b739806ea03c1ab5fd8096059bf28dc40aaa3" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "02E9DD+VMrS9FGYntcp8bc8O9cuJjIJMyBSumDqaq9svIiof5iV0YQE8GvzP4KJZ8Uo80wkRfuFv4IW7YfxHDQ==" + "publicKey": "MCowBQYDK2VwAyEAgjXq6iqeiqqbCBeOImCa+M4WPgEmUfQOoraw6qIh7K8=", + "signature": "MS7R3wwsAfR7NCEz6eybZItXOKyKx52RvnlgDxXarfBxA6aGqwTH9JsjfsoIWuszFpTc7isEywESAxI/lm0qAg==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "9c428bac1d64b7f21f42f503ae44c50e63204000edd6e340c8d0771a7a7f0098" + "verifiedBindingDigest": "0e67783f123f649966ca51969f2b739806ea03c1ab5fd8096059bf28dc40aaa3" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json index c8e890e..e6c614d 100644 --- a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json +++ b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA5FW0Nd7isRMfSzOlhDA25kkZtnC+86ivQyw4op3Q9sA=", + "signature": "6hBXB10SWNiCGRALQfTTuO0+mQMh+fNLW+Jqw1QwHrxsTmjapNu8AxmtSHJZWCqi1zFyJ2CcFvEsaYBep806BQ==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ea08790d16682e671a9b761a0283e4132ed1e7d16516126db0ed96816f5cb4b2" + "bindingDigest": "45842a6828b8e38ee5a7db4ca381ed15fde7263346f310a8f1de4290beaae9d6" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "rhAqcy19DjNW0B0wuJa5M/ECZiXdpKmGvmD0rfQay6dVnGQyStJ3lAQo3yY6zS/EhNArDU+meDCAk8UQYLiHCg==" + "publicKey": "MCowBQYDK2VwAyEA5FW0Nd7isRMfSzOlhDA25kkZtnC+86ivQyw4op3Q9sA=", + "signature": "04u1+4Z7qbmKU+QwzVPfoHDHvQAR8Rvm8aXmNFpzH1dgzzT317vd1Gf8uw6temX2MJ7oMgPGM4fZEAt2YffFDQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ea08790d16682e671a9b761a0283e4132ed1e7d16516126db0ed96816f5cb4b2" + "verifiedBindingDigest": "45842a6828b8e38ee5a7db4ca381ed15fde7263346f310a8f1de4290beaae9d6" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json index 62b2e48..b30dbbc 100644 --- a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json +++ b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "WSh3L873lxKqD1NH20yEYH6US9Z4iekdsGY+MCxa6kvXtpcJC1FhSnDVyfchp2m9h/t1cS3iTtbXxEV7yAbqBA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA74O8Sc+BQ3c8dcPLmw1zxE8LDDoVadwfqUyiUyrUPaY=", + "signature": "XjIDnE04JKpwfu8sLQtxZNBM3bd/SWymGG47sFZxeb5ZpOrlSH1d2+rSWM2oD59cxhm1Zo+iPqKK1p8zxIsqAw==" + } } } } @@ -78,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ff141a5d5f7c40553fa5208a9f26a354c83550989eb99ecdd24b9192df35300c" + "bindingDigest": "5f53c0ee95cb035c195bb45bd129122d339d20ac16062301aba2c5c5460b6ea0" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAlWU5gXFdbNc2qSkWVDd9IqarCUNox0b3bCjP7GBqMoQ=", - "signature": "nvyykqKHuiEFjJ46jMXZBhjyeuxrdPIMLafWvhpzJ4+m0mbGT0dGtp7grRzYa8RdAvY0iGbuuwgtdPDGSzQGAw==" + "publicKey": "MCowBQYDK2VwAyEA74O8Sc+BQ3c8dcPLmw1zxE8LDDoVadwfqUyiUyrUPaY=", + "signature": "hDf9YXF1x5xxRgIl0UNjQ/pHDu7mMzXMO30JX2clv4WJPaCq5yFYWRc17K4pKMPGgMIAkxLaRnZ0EePZkG8OBA==" }, "privacy": { "classification": "metadata-only", @@ -99,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ff141a5d5f7c40553fa5208a9f26a354c83550989eb99ecdd24b9192df35300c" + "verifiedBindingDigest": "5f53c0ee95cb035c195bb45bd129122d339d20ac16062301aba2c5c5460b6ea0" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json index 6a0e30a..e0d02d9 100644 --- a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json @@ -16,10 +16,16 @@ "status": "superseded", "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "transition": { - "method": "ed25519", - "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAXhqYyci8lIYaO/15XhBe9YeZngrmGxRdkumlMMv27Xs=", - "signature": "SPmlmVag5+8FkSinsl8AffDijUVe0bRc2AjwM26PTkrr7vzQrOa26rVdsliglhMjXDQzXCldqZlgG22TrqM8AA==" + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAM6ME5u8D9PafgZGnTnl77zDJGeqDo03j9FfJQ/bVn4w=", + "signature": "HiLvI22QdXPVFINgboLTfWlqSBVSjqq0vXolGmahyAhmkeIcEPxdNljv2ibWiKs+3RYqbFMrLgWD/DgK2gXJAw==" + } } } } @@ -77,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "38ba41a3b7e10725d0863e036fe63fd88c419150f22a683cf649dad4febe7116" + "bindingDigest": "a917481a2055f486ca0e306c294a25494d61e26e1a88103b5183528e54081199" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAXhqYyci8lIYaO/15XhBe9YeZngrmGxRdkumlMMv27Xs=", - "signature": "8TkILVVEB/XqMe6R0nVl7FsJf0YX6o4srVMQf9x2tqiOna/dlfylQMgCRGygmuu3PIR5GJNthhU6CuH8AKs5BQ==" + "publicKey": "MCowBQYDK2VwAyEAM6ME5u8D9PafgZGnTnl77zDJGeqDo03j9FfJQ/bVn4w=", + "signature": "DsZdbmYpUssza8cY9X0Cc9R0RTc+yBxQlbZqsay8JzwTuxpTV0p3wMKb/wqQkhsjW/B/TOAXSsw0VZ2widy+AQ==" }, "privacy": { "classification": "metadata-only", @@ -98,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "38ba41a3b7e10725d0863e036fe63fd88c419150f22a683cf649dad4febe7116" + "verifiedBindingDigest": "a917481a2055f486ca0e306c294a25494d61e26e1a88103b5183528e54081199" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/validators/README.md b/validators/README.md index 287ba37..069b954 100644 --- a/validators/README.md +++ b/validators/README.md @@ -102,6 +102,11 @@ SHA-256 JCS binding digest. The digest excludes the complete `integrity` and `authentication` members, so verification is non-circular; no private key is accepted or stored in the profile. +Each predecessor transition separately signs the relationship, predecessor +bundle digest, and successor root/revision. This lets the validator distinguish +continuation, restoration, fork/new-root, and succession without trusting +unstructured lineage prose. + ## For CI Integration ```yaml diff --git a/validators/validate.js b/validators/validate.js index 1c6c400..ea94a4b 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -95,6 +95,19 @@ function digestObject(value) { return crypto.createHash('sha256').update(canonicalJson(value), 'utf8').digest('hex'); } +function validTransition(transition, predecessor, familiar, relationship) { + return transition && transition.relationship === relationship + && transition.predecessorBundleDigest === predecessor.identityBundleRef.slice('urn:sha256:'.length) + && transition.successorFamiliarRootId === familiar.familiarRootId + && transition.successorIdentityRevisionId === familiar.identityRevisionId + && verifyEd25519(transition.authentication, digestObject({ + relationship: transition.relationship, + predecessorBundleDigest: transition.predecessorBundleDigest, + successorFamiliarRootId: transition.successorFamiliarRootId, + successorIdentityRevisionId: transition.successorIdentityRevisionId + })); +} + function validateHistoricalBundle(bundle, binding) { const violations = []; if (!isObject(bundle) || !validateIdentityBundleSchema(bundle)) { @@ -202,7 +215,7 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { if (['same_familiar_revision', 'restoration'].includes(lineage.relationship)) { if (!predecessor || lineage.rootEvidence !== 'continued' || predecessor.familiarRootId !== familiar.familiarRootId || predecessor.lineagePosition !== familiar.lineagePosition - 1 || predecessor.identityRevisionId === familiar.identityRevisionId || - !predecessor.identityBundleRef || !predecessor.transition || !verifyEd25519(predecessor.transition, predecessor.identityBundleRef.slice('urn:sha256:'.length))) { + !predecessor.identityBundleRef || !validTransition(predecessor.transition, predecessor, familiar, lineage.relationship)) { violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Same-familiar continuation/restoration requires an authenticated, content-addressed edge from the immediately preceding distinct revision on the same root.')); } } @@ -210,8 +223,8 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Restoration requires a retired predecessor on the same familiar root.')); } if (['fork_new_root', 'succession'].includes(lineage.relationship) && - (!predecessor || !predecessor.identityBundleRef || !predecessor.transition || - !verifyEd25519(predecessor.transition, predecessor.identityBundleRef.slice('urn:sha256:'.length)) || + (!predecessor || !predecessor.identityBundleRef || + !validTransition(predecessor.transition, predecessor, familiar, lineage.relationship) || familiar.lineagePosition !== 0 || predecessor.familiarRootId === familiar.familiarRootId || lineage.rootEvidence !== (lineage.relationship === 'fork_new_root' ? 'fork' : 'succession'))) { violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Fork/new-root and succession require authenticated, content-addressed predecessor evidence, position 0, a distinct root, and matching root evidence.')); From 55a652511a41613045d5b3365315513b8b6e2513 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:28:47 -0500 Subject: [PATCH 04/16] fix: harden embodiment verification lifecycle Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- CHANGELOG.md | 4 + rfcs/RFC-0001-familiar-contract.md | 14 +- .../familiar-embodiment-binding.schema.json | 6 +- schemas/familiar-identity-bundle.schema.json | 7 +- .../bundles/01-active-direct.json | 14 +- .../bundles/01-ambiguous-alias.json | 14 +- .../bundles/02-stale-cached-revision.json | 14 +- .../bundles/02-unique-alias-resolution.json | 14 +- .../bundles/03-retired-historical-record.json | 14 +- .../bundles/03-revoked-revision.json | 14 +- .../bundles/04-restoration-with-lineage.json | 14 +- .../bundles/04-retired-dispatch.json | 14 +- .../05-new-revision-same-familiar.json | 14 +- .../bundles/05-principal-mismatch.json | 14 +- .../bundles/06-fork-new-root.json | 14 +- .../bundles/06-tampered-bundle-digest.json | 14 +- .../bundles/07-succession.json | 14 +- .../bundles/08-direct-coven-session.json | 14 +- .../bundles/09-revocation-before-commit.json | 14 +- .../bundles/09-scheduled-automation-run.json | 14 +- .../10-scheduled-automation-attempt.json | 14 +- .../bundles/10-unknown-field.json | 14 +- .../11-psyche-delegated-execution.json | 14 +- .../bundles/12-tampered-binding-digest.json | 14 +- ...3-cached-superseded-apparently-active.json | 14 +- ...13-privacy-authorized-historical-read.json | 14 +- .../14-unverifiable-authentication.json | 14 +- .../bundles/15-lineage-self-predecessor.json | 14 +- .../bundles/15-revocation-after-commit.json | 14 +- .../bundles/16-timezone-missing.json | 14 +- .../17-erased-redacted-historical.json | 54 ++++++++ .../bundles/17-malformed-calendar-time.json | 14 +- .../bundles/18-tombstone-without-purge.json | 14 +- .../20-revocation-at-commit-outcome-none.json | 14 +- .../bundles/21-stale-active-cache.json | 62 +++++++++ .../bundles/23-unknown-schema-version.json | 62 +++++++++ .../bundles/24-redacted-verified-history.json | 54 ++++++++ .../embodiment-bindings/manifest.json | 4 +- .../negative/01-ambiguous-alias.json | 25 ++-- .../negative/02-stale-cached-revision.json | 25 ++-- .../negative/03-revoked-revision.json | 25 ++-- .../negative/04-retired-dispatch.json | 25 ++-- .../negative/05-principal-mismatch.json | 25 ++-- .../negative/06-tampered-bundle-digest.json | 25 ++-- .../07-degraded-history-dispatch.json | 19 ++- .../08-unauthorized-history-dispatch.json | 19 ++- .../negative/09-revocation-before-commit.json | 25 ++-- .../negative/10-unknown-field.json | 25 ++-- .../negative/12-tampered-binding-digest.json | 21 +-- ...3-cached-superseded-apparently-active.json | 25 ++-- .../14-unverifiable-authentication.json | 23 ++-- .../negative/15-lineage-self-predecessor.json | 25 ++-- .../negative/16-timezone-missing.json | 25 ++-- .../negative/17-malformed-calendar-time.json | 25 ++-- .../negative/18-tombstone-without-purge.json | 25 ++-- .../19-verified-history-missing-bundle.json | 19 ++- .../20-revocation-at-commit-outcome-none.json | 25 ++-- .../negative/21-stale-active-cache.json | 123 +++++++++++++++++ .../negative/22-duplicate-schema-version.json | 124 ++++++++++++++++++ .../negative/23-unknown-schema-version.json | 123 +++++++++++++++++ .../24-redacted-verified-history.json | 123 +++++++++++++++++ .../positive/01-active-direct.json | 25 ++-- .../positive/02-unique-alias-resolution.json | 25 ++-- .../03-retired-historical-record.json | 25 ++-- .../positive/04-restoration-with-lineage.json | 25 ++-- .../05-new-revision-same-familiar.json | 25 ++-- .../positive/06-fork-new-root.json | 25 ++-- .../positive/07-succession.json | 25 ++-- .../positive/08-direct-coven-session.json | 25 ++-- .../positive/09-scheduled-automation-run.json | 25 ++-- .../10-scheduled-automation-attempt.json | 25 ++-- .../11-psyche-delegated-execution.json | 25 ++-- .../12-degraded-historical-bundle.json | 19 ++- ...13-privacy-authorized-historical-read.json | 25 ++-- .../14-privacy-unauthorized-read-denied.json | 19 ++- .../positive/15-revocation-after-commit.json | 25 ++-- .../16-unverifiable-historical-bundle.json | 19 ++- .../17-erased-redacted-historical.json | 123 +++++++++++++++++ validators/validate.js | 31 ++++- 79 files changed, 1666 insertions(+), 487 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/17-erased-redacted-historical.json create mode 100644 tests/conformance/embodiment-bindings/bundles/21-stale-active-cache.json create mode 100644 tests/conformance/embodiment-bindings/bundles/23-unknown-schema-version.json create mode 100644 tests/conformance/embodiment-bindings/bundles/24-redacted-verified-history.json create mode 100644 tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json create mode 100644 tests/conformance/embodiment-bindings/negative/22-duplicate-schema-version.json create mode 100644 tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json create mode 100644 tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json create mode 100644 tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 6364bd9..db021fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ This project uses [Semantic Versioning](https://semver.org/). Resolution snapshots, strict RFC 3339 timestamps, authenticated lineage edges, retention tombstone/purge evidence, and a fixed error-code conformance manifest close stale-cache and vector-integrity gaps. +- **Rereview hardening** — Defines one non-circular digest preimage, records + authoritative snapshot freshness, supports erased/redacted detached bundles + with retained digest/audit evidence, rejects duplicate JSON keys and unknown + profile versions, and classifies every timestamped revocation outcome. - **Embodiment-binding conformance lane** — 16 positive and 20 negative vectors covering active, retired/restored, continuation, fork, succession, direct/automation/Psyche targets, degraded history, privacy authorization, diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 6b70f96..d1860c2 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -550,6 +550,10 @@ The resolution snapshot **MUST** bind root, revision, lineage position, bundle digest, and status; its snapshot id **MUST** be the final-check/commit snapshot. Resolution precedes final validity check, which precedes decision, commit, and issuance; the decision timestamp and `statusAtDecision.decisionTime` are equal. +Each resolution snapshot **MUST** include authoritative ledger generation and +head revision, cache provenance/observation time, and a bounded freshness +window. A cache older than that bound, or one whose head differs from the +selected revision, **MUST** fail closed even when its copied status is active. Aliases are non-authoritative resolution evidence only. When an alias is used, resolution **MUST** yield exactly one root, and that root **MUST** equal the @@ -582,10 +586,16 @@ self-predecessor, repeated/non-monotonic position, root/revision mismatch, or relation/root-evidence mismatch. Thus continuation, restoration, fork/new-root, and succession are mechanically—not merely narratively—distinct. +Implementations **MUST** reject duplicate JSON object member names before JSON +Schema, digest, or signature processing; ordinary JSON parsing that silently +keeps one duplicate is insufficient. This profile supports exactly +`schemaVersion` `1.0.0`; unknown versions fail closed. + The resolver and verifier **MUST** perform the final eligibility check and immutable binding commit on the same snapshot/transaction boundary. The -committed binding digest **MUST** recompute from JCS canonical bytes (excluding -only the digest and its redundant commit-verification field), and the commit +committed binding digest **MUST** recompute from the same JCS canonical preimage +defined above: the binding with its entire `integrity` and `authentication` +members and redundant `commit.verifiedBindingDigest` omitted, and the commit **MUST** attest to that exact digest before launch success. A revocation before commit rejects the launch; revocation strictly after an immutable commit does not rewrite that historical binding, but prevents later dispatches. Integrity diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index 503f8ef..7023fc5 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -8,7 +8,7 @@ "required": ["profile", "schemaVersion", "bindingId", "familiar", "resolutionSnapshot", "identityBundle", "revisionRecordedAt", "validTime", "statusAtDecision", "principal", "target", "bindingPurpose", "identityMeaning", "issuedAt", "decisionAt", "policyVersion", "resolver", "verifier", "historicalVerification", "revocation", "commit", "integrity", "authentication", "privacy"], "properties": { "profile": { "const": "familiar.embodiment_binding.v1" }, - "schemaVersion": { "$ref": "#/definitions/version" }, + "schemaVersion": { "const": "1.0.0" }, "bindingId": { "type": "string", "minLength": 1 }, "familiar": { "type": "object", "additionalProperties": false, @@ -41,9 +41,9 @@ }, "resolutionSnapshot": { "type": "object", "additionalProperties": false, - "required": ["snapshotId", "resolvedAt", "familiarRootId", "identityRevisionId", "lineagePosition", "bundleDigest", "status"], + "required": ["snapshotId", "resolvedAt", "authoritativeLedgerGeneration", "authoritativeHeadRevisionId", "freshnessBoundSeconds", "cacheObservedAt", "cacheProvenance", "familiarRootId", "identityRevisionId", "lineagePosition", "bundleDigest", "status"], "properties": { - "snapshotId": { "$ref": "#/definitions/opaqueId" }, "resolvedAt": { "$ref": "#/definitions/timestamp" }, "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "snapshotId": { "$ref": "#/definitions/opaqueId" }, "resolvedAt": { "$ref": "#/definitions/timestamp" }, "authoritativeLedgerGeneration": { "type": "integer", "minimum": 0 }, "authoritativeHeadRevisionId": { "$ref": "#/definitions/opaqueId" }, "freshnessBoundSeconds": { "type": "integer", "minimum": 0 }, "cacheObservedAt": { "$ref": "#/definitions/timestamp" }, "cacheProvenance": { "enum": ["authoritative-read", "validated-cache"] }, "familiarRootId": { "$ref": "#/definitions/opaqueId" }, "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, "lineagePosition": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "bundleDigest": { "$ref": "#/definitions/hash" }, "status": { "enum": ["active", "retired", "revoked", "superseded"] } } diff --git a/schemas/familiar-identity-bundle.schema.json b/schemas/familiar-identity-bundle.schema.json index 3438331..46f8222 100644 --- a/schemas/familiar-identity-bundle.schema.json +++ b/schemas/familiar-identity-bundle.schema.json @@ -16,11 +16,11 @@ "type": "array", "minItems": 2, "items": { "type": "object", "additionalProperties": false, - "required": ["componentId", "mediaType", "content", "digest"], + "required": ["componentId", "mediaType", "digest", "redactionState"], "properties": { "componentId": { "enum": ["identity-declaration", "soul-declaration", "ward-declaration"] }, "mediaType": { "const": "application/json" }, - "content": { "type": "object" }, + "content": { "type": "object" }, "redactionState": { "enum": ["retained", "redacted"] }, "redactionEvidence": { "type": "string", "minLength": 1 }, "digest": { "$ref": "#/definitions/digest" } } } @@ -36,7 +36,8 @@ "tombstoneState": { "enum": ["live", "tombstoned", "erased"] }, "replicaPurgeState": { "enum": ["not_requested", "pending", "complete"] }, "erasureEvidence": { "type": "string", "minLength": 1 }, - "deviceRevocationEvidence": { "type": "string", "minLength": 1 } + "deviceRevocationEvidence": { "type": "string", "minLength": 1 }, + "redactionState": { "enum": ["none", "redacted"] } } } }, diff --git a/tests/conformance/embodiment-bindings/bundles/01-active-direct.json b/tests/conformance/embodiment-bindings/bundles/01-active-direct.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/01-active-direct.json +++ b/tests/conformance/embodiment-bindings/bundles/01-active-direct.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json +++ b/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json +++ b/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json +++ b/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json +++ b/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json b/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json +++ b/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json +++ b/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json +++ b/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json +++ b/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json +++ b/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json b/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json index 5a22671..f617e7a 100644 --- a/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json +++ b/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "e97cb110eb3ded123930545fe90cb20ce705c61419aa11f5a23f7f447e4ed079" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4" + "value": "06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534" } } diff --git a/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json index d8b3fd7..30ac4b9 100644 --- a/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json +++ b/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226" } } diff --git a/tests/conformance/embodiment-bindings/bundles/07-succession.json b/tests/conformance/embodiment-bindings/bundles/07-succession.json index 8855ab2..b0185ed 100644 --- a/tests/conformance/embodiment-bindings/bundles/07-succession.json +++ b/tests/conformance/embodiment-bindings/bundles/07-succession.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "b4ce2e6913e66f082a0974207a12067ca850b0585fbc8ae8abc2d39a57d39504" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7" + "value": "19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291" } } diff --git a/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json +++ b/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json +++ b/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json +++ b/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json +++ b/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json b/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json +++ b/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json +++ b/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json +++ b/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json +++ b/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json +++ b/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json +++ b/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json +++ b/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json +++ b/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json b/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json +++ b/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/17-erased-redacted-historical.json b/tests/conformance/embodiment-bindings/bundles/17-erased-redacted-historical.json new file mode 100644 index 0000000..23cdbd7 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/17-erased-redacted-historical.json @@ -0,0 +1,54 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "erased", + "replicaPurgeState": "complete", + "erasureEvidence": "audit:tombstone-001", + "deviceRevocationEvidence": "audit:device-purge-001", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json +++ b/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json +++ b/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json b/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json index 538dc7c..363a45d 100644 --- a/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json +++ b/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.json @@ -18,7 +18,8 @@ "digest": { "algorithm": "sha-256", "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" - } + }, + "redactionState": "retained" }, { "componentId": "soul-declaration", @@ -30,7 +31,8 @@ "digest": { "algorithm": "sha-256", "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" - } + }, + "redactionState": "retained" }, { "componentId": "ward-declaration", @@ -41,7 +43,8 @@ "digest": { "algorithm": "sha-256", "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" - } + }, + "redactionState": "retained" } ], "retention": { @@ -49,10 +52,11 @@ "verifierAccess": "authorized", "recordedAt": "2026-09-03T08:00:00Z", "tombstoneState": "live", - "replicaPurgeState": "not_requested" + "replicaPurgeState": "not_requested", + "redactionState": "none" }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" } } diff --git a/tests/conformance/embodiment-bindings/bundles/21-stale-active-cache.json b/tests/conformance/embodiment-bindings/bundles/21-stale-active-cache.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/21-stale-active-cache.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/23-unknown-schema-version.json b/tests/conformance/embodiment-bindings/bundles/23-unknown-schema-version.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/23-unknown-schema-version.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/24-redacted-verified-history.json b/tests/conformance/embodiment-bindings/bundles/24-redacted-verified-history.json new file mode 100644 index 0000000..23cdbd7 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/24-redacted-verified-history.json @@ -0,0 +1,54 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "erased", + "replicaPurgeState": "complete", + "erasureEvidence": "audit:tombstone-001", + "deviceRevocationEvidence": "audit:device-purge-001", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + } +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index c31dc22..223e01a 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -1,9 +1,9 @@ { "profile": "familiar.embodiment_binding.v1", "positive": [ - {"expected":"positive","file":"01-active-direct.json","errorCode":null},{"expected":"positive","file":"02-unique-alias-resolution.json","errorCode":null},{"expected":"positive","file":"03-retired-historical-record.json","errorCode":null},{"expected":"positive","file":"04-restoration-with-lineage.json","errorCode":null},{"expected":"positive","file":"05-new-revision-same-familiar.json","errorCode":null},{"expected":"positive","file":"06-fork-new-root.json","errorCode":null},{"expected":"positive","file":"07-succession.json","errorCode":null},{"expected":"positive","file":"08-direct-coven-session.json","errorCode":null},{"expected":"positive","file":"09-scheduled-automation-run.json","errorCode":null},{"expected":"positive","file":"10-scheduled-automation-attempt.json","errorCode":null},{"expected":"positive","file":"11-psyche-delegated-execution.json","errorCode":null},{"expected":"positive","file":"12-degraded-historical-bundle.json","errorCode":null},{"expected":"positive","file":"13-privacy-authorized-historical-read.json","errorCode":null},{"expected":"positive","file":"14-privacy-unauthorized-read-denied.json","errorCode":null},{"expected":"positive","file":"15-revocation-after-commit.json","errorCode":null},{"expected":"positive","file":"16-unverifiable-historical-bundle.json","errorCode":null} + {"expected":"positive","file":"01-active-direct.json","errorCode":null},{"expected":"positive","file":"02-unique-alias-resolution.json","errorCode":null},{"expected":"positive","file":"03-retired-historical-record.json","errorCode":null},{"expected":"positive","file":"04-restoration-with-lineage.json","errorCode":null},{"expected":"positive","file":"05-new-revision-same-familiar.json","errorCode":null},{"expected":"positive","file":"06-fork-new-root.json","errorCode":null},{"expected":"positive","file":"07-succession.json","errorCode":null},{"expected":"positive","file":"08-direct-coven-session.json","errorCode":null},{"expected":"positive","file":"09-scheduled-automation-run.json","errorCode":null},{"expected":"positive","file":"10-scheduled-automation-attempt.json","errorCode":null},{"expected":"positive","file":"11-psyche-delegated-execution.json","errorCode":null},{"expected":"positive","file":"12-degraded-historical-bundle.json","errorCode":null},{"expected":"positive","file":"13-privacy-authorized-historical-read.json","errorCode":null},{"expected":"positive","file":"14-privacy-unauthorized-read-denied.json","errorCode":null},{"expected":"positive","file":"15-revocation-after-commit.json","errorCode":null},{"expected":"positive","file":"16-unverifiable-historical-bundle.json","errorCode":null},{"expected":"positive","file":"17-erased-redacted-historical.json","errorCode":null} ], "negative": [ - {"expected":"negative","file":"01-ambiguous-alias.json","errorCode":"E_ALIAS"},{"expected":"negative","file":"02-stale-cached-revision.json","errorCode":"E_STALE"},{"expected":"negative","file":"03-revoked-revision.json","errorCode":"E_STATUS"},{"expected":"negative","file":"04-retired-dispatch.json","errorCode":"E_STATUS"},{"expected":"negative","file":"05-principal-mismatch.json","errorCode":"E_PRINCIPAL"},{"expected":"negative","file":"06-tampered-bundle-digest.json","errorCode":"E_COMPONENT_DIGEST"},{"expected":"negative","file":"07-degraded-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"08-unauthorized-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"09-revocation-before-commit.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"10-unknown-field.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"11-malformed-structure.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"12-tampered-binding-digest.json","errorCode":"E_BINDING_DIGEST"},{"expected":"negative","file":"13-cached-superseded-apparently-active.json","errorCode":"E_SNAPSHOT"},{"expected":"negative","file":"14-unverifiable-authentication.json","errorCode":"E_AUTHENTICATION"},{"expected":"negative","file":"15-lineage-self-predecessor.json","errorCode":"E_LINEAGE"},{"expected":"negative","file":"16-timezone-missing.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"17-malformed-calendar-time.json","errorCode":"E_TIMESTAMP"},{"expected":"negative","file":"18-tombstone-without-purge.json","errorCode":"E_RETENTION"},{"expected":"negative","file":"19-verified-history-missing-bundle.json","errorCode":"E_BUNDLE_MISSING"},{"expected":"negative","file":"20-revocation-at-commit-outcome-none.json","errorCode":"E_REVOCATION"} + {"expected":"negative","file":"01-ambiguous-alias.json","errorCode":"E_ALIAS"},{"expected":"negative","file":"02-stale-cached-revision.json","errorCode":"E_STALE"},{"expected":"negative","file":"03-revoked-revision.json","errorCode":"E_STATUS"},{"expected":"negative","file":"04-retired-dispatch.json","errorCode":"E_STATUS"},{"expected":"negative","file":"05-principal-mismatch.json","errorCode":"E_PRINCIPAL"},{"expected":"negative","file":"06-tampered-bundle-digest.json","errorCode":"E_COMPONENT_DIGEST"},{"expected":"negative","file":"07-degraded-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"08-unauthorized-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"09-revocation-before-commit.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"10-unknown-field.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"11-malformed-structure.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"12-tampered-binding-digest.json","errorCode":"E_BINDING_DIGEST"},{"expected":"negative","file":"13-cached-superseded-apparently-active.json","errorCode":"E_SNAPSHOT"},{"expected":"negative","file":"14-unverifiable-authentication.json","errorCode":"E_AUTHENTICATION"},{"expected":"negative","file":"15-lineage-self-predecessor.json","errorCode":"E_LINEAGE"},{"expected":"negative","file":"16-timezone-missing.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"17-malformed-calendar-time.json","errorCode":"E_TIMESTAMP"},{"expected":"negative","file":"18-tombstone-without-purge.json","errorCode":"E_RETENTION"},{"expected":"negative","file":"19-verified-history-missing-bundle.json","errorCode":"E_BUNDLE_MISSING"},{"expected":"negative","file":"20-revocation-at-commit-outcome-none.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"21-stale-active-cache.json","errorCode":"E_STALE_CACHE"},{"expected":"negative","file":"22-duplicate-schema-version.json","errorCode":"E_JSON"},{"expected":"negative","file":"23-unknown-schema-version.json","errorCode":"E_VERSION"},{"expected":"negative","file":"24-redacted-verified-history.json","errorCode":"E_REDACTION"} ] } diff --git a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json index 823abde..031e35b 100644 --- a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json +++ b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEApPUdZ11F7GxEfw5dlpEu3qRJ4utDx5gQBcjFkOLpwB0=", - "signature": "OeeVo7lsP4Y0eR/Y0aUP7hZp0aj3c4TNeaSf9F/YTKpLYyOfrdW68VpIb43qXfAi7ByqOF5zsba2MJM7+SxRDA==" + "publicKey": "MCowBQYDK2VwAyEAB3zry5LppwhNlS2yVEvhmYt5/dbcQKjOXI/xasuLNlM=", + "signature": "ufoCulaC0WSk3UEOJPN9BIjEmcS5ktNqTzNfae5awawV5yPv1PS9K5HQaGM7vGOgnk06h30AeZpHCWO/bHECCw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "95f2a620eac1540c6c6faff80b09524c4f84d6ac6093a28024da15ec0138a9e1" + "bindingDigest": "95cffaee8bc4e6200f6375d8cfa7c8b0e2cc9c30fb99e412e0281f32f6a2ff59" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEApPUdZ11F7GxEfw5dlpEu3qRJ4utDx5gQBcjFkOLpwB0=", - "signature": "EBXID5aOBbH7JTU2RUIc8Xo7aRUTZAOnljclwEiFQnSjSnJTiefCWeMlQuNTyA6SF7LUEHLfPfj4xWud2mK9Ag==" + "publicKey": "MCowBQYDK2VwAyEAB3zry5LppwhNlS2yVEvhmYt5/dbcQKjOXI/xasuLNlM=", + "signature": "ZSZDTZ1THnkMNZniGH+eV/Sf8lwEPQ0E/e5pPnvQUqOlCgc5UnIRU4lt5HlytwkFZYKNb48ulXrmjRGltbYnBQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "95f2a620eac1540c6c6faff80b09524c4f84d6ac6093a28024da15ec0138a9e1" + "verifiedBindingDigest": "95cffaee8bc4e6200f6375d8cfa7c8b0e2cc9c30fb99e412e0281f32f6a2ff59" }, "aliasResolution": { "alias": "Sage", @@ -120,7 +120,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json index 8c434b2..64bc708 100644 --- a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json +++ b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqVbY2JlnPJYxJWWGjCOMqkh24m3t5MnQhZRCYkECHl8=", - "signature": "y4aDNvK5Csv2z2qsbtI2ZJyFfe0r5+op6LiMQLfWP3iFzGNCHBnlRh8zd0/sORiO2zrCC0ghqaMZsj/jdLhzBw==" + "publicKey": "MCowBQYDK2VwAyEAFFrPkQFtErTkT6BROJILrpgogrKO0iE9fagduww8bHk=", + "signature": "oD91aanSXgsW4UCgs9fhMBvtBeKz+m3Y8dHCJQgARpImaWIOzefWDyytXY22VQYJi+rPwZox4k+e32LTJ/PnBw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -84,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "0c5d1b5f895775165d4b9a5709daab469015a0d63ab03a39906ddcacedbbbd56" + "bindingDigest": "9898d51ea204ffc09b624bf81c11e32e13ec0c5f8b0bfbde3f4524c91c128bca" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqVbY2JlnPJYxJWWGjCOMqkh24m3t5MnQhZRCYkECHl8=", - "signature": "83PUltxU6HjSd9/bw3KSYHMD8vq8q/3qkEQDR4o4Ew30PdkPqC59VLqaZp37n5G8zYyfAf/2uaMpXhxc9ZNTAw==" + "publicKey": "MCowBQYDK2VwAyEAFFrPkQFtErTkT6BROJILrpgogrKO0iE9fagduww8bHk=", + "signature": "XWKHX3O4ilMxaVctwp6hlrRG5uQ9AROvv+wqTDKttz8Tm55/k4QRDmntljkYFvCgzULyQhJHrDXSEPh8AzTAAQ==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "0c5d1b5f895775165d4b9a5709daab469015a0d63ab03a39906ddcacedbbbd56" + "verifiedBindingDigest": "9898d51ea204ffc09b624bf81c11e32e13ec0c5f8b0bfbde3f4524c91c128bca" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,7 +113,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json index e0f4489..cd1ca1b 100644 --- a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json +++ b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAm/w7WCeA4C7Ct++BZAo/VgtswcJp68qaHu+C/kOshQI=", - "signature": "X+PO+Sy5fzCxpTvtm0WzRTjRZdTY7vqG/VxkA2OyuWC9gA1VXDoDtI0OT52PpI5raRWEVtt44GrmKIFzRY+7Bw==" + "publicKey": "MCowBQYDK2VwAyEAzxeemxYcQ+B3VIzYjgqU4sMJv95CG1WWMVHiiCwBMGQ=", + "signature": "1qVA4AIoCHS/iQu/yB5/r30NSRXnnWXcX7kfiUbwCqx+/m1SgTyHT2u0pUma/NOu86RFQqhF2PoNtTJ4rP0WCA==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "cae1554f4da30cd9cfb44ec687ef104a4e9a861cae9244aafc87c76e308ddf6a" + "bindingDigest": "a3d73d48cfb4a0bdb5f81ba3c8158112d9d360b809ccd42c291fac855d2c1431" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAm/w7WCeA4C7Ct++BZAo/VgtswcJp68qaHu+C/kOshQI=", - "signature": "zepriAfp5o1hijceOgZC6JLk7hDTkoTPny6v/WfnN+H4hNF3jZi+ptOXvkVsnZ/oq+Ap/nEa4mQMfcHmC+qXCg==" + "publicKey": "MCowBQYDK2VwAyEAzxeemxYcQ+B3VIzYjgqU4sMJv95CG1WWMVHiiCwBMGQ=", + "signature": "TPo7imqvtx9fpOwbefVsCxD1ajdXTJcFg/ftAihBlOjsh8uhJphAZxppcN+pb5cG5b7VcBH4l7AqiPjuIngdCQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "cae1554f4da30cd9cfb44ec687ef104a4e9a861cae9244aafc87c76e308ddf6a" + "verifiedBindingDigest": "a3d73d48cfb4a0bdb5f81ba3c8158112d9d360b809ccd42c291fac855d2c1431" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "revoked" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "revoked", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json index 029babe..97542f4 100644 --- a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA2c6gx3lLfHIwsfGdE9OimUd1PkFsqA3VyxOI9IVQfPE=", - "signature": "GQU1HnX1DWhD1wLegPGpvYO1/mpmUJ2awjWTSgWqTcwbIEAHi1M4pgDi8tIcP8FiG7Oz2ZHADg1c/VfOBjJKBw==" + "publicKey": "MCowBQYDK2VwAyEAYXZKezTfDc0wnxWCbNPLCsQAtaRHstP2uDJ9CIQDIHA=", + "signature": "Ybi57L8iMkPEBiUmssRGucNK1D0JLA+WZoIDINy4KpVDZeFTVTQsX9MGzLb6aL7JjwK/HSY0fD244oFsY5pzBQ==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "73958f8c1cccb1966c3a9f774bd89d899aaa02ebcd5e2c48a297f7139611ded0" + "bindingDigest": "ce8dac45731821ebc814605dacbcc7043101fa707723a80164c4f9796bb2f634" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA2c6gx3lLfHIwsfGdE9OimUd1PkFsqA3VyxOI9IVQfPE=", - "signature": "pnZCStQldWNTqxNNtTMfnH+k9kuLBTXNJHq6KIWNCfnjbgIFn3VVcMtH25RfEsxo/HEJv0/ibUl3uzQElWzUCA==" + "publicKey": "MCowBQYDK2VwAyEAYXZKezTfDc0wnxWCbNPLCsQAtaRHstP2uDJ9CIQDIHA=", + "signature": "wLtl1vddxTiSKkNm8JsWWnvSo6vTQx6Ql6mbBI1N/UatV+Xq5KXTTiuzQseW95co5KheuL6hKFSH3i3RkqP8Dw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "73958f8c1cccb1966c3a9f774bd89d899aaa02ebcd5e2c48a297f7139611ded0" + "verifiedBindingDigest": "ce8dac45731821ebc814605dacbcc7043101fa707723a80164c4f9796bb2f634" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "retired" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json index d854543..8038322 100644 --- a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json +++ b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAl7io/oY1ZRrywzyfu89CNfEEPu4YROcJebkeg18WxWA=", - "signature": "d8agIopu9pNRFZsepN8JLh/qD7pO5CuiBqUjwK3tpWQkeHn5YfT2Ke2CxoHoLuznFV6fARg84el7UdhM3zb4Dw==" + "publicKey": "MCowBQYDK2VwAyEA7KFAYGk1hvt7qVJh+Y97WqSueHDQNrdy/EoLc1zApXo=", + "signature": "7RE5gYWp0sp+RSmvyCG1q2vREOGiMZUEopZsQ7lgvmamSirNEbTF/OjPgHNEjKhN7EMAseGAgK65mTg68roVAg==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "83f60a76901584912c586a3c7ee948f0e653bfca2e7adaa91f25d5f6b3a5b89e" + "bindingDigest": "f49711bc4e7dee8943bbadc2bef3ab2f6f2d905d405884fd6037bff2a6644d1a" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAl7io/oY1ZRrywzyfu89CNfEEPu4YROcJebkeg18WxWA=", - "signature": "uXcE475pl/Nl0a9Zp/noLSdv7x4O+WA6cfQd9Y3qlVPQqDEpxJMaH22XypmAyzPVjqwsZnsXSi7csbS5x4rVDQ==" + "publicKey": "MCowBQYDK2VwAyEA7KFAYGk1hvt7qVJh+Y97WqSueHDQNrdy/EoLc1zApXo=", + "signature": "eirZpkTOyYD2riMZlOoqVK5e5kEvbiJ8qcpl+X7uHQQV5iRUCrPSwKS/J7r+exT8kyECKyljFx9+lSa++0vyBA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "83f60a76901584912c586a3c7ee948f0e653bfca2e7adaa91f25d5f6b3a5b89e" + "verifiedBindingDigest": "f49711bc4e7dee8943bbadc2bef3ab2f6f2d905d405884fd6037bff2a6644d1a" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json index 8beba6e..be967de 100644 --- a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json +++ b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAD7bt17XdL+SsRNse2FrRmwe2Dz5slKOMISYELUK6/j0=", - "signature": "dESlz50B3LMqMGbrJWsBnDT2hN1S07Ff9w65fS0K3oT8KFSIASbHZZi88o/X9Af1K/75+Z2Fm4yvUKBuq7EzBg==" + "publicKey": "MCowBQYDK2VwAyEAtWOPTiAirZzmk7FYFGyC8j+vqcR4nj89OGX3wXmg48A=", + "signature": "/7zmk1m4B0WxhHb4frYZnwwm5SmleglOtWCQesxN8GLIZQrizMDKjKiAWszUROAXyUfXfW+JJQNMNCZKY/k7BA==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "c696ff7cb9a4e14e59cd6814c5c39057f2f2dbcf15a51ecd33b082626ddf8b48" + "bindingDigest": "ff2bcf10044a881d02126138843e6b5000be5107df61ce3d7fbc8f737b7cf22f" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAD7bt17XdL+SsRNse2FrRmwe2Dz5slKOMISYELUK6/j0=", - "signature": "bP9v0Fg9Y5T6tVR0SmXCSzc10W9ZpJZG/MVracbU+I6IqV/nqWLNclbaqvuMgjRxK6UGLKAH8DNQedwlkfATAA==" + "publicKey": "MCowBQYDK2VwAyEAtWOPTiAirZzmk7FYFGyC8j+vqcR4nj89OGX3wXmg48A=", + "signature": "fbURqCVOfSmW6BggiVWFc/V0XmGso8N2XvVRzHvbEaj1j43EMOsGKuvBD/bAqZCPFt/pZ4DLkHSNoT7fpZM+AA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "c696ff7cb9a4e14e59cd6814c5c39057f2f2dbcf15a51ecd33b082626ddf8b48" + "verifiedBindingDigest": "ff2bcf10044a881d02126138843e6b5000be5107df61ce3d7fbc8f737b7cf22f" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json index 8afedf6..952708b 100644 --- a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAZmMpfFv4sNavXGaFt4RI4sgZ8Uht7XSTlWY5OP8iFSk=", - "signature": "KlrXdeNz6+QHUiG6D+5qq8Te3D2Zk4X5JaUXTiZHAsQ5ErcaM443DpXzVpDNeXVBdkfDPi/g2tRdaQESjv4/DA==" + "publicKey": "MCowBQYDK2VwAyEA+7Yh8/jOuxAqZ0tSvlZmdyuqHP59/JKvxUuJq1whkiE=", + "signature": "Fk3oMEfymNX7opU0ixYVPJsJc59+8JQ2EFMPXoeTGO7DOz12CEi4YVH2lxciqCa09w1a4Q85buBvA+r7llFPCQ==" } } } @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ea651208b087e2cf9638a6deab54ca3cd64f2aebc71f944b5e57665a83bbde09" + "bindingDigest": "56c96c3bf0428564192ba613d130c8a15aed47eed2a2ef89dd299895855af83f" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAZmMpfFv4sNavXGaFt4RI4sgZ8Uht7XSTlWY5OP8iFSk=", - "signature": "g3UAMV1tlug4wZTL1oDil9brkyX+eXoJ/Sk2oWeHNNUxysNQwdH2vlHVcZbtZ2m0MRymhF35wQSTF5YDdzcRAA==" + "publicKey": "MCowBQYDK2VwAyEA+7Yh8/jOuxAqZ0tSvlZmdyuqHP59/JKvxUuJq1whkiE=", + "signature": "ZelNZtLmivc3SzRGjoDD2oUThzeGrgA9Phl5bYh6SXwR5QVB8iNWUpQ1sqiezqMmzHtvCPsQJffpQAGD2R/2Dg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ea651208b087e2cf9638a6deab54ca3cd64f2aebc71f944b5e57665a83bbde09" + "verifiedBindingDigest": "56c96c3bf0428564192ba613d130c8a15aed47eed2a2ef89dd299895855af83f" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,6 +113,11 @@ "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json index bfa00c5..bba8414 100644 --- a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAfHo7QxHOjE3p7op6OwRJj0+H35PqJttH5CUUJAaOge0=", - "signature": "FDWV5jSgS/sknNG+eRvrwUV6guRTm14Ynca1ZQckOnRMiUlIGfAw5n4VBe1BAOon6YqCy6w6VcpXV14h6RdUAg==" + "publicKey": "MCowBQYDK2VwAyEAUzIKgezYonu/uIcdsdhdfOsgiVEmVR0NW5UJjTpHlyo=", + "signature": "nWZoJYkahkIeh+4HcTKFR/BtysdoB0N4SIHK8um6eaeLE86CUbQiv+D9j0tXSlureu4GnpkFEfCwCeJ/j8jbAg==" } } } @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "cddfe1c3820f2e2c5f4beba0b0f629b9a3663cbde3731f0fe591c19472abccd2" + "bindingDigest": "9c3b1d3823c3a52abd495d5c147d03bf9732b7d3b95816b1094fa992a484cc34" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAfHo7QxHOjE3p7op6OwRJj0+H35PqJttH5CUUJAaOge0=", - "signature": "S5oQcvR5IcBB8vem1HXW2PX+yPPf3EddbtUyXTcbE96+tuMZlmlrM01HTRofhPU8CzNX1l5DGWSdpe5EygW6AA==" + "publicKey": "MCowBQYDK2VwAyEAUzIKgezYonu/uIcdsdhdfOsgiVEmVR0NW5UJjTpHlyo=", + "signature": "1Bs1OKciP1HJMv4cwOl9osaS1NeI15WAG2Q4Vd7ialEZPl4EB9nisHOxEAlf39D6hE/ISgVm0+9G/I9vPP8VDg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "cddfe1c3820f2e2c5f4beba0b0f629b9a3663cbde3731f0fe591c19472abccd2" + "verifiedBindingDigest": "9c3b1d3823c3a52abd495d5c147d03bf9732b7d3b95816b1094fa992a484cc34" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,6 +113,11 @@ "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json index d1e0116..c79c581 100644 --- a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json +++ b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA2Xw3I8BVxOe2SXOYZxfPnme9KdOYKyHtaPm30+F2crc=", - "signature": "//SvBWQdyATNJCpsjA5zpsWZZQOPre+HduWeRXJr6nZc/n1X4j7i0lgUGEcOcS3q/H08ELrNoI11iQVF1WzRBQ==" + "publicKey": "MCowBQYDK2VwAyEAoHta2UBAy0/zDnaAwki7saM6T/EW9Qs1ywBetSdJH2Y=", + "signature": "6GQr0mIg2bpFKG8KZcunF8XNoQlCk2EgkRWt934LXMRVFjh66Iqqy+AyX/SzotKmvHpQ+in/GphWsdvRl7f5Cw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -84,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1002748544e0d05b9a5aae10a8a2a7748a080e66f4f5b5e1cfee3ac4fdb8cda1" + "bindingDigest": "0c9afc854a84feacfb7f57deaaa1303a469a7f2ed3160990f7f82655fe7ca323" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA2Xw3I8BVxOe2SXOYZxfPnme9KdOYKyHtaPm30+F2crc=", - "signature": "F4xuIbqlXIrvsHCdEwwt0l9a9xVZt1MtcObSLu0e6j/w4Yj972OPS8qQMf36QTiTDnFIlf7dTW+yuB/Va7W/AA==" + "publicKey": "MCowBQYDK2VwAyEAoHta2UBAy0/zDnaAwki7saM6T/EW9Qs1ywBetSdJH2Y=", + "signature": "J49WlrG8aoYSITP168FxWozR6WsTMo0iJj1IOXjoJCRrf7p8BuW/0t7izx7AJqfsOwQJNfBDTUVw83UP5309DQ==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1002748544e0d05b9a5aae10a8a2a7748a080e66f4f5b5e1cfee3ac4fdb8cda1" + "verifiedBindingDigest": "0c9afc854a84feacfb7f57deaaa1303a469a7f2ed3160990f7f82655fe7ca323" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,7 +113,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json index f875ea5..e921156 100644 --- a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json +++ b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAQkG/VhNV6PMLDJkTpqALVYWkatDr13W0qMC0vTbjnT8=", - "signature": "b1r0aYcFh+xhfIdkL0qt1lUfE/mzAmZ0487eRPygreXZb3kyy0MRV6FNHZ3FvuABB/9NRRbFxhKN8ifsJqS3Bg==" + "publicKey": "MCowBQYDK2VwAyEAmbOf31f4VYZMNezOMkuKbcUXFoqEtEFWsM59cpLN9Jg=", + "signature": "SLxebnthcFkaAYQ45sPXGFmTXEZH/T7lC7KTsD+gFbXvlUq1/kNjElhqnymQnurXyZDpqZ4749EYSqPE7u68Bw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "87836ad9467f1f1ef7f09e804a3ab54c0d4e0dc28f8b9f8d7267b6269edfce58" + "bindingDigest": "143a63c7e2a8f1df09ee3ad03bcdda195b47eb791caf8d2ea7792fcc2be1d427" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAQkG/VhNV6PMLDJkTpqALVYWkatDr13W0qMC0vTbjnT8=", - "signature": "axTPAritAC4jOpiQCpV0E5T8nJV5MRAdy1kSC8RPkidPFWCOt29CnTDTJFkWONrd4lbIXksiSkAGeN8Mn8llDw==" + "publicKey": "MCowBQYDK2VwAyEAmbOf31f4VYZMNezOMkuKbcUXFoqEtEFWsM59cpLN9Jg=", + "signature": "XGFQsVXUvPiIb+2p/dWegkcsNTCkLPUNeDyd4a9zKzEqVnCBNRMwJYe9IDDlCBK3XF1+CJRYvPoBUEky/CkqCA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "87836ad9467f1f1ef7f09e804a3ab54c0d4e0dc28f8b9f8d7267b6269edfce58" + "verifiedBindingDigest": "143a63c7e2a8f1df09ee3ad03bcdda195b47eb791caf8d2ea7792fcc2be1d427" }, "unknownField": "must-fail-closed", "resolutionSnapshot": { @@ -113,7 +113,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json index d295ac2..5fc35d3 100644 --- a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json +++ b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAGhimXyWyVIb0RbfE+TBBVaHvzFaIbf6zuPxKShSWmVU=", - "signature": "8UwA2yJDDGLbOdEsU9SOd3vv5RZDW5MoAEnxPq1kqza7NsEtr3CVry2/4RWb6s+pNRlJM/5jxrTsruC4RtK/DQ==" + "publicKey": "MCowBQYDK2VwAyEAwPW87r1+eU3wx54ZkVuJvrcNdbd9pF3zT1zlCCX/7pM=", + "signature": "9Uhp1v+5jwO77LpiKor+pXhq90GOJ/KUa/1EzrjKtw5Jg5MGz0xX3U3g95kJxPpUHvB0Ha8zmelhJfgDaxUtBw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -88,8 +88,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAGhimXyWyVIb0RbfE+TBBVaHvzFaIbf6zuPxKShSWmVU=", - "signature": "WNmeTHadfaxA9DP+XnOIpVxNL1aEWJFeyWah/zlBwiWO8IXPa9o/okuoKPeCto2RkI/DlTncs5bwXqrOkqznBA==" + "publicKey": "MCowBQYDK2VwAyEAwPW87r1+eU3wx54ZkVuJvrcNdbd9pF3zT1zlCCX/7pM=", + "signature": "oX0GhwgLH1zI7/PcJuEaYhMdBpxcde4txETI0BFrlCLY7qBqTY9P81NwiAMqeMtN/Hc9ngtDxjyD8AATYVTwDg==" }, "privacy": { "classification": "metadata-only", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json index 94ad482..52f3709 100644 --- a/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json +++ b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA9ENoNuwG/9O5adMaRW4074UJnReLQ+XRjOKFPx4XkC4=", - "signature": "jlFV6NVwCoZZAt4Tk5dZgLFEJaOOBK5MBeHjVf5ILq8kz21UDRP9sIvvMD7F7EWQ9ovZoj3NRBpt/mzThOyOAQ==" + "publicKey": "MCowBQYDK2VwAyEAZMET8yjOkSputQq5Fl4GgpPCJkeu6inH3un0bA6BCXs=", + "signature": "JVE1sG7mutBAgmQ9o178Qq/XR6WbeW91r2oVl527kEIwzpxtMbYzJNWRTRQT4LTwKfP3yHdCqYdl+DLvG/1kBQ==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "cf58b3f711c1563e16f30169af376b3601e0e7b99974c9918ff30879d09e51d7" + "bindingDigest": "a21bbda2e6f94624be2b6b6705d301b9fa7647b4365fc5c2e6c167effd00bf78" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA9ENoNuwG/9O5adMaRW4074UJnReLQ+XRjOKFPx4XkC4=", - "signature": "ffKmO8S4RaxEhqatGBcpLfbZbPBoPXM/vIpwtwiBSksXC8Y/HsjVF/dxMv9XFn+J0KyqEFVMDT0djV+maA1yAA==" + "publicKey": "MCowBQYDK2VwAyEAZMET8yjOkSputQq5Fl4GgpPCJkeu6inH3un0bA6BCXs=", + "signature": "G2HcrGXbaY7CDpIQwaK5LjYh/nGVUgxdQNrP6EltwUXcwdaQkWZ2+pc3NK4BloPtktXOwYXyoKABYhJut909DQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "cf58b3f711c1563e16f30169af376b3601e0e7b99974c9918ff30879d09e51d7" + "verifiedBindingDigest": "a21bbda2e6f94624be2b6b6705d301b9fa7647b4365fc5c2e6c167effd00bf78" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "superseded" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "superseded", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json index 534bc71..db6ef18 100644 --- a/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json +++ b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAupp2j8awiKTi/N/CLZT8EJfC+RJYr7jY70aWAEor8t8=", - "signature": "uB/Uhz8risixGusieSjw/1IXci36wel6lUkhtLGsvvalk1Y351RhRyZHNoom6nCvosb7cbnpNdFLMMkbA2bOBA==" + "publicKey": "MCowBQYDK2VwAyEAsISLURBuxkg9dcr1LMwzg7gSZC7hA2Niaqtl63zaOfE=", + "signature": "BZRk3kocqmF6DcxOhPkkHxs/HAubcGlN5XoAC2KYXhH0O5CVnxoHFgib2rnlsFIMwjXMGLsw2yKKYeeFSE0yBg==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,12 +83,12 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "37a174dc2a7d2276959b630fc878d81e988d86ab1ad645b6af547d3106df30e2" + "bindingDigest": "a9b86307775470ad3139e8680a7ea8c2ffe8c051f00e2cdaf055c0b4497ae79e" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAupp2j8awiKTi/N/CLZT8EJfC+RJYr7jY70aWAEor8t8=", + "publicKey": "MCowBQYDK2VwAyEAsISLURBuxkg9dcr1LMwzg7gSZC7hA2Niaqtl63zaOfE=", "signature": "AAAA" }, "privacy": { @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "37a174dc2a7d2276959b630fc878d81e988d86ab1ad645b6af547d3106df30e2" + "verifiedBindingDigest": "a9b86307775470ad3139e8680a7ea8c2ffe8c051f00e2cdaf055c0b4497ae79e" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json index d2f088a..7336ea3 100644 --- a/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json +++ b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAMYr64EGRpOcWYRCGPnhq2QoK22ZBuRuTaME9tnKdMqY=", - "signature": "hP63Mkh/RWXa2O7uTx9moQJG09+v7ap7+X/ng3e1aqm2DRZpisMaOREOCXyqNck9BBPp5Z/cJbAgNL94p1orDw==" + "publicKey": "MCowBQYDK2VwAyEAIVI+ymS+AmKy5Q3DclcH4yuZ/YHD3AddmOcFn7aWLWk=", + "signature": "HcphiOCS0rLUukBdmI0M+gfiXx81R0kc7L3tS7l0xpd29BOQ9CBD9zS2Df7AqsyhtZ+wOZBkTu0QDH9/5BNyAw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "929dcad68ccdf9ef85ff6468fa15ccd3bc82ec5eea6b5cf683f7c575a68d3308" + "bindingDigest": "33c35e353bd5650dbdc527c0321e35f50e426f5569cde9fbac7ebb00e078b26d" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAMYr64EGRpOcWYRCGPnhq2QoK22ZBuRuTaME9tnKdMqY=", - "signature": "HjF5qtA9IM4Ot1EGPA7/hqwOXiUP5PpnIY/Wm7TJvu6beN2xG3+r0lBHnBMrKfoCoyaZuTHflfbPTl++EHwiAg==" + "publicKey": "MCowBQYDK2VwAyEAIVI+ymS+AmKy5Q3DclcH4yuZ/YHD3AddmOcFn7aWLWk=", + "signature": "xEnI3wc3vpoimoIdb/w12NR19Cq8oSEoF6fHb9gAUEFvKpsYYbNQwqe5o+oNpXr8Wn0h+wYoCkwjRcK0FZ07BQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "929dcad68ccdf9ef85ff6468fa15ccd3bc82ec5eea6b5cf683f7c575a68d3308" + "verifiedBindingDigest": "33c35e353bd5650dbdc527c0321e35f50e426f5569cde9fbac7ebb00e078b26d" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json index cee7fbf..2505181 100644 --- a/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json +++ b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAMnSUQFVBoKN3x8sgcJsaZdrazZdrCUN8Whep21iYD9s=", - "signature": "Xt3nyoaeOf1C8qOiFtqFu303D5y30X/ufHuDmj00oKGAbjzPPyHiFplWLX5zZcPH71iExVMHl6t1FfC/oTUCBA==" + "publicKey": "MCowBQYDK2VwAyEANBHtm3Hf+VEcxX8XJxscuCH3N6FJiYpni3RDEXGu3jY=", + "signature": "qVYH3seVXTeK5S7fF5omEpxG7i6MhMj4aFYmPEHwZWREIqjNOkYAayPPoBwa6vhIsZFJoqTUAg6DSfmk+yLjBA==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "3ad5c2044186a7e1b3ccc548b7c63c09f7726e2851918f4d71c03b13c5f86d8e" + "bindingDigest": "ea65787278ee73a381c845d215f40205f78aeb7523d1a663a5eac9c19ff7072a" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAMnSUQFVBoKN3x8sgcJsaZdrazZdrCUN8Whep21iYD9s=", - "signature": "0hR1jA111Bt/b7iil4TwmVeK7ODrlgYgy8LEys1AGFqGyAcJKA5Fu+QnohMwn0vtcuJfZ4aFaQOHHkoME44MBQ==" + "publicKey": "MCowBQYDK2VwAyEANBHtm3Hf+VEcxX8XJxscuCH3N6FJiYpni3RDEXGu3jY=", + "signature": "9usMUpybCi7BMD/9s5HIrPCi3ECM2BqlcO/X5wqXhBF/9D+8NYw4OybaP6ARITszQcdpls4kq/iibMNOtR7iDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "3ad5c2044186a7e1b3ccc548b7c63c09f7726e2851918f4d71c03b13c5f86d8e" + "verifiedBindingDigest": "ea65787278ee73a381c845d215f40205f78aeb7523d1a663a5eac9c19ff7072a" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json index 145fade..c77a791 100644 --- a/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json +++ b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAcwiF75AbYbBc1hlY1aXhlXLrVGbJRnWcBHbfdLv8oGg=", - "signature": "Hpdoh0emDrv6oBgEnBxOmZN2uTU3iQpJHXa338+i7zomYmADir4v4z8eTNXPnnplS0ROEmP4G2Y1e1MTk6X8Bg==" + "publicKey": "MCowBQYDK2VwAyEADSwDQbmjfGLDYi1BHJucpqivzPcjmHwV+yOJod2MGYg=", + "signature": "VhOIDux/p493atbll/n8XoL013/SQ67aUcXDtLLvJYuQ0evMGPssFqWKWJiViChNjjop2CGX6medK1Ni2+upCw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-02-30T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "f26c8808dac50a7fc0589345449ad114ae2ac09babc7e6d47de9689ead3f6212" + "bindingDigest": "6c1052176dc40b269eba7f12c12fe4e058eca8bdb055ca277313f8913a2e4a07" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAcwiF75AbYbBc1hlY1aXhlXLrVGbJRnWcBHbfdLv8oGg=", - "signature": "6rV1aAhdI7MLc1WsKiF1nKgh3NWR88gZoaiQoU13Fe0T4KgPfLmF/iV6ntW3MTNqfPwPqDv9sQaEW848hvYtAA==" + "publicKey": "MCowBQYDK2VwAyEADSwDQbmjfGLDYi1BHJucpqivzPcjmHwV+yOJod2MGYg=", + "signature": "lJeSU3T3NF0ECtch2xVP1ZKBYW+DjlHb+GiS/1E9zvJyO1hckoZRiqCZjkk/1sPcrliIYGEDAA/5br+8/H/FAA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "f26c8808dac50a7fc0589345449ad114ae2ac09babc7e6d47de9689ead3f6212" + "verifiedBindingDigest": "6c1052176dc40b269eba7f12c12fe4e058eca8bdb055ca277313f8913a2e4a07" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json index ab91d68..9d3522a 100644 --- a/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json +++ b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAfChkRiqsJcH2j8F0STWhzF5R5QUt9Q117RKwGEIwk0g=", - "signature": "uo4JXfKK8dDHuHW939wAKNPgpSLe0yt8TXvXnd3u++0fugpgVrTJyfw5518O1ESHwEJpw//ciWPUj75TGobRBg==" + "publicKey": "MCowBQYDK2VwAyEApU3tC6xzu+pKS9/4qOkVWw1YV79p3X/CHxZpwP0VivM=", + "signature": "GRi8bV86UVpRea2zTEYmrGsF5tptbsVnSC8k8K4Q2MOWSIZzIRds0QGgP/a+Qf+/31O8O9wD7zjQZK8fbi/HDg==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1005977b71a5077209fcac8e2f278820a272c2a2385d55d22d907e83ba58a865" + "bindingDigest": "b4d4ead9a27680d856da451fd506ef84b33fd0f369c63cf1e84e3d66681350a8" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAfChkRiqsJcH2j8F0STWhzF5R5QUt9Q117RKwGEIwk0g=", - "signature": "dPr1V7lpPVAnl/8ulPOlYwQrwVsKUKfFekMH20Z2eHhRq2TXcfL4aJL79UrLAKu89S91ZUtZH3g91l3+XPvOCQ==" + "publicKey": "MCowBQYDK2VwAyEApU3tC6xzu+pKS9/4qOkVWw1YV79p3X/CHxZpwP0VivM=", + "signature": "LI65t8j3kQwUbjspat1snA/S9C8M1DIjRosQhd6poyqOHFCzI+dpy1ieuDA3yu9l1niB0QCsEhJmbkGEwqy4Dg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1005977b71a5077209fcac8e2f278820a272c2a2385d55d22d907e83ba58a865" + "verifiedBindingDigest": "b4d4ead9a27680d856da451fd506ef84b33fd0f369c63cf1e84e3d66681350a8" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json index 591fa4a..6a78ef9 100644 --- a/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json +++ b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAs8tp+BBdgcbrvF6IeR01NpQGa0GAZsZWjoe2dgyR91s=", - "signature": "gtO14zycW4EiWhrnCOlc/a+II49Zjqn2FeR3Qq0GoljGHe7MplBKRp12WY9kylru98t38mhp8tOdMbsLr1knDw==" + "publicKey": "MCowBQYDK2VwAyEA2toVlONZkbF5CT1l2T6Bvqzae2wH41ZetUhXtzgOpbc=", + "signature": "a3QkHDB896rAJk/zOaIVcKy/5riwS7eG5sNnCGUAh6fHuMSdbG49FVltrk2wyx8GYo08s78+7u4WiKv/9IdlDQ==" } } } @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "28c479661e382571cfbb814653e26be7b83168c7af86e71a3e4ac52cb3bd675b" + "bindingDigest": "274b3208e3953ea92e0fea2ca80925b92cd1d3153424ad5aa0b302fe1fef6a62" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAs8tp+BBdgcbrvF6IeR01NpQGa0GAZsZWjoe2dgyR91s=", - "signature": "QXMpbkTaiozTVIuu6WaON43yg5NfumOWYZ8ktZNexQGNHE6mjnNSG7fYw29evPoKD5y3c0ReV3J+56GGuuaCAw==" + "publicKey": "MCowBQYDK2VwAyEA2toVlONZkbF5CT1l2T6Bvqzae2wH41ZetUhXtzgOpbc=", + "signature": "31i9ZWqerk6pDC1qbdfTlmIOwVfzrG7PC2unxHP99GT76GvGpGzm1Dbqz8f8jbRRtnRX9MvdcBYP4v0B3/IJBw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "28c479661e382571cfbb814653e26be7b83168c7af86e71a3e4ac52cb3bd675b" + "verifiedBindingDigest": "274b3208e3953ea92e0fea2ca80925b92cd1d3153424ad5aa0b302fe1fef6a62" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,6 +113,11 @@ "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json index 1882d1d..00f52d0 100644 --- a/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json +++ b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEATNtwUKsqlk0RzQarzXL1ibmpqYMT0i3dyFA6Lcihl9Y=", - "signature": "2gDdhpnfYj+ReIBUuqx7waiMYtKKV38k4SR/7dJmcSyE7Z86/3jaz2IrLpkLmREiVQqRZ5t9QI3WryqLxjBiAg==" + "publicKey": "MCowBQYDK2VwAyEAzrwqiIiyCqPCU8dFjFSb2+59c30U/8t2ec5G4Cg8Be8=", + "signature": "NCGmm9CcX4+jTraNE4sI+5QeFEfooTWw/1Y2D+kmRz5HUHKrWP6/0WXQHfL7UA+cLe2gb1MpwQoU0O398U0PAw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -84,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "84c7af446882cc6049610fcacd7a096e009e25ced9732fdfdf27ab0ffbe5f959" + "bindingDigest": "06ecc487259810f5d94afc76f233bcef7b0f53772e6545b70329586317822617" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEATNtwUKsqlk0RzQarzXL1ibmpqYMT0i3dyFA6Lcihl9Y=", - "signature": "yhFspqc2HkzZ7WTB/KQ3CC6XvXxzUe6pbpTX0bs1I35ZpCVn4BE2Z5h8SbZ0lSBhWhibqJdwyM6k42ttCub6Dw==" + "publicKey": "MCowBQYDK2VwAyEAzrwqiIiyCqPCU8dFjFSb2+59c30U/8t2ec5G4Cg8Be8=", + "signature": "r0f35ug50xzgbbDlHeUJ+IhVVhNE/j4YUGTExlogBRlC2Mcg5sMVxWTgcCxNbVXfKUGoAgrttx8AaPelYCaICg==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "84c7af446882cc6049610fcacd7a096e009e25ced9732fdfdf27ab0ffbe5f959" + "verifiedBindingDigest": "06ecc487259810f5d94afc76f233bcef7b0f53772e6545b70329586317822617" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,7 +113,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json b/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json new file mode 100644 index 0000000..05b5547 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-21-stale-active-cache", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAP0iaNYZ28M+dQJVEa4MOJXl/XvewSqAZGQl8xcF5/b8=", + "signature": "HhXVVLzvIYri8dzkwfmjIMZ4imfTuWDhJZXrJCVUcKSIaMhvSy7zI2pXIC34nj17XCVUrQtuB/1wkfu4UDN0BQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "29916d4497a55624c5e41147d955a781c4290741bb5bbf1d0a0793f8f26665a8" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAP0iaNYZ28M+dQJVEa4MOJXl/XvewSqAZGQl8xcF5/b8=", + "signature": "2oEi7IbKQXtswC9s3Ck7Bi6dEZY4ykEm0wdkADCh1ta8Id+jztfYEO8enYBVfpFhmHoifhfpXZx0/XIsfDo4DQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "29916d4497a55624c5e41147d955a781c4290741bb5bbf1d0a0793f8f26665a8" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-01T09:00:00Z", + "cacheProvenance": "validated-cache" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/22-duplicate-schema-version.json b/tests/conformance/embodiment-bindings/negative/22-duplicate-schema-version.json new file mode 100644 index 0000000..13e7c75 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/22-duplicate-schema-version.json @@ -0,0 +1,124 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "schemaVersion": "999.0.0", + "bindingId": "binding-active-direct-001", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEADKdDkStzOfdcwMlBhvC2oHMSZQATc/jXFrmldhX+8w0=", + "signature": "sdSEm4i2qtsEQahD7t5XTc31Y3Kj+7q04Hjl+gdR2MrSGuNrToNPAy65nahDJuuUJ8KIZNk0xIV9fTiMWeJhDg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "ca47880ae04f74cd6a0a8c8451d63b6790ebbde970e1d92da707e997783893e0" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEADKdDkStzOfdcwMlBhvC2oHMSZQATc/jXFrmldhX+8w0=", + "signature": "L9uCIA2/BeRz7NImN40AEJZ/rELjtuX/1RkHRhex1XTOFnrYn5/tkqjz7zZLBqq0MiRPlAxKL2ihBeTeN8DFDQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "ca47880ae04f74cd6a0a8c8451d63b6790ebbde970e1d92da707e997783893e0" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json b/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json new file mode 100644 index 0000000..9443cb9 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "999.0.0", + "bindingId": "binding-23-unknown-schema-version", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAHN48RF4BiWIMxvZUjLo01voIkY7KR7TNX3rp0iucXnc=", + "signature": "/lKgnchgjhLKzQrk3q6DdoCrGmM3AUl/t1SDtIphSWF+PpsjjhjUd7ifEQ1Kx4bor2PJ8sewSr9pcynW9QEYAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "2befd213dc7713aca22bb1500099a4b28abc9368b07ff061fdc1f1e6c92164f2" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAHN48RF4BiWIMxvZUjLo01voIkY7KR7TNX3rp0iucXnc=", + "signature": "4qDr+DX4y0GPPtHdLfN/a78zKv6UQLaVKGo5Jl8kZ8SUtxAwq/nnUPAxfhImSwsz1d0/CkArdGDlEbapxv96DQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "2befd213dc7713aca22bb1500099a4b28abc9368b07ff061fdc1f1e6c92164f2" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json b/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json new file mode 100644 index 0000000..746b49d --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-24-redacted-verified-history", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEADn+anhjG8A0tVxzxWIFjOlTfVzO61jRb9wuMEMy8qv0=", + "signature": "TWI5Lua0qbJeHPg6NZMNYmLjUHpQapIrIEsthtAznn4gjEDkJUZNZpC0tApQ8fPjzdiuCOEelvjZFzv1HL4rBA==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + }, + "historicalBundleRef": "urn:sha256:d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "6589ce8800120ed755fd52c154b019af03dce749a7ff7846992579d188be4def" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEADn+anhjG8A0tVxzxWIFjOlTfVzO61jRb9wuMEMy8qv0=", + "signature": "U7FEDxaS54dx1QrHXF5BmAa+OtpFmhcA9OWegMLaFjiKlWJD+QsjKTpyF5+5y4vmROwHARUvOG4wKzYRxZJIBQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "6589ce8800120ed755fd52c154b019af03dce749a7ff7846992579d188be4def" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/01-active-direct.json b/tests/conformance/embodiment-bindings/positive/01-active-direct.json index 241fd18..c8f0971 100644 --- a/tests/conformance/embodiment-bindings/positive/01-active-direct.json +++ b/tests/conformance/embodiment-bindings/positive/01-active-direct.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAg3EKIsENulMA020V6PQWVby8vzKS2dQmYnK9QcW2iS0=", - "signature": "Q8ByQzdh4f+jqRa1alXb6ta46xT8UpZfKp+vJ91DvLoGii2G1LrCpmDof66VGmDLnmQAqYvyF16SIWY9Kt1vDw==" + "publicKey": "MCowBQYDK2VwAyEADKdDkStzOfdcwMlBhvC2oHMSZQATc/jXFrmldhX+8w0=", + "signature": "sdSEm4i2qtsEQahD7t5XTc31Y3Kj+7q04Hjl+gdR2MrSGuNrToNPAy65nahDJuuUJ8KIZNk0xIV9fTiMWeJhDg==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "2bd8f371da4d27410e81d5af18189a7a1943273c6d528f2a989e9521cd35e8b1" + "bindingDigest": "ca47880ae04f74cd6a0a8c8451d63b6790ebbde970e1d92da707e997783893e0" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAg3EKIsENulMA020V6PQWVby8vzKS2dQmYnK9QcW2iS0=", - "signature": "n+SDfC4ekX6TCp6uRs3ZixfcRfYmxRdtGGnov3r9pD/jxihvAZAYvOrfcBItrlkZ0jeYuNker4BqHaF1D1xkDQ==" + "publicKey": "MCowBQYDK2VwAyEADKdDkStzOfdcwMlBhvC2oHMSZQATc/jXFrmldhX+8w0=", + "signature": "L9uCIA2/BeRz7NImN40AEJZ/rELjtuX/1RkHRhex1XTOFnrYn5/tkqjz7zZLBqq0MiRPlAxKL2ihBeTeN8DFDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "2bd8f371da4d27410e81d5af18189a7a1943273c6d528f2a989e9521cd35e8b1" + "verifiedBindingDigest": "ca47880ae04f74cd6a0a8c8451d63b6790ebbde970e1d92da707e997783893e0" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json index 2436c1a..7cc80be 100644 --- a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json +++ b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAoIM1QChAlVY8y4bHrWizmYNQDJr2cxws7hwDGkhl/gI=", - "signature": "6Hw7PiVlqwLFH45bqnZ7qxD72mGIG7arAarGnhr10MbWI2+Xo0WULjp2quFDEUj4PoksadZq6K2LlVhPUzOqAQ==" + "publicKey": "MCowBQYDK2VwAyEA3FjProvkSf4b75iPP25HysbiThtVt2jS2t0TrCHYpxg=", + "signature": "3VLymij1Ljhlef39Sf9meqACX14XpPd5SddcNZn7jegvchmeXGBypD5dJ1t2FG2WIQ77V01OP2vB23CguWoaCQ==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "8a87502d0b4ca340e0993aebd17ab59a922d44f6f6b58140edeb2b3d97667279" + "bindingDigest": "6875013f623ff239b85d16f3cc99900b33cc755ae12fdbcd89e928a858eabe72" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAoIM1QChAlVY8y4bHrWizmYNQDJr2cxws7hwDGkhl/gI=", - "signature": "3omFX9YPDcEPFJB5vQa+f8OYpB+HwrNaM+RuDhPa/5OojwycXfzwS+cxuuwTXJPpCL78dEPIJHl509aahUGgDQ==" + "publicKey": "MCowBQYDK2VwAyEA3FjProvkSf4b75iPP25HysbiThtVt2jS2t0TrCHYpxg=", + "signature": "hLUrwT5RftYHQpMNpz6d05X87yZ1BS2AJFmy8zYeaYLKm8UM29QMlcq+AyuSXSX3nNBUO29Nf9OhnitHHhwaCg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "8a87502d0b4ca340e0993aebd17ab59a922d44f6f6b58140edeb2b3d97667279" + "verifiedBindingDigest": "6875013f623ff239b85d16f3cc99900b33cc755ae12fdbcd89e928a858eabe72" }, "aliasResolution": { "alias": "Sage", @@ -119,7 +119,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json index f20e0a3..92599a8 100644 --- a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json +++ b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAE9/foTbRtFek2KwxRzCRuRuM6W6j8kIzaHkepla/Ao4=", - "signature": "BvOvy2qlK+kUyrLZgVdZVu8+CrxkXvtr67C98w49eCTRhR7a4oqX+gGY2lw8JQTJ/Z6QrR/C2y0LmFTaeKzRDw==" + "publicKey": "MCowBQYDK2VwAyEAUzCmMgHcbFnChzial33HVx/QM3aRE74hbO68th2AgAQ=", + "signature": "ur7WuskG2onrodTf7plEBY4uoADIzyZP29namGt6fWGb/Ot7uv5fY3Iqe4+mHCzNyaS/Uh8lmG4lyo096YcIAw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "dba441d371b780599689807f5a14aa0ed0ae8d32efc2a0951be4cd194c8ff250" + "bindingDigest": "a0c288f29d1c23b70f34e6bb192d975a772d7a6b5ca798f093cf43fb141b9a5d" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAE9/foTbRtFek2KwxRzCRuRuM6W6j8kIzaHkepla/Ao4=", - "signature": "QPYdPQlnrib7mW0pYDdKkvkHWpt2BFLyEPLJtxvNQg5QQEoAXcnzGs/5c+LBujTcy4F6hVTrJgc8LM+T0lgZCQ==" + "publicKey": "MCowBQYDK2VwAyEAUzCmMgHcbFnChzial33HVx/QM3aRE74hbO68th2AgAQ=", + "signature": "Wkv9ls9ZJxCtUOHopr8J21S0f4NKAv2hDOo4ujcK3uzIJ3gRVVWejzFZYa/9hH5jO/NutDQMJyIGG7GuEq87CA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "dba441d371b780599689807f5a14aa0ed0ae8d32efc2a0951be4cd194c8ff250" + "verifiedBindingDigest": "a0c288f29d1c23b70f34e6bb192d975a772d7a6b5ca798f093cf43fb141b9a5d" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "retired" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json index d7808f1..ca334a7 100644 --- a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json +++ b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAHRc2dLdoAMRHEU3qnnE175hxWHT6qyPuzXouuteKyxk=", - "signature": "wr8OsVPGKAL0EYTbSvrreU1Q/MKtSLFY4KIVTlyMwaEvgtBzCaIridHebikENqFO1+Q0HXQyfGnfbkSnyBi6BA==" + "publicKey": "MCowBQYDK2VwAyEAehX7IXc0fod+x/uooaZ4U38Rt8hBo2UQ2qHmrNOIqJk=", + "signature": "rL0Zko2uHBsAL4igj8shaHv6URBOhR1VZAqb0jtfkFx3docfo181o36O6QIqEbwBS361ZxRfr4Y0AJ4dOvU/Cg==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "671b0ea113712c0d2094ccd38d8a1beed91efbdbe2316c22cbd4e79fc11cfe79" + "bindingDigest": "6021cd676a11a129b3c2e7b7507e8bd7c76dcda45a42adc80557e118b60438be" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAHRc2dLdoAMRHEU3qnnE175hxWHT6qyPuzXouuteKyxk=", - "signature": "u5hhKgyBIUt+eSqd6YH1GTEKfBkm/HcfxgM/udsZi4xqLhdJ7PKZ/auPqp/QiHd+lnDToSspI1gBedfZn4/zAQ==" + "publicKey": "MCowBQYDK2VwAyEAehX7IXc0fod+x/uooaZ4U38Rt8hBo2UQ2qHmrNOIqJk=", + "signature": "ANySG+q+7T3fDmlZovBPAl/FS5ewTM2zHFAD7P+IRj26zWUDVR86gt+wKthUoHdbu6b29WSSOP1gEihN8QeRBQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "671b0ea113712c0d2094ccd38d8a1beed91efbdbe2316c22cbd4e79fc11cfe79" + "verifiedBindingDigest": "6021cd676a11a129b3c2e7b7507e8bd7c76dcda45a42adc80557e118b60438be" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json index e5413ee..dfa7121 100644 --- a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json +++ b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAF5HUWMNkYvV18H0+0LNmp0Ry7KlVy2Rd3S5XRW1LM6I=", - "signature": "D6zI3ZqlYYwK8QRM6m/RJ/ahnYCB8XGGSF4+VTMxnUnq6OrrCR1HdOTur6Uc756rRFUf8CPl6oMasN+52dbjAg==" + "publicKey": "MCowBQYDK2VwAyEA/VAkYDKfFC6X87yv83BPH9Tg7fTxAdT9S6PnK+B4yVQ=", + "signature": "lTJnYybfDP8kveXfeknP9S/5j9yd5m6Ftu6TZLY974ZXk7zX8TWCvY2qGy+bnegO8rWw+466FGUVZGcVNaycDw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1f23291db91045333bfb17be90501a3c931fcec2fd724ffae77759dc1cde9db8" + "bindingDigest": "d7ea5b3053032b351805d4ac68644981e9a8e7ae70fbda57831a789f28814c1c" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAF5HUWMNkYvV18H0+0LNmp0Ry7KlVy2Rd3S5XRW1LM6I=", - "signature": "rqVLVAdGZF7Ty5raC28g7x0xvWS3i9POW3SvLJAyPpVD0MYrHyyXYGAjnpVBWqzd36kId5wzjR5H2XLS/g0/Bw==" + "publicKey": "MCowBQYDK2VwAyEA/VAkYDKfFC6X87yv83BPH9Tg7fTxAdT9S6PnK+B4yVQ=", + "signature": "T8oGPZtpO0ubX5g2EjIDR1Ozxo1Lfb6f8Vm/YTIVnXBszyFA0ih8aQXMBeaWG8MYj1aRuofWhE+6YQY4IKmRDg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1f23291db91045333bfb17be90501a3c931fcec2fd724ffae77759dc1cde9db8" + "verifiedBindingDigest": "d7ea5b3053032b351805d4ac68644981e9a8e7ae70fbda57831a789f28814c1c" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json index 158a7bb..85d957f 100644 --- a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json +++ b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAyC9LtfC3oM6dVV8HGg1l68UDWhDESynH43aroQmhk2I=", - "signature": "Xxq580n1CtszQIkoLORSEsDPXDVv6L6sZysIbbkK1v132+rc5MoMGyWscJnlP6VOHF1FCkueNPAb4rrK329mDA==" + "publicKey": "MCowBQYDK2VwAyEAsKYuJtZ26z+aGq9ZnM/Nl+RxACnCpPsmNc2dr4KKMHw=", + "signature": "RYrGJxVJwjKkXB7aBtBaal0Q3cFifSVHT/T5VoyPBGuXyjuN66jWakpzfYEsCeO7E6s/97tSJon7s3yDDY0yAw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4" + "value": "06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534" }, - "historicalBundleRef": "urn:sha256:83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4" + "historicalBundleRef": "urn:sha256:06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "2bc9bc46be75cfc3378985270fad46a85773d7ae11762c90e7e1cf5c3be57541" + "bindingDigest": "0f9905a1d5d5b10ed674ad9b9dd1e302b3aeb28d3a4aa61f4630339235a30731" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAyC9LtfC3oM6dVV8HGg1l68UDWhDESynH43aroQmhk2I=", - "signature": "CffkuHAF5AyKeVFaimRaTjfN1KIz8I6DyYaZ1bryVZZ1queasnau3STA6t98jqqRFkNefMV8URxuDhTC+/H/AA==" + "publicKey": "MCowBQYDK2VwAyEAsKYuJtZ26z+aGq9ZnM/Nl+RxACnCpPsmNc2dr4KKMHw=", + "signature": "/PjixQfAeT2cuObQ+pLcNIUzlOZVjWkbXLydFQI3MHA4DE1ss2NCEsNBdZvGR/LjUQaXi9OHRrg+nQI6ALTNDg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "2bc9bc46be75cfc3378985270fad46a85773d7ae11762c90e7e1cf5c3be57541" + "verifiedBindingDigest": "0f9905a1d5d5b10ed674ad9b9dd1e302b3aeb28d3a4aa61f4630339235a30731" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:maple", "identityRevisionId": "familiar-revision:maple:0", "lineagePosition": 0, - "bundleDigest": "83b0d222e510e1810969e6f1706f31ca1c91ab5b579a95e1b36b00138c879fe4", - "status": "active" + "bundleDigest": "06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:maple:0", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/07-succession.json b/tests/conformance/embodiment-bindings/positive/07-succession.json index fd4cd6f..2816139 100644 --- a/tests/conformance/embodiment-bindings/positive/07-succession.json +++ b/tests/conformance/embodiment-bindings/positive/07-succession.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEArV9IFUcLykGOFrIxSgjLBvZSSGegbN4Udj7nPvyDbSI=", - "signature": "+0xNy3Rs5P6dow1RFrvcySL9qzBZSNh+unPK3DtkCRCxt5p07KvayUSbm4bBBdAbShdJbI8bi2oQavyXCS8yAw==" + "publicKey": "MCowBQYDK2VwAyEAmGCp5J+fEbvggUznHAssXkrEJeZW0TI1ECgbn3dK1Us=", + "signature": "nzasflbvCNkjnrUJEsvhVK9Om2TzQBLYrtkwaAcv8Xpc6oqUjPQuiFVN2gjnI4H8mOVNlZlNJSlA7SiOX2CxCA==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7" + "value": "19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291" }, - "historicalBundleRef": "urn:sha256:533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7" + "historicalBundleRef": "urn:sha256:19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "b28691dafc74c656dbf940f4c53ddaad453ecd2ec1aca0011c46c9368c65537c" + "bindingDigest": "cda4db7702f6deea17909ef2c55de6463b6d3bf475bea229c041d1636108fc3a" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEArV9IFUcLykGOFrIxSgjLBvZSSGegbN4Udj7nPvyDbSI=", - "signature": "GXbAvdZwsMBWCZu5kVhoOwnJN6gpQTeNbJ75m2BTQzDBMw1Fyhf0ZcIqY+GRQogZwbmpkT2rKlV7awUjrOirDw==" + "publicKey": "MCowBQYDK2VwAyEAmGCp5J+fEbvggUznHAssXkrEJeZW0TI1ECgbn3dK1Us=", + "signature": "lAuL8vn7b5AEpLdNqbyKnxsnqPU+v59y+Az0gfbyUJpyEusZ4fsMPGuR7I5AYvb6LFRxx3IqRhRdpTAO7BC/AQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "b28691dafc74c656dbf940f4c53ddaad453ecd2ec1aca0011c46c9368c65537c" + "verifiedBindingDigest": "cda4db7702f6deea17909ef2c55de6463b6d3bf475bea229c041d1636108fc3a" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:willow", "identityRevisionId": "familiar-revision:willow:0", "lineagePosition": 0, - "bundleDigest": "533b57b2ac0d12b1588004c8ef4af9b2a6ec908531cc9a6878a2af0d0ac824e7", - "status": "active" + "bundleDigest": "19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:willow:0", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json index bdc8c23..5ad54e4 100644 --- a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json +++ b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA+Av3tywGkLvIp4IU/cTkUQPxDBS2BrsDMUIbsXKwbOU=", - "signature": "h0zH/sjHtItbC9QU4II0aFpnp9Vjb5ksgdW8o15me0Jq+So3lqFVxVh0EpLxMk53hJszLN5k3bJh3MMy63HrCA==" + "publicKey": "MCowBQYDK2VwAyEA/rAorrrBWzD2kC1jtphgcdwAIwmwunU5LZVSYYLDT3M=", + "signature": "1DKt43G20FwAcX6FzIH7hDRyTTAQk6b0runvUnrHbop+2qFR/cbxbD3NKD2ws41Ahc5bEGZ+zwGsr7ki9oS9BQ==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "60d47c75d1c952ada6bbbd412a02ed61226035058e02f1731741862747289809" + "bindingDigest": "1392cd7a10a7f7b593c5db247b397cfb5a77a8ddc608efba3795415ad2478e17" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA+Av3tywGkLvIp4IU/cTkUQPxDBS2BrsDMUIbsXKwbOU=", - "signature": "gA2p2N5HKUZF0yvp+ULcqRaEQOx8IGubKy5/pXOXgMDaqHksCfVaVY3cWIUbZGZWTqOuV118KTkylvqUjpXkAA==" + "publicKey": "MCowBQYDK2VwAyEA/rAorrrBWzD2kC1jtphgcdwAIwmwunU5LZVSYYLDT3M=", + "signature": "hiuRsHNre/IB9rNsz/gLlQSG6D8T/cg6sfLsNAiNmVoVi6OjN/QGbnZDUsykl9vWW+cJ7T1zcz+Pb+TQIuBKBQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "60d47c75d1c952ada6bbbd412a02ed61226035058e02f1731741862747289809" + "verifiedBindingDigest": "1392cd7a10a7f7b593c5db247b397cfb5a77a8ddc608efba3795415ad2478e17" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json index 3795fce..a0f578c 100644 --- a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json +++ b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAvX++y9mckDzsCmnxD34KlU758pDibRljhjRvojGNk9Q=", - "signature": "kwCb1GZvg8w6NDEkfSP1l/OGwllCHpQQARDXZlRvOeKZzJmXAW6rkOs+yijrxY2wU/prEweDtiJabgyU8FnkCw==" + "publicKey": "MCowBQYDK2VwAyEAyYe63CbdB/4IBD3iyW5QEk/3HWOpTjwVuQdyAUWmtUk=", + "signature": "5sfyoCzXr/2Y8jpKEAycSthc6hJW/fJvSrMEDbalfCED+nxn7mmnE1njMDpBMvratoantPThMKKSYUgyLUzmAw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "39b64e8de92329a84bc22d5701b0f525bc61d6bac43dbc133a48e887588b7b95" + "bindingDigest": "93b77c24085a74f8602ca7306bde14839cae07a7dfcf72bb208236f500ad0245" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAvX++y9mckDzsCmnxD34KlU758pDibRljhjRvojGNk9Q=", - "signature": "JS3ECTkLNCp3Y8vvbwMucc0+5Q3Er0aS/g6Vd1jF061KVCx1DMWH9/+cHk9brqFRJplqoUH+Jw3XVe7FBwG8Aw==" + "publicKey": "MCowBQYDK2VwAyEAyYe63CbdB/4IBD3iyW5QEk/3HWOpTjwVuQdyAUWmtUk=", + "signature": "yAruXf2pCj0/LO2sFPfwCRf89YaYVxqAX2eqoQY8qxVfeJdADESFLj+PimoafuDFuxcxqIU2PS+eT5vFj2CABA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "39b64e8de92329a84bc22d5701b0f525bc61d6bac43dbc133a48e887588b7b95" + "verifiedBindingDigest": "93b77c24085a74f8602ca7306bde14839cae07a7dfcf72bb208236f500ad0245" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json index 6f5d6f4..a512851 100644 --- a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json +++ b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEALG7wYXETSVCHvzFhJrvNmcCPrCZO/NKeV+ovFJoiSaI=", - "signature": "iOE8GMGd+62Dj0I/9ntxtG4pM4hLlTJ1fabyaDGHB+d5Tj99GqrumLkWzZdtgrbOId/Cb9pO+5Fr8wCuxTs0DA==" + "publicKey": "MCowBQYDK2VwAyEAqLIRdpi+6yCbg7LXO8ykcMtnbkFyioZ6OgjLE6iUm5U=", + "signature": "wqQLXlbqSO434jp0v2tJQ7fethtpHtjbNaHTc/SFhzNIDhQ1HXCGFAR3xLnMkIwYJtU/y6pMta/xnxNjt3F3Cw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "65769ff3398b3196c743bc79f87f00cb58c57a28c1ced902aeb9af3101c38733" + "bindingDigest": "1f8fe5fbd898ba540b03378c049d760067db0b7c11a8227996cd94a9447929a1" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEALG7wYXETSVCHvzFhJrvNmcCPrCZO/NKeV+ovFJoiSaI=", - "signature": "P3LO3PWAST1qVRQnFIOIzEWHmnVP71KcIr3ZwwYhYIUyLcINtEfHv66zMLWXr12T4GPH/df8m5YkQL4diLDtCw==" + "publicKey": "MCowBQYDK2VwAyEAqLIRdpi+6yCbg7LXO8ykcMtnbkFyioZ6OgjLE6iUm5U=", + "signature": "b3WiuPk6+s8c1wmethDx79k4e2V3KRo+I1EHGcVA/4+KzWllnAJAk2yJm22xKHMYkQj1G7KymEbX412uvEyNDA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "65769ff3398b3196c743bc79f87f00cb58c57a28c1ced902aeb9af3101c38733" + "verifiedBindingDigest": "1f8fe5fbd898ba540b03378c049d760067db0b7c11a8227996cd94a9447929a1" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json index 592a30e..d587487 100644 --- a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json +++ b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA66n11LnedlvPM6Iubs1tccbgkw+XWDIzWK2K34D7K2o=", - "signature": "hTG5hXTX/DctgRH138jbxgYoqLzXDGaNmFj5JKKvxoIK7jIRUmRH+NxcoL5J1MqiqQyhuh+Py5jBiNZn6UCuBA==" + "publicKey": "MCowBQYDK2VwAyEA9TKGW0WLSrchCSVdxDXl5TAqO83hB1tjr8UM3hla35A=", + "signature": "LaRQne8O5RKxklguS9SwCnjt23ku2jXYV/oYcZfhryYHUhOCUklDKHkk3t+Fu/wkKbKmqu6GTUppqrcb3ywSCg==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "f342ca63732c709d740cbd54b62a374f66456df3a271db367f4cf049230a59ee" + "bindingDigest": "3e2ef24af28a083088043c46c8e03883e86b06c9a152bba2ff5aa0051b6be418" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA66n11LnedlvPM6Iubs1tccbgkw+XWDIzWK2K34D7K2o=", - "signature": "lWT7AJsk6Edjgg5+m2rTXwdeJScNhuYB7GwGK+FtMyJGj+lf7H3VIT2egao/6Eg1gilQBBJ4FSLkk8nHrenVDw==" + "publicKey": "MCowBQYDK2VwAyEA9TKGW0WLSrchCSVdxDXl5TAqO83hB1tjr8UM3hla35A=", + "signature": "FAStqCSnj8vK6zsdIkmXTD/xZCs5siURQsdGApdOOhHyXjvERuF8hEW+WqkzaBM0TAeh7/hB2TE4sbRIx1G1BA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "f342ca63732c709d740cbd54b62a374f66456df3a271db367f4cf049230a59ee" + "verifiedBindingDigest": "3e2ef24af28a083088043c46c8e03883e86b06c9a152bba2ff5aa0051b6be418" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json index a9bb9d8..9a5fb45 100644 --- a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAjvLbRBQgp/Glw9MPGWV4CrhSs+p9t1FbVaigSe5hKbg=", - "signature": "jWL2TWEgHw9MsgB6bFc5nUpezzwwuHDnW0bfoV/wplZ59Nty246EtwWh5Rrn8b6PKH5F+/geFoHU77J/ySNYBA==" + "publicKey": "MCowBQYDK2VwAyEAqD7jjHVRsp8MgigWinyYQNRWpx7RVL1hhisUpziBCvg=", + "signature": "+5ual4b2TZEUYd0we8Y5VeMOuOpgx6UkhXgcqfP2A5QQo964xVV76w+PWCvzjacLrAl8vzueAKn7HPbAs//tDA==" } } } @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ee3556999b2f82ad17ea1a0b605072d0aceb6cdc4adabe2098cd2baeb3035fef" + "bindingDigest": "37a3153412fbd95bc6558b93cf80e1512784e59b8251c749e9ded5c4dcd91931" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAjvLbRBQgp/Glw9MPGWV4CrhSs+p9t1FbVaigSe5hKbg=", - "signature": "qpD793GZQ5wqr6WHGh5NwVnLRMcYIX3dma1MQqXbfnl4UuN5PvEDvyzHnUIFz7dRLGHhUMFIfDOeMNDNg+ONAg==" + "publicKey": "MCowBQYDK2VwAyEAqD7jjHVRsp8MgigWinyYQNRWpx7RVL1hhisUpziBCvg=", + "signature": "lM3XgFAs5FRaGhBWf28xmtXV7VKe1NwvMx+vXqEB45yds2bXm8jqUB6JflQt1iKkNCWOzHIDcfa4kDkKDmX4Cg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ee3556999b2f82ad17ea1a0b605072d0aceb6cdc4adabe2098cd2baeb3035fef" + "verifiedBindingDigest": "37a3153412fbd95bc6558b93cf80e1512784e59b8251c749e9ded5c4dcd91931" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,6 +113,11 @@ "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json index c87bad0..6409047 100644 --- a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json +++ b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAgjXq6iqeiqqbCBeOImCa+M4WPgEmUfQOoraw6qIh7K8=", - "signature": "RwYOmOHok17jzi2Gb+77kt46dbejwmDqi3N3C/XGkbygtQ3jJZQGmSIpSKbrFGcAHRoR4Z2xyvS09wllJ9eRDw==" + "publicKey": "MCowBQYDK2VwAyEAvWGc/ZvBYU/GNIv2AdzjDPzfWwdzJhls0+3SQKn7s+s=", + "signature": "fDbihp3ylGa6HE7WSxyA/GFdvDP8pVMN6IVsLUSs8yeqTCZ3Wd2mHP1X1h6+5C/GIG69MIUtxFT5KmgB/7N2Bg==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "0e67783f123f649966ca51969f2b739806ea03c1ab5fd8096059bf28dc40aaa3" + "bindingDigest": "fb3e6269ce3209b56c7967ddcd584362e131dd30400642cabf9c64d534e5827b" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAgjXq6iqeiqqbCBeOImCa+M4WPgEmUfQOoraw6qIh7K8=", - "signature": "MS7R3wwsAfR7NCEz6eybZItXOKyKx52RvnlgDxXarfBxA6aGqwTH9JsjfsoIWuszFpTc7isEywESAxI/lm0qAg==" + "publicKey": "MCowBQYDK2VwAyEAvWGc/ZvBYU/GNIv2AdzjDPzfWwdzJhls0+3SQKn7s+s=", + "signature": "0Dj7d18VH7uhC4ZMUSdA3JoL0kvzHy59C5PeY2+UkauM3KQDLrUZubZPO0c91l85QQzyOcnQl6WiJy/GPJezDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "0e67783f123f649966ca51969f2b739806ea03c1ab5fd8096059bf28dc40aaa3" + "verifiedBindingDigest": "fb3e6269ce3209b56c7967ddcd584362e131dd30400642cabf9c64d534e5827b" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -112,7 +112,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json index e6c614d..100ff54 100644 --- a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json +++ b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA5FW0Nd7isRMfSzOlhDA25kkZtnC+86ivQyw4op3Q9sA=", - "signature": "6hBXB10SWNiCGRALQfTTuO0+mQMh+fNLW+Jqw1QwHrxsTmjapNu8AxmtSHJZWCqi1zFyJ2CcFvEsaYBep806BQ==" + "publicKey": "MCowBQYDK2VwAyEAAMli4dSXfXEgj5WyA0IAMXN704V1sHKocyy+XD21UeU=", + "signature": "zb5DPSvW+AbxI79/yc+9UOEdFX+hMQadRmuesm+Im1R02KCI7Sf/4iZDMTZMhC38iSidfncXuFBGP9R+QR+ABA==" } } } @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "45842a6828b8e38ee5a7db4ca381ed15fde7263346f310a8f1de4290beaae9d6" + "bindingDigest": "c2bd8a0899b9312971fc1a1c21ddc5c087dfbf13809f4437364d918c836b4403" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA5FW0Nd7isRMfSzOlhDA25kkZtnC+86ivQyw4op3Q9sA=", - "signature": "04u1+4Z7qbmKU+QwzVPfoHDHvQAR8Rvm8aXmNFpzH1dgzzT317vd1Gf8uw6temX2MJ7oMgPGM4fZEAt2YffFDQ==" + "publicKey": "MCowBQYDK2VwAyEAAMli4dSXfXEgj5WyA0IAMXN704V1sHKocyy+XD21UeU=", + "signature": "f4gEZoIvPBo3RwXjPejEGj9adVoGFcf7aKfEiPiqAHM2I5xwcutcctmu11hFTowVq9D0hPpC4N1xPmOi9nyLBA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "45842a6828b8e38ee5a7db4ca381ed15fde7263346f310a8f1de4290beaae9d6" + "verifiedBindingDigest": "c2bd8a0899b9312971fc1a1c21ddc5c087dfbf13809f4437364d918c836b4403" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,6 +113,11 @@ "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json index b30dbbc..dad3add 100644 --- a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json +++ b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA74O8Sc+BQ3c8dcPLmw1zxE8LDDoVadwfqUyiUyrUPaY=", - "signature": "XjIDnE04JKpwfu8sLQtxZNBM3bd/SWymGG47sFZxeb5ZpOrlSH1d2+rSWM2oD59cxhm1Zo+iPqKK1p8zxIsqAw==" + "publicKey": "MCowBQYDK2VwAyEABPfmvigJaQ5Ek3Gv/9+9IvbZxOvm+Q6PT8wJ1rMTXOw=", + "signature": "DlDmM/CHOLnKJZtxodZcaafqyIGR2AwzureOlwNH/78IUHL3gMC7ZlLJ8JxRDEc6VvxSJ/BQWV0qBb6r0L2pBw==" } } } @@ -38,9 +38,9 @@ }, "bundleDigest": { "algorithm": "sha-256", - "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, - "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" }, "revisionRecordedAt": "2026-09-03T08:00:00Z", "validTime": { @@ -84,13 +84,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "5f53c0ee95cb035c195bb45bd129122d339d20ac16062301aba2c5c5460b6ea0" + "bindingDigest": "9cb48bb6310b535da3c12552e7d037c745c3622a1e4430a1903a58961f61b871" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA74O8Sc+BQ3c8dcPLmw1zxE8LDDoVadwfqUyiUyrUPaY=", - "signature": "hDf9YXF1x5xxRgIl0UNjQ/pHDu7mMzXMO30JX2clv4WJPaCq5yFYWRc17K4pKMPGgMIAkxLaRnZ0EePZkG8OBA==" + "publicKey": "MCowBQYDK2VwAyEABPfmvigJaQ5Ek3Gv/9+9IvbZxOvm+Q6PT8wJ1rMTXOw=", + "signature": "hV+5TvoX1cl9oDcWrD95HKJg239Nh56/DCqP1LLXAOVAqLG4YEGsTpaQPmmxKPeMOg9dTBKCPWh/LSG60ZVjDw==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +105,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "5f53c0ee95cb035c195bb45bd129122d339d20ac16062301aba2c5c5460b6ea0" + "verifiedBindingDigest": "9cb48bb6310b535da3c12552e7d037c745c3622a1e4430a1903a58961f61b871" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,7 +113,12 @@ "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, - "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json index e0d02d9..0e4d99a 100644 --- a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json @@ -23,8 +23,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAM6ME5u8D9PafgZGnTnl77zDJGeqDo03j9FfJQ/bVn4w=", - "signature": "HiLvI22QdXPVFINgboLTfWlqSBVSjqq0vXolGmahyAhmkeIcEPxdNljv2ibWiKs+3RYqbFMrLgWD/DgK2gXJAw==" + "publicKey": "MCowBQYDK2VwAyEAljqhtdTOTwE5nmqQvRk6nx6N848GA0YyL+TCHK4qBa8=", + "signature": "E4j4TDvWhD02dI/0DvM73YGHAQIYYRX12wysfAAgIhc+ywsc1BSvzzlsif6CWoOO+01VvW1m6o0ZFblmHKTXDw==" } } } @@ -83,13 +83,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a917481a2055f486ca0e306c294a25494d61e26e1a88103b5183528e54081199" + "bindingDigest": "1be8293fc4255debe3912de2ab85ee23ca2befe9fd3613cb4c76ff7e67cee63d" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAM6ME5u8D9PafgZGnTnl77zDJGeqDo03j9FfJQ/bVn4w=", - "signature": "DsZdbmYpUssza8cY9X0Cc9R0RTc+yBxQlbZqsay8JzwTuxpTV0p3wMKb/wqQkhsjW/B/TOAXSsw0VZ2widy+AQ==" + "publicKey": "MCowBQYDK2VwAyEAljqhtdTOTwE5nmqQvRk6nx6N848GA0YyL+TCHK4qBa8=", + "signature": "oKsxItm2JOmOsGn0GIvwE7/2h+nZm8tbjl5vJykTMnqVUcMzPii0sw6nV4hz1/BroKaZh9ml3UCIJMrb/CzqBA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +104,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a917481a2055f486ca0e306c294a25494d61e26e1a88103b5183528e54081199" + "verifiedBindingDigest": "1be8293fc4255debe3912de2ab85ee23ca2befe9fd3613cb4c76ff7e67cee63d" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", @@ -113,6 +113,11 @@ "identityRevisionId": "familiar-revision:oak:3", "lineagePosition": 3, "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", - "status": "active" + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" } } diff --git a/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json b/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json new file mode 100644 index 0000000..abc224c --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-erased-redacted-historical", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAqqESL7br96BoYoMhpQO1oQt1m+ENjghAAeDtx/yv1c4=", + "signature": "5VU1YrSJHA2X+NfKwCWXkqklHu2qlpViI1crqPar0cS3i4aFEFJVrj9jEvXglbtO5RQJSVzqTyLUBxFDpnOtBw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + }, + "historicalBundleRef": "urn:sha256:d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "unverifiable", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "7e1f0c5772470cb1f76bd99db56e8e89cc254068f35f40f364782adc9865bb01" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAqqESL7br96BoYoMhpQO1oQt1m+ENjghAAeDtx/yv1c4=", + "signature": "Mo9P926MmFo2Kcq9FH5f/ve/5ksfShF/v1DPPcIkyHKf9LPRNjH7H0uVrAkV/Gek1TzaFRKScvPfzFdMaLOtBg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "7e1f0c5772470cb1f76bd99db56e8e89cc254068f35f40f364782adc9865bb01" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/validators/validate.js b/validators/validate.js index ea94a4b..9c92a1c 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -52,6 +52,16 @@ function bindingViolation(code, field, message) { return violation('embodiment-binding', `[${code}] ${field}`, message); } +function parseJsonNoDuplicate(text) { + let i = 0; let duplicate = false; + const ws = () => { while (/\s/.test(text[i])) i++; }; + const string = () => { const start = i++; while (i < text.length) { if (text[i] === '\\') i += 2; else if (text[i++] === '"') break; } return JSON.parse(text.slice(start, i)); }; + const value = () => { ws(); if (text[i] === '"') return string(); if (text[i] === '{') return object(); if (text[i] === '[') return array(); while (i < text.length && !/[\s,\]}]/.test(text[i])) i++; }; + const array = () => { i++; ws(); while (text[i] !== ']') { value(); ws(); if (text[i] === ',') { i++; ws(); } else break; } i++; }; + const object = () => { const keys = new Set(); i++; ws(); while (text[i] !== '}') { const key = string(); if (keys.has(key)) duplicate = true; keys.add(key); ws(); if (text[i++] !== ':') throw new Error('expected colon'); value(); ws(); if (text[i] === ',') { i++; ws(); } else break; } i++; }; + value(); ws(); if (i !== text.length) throw new Error('trailing input'); if (duplicate) throw new Error('duplicate object key'); return JSON.parse(text); +} + function canonicalJson(value) { if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`; if (isObject(value)) { @@ -118,11 +128,14 @@ function validateHistoricalBundle(bundle, binding) { && bundle.lineagePosition === binding.familiar.lineagePosition; if (!idsMatch) violations.push(bindingViolation('E_BUNDLE_IDENTITY', 'historicalBundle', 'The detached bundle does not identify the bound root, revision, and lineage position.')); const seen = new Set(); + let redacted = false; for (const component of bundle.components) { - if (seen.has(component.componentId) || component.digest.value !== digestObject(component.content)) { + if (seen.has(component.componentId) || (component.redactionState === 'retained' && (!component.content || component.digest.value !== digestObject(component.content))) || + (component.redactionState === 'redacted' && (component.content || !component.redactionEvidence))) { violations.push(bindingViolation('E_COMPONENT_DIGEST', 'historicalBundle.components', 'Every unique retained component digest must recompute from its canonical content.')); break; } + redacted ||= component.redactionState === 'redacted'; seen.add(component.componentId); } if (!seen.has('identity-declaration') || !seen.has('soul-declaration')) { @@ -143,12 +156,16 @@ function validateHistoricalBundle(bundle, binding) { (!bundle.retention.erasureEvidence || bundle.retention.replicaPurgeState === 'not_requested')) { violations.push(bindingViolation('E_RETENTION', 'historicalBundle.retention', 'Tombstoned or erased bundles require erasure evidence and a requested replica purge.')); } + if (redacted && (bundle.retention.redactionState !== 'redacted' || binding.historicalVerification.state === 'verified')) { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'Redacted retained components require redaction lifecycle evidence and cannot claim verified history.')); + } return violations; } function validateEmbodimentBinding(binding, file, historicalBundle) { const violations = []; if (!isObject(binding)) return [bindingViolation('E_SCHEMA', 'shape', 'An embodiment binding must be one JSON object.')]; + if (binding.schemaVersion !== '1.0.0') return [bindingViolation('E_VERSION', 'schemaVersion', 'Only familiar.embodiment_binding.v1 schemaVersion 1.0.0 is supported.')]; if (!validateEmbodimentBindingSchema(binding)) { return (validateEmbodimentBindingSchema.errors || []).map(error => bindingViolation('E_SCHEMA', `schema ${error.instancePath || '/'} [${error.keyword}]`, error.message || 'schema violation') @@ -177,6 +194,11 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { resolutionSnapshot.bundleDigest !== identityBundle.bundleDigest.value || resolutionSnapshot.status !== statusAtDecision.status) { violations.push(bindingViolation('E_SNAPSHOT', 'resolutionSnapshot', 'The immutable resolution snapshot must bind root, revision, lineage position, bundle digest, and decision status.')); } + if (resolutionSnapshot.authoritativeHeadRevisionId !== familiar.identityRevisionId || + (isTimestamp(resolutionSnapshot.cacheObservedAt) && isTimestamp(binding.decisionAt) && + at(binding.decisionAt) - at(resolutionSnapshot.cacheObservedAt) > resolutionSnapshot.freshnessBoundSeconds * 1000)) { + violations.push(bindingViolation('E_STALE_CACHE', 'resolutionSnapshot', 'The snapshot must name the authoritative head revision and cache evidence within its declared freshness bound.')); + } if (binding.aliasResolution) { const roots = binding.aliasResolution.resolvedRootIds; if (roots.length !== 1 || roots[0] !== familiar.familiarRootId) { @@ -252,6 +274,9 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { if (revocation.outcome === 'before_commit') { violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revocation observed before commit must fail closed and cannot produce a binding.')); } + if (revocation.outcome === 'none' && revocation.revokedAt) { + violations.push(bindingViolation('E_REVOCATION', 'revocation.outcome', 'A binding with revokedAt must classify the revocation outcome explicitly.')); + } if (revocation.revokedAt && isTimestamp(revocation.revokedAt) && isTimestamp(commit.committedAt) && at(revocation.revokedAt) <= at(commit.committedAt) && isAuthorityAttempt) { violations.push(bindingViolation('E_REVOCATION', 'revocation.revokedAt', 'Any revocation at or before decision/commit rejects dispatch regardless of the asserted outcome.')); } @@ -266,14 +291,14 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { function validateEmbodimentBindingFile(filePath, historicalBundlePath) { let binding; try { - binding = JSON.parse(fs.readFileSync(filePath, 'utf8')); + binding = parseJsonNoDuplicate(fs.readFileSync(filePath, 'utf8')); } catch (error) { return [bindingViolation('E_JSON', 'syntax', `JSON syntax violation: ${error.message}`)]; } let historicalBundle; if (historicalBundlePath) { try { - historicalBundle = JSON.parse(fs.readFileSync(historicalBundlePath, 'utf8')); + historicalBundle = parseJsonNoDuplicate(fs.readFileSync(historicalBundlePath, 'utf8')); } catch (error) { return [bindingViolation('E_BUNDLE_SCHEMA', 'historicalBundle', `JSON syntax violation: ${error.message}`)]; } From 4d68ed8949b323a6b7bf672f9270f2e4eabd30b8 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:33:33 -0500 Subject: [PATCH 05/16] fix: enforce trusted embodiment freshness Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 10 ++ .../bundles/25-enlarged-stale-cache.json | 62 +++++++++ .../bundles/26-future-cache-observation.json | 62 +++++++++ .../bundles/28-erased-content-verified.json | 64 +++++++++ .../embodiment-bindings/manifest.json | 2 +- .../negative/25-enlarged-stale-cache.json | 123 ++++++++++++++++++ .../negative/26-future-cache-observation.json | 123 ++++++++++++++++++ .../negative/27-lone-surrogate.json | 123 ++++++++++++++++++ .../negative/28-erased-content-verified.json | 123 ++++++++++++++++++ validators/validate.js | 27 +++- 10 files changed, 716 insertions(+), 3 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/25-enlarged-stale-cache.json create mode 100644 tests/conformance/embodiment-bindings/bundles/26-future-cache-observation.json create mode 100644 tests/conformance/embodiment-bindings/bundles/28-erased-content-verified.json create mode 100644 tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json create mode 100644 tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json create mode 100644 tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json create mode 100644 tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index d1860c2..f5f4610 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -554,6 +554,9 @@ Each resolution snapshot **MUST** include authoritative ledger generation and head revision, cache provenance/observation time, and a bounded freshness window. A cache older than that bound, or one whose head differs from the selected revision, **MUST** fail closed even when its copied status is active. +The record's freshness assertion is observational metadata only: the verifier's +fixed v1 maximum cache age is 300 seconds, a runtime-policy input outside the +signed record. A cache observation after final validity evaluation is invalid. Aliases are non-authoritative resolution evidence only. When an alias is used, resolution **MUST** yield exactly one root, and that root **MUST** equal the @@ -603,6 +606,13 @@ and authenticated attestation are mandatory, while cryptographic key-policy verification remains the verifier's policy responsibility. Retention is lifecycle evidence, not a license to replicate identity content. +Retained components carry content and always recompute their digest. +Redacted/erased components retain only digest plus redaction/audit evidence and +are unavailable or unverifiable, never verified; supplied-redacted and missing +bundles are distinct states but neither grants current authority. An erased +bundle MUST NOT retain sensitive component content. Canonical inputs MUST be +I-JSON: duplicate object keys and lone UTF-16 surrogates are rejected before +canonicalization, digest, or signature verification. The binding carries metadata-only classification plus retention time, tombstone/erasure state, and replica/device-purge state; a tombstoned or erased record **MUST** carry erasure evidence, and requested replica or device diff --git a/tests/conformance/embodiment-bindings/bundles/25-enlarged-stale-cache.json b/tests/conformance/embodiment-bindings/bundles/25-enlarged-stale-cache.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/25-enlarged-stale-cache.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/26-future-cache-observation.json b/tests/conformance/embodiment-bindings/bundles/26-future-cache-observation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/26-future-cache-observation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/28-erased-content-verified.json b/tests/conformance/embodiment-bindings/bundles/28-erased-content-verified.json new file mode 100644 index 0000000..6b697c5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/28-erased-content-verified.json @@ -0,0 +1,64 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "erased", + "replicaPurgeState": "complete", + "erasureEvidence": "audit:erased-002", + "deviceRevocationEvidence": "audit:purge-002", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "1c42e70843e959c5edba65f7c0f4c96f5d892e6f62f7702ee608acc42d52d74f" + } +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index 223e01a..2e5ee56 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -4,6 +4,6 @@ {"expected":"positive","file":"01-active-direct.json","errorCode":null},{"expected":"positive","file":"02-unique-alias-resolution.json","errorCode":null},{"expected":"positive","file":"03-retired-historical-record.json","errorCode":null},{"expected":"positive","file":"04-restoration-with-lineage.json","errorCode":null},{"expected":"positive","file":"05-new-revision-same-familiar.json","errorCode":null},{"expected":"positive","file":"06-fork-new-root.json","errorCode":null},{"expected":"positive","file":"07-succession.json","errorCode":null},{"expected":"positive","file":"08-direct-coven-session.json","errorCode":null},{"expected":"positive","file":"09-scheduled-automation-run.json","errorCode":null},{"expected":"positive","file":"10-scheduled-automation-attempt.json","errorCode":null},{"expected":"positive","file":"11-psyche-delegated-execution.json","errorCode":null},{"expected":"positive","file":"12-degraded-historical-bundle.json","errorCode":null},{"expected":"positive","file":"13-privacy-authorized-historical-read.json","errorCode":null},{"expected":"positive","file":"14-privacy-unauthorized-read-denied.json","errorCode":null},{"expected":"positive","file":"15-revocation-after-commit.json","errorCode":null},{"expected":"positive","file":"16-unverifiable-historical-bundle.json","errorCode":null},{"expected":"positive","file":"17-erased-redacted-historical.json","errorCode":null} ], "negative": [ - {"expected":"negative","file":"01-ambiguous-alias.json","errorCode":"E_ALIAS"},{"expected":"negative","file":"02-stale-cached-revision.json","errorCode":"E_STALE"},{"expected":"negative","file":"03-revoked-revision.json","errorCode":"E_STATUS"},{"expected":"negative","file":"04-retired-dispatch.json","errorCode":"E_STATUS"},{"expected":"negative","file":"05-principal-mismatch.json","errorCode":"E_PRINCIPAL"},{"expected":"negative","file":"06-tampered-bundle-digest.json","errorCode":"E_COMPONENT_DIGEST"},{"expected":"negative","file":"07-degraded-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"08-unauthorized-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"09-revocation-before-commit.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"10-unknown-field.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"11-malformed-structure.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"12-tampered-binding-digest.json","errorCode":"E_BINDING_DIGEST"},{"expected":"negative","file":"13-cached-superseded-apparently-active.json","errorCode":"E_SNAPSHOT"},{"expected":"negative","file":"14-unverifiable-authentication.json","errorCode":"E_AUTHENTICATION"},{"expected":"negative","file":"15-lineage-self-predecessor.json","errorCode":"E_LINEAGE"},{"expected":"negative","file":"16-timezone-missing.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"17-malformed-calendar-time.json","errorCode":"E_TIMESTAMP"},{"expected":"negative","file":"18-tombstone-without-purge.json","errorCode":"E_RETENTION"},{"expected":"negative","file":"19-verified-history-missing-bundle.json","errorCode":"E_BUNDLE_MISSING"},{"expected":"negative","file":"20-revocation-at-commit-outcome-none.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"21-stale-active-cache.json","errorCode":"E_STALE_CACHE"},{"expected":"negative","file":"22-duplicate-schema-version.json","errorCode":"E_JSON"},{"expected":"negative","file":"23-unknown-schema-version.json","errorCode":"E_VERSION"},{"expected":"negative","file":"24-redacted-verified-history.json","errorCode":"E_REDACTION"} + {"expected":"negative","file":"01-ambiguous-alias.json","errorCode":"E_ALIAS"},{"expected":"negative","file":"02-stale-cached-revision.json","errorCode":"E_STALE"},{"expected":"negative","file":"03-revoked-revision.json","errorCode":"E_STATUS"},{"expected":"negative","file":"04-retired-dispatch.json","errorCode":"E_STATUS"},{"expected":"negative","file":"05-principal-mismatch.json","errorCode":"E_PRINCIPAL"},{"expected":"negative","file":"06-tampered-bundle-digest.json","errorCode":"E_COMPONENT_DIGEST"},{"expected":"negative","file":"07-degraded-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"08-unauthorized-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"09-revocation-before-commit.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"10-unknown-field.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"11-malformed-structure.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"12-tampered-binding-digest.json","errorCode":"E_BINDING_DIGEST"},{"expected":"negative","file":"13-cached-superseded-apparently-active.json","errorCode":"E_SNAPSHOT"},{"expected":"negative","file":"14-unverifiable-authentication.json","errorCode":"E_AUTHENTICATION"},{"expected":"negative","file":"15-lineage-self-predecessor.json","errorCode":"E_LINEAGE"},{"expected":"negative","file":"16-timezone-missing.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"17-malformed-calendar-time.json","errorCode":"E_TIMESTAMP"},{"expected":"negative","file":"18-tombstone-without-purge.json","errorCode":"E_RETENTION"},{"expected":"negative","file":"19-verified-history-missing-bundle.json","errorCode":"E_BUNDLE_MISSING"},{"expected":"negative","file":"20-revocation-at-commit-outcome-none.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"21-stale-active-cache.json","errorCode":"E_STALE_CACHE"},{"expected":"negative","file":"22-duplicate-schema-version.json","errorCode":"E_JSON"},{"expected":"negative","file":"23-unknown-schema-version.json","errorCode":"E_VERSION"},{"expected":"negative","file":"24-redacted-verified-history.json","errorCode":"E_REDACTION"},{"expected":"negative","file":"25-enlarged-stale-cache.json","errorCode":"E_STALE_CACHE"},{"expected":"negative","file":"26-future-cache-observation.json","errorCode":"E_CACHE_TIME"},{"expected":"negative","file":"27-lone-surrogate.json","errorCode":"E_IJSON"},{"expected":"negative","file":"28-erased-content-verified.json","errorCode":"E_REDACTION"} ] } diff --git a/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json b/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json new file mode 100644 index 0000000..1cd3f17 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-25-enlarged-stale-cache", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAFo8pa1GlXJi+QApGE4yCOD3/Rx8qpTBdkwfgRD91VLQ=", + "signature": "f3iYz26InwfLt09dGkkAHa9RDUmQAvCr7z2Nxrc/Avf/iy/QZyrMRcrSk+kVnpJoAUDdVfgEOwRXXc07RGFeAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "acdfb75ffbf359c0055b32cf6e93bcab4fb6d946e1a7f9047051a2c3dde1a321" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAFo8pa1GlXJi+QApGE4yCOD3/Rx8qpTBdkwfgRD91VLQ=", + "signature": "1kW4sK3njWS64IWQac2wOZeRgNDaNX3fwrJTxcIsZxh7Ai2XCvvb09rzO5M7s1g9zMlBRPmbJuZ2IFRzwMSiAQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "acdfb75ffbf359c0055b32cf6e93bcab4fb6d946e1a7f9047051a2c3dde1a321" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 999999, + "cacheObservedAt": "2026-09-01T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json b/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json new file mode 100644 index 0000000..ef94ddc --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-26-future-cache-observation", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA1HGHT9SNYOmRRO3I4p/l4zEvUtYV5FXHA1slGZHLwjs=", + "signature": "fZlPXJ1tc19gytnsGs+m9qaQwT9UntqNb1m8fpEY6roUSVm1C/pYaZCrMueuXHHbfz0aDafc+YTlaUWAvavmBg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "274b4459375f4b44a5cfc0c7ce818c5af3fed16332f5a979cd3478125a96e3f0" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA1HGHT9SNYOmRRO3I4p/l4zEvUtYV5FXHA1slGZHLwjs=", + "signature": "mS7+/wTQ5EUwS+ZATPRPcEwLUOemjcg6865XmH5rNJ+rRLrblX2x+2VQn7F7R1/V8Z1J7Hwuk9AQJzU7OEEBBg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "274b4459375f4b44a5cfc0c7ce818c5af3fed16332f5a979cd3478125a96e3f0" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T10:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json b/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json new file mode 100644 index 0000000..29554e7 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-\ud800", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAk4HrfbaB3/ZITJSPVh0fL4BP8PJ1Vg3cEAMTpoy0o+o=", + "signature": "XGRl4o640WAPsVyS+f/sh3n8uSqguqbt1WQ0xR9j+VTBmv7lClpT+63pfpzdHEjDznUIlyQQrZbVA/VofoFXCA==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "1c60305973d1317066d0140129d9d3709c632b64fa1faed0fd9b818cbd533f94" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAk4HrfbaB3/ZITJSPVh0fL4BP8PJ1Vg3cEAMTpoy0o+o=", + "signature": "CbhOaMWa4kar6vi+CKWa5Ca5GW/B+Xiaqf/WgZaY9916QGjjHilM0v11D/ZxIYBCepyPNNxlDUuM7kD6euivAg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "1c60305973d1317066d0140129d9d3709c632b64fa1faed0fd9b818cbd533f94" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json b/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json new file mode 100644 index 0000000..5373197 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json @@ -0,0 +1,123 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-28-erased-content-verified", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEASoPHzCdtQQNQk7rNdoCZBbWLg1L09QTFL7H5swKvj7g=", + "signature": "7uxiCrBWG5UfVGLGreGnk1p6RZLrVYL2v+3XNBuzfBnZzdnMeZQf/uTPjAm4Ck+eQ6SJ0bKKiMKmA6qAAmdVAQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "1c42e70843e959c5edba65f7c0f4c96f5d892e6f62f7702ee608acc42d52d74f" + }, + "historicalBundleRef": "urn:sha256:1c42e70843e959c5edba65f7c0f4c96f5d892e6f62f7702ee608acc42d52d74f" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "7069c1f97e64f09411c712b4ed9d0f03733c6f317a50857c793d66d39b973eab" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEASoPHzCdtQQNQk7rNdoCZBbWLg1L09QTFL7H5swKvj7g=", + "signature": "KSwumHCe4Vh+ssswU+O/rWtAfOlhuPcOcmTNxHoZCyp8IKeoEuEZcXm8eVZINpkCQOiWlg4b921PJFxH5iL1BQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "7069c1f97e64f09411c712b4ed9d0f03733c6f317a50857c793d66d39b973eab" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "1c42e70843e959c5edba65f7c0f4c96f5d892e6f62f7702ee608acc42d52d74f", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/validators/validate.js b/validators/validate.js index 9c92a1c..af2706b 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -47,6 +47,7 @@ const identityBundleSchema = JSON.parse(fs.readFileSync( )); const validateIdentityBundleSchema = new Ajv({ allErrors: true, strict: false }) .compile(identityBundleSchema); +const MAX_CACHE_AGE_SECONDS = 300; function bindingViolation(code, field, message) { return violation('embodiment-binding', `[${code}] ${field}`, message); @@ -62,6 +63,19 @@ function parseJsonNoDuplicate(text) { value(); ws(); if (i !== text.length) throw new Error('trailing input'); if (duplicate) throw new Error('duplicate object key'); return JSON.parse(text); } +function hasInvalidIJsonString(value) { + if (typeof value === 'string') { + for (let i = 0; i < value.length; i++) { + const unit = value.charCodeAt(i); + if (unit >= 0xd800 && unit <= 0xdbff) { + if (++i >= value.length || value.charCodeAt(i) < 0xdc00 || value.charCodeAt(i) > 0xdfff) return true; + } else if (unit >= 0xdc00 && unit <= 0xdfff) return true; + } + } else if (Array.isArray(value)) return value.some(hasInvalidIJsonString); + else if (isObject(value)) return Object.entries(value).some(([key, item]) => hasInvalidIJsonString(key) || hasInvalidIJsonString(item)); + return false; +} + function canonicalJson(value) { if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`; if (isObject(value)) { @@ -159,6 +173,9 @@ function validateHistoricalBundle(bundle, binding) { if (redacted && (bundle.retention.redactionState !== 'redacted' || binding.historicalVerification.state === 'verified')) { violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'Redacted retained components require redaction lifecycle evidence and cannot claim verified history.')); } + if (bundle.retention.tombstoneState === 'erased' && bundle.components.some(component => component.redactionState === 'retained' || component.content)) { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.components', 'An erased bundle cannot retain sensitive component content.')); + } return violations; } @@ -196,8 +213,12 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { } if (resolutionSnapshot.authoritativeHeadRevisionId !== familiar.identityRevisionId || (isTimestamp(resolutionSnapshot.cacheObservedAt) && isTimestamp(binding.decisionAt) && - at(binding.decisionAt) - at(resolutionSnapshot.cacheObservedAt) > resolutionSnapshot.freshnessBoundSeconds * 1000)) { - violations.push(bindingViolation('E_STALE_CACHE', 'resolutionSnapshot', 'The snapshot must name the authoritative head revision and cache evidence within its declared freshness bound.')); + at(binding.decisionAt) - at(resolutionSnapshot.cacheObservedAt) > MAX_CACHE_AGE_SECONDS * 1000)) { + violations.push(bindingViolation('E_STALE_CACHE', 'resolutionSnapshot', 'The snapshot must name the authoritative head revision and cache evidence within the verifier policy maximum age.')); + } + if (isTimestamp(resolutionSnapshot.cacheObservedAt) && isTimestamp(commit.finalValidityCheckAt) && + at(resolutionSnapshot.cacheObservedAt) > at(commit.finalValidityCheckAt)) { + violations.push(bindingViolation('E_CACHE_TIME', 'resolutionSnapshot.cacheObservedAt', 'Cache observation cannot be after the trusted final validity evaluation.')); } if (binding.aliasResolution) { const roots = binding.aliasResolution.resolvedRootIds; @@ -292,6 +313,7 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath) { let binding; try { binding = parseJsonNoDuplicate(fs.readFileSync(filePath, 'utf8')); + if (hasInvalidIJsonString(binding)) return [bindingViolation('E_IJSON', 'input', 'JCS inputs must be I-JSON and cannot contain lone UTF-16 surrogates.')]; } catch (error) { return [bindingViolation('E_JSON', 'syntax', `JSON syntax violation: ${error.message}`)]; } @@ -299,6 +321,7 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath) { if (historicalBundlePath) { try { historicalBundle = parseJsonNoDuplicate(fs.readFileSync(historicalBundlePath, 'utf8')); + if (hasInvalidIJsonString(historicalBundle)) return [bindingViolation('E_IJSON', 'historicalBundle', 'JCS inputs must be I-JSON and cannot contain lone UTF-16 surrogates.')]; } catch (error) { return [bindingViolation('E_BUNDLE_SCHEMA', 'historicalBundle', `JSON syntax violation: ${error.message}`)]; } From e8a243977a3b51c4ea838551c9c4aa822f6a81bf Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:36:38 -0500 Subject: [PATCH 06/16] fix: require trusted dispatch ledger state Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 2 ++ schemas/familiar-identity-bundle.schema.json | 2 +- .../ledgers/01-active-direct.json | 6 ++++ .../ledgers/01-ambiguous-alias.json | 6 ++++ .../ledgers/02-stale-cached-revision.json | 6 ++++ .../ledgers/02-unique-alias-resolution.json | 6 ++++ .../ledgers/03-revoked-revision.json | 6 ++++ .../ledgers/04-restoration-with-lineage.json | 6 ++++ .../ledgers/04-retired-dispatch.json | 6 ++++ .../05-new-revision-same-familiar.json | 6 ++++ .../ledgers/05-principal-mismatch.json | 6 ++++ .../ledgers/06-fork-new-root.json | 6 ++++ .../ledgers/06-tampered-bundle-digest.json | 6 ++++ .../ledgers/07-degraded-history-dispatch.json | 6 ++++ .../ledgers/07-succession.json | 6 ++++ .../ledgers/08-direct-coven-session.json | 6 ++++ .../08-unauthorized-history-dispatch.json | 6 ++++ .../ledgers/09-revocation-before-commit.json | 6 ++++ .../ledgers/09-scheduled-automation-run.json | 6 ++++ .../10-scheduled-automation-attempt.json | 6 ++++ .../ledgers/10-unknown-field.json | 6 ++++ .../11-psyche-delegated-execution.json | 6 ++++ .../ledgers/12-tampered-binding-digest.json | 6 ++++ ...3-cached-superseded-apparently-active.json | 6 ++++ .../14-unverifiable-authentication.json | 6 ++++ .../ledgers/15-lineage-self-predecessor.json | 6 ++++ .../ledgers/15-revocation-after-commit.json | 6 ++++ .../ledgers/16-timezone-missing.json | 6 ++++ .../ledgers/17-malformed-calendar-time.json | 6 ++++ .../ledgers/18-tombstone-without-purge.json | 6 ++++ .../19-verified-history-missing-bundle.json | 6 ++++ .../20-revocation-at-commit-outcome-none.json | 6 ++++ .../ledgers/21-stale-active-cache.json | 6 ++++ .../ledgers/22-duplicate-schema-version.json | 6 ++++ .../ledgers/23-unknown-schema-version.json | 6 ++++ .../ledgers/24-redacted-verified-history.json | 6 ++++ .../ledgers/25-enlarged-stale-cache.json | 6 ++++ .../ledgers/26-future-cache-observation.json | 6 ++++ .../ledgers/27-lone-surrogate.json | 6 ++++ .../ledgers/28-erased-content-verified.json | 6 ++++ tests/conformance/run-conformance.sh | 5 ++- validators/validate.js | 32 +++++++++++++++---- 42 files changed, 260 insertions(+), 9 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/ledgers/01-active-direct.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/01-ambiguous-alias.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/02-stale-cached-revision.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/02-unique-alias-resolution.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/03-revoked-revision.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/04-restoration-with-lineage.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/04-retired-dispatch.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/05-new-revision-same-familiar.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/05-principal-mismatch.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/06-fork-new-root.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/06-tampered-bundle-digest.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/07-degraded-history-dispatch.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/07-succession.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/08-direct-coven-session.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/08-unauthorized-history-dispatch.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/09-revocation-before-commit.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/09-scheduled-automation-run.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/10-scheduled-automation-attempt.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/10-unknown-field.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/11-psyche-delegated-execution.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/12-tampered-binding-digest.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/13-cached-superseded-apparently-active.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/14-unverifiable-authentication.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/15-lineage-self-predecessor.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/15-revocation-after-commit.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/16-timezone-missing.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/17-malformed-calendar-time.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/18-tombstone-without-purge.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/19-verified-history-missing-bundle.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/20-revocation-at-commit-outcome-none.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/21-stale-active-cache.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/22-duplicate-schema-version.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/23-unknown-schema-version.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/24-redacted-verified-history.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/25-enlarged-stale-cache.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/26-future-cache-observation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/27-lone-surrogate.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/28-erased-content-verified.json diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index f5f4610..a4d3739 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -557,6 +557,8 @@ selected revision, **MUST** fail closed even when its copied status is active. The record's freshness assertion is observational metadata only: the verifier's fixed v1 maximum cache age is 300 seconds, a runtime-policy input outside the signed record. A cache observation after final validity evaluation is invalid. +Dispatch additionally requires verifier-supplied current authoritative ledger +state at final validation/commit; cache evidence alone never authorizes launch. Aliases are non-authoritative resolution evidence only. When an alias is used, resolution **MUST** yield exactly one root, and that root **MUST** equal the diff --git a/schemas/familiar-identity-bundle.schema.json b/schemas/familiar-identity-bundle.schema.json index 46f8222..bbc2edc 100644 --- a/schemas/familiar-identity-bundle.schema.json +++ b/schemas/familiar-identity-bundle.schema.json @@ -28,7 +28,7 @@ "bundleDigest": { "$ref": "#/definitions/digest" }, "retention": { "type": "object", "additionalProperties": false, - "required": ["classification", "verifierAccess", "recordedAt", "tombstoneState", "replicaPurgeState"], + "required": ["classification", "verifierAccess", "recordedAt", "tombstoneState", "replicaPurgeState", "redactionState"], "properties": { "classification": { "const": "restricted-historical-identity" }, "verifierAccess": { "enum": ["authorized", "denied"] }, diff --git a/tests/conformance/embodiment-bindings/ledgers/01-active-direct.json b/tests/conformance/embodiment-bindings/ledgers/01-active-direct.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/01-active-direct.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/ledgers/01-ambiguous-alias.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/01-ambiguous-alias.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/ledgers/02-stale-cached-revision.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/02-stale-cached-revision.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/ledgers/02-unique-alias-resolution.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/02-unique-alias-resolution.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/03-revoked-revision.json b/tests/conformance/embodiment-bindings/ledgers/03-revoked-revision.json new file mode 100644 index 0000000..26cb420 --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/03-revoked-revision.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "revoked", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/ledgers/04-restoration-with-lineage.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/04-restoration-with-lineage.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/ledgers/04-retired-dispatch.json new file mode 100644 index 0000000..7ba30ce --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/04-retired-dispatch.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "retired", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/ledgers/05-new-revision-same-familiar.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/05-new-revision-same-familiar.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/ledgers/05-principal-mismatch.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/05-principal-mismatch.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/06-fork-new-root.json b/tests/conformance/embodiment-bindings/ledgers/06-fork-new-root.json new file mode 100644 index 0000000..796204c --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/06-fork-new-root.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:maple:0", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/ledgers/06-tampered-bundle-digest.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/06-tampered-bundle-digest.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/07-degraded-history-dispatch.json b/tests/conformance/embodiment-bindings/ledgers/07-degraded-history-dispatch.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/07-degraded-history-dispatch.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/07-succession.json b/tests/conformance/embodiment-bindings/ledgers/07-succession.json new file mode 100644 index 0000000..9e8848f --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/07-succession.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:willow:0", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/ledgers/08-direct-coven-session.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/08-direct-coven-session.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/08-unauthorized-history-dispatch.json b/tests/conformance/embodiment-bindings/ledgers/08-unauthorized-history-dispatch.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/08-unauthorized-history-dispatch.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/ledgers/09-revocation-before-commit.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/09-revocation-before-commit.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/ledgers/09-scheduled-automation-run.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/09-scheduled-automation-run.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/ledgers/10-scheduled-automation-attempt.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/10-scheduled-automation-attempt.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/10-unknown-field.json b/tests/conformance/embodiment-bindings/ledgers/10-unknown-field.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/10-unknown-field.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/ledgers/11-psyche-delegated-execution.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/11-psyche-delegated-execution.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/ledgers/12-tampered-binding-digest.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/12-tampered-binding-digest.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/ledgers/13-cached-superseded-apparently-active.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/13-cached-superseded-apparently-active.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/ledgers/14-unverifiable-authentication.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/14-unverifiable-authentication.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/ledgers/15-lineage-self-predecessor.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/15-lineage-self-predecessor.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/ledgers/15-revocation-after-commit.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/15-revocation-after-commit.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/16-timezone-missing.json b/tests/conformance/embodiment-bindings/ledgers/16-timezone-missing.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/16-timezone-missing.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/ledgers/17-malformed-calendar-time.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/17-malformed-calendar-time.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/ledgers/18-tombstone-without-purge.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/18-tombstone-without-purge.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/19-verified-history-missing-bundle.json b/tests/conformance/embodiment-bindings/ledgers/19-verified-history-missing-bundle.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/19-verified-history-missing-bundle.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/20-revocation-at-commit-outcome-none.json b/tests/conformance/embodiment-bindings/ledgers/20-revocation-at-commit-outcome-none.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/20-revocation-at-commit-outcome-none.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/21-stale-active-cache.json b/tests/conformance/embodiment-bindings/ledgers/21-stale-active-cache.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/21-stale-active-cache.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/22-duplicate-schema-version.json b/tests/conformance/embodiment-bindings/ledgers/22-duplicate-schema-version.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/22-duplicate-schema-version.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/23-unknown-schema-version.json b/tests/conformance/embodiment-bindings/ledgers/23-unknown-schema-version.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/23-unknown-schema-version.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/24-redacted-verified-history.json b/tests/conformance/embodiment-bindings/ledgers/24-redacted-verified-history.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/24-redacted-verified-history.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/25-enlarged-stale-cache.json b/tests/conformance/embodiment-bindings/ledgers/25-enlarged-stale-cache.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/25-enlarged-stale-cache.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/26-future-cache-observation.json b/tests/conformance/embodiment-bindings/ledgers/26-future-cache-observation.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/26-future-cache-observation.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/27-lone-surrogate.json b/tests/conformance/embodiment-bindings/ledgers/27-lone-surrogate.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/27-lone-surrogate.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/28-erased-content-verified.json b/tests/conformance/embodiment-bindings/ledgers/28-erased-content-verified.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/28-erased-content-verified.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/run-conformance.sh b/tests/conformance/run-conformance.sh index 09efa4d..ed97157 100755 --- a/tests/conformance/run-conformance.sh +++ b/tests/conformance/run-conformance.sh @@ -68,7 +68,10 @@ run_binding_case() { output_file="$SUITE_DIR/.conformance-output.$$" bundle_path="$SUITE_DIR/embodiment-bindings/bundles/$(basename "$vector_path")" - if [ -f "$bundle_path" ]; then + ledger_path="$SUITE_DIR/embodiment-bindings/ledgers/$(basename "$vector_path")" + if [ -f "$bundle_path" ] && [ -f "$ledger_path" ]; then + node "$VALIDATOR" --embodiment-binding "$vector_path" --historical-bundle "$bundle_path" --trusted-ledger "$ledger_path" >"$output_file" 2>&1 + elif [ -f "$bundle_path" ]; then node "$VALIDATOR" --embodiment-binding "$vector_path" --historical-bundle "$bundle_path" >"$output_file" 2>&1 else node "$VALIDATOR" --embodiment-binding "$vector_path" >"$output_file" 2>&1 diff --git a/validators/validate.js b/validators/validate.js index af2706b..e38ff62 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -179,7 +179,7 @@ function validateHistoricalBundle(bundle, binding) { return violations; } -function validateEmbodimentBinding(binding, file, historicalBundle) { +function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedger) { const violations = []; if (!isObject(binding)) return [bindingViolation('E_SCHEMA', 'shape', 'An embodiment binding must be one JSON object.')]; if (binding.schemaVersion !== '1.0.0') return [bindingViolation('E_VERSION', 'schemaVersion', 'Only familiar.embodiment_binding.v1 schemaVersion 1.0.0 is supported.')]; @@ -274,6 +274,16 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { } const isAuthorityAttempt = ['dispatch', 'session_creation'].includes(binding.bindingPurpose); + if (isAuthorityAttempt) { + if (!trustedLedger || !isObject(trustedLedger) || + trustedLedger.generation !== resolutionSnapshot.authoritativeLedgerGeneration || + trustedLedger.headRevisionId !== familiar.identityRevisionId || + trustedLedger.status !== statusAtDecision.status || + !isTimestamp(trustedLedger.observedAt) || + (trustedLedger.revokedAt && (!isTimestamp(trustedLedger.revokedAt) || at(trustedLedger.revokedAt) <= at(commit.committedAt)))) { + violations.push(bindingViolation('E_TRUSTED_LEDGER', 'trustedLedger', 'Dispatch requires a verifier-supplied current authoritative ledger state matching the snapshot and with no revocation at or before commit.')); + } + } if (isAuthorityAttempt && statusAtDecision.status !== 'active') { violations.push(bindingViolation('E_STATUS', 'statusAtDecision.status', 'Only an active revision is eligible for a new dispatch or session creation.')); } @@ -309,7 +319,7 @@ function validateEmbodimentBinding(binding, file, historicalBundle) { return violations; } -function validateEmbodimentBindingFile(filePath, historicalBundlePath) { +function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLedgerPath) { let binding; try { binding = parseJsonNoDuplicate(fs.readFileSync(filePath, 'utf8')); @@ -326,7 +336,12 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath) { return [bindingViolation('E_BUNDLE_SCHEMA', 'historicalBundle', `JSON syntax violation: ${error.message}`)]; } } - return validateEmbodimentBinding(binding, filePath, historicalBundle); + let trustedLedger; + if (trustedLedgerPath) { + try { trustedLedger = parseJsonNoDuplicate(fs.readFileSync(trustedLedgerPath, 'utf8')); } + catch (error) { return [bindingViolation('E_TRUSTED_LEDGER', 'trustedLedger', `JSON syntax violation: ${error.message}`)]; } + } + return validateEmbodimentBinding(binding, filePath, historicalBundle, trustedLedger); } // ── SOUL.md parser ──────────────────────────────────────────────────────────── @@ -739,8 +754,8 @@ ${bold('Exit codes:')} } if (args[0] === '--embodiment-binding') { - if (args.length !== 2 && (args.length !== 4 || args[2] !== '--historical-bundle')) { - console.error(red('Error: --embodiment-binding requires a JSON file and optionally --historical-bundle .')); + if (args.length < 2) { + console.error(red('Error: --embodiment-binding requires a JSON file.')); process.exit(1); } const filePath = path.resolve(args[1]); @@ -748,12 +763,15 @@ ${bold('Exit codes:')} console.error(red(`Error: Binding file not found: ${filePath}`)); process.exit(1); } - const historicalBundlePath = args[3] && path.resolve(args[3]); + const bundleIndex = args.indexOf('--historical-bundle'); + const ledgerIndex = args.indexOf('--trusted-ledger'); + const historicalBundlePath = bundleIndex >= 0 && args[bundleIndex + 1] && path.resolve(args[bundleIndex + 1]); + const trustedLedgerPath = ledgerIndex >= 0 && args[ledgerIndex + 1] && path.resolve(args[ledgerIndex + 1]); if (historicalBundlePath && (!fs.existsSync(historicalBundlePath) || !fs.statSync(historicalBundlePath).isFile())) { console.error(red(`Error: Historical bundle file not found: ${historicalBundlePath}`)); process.exit(1); } - const bindingViolations = validateEmbodimentBindingFile(filePath, historicalBundlePath); + const bindingViolations = validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLedgerPath); if (bindingViolations.length === 0) { console.log(green(bold('✓ PASS')) + ' — Embodiment binding validation passed.'); process.exit(0); From 25afd0fc07a0c22e5ca04827b8ef310891160b22 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:38:27 -0500 Subject: [PATCH 07/16] fix: bind lineage successor evidence Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- schemas/familiar-embodiment-binding.schema.json | 4 +++- .../negative/01-ambiguous-alias.json | 14 ++++++++------ .../negative/02-stale-cached-revision.json | 14 ++++++++------ .../negative/03-revoked-revision.json | 14 ++++++++------ .../negative/04-retired-dispatch.json | 14 ++++++++------ .../negative/05-principal-mismatch.json | 14 ++++++++------ .../negative/06-tampered-bundle-digest.json | 14 ++++++++------ .../negative/07-degraded-history-dispatch.json | 14 ++++++++------ .../08-unauthorized-history-dispatch.json | 14 ++++++++------ .../negative/09-revocation-before-commit.json | 14 ++++++++------ .../negative/10-unknown-field.json | 14 ++++++++------ .../negative/12-tampered-binding-digest.json | 10 ++++++---- .../13-cached-superseded-apparently-active.json | 14 ++++++++------ .../14-unverifiable-authentication.json | 12 +++++++----- .../negative/15-lineage-self-predecessor.json | 14 ++++++++------ .../negative/16-timezone-missing.json | 14 ++++++++------ .../negative/17-malformed-calendar-time.json | 14 ++++++++------ .../negative/18-tombstone-without-purge.json | 14 ++++++++------ .../19-verified-history-missing-bundle.json | 14 ++++++++------ .../20-revocation-at-commit-outcome-none.json | 14 ++++++++------ .../negative/21-stale-active-cache.json | 14 ++++++++------ .../negative/23-unknown-schema-version.json | 14 ++++++++------ .../negative/24-redacted-verified-history.json | 14 ++++++++------ .../negative/25-enlarged-stale-cache.json | 14 ++++++++------ .../negative/26-future-cache-observation.json | 14 ++++++++------ .../negative/27-lone-surrogate.json | 14 ++++++++------ .../negative/28-erased-content-verified.json | 14 ++++++++------ .../positive/01-active-direct.json | 14 ++++++++------ .../positive/02-unique-alias-resolution.json | 14 ++++++++------ .../positive/03-retired-historical-record.json | 14 ++++++++------ .../positive/04-restoration-with-lineage.json | 14 ++++++++------ .../positive/05-new-revision-same-familiar.json | 14 ++++++++------ .../positive/06-fork-new-root.json | 14 ++++++++------ .../positive/07-succession.json | 14 ++++++++------ .../positive/08-direct-coven-session.json | 14 ++++++++------ .../positive/09-scheduled-automation-run.json | 14 ++++++++------ .../10-scheduled-automation-attempt.json | 14 ++++++++------ .../positive/11-psyche-delegated-execution.json | 14 ++++++++------ .../positive/12-degraded-historical-bundle.json | 14 ++++++++------ .../13-privacy-authorized-historical-read.json | 14 ++++++++------ .../14-privacy-unauthorized-read-denied.json | 14 ++++++++------ .../positive/15-revocation-after-commit.json | 14 ++++++++------ .../16-unverifiable-historical-bundle.json | 14 ++++++++------ .../positive/17-erased-redacted-historical.json | 14 ++++++++------ validators/validate.js | 17 +++++++++++++---- 45 files changed, 357 insertions(+), 260 deletions(-) diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index 7023fc5..04157ec 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -140,12 +140,14 @@ } ,"transition": { "type": "object", "additionalProperties": false, - "required": ["relationship", "predecessorBundleDigest", "successorFamiliarRootId", "successorIdentityRevisionId", "authentication"], + "required": ["relationship", "predecessorBundleDigest", "successorFamiliarRootId", "successorIdentityRevisionId", "successorBundleDigest", "successorDeclarationDigest", "authentication"], "properties": { "relationship": { "enum": ["same_familiar_revision", "restoration", "fork_new_root", "succession"] }, "predecessorBundleDigest": { "$ref": "#/definitions/hash" }, "successorFamiliarRootId": { "$ref": "#/definitions/opaqueId" }, "successorIdentityRevisionId": { "$ref": "#/definitions/opaqueId" }, + "successorBundleDigest": { "$ref": "#/definitions/hash" }, + "successorDeclarationDigest": { "$ref": "#/definitions/hash" }, "authentication": { "$ref": "#/definitions/authentication" } } } diff --git a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json index 031e35b..4fe1de8 100644 --- a/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json +++ b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAB3zry5LppwhNlS2yVEvhmYt5/dbcQKjOXI/xasuLNlM=", - "signature": "ufoCulaC0WSk3UEOJPN9BIjEmcS5ktNqTzNfae5awawV5yPv1PS9K5HQaGM7vGOgnk06h30AeZpHCWO/bHECCw==" + "publicKey": "MCowBQYDK2VwAyEAG1fcGmPA8dChCLQ73sVClfVhLqd+mfyCIra7Ju/H55Y=", + "signature": "0eOvJn8PRsrfUPQfHqENXnrpevJ+EcC7bznsPeAUPU23l/gCNl81+Vm615Eh4Vgg+csA3B/8dU/FLuGlcGT0BQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "95cffaee8bc4e6200f6375d8cfa7c8b0e2cc9c30fb99e412e0281f32f6a2ff59" + "bindingDigest": "5fde92071e1ceda6e0a3a1fe17662431e95df19de0dae21cedf73388fb7a6fdd" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAB3zry5LppwhNlS2yVEvhmYt5/dbcQKjOXI/xasuLNlM=", - "signature": "ZSZDTZ1THnkMNZniGH+eV/Sf8lwEPQ0E/e5pPnvQUqOlCgc5UnIRU4lt5HlytwkFZYKNb48ulXrmjRGltbYnBQ==" + "publicKey": "MCowBQYDK2VwAyEAG1fcGmPA8dChCLQ73sVClfVhLqd+mfyCIra7Ju/H55Y=", + "signature": "IrZw9cxxztTIrHuFJsMzh7ovn5Qi1Wy67zr40L9HxXYEevtkaEEoP4QQluoXD1avKhk39QKlQOolKS2aXMsLAA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "95cffaee8bc4e6200f6375d8cfa7c8b0e2cc9c30fb99e412e0281f32f6a2ff59" + "verifiedBindingDigest": "5fde92071e1ceda6e0a3a1fe17662431e95df19de0dae21cedf73388fb7a6fdd" }, "aliasResolution": { "alias": "Sage", diff --git a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json index 64bc708..37e10db 100644 --- a/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json +++ b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAFFrPkQFtErTkT6BROJILrpgogrKO0iE9fagduww8bHk=", - "signature": "oD91aanSXgsW4UCgs9fhMBvtBeKz+m3Y8dHCJQgARpImaWIOzefWDyytXY22VQYJi+rPwZox4k+e32LTJ/PnBw==" + "publicKey": "MCowBQYDK2VwAyEA5v3EdUg/isNc1zeKwAMyPdlS9T5vxbRsGBkAllfTdNI=", + "signature": "0bzpZLj1RuVs5NiwDdKof7z+EeQpCQ/VAYbZoRsr8HCK2vf7MvHWLsalTyB/pGTEk0QGhV8MXq2nv8KG8gwbAw==" } } } @@ -84,13 +86,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "9898d51ea204ffc09b624bf81c11e32e13ec0c5f8b0bfbde3f4524c91c128bca" + "bindingDigest": "eb83e1cabe7ce0611daa6b67693bf0552f001f83227887319652844c470629b0" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAFFrPkQFtErTkT6BROJILrpgogrKO0iE9fagduww8bHk=", - "signature": "XWKHX3O4ilMxaVctwp6hlrRG5uQ9AROvv+wqTDKttz8Tm55/k4QRDmntljkYFvCgzULyQhJHrDXSEPh8AzTAAQ==" + "publicKey": "MCowBQYDK2VwAyEA5v3EdUg/isNc1zeKwAMyPdlS9T5vxbRsGBkAllfTdNI=", + "signature": "ITCqWHmhRXEXhDjjjiZOAeRFIRR4YePudKvI8f2hPf4Etu4zlxLxcjlPyjmFD2yKkcKhSahoGcja7T2t3yS1Bw==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +107,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "9898d51ea204ffc09b624bf81c11e32e13ec0c5f8b0bfbde3f4524c91c128bca" + "verifiedBindingDigest": "eb83e1cabe7ce0611daa6b67693bf0552f001f83227887319652844c470629b0" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json index cd1ca1b..e540804 100644 --- a/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json +++ b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAzxeemxYcQ+B3VIzYjgqU4sMJv95CG1WWMVHiiCwBMGQ=", - "signature": "1qVA4AIoCHS/iQu/yB5/r30NSRXnnWXcX7kfiUbwCqx+/m1SgTyHT2u0pUma/NOu86RFQqhF2PoNtTJ4rP0WCA==" + "publicKey": "MCowBQYDK2VwAyEAKMzFT570vGhIhmqDHYS5t/MsO115zptQSdAxVPJWT8Q=", + "signature": "I1cjag9CaW0pbmR36xq7Lbl7PhdsW6zwNs8UVWkpa1ITB+HYqSFTxCzRMBF2QUd5y6++lW3k8FPqb5Wcd0uUBg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a3d73d48cfb4a0bdb5f81ba3c8158112d9d360b809ccd42c291fac855d2c1431" + "bindingDigest": "6d46655f75b8d97a71c21b2af476882a433cda9896e2c01314fc4cbf333144c5" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAzxeemxYcQ+B3VIzYjgqU4sMJv95CG1WWMVHiiCwBMGQ=", - "signature": "TPo7imqvtx9fpOwbefVsCxD1ajdXTJcFg/ftAihBlOjsh8uhJphAZxppcN+pb5cG5b7VcBH4l7AqiPjuIngdCQ==" + "publicKey": "MCowBQYDK2VwAyEAKMzFT570vGhIhmqDHYS5t/MsO115zptQSdAxVPJWT8Q=", + "signature": "tilH0yJ6SDzSsWxehrcWFMU+be9022VUrSixNT7RHWkODx4GCkY4AXebdDUoTx6Pc5w/13EFaF+Cqdtv4/1XDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a3d73d48cfb4a0bdb5f81ba3c8158112d9d360b809ccd42c291fac855d2c1431" + "verifiedBindingDigest": "6d46655f75b8d97a71c21b2af476882a433cda9896e2c01314fc4cbf333144c5" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json index 97542f4..64a3ece 100644 --- a/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAYXZKezTfDc0wnxWCbNPLCsQAtaRHstP2uDJ9CIQDIHA=", - "signature": "Ybi57L8iMkPEBiUmssRGucNK1D0JLA+WZoIDINy4KpVDZeFTVTQsX9MGzLb6aL7JjwK/HSY0fD244oFsY5pzBQ==" + "publicKey": "MCowBQYDK2VwAyEACm8e+rdGwHwzd4Vd2azqvhXuQNIux4ZxEff4H193DJo=", + "signature": "i6PFLD/oDq/aKHm1TCcVEly0NcWKzDT0jn/4RRGioP7K97sIz3AQ0dCWhN8xsIQeDLVRVkuvWTv1VS0RQf2ZBQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ce8dac45731821ebc814605dacbcc7043101fa707723a80164c4f9796bb2f634" + "bindingDigest": "7e58dbf64cdacdca8f35399b640804bce7225eaf0b4728dec1b26ad98253aee2" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAYXZKezTfDc0wnxWCbNPLCsQAtaRHstP2uDJ9CIQDIHA=", - "signature": "wLtl1vddxTiSKkNm8JsWWnvSo6vTQx6Ql6mbBI1N/UatV+Xq5KXTTiuzQseW95co5KheuL6hKFSH3i3RkqP8Dw==" + "publicKey": "MCowBQYDK2VwAyEACm8e+rdGwHwzd4Vd2azqvhXuQNIux4ZxEff4H193DJo=", + "signature": "Qkti/P/jSCKlY8TlH8T6o7sPbgjyQgQBSFpFWmjOXYxJB3OLihnG/5cCMj5wgolGC++iNiZZoYDbeXbdaevDDw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ce8dac45731821ebc814605dacbcc7043101fa707723a80164c4f9796bb2f634" + "verifiedBindingDigest": "7e58dbf64cdacdca8f35399b640804bce7225eaf0b4728dec1b26ad98253aee2" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json index 8038322..0830511 100644 --- a/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json +++ b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA7KFAYGk1hvt7qVJh+Y97WqSueHDQNrdy/EoLc1zApXo=", - "signature": "7RE5gYWp0sp+RSmvyCG1q2vREOGiMZUEopZsQ7lgvmamSirNEbTF/OjPgHNEjKhN7EMAseGAgK65mTg68roVAg==" + "publicKey": "MCowBQYDK2VwAyEAfUFEQEknOaDBZxQpy+vrjj3NWsUhg8qWTVhuy93X/s0=", + "signature": "/fLF8+biIfENhnGrLLaMomjNcjO3XXTARvLjOBr/Pk6AFHcrCffiWYluksfB6pngRAPMeggy57WJ5wkMfJ0fBg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "f49711bc4e7dee8943bbadc2bef3ab2f6f2d905d405884fd6037bff2a6644d1a" + "bindingDigest": "7f8e5c4ae764b5b1a3ae30683e489dc0e8fd8ccf87c8bb78c47eba8a4be7a4e6" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA7KFAYGk1hvt7qVJh+Y97WqSueHDQNrdy/EoLc1zApXo=", - "signature": "eirZpkTOyYD2riMZlOoqVK5e5kEvbiJ8qcpl+X7uHQQV5iRUCrPSwKS/J7r+exT8kyECKyljFx9+lSa++0vyBA==" + "publicKey": "MCowBQYDK2VwAyEAfUFEQEknOaDBZxQpy+vrjj3NWsUhg8qWTVhuy93X/s0=", + "signature": "a6PxcKREQaylB+La01FF0p9k2/K/nUscsn75Wad+QOb9dRAxqRJbn0lzxCN2NzNI7MGUCf+G17147kIs8kYUAA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "f49711bc4e7dee8943bbadc2bef3ab2f6f2d905d405884fd6037bff2a6644d1a" + "verifiedBindingDigest": "7f8e5c4ae764b5b1a3ae30683e489dc0e8fd8ccf87c8bb78c47eba8a4be7a4e6" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json index be967de..8e9bc57 100644 --- a/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json +++ b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAtWOPTiAirZzmk7FYFGyC8j+vqcR4nj89OGX3wXmg48A=", - "signature": "/7zmk1m4B0WxhHb4frYZnwwm5SmleglOtWCQesxN8GLIZQrizMDKjKiAWszUROAXyUfXfW+JJQNMNCZKY/k7BA==" + "publicKey": "MCowBQYDK2VwAyEALJpWKCFkDoy2e/aiXFhG+EI48bJhwUOAzdFxt+0uCrc=", + "signature": "M2SmIxJ2RBLK+k/Ew6/+nRKZ/p66vsviPf1m+OeUetNaKnE0wZiSA0Neig9af+InFlBLuSg6UsUAGroCcDtMBw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ff2bcf10044a881d02126138843e6b5000be5107df61ce3d7fbc8f737b7cf22f" + "bindingDigest": "689dac5e8e93ac4d004ac233fd1eab33b704a56375320227c174f59212e0a63f" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAtWOPTiAirZzmk7FYFGyC8j+vqcR4nj89OGX3wXmg48A=", - "signature": "fbURqCVOfSmW6BggiVWFc/V0XmGso8N2XvVRzHvbEaj1j43EMOsGKuvBD/bAqZCPFt/pZ4DLkHSNoT7fpZM+AA==" + "publicKey": "MCowBQYDK2VwAyEALJpWKCFkDoy2e/aiXFhG+EI48bJhwUOAzdFxt+0uCrc=", + "signature": "MlPeLoWyY7ZPwXfjbSWFcZtNYtNiEiDkP2X4QZCqlB5FNvf+M8/dxI2LN3F2MstlFMhi+tS0fXW0RFLVVQ8HBA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ff2bcf10044a881d02126138843e6b5000be5107df61ce3d7fbc8f737b7cf22f" + "verifiedBindingDigest": "689dac5e8e93ac4d004ac233fd1eab33b704a56375320227c174f59212e0a63f" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json index 952708b..5eed8cf 100644 --- a/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA+7Yh8/jOuxAqZ0tSvlZmdyuqHP59/JKvxUuJq1whkiE=", - "signature": "Fk3oMEfymNX7opU0ixYVPJsJc59+8JQ2EFMPXoeTGO7DOz12CEi4YVH2lxciqCa09w1a4Q85buBvA+r7llFPCQ==" + "publicKey": "MCowBQYDK2VwAyEA4W+JjJXBTm/z5r9eLmrJInAXewIBFK1PHdwSq4PhIJc=", + "signature": "yV+K4htyrG2kHohdZ57bmymKZ/WPaeL5ZBzcg2fX2pXkm60rD1vgrZFhYZkK9cgjWUs8kLD2wkujmbyJq7bnBA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "56c96c3bf0428564192ba613d130c8a15aed47eed2a2ef89dd299895855af83f" + "bindingDigest": "0cfa78f80da2e6a5a7077ef0660f8457f0f35bc6d37db8d0afc3d4e69de084a7" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA+7Yh8/jOuxAqZ0tSvlZmdyuqHP59/JKvxUuJq1whkiE=", - "signature": "ZelNZtLmivc3SzRGjoDD2oUThzeGrgA9Phl5bYh6SXwR5QVB8iNWUpQ1sqiezqMmzHtvCPsQJffpQAGD2R/2Dg==" + "publicKey": "MCowBQYDK2VwAyEA4W+JjJXBTm/z5r9eLmrJInAXewIBFK1PHdwSq4PhIJc=", + "signature": "muY6svzt+67cIqbEi8C99t55cHNyEU72lPK4Mj2Cc22FerztSRDqidvr2GBdlxzHEAcXbQgNDKgouJ3ec4fMDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "56c96c3bf0428564192ba613d130c8a15aed47eed2a2ef89dd299895855af83f" + "verifiedBindingDigest": "0cfa78f80da2e6a5a7077ef0660f8457f0f35bc6d37db8d0afc3d4e69de084a7" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json index bba8414..3d7a631 100644 --- a/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json +++ b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAUzIKgezYonu/uIcdsdhdfOsgiVEmVR0NW5UJjTpHlyo=", - "signature": "nWZoJYkahkIeh+4HcTKFR/BtysdoB0N4SIHK8um6eaeLE86CUbQiv+D9j0tXSlureu4GnpkFEfCwCeJ/j8jbAg==" + "publicKey": "MCowBQYDK2VwAyEAIJQOaHnsiBOBOwV3eW+N9O93MiIuohT9IRFMtzlW15g=", + "signature": "uq+jnJXksP+txtaVwRvXas5xHS1HGrMEWKxiti2cccYV+yO+VLwFjUbAKP65228/6Q9VwNPXKXzSvwSDYTkNCQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "9c3b1d3823c3a52abd495d5c147d03bf9732b7d3b95816b1094fa992a484cc34" + "bindingDigest": "0153e2e4db4f5793061382fc2489ec5a74dd81f82d62eafbdbf853049f346a52" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAUzIKgezYonu/uIcdsdhdfOsgiVEmVR0NW5UJjTpHlyo=", - "signature": "1Bs1OKciP1HJMv4cwOl9osaS1NeI15WAG2Q4Vd7ialEZPl4EB9nisHOxEAlf39D6hE/ISgVm0+9G/I9vPP8VDg==" + "publicKey": "MCowBQYDK2VwAyEAIJQOaHnsiBOBOwV3eW+N9O93MiIuohT9IRFMtzlW15g=", + "signature": "jDqqtd+rkCQGVVdo/VUqluVzNDdQpBWxXsMBQ3pZlaTysk7MtnudSU9UJZBp7n9LzgPPzyoQqEZ5sepR/zQMCA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "9c3b1d3823c3a52abd495d5c147d03bf9732b7d3b95816b1094fa992a484cc34" + "verifiedBindingDigest": "0153e2e4db4f5793061382fc2489ec5a74dd81f82d62eafbdbf853049f346a52" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json index c79c581..82c74b8 100644 --- a/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json +++ b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAoHta2UBAy0/zDnaAwki7saM6T/EW9Qs1ywBetSdJH2Y=", - "signature": "6GQr0mIg2bpFKG8KZcunF8XNoQlCk2EgkRWt934LXMRVFjh66Iqqy+AyX/SzotKmvHpQ+in/GphWsdvRl7f5Cw==" + "publicKey": "MCowBQYDK2VwAyEAyTlkK7fzDPRy9r5zm9jd3EBqEnSFv44ouA/xcotmmG8=", + "signature": "CbwkjxQ/j/yaD5yuHe/79hAOGQGC/IwnnE/gqGEpS+/i4+SGiiGDMBgr8i1KqHzxvio09i44hyzb8UtnU4k2Cg==" } } } @@ -84,13 +86,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "0c9afc854a84feacfb7f57deaaa1303a469a7f2ed3160990f7f82655fe7ca323" + "bindingDigest": "97657c6541294c821c444d464dda2237fe46056ae18b34a901057afa2cced19b" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAoHta2UBAy0/zDnaAwki7saM6T/EW9Qs1ywBetSdJH2Y=", - "signature": "J49WlrG8aoYSITP168FxWozR6WsTMo0iJj1IOXjoJCRrf7p8BuW/0t7izx7AJqfsOwQJNfBDTUVw83UP5309DQ==" + "publicKey": "MCowBQYDK2VwAyEAyTlkK7fzDPRy9r5zm9jd3EBqEnSFv44ouA/xcotmmG8=", + "signature": "LlVWCteeJWwQ/jlt8BpzK5V0WfOh5u+3vDilEfH/hVCD7ziWmY+/f+Taaf6SsrLg3gKqUm1w0yo1R8KBpzGVDg==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +107,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "0c9afc854a84feacfb7f57deaaa1303a469a7f2ed3160990f7f82655fe7ca323" + "verifiedBindingDigest": "97657c6541294c821c444d464dda2237fe46056ae18b34a901057afa2cced19b" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json index e921156..0b0a24d 100644 --- a/tests/conformance/embodiment-bindings/negative/10-unknown-field.json +++ b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAmbOf31f4VYZMNezOMkuKbcUXFoqEtEFWsM59cpLN9Jg=", - "signature": "SLxebnthcFkaAYQ45sPXGFmTXEZH/T7lC7KTsD+gFbXvlUq1/kNjElhqnymQnurXyZDpqZ4749EYSqPE7u68Bw==" + "publicKey": "MCowBQYDK2VwAyEAOKf95OtbWrc2JecAzzV1NWJs1cGmZX1jb8qTn6BS64I=", + "signature": "XZkUansEi3fFq7oaaRfrFna17yEs8KW0+xRBSvEqoc+rIHQI4BfsR1GGIsfuTwLf1EPPA0xp5yhm6Cw6llvyDQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "143a63c7e2a8f1df09ee3ad03bcdda195b47eb791caf8d2ea7792fcc2be1d427" + "bindingDigest": "5b616d35aaf3b985d15f91b0161ae914cece887feb8f64b6793c36a4eb61275e" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAmbOf31f4VYZMNezOMkuKbcUXFoqEtEFWsM59cpLN9Jg=", - "signature": "XGFQsVXUvPiIb+2p/dWegkcsNTCkLPUNeDyd4a9zKzEqVnCBNRMwJYe9IDDlCBK3XF1+CJRYvPoBUEky/CkqCA==" + "publicKey": "MCowBQYDK2VwAyEAOKf95OtbWrc2JecAzzV1NWJs1cGmZX1jb8qTn6BS64I=", + "signature": "6i2GbVoLaVvddJuMh5quruRm9NY3BCPqV2PWOBfsbUxIUbGY1fAf7ntX/1xoPtGdTR5uYNebuDvFBrL8M6VKDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "143a63c7e2a8f1df09ee3ad03bcdda195b47eb791caf8d2ea7792fcc2be1d427" + "verifiedBindingDigest": "5b616d35aaf3b985d15f91b0161ae914cece887feb8f64b6793c36a4eb61275e" }, "unknownField": "must-fail-closed", "resolutionSnapshot": { diff --git a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json index 5fc35d3..60751bc 100644 --- a/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json +++ b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAwPW87r1+eU3wx54ZkVuJvrcNdbd9pF3zT1zlCCX/7pM=", - "signature": "9Uhp1v+5jwO77LpiKor+pXhq90GOJ/KUa/1EzrjKtw5Jg5MGz0xX3U3g95kJxPpUHvB0Ha8zmelhJfgDaxUtBw==" + "publicKey": "MCowBQYDK2VwAyEAoAellUx3nUhHggfgp8D7sLhL5uRuf719RMmpJkzjWIc=", + "signature": "BOY7fSJ1Yg+e+QGS57odYl8NCrYJYLU+c7xDTJsZKxTbMxY2HVHqsk3Bdedg0r12EhBf0q+0b7jxFT9VjAhkAQ==" } } } @@ -88,8 +90,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAwPW87r1+eU3wx54ZkVuJvrcNdbd9pF3zT1zlCCX/7pM=", - "signature": "oX0GhwgLH1zI7/PcJuEaYhMdBpxcde4txETI0BFrlCLY7qBqTY9P81NwiAMqeMtN/Hc9ngtDxjyD8AATYVTwDg==" + "publicKey": "MCowBQYDK2VwAyEAoAellUx3nUhHggfgp8D7sLhL5uRuf719RMmpJkzjWIc=", + "signature": "y+FDxhRp+zuEWnehT9mINtJ6/RQEoRC/MKsSW+YRv31iwVprH4wN2XqDebNnG8iCP6G+InCuFXqXJerD/hOMDQ==" }, "privacy": { "classification": "metadata-only", diff --git a/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json index 52f3709..3f6b81a 100644 --- a/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json +++ b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAZMET8yjOkSputQq5Fl4GgpPCJkeu6inH3un0bA6BCXs=", - "signature": "JVE1sG7mutBAgmQ9o178Qq/XR6WbeW91r2oVl527kEIwzpxtMbYzJNWRTRQT4LTwKfP3yHdCqYdl+DLvG/1kBQ==" + "publicKey": "MCowBQYDK2VwAyEAxSPTjFvOTPZ4KxIZHzvYiX/ENuhM7kscWHLPf9MdjWU=", + "signature": "tm5YprVuKWOde+e5Zm8PI4Nht0mkyvO1XS4BR6mBdABluGTh2XS8mpPgpZqv/5fRRyJoVIt9IW9FT71pVTeFDA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a21bbda2e6f94624be2b6b6705d301b9fa7647b4365fc5c2e6c167effd00bf78" + "bindingDigest": "321bf8108f586c26b663c77f3c019411bcb63cf5942b95fb9d616aa538ababd1" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAZMET8yjOkSputQq5Fl4GgpPCJkeu6inH3un0bA6BCXs=", - "signature": "G2HcrGXbaY7CDpIQwaK5LjYh/nGVUgxdQNrP6EltwUXcwdaQkWZ2+pc3NK4BloPtktXOwYXyoKABYhJut909DQ==" + "publicKey": "MCowBQYDK2VwAyEAxSPTjFvOTPZ4KxIZHzvYiX/ENuhM7kscWHLPf9MdjWU=", + "signature": "oSR2w5sRqm4MQvXsTqsjasjazUXqBKbBZ4EsXMhfOD+bcyJAyIxnklvzjHxcGKTIIZD5Frbrs70dcaNHmNPVBg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a21bbda2e6f94624be2b6b6705d301b9fa7647b4365fc5c2e6c167effd00bf78" + "verifiedBindingDigest": "321bf8108f586c26b663c77f3c019411bcb63cf5942b95fb9d616aa538ababd1" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json index db6ef18..d3be55c 100644 --- a/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json +++ b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAsISLURBuxkg9dcr1LMwzg7gSZC7hA2Niaqtl63zaOfE=", - "signature": "BZRk3kocqmF6DcxOhPkkHxs/HAubcGlN5XoAC2KYXhH0O5CVnxoHFgib2rnlsFIMwjXMGLsw2yKKYeeFSE0yBg==" + "publicKey": "MCowBQYDK2VwAyEAEAciDQCka+m1zH8BLn3RAK8v/peMIm9hfTtDzYmsxZk=", + "signature": "oxAwCobLm4EfniccxIyaKumJvAax7i5tDLGJZ96j9xjFy+SEEpFvs2gByQ5HwBaaG8kiIs2aOyJgep6Fhs2oCw==" } } } @@ -83,12 +85,12 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a9b86307775470ad3139e8680a7ea8c2ffe8c051f00e2cdaf055c0b4497ae79e" + "bindingDigest": "dc3c3084c4663b5b1fec1cb11c1b7f4875997fb535511113c5edd30854d81f72" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAsISLURBuxkg9dcr1LMwzg7gSZC7hA2Niaqtl63zaOfE=", + "publicKey": "MCowBQYDK2VwAyEAEAciDQCka+m1zH8BLn3RAK8v/peMIm9hfTtDzYmsxZk=", "signature": "AAAA" }, "privacy": { @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a9b86307775470ad3139e8680a7ea8c2ffe8c051f00e2cdaf055c0b4497ae79e" + "verifiedBindingDigest": "dc3c3084c4663b5b1fec1cb11c1b7f4875997fb535511113c5edd30854d81f72" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json index 7336ea3..0c1e033 100644 --- a/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json +++ b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAIVI+ymS+AmKy5Q3DclcH4yuZ/YHD3AddmOcFn7aWLWk=", - "signature": "HcphiOCS0rLUukBdmI0M+gfiXx81R0kc7L3tS7l0xpd29BOQ9CBD9zS2Df7AqsyhtZ+wOZBkTu0QDH9/5BNyAw==" + "publicKey": "MCowBQYDK2VwAyEA7jaVbMDKif8m/cS2sjwqj8Fq93g4lTIWLsC+Qjax7WU=", + "signature": "NNLPwrm/IfHB0u5Pghyk/oNelZovROxXdGgP0Yz1ceILDw75kJ3cQEidYyv2VqfaTbeuenxt9gD7NUCK1qBwDg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "33c35e353bd5650dbdc527c0321e35f50e426f5569cde9fbac7ebb00e078b26d" + "bindingDigest": "75c3f299947bc3d0a97527b7c4685a506b36836931b72619b2051592a0b8cd62" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAIVI+ymS+AmKy5Q3DclcH4yuZ/YHD3AddmOcFn7aWLWk=", - "signature": "xEnI3wc3vpoimoIdb/w12NR19Cq8oSEoF6fHb9gAUEFvKpsYYbNQwqe5o+oNpXr8Wn0h+wYoCkwjRcK0FZ07BQ==" + "publicKey": "MCowBQYDK2VwAyEA7jaVbMDKif8m/cS2sjwqj8Fq93g4lTIWLsC+Qjax7WU=", + "signature": "wGR8E7U1A64ILujGLH5s9h6ACqkJQIPwI53Hf1TizYa9Tb9gi4NLsSarERyP+eP9eMASOVQy6qBq6SC9qSdVDg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "33c35e353bd5650dbdc527c0321e35f50e426f5569cde9fbac7ebb00e078b26d" + "verifiedBindingDigest": "75c3f299947bc3d0a97527b7c4685a506b36836931b72619b2051592a0b8cd62" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json index 2505181..c758648 100644 --- a/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json +++ b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEANBHtm3Hf+VEcxX8XJxscuCH3N6FJiYpni3RDEXGu3jY=", - "signature": "qVYH3seVXTeK5S7fF5omEpxG7i6MhMj4aFYmPEHwZWREIqjNOkYAayPPoBwa6vhIsZFJoqTUAg6DSfmk+yLjBA==" + "publicKey": "MCowBQYDK2VwAyEA4mlWX1saPgHzcDBF9pxuKikhjdHAJXcm1MpIxWEZ31M=", + "signature": "muttnZygZOLpRhYaLQpBMw6v+wzKOV0qHv6160iBo0IrC6jebZ7AcZoB897S2E84Eu10uMFoZ+d6qVvYXhiGDA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ea65787278ee73a381c845d215f40205f78aeb7523d1a663a5eac9c19ff7072a" + "bindingDigest": "c1e51cd20a48dc34975016bb1a16bc89c2f29733e1f8fba6d393b8621f77932c" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEANBHtm3Hf+VEcxX8XJxscuCH3N6FJiYpni3RDEXGu3jY=", - "signature": "9usMUpybCi7BMD/9s5HIrPCi3ECM2BqlcO/X5wqXhBF/9D+8NYw4OybaP6ARITszQcdpls4kq/iibMNOtR7iDQ==" + "publicKey": "MCowBQYDK2VwAyEA4mlWX1saPgHzcDBF9pxuKikhjdHAJXcm1MpIxWEZ31M=", + "signature": "aA6IXcX1K3vrMgmVE9JWQMS0FimGAPFxF5xwq/Oi+ozq74yX+/tKN7GjqL+4Z6G/hzKmVsKfTzwmZc72SzSSAw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ea65787278ee73a381c845d215f40205f78aeb7523d1a663a5eac9c19ff7072a" + "verifiedBindingDigest": "c1e51cd20a48dc34975016bb1a16bc89c2f29733e1f8fba6d393b8621f77932c" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json index c77a791..2fba6d0 100644 --- a/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json +++ b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEADSwDQbmjfGLDYi1BHJucpqivzPcjmHwV+yOJod2MGYg=", - "signature": "VhOIDux/p493atbll/n8XoL013/SQ67aUcXDtLLvJYuQ0evMGPssFqWKWJiViChNjjop2CGX6medK1Ni2+upCw==" + "publicKey": "MCowBQYDK2VwAyEABj21Zm9we7tIitPzeShI7prb2mslt/ZM5mLlURHLw7k=", + "signature": "hWnNOU2+PA9YNWfJR3zuG5KHWmBQWHFh+bq1fvd+891RZtRlBNgwvq4k+aXEAD4XzAx990ztiPVIvOCi8yvADg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "6c1052176dc40b269eba7f12c12fe4e058eca8bdb055ca277313f8913a2e4a07" + "bindingDigest": "f3f3ca0f7eab1ee4e2509cb154d527f0bdcba3c71ce02beee8b1f46e33027744" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEADSwDQbmjfGLDYi1BHJucpqivzPcjmHwV+yOJod2MGYg=", - "signature": "lJeSU3T3NF0ECtch2xVP1ZKBYW+DjlHb+GiS/1E9zvJyO1hckoZRiqCZjkk/1sPcrliIYGEDAA/5br+8/H/FAA==" + "publicKey": "MCowBQYDK2VwAyEABj21Zm9we7tIitPzeShI7prb2mslt/ZM5mLlURHLw7k=", + "signature": "nhNAOCO5ydfCv3OZ3tg5cxqbi+Zlqzc/mdYLiPcktjgGn2/67WI2pTAy4SWtZz5GhozSk+HP1etT0qexfNs4BQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "6c1052176dc40b269eba7f12c12fe4e058eca8bdb055ca277313f8913a2e4a07" + "verifiedBindingDigest": "f3f3ca0f7eab1ee4e2509cb154d527f0bdcba3c71ce02beee8b1f46e33027744" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json index 9d3522a..d823861 100644 --- a/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json +++ b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEApU3tC6xzu+pKS9/4qOkVWw1YV79p3X/CHxZpwP0VivM=", - "signature": "GRi8bV86UVpRea2zTEYmrGsF5tptbsVnSC8k8K4Q2MOWSIZzIRds0QGgP/a+Qf+/31O8O9wD7zjQZK8fbi/HDg==" + "publicKey": "MCowBQYDK2VwAyEA2RY7n1awiISCt2fWCCAvr1BViGLNOqlD/vLUF/U19Hs=", + "signature": "jXD/Ltrdtr4JUDRD/xbXDdIiD6fQUf8Fztiw+JazWv9+cm3uMIqVM0jvMIQDfCKy1zkpjTmm70JOcbNjbXNqCA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "b4d4ead9a27680d856da451fd506ef84b33fd0f369c63cf1e84e3d66681350a8" + "bindingDigest": "0795cf4e014c8c64b44761184825bd0cef786ce278e7c22bfc9d822ac99ae83f" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEApU3tC6xzu+pKS9/4qOkVWw1YV79p3X/CHxZpwP0VivM=", - "signature": "LI65t8j3kQwUbjspat1snA/S9C8M1DIjRosQhd6poyqOHFCzI+dpy1ieuDA3yu9l1niB0QCsEhJmbkGEwqy4Dg==" + "publicKey": "MCowBQYDK2VwAyEA2RY7n1awiISCt2fWCCAvr1BViGLNOqlD/vLUF/U19Hs=", + "signature": "ORmbW06+5pVbvHfa6loRcdT4JnX5iPf6Te3edy5jI27hQ0yrff56v4HeOXFN1Ehew4H1fu5Sdu+eE5dYwEoYCw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "b4d4ead9a27680d856da451fd506ef84b33fd0f369c63cf1e84e3d66681350a8" + "verifiedBindingDigest": "0795cf4e014c8c64b44761184825bd0cef786ce278e7c22bfc9d822ac99ae83f" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json index 6a78ef9..5727c4d 100644 --- a/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json +++ b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA2toVlONZkbF5CT1l2T6Bvqzae2wH41ZetUhXtzgOpbc=", - "signature": "a3QkHDB896rAJk/zOaIVcKy/5riwS7eG5sNnCGUAh6fHuMSdbG49FVltrk2wyx8GYo08s78+7u4WiKv/9IdlDQ==" + "publicKey": "MCowBQYDK2VwAyEAczsiveLtHIJ6IfNcAGzOPm1UPApwX0DOaLv/p7IYtKg=", + "signature": "lneojFM0EHPK4VFHKvSOt/xY1o/HF52rN6V6VDVkxpa0mpGEyPd4J9jR6otaxfns3C6gODXYNo1OnpdCsKZmDQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "274b3208e3953ea92e0fea2ca80925b92cd1d3153424ad5aa0b302fe1fef6a62" + "bindingDigest": "8dafb543a710833c5c3056171c17a06c5841be342df034d66858fc9440bb9275" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA2toVlONZkbF5CT1l2T6Bvqzae2wH41ZetUhXtzgOpbc=", - "signature": "31i9ZWqerk6pDC1qbdfTlmIOwVfzrG7PC2unxHP99GT76GvGpGzm1Dbqz8f8jbRRtnRX9MvdcBYP4v0B3/IJBw==" + "publicKey": "MCowBQYDK2VwAyEAczsiveLtHIJ6IfNcAGzOPm1UPApwX0DOaLv/p7IYtKg=", + "signature": "sqSZqmECdCQVsHRTKfkfFnQdCFElOAuhde6o2blew2IHs7xkcEzsR1YyMRaEmz/60MCAzzfQEr214+LJWUKzBA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "274b3208e3953ea92e0fea2ca80925b92cd1d3153424ad5aa0b302fe1fef6a62" + "verifiedBindingDigest": "8dafb543a710833c5c3056171c17a06c5841be342df034d66858fc9440bb9275" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json index 00f52d0..5673249 100644 --- a/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json +++ b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAzrwqiIiyCqPCU8dFjFSb2+59c30U/8t2ec5G4Cg8Be8=", - "signature": "NCGmm9CcX4+jTraNE4sI+5QeFEfooTWw/1Y2D+kmRz5HUHKrWP6/0WXQHfL7UA+cLe2gb1MpwQoU0O398U0PAw==" + "publicKey": "MCowBQYDK2VwAyEAXJ0fwapn5NgcoBLiO9eIb3kPKQmjfvV6qFW4HV5WOgY=", + "signature": "XK/PmN1t2/QufRFps4GhumeHrBcPkO52842Z5sw8uNIddOrO6DhXRez3IH9rLCyvwM4QFeK23wWgoTdagjUuBg==" } } } @@ -84,13 +86,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "06ecc487259810f5d94afc76f233bcef7b0f53772e6545b70329586317822617" + "bindingDigest": "37e3a9e2e91bed7b1d6a2efdadab8a7158f08c2b06946cada558bd77f1ab3af7" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAzrwqiIiyCqPCU8dFjFSb2+59c30U/8t2ec5G4Cg8Be8=", - "signature": "r0f35ug50xzgbbDlHeUJ+IhVVhNE/j4YUGTExlogBRlC2Mcg5sMVxWTgcCxNbVXfKUGoAgrttx8AaPelYCaICg==" + "publicKey": "MCowBQYDK2VwAyEAXJ0fwapn5NgcoBLiO9eIb3kPKQmjfvV6qFW4HV5WOgY=", + "signature": "8xWAtM16LVDd3a2Kuh3tjn/xeH256PPHd1Eac8j+1H9SGdwTlMjNB9JlmU59/Ipx/nNB0lXunbJu/7KO0sQhAA==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +107,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "06ecc487259810f5d94afc76f233bcef7b0f53772e6545b70329586317822617" + "verifiedBindingDigest": "37e3a9e2e91bed7b1d6a2efdadab8a7158f08c2b06946cada558bd77f1ab3af7" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json b/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json index 05b5547..988d21f 100644 --- a/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json +++ b/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAP0iaNYZ28M+dQJVEa4MOJXl/XvewSqAZGQl8xcF5/b8=", - "signature": "HhXVVLzvIYri8dzkwfmjIMZ4imfTuWDhJZXrJCVUcKSIaMhvSy7zI2pXIC34nj17XCVUrQtuB/1wkfu4UDN0BQ==" + "publicKey": "MCowBQYDK2VwAyEAaRQtDaZIiN1wN0mBhoNr3brAELv2X44UqA/lRFQm+Pw=", + "signature": "xX5TgearLVNJVYqZJ4ja9ubI30amAFIAgGQ/aoxvrOSaO1dB68QbPWO4/s2Zd+qvhn2PaWS84t4KW1HDir+JBQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "29916d4497a55624c5e41147d955a781c4290741bb5bbf1d0a0793f8f26665a8" + "bindingDigest": "d32024b6fdde2bdf072310436ad5e9eac3fcec3dcbb9bd63f05cdacb5809c411" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAP0iaNYZ28M+dQJVEa4MOJXl/XvewSqAZGQl8xcF5/b8=", - "signature": "2oEi7IbKQXtswC9s3Ck7Bi6dEZY4ykEm0wdkADCh1ta8Id+jztfYEO8enYBVfpFhmHoifhfpXZx0/XIsfDo4DQ==" + "publicKey": "MCowBQYDK2VwAyEAaRQtDaZIiN1wN0mBhoNr3brAELv2X44UqA/lRFQm+Pw=", + "signature": "WDG20PQ1z68D/rrx/NRLu6tQoCzjR8T+YxwbV5Gi6yIfm+41/c8cYQwFcff1h92nr5qW6dtn0zOv1A15HJzbCg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "29916d4497a55624c5e41147d955a781c4290741bb5bbf1d0a0793f8f26665a8" + "verifiedBindingDigest": "d32024b6fdde2bdf072310436ad5e9eac3fcec3dcbb9bd63f05cdacb5809c411" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json b/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json index 9443cb9..df694cf 100644 --- a/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json +++ b/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAHN48RF4BiWIMxvZUjLo01voIkY7KR7TNX3rp0iucXnc=", - "signature": "/lKgnchgjhLKzQrk3q6DdoCrGmM3AUl/t1SDtIphSWF+PpsjjhjUd7ifEQ1Kx4bor2PJ8sewSr9pcynW9QEYAg==" + "publicKey": "MCowBQYDK2VwAyEA89qcJfk52UCTgrJZPL6MTr7s2YPDkjZPFZmXlofdvyE=", + "signature": "lRi9Ng5Ot7+nl1Jufww9qcm/U8P9oXHzyvadpYMss8XgpCLOu1hPQFJXEatGeVAoXVNKFDudpi7YWtn7kc2hBA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "2befd213dc7713aca22bb1500099a4b28abc9368b07ff061fdc1f1e6c92164f2" + "bindingDigest": "82861f79d7590474f61efc3b68647204e08d18aefb57b187d80593cdde135f99" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAHN48RF4BiWIMxvZUjLo01voIkY7KR7TNX3rp0iucXnc=", - "signature": "4qDr+DX4y0GPPtHdLfN/a78zKv6UQLaVKGo5Jl8kZ8SUtxAwq/nnUPAxfhImSwsz1d0/CkArdGDlEbapxv96DQ==" + "publicKey": "MCowBQYDK2VwAyEA89qcJfk52UCTgrJZPL6MTr7s2YPDkjZPFZmXlofdvyE=", + "signature": "Qjx4+26two9zKFbHKBANW2P2KEiWyuUWAvNeIskv43VRHWMPvp7Qv7pyAgOE13itbykTpWG6EEC4wa0A6CEHDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "2befd213dc7713aca22bb1500099a4b28abc9368b07ff061fdc1f1e6c92164f2" + "verifiedBindingDigest": "82861f79d7590474f61efc3b68647204e08d18aefb57b187d80593cdde135f99" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json b/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json index 746b49d..3a6776f 100644 --- a/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json +++ b/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEADn+anhjG8A0tVxzxWIFjOlTfVzO61jRb9wuMEMy8qv0=", - "signature": "TWI5Lua0qbJeHPg6NZMNYmLjUHpQapIrIEsthtAznn4gjEDkJUZNZpC0tApQ8fPjzdiuCOEelvjZFzv1HL4rBA==" + "publicKey": "MCowBQYDK2VwAyEAQvUgbr5SFIy9NVgrOQKUq6p5J9OhjjH6rmQ2MnAwRLk=", + "signature": "bg9HYr9Ue50om9EbfGBUh2rtnT65FAA7Fz9GTOCVWNReqa9P9Z+QXLjZZmd38cbufMsZB009e6GT8TNLATPoAA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "6589ce8800120ed755fd52c154b019af03dce749a7ff7846992579d188be4def" + "bindingDigest": "52a5ab76e520974ebf7eb042955f45473be8dffefd55f66f378180a10b5b84e9" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEADn+anhjG8A0tVxzxWIFjOlTfVzO61jRb9wuMEMy8qv0=", - "signature": "U7FEDxaS54dx1QrHXF5BmAa+OtpFmhcA9OWegMLaFjiKlWJD+QsjKTpyF5+5y4vmROwHARUvOG4wKzYRxZJIBQ==" + "publicKey": "MCowBQYDK2VwAyEAQvUgbr5SFIy9NVgrOQKUq6p5J9OhjjH6rmQ2MnAwRLk=", + "signature": "8O4V8qb3f8pf0L6MeBqDOya16/XVS+Y4OCAGyWU/pSqy+Ws1yvBjm/ZPHd11baRb87FmML7OBpuMolXFj2O3BQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "6589ce8800120ed755fd52c154b019af03dce749a7ff7846992579d188be4def" + "verifiedBindingDigest": "52a5ab76e520974ebf7eb042955f45473be8dffefd55f66f378180a10b5b84e9" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json b/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json index 1cd3f17..4aec187 100644 --- a/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json +++ b/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAFo8pa1GlXJi+QApGE4yCOD3/Rx8qpTBdkwfgRD91VLQ=", - "signature": "f3iYz26InwfLt09dGkkAHa9RDUmQAvCr7z2Nxrc/Avf/iy/QZyrMRcrSk+kVnpJoAUDdVfgEOwRXXc07RGFeAg==" + "publicKey": "MCowBQYDK2VwAyEAxHOVCWvxMT+ptm4Z7v+Psonw5rx95rZSx4yeXIXrOp4=", + "signature": "8TEo0vrk4BLLgl444GYSGStzYYjMvr6bKKIwJ62Q/csrYTXA9H72hZMXiWqyUoBRo8+5TNa1A+/5DOE/cf8bCw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "acdfb75ffbf359c0055b32cf6e93bcab4fb6d946e1a7f9047051a2c3dde1a321" + "bindingDigest": "4cac8ecbbd7d2d45117059f3402bb374fb95186654e08e0dad96af1a358524c9" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAFo8pa1GlXJi+QApGE4yCOD3/Rx8qpTBdkwfgRD91VLQ=", - "signature": "1kW4sK3njWS64IWQac2wOZeRgNDaNX3fwrJTxcIsZxh7Ai2XCvvb09rzO5M7s1g9zMlBRPmbJuZ2IFRzwMSiAQ==" + "publicKey": "MCowBQYDK2VwAyEAxHOVCWvxMT+ptm4Z7v+Psonw5rx95rZSx4yeXIXrOp4=", + "signature": "HV0wFAFZB503P7nTp8x1PN2FEYrj1o1nn6Qv+DACvf9fszEWihwnWWMY8upMMjPlIrLlakjDysEZSQcyGbyCDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "acdfb75ffbf359c0055b32cf6e93bcab4fb6d946e1a7f9047051a2c3dde1a321" + "verifiedBindingDigest": "4cac8ecbbd7d2d45117059f3402bb374fb95186654e08e0dad96af1a358524c9" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json b/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json index ef94ddc..22e7972 100644 --- a/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json +++ b/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA1HGHT9SNYOmRRO3I4p/l4zEvUtYV5FXHA1slGZHLwjs=", - "signature": "fZlPXJ1tc19gytnsGs+m9qaQwT9UntqNb1m8fpEY6roUSVm1C/pYaZCrMueuXHHbfz0aDafc+YTlaUWAvavmBg==" + "publicKey": "MCowBQYDK2VwAyEAdvKVd7Vt0XZ5oAq90vEJJ+gkA9+Kg0NlNtWE4MY4oqw=", + "signature": "8rnW+ZdWzHgbSLbkusEjit4TzjC5TV6suDSEojAMo6g5kX8rZzqzpH/msTHcArT926r6Bui7Vv+JXY0/P7B1Aw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "274b4459375f4b44a5cfc0c7ce818c5af3fed16332f5a979cd3478125a96e3f0" + "bindingDigest": "7d799aa2589b95b51aa94ea2b8b21d39c3dc68411630585a252be6e9a085135a" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA1HGHT9SNYOmRRO3I4p/l4zEvUtYV5FXHA1slGZHLwjs=", - "signature": "mS7+/wTQ5EUwS+ZATPRPcEwLUOemjcg6865XmH5rNJ+rRLrblX2x+2VQn7F7R1/V8Z1J7Hwuk9AQJzU7OEEBBg==" + "publicKey": "MCowBQYDK2VwAyEAdvKVd7Vt0XZ5oAq90vEJJ+gkA9+Kg0NlNtWE4MY4oqw=", + "signature": "SfB2KhauD3c40Kg8IIK4S0ofV+9ESNuyZPJt0SPh8saxuJCrAhGT0yGuacWV/RW4Y6mY4lAASerD1I5ObemPBg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "274b4459375f4b44a5cfc0c7ce818c5af3fed16332f5a979cd3478125a96e3f0" + "verifiedBindingDigest": "7d799aa2589b95b51aa94ea2b8b21d39c3dc68411630585a252be6e9a085135a" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json b/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json index 29554e7..5984166 100644 --- a/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json +++ b/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAk4HrfbaB3/ZITJSPVh0fL4BP8PJ1Vg3cEAMTpoy0o+o=", - "signature": "XGRl4o640WAPsVyS+f/sh3n8uSqguqbt1WQ0xR9j+VTBmv7lClpT+63pfpzdHEjDznUIlyQQrZbVA/VofoFXCA==" + "publicKey": "MCowBQYDK2VwAyEAb0ha0Kuy3JFBnJ6Dx7fvHmrODaGL1YBW1i7n9pHJehY=", + "signature": "9P8eHnb1bMYpsRSRy44DZ4Ft+z5awBe/TUGKTa4jW5lMuz98QdHly+qJ0cpy4gt+txkFO7Q4zz1DpZKSlIcSCQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1c60305973d1317066d0140129d9d3709c632b64fa1faed0fd9b818cbd533f94" + "bindingDigest": "1a6762e458c1c1862de583217958452ee95f077ad679fbc87360ab834d851516" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAk4HrfbaB3/ZITJSPVh0fL4BP8PJ1Vg3cEAMTpoy0o+o=", - "signature": "CbhOaMWa4kar6vi+CKWa5Ca5GW/B+Xiaqf/WgZaY9916QGjjHilM0v11D/ZxIYBCepyPNNxlDUuM7kD6euivAg==" + "publicKey": "MCowBQYDK2VwAyEAb0ha0Kuy3JFBnJ6Dx7fvHmrODaGL1YBW1i7n9pHJehY=", + "signature": "Xb3kB9LOAJQjwTvLoIOUlB4cIrPIuGG9RADB7garFneSTeFfRVoqO5EnaFzJ5HxtDexisaalNstGJ7A4XEmpBg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1c60305973d1317066d0140129d9d3709c632b64fa1faed0fd9b818cbd533f94" + "verifiedBindingDigest": "1a6762e458c1c1862de583217958452ee95f077ad679fbc87360ab834d851516" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json b/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json index 5373197..0d9fd94 100644 --- a/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json +++ b/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "1c42e70843e959c5edba65f7c0f4c96f5d892e6f62f7702ee608acc42d52d74f", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEASoPHzCdtQQNQk7rNdoCZBbWLg1L09QTFL7H5swKvj7g=", - "signature": "7uxiCrBWG5UfVGLGreGnk1p6RZLrVYL2v+3XNBuzfBnZzdnMeZQf/uTPjAm4Ck+eQ6SJ0bKKiMKmA6qAAmdVAQ==" + "publicKey": "MCowBQYDK2VwAyEADYQEktSjgnVE1BOXmm76jN+1DAKs3J0g1VWmEQ7gSLQ=", + "signature": "7U7Ti5atuZC57V6k+gAjrZ+LQyP8oN8IN/6WBkv4KSMDjz5C9PlCz3dKGJ4tnKPBI8VYbe96an/b1DYJu3yzBg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "7069c1f97e64f09411c712b4ed9d0f03733c6f317a50857c793d66d39b973eab" + "bindingDigest": "8c27ae523d473aa995eaef9cdb64dd7c5520cdc0b4c704df24792ce83b9bb053" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEASoPHzCdtQQNQk7rNdoCZBbWLg1L09QTFL7H5swKvj7g=", - "signature": "KSwumHCe4Vh+ssswU+O/rWtAfOlhuPcOcmTNxHoZCyp8IKeoEuEZcXm8eVZINpkCQOiWlg4b921PJFxH5iL1BQ==" + "publicKey": "MCowBQYDK2VwAyEADYQEktSjgnVE1BOXmm76jN+1DAKs3J0g1VWmEQ7gSLQ=", + "signature": "YcUE0dsIv1uVSKVTdrSoIlKwy5+pOs2e+3z6FQldEvjKMV3wxVu3ckIiTzKBke8bR6gn05AF6acsexSLZ35YDw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "7069c1f97e64f09411c712b4ed9d0f03733c6f317a50857c793d66d39b973eab" + "verifiedBindingDigest": "8c27ae523d473aa995eaef9cdb64dd7c5520cdc0b4c704df24792ce83b9bb053" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/01-active-direct.json b/tests/conformance/embodiment-bindings/positive/01-active-direct.json index c8f0971..bb4102c 100644 --- a/tests/conformance/embodiment-bindings/positive/01-active-direct.json +++ b/tests/conformance/embodiment-bindings/positive/01-active-direct.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEADKdDkStzOfdcwMlBhvC2oHMSZQATc/jXFrmldhX+8w0=", - "signature": "sdSEm4i2qtsEQahD7t5XTc31Y3Kj+7q04Hjl+gdR2MrSGuNrToNPAy65nahDJuuUJ8KIZNk0xIV9fTiMWeJhDg==" + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "ca47880ae04f74cd6a0a8c8451d63b6790ebbde970e1d92da707e997783893e0" + "bindingDigest": "3e00dffd982dc861fea09bc19190599e3c076d31d78d18ca92ab4851051425dc" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEADKdDkStzOfdcwMlBhvC2oHMSZQATc/jXFrmldhX+8w0=", - "signature": "L9uCIA2/BeRz7NImN40AEJZ/rELjtuX/1RkHRhex1XTOFnrYn5/tkqjz7zZLBqq0MiRPlAxKL2ihBeTeN8DFDQ==" + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "Eiw/lJpIvjRQDDUO8pQhW/Dtl3eBV/KypzH1xvzy0+Mm+aOfX4y1b0DRV10GDGMTN9kLlZG43aLebzkx2MQFDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "ca47880ae04f74cd6a0a8c8451d63b6790ebbde970e1d92da707e997783893e0" + "verifiedBindingDigest": "3e00dffd982dc861fea09bc19190599e3c076d31d78d18ca92ab4851051425dc" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json index 7cc80be..ceb3a0e 100644 --- a/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json +++ b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA3FjProvkSf4b75iPP25HysbiThtVt2jS2t0TrCHYpxg=", - "signature": "3VLymij1Ljhlef39Sf9meqACX14XpPd5SddcNZn7jegvchmeXGBypD5dJ1t2FG2WIQ77V01OP2vB23CguWoaCQ==" + "publicKey": "MCowBQYDK2VwAyEAaY6C1CvA4C9ilBjq99loWS4KkgcKMucxF6eBBzHttYk=", + "signature": "scLMKJj0w2Kn9JtqlPAwodkOFGzbnkxGiDesRQFAo9YdoNv1oTQ/ih+LXkNq/2ApCrZ7dDb+FjKSm7pGAjuKCA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "6875013f623ff239b85d16f3cc99900b33cc755ae12fdbcd89e928a858eabe72" + "bindingDigest": "f85571c5eb1f832c21dfe56b428882363c57d5fab735d702ba82fdf6c7e79a47" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA3FjProvkSf4b75iPP25HysbiThtVt2jS2t0TrCHYpxg=", - "signature": "hLUrwT5RftYHQpMNpz6d05X87yZ1BS2AJFmy8zYeaYLKm8UM29QMlcq+AyuSXSX3nNBUO29Nf9OhnitHHhwaCg==" + "publicKey": "MCowBQYDK2VwAyEAaY6C1CvA4C9ilBjq99loWS4KkgcKMucxF6eBBzHttYk=", + "signature": "9JCTtvA33XjK4NTeVW14B0ThO+drTiXBeebPrEe9qMRg92+6QDKBxGE28/Mkwhp8QTwCrj/k5upk5/9FIDkqBg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "6875013f623ff239b85d16f3cc99900b33cc755ae12fdbcd89e928a858eabe72" + "verifiedBindingDigest": "f85571c5eb1f832c21dfe56b428882363c57d5fab735d702ba82fdf6c7e79a47" }, "aliasResolution": { "alias": "Sage", diff --git a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json index 92599a8..c9f4115 100644 --- a/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json +++ b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAUzCmMgHcbFnChzial33HVx/QM3aRE74hbO68th2AgAQ=", - "signature": "ur7WuskG2onrodTf7plEBY4uoADIzyZP29namGt6fWGb/Ot7uv5fY3Iqe4+mHCzNyaS/Uh8lmG4lyo096YcIAw==" + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "a0c288f29d1c23b70f34e6bb192d975a772d7a6b5ca798f093cf43fb141b9a5d" + "bindingDigest": "af139c169c7e28dfa453384ae133acded1462469b87b42334337065ee165b12f" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAUzCmMgHcbFnChzial33HVx/QM3aRE74hbO68th2AgAQ=", - "signature": "Wkv9ls9ZJxCtUOHopr8J21S0f4NKAv2hDOo4ujcK3uzIJ3gRVVWejzFZYa/9hH5jO/NutDQMJyIGG7GuEq87CA==" + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "yJraTL300+/NSQ1BkVidj75TEFvJChKKJKqPQeh383sT1i+xGqOxuzIY+wPfHMgMQYZO5ygiHgE+wwB/7ilBDw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "a0c288f29d1c23b70f34e6bb192d975a772d7a6b5ca798f093cf43fb141b9a5d" + "verifiedBindingDigest": "af139c169c7e28dfa453384ae133acded1462469b87b42334337065ee165b12f" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json index ca334a7..4036398 100644 --- a/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json +++ b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAehX7IXc0fod+x/uooaZ4U38Rt8hBo2UQ2qHmrNOIqJk=", - "signature": "rL0Zko2uHBsAL4igj8shaHv6URBOhR1VZAqb0jtfkFx3docfo181o36O6QIqEbwBS361ZxRfr4Y0AJ4dOvU/Cg==" + "publicKey": "MCowBQYDK2VwAyEACcBCd+t6AZJD0x0yID7srZ7AhFjAM4+9Mh+col4e75Q=", + "signature": "4niJv3fOCe7nZt2AdMSl0+4O6vczDNjkBnr2X1FEEgLE0rP7NRXmZa8O6e9Cnsc6Qpo4AaZ86Sq0icLEXvpeAA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "6021cd676a11a129b3c2e7b7507e8bd7c76dcda45a42adc80557e118b60438be" + "bindingDigest": "519c566b2d70d792f4a01e8d5abdffc1f1fad1d2024549e28b9a43b3416c671e" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAehX7IXc0fod+x/uooaZ4U38Rt8hBo2UQ2qHmrNOIqJk=", - "signature": "ANySG+q+7T3fDmlZovBPAl/FS5ewTM2zHFAD7P+IRj26zWUDVR86gt+wKthUoHdbu6b29WSSOP1gEihN8QeRBQ==" + "publicKey": "MCowBQYDK2VwAyEACcBCd+t6AZJD0x0yID7srZ7AhFjAM4+9Mh+col4e75Q=", + "signature": "3ixXOUp8UT09amkB9W1aHW51t/1jTLUahOaub6yNbkxgMPEAXiEycTltGK/s2jqGKW5OBjXlzYUwGl5k4wXkCA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "6021cd676a11a129b3c2e7b7507e8bd7c76dcda45a42adc80557e118b60438be" + "verifiedBindingDigest": "519c566b2d70d792f4a01e8d5abdffc1f1fad1d2024549e28b9a43b3416c671e" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json index dfa7121..47f4e56 100644 --- a/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json +++ b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA/VAkYDKfFC6X87yv83BPH9Tg7fTxAdT9S6PnK+B4yVQ=", - "signature": "lTJnYybfDP8kveXfeknP9S/5j9yd5m6Ftu6TZLY974ZXk7zX8TWCvY2qGy+bnegO8rWw+466FGUVZGcVNaycDw==" + "publicKey": "MCowBQYDK2VwAyEAOBKGjkSdpgzbWc8oVu52nTlVjTbwSUefmojVgDY3lXA=", + "signature": "agUfr78BmpmhAW7yINfU2QQ3lUaYX/fXgMsDLBJbHEFCLJRhn4xHDdVpzmj3ZCiNgJ7nd3BwUvDycVHtZ2tiBw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "d7ea5b3053032b351805d4ac68644981e9a8e7ae70fbda57831a789f28814c1c" + "bindingDigest": "c41187cf140b5c4ea96b962553bbb8742d831bca3505bc7d3724bf73e420df50" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA/VAkYDKfFC6X87yv83BPH9Tg7fTxAdT9S6PnK+B4yVQ=", - "signature": "T8oGPZtpO0ubX5g2EjIDR1Ozxo1Lfb6f8Vm/YTIVnXBszyFA0ih8aQXMBeaWG8MYj1aRuofWhE+6YQY4IKmRDg==" + "publicKey": "MCowBQYDK2VwAyEAOBKGjkSdpgzbWc8oVu52nTlVjTbwSUefmojVgDY3lXA=", + "signature": "NzK4LbDghVGwmKRV/zaLeOoRPYwWLuwRFGbes/zuE5fJrpcU6Lg4qVLjCaNaRyKhgAF123mbz7k7NxKmD6H9Ag==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "d7ea5b3053032b351805d4ac68644981e9a8e7ae70fbda57831a789f28814c1c" + "verifiedBindingDigest": "c41187cf140b5c4ea96b962553bbb8742d831bca3505bc7d3724bf73e420df50" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json index 85d957f..5597c13 100644 --- a/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json +++ b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:maple", "successorIdentityRevisionId": "familiar-revision:maple:0", + "successorBundleDigest": "06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534", + "successorDeclarationDigest": "e97cb110eb3ded123930545fe90cb20ce705c61419aa11f5a23f7f447e4ed079", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAsKYuJtZ26z+aGq9ZnM/Nl+RxACnCpPsmNc2dr4KKMHw=", - "signature": "RYrGJxVJwjKkXB7aBtBaal0Q3cFifSVHT/T5VoyPBGuXyjuN66jWakpzfYEsCeO7E6s/97tSJon7s3yDDY0yAw==" + "publicKey": "MCowBQYDK2VwAyEA0NH1jPkhEeIrCGHIVKXohcKiEdCYHvl+O7e0LK4nSy8=", + "signature": "QZfNAe9guSXJUeaUXx0v7jnePSI78a4H+uURE46ahPJOo54RfbFsVc/mMjmJyqLtDNFSozbPZPfURveMbRdRBw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "0f9905a1d5d5b10ed674ad9b9dd1e302b3aeb28d3a4aa61f4630339235a30731" + "bindingDigest": "77524669665b06d8212156ba86418d848b1c5d98a5e6aa1be26d265d5a36d279" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAsKYuJtZ26z+aGq9ZnM/Nl+RxACnCpPsmNc2dr4KKMHw=", - "signature": "/PjixQfAeT2cuObQ+pLcNIUzlOZVjWkbXLydFQI3MHA4DE1ss2NCEsNBdZvGR/LjUQaXi9OHRrg+nQI6ALTNDg==" + "publicKey": "MCowBQYDK2VwAyEA0NH1jPkhEeIrCGHIVKXohcKiEdCYHvl+O7e0LK4nSy8=", + "signature": "BViS0OgX2BJHeaUuHjMseOrhV1fmbfmWZniMCvY+RxLfkAK8qYagLggr21J5ToihHahdPff+ts+E4cl3qeYjDA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "0f9905a1d5d5b10ed674ad9b9dd1e302b3aeb28d3a4aa61f4630339235a30731" + "verifiedBindingDigest": "77524669665b06d8212156ba86418d848b1c5d98a5e6aa1be26d265d5a36d279" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/07-succession.json b/tests/conformance/embodiment-bindings/positive/07-succession.json index 2816139..5aeaf87 100644 --- a/tests/conformance/embodiment-bindings/positive/07-succession.json +++ b/tests/conformance/embodiment-bindings/positive/07-succession.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:willow", "successorIdentityRevisionId": "familiar-revision:willow:0", + "successorBundleDigest": "19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291", + "successorDeclarationDigest": "b4ce2e6913e66f082a0974207a12067ca850b0585fbc8ae8abc2d39a57d39504", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAmGCp5J+fEbvggUznHAssXkrEJeZW0TI1ECgbn3dK1Us=", - "signature": "nzasflbvCNkjnrUJEsvhVK9Om2TzQBLYrtkwaAcv8Xpc6oqUjPQuiFVN2gjnI4H8mOVNlZlNJSlA7SiOX2CxCA==" + "publicKey": "MCowBQYDK2VwAyEAjRelodI9UZ0ABaXMvcn/LkvIAsdfBlrvVFUSq0zx2W0=", + "signature": "kREqEih/JCPfmae0M0DsXGR+yGBp5tAFyyYTlIogY57aFsTS9y4lZxMxhxDPoi2onYl1YCjOtxnRaM/5u+VgAA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "cda4db7702f6deea17909ef2c55de6463b6d3bf475bea229c041d1636108fc3a" + "bindingDigest": "cf6ae57ea0ffa861c2f002065bf3ce9cb17824bafca408285cc1f79dd2cb34c0" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAmGCp5J+fEbvggUznHAssXkrEJeZW0TI1ECgbn3dK1Us=", - "signature": "lAuL8vn7b5AEpLdNqbyKnxsnqPU+v59y+Az0gfbyUJpyEusZ4fsMPGuR7I5AYvb6LFRxx3IqRhRdpTAO7BC/AQ==" + "publicKey": "MCowBQYDK2VwAyEAjRelodI9UZ0ABaXMvcn/LkvIAsdfBlrvVFUSq0zx2W0=", + "signature": "J65FYcFECSRYlgBz7+lW+k9DDLuSrrfR+lHRZZOkYd8P2ciqgMbr5E5N46f7M0mhuqLKO3RrAhqesOfmmABsDg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "cda4db7702f6deea17909ef2c55de6463b6d3bf475bea229c041d1636108fc3a" + "verifiedBindingDigest": "cf6ae57ea0ffa861c2f002065bf3ce9cb17824bafca408285cc1f79dd2cb34c0" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json index 5ad54e4..13398a1 100644 --- a/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json +++ b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA/rAorrrBWzD2kC1jtphgcdwAIwmwunU5LZVSYYLDT3M=", - "signature": "1DKt43G20FwAcX6FzIH7hDRyTTAQk6b0runvUnrHbop+2qFR/cbxbD3NKD2ws41Ahc5bEGZ+zwGsr7ki9oS9BQ==" + "publicKey": "MCowBQYDK2VwAyEA+6zKoYB0C6wlGwhULZz0MAyxCLU9pSq/gtGg35LZdqU=", + "signature": "L0ZyQOdTwV5j0i5WVdwuK7JMrVd951SUeP3KtOFX2tsUSsKDtnzaGSzCVKIZ8D3+QJDfdMawfJe/faTXd4JXAg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1392cd7a10a7f7b593c5db247b397cfb5a77a8ddc608efba3795415ad2478e17" + "bindingDigest": "d314680598d007084f0ce514b0907e73dd6ec3a2b8b4a2a6228414df5306af47" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA/rAorrrBWzD2kC1jtphgcdwAIwmwunU5LZVSYYLDT3M=", - "signature": "hiuRsHNre/IB9rNsz/gLlQSG6D8T/cg6sfLsNAiNmVoVi6OjN/QGbnZDUsykl9vWW+cJ7T1zcz+Pb+TQIuBKBQ==" + "publicKey": "MCowBQYDK2VwAyEA+6zKoYB0C6wlGwhULZz0MAyxCLU9pSq/gtGg35LZdqU=", + "signature": "TaSzuUf1QfGs71vdox9uNn42cbx2IlBHTCbjO4dk/Os+4gj8McbHGCW51sEO4GAMTyKO39WZnZZiexAzoexzAQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1392cd7a10a7f7b593c5db247b397cfb5a77a8ddc608efba3795415ad2478e17" + "verifiedBindingDigest": "d314680598d007084f0ce514b0907e73dd6ec3a2b8b4a2a6228414df5306af47" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json index a0f578c..cc0061d 100644 --- a/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json +++ b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAyYe63CbdB/4IBD3iyW5QEk/3HWOpTjwVuQdyAUWmtUk=", - "signature": "5sfyoCzXr/2Y8jpKEAycSthc6hJW/fJvSrMEDbalfCED+nxn7mmnE1njMDpBMvratoantPThMKKSYUgyLUzmAw==" + "publicKey": "MCowBQYDK2VwAyEAgqTdMpEstGgDIRhC7EEK91Hthd/YatmHf4xlLz8ylIQ=", + "signature": "EqBUqsRJ2ETK420vQu6eLh9JpxBW+QQLrxzeUe07jSEgI8qGowWBb17hhrJopJifO1WS6TifZjw3zTU75GCXAg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "93b77c24085a74f8602ca7306bde14839cae07a7dfcf72bb208236f500ad0245" + "bindingDigest": "3fd824ae4c68fb524cce9941268b12642f615e29241d15ef6c96046ad93fa473" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAyYe63CbdB/4IBD3iyW5QEk/3HWOpTjwVuQdyAUWmtUk=", - "signature": "yAruXf2pCj0/LO2sFPfwCRf89YaYVxqAX2eqoQY8qxVfeJdADESFLj+PimoafuDFuxcxqIU2PS+eT5vFj2CABA==" + "publicKey": "MCowBQYDK2VwAyEAgqTdMpEstGgDIRhC7EEK91Hthd/YatmHf4xlLz8ylIQ=", + "signature": "7Li0bSTx0jKDDiD35TJ6CFtdGnXtirLqbB/Inm1FFBeiyWU8i8+Je+BZWc9Cuz4zKbHZkTjPI2KpTyRC0AMvCg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "93b77c24085a74f8602ca7306bde14839cae07a7dfcf72bb208236f500ad0245" + "verifiedBindingDigest": "3fd824ae4c68fb524cce9941268b12642f615e29241d15ef6c96046ad93fa473" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json index a512851..6628193 100644 --- a/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json +++ b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqLIRdpi+6yCbg7LXO8ykcMtnbkFyioZ6OgjLE6iUm5U=", - "signature": "wqQLXlbqSO434jp0v2tJQ7fethtpHtjbNaHTc/SFhzNIDhQ1HXCGFAR3xLnMkIwYJtU/y6pMta/xnxNjt3F3Cw==" + "publicKey": "MCowBQYDK2VwAyEAf84T9ceTGy8cE9zeYQC6afxKtV3jn5Sk8/Grknkml18=", + "signature": "E2gHUJHTjG9noqnrpA7Z9tc1A4/kjxqGEIVaRlEjgsGsnnrKwbE94KRAFhqBaGYsTdr06EfM73NevL0DOZs6Aw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1f8fe5fbd898ba540b03378c049d760067db0b7c11a8227996cd94a9447929a1" + "bindingDigest": "986374294e207333628e3924622121e257972e868f5107cf36304a7587724d33" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqLIRdpi+6yCbg7LXO8ykcMtnbkFyioZ6OgjLE6iUm5U=", - "signature": "b3WiuPk6+s8c1wmethDx79k4e2V3KRo+I1EHGcVA/4+KzWllnAJAk2yJm22xKHMYkQj1G7KymEbX412uvEyNDA==" + "publicKey": "MCowBQYDK2VwAyEAf84T9ceTGy8cE9zeYQC6afxKtV3jn5Sk8/Grknkml18=", + "signature": "q2rQFeCIFRkMhBKsa6AmPfkhQpQkkbToaW9VEAQTNjimJKOAO0mWrCCjqK4BUcwg44Stqk+FA4Me5UcS844tCg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1f8fe5fbd898ba540b03378c049d760067db0b7c11a8227996cd94a9447929a1" + "verifiedBindingDigest": "986374294e207333628e3924622121e257972e868f5107cf36304a7587724d33" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json index d587487..93ca161 100644 --- a/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json +++ b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA9TKGW0WLSrchCSVdxDXl5TAqO83hB1tjr8UM3hla35A=", - "signature": "LaRQne8O5RKxklguS9SwCnjt23ku2jXYV/oYcZfhryYHUhOCUklDKHkk3t+Fu/wkKbKmqu6GTUppqrcb3ywSCg==" + "publicKey": "MCowBQYDK2VwAyEAdxtgMKoCtBqZ45IQnKwmxpngZ7QZIc/K5DggWbTIaHg=", + "signature": "W6JD6MmPzveg6C0bxUZD1j9KNQLwidYHq5495K+3fagOUgVe7w0t0/qA0eziEcsBJZCvtb257bTp9y7Bjt9hDA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "3e2ef24af28a083088043c46c8e03883e86b06c9a152bba2ff5aa0051b6be418" + "bindingDigest": "fae0263a1e9b6a47cad090c611cc0c9cda792b28e14a111960ba56694033aec7" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEA9TKGW0WLSrchCSVdxDXl5TAqO83hB1tjr8UM3hla35A=", - "signature": "FAStqCSnj8vK6zsdIkmXTD/xZCs5siURQsdGApdOOhHyXjvERuF8hEW+WqkzaBM0TAeh7/hB2TE4sbRIx1G1BA==" + "publicKey": "MCowBQYDK2VwAyEAdxtgMKoCtBqZ45IQnKwmxpngZ7QZIc/K5DggWbTIaHg=", + "signature": "88kqvMQmtJtn9OZsoSMQa1YbQnt8r5fGBrEFy86/r1ho+3B4K9hx825q21ReYfskzWOwE0k4ob852PP1BCSdDg==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "3e2ef24af28a083088043c46c8e03883e86b06c9a152bba2ff5aa0051b6be418" + "verifiedBindingDigest": "fae0263a1e9b6a47cad090c611cc0c9cda792b28e14a111960ba56694033aec7" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json index 9a5fb45..4b282dd 100644 --- a/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqD7jjHVRsp8MgigWinyYQNRWpx7RVL1hhisUpziBCvg=", - "signature": "+5ual4b2TZEUYd0we8Y5VeMOuOpgx6UkhXgcqfP2A5QQo964xVV76w+PWCvzjacLrAl8vzueAKn7HPbAs//tDA==" + "publicKey": "MCowBQYDK2VwAyEAgU6K1VzRI2GDA47fspmVkFSZqG8UdAT2074D34ajbQ4=", + "signature": "6IHl8s59/M9P8VamxW3tI8tT1mc5mrdOGZHkZE7Ig7OscjqX1mCi+vwM8RLtUrOD+kDo5Ekc9onwZTrRTrxHBw==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "37a3153412fbd95bc6558b93cf80e1512784e59b8251c749e9ded5c4dcd91931" + "bindingDigest": "1f680da15b8ac1128ae090f4a1bc911b4ae35bf99a49fe4909b5233c649b5a6e" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqD7jjHVRsp8MgigWinyYQNRWpx7RVL1hhisUpziBCvg=", - "signature": "lM3XgFAs5FRaGhBWf28xmtXV7VKe1NwvMx+vXqEB45yds2bXm8jqUB6JflQt1iKkNCWOzHIDcfa4kDkKDmX4Cg==" + "publicKey": "MCowBQYDK2VwAyEAgU6K1VzRI2GDA47fspmVkFSZqG8UdAT2074D34ajbQ4=", + "signature": "sztru0z76aRIo3IAnIhj4NxhP+tcWa95oIfIH4euus6tEVKBjVyoX4W4x6AiZczNYTYCJAKxBAH6rQvfqBiEDQ==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "37a3153412fbd95bc6558b93cf80e1512784e59b8251c749e9ded5c4dcd91931" + "verifiedBindingDigest": "1f680da15b8ac1128ae090f4a1bc911b4ae35bf99a49fe4909b5233c649b5a6e" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json index 6409047..6d87cb5 100644 --- a/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json +++ b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAvWGc/ZvBYU/GNIv2AdzjDPzfWwdzJhls0+3SQKn7s+s=", - "signature": "fDbihp3ylGa6HE7WSxyA/GFdvDP8pVMN6IVsLUSs8yeqTCZ3Wd2mHP1X1h6+5C/GIG69MIUtxFT5KmgB/7N2Bg==" + "publicKey": "MCowBQYDK2VwAyEAGRi7PE/DtvbWDpuOCjzRgfAP+Xcy2dpGiLZEZiJMmdA=", + "signature": "qn80Bt0Ulk/1/qrmdo59ilqbyDxbDEWY/AxM4o8oPggX8Fv6f6nZEOZoWVGzGZa2xSGey6uozdEYCeL2kt9IAg==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "fb3e6269ce3209b56c7967ddcd584362e131dd30400642cabf9c64d534e5827b" + "bindingDigest": "d817a7ec1f2f1ed34b92d8461cb55e2c92299a85e590febe0bfbcf3c26208e79" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAvWGc/ZvBYU/GNIv2AdzjDPzfWwdzJhls0+3SQKn7s+s=", - "signature": "0Dj7d18VH7uhC4ZMUSdA3JoL0kvzHy59C5PeY2+UkauM3KQDLrUZubZPO0c91l85QQzyOcnQl6WiJy/GPJezDQ==" + "publicKey": "MCowBQYDK2VwAyEAGRi7PE/DtvbWDpuOCjzRgfAP+Xcy2dpGiLZEZiJMmdA=", + "signature": "l1xD9GdZQ5NDFgr120wLzw74yNlvjYfYoWup/GtXudiErTshktVUF+WtGOUs27ZpS1Kldb2akSIpY2dlSQxxDw==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "fb3e6269ce3209b56c7967ddcd584362e131dd30400642cabf9c64d534e5827b" + "verifiedBindingDigest": "d817a7ec1f2f1ed34b92d8461cb55e2c92299a85e590febe0bfbcf3c26208e79" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json index 100ff54..bf90578 100644 --- a/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json +++ b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAAMli4dSXfXEgj5WyA0IAMXN704V1sHKocyy+XD21UeU=", - "signature": "zb5DPSvW+AbxI79/yc+9UOEdFX+hMQadRmuesm+Im1R02KCI7Sf/4iZDMTZMhC38iSidfncXuFBGP9R+QR+ABA==" + "publicKey": "MCowBQYDK2VwAyEAdjIkwbKWps7/Lyf2SdwOEkA6owIkzH6jygtbm89E+34=", + "signature": "9UJVzYic79W6hvs96xCAz1Rh+u+Szgqwvlc/ad/q/pVKQQH0UV0qq8ryTbByKqDl1MhVdUFszqGu0P3UGhglDA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "c2bd8a0899b9312971fc1a1c21ddc5c087dfbf13809f4437364d918c836b4403" + "bindingDigest": "b91cf30863b83b09a3024a818def64ddb23305e21af374a92a894a8808db0160" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAAMli4dSXfXEgj5WyA0IAMXN704V1sHKocyy+XD21UeU=", - "signature": "f4gEZoIvPBo3RwXjPejEGj9adVoGFcf7aKfEiPiqAHM2I5xwcutcctmu11hFTowVq9D0hPpC4N1xPmOi9nyLBA==" + "publicKey": "MCowBQYDK2VwAyEAdjIkwbKWps7/Lyf2SdwOEkA6owIkzH6jygtbm89E+34=", + "signature": "GDUPpjBoQNnY4IEdO+3bXKdGdM7oRlg7Q0rk3Ews8eF+H2Y1jhJBvUH6UBvu6LNvSgUhAlXdEVnxXRghwxo8AA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "c2bd8a0899b9312971fc1a1c21ddc5c087dfbf13809f4437364d918c836b4403" + "verifiedBindingDigest": "b91cf30863b83b09a3024a818def64ddb23305e21af374a92a894a8808db0160" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json index dad3add..f08ba8d 100644 --- a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json +++ b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEABPfmvigJaQ5Ek3Gv/9+9IvbZxOvm+Q6PT8wJ1rMTXOw=", - "signature": "DlDmM/CHOLnKJZtxodZcaafqyIGR2AwzureOlwNH/78IUHL3gMC7ZlLJ8JxRDEc6VvxSJ/BQWV0qBb6r0L2pBw==" + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" } } } @@ -84,13 +86,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "9cb48bb6310b535da3c12552e7d037c745c3622a1e4430a1903a58961f61b871" + "bindingDigest": "480d5f34266fa9804d4ebb474c02fa1bd9f266440650f12712c9a8d48efffab4" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEABPfmvigJaQ5Ek3Gv/9+9IvbZxOvm+Q6PT8wJ1rMTXOw=", - "signature": "hV+5TvoX1cl9oDcWrD95HKJg239Nh56/DCqP1LLXAOVAqLG4YEGsTpaQPmmxKPeMOg9dTBKCPWh/LSG60ZVjDw==" + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "KdXis2ZANHA1/ce4tVHEXE+RKvMApYEf1shXKkcJTco4eHmdbYi6uj4MxTChNu86+lOQ4J2pEQmxPokNQ3M/DQ==" }, "privacy": { "classification": "metadata-only", @@ -105,7 +107,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "9cb48bb6310b535da3c12552e7d037c745c3622a1e4430a1903a58961f61b871" + "verifiedBindingDigest": "480d5f34266fa9804d4ebb474c02fa1bd9f266440650f12712c9a8d48efffab4" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json index 0e4d99a..ea8edda 100644 --- a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAljqhtdTOTwE5nmqQvRk6nx6N848GA0YyL+TCHK4qBa8=", - "signature": "E4j4TDvWhD02dI/0DvM73YGHAQIYYRX12wysfAAgIhc+ywsc1BSvzzlsif6CWoOO+01VvW1m6o0ZFblmHKTXDw==" + "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", + "signature": "8UEUsFQKRc4iW652JIsQJW/2EuvEeMJjZVr3HkjvljVw68fEkUuQP9dZnRJG/D2e/ZM5HCUAZYoJQ/xvMbiLCQ==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1be8293fc4255debe3912de2ab85ee23ca2befe9fd3613cb4c76ff7e67cee63d" + "bindingDigest": "02f15088bf92d8f0fd7c175a8bf3980fdcfc8ee08303b3bae1748beacca4d3de" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAljqhtdTOTwE5nmqQvRk6nx6N848GA0YyL+TCHK4qBa8=", - "signature": "oKsxItm2JOmOsGn0GIvwE7/2h+nZm8tbjl5vJykTMnqVUcMzPii0sw6nV4hz1/BroKaZh9ml3UCIJMrb/CzqBA==" + "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", + "signature": "vPhf4ioePoeBRinjnm2rRR3R2LCJzyVXZRk9Ylj2obIQBpoWjCSS/NisnxGR2n3tAHfz3VGrytF6GwOFtjGvCA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1be8293fc4255debe3912de2ab85ee23ca2befe9fd3613cb4c76ff7e67cee63d" + "verifiedBindingDigest": "02f15088bf92d8f0fd7c175a8bf3980fdcfc8ee08303b3bae1748beacca4d3de" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json b/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json index abc224c..f7e4931 100644 --- a/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json +++ b/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json @@ -20,11 +20,13 @@ "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "successorFamiliarRootId": "familiar-root:oak", "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqqESL7br96BoYoMhpQO1oQt1m+ENjghAAeDtx/yv1c4=", - "signature": "5VU1YrSJHA2X+NfKwCWXkqklHu2qlpViI1crqPar0cS3i4aFEFJVrj9jEvXglbtO5RQJSVzqTyLUBxFDpnOtBw==" + "publicKey": "MCowBQYDK2VwAyEAQ+xP5apS21UT43mLI6dDU3TuD8pZvq+KxA4u1f9+LSk=", + "signature": "f7ti5FXYL7P6TELnjx4jOnPlqCaLyZr+EPTE5fS9t7Mrh853yLHcesIOaBNB250+6pFZjHeqxuKNSINTATl5AA==" } } } @@ -83,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "7e1f0c5772470cb1f76bd99db56e8e89cc254068f35f40f364782adc9865bb01" + "bindingDigest": "1a856ce4ab5e638bf3482fa01d4f5b8273d122d50ebfb792d4f740bc8c8f3475" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAqqESL7br96BoYoMhpQO1oQt1m+ENjghAAeDtx/yv1c4=", - "signature": "Mo9P926MmFo2Kcq9FH5f/ve/5ksfShF/v1DPPcIkyHKf9LPRNjH7H0uVrAkV/Gek1TzaFRKScvPfzFdMaLOtBg==" + "publicKey": "MCowBQYDK2VwAyEAQ+xP5apS21UT43mLI6dDU3TuD8pZvq+KxA4u1f9+LSk=", + "signature": "UFPrcIemU1k4ZBG+mGzqtcSukwpsM6JDjcxuEFOHlqOOdgy8Olq+JM+4a33t4KXAN9ciB3gCAwSgXHJD4gt+BA==" }, "privacy": { "classification": "metadata-only", @@ -104,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "7e1f0c5772470cb1f76bd99db56e8e89cc254068f35f40f364782adc9865bb01" + "verifiedBindingDigest": "1a856ce4ab5e638bf3482fa01d4f5b8273d122d50ebfb792d4f740bc8c8f3475" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/validators/validate.js b/validators/validate.js index e38ff62..253b6a8 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -119,16 +119,20 @@ function digestObject(value) { return crypto.createHash('sha256').update(canonicalJson(value), 'utf8').digest('hex'); } -function validTransition(transition, predecessor, familiar, relationship) { +function validTransition(transition, predecessor, familiar, relationship, bindingIdentityBundleDigest, bindingDeclarationDigest) { return transition && transition.relationship === relationship && transition.predecessorBundleDigest === predecessor.identityBundleRef.slice('urn:sha256:'.length) && transition.successorFamiliarRootId === familiar.familiarRootId && transition.successorIdentityRevisionId === familiar.identityRevisionId + && transition.successorBundleDigest === bindingIdentityBundleDigest + && transition.successorDeclarationDigest === bindingDeclarationDigest && verifyEd25519(transition.authentication, digestObject({ relationship: transition.relationship, predecessorBundleDigest: transition.predecessorBundleDigest, successorFamiliarRootId: transition.successorFamiliarRootId, - successorIdentityRevisionId: transition.successorIdentityRevisionId + successorIdentityRevisionId: transition.successorIdentityRevisionId, + successorBundleDigest: transition.successorBundleDigest, + successorDeclarationDigest: transition.successorDeclarationDigest })); } @@ -176,6 +180,9 @@ function validateHistoricalBundle(bundle, binding) { if (bundle.retention.tombstoneState === 'erased' && bundle.components.some(component => component.redactionState === 'retained' || component.content)) { violations.push(bindingViolation('E_REDACTION', 'historicalBundle.components', 'An erased bundle cannot retain sensitive component content.')); } + if (!redacted && (bundle.retention.redactionState !== 'none' || bundle.retention.tombstoneState !== 'live' || binding.historicalVerification.state !== 'verified')) { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'A fully retained supplied bundle is live, unredacted, and verified.')); + } return violations; } @@ -247,6 +254,8 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge violations.push(bindingViolation('E_ORDERING', 'decisionAt', 'Snapshot resolution, final validity check, decision, commit, and issue must be ordered; statusAtDecision.decisionTime equals decisionAt.')); } + const bindingIdentityBundleDigest = identityBundle.bundleDigest.value; + const bindingDeclarationDigest = identityBundle.declarationDigest.value; const lineage = familiar.lineageEvidence; const predecessor = lineage.predecessor; if (predecessor && predecessor.identityRevisionId === familiar.identityRevisionId) { @@ -258,7 +267,7 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge if (['same_familiar_revision', 'restoration'].includes(lineage.relationship)) { if (!predecessor || lineage.rootEvidence !== 'continued' || predecessor.familiarRootId !== familiar.familiarRootId || predecessor.lineagePosition !== familiar.lineagePosition - 1 || predecessor.identityRevisionId === familiar.identityRevisionId || - !predecessor.identityBundleRef || !validTransition(predecessor.transition, predecessor, familiar, lineage.relationship)) { + !predecessor.identityBundleRef || !validTransition(predecessor.transition, predecessor, familiar, lineage.relationship, bindingIdentityBundleDigest, bindingDeclarationDigest)) { violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Same-familiar continuation/restoration requires an authenticated, content-addressed edge from the immediately preceding distinct revision on the same root.')); } } @@ -267,7 +276,7 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge } if (['fork_new_root', 'succession'].includes(lineage.relationship) && (!predecessor || !predecessor.identityBundleRef || - !validTransition(predecessor.transition, predecessor, familiar, lineage.relationship) || + !validTransition(predecessor.transition, predecessor, familiar, lineage.relationship, bindingIdentityBundleDigest, bindingDeclarationDigest) || familiar.lineagePosition !== 0 || predecessor.familiarRootId === familiar.familiarRootId || lineage.rootEvidence !== (lineage.relationship === 'fork_new_root' ? 'fork' : 'succession'))) { violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Fork/new-root and succession require authenticated, content-addressed predecessor evidence, position 0, a distinct root, and matching root evidence.')); From e6388ad956035f6b21e8ce1c578ec8d06db9a42b Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:39:34 -0500 Subject: [PATCH 08/16] test: cover replayed lineage transition Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- .../29-replayed-transition-successor.json | 62 +++++ .../embodiment-bindings/manifest.json | 232 +++++++++++++++++- .../29-replayed-transition-successor.json | 125 ++++++++++ 3 files changed, 417 insertions(+), 2 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/29-replayed-transition-successor.json create mode 100644 tests/conformance/embodiment-bindings/negative/29-replayed-transition-successor.json diff --git a/tests/conformance/embodiment-bindings/bundles/29-replayed-transition-successor.json b/tests/conformance/embodiment-bindings/bundles/29-replayed-transition-successor.json new file mode 100644 index 0000000..f880e6e --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/29-replayed-transition-successor.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Successor mutation" + }, + "digest": { + "algorithm": "sha-256", + "value": "708592bbe1d466fe56ac963a683bcbd834480a91cfbd4d51cfc48818818d5a29" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "78c704a16af2fc87af033bd8a8ed3232c35d2e15db6a18fc36d04ef9dae28dbb" + } +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index 2e5ee56..06ca25e 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -1,9 +1,237 @@ { "profile": "familiar.embodiment_binding.v1", "positive": [ - {"expected":"positive","file":"01-active-direct.json","errorCode":null},{"expected":"positive","file":"02-unique-alias-resolution.json","errorCode":null},{"expected":"positive","file":"03-retired-historical-record.json","errorCode":null},{"expected":"positive","file":"04-restoration-with-lineage.json","errorCode":null},{"expected":"positive","file":"05-new-revision-same-familiar.json","errorCode":null},{"expected":"positive","file":"06-fork-new-root.json","errorCode":null},{"expected":"positive","file":"07-succession.json","errorCode":null},{"expected":"positive","file":"08-direct-coven-session.json","errorCode":null},{"expected":"positive","file":"09-scheduled-automation-run.json","errorCode":null},{"expected":"positive","file":"10-scheduled-automation-attempt.json","errorCode":null},{"expected":"positive","file":"11-psyche-delegated-execution.json","errorCode":null},{"expected":"positive","file":"12-degraded-historical-bundle.json","errorCode":null},{"expected":"positive","file":"13-privacy-authorized-historical-read.json","errorCode":null},{"expected":"positive","file":"14-privacy-unauthorized-read-denied.json","errorCode":null},{"expected":"positive","file":"15-revocation-after-commit.json","errorCode":null},{"expected":"positive","file":"16-unverifiable-historical-bundle.json","errorCode":null},{"expected":"positive","file":"17-erased-redacted-historical.json","errorCode":null} + { + "expected": "positive", + "file": "01-active-direct.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "02-unique-alias-resolution.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "03-retired-historical-record.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "04-restoration-with-lineage.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "05-new-revision-same-familiar.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "06-fork-new-root.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "07-succession.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "08-direct-coven-session.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "09-scheduled-automation-run.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "10-scheduled-automation-attempt.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "11-psyche-delegated-execution.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "12-degraded-historical-bundle.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "13-privacy-authorized-historical-read.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "14-privacy-unauthorized-read-denied.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "15-revocation-after-commit.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "16-unverifiable-historical-bundle.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "17-erased-redacted-historical.json", + "errorCode": null + } ], "negative": [ - {"expected":"negative","file":"01-ambiguous-alias.json","errorCode":"E_ALIAS"},{"expected":"negative","file":"02-stale-cached-revision.json","errorCode":"E_STALE"},{"expected":"negative","file":"03-revoked-revision.json","errorCode":"E_STATUS"},{"expected":"negative","file":"04-retired-dispatch.json","errorCode":"E_STATUS"},{"expected":"negative","file":"05-principal-mismatch.json","errorCode":"E_PRINCIPAL"},{"expected":"negative","file":"06-tampered-bundle-digest.json","errorCode":"E_COMPONENT_DIGEST"},{"expected":"negative","file":"07-degraded-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"08-unauthorized-history-dispatch.json","errorCode":"E_HISTORY"},{"expected":"negative","file":"09-revocation-before-commit.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"10-unknown-field.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"11-malformed-structure.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"12-tampered-binding-digest.json","errorCode":"E_BINDING_DIGEST"},{"expected":"negative","file":"13-cached-superseded-apparently-active.json","errorCode":"E_SNAPSHOT"},{"expected":"negative","file":"14-unverifiable-authentication.json","errorCode":"E_AUTHENTICATION"},{"expected":"negative","file":"15-lineage-self-predecessor.json","errorCode":"E_LINEAGE"},{"expected":"negative","file":"16-timezone-missing.json","errorCode":"E_SCHEMA"},{"expected":"negative","file":"17-malformed-calendar-time.json","errorCode":"E_TIMESTAMP"},{"expected":"negative","file":"18-tombstone-without-purge.json","errorCode":"E_RETENTION"},{"expected":"negative","file":"19-verified-history-missing-bundle.json","errorCode":"E_BUNDLE_MISSING"},{"expected":"negative","file":"20-revocation-at-commit-outcome-none.json","errorCode":"E_REVOCATION"},{"expected":"negative","file":"21-stale-active-cache.json","errorCode":"E_STALE_CACHE"},{"expected":"negative","file":"22-duplicate-schema-version.json","errorCode":"E_JSON"},{"expected":"negative","file":"23-unknown-schema-version.json","errorCode":"E_VERSION"},{"expected":"negative","file":"24-redacted-verified-history.json","errorCode":"E_REDACTION"},{"expected":"negative","file":"25-enlarged-stale-cache.json","errorCode":"E_STALE_CACHE"},{"expected":"negative","file":"26-future-cache-observation.json","errorCode":"E_CACHE_TIME"},{"expected":"negative","file":"27-lone-surrogate.json","errorCode":"E_IJSON"},{"expected":"negative","file":"28-erased-content-verified.json","errorCode":"E_REDACTION"} + { + "expected": "negative", + "file": "01-ambiguous-alias.json", + "errorCode": "E_ALIAS" + }, + { + "expected": "negative", + "file": "02-stale-cached-revision.json", + "errorCode": "E_STALE" + }, + { + "expected": "negative", + "file": "03-revoked-revision.json", + "errorCode": "E_STATUS" + }, + { + "expected": "negative", + "file": "04-retired-dispatch.json", + "errorCode": "E_STATUS" + }, + { + "expected": "negative", + "file": "05-principal-mismatch.json", + "errorCode": "E_PRINCIPAL" + }, + { + "expected": "negative", + "file": "06-tampered-bundle-digest.json", + "errorCode": "E_COMPONENT_DIGEST" + }, + { + "expected": "negative", + "file": "07-degraded-history-dispatch.json", + "errorCode": "E_HISTORY" + }, + { + "expected": "negative", + "file": "08-unauthorized-history-dispatch.json", + "errorCode": "E_HISTORY" + }, + { + "expected": "negative", + "file": "09-revocation-before-commit.json", + "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "10-unknown-field.json", + "errorCode": "E_SCHEMA" + }, + { + "expected": "negative", + "file": "11-malformed-structure.json", + "errorCode": "E_SCHEMA" + }, + { + "expected": "negative", + "file": "12-tampered-binding-digest.json", + "errorCode": "E_BINDING_DIGEST" + }, + { + "expected": "negative", + "file": "13-cached-superseded-apparently-active.json", + "errorCode": "E_SNAPSHOT" + }, + { + "expected": "negative", + "file": "14-unverifiable-authentication.json", + "errorCode": "E_AUTHENTICATION" + }, + { + "expected": "negative", + "file": "15-lineage-self-predecessor.json", + "errorCode": "E_LINEAGE" + }, + { + "expected": "negative", + "file": "16-timezone-missing.json", + "errorCode": "E_SCHEMA" + }, + { + "expected": "negative", + "file": "17-malformed-calendar-time.json", + "errorCode": "E_TIMESTAMP" + }, + { + "expected": "negative", + "file": "18-tombstone-without-purge.json", + "errorCode": "E_RETENTION" + }, + { + "expected": "negative", + "file": "19-verified-history-missing-bundle.json", + "errorCode": "E_BUNDLE_MISSING" + }, + { + "expected": "negative", + "file": "20-revocation-at-commit-outcome-none.json", + "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "21-stale-active-cache.json", + "errorCode": "E_STALE_CACHE" + }, + { + "expected": "negative", + "file": "22-duplicate-schema-version.json", + "errorCode": "E_JSON" + }, + { + "expected": "negative", + "file": "23-unknown-schema-version.json", + "errorCode": "E_VERSION" + }, + { + "expected": "negative", + "file": "24-redacted-verified-history.json", + "errorCode": "E_REDACTION" + }, + { + "expected": "negative", + "file": "25-enlarged-stale-cache.json", + "errorCode": "E_STALE_CACHE" + }, + { + "expected": "negative", + "file": "26-future-cache-observation.json", + "errorCode": "E_CACHE_TIME" + }, + { + "expected": "negative", + "file": "27-lone-surrogate.json", + "errorCode": "E_IJSON" + }, + { + "expected": "negative", + "file": "28-erased-content-verified.json", + "errorCode": "E_REDACTION" + }, + { + "expected": "negative", + "file": "29-replayed-transition-successor.json", + "errorCode": "E_LINEAGE" + } ] } diff --git a/tests/conformance/embodiment-bindings/negative/29-replayed-transition-successor.json b/tests/conformance/embodiment-bindings/negative/29-replayed-transition-successor.json new file mode 100644 index 0000000..531540e --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/29-replayed-transition-successor.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-replayed-transition-successor", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAOBKGjkSdpgzbWc8oVu52nTlVjTbwSUefmojVgDY3lXA=", + "signature": "agUfr78BmpmhAW7yINfU2QQ3lUaYX/fXgMsDLBJbHEFCLJRhn4xHDdVpzmj3ZCiNgJ7nd3BwUvDycVHtZ2tiBw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "708592bbe1d466fe56ac963a683bcbd834480a91cfbd4d51cfc48818818d5a29" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "78c704a16af2fc87af033bd8a8ed3232c35d2e15db6a18fc36d04ef9dae28dbb" + }, + "historicalBundleRef": "urn:sha256:78c704a16af2fc87af033bd8a8ed3232c35d2e15db6a18fc36d04ef9dae28dbb" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "4f1940e843849fc9168c1bd17016502ab141201a739e8958138b4e4fb561ecfd" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEARRlxwe5rHA66vvZ12IGLQ0bEoVNoU0u+Eg6mY1IyjLs=", + "signature": "LQraoLvboN8E1omBFaJYxjFDkMknKQ+kI9SMQpJpQbSs0H/ANjMN0zZZZIsT59fFcmF5Hm0+AfytM0Q5gcxCDg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "4f1940e843849fc9168c1bd17016502ab141201a739e8958138b4e4fb561ecfd" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "78c704a16af2fc87af033bd8a8ed3232c35d2e15db6a18fc36d04ef9dae28dbb", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} From 14636383f9b9d8ae350e732c6a7ca64180330e44 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:44:39 -0500 Subject: [PATCH 09/16] fix: complete embodiment retention lifecycle Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 53 +++++--- .../familiar-embodiment-binding.schema.json | 8 +- schemas/familiar-identity-bundle.schema.json | 64 ++++++++- .../conformance/embodiment-bindings/README.md | 14 ++ .../bundles/18-redacted-historical.json | 52 ++++++++ .../bundles/19-tombstoned-historical.json | 54 ++++++++ .../bundles/30-retained-degraded.json | 62 +++++++++ .../bundles/31-retained-marked-redacted.json | 62 +++++++++ .../bundles/32-redacted-degraded.json | 52 ++++++++ .../embodiment-bindings/manifest.json | 32 ++++- .../negative/30-retained-degraded.json | 125 ++++++++++++++++++ .../negative/31-retained-marked-redacted.json | 125 ++++++++++++++++++ .../negative/32-redacted-degraded.json | 125 ++++++++++++++++++ .../33-missing-unverifiable.json} | 10 +- .../16-missing-historical-bundle.json | 125 ++++++++++++++++++ .../17-erased-redacted-historical.json | 16 +-- .../positive/18-redacted-historical.json | 125 ++++++++++++++++++ .../positive/19-tombstoned-historical.json | 125 ++++++++++++++++++ validators/README.md | 9 +- validators/validate.js | 54 +++++--- 20 files changed, 1238 insertions(+), 54 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/18-redacted-historical.json create mode 100644 tests/conformance/embodiment-bindings/bundles/19-tombstoned-historical.json create mode 100644 tests/conformance/embodiment-bindings/bundles/30-retained-degraded.json create mode 100644 tests/conformance/embodiment-bindings/bundles/31-retained-marked-redacted.json create mode 100644 tests/conformance/embodiment-bindings/bundles/32-redacted-degraded.json create mode 100644 tests/conformance/embodiment-bindings/negative/30-retained-degraded.json create mode 100644 tests/conformance/embodiment-bindings/negative/31-retained-marked-redacted.json create mode 100644 tests/conformance/embodiment-bindings/negative/32-redacted-degraded.json rename tests/conformance/embodiment-bindings/{positive/16-unverifiable-historical-bundle.json => negative/33-missing-unverifiable.json} (89%) create mode 100644 tests/conformance/embodiment-bindings/positive/16-missing-historical-bundle.json create mode 100644 tests/conformance/embodiment-bindings/positive/18-redacted-historical.json create mode 100644 tests/conformance/embodiment-bindings/positive/19-tombstoned-historical.json diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index a4d3739..20bb586 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -518,13 +518,13 @@ and digests are the default. `privacy.classification` is therefore The independently consumable detached historical record is `familiar.identity_bundle.v1`, defined by [`schemas/familiar-identity-bundle.schema.json`](../schemas/familiar-identity-bundle.schema.json). -It **MUST** retain canonical JSON identity- and soul-declaration components -(and MAY retain a Ward declaration), their individual SHA-256 digests, its +It **MUST** retain identity- and soul-declaration component evidence (and MAY +retain Ward-declaration evidence), their individual SHA-256 digests, its root/revision/position, and a SHA-256 digest of the canonical bundle. A -verifier supplied this bundle **MUST** recompute every component and bundle -digest, then match them to the binding declaration digest, bundle digest, and -URN. A missing bundle is distinguishable from a present bundle; only the former -may yield explicit `degraded`, `unavailable`, or `unverifiable` history. +verifier supplied retained component content **MUST** recompute that component +digest; redacted or erased components retain only their digest and audit +evidence. The verifier **MUST** always recompute the bundle digest and match the +binding declaration digest, bundle digest, and URN. `lineageEvidence` **MUST** distinguish genesis, same-familiar revision, restoration, fork/new-root, and succession. A continuation has the immediately @@ -571,10 +571,21 @@ A new dispatch or session creation is eligible only when the selected revision is active, currently valid, verified, and not revoked. Retired, superseded, and revoked revisions remain meaningful historical records but are not new dispatch authority. A restored revision is a new active revision with explicit -restoration lineage. Historical verification may be `verified`, `degraded`, -`unavailable`, or `unverifiable`; only `verified` may authorize current -dispatch. An unauthorized historical read **MUST** be recorded as unavailable -historical verification, not treated as authority. +restoration lineage. Historical verification uses one deterministic lifecycle classification: +a supplied live bundle with all component bytes retained is `verified`; a +supplied live bundle with redacted component bytes is `unverifiable`; a +supplied tombstoned or erased bundle is `unavailable`; and a missing bundle is +`degraded`. A denied historical read is also `unavailable`, but is +distinguished by `readAuthorization: not_authorized`. Only `verified` may +authorize current dispatch. + +| Detached evidence | Bundle lifecycle | Required history state | +| --- | --- | --- | +| Supplied, all component bytes retained | live, unredacted, unpurged | `verified` | +| Supplied, one or more component bytes redacted | live, redacted, unpurged | `unverifiable` | +| Supplied, all component bytes removed | tombstoned with active purge, or erased with completed purge | `unavailable` | +| Missing despite authorized or unrequested read | no detached bundle | `degraded` | +| Withheld because verifier access was denied | no detached bundle | `unavailable` | `authentication` **MUST** be a Node-core-verifiable Ed25519 public-key attestation: DER/SPKI public key and base64 signature over the hexadecimal @@ -586,10 +597,12 @@ appears in either profile. An invalid encoding or unverifiable signature Lineage predecessors **MUST** name a content-addressed predecessor bundle and an authenticated Ed25519 transition edge that signs its relationship, -predecessor digest, and successor root/revision. The verifier **MUST** reject a -self-predecessor, repeated/non-monotonic position, root/revision mismatch, or -relation/root-evidence mismatch. Thus continuation, restoration, fork/new-root, -and succession are mechanically—not merely narratively—distinct. +predecessor digest, successor root/revision, successor bundle digest, and +successor identity-declaration digest. The verifier **MUST** reject a +self-predecessor, repeated/non-monotonic position, root/revision or successor +digest mismatch, or relation/root-evidence mismatch. Thus continuation, +restoration, fork/new-root, and succession are mechanically—not merely +narratively—distinct. Implementations **MUST** reject duplicate JSON object member names before JSON Schema, digest, or signature processing; ordinary JSON parsing that silently @@ -609,10 +622,14 @@ verification remains the verifier's policy responsibility. Retention is lifecycle evidence, not a license to replicate identity content. Retained components carry content and always recompute their digest. -Redacted/erased components retain only digest plus redaction/audit evidence and -are unavailable or unverifiable, never verified; supplied-redacted and missing -bundles are distinct states but neither grants current authority. An erased -bundle MUST NOT retain sensitive component content. Canonical inputs MUST be +Redacted/erased components retain only digest plus redaction/audit evidence. +A live supplied-redacted bundle is `unverifiable`; tombstoned or erased +supplied evidence is `unavailable`; a missing bundle is `degraded`. A denied +read is `unavailable` without exposing a bundle. Fully retained supplied +evidence is always live, unredacted, unpurged, and `verified`. Tombstoned and +erased bundles contain no retained component bytes; erased evidence additionally +requires completed replica purge and device-revocation evidence. These states +never imply current authority. Canonical inputs MUST be I-JSON: duplicate object keys and lone UTF-16 surrogates are rejected before canonicalization, digest, or signature verification. The binding carries metadata-only classification plus retention time, diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index 04157ec..4560dff 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -97,7 +97,13 @@ "verifier": { "$ref": "#/definitions/actor" }, "historicalVerification": { "type": "object", "additionalProperties": false, "required": ["state", "readAuthorization"], - "properties": { "state": { "enum": ["verified", "degraded", "unavailable", "unverifiable"] }, "readAuthorization": { "enum": ["authorized", "not_authorized", "not_requested"] } } + "properties": { "state": { "enum": ["verified", "degraded", "unavailable", "unverifiable"] }, "readAuthorization": { "enum": ["authorized", "not_authorized", "not_requested"] } }, + "allOf": [ + { + "if": { "properties": { "readAuthorization": { "const": "not_authorized" } } }, + "then": { "properties": { "state": { "const": "unavailable" } } } + } + ] }, "revocation": { "type": "object", "additionalProperties": false, "required": ["outcome"], diff --git a/schemas/familiar-identity-bundle.schema.json b/schemas/familiar-identity-bundle.schema.json index bbc2edc..7593359 100644 --- a/schemas/familiar-identity-bundle.schema.json +++ b/schemas/familiar-identity-bundle.schema.json @@ -22,7 +22,23 @@ "mediaType": { "const": "application/json" }, "content": { "type": "object" }, "redactionState": { "enum": ["retained", "redacted"] }, "redactionEvidence": { "type": "string", "minLength": 1 }, "digest": { "$ref": "#/definitions/digest" } - } + }, + "allOf": [ + { + "if": { "properties": { "redactionState": { "const": "retained" } } }, + "then": { + "required": ["content"], + "not": { "required": ["redactionEvidence"] } + } + }, + { + "if": { "properties": { "redactionState": { "const": "redacted" } } }, + "then": { + "required": ["redactionEvidence"], + "not": { "required": ["content"] } + } + } + ] } }, "bundleDigest": { "$ref": "#/definitions/digest" }, @@ -38,7 +54,51 @@ "erasureEvidence": { "type": "string", "minLength": 1 }, "deviceRevocationEvidence": { "type": "string", "minLength": 1 }, "redactionState": { "enum": ["none", "redacted"] } - } + }, + "allOf": [ + { + "if": { "properties": { "redactionState": { "const": "none" } } }, + "then": { + "properties": { + "tombstoneState": { "const": "live" }, + "replicaPurgeState": { "const": "not_requested" } + }, + "not": { + "anyOf": [ + { "required": ["erasureEvidence"] }, + { "required": ["deviceRevocationEvidence"] } + ] + } + } + }, + { + "if": { "properties": { "tombstoneState": { "const": "live" } } }, + "then": { + "properties": { "replicaPurgeState": { "const": "not_requested" } }, + "not": { "required": ["erasureEvidence"] } + } + }, + { + "if": { "properties": { "tombstoneState": { "const": "tombstoned" } } }, + "then": { + "required": ["erasureEvidence"], + "properties": { + "redactionState": { "const": "redacted" }, + "replicaPurgeState": { "enum": ["pending", "complete"] } + } + } + }, + { + "if": { "properties": { "tombstoneState": { "const": "erased" } } }, + "then": { + "required": ["erasureEvidence", "deviceRevocationEvidence"], + "properties": { + "redactionState": { "const": "redacted" }, + "replicaPurgeState": { "const": "complete" } + } + } + } + ] } }, "definitions": { diff --git a/tests/conformance/embodiment-bindings/README.md b/tests/conformance/embodiment-bindings/README.md index 2d55617..4faceaf 100644 --- a/tests/conformance/embodiment-bindings/README.md +++ b/tests/conformance/embodiment-bindings/README.md @@ -10,3 +10,17 @@ node validators/validate.js --embodiment-binding path/to/vector.json The `positive/` vectors are dispatch-eligible bindings or non-authority historical records that must validate. The `negative/` vectors must fail closed. The full set runs under `npm test`. + +Historical bundle lifecycle results are deterministic: + +| Detached bundle evidence | Required history state | +| --- | --- | +| Supplied, live, and all component content retained | `verified` | +| Supplied, live, with one or more components redacted | `unverifiable` | +| Supplied and tombstoned or erased, with no component content | `unavailable` | +| Missing while access was authorized or not requested | `degraded` | +| Missing because verifier access was denied | `unavailable` | + +Every supported state has a positive vector. Contradictory component, +retention, tombstone, purge, and history-state combinations are mandatory +negative vectors with an asserted semantic error code in `manifest.json`. diff --git a/tests/conformance/embodiment-bindings/bundles/18-redacted-historical.json b/tests/conformance/embodiment-bindings/bundles/18-redacted-historical.json new file mode 100644 index 0000000..b7b4eb5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/18-redacted-historical.json @@ -0,0 +1,52 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/19-tombstoned-historical.json b/tests/conformance/embodiment-bindings/bundles/19-tombstoned-historical.json new file mode 100644 index 0000000..592eb70 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/19-tombstoned-historical.json @@ -0,0 +1,54 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "tombstoned", + "replicaPurgeState": "pending", + "erasureEvidence": "audit:tombstone-pending-001", + "deviceRevocationEvidence": "audit:device-purge-pending-001", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "40d0bbe0f1f693e95ed430353b2e304abec5f49cfa41bf87e24e07aa5a7bfe74" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/30-retained-degraded.json b/tests/conformance/embodiment-bindings/bundles/30-retained-degraded.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/30-retained-degraded.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/31-retained-marked-redacted.json b/tests/conformance/embodiment-bindings/bundles/31-retained-marked-redacted.json new file mode 100644 index 0000000..9447df0 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/31-retained-marked-redacted.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "b5813f530f6cd0543f4e0ea151763c5770c1a75af4149de6c824deddf9693193" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/32-redacted-degraded.json b/tests/conformance/embodiment-bindings/bundles/32-redacted-degraded.json new file mode 100644 index 0000000..b7b4eb5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/32-redacted-degraded.json @@ -0,0 +1,52 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39" + } +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index 06ca25e..40e91a6 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -78,13 +78,23 @@ }, { "expected": "positive", - "file": "16-unverifiable-historical-bundle.json", + "file": "16-missing-historical-bundle.json", "errorCode": null }, { "expected": "positive", "file": "17-erased-redacted-historical.json", "errorCode": null + }, + { + "expected": "positive", + "file": "18-redacted-historical.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "19-tombstoned-historical.json", + "errorCode": null } ], "negative": [ @@ -232,6 +242,26 @@ "expected": "negative", "file": "29-replayed-transition-successor.json", "errorCode": "E_LINEAGE" + }, + { + "expected": "negative", + "file": "30-retained-degraded.json", + "errorCode": "E_REDACTION" + }, + { + "expected": "negative", + "file": "31-retained-marked-redacted.json", + "errorCode": "E_REDACTION" + }, + { + "expected": "negative", + "file": "32-redacted-degraded.json", + "errorCode": "E_REDACTION" + }, + { + "expected": "negative", + "file": "33-missing-unverifiable.json", + "errorCode": "E_REDACTION" } ] } diff --git a/tests/conformance/embodiment-bindings/negative/30-retained-degraded.json b/tests/conformance/embodiment-bindings/negative/30-retained-degraded.json new file mode 100644 index 0000000..ba3d599 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/30-retained-degraded.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-30-retained-degraded", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "56c83a45841635aa7029a9e4b6814fc1719b51874a066b7df30dd6e63554e37e" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEATYHvQR5GDVd55sIswGZ4dyNtRC74e0pm8STq4ksMsUQ=", + "signature": "/KMrh5FFM4kK3yc7CHvzwBGBh5rMtFhzHvJN8pBJazR5hxwzC4iBeYRXQw67SsR01IID7L2j87NAMdn2425HAw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "56c83a45841635aa7029a9e4b6814fc1719b51874a066b7df30dd6e63554e37e" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/31-retained-marked-redacted.json b/tests/conformance/embodiment-bindings/negative/31-retained-marked-redacted.json new file mode 100644 index 0000000..6f52088 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/31-retained-marked-redacted.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-31-retained-marked-redacted", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "b5813f530f6cd0543f4e0ea151763c5770c1a75af4149de6c824deddf9693193", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfwsf30SdGdwf0qOnvM3y+ZiQCSDMLPnNiJAe+iZNBrY=", + "signature": "FLTPj2onCop4h8YZyC7jGO09MQZJYTC2yqqAbIVlcnGbW2RuVBNPRk8b/dTm4eG0hfYpNYUyzIHZAD6T/BQfBg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "b5813f530f6cd0543f4e0ea151763c5770c1a75af4149de6c824deddf9693193" + }, + "historicalBundleRef": "urn:sha256:b5813f530f6cd0543f4e0ea151763c5770c1a75af4149de6c824deddf9693193" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "4ddc18177f61971558a728255702675377097c8c7a82800baa2f56dbf45a74fc" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAj21hOpUixJCMaQe5+i6cZAFEsDdBa+g3sunxtUbGEII=", + "signature": "quv3apKunqRR0yblDbXpOh2gtbNfCYhMUjh1N+t7QkOsJLIeXNTBaCskSUI9zJatPfkAtxc5yfDzUt/Gz9PuBA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "4ddc18177f61971558a728255702675377097c8c7a82800baa2f56dbf45a74fc" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "b5813f530f6cd0543f4e0ea151763c5770c1a75af4149de6c824deddf9693193", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/32-redacted-degraded.json b/tests/conformance/embodiment-bindings/negative/32-redacted-degraded.json new file mode 100644 index 0000000..b4d46a1 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/32-redacted-degraded.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-32-redacted-degraded", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEASdhhChLPWMizeLxQc7/TKTmiPyQ4KuiagV0iwM1l7PQ=", + "signature": "V6LkVhg9mMX45RURE9nUPHhDl9/XP2FCLfQSPuUa4VhIuy/yL/mg5HmRWul7kiat/j9DjAoWB7zDDLEBF1cyDQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39" + }, + "historicalBundleRef": "urn:sha256:bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "01cafecbc377014de09e49a249dae5e1f9bc6735639b639864d19ca7b2a16453" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfExzzwcZGLkoxJFHx4A65QAVQxGc9qVyB/DXpxO+EA8=", + "signature": "zgbP8q54jsdYiuPpIzmh58+LsGGEoM26+SaQMKANs+Q+MIe5O/bbr/V3F1OgCH4ZpATPCJdKXA70N4iJPCY5DA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "01cafecbc377014de09e49a249dae5e1f9bc6735639b639864d19ca7b2a16453" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json b/tests/conformance/embodiment-bindings/negative/33-missing-unverifiable.json similarity index 89% rename from tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json rename to tests/conformance/embodiment-bindings/negative/33-missing-unverifiable.json index ea8edda..86875c1 100644 --- a/tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle.json +++ b/tests/conformance/embodiment-bindings/negative/33-missing-unverifiable.json @@ -1,7 +1,7 @@ { "profile": "familiar.embodiment_binding.v1", "schemaVersion": "1.0.0", - "bindingId": "binding-tests/conformance/embodiment-bindings/positive/16-unverifiable-historical-bundle", + "bindingId": "binding-33-missing-unverifiable", "familiar": { "familiarRootId": "familiar-root:oak", "identityRevisionId": "familiar-revision:oak:3", @@ -85,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "02f15088bf92d8f0fd7c175a8bf3980fdcfc8ee08303b3bae1748beacca4d3de" + "bindingDigest": "6e14bd042827154421cf1ec4c4a211a8f236b35b6fd14be22d5822b7d16a7c2f" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", - "signature": "vPhf4ioePoeBRinjnm2rRR3R2LCJzyVXZRk9Ylj2obIQBpoWjCSS/NisnxGR2n3tAHfz3VGrytF6GwOFtjGvCA==" + "publicKey": "MCowBQYDK2VwAyEANNWKkwY1EDwoGtFcolqkQPuUHOU9oeKC/Hie9Thb/Us=", + "signature": "SnFa8FU/T/dEYHThRI0lj06WrO2MhPYciwOYo2/wdnYvmE8GF0Egs/YwOEj9qKiQi/fyKW5DZ9Ewpvs5rN8uCw==" }, "privacy": { "classification": "metadata-only", @@ -106,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "02f15088bf92d8f0fd7c175a8bf3980fdcfc8ee08303b3bae1748beacca4d3de" + "verifiedBindingDigest": "6e14bd042827154421cf1ec4c4a211a8f236b35b6fd14be22d5822b7d16a7c2f" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/16-missing-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/16-missing-historical-bundle.json new file mode 100644 index 0000000..1307a31 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/16-missing-historical-bundle.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-16-missing-historical-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", + "signature": "8UEUsFQKRc4iW652JIsQJW/2EuvEeMJjZVr3HkjvljVw68fEkUuQP9dZnRJG/D2e/ZM5HCUAZYoJQ/xvMbiLCQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "602714a28ea06c7f4dff6f39e80f0e6758fc701a0ce5bf2eab79537a01569e30" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAeYVGPB+Qy6kQJkmBC1rZiHgjIlbES4Wp5vg9X3IeMHw=", + "signature": "w6zq+3xtkyzOb83yH9trSQytUuCw5js4pI5aa8lAe28Jhj0hj8TLe7Lk7g1b1M2Nmt5bxrxd07wV2SaMi8FUBw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "602714a28ea06c7f4dff6f39e80f0e6758fc701a0ce5bf2eab79537a01569e30" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json b/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json index f7e4931..88663d6 100644 --- a/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json +++ b/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json @@ -25,8 +25,8 @@ "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAQ+xP5apS21UT43mLI6dDU3TuD8pZvq+KxA4u1f9+LSk=", - "signature": "f7ti5FXYL7P6TELnjx4jOnPlqCaLyZr+EPTE5fS9t7Mrh853yLHcesIOaBNB250+6pFZjHeqxuKNSINTATl5AA==" + "publicKey": "MCowBQYDK2VwAyEAvF3vi1QvK5HVWn34+RsrRHEzlUBtS8eWF8HY2ZN5X40=", + "signature": "bUkmoAKjN14isJpLUsjb3s8E0Mk/b7nymNiBN9xbHRRzRqVpJFamwcLPuBTp5S+HaiAX4Oi1h5i1Fts0gRScAw==" } } } @@ -76,8 +76,8 @@ "version": "1.0.0" }, "historicalVerification": { - "state": "unverifiable", - "readAuthorization": "not_requested" + "state": "unavailable", + "readAuthorization": "authorized" }, "revocation": { "outcome": "none" @@ -85,13 +85,13 @@ "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "1a856ce4ab5e638bf3482fa01d4f5b8273d122d50ebfb792d4f740bc8c8f3475" + "bindingDigest": "cb094611cc4acc10ccb942d290b16ccd97c7b70b44a8adc3a3fdcd1c351084e7" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAQ+xP5apS21UT43mLI6dDU3TuD8pZvq+KxA4u1f9+LSk=", - "signature": "UFPrcIemU1k4ZBG+mGzqtcSukwpsM6JDjcxuEFOHlqOOdgy8Olq+JM+4a33t4KXAN9ciB3gCAwSgXHJD4gt+BA==" + "publicKey": "MCowBQYDK2VwAyEAH61Mv5nZ15SIbKsWkZAWjXSz980U1BYk4FhaG/mUk9c=", + "signature": "xzT65zbck5hAZ4o8t3bSEBihmLSPEkeEwO3Q/d7gaGt8pMOISsXOTUXPUQdVDtljCzEyaQM7uIcpgY7oI4o9BQ==" }, "privacy": { "classification": "metadata-only", @@ -106,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "1a856ce4ab5e638bf3482fa01d4f5b8273d122d50ebfb792d4f740bc8c8f3475" + "verifiedBindingDigest": "cb094611cc4acc10ccb942d290b16ccd97c7b70b44a8adc3a3fdcd1c351084e7" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/positive/18-redacted-historical.json b/tests/conformance/embodiment-bindings/positive/18-redacted-historical.json new file mode 100644 index 0000000..f03d10d --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/18-redacted-historical.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-18-redacted-historical", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEASdhhChLPWMizeLxQc7/TKTmiPyQ4KuiagV0iwM1l7PQ=", + "signature": "V6LkVhg9mMX45RURE9nUPHhDl9/XP2FCLfQSPuUa4VhIuy/yL/mg5HmRWul7kiat/j9DjAoWB7zDDLEBF1cyDQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39" + }, + "historicalBundleRef": "urn:sha256:bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "unverifiable", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "2038b901cc923dc34275402378b06cdef8c9e6cc8648f0d132f56265cb2c4c12" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA17kWdRVTHQTqj0XqjGBTlqZ5BDnhzfPitb6+Kz3otbE=", + "signature": "XX7FSAGR7QKIJwQl1laod7txid/Y92bUueDVex5ilacYlF2XfJg/7LrbzNeFNArGwWE8MxbH06dHKZsoQvd7CA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "2038b901cc923dc34275402378b06cdef8c9e6cc8648f0d132f56265cb2c4c12" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "bf8eb320ba7b2b99d452fe97feadbb6ac728dcb277e6284c97148ce897049e39", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/19-tombstoned-historical.json b/tests/conformance/embodiment-bindings/positive/19-tombstoned-historical.json new file mode 100644 index 0000000..8c488f7 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/19-tombstoned-historical.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-19-tombstoned-historical", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "40d0bbe0f1f693e95ed430353b2e304abec5f49cfa41bf87e24e07aa5a7bfe74", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAU0bh237PG1gRQhXBfcGXSVRuc25d8xdtoCngTXliIJI=", + "signature": "vcDxwlGQlRd7iVB7XMgM7aAf1IvtpjlTnBh18cxmcKUdtDxpXICwLGqujU1RDtAYYVEIV9FaMhwXJlCvZw8XAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "40d0bbe0f1f693e95ed430353b2e304abec5f49cfa41bf87e24e07aa5a7bfe74" + }, + "historicalBundleRef": "urn:sha256:40d0bbe0f1f693e95ed430353b2e304abec5f49cfa41bf87e24e07aa5a7bfe74" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "unavailable", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "0259892e16909bd4cd8fa3fdd69af2f0672c13d4b2389058d9fc8942b86ebedf" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAUwxtSjgH1JoAJsyUO5TwGvA4D56iD0y+X0KZui6aXE8=", + "signature": "PB9ijDAcfhj4rb32o1EBEx0D9FAfr6T1qqUpGte6tdG8Ky1QhaF8IDvr8IgzZrW7sB508lHHEDMS5tCsaDI8Bw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "0259892e16909bd4cd8fa3fdd69af2f0672c13d4b2389058d9fc8942b86ebedf" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "40d0bbe0f1f693e95ed430353b2e304abec5f49cfa41bf87e24e07aa5a7bfe74", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/validators/README.md b/validators/README.md index 069b954..e04296b 100644 --- a/validators/README.md +++ b/validators/README.md @@ -84,10 +84,13 @@ There are no warnings for missing required files; `MEMORY.md` absence is a failu This validator checks whether one claimant directory satisfies the required file-level declarations for v0.7.0. That claimant-directory run is necessary, but not sufficient, for a structural-conformance claim: you must also run `bash tests/conformance/run-conformance.sh` so the bundled reference validator is shown to accept the positive fixtures and reject the negative fixtures for the same contract version. Full conformance additionally requires runtime Ward enforcement beyond this file-level check, and missing `MEMORY.md` is a violation, not a warning. The explicit embodiment-binding mode validates one portable JSON record. It -fails closed for non-unique aliases, stale or non-active revisions, degraded +fails closed for non-unique aliases, stale or non-active revisions, non-verified history used as current authority, principal mismatches, digest tampering, and -pre-commit revocation. It accepts degraded/unavailable history only as a -non-authority historical-verification record. +pre-commit revocation. Historical evidence is classified deterministically: +retained supplied bytes are verified, live redacted evidence is unverifiable, +tombstoned or erased evidence is unavailable, a missing bundle is degraded, +and a denied read is unavailable. None of the non-verified states grants +authority. Pass a detached, independently consumable historical identity bundle to recompute the retained component and bundle digests and verify the binding: diff --git a/validators/validate.js b/validators/validate.js index 253b6a8..1101bb9 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -146,14 +146,14 @@ function validateHistoricalBundle(bundle, binding) { && bundle.lineagePosition === binding.familiar.lineagePosition; if (!idsMatch) violations.push(bindingViolation('E_BUNDLE_IDENTITY', 'historicalBundle', 'The detached bundle does not identify the bound root, revision, and lineage position.')); const seen = new Set(); - let redacted = false; + let redactedCount = 0; for (const component of bundle.components) { if (seen.has(component.componentId) || (component.redactionState === 'retained' && (!component.content || component.digest.value !== digestObject(component.content))) || (component.redactionState === 'redacted' && (component.content || !component.redactionEvidence))) { violations.push(bindingViolation('E_COMPONENT_DIGEST', 'historicalBundle.components', 'Every unique retained component digest must recompute from its canonical content.')); break; } - redacted ||= component.redactionState === 'redacted'; + if (component.redactionState === 'redacted') redactedCount++; seen.add(component.componentId); } if (!seen.has('identity-declaration') || !seen.has('soul-declaration')) { @@ -170,18 +170,32 @@ function validateHistoricalBundle(bundle, binding) { if (bundle.retention.verifierAccess !== 'authorized') { violations.push(bindingViolation('E_BUNDLE_ACCESS', 'historicalBundle.retention', 'A supplied detached bundle must be authorized for verifier access.')); } - if (bundle.retention.tombstoneState !== 'live' && - (!bundle.retention.erasureEvidence || bundle.retention.replicaPurgeState === 'not_requested')) { - violations.push(bindingViolation('E_RETENTION', 'historicalBundle.retention', 'Tombstoned or erased bundles require erasure evidence and a requested replica purge.')); - } - if (redacted && (bundle.retention.redactionState !== 'redacted' || binding.historicalVerification.state === 'verified')) { - violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'Redacted retained components require redaction lifecycle evidence and cannot claim verified history.')); - } - if (bundle.retention.tombstoneState === 'erased' && bundle.components.some(component => component.redactionState === 'retained' || component.content)) { - violations.push(bindingViolation('E_REDACTION', 'historicalBundle.components', 'An erased bundle cannot retain sensitive component content.')); - } - if (!redacted && (bundle.retention.redactionState !== 'none' || bundle.retention.tombstoneState !== 'live' || binding.historicalVerification.state !== 'verified')) { - violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'A fully retained supplied bundle is live, unredacted, and verified.')); + const allRetained = redactedCount === 0; + const allRedacted = redactedCount === bundle.components.length; + const { redactionState, tombstoneState, replicaPurgeState } = bundle.retention; + const historyState = binding.historicalVerification.state; + if (allRetained) { + if (redactionState !== 'none' || tombstoneState !== 'live' || + replicaPurgeState !== 'not_requested' || historyState !== 'verified') { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'A fully retained supplied bundle must be live, unredacted, unpurged, and verified.')); + } + } else if (redactionState !== 'redacted') { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention.redactionState', 'Any unavailable component content requires bundle-level redaction state.')); + } else if (tombstoneState === 'live') { + if (replicaPurgeState !== 'not_requested' || historyState !== 'unverifiable') { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'A live supplied redacted bundle must be unpurged and classified as unverifiable.')); + } + } else if (!allRedacted) { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.components', 'A tombstoned or erased bundle cannot retain sensitive component content.')); + } else if (tombstoneState === 'tombstoned') { + if (!bundle.retention.erasureEvidence || !['pending', 'complete'].includes(replicaPurgeState) || + historyState !== 'unavailable') { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'A tombstoned supplied bundle requires erasure evidence, an active purge, and unavailable history.')); + } + } else if (tombstoneState === 'erased' && + (!bundle.retention.erasureEvidence || !bundle.retention.deviceRevocationEvidence || + replicaPurgeState !== 'complete' || historyState !== 'unavailable')) { + violations.push(bindingViolation('E_REDACTION', 'historicalBundle.retention', 'An erased supplied bundle requires complete purge evidence and unavailable history.')); } return violations; } @@ -308,8 +322,16 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge violations.push(bindingViolation('E_RETENTION', 'privacy', 'Tombstoned or erased binding metadata requires erasure evidence and a requested replica purge.')); } if (historicalBundle) violations.push(...validateHistoricalBundle(historicalBundle, binding)); - if (!historicalBundle && historicalVerification.state === 'verified') { - violations.push(bindingViolation('E_BUNDLE_MISSING', 'historicalBundle', 'Verified history requires a supplied detached historical bundle.')); + if (!historicalBundle) { + const expectedMissingState = historicalVerification.readAuthorization === 'not_authorized' + ? 'unavailable' + : 'degraded'; + if (historicalVerification.state !== expectedMissingState) { + const code = historicalVerification.state === 'verified' + ? 'E_BUNDLE_MISSING' + : 'E_REDACTION'; + violations.push(bindingViolation(code, 'historicalVerification', `A missing historical bundle must be ${expectedMissingState} for the recorded read-authorization state.`)); + } } if (revocation.outcome === 'before_commit') { violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revocation observed before commit must fail closed and cannot produce a binding.')); From 079bd9ded6a50c14ba43348a38fcd0a1472eaa15 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:47:36 -0500 Subject: [PATCH 10/16] fix: bound trusted ledger observations Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 4 + .../conformance/embodiment-bindings/README.md | 5 + .../bundles/34-stale-trusted-ledger.json | 62 +++++++++ .../bundles/35-future-trusted-ledger.json | 62 +++++++++ .../ledgers/34-stale-trusted-ledger.json | 6 + .../ledgers/35-future-trusted-ledger.json | 6 + .../embodiment-bindings/manifest.json | 10 ++ .../negative/34-stale-trusted-ledger.json | 125 ++++++++++++++++++ .../negative/35-future-trusted-ledger.json | 125 ++++++++++++++++++ validators/validate.js | 18 ++- 10 files changed, 421 insertions(+), 2 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/34-stale-trusted-ledger.json create mode 100644 tests/conformance/embodiment-bindings/bundles/35-future-trusted-ledger.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/34-stale-trusted-ledger.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/35-future-trusted-ledger.json create mode 100644 tests/conformance/embodiment-bindings/negative/34-stale-trusted-ledger.json create mode 100644 tests/conformance/embodiment-bindings/negative/35-future-trusted-ledger.json diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 20bb586..c979a01 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -559,6 +559,10 @@ fixed v1 maximum cache age is 300 seconds, a runtime-policy input outside the signed record. A cache observation after final validity evaluation is invalid. Dispatch additionally requires verifier-supplied current authoritative ledger state at final validation/commit; cache evidence alone never authorizes launch. +The trusted ledger observation **MUST NOT** precede the recorded cache +observation, **MUST NOT** follow the final validity check, and **MUST** be no +more than 300 seconds old at that check. A stale, future-dated, mismatched, or +missing trusted ledger observation fails closed. Aliases are non-authoritative resolution evidence only. When an alias is used, resolution **MUST** yield exactly one root, and that root **MUST** equal the diff --git a/tests/conformance/embodiment-bindings/README.md b/tests/conformance/embodiment-bindings/README.md index 4faceaf..1ace24a 100644 --- a/tests/conformance/embodiment-bindings/README.md +++ b/tests/conformance/embodiment-bindings/README.md @@ -24,3 +24,8 @@ Historical bundle lifecycle results are deterministic: Every supported state has a positive vector. Contradictory component, retention, tombstone, purge, and history-state combinations are mandatory negative vectors with an asserted semantic error code in `manifest.json`. + +Dispatch vectors also supply verifier-trusted ledger sidecars. Their +observation must be at least as recent as the cache observation, no later than +the final validity check, and at most 300 seconds old at that check. Stale and +future-dated trusted-ledger vectors must fail closed. diff --git a/tests/conformance/embodiment-bindings/bundles/34-stale-trusted-ledger.json b/tests/conformance/embodiment-bindings/bundles/34-stale-trusted-ledger.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/34-stale-trusted-ledger.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/35-future-trusted-ledger.json b/tests/conformance/embodiment-bindings/bundles/35-future-trusted-ledger.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/35-future-trusted-ledger.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/ledgers/34-stale-trusted-ledger.json b/tests/conformance/embodiment-bindings/ledgers/34-stale-trusted-ledger.json new file mode 100644 index 0000000..dd15a8d --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/34-stale-trusted-ledger.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-01T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/35-future-trusted-ledger.json b/tests/conformance/embodiment-bindings/ledgers/35-future-trusted-ledger.json new file mode 100644 index 0000000..d69cf50 --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/35-future-trusted-ledger.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:01:00Z" +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index 40e91a6..28acde4 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -262,6 +262,16 @@ "expected": "negative", "file": "33-missing-unverifiable.json", "errorCode": "E_REDACTION" + }, + { + "expected": "negative", + "file": "34-stale-trusted-ledger.json", + "errorCode": "E_TRUSTED_LEDGER" + }, + { + "expected": "negative", + "file": "35-future-trusted-ledger.json", + "errorCode": "E_TRUSTED_LEDGER" } ] } diff --git a/tests/conformance/embodiment-bindings/negative/34-stale-trusted-ledger.json b/tests/conformance/embodiment-bindings/negative/34-stale-trusted-ledger.json new file mode 100644 index 0000000..bb4102c --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/34-stale-trusted-ledger.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-active-direct-001", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "3e00dffd982dc861fea09bc19190599e3c076d31d78d18ca92ab4851051425dc" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "Eiw/lJpIvjRQDDUO8pQhW/Dtl3eBV/KypzH1xvzy0+Mm+aOfX4y1b0DRV10GDGMTN9kLlZG43aLebzkx2MQFDQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "3e00dffd982dc861fea09bc19190599e3c076d31d78d18ca92ab4851051425dc" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/35-future-trusted-ledger.json b/tests/conformance/embodiment-bindings/negative/35-future-trusted-ledger.json new file mode 100644 index 0000000..bb4102c --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/35-future-trusted-ledger.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-active-direct-001", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "3e00dffd982dc861fea09bc19190599e3c076d31d78d18ca92ab4851051425dc" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "Eiw/lJpIvjRQDDUO8pQhW/Dtl3eBV/KypzH1xvzy0+Mm+aOfX4y1b0DRV10GDGMTN9kLlZG43aLebzkx2MQFDQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "3e00dffd982dc861fea09bc19190599e3c076d31d78d18ca92ab4851051425dc" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/validators/validate.js b/validators/validate.js index 1101bb9..9c95377 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -298,13 +298,27 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge const isAuthorityAttempt = ['dispatch', 'session_creation'].includes(binding.bindingPurpose); if (isAuthorityAttempt) { + const trustedObservedAt = trustedLedger && isTimestamp(trustedLedger.observedAt) + ? at(trustedLedger.observedAt) + : Number.NaN; + const finalValidityCheckAt = isTimestamp(commit.finalValidityCheckAt) + ? at(commit.finalValidityCheckAt) + : Number.NaN; + const cacheObservedAt = isTimestamp(resolutionSnapshot.cacheObservedAt) + ? at(resolutionSnapshot.cacheObservedAt) + : Number.NaN; if (!trustedLedger || !isObject(trustedLedger) || trustedLedger.generation !== resolutionSnapshot.authoritativeLedgerGeneration || trustedLedger.headRevisionId !== familiar.identityRevisionId || trustedLedger.status !== statusAtDecision.status || - !isTimestamp(trustedLedger.observedAt) || + !Number.isFinite(trustedObservedAt) || + !Number.isFinite(finalValidityCheckAt) || + !Number.isFinite(cacheObservedAt) || + trustedObservedAt < cacheObservedAt || + trustedObservedAt > finalValidityCheckAt || + finalValidityCheckAt - trustedObservedAt > MAX_CACHE_AGE_SECONDS * 1000 || (trustedLedger.revokedAt && (!isTimestamp(trustedLedger.revokedAt) || at(trustedLedger.revokedAt) <= at(commit.committedAt)))) { - violations.push(bindingViolation('E_TRUSTED_LEDGER', 'trustedLedger', 'Dispatch requires a verifier-supplied current authoritative ledger state matching the snapshot and with no revocation at or before commit.')); + violations.push(bindingViolation('E_TRUSTED_LEDGER', 'trustedLedger', 'Dispatch requires verifier-supplied authoritative ledger state observed no earlier than the cache, no more than 300 seconds before the final validity check, never after that check, matching the snapshot, and with no revocation at or before commit.')); } } if (isAuthorityAttempt && statusAtDecision.status !== 'active') { From 95560ebb2c826a57cce6d0fef4c7bd012eba6b0b Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 04:58:16 -0500 Subject: [PATCH 11/16] fix: preserve historical embodiment evidence Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 15 ++- .../conformance/embodiment-bindings/README.md | 6 +- .../bundles/20-superseded-historical.json | 62 +++++++++ .../bundles/21-expired-historical.json | 62 +++++++++ .../bundles/22-revoked-historical.json | 62 +++++++++ .../36-invalid-privacy-recorded-at.json | 62 +++++++++ .../37-invalid-bundle-recorded-at.json | 62 +++++++++ .../38-invalid-retention-recorded-at.json | 62 +++++++++ .../bundles/39-falsy-null-bundle.json | 1 + .../bundles/40-falsy-false-bundle.json | 1 + .../bundles/41-falsy-zero-bundle.json | 1 + .../bundles/42-falsy-empty-string-bundle.json | 1 + .../43-strict-recorded-cache-bound.json | 62 +++++++++ .../43-strict-recorded-cache-bound.json | 6 + .../embodiment-bindings/manifest.json | 55 ++++++++ .../36-invalid-privacy-recorded-at.json | 125 +++++++++++++++++ .../37-invalid-bundle-recorded-at.json | 125 +++++++++++++++++ .../38-invalid-retention-recorded-at.json | 125 +++++++++++++++++ .../negative/39-falsy-null-bundle.json | 125 +++++++++++++++++ .../negative/40-falsy-false-bundle.json | 125 +++++++++++++++++ .../negative/41-falsy-zero-bundle.json | 125 +++++++++++++++++ .../42-falsy-empty-string-bundle.json | 125 +++++++++++++++++ .../43-strict-recorded-cache-bound.json | 125 +++++++++++++++++ .../positive/20-superseded-historical.json | 125 +++++++++++++++++ .../positive/21-expired-historical.json | 126 ++++++++++++++++++ .../positive/22-revoked-historical.json | 126 ++++++++++++++++++ validators/validate.js | 31 +++-- 27 files changed, 1908 insertions(+), 20 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/20-superseded-historical.json create mode 100644 tests/conformance/embodiment-bindings/bundles/21-expired-historical.json create mode 100644 tests/conformance/embodiment-bindings/bundles/22-revoked-historical.json create mode 100644 tests/conformance/embodiment-bindings/bundles/36-invalid-privacy-recorded-at.json create mode 100644 tests/conformance/embodiment-bindings/bundles/37-invalid-bundle-recorded-at.json create mode 100644 tests/conformance/embodiment-bindings/bundles/38-invalid-retention-recorded-at.json create mode 100644 tests/conformance/embodiment-bindings/bundles/39-falsy-null-bundle.json create mode 100644 tests/conformance/embodiment-bindings/bundles/40-falsy-false-bundle.json create mode 100644 tests/conformance/embodiment-bindings/bundles/41-falsy-zero-bundle.json create mode 100644 tests/conformance/embodiment-bindings/bundles/42-falsy-empty-string-bundle.json create mode 100644 tests/conformance/embodiment-bindings/bundles/43-strict-recorded-cache-bound.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/43-strict-recorded-cache-bound.json create mode 100644 tests/conformance/embodiment-bindings/negative/36-invalid-privacy-recorded-at.json create mode 100644 tests/conformance/embodiment-bindings/negative/37-invalid-bundle-recorded-at.json create mode 100644 tests/conformance/embodiment-bindings/negative/38-invalid-retention-recorded-at.json create mode 100644 tests/conformance/embodiment-bindings/negative/39-falsy-null-bundle.json create mode 100644 tests/conformance/embodiment-bindings/negative/40-falsy-false-bundle.json create mode 100644 tests/conformance/embodiment-bindings/negative/41-falsy-zero-bundle.json create mode 100644 tests/conformance/embodiment-bindings/negative/42-falsy-empty-string-bundle.json create mode 100644 tests/conformance/embodiment-bindings/negative/43-strict-recorded-cache-bound.json create mode 100644 tests/conformance/embodiment-bindings/positive/20-superseded-historical.json create mode 100644 tests/conformance/embodiment-bindings/positive/21-expired-historical.json create mode 100644 tests/conformance/embodiment-bindings/positive/22-revoked-historical.json diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index c979a01..8c0bad5 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -552,8 +552,9 @@ Resolution precedes final validity check, which precedes decision, commit, and issuance; the decision timestamp and `statusAtDecision.decisionTime` are equal. Each resolution snapshot **MUST** include authoritative ledger generation and head revision, cache provenance/observation time, and a bounded freshness -window. A cache older than that bound, or one whose head differs from the -selected revision, **MUST** fail closed even when its copied status is active. +window. For dispatch or session creation, a cache older than either its signed +bound or the verifier's maximum, or one whose head differs from the selected +revision, **MUST** fail closed even when its copied status is active. The record's freshness assertion is observational metadata only: the verifier's fixed v1 maximum cache age is 300 seconds, a runtime-policy input outside the signed record. A cache observation after final validity evaluation is invalid. @@ -572,10 +573,12 @@ revision is selected at dispatch or session creation, never frozen during routine authoring. A new dispatch or session creation is eligible only when the selected revision -is active, currently valid, verified, and not revoked. Retired, superseded, and -revoked revisions remain meaningful historical records but are not new -dispatch authority. A restored revision is a new active revision with explicit -restoration lineage. Historical verification uses one deterministic lifecycle classification: +is active, currently valid, verified, and not revoked. Those current-head, +current-validity, and pre-commit-revocation eligibility checks apply only to +authority attempts. Retired, superseded, expired, and revoked revisions remain +meaningful historical records but are not new dispatch authority. A restored +revision is a new active revision with explicit restoration lineage. +Historical verification uses one deterministic lifecycle classification: a supplied live bundle with all component bytes retained is `verified`; a supplied live bundle with redacted component bytes is `unverifiable`; a supplied tombstoned or erased bundle is `unavailable`; and a missing bundle is diff --git a/tests/conformance/embodiment-bindings/README.md b/tests/conformance/embodiment-bindings/README.md index 1ace24a..454857e 100644 --- a/tests/conformance/embodiment-bindings/README.md +++ b/tests/conformance/embodiment-bindings/README.md @@ -24,8 +24,12 @@ Historical bundle lifecycle results are deterministic: Every supported state has a positive vector. Contradictory component, retention, tombstone, purge, and history-state combinations are mandatory negative vectors with an asserted semantic error code in `manifest.json`. +Historical-verification positives also prove that superseded, expired, and +revoked revisions remain auditable records without regaining current authority. Dispatch vectors also supply verifier-trusted ledger sidecars. Their observation must be at least as recent as the cache observation, no later than the final validity check, and at most 300 seconds old at that check. Stale and -future-dated trusted-ledger vectors must fail closed. +future-dated trusted-ledger vectors must fail closed. The effective cache age +is the stricter of the signed `freshnessBoundSeconds` and the fixed 300-second +verifier maximum. diff --git a/tests/conformance/embodiment-bindings/bundles/20-superseded-historical.json b/tests/conformance/embodiment-bindings/bundles/20-superseded-historical.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/20-superseded-historical.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/21-expired-historical.json b/tests/conformance/embodiment-bindings/bundles/21-expired-historical.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/21-expired-historical.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/22-revoked-historical.json b/tests/conformance/embodiment-bindings/bundles/22-revoked-historical.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/22-revoked-historical.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/36-invalid-privacy-recorded-at.json b/tests/conformance/embodiment-bindings/bundles/36-invalid-privacy-recorded-at.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/36-invalid-privacy-recorded-at.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/37-invalid-bundle-recorded-at.json b/tests/conformance/embodiment-bindings/bundles/37-invalid-bundle-recorded-at.json new file mode 100644 index 0000000..69fb14d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/37-invalid-bundle-recorded-at.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-02-30T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "21ccc3c9abe1ee0d4f82f68ef527f72af7f1ed60f0be4f5a5358aaa16f1ddeff" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/38-invalid-retention-recorded-at.json b/tests/conformance/embodiment-bindings/bundles/38-invalid-retention-recorded-at.json new file mode 100644 index 0000000..5573aa1 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/38-invalid-retention-recorded-at.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-02-30T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ada739983b35a9a726c93786cdb16bd79e0b392108bec4a5341b320861d90252" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/39-falsy-null-bundle.json b/tests/conformance/embodiment-bindings/bundles/39-falsy-null-bundle.json new file mode 100644 index 0000000..19765bd --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/39-falsy-null-bundle.json @@ -0,0 +1 @@ +null diff --git a/tests/conformance/embodiment-bindings/bundles/40-falsy-false-bundle.json b/tests/conformance/embodiment-bindings/bundles/40-falsy-false-bundle.json new file mode 100644 index 0000000..c508d53 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/40-falsy-false-bundle.json @@ -0,0 +1 @@ +false diff --git a/tests/conformance/embodiment-bindings/bundles/41-falsy-zero-bundle.json b/tests/conformance/embodiment-bindings/bundles/41-falsy-zero-bundle.json new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/41-falsy-zero-bundle.json @@ -0,0 +1 @@ +0 diff --git a/tests/conformance/embodiment-bindings/bundles/42-falsy-empty-string-bundle.json b/tests/conformance/embodiment-bindings/bundles/42-falsy-empty-string-bundle.json new file mode 100644 index 0000000..e16c76d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/42-falsy-empty-string-bundle.json @@ -0,0 +1 @@ +"" diff --git a/tests/conformance/embodiment-bindings/bundles/43-strict-recorded-cache-bound.json b/tests/conformance/embodiment-bindings/bundles/43-strict-recorded-cache-bound.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/43-strict-recorded-cache-bound.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/ledgers/43-strict-recorded-cache-bound.json b/tests/conformance/embodiment-bindings/ledgers/43-strict-recorded-cache-bound.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/43-strict-recorded-cache-bound.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index 28acde4..e17c579 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -95,6 +95,21 @@ "expected": "positive", "file": "19-tombstoned-historical.json", "errorCode": null + }, + { + "expected": "positive", + "file": "20-superseded-historical.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "21-expired-historical.json", + "errorCode": null + }, + { + "expected": "positive", + "file": "22-revoked-historical.json", + "errorCode": null } ], "negative": [ @@ -272,6 +287,46 @@ "expected": "negative", "file": "35-future-trusted-ledger.json", "errorCode": "E_TRUSTED_LEDGER" + }, + { + "expected": "negative", + "file": "36-invalid-privacy-recorded-at.json", + "errorCode": "E_TIMESTAMP" + }, + { + "expected": "negative", + "file": "37-invalid-bundle-recorded-at.json", + "errorCode": "E_TIMESTAMP" + }, + { + "expected": "negative", + "file": "38-invalid-retention-recorded-at.json", + "errorCode": "E_TIMESTAMP" + }, + { + "expected": "negative", + "file": "39-falsy-null-bundle.json", + "errorCode": "E_BUNDLE_SCHEMA" + }, + { + "expected": "negative", + "file": "40-falsy-false-bundle.json", + "errorCode": "E_BUNDLE_SCHEMA" + }, + { + "expected": "negative", + "file": "41-falsy-zero-bundle.json", + "errorCode": "E_BUNDLE_SCHEMA" + }, + { + "expected": "negative", + "file": "42-falsy-empty-string-bundle.json", + "errorCode": "E_BUNDLE_SCHEMA" + }, + { + "expected": "negative", + "file": "43-strict-recorded-cache-bound.json", + "errorCode": "E_STALE_CACHE" } ] } diff --git a/tests/conformance/embodiment-bindings/negative/36-invalid-privacy-recorded-at.json b/tests/conformance/embodiment-bindings/negative/36-invalid-privacy-recorded-at.json new file mode 100644 index 0000000..4306a76 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/36-invalid-privacy-recorded-at.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-36-invalid-privacy-recorded-at", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "7974b63bb6a34d7f7f40c946588e8f55c015aa8ce84bf55c52ba453e8fa7dfeb" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxfgndjXTSE48OEwugk8lKKuD1BIFpH/Qe5cMijzs8A4=", + "signature": "GWwxP/+R2+09wD4V1Uj/WIKa/h/m3gtApnVIm/8MXyJ+s2ZwdBy2EHC4VsKY2Kz5pDrhA5l2N/aH1sZ3s7+DCg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-02-30T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "7974b63bb6a34d7f7f40c946588e8f55c015aa8ce84bf55c52ba453e8fa7dfeb" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/37-invalid-bundle-recorded-at.json b/tests/conformance/embodiment-bindings/negative/37-invalid-bundle-recorded-at.json new file mode 100644 index 0000000..60327e5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/37-invalid-bundle-recorded-at.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-37-invalid-bundle-recorded-at", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "21ccc3c9abe1ee0d4f82f68ef527f72af7f1ed60f0be4f5a5358aaa16f1ddeff", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAWXT3B/EOBR/kGTNp+NABAoJ1zxlr1OK4J7jXibAhhO8=", + "signature": "0Mdj3RdOmI6qKAmRbeScnfSVnICA8rQ+cWl9RVYpdccF4wEwOlWzyI3s2BRimybQi4L0y0VNdrY/i6bk0e1GDw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "21ccc3c9abe1ee0d4f82f68ef527f72af7f1ed60f0be4f5a5358aaa16f1ddeff" + }, + "historicalBundleRef": "urn:sha256:21ccc3c9abe1ee0d4f82f68ef527f72af7f1ed60f0be4f5a5358aaa16f1ddeff" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "fa145a63ee879c75d7ee29498ee439591831be8e66ecd15770f0e390055f01ef" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAH6n5NvDnl1AleOYVdySHKXOmvgzs93yQHdl3uw6mpOI=", + "signature": "pQZt3wIlusKKE5etiSPjuV3w8ZnmHbse1BINE4Poibe6tKaAA41UoxueV4G46TtuKH15n8nyeU/DDukYqPcMCQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "fa145a63ee879c75d7ee29498ee439591831be8e66ecd15770f0e390055f01ef" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "21ccc3c9abe1ee0d4f82f68ef527f72af7f1ed60f0be4f5a5358aaa16f1ddeff", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/38-invalid-retention-recorded-at.json b/tests/conformance/embodiment-bindings/negative/38-invalid-retention-recorded-at.json new file mode 100644 index 0000000..ab8aacb --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/38-invalid-retention-recorded-at.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-38-invalid-retention-recorded-at", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ada739983b35a9a726c93786cdb16bd79e0b392108bec4a5341b320861d90252", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA9M/XOSWMS2CpkwaLpYbC4joLWNA72a+gvpjRkxfGR3c=", + "signature": "Z8bkZsYDm8XbbMTiRmo0XHEEmmj4ewkSFk5HSSKClwkBRvzxj/+XwXMiftho6t1WIfTdMijhQqI9B69FYsQcBw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ada739983b35a9a726c93786cdb16bd79e0b392108bec4a5341b320861d90252" + }, + "historicalBundleRef": "urn:sha256:ada739983b35a9a726c93786cdb16bd79e0b392108bec4a5341b320861d90252" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "9634d21484d342e908e7f425074443da9ef28da6dba9359fc2606fc40d5cec6f" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAf/P0enDG42mJdBoRsHHFs958T7NJLUD6eptbmLBcqKs=", + "signature": "Wsh66xfAIF/GxMWU6Qrbk5kwbDSpvE4uonMsMOunz68i8ng40h0WyQDI1APJJyAa4UpPNmPDrKXUV6WisycqAg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "9634d21484d342e908e7f425074443da9ef28da6dba9359fc2606fc40d5cec6f" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ada739983b35a9a726c93786cdb16bd79e0b392108bec4a5341b320861d90252", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/39-falsy-null-bundle.json b/tests/conformance/embodiment-bindings/negative/39-falsy-null-bundle.json new file mode 100644 index 0000000..6d86568 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/39-falsy-null-bundle.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-39-falsy-null-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", + "signature": "8UEUsFQKRc4iW652JIsQJW/2EuvEeMJjZVr3HkjvljVw68fEkUuQP9dZnRJG/D2e/ZM5HCUAZYoJQ/xvMbiLCQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "3499ecc8aa89af4a448c2803fd69330cf0ab6215a5e7d9dc50a4d9dc83df2dac" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEANgyeEcI1yEeYlBM1Ari/8ZJjMWfvJcPe6P+De5YJSvw=", + "signature": "l2N8J6PmaRDH7seY3P0qTO2Hae+3BBPpi6kQNq6CSO1RJ7MyPyqM41OiuoHqoSIWHg0jZP5JYfTvd7s3MLvtBg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "3499ecc8aa89af4a448c2803fd69330cf0ab6215a5e7d9dc50a4d9dc83df2dac" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/40-falsy-false-bundle.json b/tests/conformance/embodiment-bindings/negative/40-falsy-false-bundle.json new file mode 100644 index 0000000..b2ce025 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/40-falsy-false-bundle.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-40-falsy-false-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", + "signature": "8UEUsFQKRc4iW652JIsQJW/2EuvEeMJjZVr3HkjvljVw68fEkUuQP9dZnRJG/D2e/ZM5HCUAZYoJQ/xvMbiLCQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "bb45731f0b524db7a705e8878e3e5c1a4254d903cfd6c3881a84e8af594e5108" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA+rAGWsOBr2lvypO4gfQg4DP4zvYSyHa51JN8OJML+FU=", + "signature": "6UszsbMso9+grz73eehqBNskDmwtyGOOPNCzZc4wDDuoZEChelHq/cWoof3/kAg4KJSeb2T30kU9XVlynuQ2DA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "bb45731f0b524db7a705e8878e3e5c1a4254d903cfd6c3881a84e8af594e5108" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/41-falsy-zero-bundle.json b/tests/conformance/embodiment-bindings/negative/41-falsy-zero-bundle.json new file mode 100644 index 0000000..c441777 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/41-falsy-zero-bundle.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-41-falsy-zero-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", + "signature": "8UEUsFQKRc4iW652JIsQJW/2EuvEeMJjZVr3HkjvljVw68fEkUuQP9dZnRJG/D2e/ZM5HCUAZYoJQ/xvMbiLCQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "3b4d7e15483828d9a5c0626fc669abbaa1d4324df76fc5616069a4ad8a0e51f6" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA4sC4+/jk287NPf9UebJRyacCnmajSgNBqF7XlwD9P1E=", + "signature": "Jj0vUbFo7a/a0cUWa9anDrqolp3mODRuKm64uBoUANBFGh0eSHQiv3XoUMWlWYxgrwgwNrX6bdAEK2NHScc/CQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "3b4d7e15483828d9a5c0626fc669abbaa1d4324df76fc5616069a4ad8a0e51f6" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/42-falsy-empty-string-bundle.json b/tests/conformance/embodiment-bindings/negative/42-falsy-empty-string-bundle.json new file mode 100644 index 0000000..52c88ea --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/42-falsy-empty-string-bundle.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-42-falsy-empty-string-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALpjCE2OzBLJi8j8NIaqNgH+cblZeFKC/DitrMlTRFUc=", + "signature": "8UEUsFQKRc4iW652JIsQJW/2EuvEeMJjZVr3HkjvljVw68fEkUuQP9dZnRJG/D2e/ZM5HCUAZYoJQ/xvMbiLCQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "historicalBundleRef": "urn:sha256:ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "degraded", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "220d48e11221d2c4185f45cf1e43af0cafbb40ea677a22f7277caef38eb0800a" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA6CbGNAdEaUTTSYo4THjNJ9mdIwI17P3mvL5wDcRSDPA=", + "signature": "KFcggPmssNdCtpR4VQ9ofH39HmbkPSJeiCMpXjy/OOd97EJtcDtaCQ5C1eTfmc1t3xhANbMM/eWIUsy2yB9sBg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "220d48e11221d2c4185f45cf1e43af0cafbb40ea677a22f7277caef38eb0800a" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "ca973605cef73dd456884adcbda64d698a849a295837e9fd1fdf13b3afcd74e3", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/43-strict-recorded-cache-bound.json b/tests/conformance/embodiment-bindings/negative/43-strict-recorded-cache-bound.json new file mode 100644 index 0000000..122d933 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/43-strict-recorded-cache-bound.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-43-strict-recorded-cache-bound", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "a958b8ebe40ae0937567f3b6ab5beb092ab34db630bce306ab2dfac56dccf5ad" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA1zNbH5PhGq9Gq7pzc+0LQGXQWjeRy+R/xIVl4zwbW1I=", + "signature": "4l8fEHLNgMdeXRQWJYdjTroobBNWgwB0113u2vhq0GsbmcDTsqwke/QFaMOEgOMdomKTScSVgSLxnZsl9dFPAQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "a958b8ebe40ae0937567f3b6ab5beb092ab34db630bce306ab2dfac56dccf5ad" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 0, + "cacheObservedAt": "2026-09-03T08:59:59Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/20-superseded-historical.json b/tests/conformance/embodiment-bindings/positive/20-superseded-historical.json new file mode 100644 index 0000000..05ec1f8 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/20-superseded-historical.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-20-superseded-historical", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "superseded", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "19b9e3b8fdfd4da850f3e05c326a78427824c4eedc9a9744f4df39e7c8881a9b" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA5owELBFVCa1zd0hHM7kBudAdUVy7pJlL4p1yj2FxnNQ=", + "signature": "kzc/DGvX0pSyUxyEZlPFDb73XY9TUjQSzda0OFCvCj5QsBZ0Qxymv1bPXbXZywL5TSBsIs6Hg2TfRHPMCNfZCQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "19b9e3b8fdfd4da850f3e05c326a78427824c4eedc9a9744f4df39e7c8881a9b" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "superseded", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:4", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/21-expired-historical.json b/tests/conformance/embodiment-bindings/positive/21-expired-historical.json new file mode 100644 index 0000000..41af9de --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/21-expired-historical.json @@ -0,0 +1,126 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-21-expired-historical", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z", + "notAfter": "2026-09-03T08:30:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "a1b136fed64f02aa70c15a8a4627f6dd8896ca4c455a5103f136ff772af6ec1e" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAkjBv/g9OTH/Ou8fNQE9WJ5sRYTzR093x/HywGFLxP7M=", + "signature": "/ZnBvxCSYtkAeHRqqB2tpF2NUhI0oxHXwqd+TekzWljetiIsQdbk4txmpjPdwmcrSjBWFnRCD+Fdu8ir8FDtBw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "a1b136fed64f02aa70c15a8a4627f6dd8896ca4c455a5103f136ff772af6ec1e" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/22-revoked-historical.json b/tests/conformance/embodiment-bindings/positive/22-revoked-historical.json new file mode 100644 index 0000000..7ede44a --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/22-revoked-historical.json @@ -0,0 +1,126 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-22-revoked-historical", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "revoked", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "before_commit", + "revokedAt": "2026-09-03T08:30:00Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "75ef6fcf3921f57f31ce11d96f864e9cabe21d8ac2267685092ce2476f6e27c5" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAlCnY8IACZkGi5nZzbQRhiYj+8C4N8dxCcFoUO1cJVEw=", + "signature": "A12kS678YPz1TClPdUW+9Xr7K/op15sXmmN9l1gLaM88PdLWuYiEoxTTLyN6pj5aXzSL/7r8HFEawI7sUrJEDw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "75ef6fcf3921f57f31ce11d96f864e9cabe21d8ac2267685092ce2476f6e27c5" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "revoked", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:4", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/validators/validate.js b/validators/validate.js index 9c95377..86a6f24 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -141,6 +141,9 @@ function validateHistoricalBundle(bundle, binding) { if (!isObject(bundle) || !validateIdentityBundleSchema(bundle)) { return [bindingViolation('E_BUNDLE_SCHEMA', 'historicalBundle', 'The detached historical bundle is malformed.')]; } + if (!isTimestamp(bundle.recordedAt) || !isTimestamp(bundle.retention.recordedAt)) { + violations.push(bindingViolation('E_TIMESTAMP', 'historicalBundle.timestamps', 'Historical bundle timestamps must be strict RFC 3339 calendar date-times with an offset or Z.')); + } const idsMatch = bundle.familiarRootId === binding.familiar.familiarRootId && bundle.identityRevisionId === binding.familiar.identityRevisionId && bundle.lineagePosition === binding.familiar.lineagePosition; @@ -200,7 +203,7 @@ function validateHistoricalBundle(bundle, binding) { return violations; } -function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedger) { +function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedger, historicalBundleSupplied = false) { const violations = []; if (!isObject(binding)) return [bindingViolation('E_SCHEMA', 'shape', 'An embodiment binding must be one JSON object.')]; if (binding.schemaVersion !== '1.0.0') return [bindingViolation('E_VERSION', 'schemaVersion', 'Only familiar.embodiment_binding.v1 schemaVersion 1.0.0 is supported.')]; @@ -211,9 +214,10 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge } const { familiar, resolutionSnapshot, identityBundle, statusAtDecision, principal, target, historicalVerification, revocation, commit, integrity } = binding; + const isAuthorityAttempt = ['dispatch', 'session_creation'].includes(binding.bindingPurpose); const times = [binding.revisionRecordedAt, binding.validTime.notBefore, binding.validTime.notAfter, resolutionSnapshot.resolvedAt, statusAtDecision.decisionTime, binding.issuedAt, binding.decisionAt, commit.finalValidityCheckAt, commit.committedAt, - revocation.revokedAt].filter(Boolean); + revocation.revokedAt, binding.privacy.recordedAt].filter(Boolean); if (times.some(value => !isTimestamp(value))) violations.push(bindingViolation('E_TIMESTAMP', 'timestamps', 'All present timestamps must be strict RFC 3339 calendar date-times with an offset or Z.')); const at = value => new Date(value).getTime(); @@ -232,10 +236,12 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge resolutionSnapshot.bundleDigest !== identityBundle.bundleDigest.value || resolutionSnapshot.status !== statusAtDecision.status) { violations.push(bindingViolation('E_SNAPSHOT', 'resolutionSnapshot', 'The immutable resolution snapshot must bind root, revision, lineage position, bundle digest, and decision status.')); } - if (resolutionSnapshot.authoritativeHeadRevisionId !== familiar.identityRevisionId || - (isTimestamp(resolutionSnapshot.cacheObservedAt) && isTimestamp(binding.decisionAt) && - at(binding.decisionAt) - at(resolutionSnapshot.cacheObservedAt) > MAX_CACHE_AGE_SECONDS * 1000)) { - violations.push(bindingViolation('E_STALE_CACHE', 'resolutionSnapshot', 'The snapshot must name the authoritative head revision and cache evidence within the verifier policy maximum age.')); + if (isAuthorityAttempt && + (resolutionSnapshot.authoritativeHeadRevisionId !== familiar.identityRevisionId || + (isTimestamp(resolutionSnapshot.cacheObservedAt) && isTimestamp(commit.finalValidityCheckAt) && + at(commit.finalValidityCheckAt) - at(resolutionSnapshot.cacheObservedAt) > + Math.min(MAX_CACHE_AGE_SECONDS, resolutionSnapshot.freshnessBoundSeconds) * 1000))) { + violations.push(bindingViolation('E_STALE_CACHE', 'resolutionSnapshot', 'Authority snapshots must name the current head revision and satisfy both the signed freshness bound and the verifier policy maximum.')); } if (isTimestamp(resolutionSnapshot.cacheObservedAt) && isTimestamp(commit.finalValidityCheckAt) && at(resolutionSnapshot.cacheObservedAt) > at(commit.finalValidityCheckAt)) { @@ -253,10 +259,10 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge if (isTimestamp(binding.revisionRecordedAt) && isTimestamp(binding.decisionAt) && at(binding.revisionRecordedAt) > at(binding.decisionAt)) { violations.push(bindingViolation('E_ORDERING', 'revisionRecordedAt', 'The revision cannot be recorded after the binding decision.')); } - if (isTimestamp(binding.validTime.notBefore) && isTimestamp(binding.decisionAt) && at(binding.validTime.notBefore) > at(binding.decisionAt)) { + if (isAuthorityAttempt && isTimestamp(binding.validTime.notBefore) && isTimestamp(binding.decisionAt) && at(binding.validTime.notBefore) > at(binding.decisionAt)) { violations.push(bindingViolation('E_STALE', 'validTime.notBefore', 'The revision is not yet valid at the decision time.')); } - if (binding.validTime.notAfter && isTimestamp(binding.validTime.notAfter) && isTimestamp(binding.decisionAt) && at(binding.validTime.notAfter) < at(binding.decisionAt)) { + if (isAuthorityAttempt && binding.validTime.notAfter && isTimestamp(binding.validTime.notAfter) && isTimestamp(binding.decisionAt) && at(binding.validTime.notAfter) < at(binding.decisionAt)) { violations.push(bindingViolation('E_STALE', 'validTime.notAfter', 'The revision is stale at the decision time.')); } if (isTimestamp(commit.finalValidityCheckAt) && isTimestamp(commit.committedAt) && at(commit.finalValidityCheckAt) > at(commit.committedAt)) { @@ -296,7 +302,6 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge violations.push(bindingViolation('E_LINEAGE', 'familiar.lineageEvidence', 'Fork/new-root and succession require authenticated, content-addressed predecessor evidence, position 0, a distinct root, and matching root evidence.')); } - const isAuthorityAttempt = ['dispatch', 'session_creation'].includes(binding.bindingPurpose); if (isAuthorityAttempt) { const trustedObservedAt = trustedLedger && isTimestamp(trustedLedger.observedAt) ? at(trustedLedger.observedAt) @@ -335,8 +340,8 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge (!binding.privacy.erasureEvidence || binding.privacy.replicaPurgeState === 'not_requested')) { violations.push(bindingViolation('E_RETENTION', 'privacy', 'Tombstoned or erased binding metadata requires erasure evidence and a requested replica purge.')); } - if (historicalBundle) violations.push(...validateHistoricalBundle(historicalBundle, binding)); - if (!historicalBundle) { + if (historicalBundleSupplied) violations.push(...validateHistoricalBundle(historicalBundle, binding)); + if (!historicalBundleSupplied) { const expectedMissingState = historicalVerification.readAuthorization === 'not_authorized' ? 'unavailable' : 'degraded'; @@ -347,7 +352,7 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge violations.push(bindingViolation(code, 'historicalVerification', `A missing historical bundle must be ${expectedMissingState} for the recorded read-authorization state.`)); } } - if (revocation.outcome === 'before_commit') { + if (isAuthorityAttempt && revocation.outcome === 'before_commit') { violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revocation observed before commit must fail closed and cannot produce a binding.')); } if (revocation.outcome === 'none' && revocation.revokedAt) { @@ -386,7 +391,7 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLe try { trustedLedger = parseJsonNoDuplicate(fs.readFileSync(trustedLedgerPath, 'utf8')); } catch (error) { return [bindingViolation('E_TRUSTED_LEDGER', 'trustedLedger', `JSON syntax violation: ${error.message}`)]; } } - return validateEmbodimentBinding(binding, filePath, historicalBundle, trustedLedger); + return validateEmbodimentBinding(binding, filePath, historicalBundle, trustedLedger, Boolean(historicalBundlePath)); } // ── SOUL.md parser ──────────────────────────────────────────────────────────── From d406720cde2d996157f9f1c44e81da6d8152b7ce Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 05:08:26 -0500 Subject: [PATCH 12/16] fix: close embodiment validation gaps Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 20 ++- .../familiar-embodiment-binding.schema.json | 2 +- schemas/familiar-identity-bundle.schema.json | 2 +- .../bundles/44-delayed-authority-commit.json | 62 +++++++++ .../bundles/45-overflow-binding-number.json | 62 +++++++++ .../bundles/46-overflow-bundle-number.json | 63 +++++++++ .../bundles/47-invalid-cache-observed-at.json | 62 +++++++++ .../48-submillisecond-future-cache.json | 62 +++++++++ .../49-submillisecond-future-ledger.json | 62 +++++++++ .../50-inverted-historical-validity.json | 62 +++++++++ ...51-inconsistent-historical-revocation.json | 62 +++++++++ .../bundles/52-denied-read-with-bundle.json | 54 ++++++++ .../ledgers/44-delayed-authority-commit.json | 6 + .../ledgers/45-overflow-binding-number.json | 6 + .../48-submillisecond-future-cache.json | 6 + .../49-submillisecond-future-ledger.json | 6 + .../embodiment-bindings/manifest.json | 45 +++++++ .../negative/44-delayed-authority-commit.json | 126 ++++++++++++++++++ .../negative/45-overflow-binding-number.json | 125 +++++++++++++++++ .../negative/46-overflow-bundle-number.json | 125 +++++++++++++++++ .../47-invalid-cache-observed-at.json | 125 +++++++++++++++++ .../48-submillisecond-future-cache.json | 125 +++++++++++++++++ .../49-submillisecond-future-ledger.json | 125 +++++++++++++++++ .../50-inverted-historical-validity.json | 126 ++++++++++++++++++ ...51-inconsistent-historical-revocation.json | 126 ++++++++++++++++++ .../negative/52-denied-read-with-bundle.json | 125 +++++++++++++++++ validators/validate.js | 44 ++++-- 27 files changed, 1795 insertions(+), 21 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/44-delayed-authority-commit.json create mode 100644 tests/conformance/embodiment-bindings/bundles/45-overflow-binding-number.json create mode 100644 tests/conformance/embodiment-bindings/bundles/46-overflow-bundle-number.json create mode 100644 tests/conformance/embodiment-bindings/bundles/47-invalid-cache-observed-at.json create mode 100644 tests/conformance/embodiment-bindings/bundles/48-submillisecond-future-cache.json create mode 100644 tests/conformance/embodiment-bindings/bundles/49-submillisecond-future-ledger.json create mode 100644 tests/conformance/embodiment-bindings/bundles/50-inverted-historical-validity.json create mode 100644 tests/conformance/embodiment-bindings/bundles/51-inconsistent-historical-revocation.json create mode 100644 tests/conformance/embodiment-bindings/bundles/52-denied-read-with-bundle.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/44-delayed-authority-commit.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/45-overflow-binding-number.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/48-submillisecond-future-cache.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/49-submillisecond-future-ledger.json create mode 100644 tests/conformance/embodiment-bindings/negative/44-delayed-authority-commit.json create mode 100644 tests/conformance/embodiment-bindings/negative/45-overflow-binding-number.json create mode 100644 tests/conformance/embodiment-bindings/negative/46-overflow-bundle-number.json create mode 100644 tests/conformance/embodiment-bindings/negative/47-invalid-cache-observed-at.json create mode 100644 tests/conformance/embodiment-bindings/negative/48-submillisecond-future-cache.json create mode 100644 tests/conformance/embodiment-bindings/negative/49-submillisecond-future-ledger.json create mode 100644 tests/conformance/embodiment-bindings/negative/50-inverted-historical-validity.json create mode 100644 tests/conformance/embodiment-bindings/negative/51-inconsistent-historical-revocation.json create mode 100644 tests/conformance/embodiment-bindings/negative/52-denied-read-with-bundle.json diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 8c0bad5..09ef1c5 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -542,10 +542,12 @@ and resolver/verifier identities. `identityMeaning` **MUST** be `unchanged`; the purpose only contextualizes embodiment and cannot alter identity meaning. The target's principal **MUST** equal the authenticated principal. -All recorded, valid, resolution, decision, final-check, commit, issue, and -revocation times **MUST** be strict RFC 3339 calendar times with a `Z` or -numeric offset. Recorded time describes when evidence was observed; valid time -describes when the revision was eligible and the two are not interchangeable. +All recorded, valid, cache-observation, resolution, decision, final-check, +commit, issue, and revocation times in bindings and detached bundles **MUST** +be strict RFC 3339 calendar times with a `Z` or numeric offset and no more than +millisecond precision. Recorded time describes when evidence was observed; +valid time describes when the revision was eligible and the two are not +interchangeable. A valid-time interval **MUST NOT** end before it begins. The resolution snapshot **MUST** bind root, revision, lineage position, bundle digest, and status; its snapshot id **MUST** be the final-check/commit snapshot. Resolution precedes final validity check, which precedes decision, commit, and @@ -618,6 +620,10 @@ keeps one duplicate is insufficient. This profile supports exactly The resolver and verifier **MUST** perform the final eligibility check and immutable binding commit on the same snapshot/transaction boundary. The +final validity check, authority decision, and immutable commit therefore +**MUST** identify the same instant for dispatch and session creation. Revision +validity and authoritative-ledger freshness extend through that commit instant. +The committed binding digest **MUST** recompute from the same JCS canonical preimage defined above: the binding with its entire `integrity` and `authentication` members and redundant `commit.verifiedBindingDigest` omitted, and the commit @@ -636,9 +642,9 @@ read is `unavailable` without exposing a bundle. Fully retained supplied evidence is always live, unredacted, unpurged, and `verified`. Tombstoned and erased bundles contain no retained component bytes; erased evidence additionally requires completed replica purge and device-revocation evidence. These states -never imply current authority. Canonical inputs MUST be -I-JSON: duplicate object keys and lone UTF-16 surrogates are rejected before -canonicalization, digest, or signature verification. +never imply current authority. Canonical inputs MUST be I-JSON: duplicate object keys, non-finite numbers, and +lone UTF-16 surrogates are rejected before canonicalization, digest, or +signature verification. The binding carries metadata-only classification plus retention time, tombstone/erasure state, and replica/device-purge state; a tombstoned or erased record **MUST** carry erasure evidence, and requested replica or device diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index 4560dff..b949000 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -130,7 +130,7 @@ "definitions": { "opaqueId": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*:[A-Za-z0-9._:-]+$" }, "version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" }, - "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$" }, + "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$" }, "hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "digest": { "type": "object", "additionalProperties": false, "required": ["algorithm", "value"], diff --git a/schemas/familiar-identity-bundle.schema.json b/schemas/familiar-identity-bundle.schema.json index 7593359..e1b57c3 100644 --- a/schemas/familiar-identity-bundle.schema.json +++ b/schemas/familiar-identity-bundle.schema.json @@ -103,7 +103,7 @@ }, "definitions": { "opaqueId": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*:[A-Za-z0-9._:-]+$" }, - "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$" }, + "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$" }, "hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, "digest": { "type": "object", "additionalProperties": false, "required": ["algorithm", "value"], "properties": { "algorithm": { "const": "sha-256" }, "value": { "$ref": "#/definitions/hash" } } } } diff --git a/tests/conformance/embodiment-bindings/bundles/44-delayed-authority-commit.json b/tests/conformance/embodiment-bindings/bundles/44-delayed-authority-commit.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/44-delayed-authority-commit.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/45-overflow-binding-number.json b/tests/conformance/embodiment-bindings/bundles/45-overflow-binding-number.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/45-overflow-binding-number.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/46-overflow-bundle-number.json b/tests/conformance/embodiment-bindings/bundles/46-overflow-bundle-number.json new file mode 100644 index 0000000..50f2c2f --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/46-overflow-bundle-number.json @@ -0,0 +1,63 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage", + "overflow": 1e400 + }, + "digest": { + "algorithm": "sha-256", + "value": "a59d51adf7c19ea166ec4a78f781bf92c6c44d191e8231eaad7ae5ef78c33989" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "8420a7fc3e104ba2d9c6376558f32bc3ed0d74ceb8138dce33fe724c84fdbbc1" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/47-invalid-cache-observed-at.json b/tests/conformance/embodiment-bindings/bundles/47-invalid-cache-observed-at.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/47-invalid-cache-observed-at.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/48-submillisecond-future-cache.json b/tests/conformance/embodiment-bindings/bundles/48-submillisecond-future-cache.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/48-submillisecond-future-cache.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/49-submillisecond-future-ledger.json b/tests/conformance/embodiment-bindings/bundles/49-submillisecond-future-ledger.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/49-submillisecond-future-ledger.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/50-inverted-historical-validity.json b/tests/conformance/embodiment-bindings/bundles/50-inverted-historical-validity.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/50-inverted-historical-validity.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/51-inconsistent-historical-revocation.json b/tests/conformance/embodiment-bindings/bundles/51-inconsistent-historical-revocation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/51-inconsistent-historical-revocation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/52-denied-read-with-bundle.json b/tests/conformance/embodiment-bindings/bundles/52-denied-read-with-bundle.json new file mode 100644 index 0000000..23cdbd7 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/52-denied-read-with-bundle.json @@ -0,0 +1,54 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "redacted", + "redactionEvidence": "audit:redaction-001" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "erased", + "replicaPurgeState": "complete", + "erasureEvidence": "audit:tombstone-001", + "deviceRevocationEvidence": "audit:device-purge-001", + "redactionState": "redacted" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + } +} diff --git a/tests/conformance/embodiment-bindings/ledgers/44-delayed-authority-commit.json b/tests/conformance/embodiment-bindings/ledgers/44-delayed-authority-commit.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/44-delayed-authority-commit.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/45-overflow-binding-number.json b/tests/conformance/embodiment-bindings/ledgers/45-overflow-binding-number.json new file mode 100644 index 0000000..bd23486 --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/45-overflow-binding-number.json @@ -0,0 +1,6 @@ +{ + "generation": 1e400, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/48-submillisecond-future-cache.json b/tests/conformance/embodiment-bindings/ledgers/48-submillisecond-future-cache.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/48-submillisecond-future-cache.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/49-submillisecond-future-ledger.json b/tests/conformance/embodiment-bindings/ledgers/49-submillisecond-future-ledger.json new file mode 100644 index 0000000..676144d --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/49-submillisecond-future-ledger.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00.0019Z" +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index e17c579..959b0c3 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -327,6 +327,51 @@ "expected": "negative", "file": "43-strict-recorded-cache-bound.json", "errorCode": "E_STALE_CACHE" + }, + { + "expected": "negative", + "file": "44-delayed-authority-commit.json", + "errorCode": "E_ORDERING" + }, + { + "expected": "negative", + "file": "45-overflow-binding-number.json", + "errorCode": "E_IJSON" + }, + { + "expected": "negative", + "file": "46-overflow-bundle-number.json", + "errorCode": "E_IJSON" + }, + { + "expected": "negative", + "file": "47-invalid-cache-observed-at.json", + "errorCode": "E_TIMESTAMP" + }, + { + "expected": "negative", + "file": "48-submillisecond-future-cache.json", + "errorCode": "E_SCHEMA" + }, + { + "expected": "negative", + "file": "49-submillisecond-future-ledger.json", + "errorCode": "E_TRUSTED_LEDGER" + }, + { + "expected": "negative", + "file": "50-inverted-historical-validity.json", + "errorCode": "E_ORDERING" + }, + { + "expected": "negative", + "file": "51-inconsistent-historical-revocation.json", + "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "52-denied-read-with-bundle.json", + "errorCode": "E_BUNDLE_ACCESS" } ] } diff --git a/tests/conformance/embodiment-bindings/negative/44-delayed-authority-commit.json b/tests/conformance/embodiment-bindings/negative/44-delayed-authority-commit.json new file mode 100644 index 0000000..2e80ead --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/44-delayed-authority-commit.json @@ -0,0 +1,126 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-44-delayed-authority-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z", + "notAfter": "2026-09-03T09:00:30Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T10:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "4104bc46199b8ad4183b0a7032a750b9bb16352f0b219a399d73bd555e6fc8a3" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA9tBvnIqoq8CLJZCWxOeThaU2Ma2UYTSCvGmf3MCXJWY=", + "signature": "8nk8rjVCWz20y89f78Sr4yW9dbvWkyZfgY3aRiyarhvd+S6xqddLba5B080jceRlEIem2SvV1F86hk4HgFWBDg==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T10:00:00Z", + "verifiedBindingDigest": "4104bc46199b8ad4183b0a7032a750b9bb16352f0b219a399d73bd555e6fc8a3" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/45-overflow-binding-number.json b/tests/conformance/embodiment-bindings/negative/45-overflow-binding-number.json new file mode 100644 index 0000000..5c5eea5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/45-overflow-binding-number.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-45-overflow-binding-number", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "205917b139154e4f425df82e0ed67d7ab57db72e3f7e50f3b510a4bf56813292" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAptjAjr8NTaYro/m1hyZKuwGbhiLIjJF8C4jSCKIXUNw=", + "signature": "F5Cz0YjmjuNVBwl/zi2+1LgiguawutQ/GJURAq0/mR3GXlzVaiuyJmjPp7IGPZ/1UV1KO8ubqj+GfESpoY6CDw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "205917b139154e4f425df82e0ed67d7ab57db72e3f7e50f3b510a4bf56813292" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 1e400, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/46-overflow-bundle-number.json b/tests/conformance/embodiment-bindings/negative/46-overflow-bundle-number.json new file mode 100644 index 0000000..263b7ad --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/46-overflow-bundle-number.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-46-overflow-bundle-number", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "8420a7fc3e104ba2d9c6376558f32bc3ed0d74ceb8138dce33fe724c84fdbbc1", + "successorDeclarationDigest": "a59d51adf7c19ea166ec4a78f781bf92c6c44d191e8231eaad7ae5ef78c33989", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAetW7Ea1eAzw9rRCndY6P8Yiv31luM1/03/K+lH6ufFE=", + "signature": "n1SZmRl9rSzUVFPgC3VNwLZulQaeaLZC4ZOViJ4V7x05cKdCBpoea7gmsTasCNGz4r8nnZjng6s4pBsbweYsCQ==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "a59d51adf7c19ea166ec4a78f781bf92c6c44d191e8231eaad7ae5ef78c33989" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "8420a7fc3e104ba2d9c6376558f32bc3ed0d74ceb8138dce33fe724c84fdbbc1" + }, + "historicalBundleRef": "urn:sha256:8420a7fc3e104ba2d9c6376558f32bc3ed0d74ceb8138dce33fe724c84fdbbc1" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "04d2b93629f49ac905c28fdeab4111ed75d216631b8da18e19acbe91568f3816" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAF9pLNgpDUa3u7e9+vSoFu60t/IwWGa3Ca86B2tnWqDw=", + "signature": "N2wTypGWw4nGzay2C+CC51X7yVdFNYyRFvbOMH7EQbJsWiVpTDd9ByD5n6ebU//3dp3ldXVCM6rJLyv4BSy0CA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "04d2b93629f49ac905c28fdeab4111ed75d216631b8da18e19acbe91568f3816" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "8420a7fc3e104ba2d9c6376558f32bc3ed0d74ceb8138dce33fe724c84fdbbc1", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/47-invalid-cache-observed-at.json b/tests/conformance/embodiment-bindings/negative/47-invalid-cache-observed-at.json new file mode 100644 index 0000000..c4f6928 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/47-invalid-cache-observed-at.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-47-invalid-cache-observed-at", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "42d0bd288405f50fc2b2d02d634a1ee6946b876fb9a16253107fe084fd664199" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAJw0ftlmeoJ7J34IWtMuVpRwJTLdXJJkopOqbKVB3zhI=", + "signature": "GxWnbp/ckTPX4b9W+rIFkmsb8Rr8vvBrymIdvMkQl48CqQzQP2FGlj4R0ywh0rFSXXzurvzePmOh47rRXuwGBA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "42d0bd288405f50fc2b2d02d634a1ee6946b876fb9a16253107fe084fd664199" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-02-30T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/48-submillisecond-future-cache.json b/tests/conformance/embodiment-bindings/negative/48-submillisecond-future-cache.json new file mode 100644 index 0000000..92f6373 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/48-submillisecond-future-cache.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-48-submillisecond-future-cache", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00.0001Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00.0001Z", + "decisionAt": "2026-09-03T09:00:00.0001Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "b78adf94952d08c701cfe692f1bf5c6808efd4504d5df6fe4e78620c294562d6" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAoL7O6OlZsDcoVn69MRaFcIXst9XGTVqNrTlkQ9qk3jY=", + "signature": "P88NTzN3z6oWg7e41SOB/JgIOerKwGYFhNjc7kd+5+MQApTPdygZKGQ4uvL7GYptRvXoY0c6UiTGS4n2/3JVAA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00.0001Z", + "committedAt": "2026-09-03T09:00:00.0001Z", + "verifiedBindingDigest": "b78adf94952d08c701cfe692f1bf5c6808efd4504d5df6fe4e78620c294562d6" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00.000Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00.0009Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/49-submillisecond-future-ledger.json b/tests/conformance/embodiment-bindings/negative/49-submillisecond-future-ledger.json new file mode 100644 index 0000000..165c41f --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/49-submillisecond-future-ledger.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-49-submillisecond-future-ledger", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00.001Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00.001Z", + "decisionAt": "2026-09-03T09:00:00.001Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "a90859c9f825659575cebf560fb9daf58969fea9a46fd59b2c30e2c9939b088b" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAXhzYOxqst1k6af10Vp/grj8dQJE43ghvi/GBaYmhHqM=", + "signature": "eqpVRFMUffAOCMFsmHT8YCqAzVrtMPD7wEsSpIX7mlR8crKQCQDZDzrir7yII5kr2MCbFADnFMXzZM2GG7mRBA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00.001Z", + "committedAt": "2026-09-03T09:00:00.001Z", + "verifiedBindingDigest": "a90859c9f825659575cebf560fb9daf58969fea9a46fd59b2c30e2c9939b088b" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/50-inverted-historical-validity.json b/tests/conformance/embodiment-bindings/negative/50-inverted-historical-validity.json new file mode 100644 index 0000000..71438ba --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/50-inverted-historical-validity.json @@ -0,0 +1,126 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-50-inverted-historical-validity", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T10:00:00Z", + "notAfter": "2026-09-03T09:00:00Z" + }, + "statusAtDecision": { + "status": "retired", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "89afbf4b0a39bc99a4603814084a78bb0a91bf5c724499a2032bfc46c0affacd" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA0XWUcOeRHA8F4Pp0TMY0/xrkRtO3eNv/KCS7e6x/ap8=", + "signature": "4fkwpvQbbZ/+GjID8VhvoRrgKYBjOOJum6ECWjbNP0ozuT0G+4j18afhxp9dcLmmncBqoMjTMp3sNMv2IKeaAA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "89afbf4b0a39bc99a4603814084a78bb0a91bf5c724499a2032bfc46c0affacd" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "retired", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/51-inconsistent-historical-revocation.json b/tests/conformance/embodiment-bindings/negative/51-inconsistent-historical-revocation.json new file mode 100644 index 0000000..5f29190 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/51-inconsistent-historical-revocation.json @@ -0,0 +1,126 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-51-inconsistent-historical-revocation", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "revoked", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "before_commit", + "revokedAt": "2026-09-03T10:00:00Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "96f443eb99dab50e8550d9002a7ac6cd8d4266d6ce9059824c4886df7f6d8240" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAn9V8rGRZBSgdSn932AQ5KGPuSWEb5eEAcokDyeYIZZA=", + "signature": "nDiQ3H2oK41gjXr06iObQrDJ/yxDt4Meba8io6O4NJjCNlxfoXaIKSX9mm00+Gb10rhlw8Y2FTHri02jzc9mBQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "96f443eb99dab50e8550d9002a7ac6cd8d4266d6ce9059824c4886df7f6d8240" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "revoked", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:4", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/52-denied-read-with-bundle.json b/tests/conformance/embodiment-bindings/negative/52-denied-read-with-bundle.json new file mode 100644 index 0000000..cb7572d --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/52-denied-read-with-bundle.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-52-denied-read-with-bundle", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAvF3vi1QvK5HVWn34+RsrRHEzlUBtS8eWF8HY2ZN5X40=", + "signature": "bUkmoAKjN14isJpLUsjb3s8E0Mk/b7nymNiBN9xbHRRzRqVpJFamwcLPuBTp5S+HaiAX4Oi1h5i1Fts0gRScAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + }, + "historicalBundleRef": "urn:sha256:d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "unavailable", + "readAuthorization": "not_authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "77281032bd7a25bd40d135f31e5a06340eb9b964415070eb9fa567f143243d0a" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAStrkieqBCoQAUXgxrX1iD05JvYpx28CsEAt8eHg9S9I=", + "signature": "+UnrvIykUSrO8iEozNSzqrVtKoNA1yTKi/l12vIorm6xK4EHgzzSGr2kYFkhx+c5Bkoy/kucCy5rVpg0yGVJDA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "77281032bd7a25bd40d135f31e5a06340eb9b964415070eb9fa567f143243d0a" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/validators/validate.js b/validators/validate.js index 86a6f24..317b2f1 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -63,7 +63,8 @@ function parseJsonNoDuplicate(text) { value(); ws(); if (i !== text.length) throw new Error('trailing input'); if (duplicate) throw new Error('duplicate object key'); return JSON.parse(text); } -function hasInvalidIJsonString(value) { +function hasInvalidIJsonValue(value) { + if (typeof value === 'number') return !Number.isFinite(value); if (typeof value === 'string') { for (let i = 0; i < value.length; i++) { const unit = value.charCodeAt(i); @@ -71,8 +72,8 @@ function hasInvalidIJsonString(value) { if (++i >= value.length || value.charCodeAt(i) < 0xdc00 || value.charCodeAt(i) > 0xdfff) return true; } else if (unit >= 0xdc00 && unit <= 0xdfff) return true; } - } else if (Array.isArray(value)) return value.some(hasInvalidIJsonString); - else if (isObject(value)) return Object.entries(value).some(([key, item]) => hasInvalidIJsonString(key) || hasInvalidIJsonString(item)); + } else if (Array.isArray(value)) return value.some(hasInvalidIJsonValue); + else if (isObject(value)) return Object.entries(value).some(([key, item]) => hasInvalidIJsonValue(key) || hasInvalidIJsonValue(item)); return false; } @@ -94,7 +95,7 @@ function bindingDigest(binding) { function isTimestamp(value) { if (typeof value !== 'string') return false; - const match = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(?:Z|([+-])(\d{2}):(\d{2}))$/); + const match = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,3})?(?:Z|([+-])(\d{2}):(\d{2}))$/); if (!match) return false; const [year, month, day, hour, minute, second] = match.slice(1, 7).map(Number); const offsetHour = match[9] === undefined ? 0 : Number(match[9]); @@ -217,7 +218,7 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge const isAuthorityAttempt = ['dispatch', 'session_creation'].includes(binding.bindingPurpose); const times = [binding.revisionRecordedAt, binding.validTime.notBefore, binding.validTime.notAfter, resolutionSnapshot.resolvedAt, statusAtDecision.decisionTime, binding.issuedAt, binding.decisionAt, commit.finalValidityCheckAt, commit.committedAt, - revocation.revokedAt, binding.privacy.recordedAt].filter(Boolean); + revocation.revokedAt, binding.privacy.recordedAt, resolutionSnapshot.cacheObservedAt].filter(Boolean); if (times.some(value => !isTimestamp(value))) violations.push(bindingViolation('E_TIMESTAMP', 'timestamps', 'All present timestamps must be strict RFC 3339 calendar date-times with an offset or Z.')); const at = value => new Date(value).getTime(); @@ -259,10 +260,14 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge if (isTimestamp(binding.revisionRecordedAt) && isTimestamp(binding.decisionAt) && at(binding.revisionRecordedAt) > at(binding.decisionAt)) { violations.push(bindingViolation('E_ORDERING', 'revisionRecordedAt', 'The revision cannot be recorded after the binding decision.')); } - if (isAuthorityAttempt && isTimestamp(binding.validTime.notBefore) && isTimestamp(binding.decisionAt) && at(binding.validTime.notBefore) > at(binding.decisionAt)) { + if (binding.validTime.notAfter && isTimestamp(binding.validTime.notBefore) && isTimestamp(binding.validTime.notAfter) && + at(binding.validTime.notBefore) > at(binding.validTime.notAfter)) { + violations.push(bindingViolation('E_ORDERING', 'validTime', 'The valid-time interval cannot end before it begins.')); + } + if (isAuthorityAttempt && isTimestamp(binding.validTime.notBefore) && isTimestamp(commit.committedAt) && at(binding.validTime.notBefore) > at(commit.committedAt)) { violations.push(bindingViolation('E_STALE', 'validTime.notBefore', 'The revision is not yet valid at the decision time.')); } - if (isAuthorityAttempt && binding.validTime.notAfter && isTimestamp(binding.validTime.notAfter) && isTimestamp(binding.decisionAt) && at(binding.validTime.notAfter) < at(binding.decisionAt)) { + if (isAuthorityAttempt && binding.validTime.notAfter && isTimestamp(binding.validTime.notAfter) && isTimestamp(commit.committedAt) && at(binding.validTime.notAfter) < at(commit.committedAt)) { violations.push(bindingViolation('E_STALE', 'validTime.notAfter', 'The revision is stale at the decision time.')); } if (isTimestamp(commit.finalValidityCheckAt) && isTimestamp(commit.committedAt) && at(commit.finalValidityCheckAt) > at(commit.committedAt)) { @@ -273,6 +278,10 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge statusAtDecision.decisionTime !== binding.decisionAt) { violations.push(bindingViolation('E_ORDERING', 'decisionAt', 'Snapshot resolution, final validity check, decision, commit, and issue must be ordered; statusAtDecision.decisionTime equals decisionAt.')); } + if (isAuthorityAttempt && isTimestamp(commit.finalValidityCheckAt) && isTimestamp(binding.decisionAt) && isTimestamp(commit.committedAt) && + !(at(commit.finalValidityCheckAt) === at(binding.decisionAt) && at(binding.decisionAt) === at(commit.committedAt))) { + violations.push(bindingViolation('E_ORDERING', 'commit', 'Authority eligibility check, decision, and immutable commit must share one transaction boundary.')); + } const bindingIdentityBundleDigest = identityBundle.bundleDigest.value; const bindingDeclarationDigest = identityBundle.declarationDigest.value; @@ -340,6 +349,9 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge (!binding.privacy.erasureEvidence || binding.privacy.replicaPurgeState === 'not_requested')) { violations.push(bindingViolation('E_RETENTION', 'privacy', 'Tombstoned or erased binding metadata requires erasure evidence and a requested replica purge.')); } + if (historicalBundleSupplied && historicalVerification.readAuthorization === 'not_authorized') { + violations.push(bindingViolation('E_BUNDLE_ACCESS', 'historicalVerification.readAuthorization', 'A denied historical read cannot include a detached bundle.')); + } if (historicalBundleSupplied) violations.push(...validateHistoricalBundle(historicalBundle, binding)); if (!historicalBundleSupplied) { const expectedMissingState = historicalVerification.readAuthorization === 'not_authorized' @@ -352,8 +364,13 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge violations.push(bindingViolation(code, 'historicalVerification', `A missing historical bundle must be ${expectedMissingState} for the recorded read-authorization state.`)); } } - if (isAuthorityAttempt && revocation.outcome === 'before_commit') { - violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revocation observed before commit must fail closed and cannot produce a binding.')); + if (revocation.outcome === 'before_commit') { + if (!revocation.revokedAt || !isTimestamp(revocation.revokedAt) || !isTimestamp(commit.committedAt) || + at(revocation.revokedAt) > at(commit.committedAt)) { + violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A before-commit revocation must be timestamped at or before the immutable commit.')); + } else if (isAuthorityAttempt) { + violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revocation observed before commit must fail closed and cannot authorize dispatch.')); + } } if (revocation.outcome === 'none' && revocation.revokedAt) { violations.push(bindingViolation('E_REVOCATION', 'revocation.outcome', 'A binding with revokedAt must classify the revocation outcome explicitly.')); @@ -373,7 +390,7 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLe let binding; try { binding = parseJsonNoDuplicate(fs.readFileSync(filePath, 'utf8')); - if (hasInvalidIJsonString(binding)) return [bindingViolation('E_IJSON', 'input', 'JCS inputs must be I-JSON and cannot contain lone UTF-16 surrogates.')]; + if (hasInvalidIJsonValue(binding)) return [bindingViolation('E_IJSON', 'input', 'JCS inputs must be I-JSON and cannot contain non-finite numbers or lone UTF-16 surrogates.')]; } catch (error) { return [bindingViolation('E_JSON', 'syntax', `JSON syntax violation: ${error.message}`)]; } @@ -381,14 +398,17 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLe if (historicalBundlePath) { try { historicalBundle = parseJsonNoDuplicate(fs.readFileSync(historicalBundlePath, 'utf8')); - if (hasInvalidIJsonString(historicalBundle)) return [bindingViolation('E_IJSON', 'historicalBundle', 'JCS inputs must be I-JSON and cannot contain lone UTF-16 surrogates.')]; + if (hasInvalidIJsonValue(historicalBundle)) return [bindingViolation('E_IJSON', 'historicalBundle', 'JCS inputs must be I-JSON and cannot contain non-finite numbers or lone UTF-16 surrogates.')]; } catch (error) { return [bindingViolation('E_BUNDLE_SCHEMA', 'historicalBundle', `JSON syntax violation: ${error.message}`)]; } } let trustedLedger; if (trustedLedgerPath) { - try { trustedLedger = parseJsonNoDuplicate(fs.readFileSync(trustedLedgerPath, 'utf8')); } + try { + trustedLedger = parseJsonNoDuplicate(fs.readFileSync(trustedLedgerPath, 'utf8')); + if (hasInvalidIJsonValue(trustedLedger)) return [bindingViolation('E_IJSON', 'trustedLedger', 'Trusted ledger JSON must be I-JSON and cannot contain non-finite numbers or lone UTF-16 surrogates.')]; + } catch (error) { return [bindingViolation('E_TRUSTED_LEDGER', 'trustedLedger', `JSON syntax violation: ${error.message}`)]; } } return validateEmbodimentBinding(binding, filePath, historicalBundle, trustedLedger, Boolean(historicalBundlePath)); From 728a9ede44ee7417ae3414b4b5d927cf429fedc5 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 05:19:50 -0500 Subject: [PATCH 13/16] fix: preserve immutable revocation evidence Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- CHANGELOG.md | 15 ++- README.md | 14 +- rfcs/RFC-0001-familiar-contract.md | 23 ++-- .../familiar-embodiment-binding.schema.json | 2 +- ...familiar-embodiment-revocation.schema.json | 47 +++++++ .../conformance/embodiment-bindings/README.md | 9 +- .../53-rsa-key-mislabeled-ed25519.json | 62 +++++++++ .../54-ecdsa-key-mislabeled-ed25519.json | 62 +++++++++ .../55-ed448-key-mislabeled-ed25519.json | 62 +++++++++ .../56-inline-after-commit-revocation.json | 62 +++++++++ .../57-tampered-revocation-reference.json | 62 +++++++++ .../58-tampered-revocation-signature.json | 62 +++++++++ .../59-revoked-status-without-revocation.json | 62 +++++++++ .../53-rsa-key-mislabeled-ed25519.json | 6 + .../54-ecdsa-key-mislabeled-ed25519.json | 6 + .../55-ed448-key-mislabeled-ed25519.json | 6 + .../56-inline-after-commit-revocation.json | 6 + .../57-tampered-revocation-reference.json | 6 + .../58-tampered-revocation-signature.json | 6 + .../embodiment-bindings/manifest.json | 35 +++++ .../53-rsa-key-mislabeled-ed25519.json | 125 +++++++++++++++++ .../54-ecdsa-key-mislabeled-ed25519.json | 125 +++++++++++++++++ .../55-ed448-key-mislabeled-ed25519.json | 125 +++++++++++++++++ .../56-inline-after-commit-revocation.json | 126 ++++++++++++++++++ .../57-tampered-revocation-reference.json | 125 +++++++++++++++++ .../58-tampered-revocation-signature.json | 125 +++++++++++++++++ .../59-revoked-status-without-revocation.json | 125 +++++++++++++++++ .../positive/15-revocation-after-commit.json | 11 +- .../15-revocation-after-commit.json | 22 +++ .../57-tampered-revocation-reference.json | 22 +++ .../58-tampered-revocation-signature.json | 22 +++ tests/conformance/run-conformance.sh | 21 ++- validators/README.md | 10 +- validators/validate.js | 81 +++++++++-- 34 files changed, 1634 insertions(+), 46 deletions(-) create mode 100644 schemas/familiar-embodiment-revocation.schema.json create mode 100644 tests/conformance/embodiment-bindings/bundles/53-rsa-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/bundles/54-ecdsa-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/bundles/55-ed448-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/bundles/56-inline-after-commit-revocation.json create mode 100644 tests/conformance/embodiment-bindings/bundles/57-tampered-revocation-reference.json create mode 100644 tests/conformance/embodiment-bindings/bundles/58-tampered-revocation-signature.json create mode 100644 tests/conformance/embodiment-bindings/bundles/59-revoked-status-without-revocation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/53-rsa-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/54-ecdsa-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/55-ed448-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/56-inline-after-commit-revocation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/57-tampered-revocation-reference.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/58-tampered-revocation-signature.json create mode 100644 tests/conformance/embodiment-bindings/negative/53-rsa-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/negative/54-ecdsa-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/negative/55-ed448-key-mislabeled-ed25519.json create mode 100644 tests/conformance/embodiment-bindings/negative/56-inline-after-commit-revocation.json create mode 100644 tests/conformance/embodiment-bindings/negative/57-tampered-revocation-reference.json create mode 100644 tests/conformance/embodiment-bindings/negative/58-tampered-revocation-signature.json create mode 100644 tests/conformance/embodiment-bindings/negative/59-revoked-status-without-revocation.json create mode 100644 tests/conformance/embodiment-bindings/revocations/15-revocation-after-commit.json create mode 100644 tests/conformance/embodiment-bindings/revocations/57-tampered-revocation-reference.json create mode 100644 tests/conformance/embodiment-bindings/revocations/58-tampered-revocation-signature.json diff --git a/CHANGELOG.md b/CHANGELOG.md index db021fe..c63caa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,11 +31,16 @@ This project uses [Semantic Versioning](https://semver.org/). - **Rereview hardening** — Defines one non-circular digest preimage, records authoritative snapshot freshness, supports erased/redacted detached bundles with retained digest/audit evidence, rejects duplicate JSON keys and unknown - profile versions, and classifies every timestamped revocation outcome. -- **Embodiment-binding conformance lane** — 16 positive and 20 negative - vectors covering active, retired/restored, continuation, fork, succession, - direct/automation/Psyche targets, degraded history, privacy authorization, - tampering, ambiguity, stale/revoked revisions, and malformed data. + profile versions, rejects non-finite I-JSON numbers and non-Ed25519 keys, and + separates post-commit revocation into an immutable-binding-referenced, + append-only signed `familiar.embodiment_revocation.v1` event. +- **Embodiment-binding conformance lane** — 22 positive and 59 negative + vectors covering active and historical revision states, continuation, + restoration, fork, succession, direct/automation/Psyche targets, retained + and redacted history, privacy authorization, transaction timing, key-type + confusion, revocation events, tampering, ambiguity, stale revisions, and + malformed data. The runner uses system-temporary output and works from a + read-only source checkout. --- diff --git a/README.md b/README.md index 1bdbcdf..de23c4f 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,18 @@ These are not soft design preferences. Each one has architectural implications, 5. For a v0.7.0 structural-conformance claim, run both `node validators/validate.js ./your-directory` and `npm test` **If you're binding a concrete execution:** validate its independently -consumable embodiment record with -`node validators/validate.js --embodiment-binding ./binding.json`. The +consumable embodiment record with its required evidence: + +```bash +node validators/validate.js --embodiment-binding ./binding.json \ + --historical-bundle ./identity-bundle.json \ + --trusted-ledger ./trusted-ledger.json +``` + +Historical records may omit sidecars only when their declared degraded or +denied-read state permits that absence. A later revocation is a separately +signed append-only event supplied with `--post-commit-revocation`; it never +rewrites the immutable binding. The [`familiar.embodiment_binding.v1` schema](schemas/familiar-embodiment-binding.schema.json) proves the selected root and exact identity revision without copying sensitive identity content; it does not grant authority or define scheduler lifecycle. diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 09ef1c5..328fd13 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -602,7 +602,9 @@ SHA-256 binding digest. The binding digest is calculated from JCS canonical binding bytes with the entire `integrity` and `authentication` members omitted (and the redundant commit digest-verification field omitted). No private key appears in either profile. An invalid encoding or unverifiable signature -**MUST** fail closed for dispatch and session creation. +**MUST** fail closed. The verifier **MUST** parse the SPKI key and require its +asymmetric key type to be Ed25519; trusting the declared method while accepting +RSA, ECDSA, Ed448, or another key type does not conform. Lineage predecessors **MUST** name a content-addressed predecessor bundle and an authenticated Ed25519 transition edge that signs its relationship, @@ -623,15 +625,20 @@ immutable binding commit on the same snapshot/transaction boundary. The final validity check, authority decision, and immutable commit therefore **MUST** identify the same instant for dispatch and session creation. Revision validity and authoritative-ledger freshness extend through that commit instant. -The -committed binding digest **MUST** recompute from the same JCS canonical preimage +The committed binding digest **MUST** recompute from the same JCS canonical preimage defined above: the binding with its entire `integrity` and `authentication` members and redundant `commit.verifiedBindingDigest` omitted, and the commit -**MUST** attest to that exact digest before launch success. A revocation before -commit rejects the launch; revocation strictly after an immutable commit does -not rewrite that historical binding, but prevents later dispatches. Integrity -and authenticated attestation are mandatory, while cryptographic key-policy -verification remains the verifier's policy responsibility. +**MUST** attest to that exact digest before launch success. A revocation known +at or before commit is represented inside the binding as +`outcome: before_commit` and rejects an authority attempt. A revocation learned +strictly after commit **MUST NOT** be inserted into or re-sign the immutable +binding. It is recorded as a separately signed, append-only +`familiar.embodiment_revocation.v1` event that references the exact binding id, +binding digest, familiar root, and identity revision, and whose own canonical +event digest is Ed25519-authenticated. Such an event preserves historical +evidence while preventing later dispatches. Integrity and authenticated +attestation are mandatory, while cryptographic key-policy verification remains +the verifier's policy responsibility. Retention is lifecycle evidence, not a license to replicate identity content. Retained components carry content and always recompute their digest. diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index b949000..a2f6e64 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -107,7 +107,7 @@ }, "revocation": { "type": "object", "additionalProperties": false, "required": ["outcome"], - "properties": { "outcome": { "enum": ["none", "before_commit", "after_commit"] }, "revokedAt": { "$ref": "#/definitions/timestamp" } } + "properties": { "outcome": { "enum": ["none", "before_commit"] }, "revokedAt": { "$ref": "#/definitions/timestamp" } } }, "commit": { "type": "object", "additionalProperties": false, "required": ["snapshotId", "state", "finalValidityCheckAt", "committedAt", "verifiedBindingDigest"], diff --git a/schemas/familiar-embodiment-revocation.schema.json b/schemas/familiar-embodiment-revocation.schema.json new file mode 100644 index 0000000..d471e92 --- /dev/null +++ b/schemas/familiar-embodiment-revocation.schema.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/OpenCoven/familiar-contract/schemas/familiar-embodiment-revocation.schema.json", + "title": "Familiar Embodiment Post-Commit Revocation v1", + "description": "An append-only signed event that records revocation after an immutable embodiment binding commit.", + "type": "object", + "additionalProperties": false, + "required": ["profile", "schemaVersion", "revocationId", "bindingId", "bindingDigest", "familiarRootId", "identityRevisionId", "revokedAt", "reasonCode", "integrity", "authentication"], + "properties": { + "profile": { "const": "familiar.embodiment_revocation.v1" }, + "schemaVersion": { "const": "1.0.0" }, + "revocationId": { "$ref": "#/definitions/opaqueId" }, + "bindingId": { "type": "string", "minLength": 1 }, + "bindingDigest": { "$ref": "#/definitions/hash" }, + "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, + "revokedAt": { "$ref": "#/definitions/timestamp" }, + "reasonCode": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" }, + "integrity": { + "type": "object", + "additionalProperties": false, + "required": ["algorithm", "canonicalization", "eventDigest"], + "properties": { + "algorithm": { "const": "sha-256" }, + "canonicalization": { "const": "jcs-rfc8785" }, + "eventDigest": { "$ref": "#/definitions/hash" } + } + }, + "authentication": { "$ref": "#/definitions/authentication" } + }, + "definitions": { + "opaqueId": { "type": "string", "pattern": "^[a-z][a-z0-9_-]*:[A-Za-z0-9._:-]+$" }, + "timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?(?:Z|[+-]\\d{2}:\\d{2})$" }, + "hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, + "authentication": { + "type": "object", + "additionalProperties": false, + "required": ["method", "signerId", "publicKey", "signature"], + "properties": { + "method": { "const": "ed25519" }, + "signerId": { "$ref": "#/definitions/opaqueId" }, + "publicKey": { "type": "string", "pattern": "^[A-Za-z0-9+/]+={0,2}$" }, + "signature": { "type": "string", "pattern": "^[A-Za-z0-9+/]+={0,2}$" } + } + } + } +} diff --git a/tests/conformance/embodiment-bindings/README.md b/tests/conformance/embodiment-bindings/README.md index 454857e..4214ead 100644 --- a/tests/conformance/embodiment-bindings/README.md +++ b/tests/conformance/embodiment-bindings/README.md @@ -4,7 +4,9 @@ Each JSON file is one independently consumable `familiar.embodiment_binding.v1` document. Run an individual vector with: ```bash -node validators/validate.js --embodiment-binding path/to/vector.json +node validators/validate.js --embodiment-binding path/to/vector.json \ + --historical-bundle path/to/bundle.json \ + --trusted-ledger path/to/ledger.json ``` The `positive/` vectors are dispatch-eligible bindings or non-authority @@ -33,3 +35,8 @@ the final validity check, and at most 300 seconds old at that check. Stale and future-dated trusted-ledger vectors must fail closed. The effective cache age is the stricter of the signed `freshnessBoundSeconds` and the fixed 300-second verifier maximum. + +Post-commit revocation is represented only by a separately signed +`familiar.embodiment_revocation.v1` event passed with +`--post-commit-revocation`. The event references the immutable binding digest +and cannot alter the binding's committed preimage. diff --git a/tests/conformance/embodiment-bindings/bundles/53-rsa-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/bundles/53-rsa-key-mislabeled-ed25519.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/53-rsa-key-mislabeled-ed25519.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/54-ecdsa-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/bundles/54-ecdsa-key-mislabeled-ed25519.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/54-ecdsa-key-mislabeled-ed25519.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/55-ed448-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/bundles/55-ed448-key-mislabeled-ed25519.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/55-ed448-key-mislabeled-ed25519.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/56-inline-after-commit-revocation.json b/tests/conformance/embodiment-bindings/bundles/56-inline-after-commit-revocation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/56-inline-after-commit-revocation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/57-tampered-revocation-reference.json b/tests/conformance/embodiment-bindings/bundles/57-tampered-revocation-reference.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/57-tampered-revocation-reference.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/58-tampered-revocation-signature.json b/tests/conformance/embodiment-bindings/bundles/58-tampered-revocation-signature.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/58-tampered-revocation-signature.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/59-revoked-status-without-revocation.json b/tests/conformance/embodiment-bindings/bundles/59-revoked-status-without-revocation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/59-revoked-status-without-revocation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/ledgers/53-rsa-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/ledgers/53-rsa-key-mislabeled-ed25519.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/53-rsa-key-mislabeled-ed25519.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/54-ecdsa-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/ledgers/54-ecdsa-key-mislabeled-ed25519.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/54-ecdsa-key-mislabeled-ed25519.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/55-ed448-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/ledgers/55-ed448-key-mislabeled-ed25519.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/55-ed448-key-mislabeled-ed25519.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/56-inline-after-commit-revocation.json b/tests/conformance/embodiment-bindings/ledgers/56-inline-after-commit-revocation.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/56-inline-after-commit-revocation.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/57-tampered-revocation-reference.json b/tests/conformance/embodiment-bindings/ledgers/57-tampered-revocation-reference.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/57-tampered-revocation-reference.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/58-tampered-revocation-signature.json b/tests/conformance/embodiment-bindings/ledgers/58-tampered-revocation-signature.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/58-tampered-revocation-signature.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index 959b0c3..9be010f 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -372,6 +372,41 @@ "expected": "negative", "file": "52-denied-read-with-bundle.json", "errorCode": "E_BUNDLE_ACCESS" + }, + { + "expected": "negative", + "file": "53-rsa-key-mislabeled-ed25519.json", + "errorCode": "E_AUTHENTICATION" + }, + { + "expected": "negative", + "file": "54-ecdsa-key-mislabeled-ed25519.json", + "errorCode": "E_AUTHENTICATION" + }, + { + "expected": "negative", + "file": "55-ed448-key-mislabeled-ed25519.json", + "errorCode": "E_AUTHENTICATION" + }, + { + "expected": "negative", + "file": "56-inline-after-commit-revocation.json", + "errorCode": "E_SCHEMA" + }, + { + "expected": "negative", + "file": "57-tampered-revocation-reference.json", + "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "58-tampered-revocation-signature.json", + "errorCode": "E_AUTHENTICATION" + }, + { + "expected": "negative", + "file": "59-revoked-status-without-revocation.json", + "errorCode": "E_REVOCATION" } ] } diff --git a/tests/conformance/embodiment-bindings/negative/53-rsa-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/negative/53-rsa-key-mislabeled-ed25519.json new file mode 100644 index 0000000..76ad85c --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/53-rsa-key-mislabeled-ed25519.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-53-rsa-key-mislabeled-ed25519", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "daf6760e9d4c79adc22851cad15298bca0af2b09bf4a63419d795ffd0085dbd0" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlll1v8Q7EpWEdPZjONxLLUkaT5VCs/Hd/gIwI5loFunWsyAKqNHtvDI50UJV6jO6o/sAn0ZPgCCgYbhL9JzEozWIY/mNzcfZYAEUJwBAQdK3e8WEUOlrK0VESkyUmU6bOzlv0hQ/bBa66Lqn9suTSw3nKcXwNt6RHh2S1aUK/t1OJp4otxEfp5H/w2j+mXZEj3It2mhOOuRs23+VWU4Uaj2P646WN1lPZ0kntBx8Y/rF53qp3j2MCr/a9NpfmH6awTS9Q7xERB13ohBUnMJp0cb02PSmFzwHpkZ5t3F34SHHYnq6qrVCFypCT1pWzZ499ioDNr7Om6TEiWA83Zz/HQIDAQAB", + "signature": "C3rqzthqrg1XaaCohi38tkBbgfUs8+CYbqvMOXqI8Mw030k5Lc2SKJfU7UjdJMzXibsKYvwoLKZx+QsB44pTHZjdG5JYjeZgsa7D9SO5xPT2+bWb1HqXrV5cuv2SvSlfBUFhVWA7csGUihhL1Bc87JFhT8oRBpphZ/JsVC/7KMbb0m1y4/tihx7NgezeCqNDfRfNXPHva3b0Ox9beCac6osFfE1y8CoraBB9XKUJXJaqdyzvJqWaGqRkYce4Kqr2NrmG+NvCg5t9MlNs/lIYZ88DygNP9RbA5JG1lvPiwbXZ6ZBobEk22RKaeuXJKF5VfwZQG80QNO5907XO1p/fBw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "daf6760e9d4c79adc22851cad15298bca0af2b09bf4a63419d795ffd0085dbd0" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/54-ecdsa-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/negative/54-ecdsa-key-mislabeled-ed25519.json new file mode 100644 index 0000000..c631a46 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/54-ecdsa-key-mislabeled-ed25519.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-54-ecdsa-key-mislabeled-ed25519", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "b4035abd23f54b88b3f7453e84206cd279660d773deb25644de664d5247c9e50" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWQA6zL2Fk4E8/cYg2vMlaPE1AREKQDm5sPbH02Gm2fGD6CjgJk0BghmN3febZxW5I1t1A2Vk87+llwShqgXC0Q==", + "signature": "MEUCIQDZ5Ho+d1zYIb0AlEinQjmlmFUR6Ne68SADTy5Vjy1lVQIgcTggo+8HTirLM+SwvvHnWCB+PGDKItlHIWH2p98YKVc=" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "b4035abd23f54b88b3f7453e84206cd279660d773deb25644de664d5247c9e50" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/55-ed448-key-mislabeled-ed25519.json b/tests/conformance/embodiment-bindings/negative/55-ed448-key-mislabeled-ed25519.json new file mode 100644 index 0000000..64d9ec5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/55-ed448-key-mislabeled-ed25519.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-55-ed448-key-mislabeled-ed25519", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "6c29479d7b322a12acd2a60e8a565cf5d15eb4bb254ed23c42ef99e301f71d48" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MEMwBQYDK2VxAzoAlQIpmacXl8TX3mumuFW0+hfuDxTISU7dU0K43A8Bu2xi/b/qY9XLJBmN7n2FcEKPvUo1DpbKhT6A", + "signature": "w+lI9r/Fhw+s6tiWVWXdaGb/WN+Tg1T4T6AiPdxEhr0KqJkZRHZwZF1mdd75SWsinlx7lokUU2sACudDWF8dukumlihbj5/Sd3LoUDd+n7iwCh0wxvmKbmrQ8olE+7lCVm8upM84L5wCVny96Otw6i0A" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "6c29479d7b322a12acd2a60e8a565cf5d15eb4bb254ed23c42ef99e301f71d48" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/56-inline-after-commit-revocation.json b/tests/conformance/embodiment-bindings/negative/56-inline-after-commit-revocation.json new file mode 100644 index 0000000..f08ba8d --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/56-inline-after-commit-revocation.json @@ -0,0 +1,126 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-15-revocation-after-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "after_commit", + "revokedAt": "2026-09-03T09:00:01Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "480d5f34266fa9804d4ebb474c02fa1bd9f266440650f12712c9a8d48efffab4" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "KdXis2ZANHA1/ce4tVHEXE+RKvMApYEf1shXKkcJTco4eHmdbYi6uj4MxTChNu86+lOQ4J2pEQmxPokNQ3M/DQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "480d5f34266fa9804d4ebb474c02fa1bd9f266440650f12712c9a8d48efffab4" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/57-tampered-revocation-reference.json b/tests/conformance/embodiment-bindings/negative/57-tampered-revocation-reference.json new file mode 100644 index 0000000..36698fe --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/57-tampered-revocation-reference.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-57-tampered-revocation-reference", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "331450d5aac641fcdb785697d650289c68f5cd14e72cd67c01146b77a62584b7" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAzEMiBxYMy/nEun2JyH1IXdQCOt2EFIrIiQjCQixnfqo=", + "signature": "U7UeyixQezhEQriGR7QnNRSAOPj3JPXJP2RjDIwHDa5lLcg4H4rxltMpPZhFCwkN7xgRcMovT5GU7UzeLMzVBQ==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "331450d5aac641fcdb785697d650289c68f5cd14e72cd67c01146b77a62584b7" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/58-tampered-revocation-signature.json b/tests/conformance/embodiment-bindings/negative/58-tampered-revocation-signature.json new file mode 100644 index 0000000..3b543de --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/58-tampered-revocation-signature.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-58-tampered-revocation-signature", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "7ee02677f9b79169f8b442915c573b05d0a8cb4766f1ef6042e27fac8be9f902" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAsC5Tk7cFzqmlgTiDPH4lpf4H94+wtZOHtOQfHXmAsN4=", + "signature": "wao3KSAqDYN/fIuQwS+eEuv8Csnf1vE7MXB7wiEVvwyCKUFzw4nu0JGttT9zMzc7rOMkvqZeI1wWujZhf6xcDA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "7ee02677f9b79169f8b442915c573b05d0a8cb4766f1ef6042e27fac8be9f902" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/59-revoked-status-without-revocation.json b/tests/conformance/embodiment-bindings/negative/59-revoked-status-without-revocation.json new file mode 100644 index 0000000..7a2855a --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/59-revoked-status-without-revocation.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-59-revoked-status-without-revocation", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "Ff0089y2gpy1Oae0Dp5tQmLpYBJl62JJUtI3RlTgIyxSjBat7WIj+guZ8bCBFY+K2UpVIaOgNknH68f/aMliCw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "revoked", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "historical_verification", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "796b040e78089391a378e5db8a57ec1d1b5f26acb9e28493b8fab33eed0a26dd" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAG1p+yCvMWiVsCe9SPO8cT52i011k3DqIt7Z5w3Ek5Ns=", + "signature": "J3oSyogz/mY9Uw1UXj41ag34nOX2dmjq0AZPHVtN+hG1R7/CQ1VwiPI9Dn2sKMArbYCEIM6L37ic++SfecCMDw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "historical-verification-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "796b040e78089391a378e5db8a57ec1d1b5f26acb9e28493b8fab33eed0a26dd" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "revoked", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:4", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json index f08ba8d..fab1867 100644 --- a/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json +++ b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json @@ -80,19 +80,18 @@ "readAuthorization": "not_requested" }, "revocation": { - "outcome": "after_commit", - "revokedAt": "2026-09-03T09:00:01Z" + "outcome": "none" }, "integrity": { "algorithm": "sha-256", "canonicalization": "jcs-rfc8785", - "bindingDigest": "480d5f34266fa9804d4ebb474c02fa1bd9f266440650f12712c9a8d48efffab4" + "bindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" }, "authentication": { "method": "ed25519", "signerId": "authority:oak", - "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", - "signature": "KdXis2ZANHA1/ce4tVHEXE+RKvMApYEf1shXKkcJTco4eHmdbYi6uj4MxTChNu86+lOQ4J2pEQmxPokNQ3M/DQ==" + "publicKey": "MCowBQYDK2VwAyEAxuPXVSd0Y2PbUCuLXkxhxYq6eBSE3ynGSiImgav3Ho0=", + "signature": "qincl9bPUysIs99MeNe1564DD17n1pM0DOc2AQmXY+EZlMd5/U7pykQvXGRaP/iLiMJWFeQDXDVw56Q91NYICA==" }, "privacy": { "classification": "metadata-only", @@ -107,7 +106,7 @@ "state": "committed", "finalValidityCheckAt": "2026-09-03T09:00:00Z", "committedAt": "2026-09-03T09:00:00Z", - "verifiedBindingDigest": "480d5f34266fa9804d4ebb474c02fa1bd9f266440650f12712c9a8d48efffab4" + "verifiedBindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" }, "resolutionSnapshot": { "snapshotId": "snapshot:oak-dispatch-001", diff --git a/tests/conformance/embodiment-bindings/revocations/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/revocations/15-revocation-after-commit.json new file mode 100644 index 0000000..f1b4dd3 --- /dev/null +++ b/tests/conformance/embodiment-bindings/revocations/15-revocation-after-commit.json @@ -0,0 +1,22 @@ +{ + "profile": "familiar.embodiment_revocation.v1", + "schemaVersion": "1.0.0", + "revocationId": "revocation:oak-binding-15", + "bindingId": "binding-15-revocation-after-commit", + "bindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "revokedAt": "2026-09-03T09:00:01Z", + "reasonCode": "identity-revoked", + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "eventDigest": "81a70e1f0268c963e763aea8dfb9bb00e934ee5871d259f9a0c28390e5ce0f67" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA4NaYvDx69It12evPldioIvMYdqg+K4rcmuiXR+Sh5d4=", + "signature": "mgMHzUZbY0/0eKwhBL2IUYFm7/3xzlzTNUbJphKdkZTlWwgXckswyBliW6zAzZRuDKjfP6Rlvv+3L8NGYyRxBQ==" + } +} diff --git a/tests/conformance/embodiment-bindings/revocations/57-tampered-revocation-reference.json b/tests/conformance/embodiment-bindings/revocations/57-tampered-revocation-reference.json new file mode 100644 index 0000000..026a885 --- /dev/null +++ b/tests/conformance/embodiment-bindings/revocations/57-tampered-revocation-reference.json @@ -0,0 +1,22 @@ +{ + "profile": "familiar.embodiment_revocation.v1", + "schemaVersion": "1.0.0", + "revocationId": "revocation:oak-binding-15", + "bindingId": "binding-57-tampered-revocation-reference", + "bindingDigest": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "revokedAt": "2026-09-03T09:00:01Z", + "reasonCode": "identity-revoked", + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "eventDigest": "e52e219c843713ad906ae30316a9f7c71cec15b50bd1f715692a49d5e30e98eb" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAeDkGOu0ko+ghTbWz9jRqNhLV9mlXdOVITXqOMO2Scfk=", + "signature": "9hcio4BH+Acge7t4w8VcqO60yYcT/U6rBUJWhgk/h5Yk396qpuLQpMBE6rbh3k0+gAWgS3IwwNorpfMpCsE7Aw==" + } +} diff --git a/tests/conformance/embodiment-bindings/revocations/58-tampered-revocation-signature.json b/tests/conformance/embodiment-bindings/revocations/58-tampered-revocation-signature.json new file mode 100644 index 0000000..abf79a2 --- /dev/null +++ b/tests/conformance/embodiment-bindings/revocations/58-tampered-revocation-signature.json @@ -0,0 +1,22 @@ +{ + "profile": "familiar.embodiment_revocation.v1", + "schemaVersion": "1.0.0", + "revocationId": "revocation:oak-binding-15", + "bindingId": "binding-58-tampered-revocation-signature", + "bindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "revokedAt": "2026-09-03T09:00:01Z", + "reasonCode": "identity-revoked", + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "eventDigest": "de68d9fcfae0cd08a8dfe1057ba3540d302ce2504aa6e693801288ffa2ed0f93" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA2i6gXJpNSBhk6dPAP3Otyq4ZDEby2hTxg2f43g44krw=", + "signature": "AftwJGrBAm843FpGXgeZBnnTiFBcF+tCVVuxsExTRRYC4izogpCmXLGH4XA6ycLpnrLRphcCcMfjVfQCtJQHAA==" + } +} diff --git a/tests/conformance/run-conformance.sh b/tests/conformance/run-conformance.sh index ed97157..7c031f8 100755 --- a/tests/conformance/run-conformance.sh +++ b/tests/conformance/run-conformance.sh @@ -14,6 +14,8 @@ set -u ROOT_DIR=$(cd "$(dirname "$0")/../.." && pwd) SUITE_DIR="$ROOT_DIR/tests/conformance" VALIDATOR="$ROOT_DIR/validators/validate.js" +OUTPUT_FILE=$(mktemp "${TMPDIR:-/tmp}/familiar-contract-conformance.XXXXXX") || exit 1 +trap 'rm -f "$OUTPUT_FILE"' EXIT HUP INT TERM positive_total=0 positive_passed=0 @@ -27,7 +29,7 @@ run_case() { expected=$2 label=$3 - output_file="$SUITE_DIR/.conformance-output.$$" + output_file="$OUTPUT_FILE" node "$VALIDATOR" "$case_path" >"$output_file" 2>&1 status=$? @@ -57,7 +59,6 @@ negative expected fail but passed: ${label}" fi fi - rm -f "$output_file" } run_binding_case() { @@ -66,16 +67,15 @@ run_binding_case() { label=$3 expected_code=$4 - output_file="$SUITE_DIR/.conformance-output.$$" + output_file="$OUTPUT_FILE" bundle_path="$SUITE_DIR/embodiment-bindings/bundles/$(basename "$vector_path")" ledger_path="$SUITE_DIR/embodiment-bindings/ledgers/$(basename "$vector_path")" - if [ -f "$bundle_path" ] && [ -f "$ledger_path" ]; then - node "$VALIDATOR" --embodiment-binding "$vector_path" --historical-bundle "$bundle_path" --trusted-ledger "$ledger_path" >"$output_file" 2>&1 - elif [ -f "$bundle_path" ]; then - node "$VALIDATOR" --embodiment-binding "$vector_path" --historical-bundle "$bundle_path" >"$output_file" 2>&1 - else - node "$VALIDATOR" --embodiment-binding "$vector_path" >"$output_file" 2>&1 - fi + revocation_path="$SUITE_DIR/embodiment-bindings/revocations/$(basename "$vector_path")" + binding_args=(--embodiment-binding "$vector_path") + [ -f "$bundle_path" ] && binding_args+=(--historical-bundle "$bundle_path") + [ -f "$ledger_path" ] && binding_args+=(--trusted-ledger "$ledger_path") + [ -f "$revocation_path" ] && binding_args+=(--post-commit-revocation "$revocation_path") + node "$VALIDATOR" "${binding_args[@]}" >"$output_file" 2>&1 status=$? if [ "$expected" = "pass" ]; then @@ -104,7 +104,6 @@ embodiment negative expected fail but passed: ${label}" fi fi - rm -f "$output_file" } printf 'Familiar Contract conformance suite\n\n' diff --git a/validators/README.md b/validators/README.md index e04296b..5482c18 100644 --- a/validators/README.md +++ b/validators/README.md @@ -11,7 +11,15 @@ A Node.js CLI that checks one claimant directory for the familiar-contract v0.7. ```bash node validators/validate.js -node validators/validate.js --embodiment-binding +node validators/validate.js --embodiment-binding \ + --historical-bundle \ + --trusted-ledger + +# Optionally verify a separately signed revocation recorded after commit: +node validators/validate.js --embodiment-binding \ + --historical-bundle \ + --trusted-ledger \ + --post-commit-revocation ``` ### Examples diff --git a/validators/validate.js b/validators/validate.js index 317b2f1..147f80e 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -47,6 +47,11 @@ const identityBundleSchema = JSON.parse(fs.readFileSync( )); const validateIdentityBundleSchema = new Ajv({ allErrors: true, strict: false }) .compile(identityBundleSchema); +const embodimentRevocationSchema = JSON.parse(fs.readFileSync( + path.join(__dirname, '..', 'schemas', 'familiar-embodiment-revocation.schema.json'), 'utf8' +)); +const validateEmbodimentRevocationSchema = new Ajv({ allErrors: true, strict: false }) + .compile(embodimentRevocationSchema); const MAX_CACHE_AGE_SECONDS = 300; function bindingViolation(code, field, message) { @@ -93,6 +98,13 @@ function bindingDigest(binding) { return crypto.createHash('sha256').update(canonicalJson(committed), 'utf8').digest('hex'); } +function revocationDigest(revocation) { + const committed = JSON.parse(JSON.stringify(revocation)); + delete committed.integrity; + delete committed.authentication; + return crypto.createHash('sha256').update(canonicalJson(committed), 'utf8').digest('hex'); +} + function isTimestamp(value) { if (typeof value !== 'string') return false; const match = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,3})?(?:Z|([+-])(\d{2}):(\d{2}))$/); @@ -108,9 +120,12 @@ function isTimestamp(value) { function verifyEd25519(authentication, digest) { try { - return crypto.verify(null, Buffer.from(digest, 'hex'), { + const key = crypto.createPublicKey({ key: Buffer.from(authentication.publicKey, 'base64'), format: 'der', type: 'spki' - }, Buffer.from(authentication.signature, 'base64')); + }); + const signature = Buffer.from(authentication.signature, 'base64'); + return key.asymmetricKeyType === 'ed25519' && signature.length === 64 && + crypto.verify(null, Buffer.from(digest, 'hex'), key, signature); } catch (_) { return false; } @@ -204,7 +219,32 @@ function validateHistoricalBundle(bundle, binding) { return violations; } -function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedger, historicalBundleSupplied = false) { +function validatePostCommitRevocation(revocation, binding) { + if (!isObject(revocation) || !validateEmbodimentRevocationSchema(revocation)) { + return [bindingViolation('E_REVOCATION', 'postCommitRevocation', 'The post-commit revocation event is malformed.')]; + } + if (hasInvalidIJsonValue(revocation) || !isTimestamp(revocation.revokedAt)) { + return [bindingViolation('E_REVOCATION', 'postCommitRevocation', 'The post-commit revocation event must be valid I-JSON with a strict timestamp.')]; + } + const violations = []; + if (revocation.bindingId !== binding.bindingId || + revocation.bindingDigest !== binding.integrity.bindingDigest || + revocation.familiarRootId !== binding.familiar.familiarRootId || + revocation.identityRevisionId !== binding.familiar.identityRevisionId || + new Date(revocation.revokedAt).getTime() <= new Date(binding.commit.committedAt).getTime()) { + violations.push(bindingViolation('E_REVOCATION', 'postCommitRevocation', 'A post-commit revocation must reference the exact immutable binding and occur strictly after its commit.')); + } + const digest = revocationDigest(revocation); + if (revocation.integrity.eventDigest !== digest) { + violations.push(bindingViolation('E_REVOCATION', 'postCommitRevocation.integrity', 'The post-commit revocation event digest does not match its canonical preimage.')); + } + if (!verifyEd25519(revocation.authentication, digest)) { + violations.push(bindingViolation('E_AUTHENTICATION', 'postCommitRevocation.authentication', 'The post-commit revocation Ed25519 signature does not verify.')); + } + return violations; +} + +function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedger, historicalBundleSupplied = false, postCommitRevocation) { const violations = []; if (!isObject(binding)) return [bindingViolation('E_SCHEMA', 'shape', 'An embodiment binding must be one JSON object.')]; if (binding.schemaVersion !== '1.0.0') return [bindingViolation('E_VERSION', 'schemaVersion', 'Only familiar.embodiment_binding.v1 schemaVersion 1.0.0 is supported.')]; @@ -378,15 +418,16 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge if (revocation.revokedAt && isTimestamp(revocation.revokedAt) && isTimestamp(commit.committedAt) && at(revocation.revokedAt) <= at(commit.committedAt) && isAuthorityAttempt) { violations.push(bindingViolation('E_REVOCATION', 'revocation.revokedAt', 'Any revocation at or before decision/commit rejects dispatch regardless of the asserted outcome.')); } - if (revocation.outcome === 'after_commit') { - if (!revocation.revokedAt || !isTimestamp(revocation.revokedAt) || !isTimestamp(commit.committedAt) || at(revocation.revokedAt) <= at(commit.committedAt)) { - violations.push(bindingViolation('E_REVOCATION', 'revocation', 'An after-commit revocation must be timestamped strictly after the immutable commit.')); - } + if (statusAtDecision.status === 'revoked' && + (revocation.outcome !== 'before_commit' || !revocation.revokedAt || + !isTimestamp(revocation.revokedAt) || at(revocation.revokedAt) > at(binding.decisionAt))) { + violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revision recorded as revoked at decision time requires a before-commit revocation at or before that decision.')); } + if (postCommitRevocation) violations.push(...validatePostCommitRevocation(postCommitRevocation, binding)); return violations; } -function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLedgerPath) { +function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLedgerPath, postCommitRevocationPath) { let binding; try { binding = parseJsonNoDuplicate(fs.readFileSync(filePath, 'utf8')); @@ -411,7 +452,15 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLe } catch (error) { return [bindingViolation('E_TRUSTED_LEDGER', 'trustedLedger', `JSON syntax violation: ${error.message}`)]; } } - return validateEmbodimentBinding(binding, filePath, historicalBundle, trustedLedger, Boolean(historicalBundlePath)); + let postCommitRevocation; + if (postCommitRevocationPath) { + try { + postCommitRevocation = parseJsonNoDuplicate(fs.readFileSync(postCommitRevocationPath, 'utf8')); + } catch (error) { + return [bindingViolation('E_REVOCATION', 'postCommitRevocation', `JSON syntax violation: ${error.message}`)]; + } + } + return validateEmbodimentBinding(binding, filePath, historicalBundle, trustedLedger, Boolean(historicalBundlePath), postCommitRevocation); } // ── SOUL.md parser ──────────────────────────────────────────────────────────── @@ -800,7 +849,7 @@ ${bold('familiar-contract validator')} — checks a familiar directory for spec ${bold('Usage:')} npm install node validate.js - node validate.js --embodiment-binding [--historical-bundle ] + node validate.js --embodiment-binding [--historical-bundle ] [--trusted-ledger ] [--post-commit-revocation ] ${bold('Examples:')} node validate.js examples/sage @@ -835,13 +884,23 @@ ${bold('Exit codes:')} } const bundleIndex = args.indexOf('--historical-bundle'); const ledgerIndex = args.indexOf('--trusted-ledger'); + const revocationIndex = args.indexOf('--post-commit-revocation'); const historicalBundlePath = bundleIndex >= 0 && args[bundleIndex + 1] && path.resolve(args[bundleIndex + 1]); const trustedLedgerPath = ledgerIndex >= 0 && args[ledgerIndex + 1] && path.resolve(args[ledgerIndex + 1]); + const postCommitRevocationPath = revocationIndex >= 0 && args[revocationIndex + 1] && path.resolve(args[revocationIndex + 1]); if (historicalBundlePath && (!fs.existsSync(historicalBundlePath) || !fs.statSync(historicalBundlePath).isFile())) { console.error(red(`Error: Historical bundle file not found: ${historicalBundlePath}`)); process.exit(1); } - const bindingViolations = validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLedgerPath); + if (trustedLedgerPath && (!fs.existsSync(trustedLedgerPath) || !fs.statSync(trustedLedgerPath).isFile())) { + console.error(red(`Error: Trusted ledger file not found: ${trustedLedgerPath}`)); + process.exit(1); + } + if (postCommitRevocationPath && (!fs.existsSync(postCommitRevocationPath) || !fs.statSync(postCommitRevocationPath).isFile())) { + console.error(red(`Error: Post-commit revocation file not found: ${postCommitRevocationPath}`)); + process.exit(1); + } + const bindingViolations = validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLedgerPath, postCommitRevocationPath); if (bindingViolations.length === 0) { console.log(green(bold('✓ PASS')) + ' — Embodiment binding validation passed.'); process.exit(0); From 6992a0c0c3e57171866ee4bb6c00d7dcc9c80c9e Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 05:26:16 -0500 Subject: [PATCH 14/16] fix: reject unsafe embodiment inputs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- CHANGELOG.md | 7 +- rfcs/RFC-0001-familiar-contract.md | 3 + .../familiar-embodiment-binding.schema.json | 2 +- .../60-rounded-generation-collision.json | 62 +++++++++ .../61-unsafe-trusted-ledger-generation.json | 62 +++++++++ .../60-rounded-generation-collision.json | 6 + .../61-unsafe-trusted-ledger-generation.json | 6 + .../embodiment-bindings/manifest.json | 10 ++ .../60-rounded-generation-collision.json | 125 ++++++++++++++++++ .../61-unsafe-trusted-ledger-generation.json | 125 ++++++++++++++++++ tests/conformance/run-conformance.sh | 29 ++++ validators/README.md | 3 + validators/validate.js | 29 +++- 13 files changed, 459 insertions(+), 10 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/60-rounded-generation-collision.json create mode 100644 tests/conformance/embodiment-bindings/bundles/61-unsafe-trusted-ledger-generation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/60-rounded-generation-collision.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/61-unsafe-trusted-ledger-generation.json create mode 100644 tests/conformance/embodiment-bindings/negative/60-rounded-generation-collision.json create mode 100644 tests/conformance/embodiment-bindings/negative/61-unsafe-trusted-ledger-generation.json diff --git a/CHANGELOG.md b/CHANGELOG.md index c63caa4..2661026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,13 +34,14 @@ This project uses [Semantic Versioning](https://semver.org/). profile versions, rejects non-finite I-JSON numbers and non-Ed25519 keys, and separates post-commit revocation into an immutable-binding-referenced, append-only signed `familiar.embodiment_revocation.v1` event. -- **Embodiment-binding conformance lane** — 22 positive and 59 negative +- **Embodiment-binding conformance lane** — 22 positive and 61 negative vectors covering active and historical revision states, continuation, restoration, fork, succession, direct/automation/Psyche targets, retained and redacted history, privacy authorization, transaction timing, key-type confusion, revocation events, tampering, ambiguity, stale revisions, and - malformed data. The runner uses system-temporary output and works from a - read-only source checkout. + malformed data. The runner uses system-temporary output, works from a + read-only source checkout, and rejects unknown, duplicate, or valueless + sidecar options. --- diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 328fd13..384a166 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -566,6 +566,9 @@ The trusted ledger observation **MUST NOT** precede the recorded cache observation, **MUST NOT** follow the final validity check, and **MUST** be no more than 300 seconds old at that check. A stale, future-dated, mismatched, or missing trusted ledger observation fails closed. +All counters and generations **MUST** be non-negative I-JSON safe integers no +greater than `9007199254740991`; implementations must reject rather than round +larger values. Aliases are non-authoritative resolution evidence only. When an alias is used, resolution **MUST** yield exactly one root, and that root **MUST** equal the diff --git a/schemas/familiar-embodiment-binding.schema.json b/schemas/familiar-embodiment-binding.schema.json index a2f6e64..9bf3d3e 100644 --- a/schemas/familiar-embodiment-binding.schema.json +++ b/schemas/familiar-embodiment-binding.schema.json @@ -43,7 +43,7 @@ "type": "object", "additionalProperties": false, "required": ["snapshotId", "resolvedAt", "authoritativeLedgerGeneration", "authoritativeHeadRevisionId", "freshnessBoundSeconds", "cacheObservedAt", "cacheProvenance", "familiarRootId", "identityRevisionId", "lineagePosition", "bundleDigest", "status"], "properties": { - "snapshotId": { "$ref": "#/definitions/opaqueId" }, "resolvedAt": { "$ref": "#/definitions/timestamp" }, "authoritativeLedgerGeneration": { "type": "integer", "minimum": 0 }, "authoritativeHeadRevisionId": { "$ref": "#/definitions/opaqueId" }, "freshnessBoundSeconds": { "type": "integer", "minimum": 0 }, "cacheObservedAt": { "$ref": "#/definitions/timestamp" }, "cacheProvenance": { "enum": ["authoritative-read", "validated-cache"] }, "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "snapshotId": { "$ref": "#/definitions/opaqueId" }, "resolvedAt": { "$ref": "#/definitions/timestamp" }, "authoritativeLedgerGeneration": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "authoritativeHeadRevisionId": { "$ref": "#/definitions/opaqueId" }, "freshnessBoundSeconds": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "cacheObservedAt": { "$ref": "#/definitions/timestamp" }, "cacheProvenance": { "enum": ["authoritative-read", "validated-cache"] }, "familiarRootId": { "$ref": "#/definitions/opaqueId" }, "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, "lineagePosition": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 }, "bundleDigest": { "$ref": "#/definitions/hash" }, "status": { "enum": ["active", "retired", "revoked", "superseded"] } } diff --git a/tests/conformance/embodiment-bindings/bundles/60-rounded-generation-collision.json b/tests/conformance/embodiment-bindings/bundles/60-rounded-generation-collision.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/60-rounded-generation-collision.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/61-unsafe-trusted-ledger-generation.json b/tests/conformance/embodiment-bindings/bundles/61-unsafe-trusted-ledger-generation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/61-unsafe-trusted-ledger-generation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/ledgers/60-rounded-generation-collision.json b/tests/conformance/embodiment-bindings/ledgers/60-rounded-generation-collision.json new file mode 100644 index 0000000..c54f7db --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/60-rounded-generation-collision.json @@ -0,0 +1,6 @@ +{ + "generation": 9007199254740993, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/61-unsafe-trusted-ledger-generation.json b/tests/conformance/embodiment-bindings/ledgers/61-unsafe-trusted-ledger-generation.json new file mode 100644 index 0000000..c54f7db --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/61-unsafe-trusted-ledger-generation.json @@ -0,0 +1,6 @@ +{ + "generation": 9007199254740993, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index 9be010f..e2edb74 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -407,6 +407,16 @@ "expected": "negative", "file": "59-revoked-status-without-revocation.json", "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "60-rounded-generation-collision.json", + "errorCode": "E_SCHEMA" + }, + { + "expected": "negative", + "file": "61-unsafe-trusted-ledger-generation.json", + "errorCode": "E_TRUSTED_LEDGER" } ] } diff --git a/tests/conformance/embodiment-bindings/negative/60-rounded-generation-collision.json b/tests/conformance/embodiment-bindings/negative/60-rounded-generation-collision.json new file mode 100644 index 0000000..fea0e56 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/60-rounded-generation-collision.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-60-rounded-generation-collision", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "387c807b678706bce0a83d513ea500594bab3e7076438db2f47eed447ea28f57" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAqc43nC9gEsXMltG9+Q4mOoQ0bACoxl3Y6lj1XanYoFQ=", + "signature": "IeOSCpLI4TS5KU1xyPlh5tlfMLw0r6KPLyKUvk6hHnu5E5vlH73Anputt6mY1SbNgUROi3ZM0CRwx1GZ+S4HDw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "387c807b678706bce0a83d513ea500594bab3e7076438db2f47eed447ea28f57" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 9007199254740992, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/61-unsafe-trusted-ledger-generation.json b/tests/conformance/embodiment-bindings/negative/61-unsafe-trusted-ledger-generation.json new file mode 100644 index 0000000..e48eb28 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/61-unsafe-trusted-ledger-generation.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-61-unsafe-trusted-ledger-generation", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfdYzaCdqpJpkkVuYxI2Tx+QrQFAoNJZo81HsU+1fL20=", + "signature": "pGZZtV42GQFbDJSkSLQiqJEe0VXHyuF+Xv3O/Aty1vgsFCqVKzlEwR/kxJs8hPAFCM5yu4xgiiswyff9AdSmAw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "704e8e4b528a1d1a27e9dc96a5a25553c98e41902220530e1df6b100af2526f2" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAqtUzgO8EFCUUoX530MfefLEImJMw31WanzGeDbxOgvA=", + "signature": "KC7c3Yh2mYic6GtAG7MsXonA90ndSFMwmdF6e+LtKBszpk1bgUGwrnlAITBkW7wDtjCn0s8AN0xBopWm781nBw==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "704e8e4b528a1d1a27e9dc96a5a25553c98e41902220530e1df6b100af2526f2" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 9007199254740991, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/run-conformance.sh b/tests/conformance/run-conformance.sh index 7c031f8..d2dd102 100755 --- a/tests/conformance/run-conformance.sh +++ b/tests/conformance/run-conformance.sh @@ -159,6 +159,35 @@ done printf '\n' +run_cli_rejection() { + label=$1 + shift + "$@" >"$OUTPUT_FILE" 2>&1 + status=$? + if [ "$status" -ne 0 ]; then + printf 'FAIL expected: %s\n' "$label" + else + unexpected=$((unexpected + 1)) + details="${details} +embodiment CLI misuse unexpectedly passed: ${label}" + printf 'UNEXPECTED pass: %s\n' "$label" + sed 's/^/ /' "$OUTPUT_FILE" + fi +} + +run_cli_rejection "embodiment-cli/missing-sidecar-value" \ + node "$VALIDATOR" --embodiment-binding \ + "$SUITE_DIR/embodiment-bindings/positive/16-missing-historical-bundle.json" \ + --historical-bundle +run_cli_rejection "embodiment-cli/unknown-sidecar-option" \ + node "$VALIDATOR" --embodiment-binding \ + "$SUITE_DIR/embodiment-bindings/positive/15-revocation-after-commit.json" \ + --historical-bundle "$SUITE_DIR/embodiment-bindings/bundles/15-revocation-after-commit.json" \ + --trusted-ledger "$SUITE_DIR/embodiment-bindings/ledgers/15-revocation-after-commit.json" \ + --post-commit-revokation "$SUITE_DIR/embodiment-bindings/revocations/15-revocation-after-commit.json" + +printf '\n' + audit_records_status="READY" if ! node "$ROOT_DIR/validators/check-audit-records.js"; then audit_records_status="BROKEN" diff --git a/validators/README.md b/validators/README.md index 5482c18..b287689 100644 --- a/validators/README.md +++ b/validators/README.md @@ -22,6 +22,9 @@ node validators/validate.js --embodiment-binding \ --post-commit-revocation ``` +Embodiment options are parsed strictly. Unknown or duplicate flags, trailing +arguments, and sidecar flags without a value fail closed. + ### Examples ```bash diff --git a/validators/validate.js b/validators/validate.js index 147f80e..a015bbd 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -362,6 +362,8 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge ? at(resolutionSnapshot.cacheObservedAt) : Number.NaN; if (!trustedLedger || !isObject(trustedLedger) || + !Number.isSafeInteger(trustedLedger.generation) || + trustedLedger.generation < 0 || trustedLedger.generation !== resolutionSnapshot.authoritativeLedgerGeneration || trustedLedger.headRevisionId !== familiar.identityRevisionId || trustedLedger.status !== statusAtDecision.status || @@ -882,12 +884,27 @@ ${bold('Exit codes:')} console.error(red(`Error: Binding file not found: ${filePath}`)); process.exit(1); } - const bundleIndex = args.indexOf('--historical-bundle'); - const ledgerIndex = args.indexOf('--trusted-ledger'); - const revocationIndex = args.indexOf('--post-commit-revocation'); - const historicalBundlePath = bundleIndex >= 0 && args[bundleIndex + 1] && path.resolve(args[bundleIndex + 1]); - const trustedLedgerPath = ledgerIndex >= 0 && args[ledgerIndex + 1] && path.resolve(args[ledgerIndex + 1]); - const postCommitRevocationPath = revocationIndex >= 0 && args[revocationIndex + 1] && path.resolve(args[revocationIndex + 1]); + const sidecarOptions = new Map([ + ['--historical-bundle', 'historicalBundlePath'], + ['--trusted-ledger', 'trustedLedgerPath'], + ['--post-commit-revocation', 'postCommitRevocationPath'] + ]); + const parsedOptions = {}; + for (let index = 2; index < args.length; index += 2) { + const option = args[index]; + const property = sidecarOptions.get(option); + const value = args[index + 1]; + if (!property || !value || value.startsWith('--') || parsedOptions[property]) { + console.error(red(`Error: Unknown, duplicate, or valueless embodiment option: ${option}`)); + process.exit(1); + } + parsedOptions[property] = path.resolve(value); + } + const { + historicalBundlePath, + trustedLedgerPath, + postCommitRevocationPath + } = parsedOptions; if (historicalBundlePath && (!fs.existsSync(historicalBundlePath) || !fs.statSync(historicalBundlePath).isFile())) { console.error(red(`Error: Historical bundle file not found: ${historicalBundlePath}`)); process.exit(1); From 198b2b87b84eb4c9a5168a00f1a772025e042c60 Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 05:32:41 -0500 Subject: [PATCH 15/16] docs: define embodiment signature bytes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- rfcs/RFC-0001-familiar-contract.md | 29 +++++++++++++------ .../conformance/embodiment-bindings/README.md | 4 +++ validators/README.md | 4 +++ 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/rfcs/RFC-0001-familiar-contract.md b/rfcs/RFC-0001-familiar-contract.md index 384a166..3e714c5 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -600,19 +600,27 @@ authorize current dispatch. | Withheld because verifier access was denied | no detached bundle | `unavailable` | `authentication` **MUST** be a Node-core-verifiable Ed25519 public-key -attestation: DER/SPKI public key and base64 signature over the hexadecimal -SHA-256 binding digest. The binding digest is calculated from JCS canonical +attestation with a DER/SPKI public key and base64 signature. The binding digest +is the lowercase hexadecimal encoding of SHA-256 over the UTF-8 JCS canonical binding bytes with the entire `integrity` and `authentication` members omitted -(and the redundant commit digest-verification field omitted). No private key -appears in either profile. An invalid encoding or unverifiable signature -**MUST** fail closed. The verifier **MUST** parse the SPKI key and require its -asymmetric key type to be Ed25519; trusting the declared method while accepting -RSA, ECDSA, Ed448, or another key type does not conform. +(and the redundant commit digest-verification field omitted). The Ed25519 +message is the **32 raw digest octets obtained by decoding that 64-character +lowercase hexadecimal digest**, not the UTF-8 bytes of the hexadecimal text. +No private key appears in either profile. An invalid encoding or unverifiable +signature **MUST** fail closed. The verifier **MUST** parse the SPKI key and +require its asymmetric key type to be Ed25519; trusting the declared method +while accepting RSA, ECDSA, Ed448, or another key type does not conform. Lineage predecessors **MUST** name a content-addressed predecessor bundle and an authenticated Ed25519 transition edge that signs its relationship, predecessor digest, successor root/revision, successor bundle digest, and -successor identity-declaration digest. The verifier **MUST** reject a +successor identity-declaration digest. The transition preimage is the JCS +canonical UTF-8 encoding of an object containing exactly those six fields: +`relationship`, `predecessorBundleDigest`, `successorFamiliarRootId`, +`successorIdentityRevisionId`, `successorBundleDigest`, and +`successorDeclarationDigest`. The transition digest is SHA-256 over those +bytes; the Ed25519 message is the 32 raw transition-digest octets. The verifier +**MUST** reject a self-predecessor, repeated/non-monotonic position, root/revision or successor digest mismatch, or relation/root-evidence mismatch. Thus continuation, restoration, fork/new-root, and succession are mechanically—not merely @@ -638,7 +646,10 @@ strictly after commit **MUST NOT** be inserted into or re-sign the immutable binding. It is recorded as a separately signed, append-only `familiar.embodiment_revocation.v1` event that references the exact binding id, binding digest, familiar root, and identity revision, and whose own canonical -event digest is Ed25519-authenticated. Such an event preserves historical +event digest is Ed25519-authenticated. Its preimage is the JCS canonical UTF-8 +encoding of the complete event with `integrity` and `authentication` omitted; +the event digest is SHA-256 over those bytes, and the Ed25519 message is the 32 +raw event-digest octets. Such an event preserves historical evidence while preventing later dispatches. Integrity and authenticated attestation are mandatory, while cryptographic key-policy verification remains the verifier's policy responsibility. diff --git a/tests/conformance/embodiment-bindings/README.md b/tests/conformance/embodiment-bindings/README.md index 4214ead..81f5a92 100644 --- a/tests/conformance/embodiment-bindings/README.md +++ b/tests/conformance/embodiment-bindings/README.md @@ -40,3 +40,7 @@ Post-commit revocation is represented only by a separately signed `familiar.embodiment_revocation.v1` event passed with `--post-commit-revocation`. The event references the immutable binding digest and cannot alter the binding's committed preimage. + +Bindings, lineage transitions, and revocation events sign the 32 raw SHA-256 +digest octets decoded from the lowercase hexadecimal digest. They do not sign +the UTF-8 hexadecimal text. diff --git a/validators/README.md b/validators/README.md index b287689..1a85ca9 100644 --- a/validators/README.md +++ b/validators/README.md @@ -25,6 +25,10 @@ node validators/validate.js --embodiment-binding \ Embodiment options are parsed strictly. Unknown or duplicate flags, trailing arguments, and sidecar flags without a value fail closed. +All profile signatures use Ed25519 over the 32 raw SHA-256 digest octets. The +lowercase hexadecimal digest strings carried in JSON are decoded before +verification; their UTF-8 text is not the signature message. + ### Examples ```bash From 9ffc283c268fa0e1bf9d179e8dde12bfca86fbdb Mon Sep 17 00:00:00 2001 From: Sage Date: Thu, 3 Sep 2026 05:35:42 -0500 Subject: [PATCH 16/16] fix: reject malformed revocation sidecars Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Sage --- CHANGELOG.md | 4 +- .../bundles/62-falsy-null-revocation.json | 62 +++++++++ .../bundles/63-falsy-false-revocation.json | 62 +++++++++ .../bundles/64-falsy-zero-revocation.json | 62 +++++++++ .../65-falsy-empty-string-revocation.json | 62 +++++++++ .../ledgers/62-falsy-null-revocation.json | 6 + .../ledgers/63-falsy-false-revocation.json | 6 + .../ledgers/64-falsy-zero-revocation.json | 6 + .../65-falsy-empty-string-revocation.json | 6 + .../embodiment-bindings/manifest.json | 20 +++ .../negative/62-falsy-null-revocation.json | 125 ++++++++++++++++++ .../negative/63-falsy-false-revocation.json | 125 ++++++++++++++++++ .../negative/64-falsy-zero-revocation.json | 125 ++++++++++++++++++ .../65-falsy-empty-string-revocation.json | 125 ++++++++++++++++++ .../revocations/62-falsy-null-revocation.json | 1 + .../63-falsy-false-revocation.json | 1 + .../revocations/64-falsy-zero-revocation.json | 1 + .../65-falsy-empty-string-revocation.json | 1 + validators/validate.js | 14 +- 19 files changed, 809 insertions(+), 5 deletions(-) create mode 100644 tests/conformance/embodiment-bindings/bundles/62-falsy-null-revocation.json create mode 100644 tests/conformance/embodiment-bindings/bundles/63-falsy-false-revocation.json create mode 100644 tests/conformance/embodiment-bindings/bundles/64-falsy-zero-revocation.json create mode 100644 tests/conformance/embodiment-bindings/bundles/65-falsy-empty-string-revocation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/62-falsy-null-revocation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/63-falsy-false-revocation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/64-falsy-zero-revocation.json create mode 100644 tests/conformance/embodiment-bindings/ledgers/65-falsy-empty-string-revocation.json create mode 100644 tests/conformance/embodiment-bindings/negative/62-falsy-null-revocation.json create mode 100644 tests/conformance/embodiment-bindings/negative/63-falsy-false-revocation.json create mode 100644 tests/conformance/embodiment-bindings/negative/64-falsy-zero-revocation.json create mode 100644 tests/conformance/embodiment-bindings/negative/65-falsy-empty-string-revocation.json create mode 100644 tests/conformance/embodiment-bindings/revocations/62-falsy-null-revocation.json create mode 100644 tests/conformance/embodiment-bindings/revocations/63-falsy-false-revocation.json create mode 100644 tests/conformance/embodiment-bindings/revocations/64-falsy-zero-revocation.json create mode 100644 tests/conformance/embodiment-bindings/revocations/65-falsy-empty-string-revocation.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 2661026..a8e41a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,14 +34,14 @@ This project uses [Semantic Versioning](https://semver.org/). profile versions, rejects non-finite I-JSON numbers and non-Ed25519 keys, and separates post-commit revocation into an immutable-binding-referenced, append-only signed `familiar.embodiment_revocation.v1` event. -- **Embodiment-binding conformance lane** — 22 positive and 61 negative +- **Embodiment-binding conformance lane** — 22 positive and 65 negative vectors covering active and historical revision states, continuation, restoration, fork, succession, direct/automation/Psyche targets, retained and redacted history, privacy authorization, transaction timing, key-type confusion, revocation events, tampering, ambiguity, stale revisions, and malformed data. The runner uses system-temporary output, works from a read-only source checkout, and rejects unknown, duplicate, or valueless - sidecar options. + sidecar options as well as malformed falsy bundle and revocation sidecars. --- diff --git a/tests/conformance/embodiment-bindings/bundles/62-falsy-null-revocation.json b/tests/conformance/embodiment-bindings/bundles/62-falsy-null-revocation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/62-falsy-null-revocation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/63-falsy-false-revocation.json b/tests/conformance/embodiment-bindings/bundles/63-falsy-false-revocation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/63-falsy-false-revocation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/64-falsy-zero-revocation.json b/tests/conformance/embodiment-bindings/bundles/64-falsy-zero-revocation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/64-falsy-zero-revocation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/bundles/65-falsy-empty-string-revocation.json b/tests/conformance/embodiment-bindings/bundles/65-falsy-empty-string-revocation.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/65-falsy-empty-string-revocation.json @@ -0,0 +1,62 @@ +{ + "profile": "familiar.identity_bundle.v1", + "canonicalization": "jcs-rfc8785", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "recordedAt": "2026-09-03T08:00:00Z", + "components": [ + { + "componentId": "identity-declaration", + "mediaType": "application/json", + "content": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "name": "Sage" + }, + "digest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "redactionState": "retained" + }, + { + "componentId": "soul-declaration", + "mediaType": "application/json", + "content": { + "purpose": "Research familiar", + "identityMeaning": "unchanged" + }, + "digest": { + "algorithm": "sha-256", + "value": "30fc8e732377c164fcd1b85f83eee874620973cce5de3bfe6e2f02344adb64ad" + }, + "redactionState": "retained" + }, + { + "componentId": "ward-declaration", + "mediaType": "application/json", + "content": { + "policyVersion": "policy-2026-09" + }, + "digest": { + "algorithm": "sha-256", + "value": "cf8e16b4da166041d4a6cb15437e028d6100f417fac10c45255ee318c6512230" + }, + "redactionState": "retained" + } + ], + "retention": { + "classification": "restricted-historical-identity", + "verifierAccess": "authorized", + "recordedAt": "2026-09-03T08:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested", + "redactionState": "none" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + } +} diff --git a/tests/conformance/embodiment-bindings/ledgers/62-falsy-null-revocation.json b/tests/conformance/embodiment-bindings/ledgers/62-falsy-null-revocation.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/62-falsy-null-revocation.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/63-falsy-false-revocation.json b/tests/conformance/embodiment-bindings/ledgers/63-falsy-false-revocation.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/63-falsy-false-revocation.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/64-falsy-zero-revocation.json b/tests/conformance/embodiment-bindings/ledgers/64-falsy-zero-revocation.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/64-falsy-zero-revocation.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/ledgers/65-falsy-empty-string-revocation.json b/tests/conformance/embodiment-bindings/ledgers/65-falsy-empty-string-revocation.json new file mode 100644 index 0000000..7e32bed --- /dev/null +++ b/tests/conformance/embodiment-bindings/ledgers/65-falsy-empty-string-revocation.json @@ -0,0 +1,6 @@ +{ + "generation": 3, + "headRevisionId": "familiar-revision:oak:3", + "status": "active", + "observedAt": "2026-09-03T09:00:00Z" +} diff --git a/tests/conformance/embodiment-bindings/manifest.json b/tests/conformance/embodiment-bindings/manifest.json index e2edb74..c73aa4a 100644 --- a/tests/conformance/embodiment-bindings/manifest.json +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -417,6 +417,26 @@ "expected": "negative", "file": "61-unsafe-trusted-ledger-generation.json", "errorCode": "E_TRUSTED_LEDGER" + }, + { + "expected": "negative", + "file": "62-falsy-null-revocation.json", + "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "63-falsy-false-revocation.json", + "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "64-falsy-zero-revocation.json", + "errorCode": "E_REVOCATION" + }, + { + "expected": "negative", + "file": "65-falsy-empty-string-revocation.json", + "errorCode": "E_REVOCATION" } ] } diff --git a/tests/conformance/embodiment-bindings/negative/62-falsy-null-revocation.json b/tests/conformance/embodiment-bindings/negative/62-falsy-null-revocation.json new file mode 100644 index 0000000..fab1867 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/62-falsy-null-revocation.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-15-revocation-after-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxuPXVSd0Y2PbUCuLXkxhxYq6eBSE3ynGSiImgav3Ho0=", + "signature": "qincl9bPUysIs99MeNe1564DD17n1pM0DOc2AQmXY+EZlMd5/U7pykQvXGRaP/iLiMJWFeQDXDVw56Q91NYICA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/63-falsy-false-revocation.json b/tests/conformance/embodiment-bindings/negative/63-falsy-false-revocation.json new file mode 100644 index 0000000..fab1867 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/63-falsy-false-revocation.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-15-revocation-after-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxuPXVSd0Y2PbUCuLXkxhxYq6eBSE3ynGSiImgav3Ho0=", + "signature": "qincl9bPUysIs99MeNe1564DD17n1pM0DOc2AQmXY+EZlMd5/U7pykQvXGRaP/iLiMJWFeQDXDVw56Q91NYICA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/64-falsy-zero-revocation.json b/tests/conformance/embodiment-bindings/negative/64-falsy-zero-revocation.json new file mode 100644 index 0000000..fab1867 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/64-falsy-zero-revocation.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-15-revocation-after-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxuPXVSd0Y2PbUCuLXkxhxYq6eBSE3ynGSiImgav3Ho0=", + "signature": "qincl9bPUysIs99MeNe1564DD17n1pM0DOc2AQmXY+EZlMd5/U7pykQvXGRaP/iLiMJWFeQDXDVw56Q91NYICA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/negative/65-falsy-empty-string-revocation.json b/tests/conformance/embodiment-bindings/negative/65-falsy-empty-string-revocation.json new file mode 100644 index 0000000..fab1867 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/65-falsy-empty-string-revocation.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-15-revocation-after-commit", + "familiar": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "lineageEvidence": { + "relationship": "same_familiar_revision", + "rootEvidence": "continued", + "predecessor": { + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:2", + "lineagePosition": 2, + "status": "superseded", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAByZtD1Euajw91B5qCNDsKoyXXeRj1bKoBf7uEy332WI=", + "signature": "aE5s51D51dA3NpCG/bQ3XGOM1DbEHeIw7Tnt6oxFgSB+jQ7hVbfdve2BS0NXkzmtjuFm7ZaHEQcbgunchEVvAg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "revisionRecordedAt": "2026-09-03T08:00:00Z", + "validTime": { + "notBefore": "2026-09-03T08:00:00Z" + }, + "statusAtDecision": { + "status": "active", + "decisionTime": "2026-09-03T09:00:00Z" + }, + "principal": { + "authenticatedPrincipalId": "principal:val", + "projectId": "project:oak", + "scopeId": "scope:build" + }, + "target": { + "targetType": "direct_session", + "targetId": "coven-session:123", + "authenticatedPrincipalId": "principal:val" + }, + "bindingPurpose": "dispatch", + "identityMeaning": "unchanged", + "issuedAt": "2026-09-03T09:00:00Z", + "decisionAt": "2026-09-03T09:00:00Z", + "policyVersion": "policy-2026-09", + "resolver": { + "id": "resolver:directory", + "version": "1.0.0" + }, + "verifier": { + "id": "verifier:authority", + "version": "1.0.0" + }, + "historicalVerification": { + "state": "verified", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxuPXVSd0Y2PbUCuLXkxhxYq6eBSE3ynGSiImgav3Ho0=", + "signature": "qincl9bPUysIs99MeNe1564DD17n1pM0DOc2AQmXY+EZlMd5/U7pykQvXGRaP/iLiMJWFeQDXDVw56Q91NYICA==" + }, + "privacy": { + "classification": "metadata-only", + "retention": "dispatch-audit-minimum", + "containsSensitiveIdentityContent": false, + "recordedAt": "2026-09-03T09:00:00Z", + "tombstoneState": "live", + "replicaPurgeState": "not_requested" + }, + "commit": { + "snapshotId": "snapshot:oak-dispatch-001", + "state": "committed", + "finalValidityCheckAt": "2026-09-03T09:00:00Z", + "committedAt": "2026-09-03T09:00:00Z", + "verifiedBindingDigest": "5bc96e5b529b41e4cf64f1b2399ed384ccfcd6693223f205d4d57217ea39421d" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "bundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "status": "active", + "authoritativeLedgerGeneration": 3, + "authoritativeHeadRevisionId": "familiar-revision:oak:3", + "freshnessBoundSeconds": 300, + "cacheObservedAt": "2026-09-03T09:00:00Z", + "cacheProvenance": "authoritative-read" + } +} diff --git a/tests/conformance/embodiment-bindings/revocations/62-falsy-null-revocation.json b/tests/conformance/embodiment-bindings/revocations/62-falsy-null-revocation.json new file mode 100644 index 0000000..19765bd --- /dev/null +++ b/tests/conformance/embodiment-bindings/revocations/62-falsy-null-revocation.json @@ -0,0 +1 @@ +null diff --git a/tests/conformance/embodiment-bindings/revocations/63-falsy-false-revocation.json b/tests/conformance/embodiment-bindings/revocations/63-falsy-false-revocation.json new file mode 100644 index 0000000..c508d53 --- /dev/null +++ b/tests/conformance/embodiment-bindings/revocations/63-falsy-false-revocation.json @@ -0,0 +1 @@ +false diff --git a/tests/conformance/embodiment-bindings/revocations/64-falsy-zero-revocation.json b/tests/conformance/embodiment-bindings/revocations/64-falsy-zero-revocation.json new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/conformance/embodiment-bindings/revocations/64-falsy-zero-revocation.json @@ -0,0 +1 @@ +0 diff --git a/tests/conformance/embodiment-bindings/revocations/65-falsy-empty-string-revocation.json b/tests/conformance/embodiment-bindings/revocations/65-falsy-empty-string-revocation.json new file mode 100644 index 0000000..e16c76d --- /dev/null +++ b/tests/conformance/embodiment-bindings/revocations/65-falsy-empty-string-revocation.json @@ -0,0 +1 @@ +"" diff --git a/validators/validate.js b/validators/validate.js index a015bbd..a2983b8 100755 --- a/validators/validate.js +++ b/validators/validate.js @@ -244,7 +244,7 @@ function validatePostCommitRevocation(revocation, binding) { return violations; } -function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedger, historicalBundleSupplied = false, postCommitRevocation) { +function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedger, historicalBundleSupplied = false, postCommitRevocation, postCommitRevocationSupplied = false) { const violations = []; if (!isObject(binding)) return [bindingViolation('E_SCHEMA', 'shape', 'An embodiment binding must be one JSON object.')]; if (binding.schemaVersion !== '1.0.0') return [bindingViolation('E_VERSION', 'schemaVersion', 'Only familiar.embodiment_binding.v1 schemaVersion 1.0.0 is supported.')]; @@ -425,7 +425,7 @@ function validateEmbodimentBinding(binding, file, historicalBundle, trustedLedge !isTimestamp(revocation.revokedAt) || at(revocation.revokedAt) > at(binding.decisionAt))) { violations.push(bindingViolation('E_REVOCATION', 'revocation', 'A revision recorded as revoked at decision time requires a before-commit revocation at or before that decision.')); } - if (postCommitRevocation) violations.push(...validatePostCommitRevocation(postCommitRevocation, binding)); + if (postCommitRevocationSupplied) violations.push(...validatePostCommitRevocation(postCommitRevocation, binding)); return violations; } @@ -462,7 +462,15 @@ function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLe return [bindingViolation('E_REVOCATION', 'postCommitRevocation', `JSON syntax violation: ${error.message}`)]; } } - return validateEmbodimentBinding(binding, filePath, historicalBundle, trustedLedger, Boolean(historicalBundlePath), postCommitRevocation); + return validateEmbodimentBinding( + binding, + filePath, + historicalBundle, + trustedLedger, + Boolean(historicalBundlePath), + postCommitRevocation, + Boolean(postCommitRevocationPath) + ); } // ── SOUL.md parser ────────────────────────────────────────────────────────────