diff --git a/CHANGELOG.md b/CHANGELOG.md index c738073..a8e41a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,44 @@ 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. +- **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. +- **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, 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 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 as well as malformed falsy bundle and revocation sidecars. + +--- + ## [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..de23c4f 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,23 @@ 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 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. + **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 +114,8 @@ 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 + 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/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..3e714c5 100644 --- a/rfcs/RFC-0001-familiar-contract.md +++ b/rfcs/RFC-0001-familiar-contract.md @@ -495,6 +495,186 @@ 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. + +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 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 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 +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. + +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 +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. 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. +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. +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 +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. 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 +`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 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). 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 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 +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 +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 +**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. 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. + +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. +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, 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 +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 new file mode 100644 index 0000000..9bf3d3e --- /dev/null +++ b/schemas/familiar-embodiment-binding.schema.json @@ -0,0 +1,161 @@ +{ + "$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", "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": { "const": "1.0.0" }, + "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, "maximum": 9007199254740991 }, + "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", "identityBundleRef", "transition"], + "properties": { + "familiarRootId": { "$ref": "#/definitions/opaqueId" }, + "identityRevisionId": { "$ref": "#/definitions/opaqueId" }, + "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/transition" } + } + } + } + } + } + }, + "resolutionSnapshot": { + "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, "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"] } + } + }, + "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"] } }, + "allOf": [ + { + "if": { "properties": { "readAuthorization": { "const": "not_authorized" } } }, + "then": { "properties": { "state": { "const": "unavailable" } } } + } + ] + }, + "revocation": { + "type": "object", "additionalProperties": false, "required": ["outcome"], + "properties": { "outcome": { "enum": ["none", "before_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": { "$ref": "#/definitions/authentication" }, + "privacy": { + "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\\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" } } + }, + "actor": { + "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}$" } } + } + ,"transition": { + "type": "object", "additionalProperties": false, + "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/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/schemas/familiar-identity-bundle.schema.json b/schemas/familiar-identity-bundle.schema.json new file mode 100644 index 0000000..e1b57c3 --- /dev/null +++ b/schemas/familiar-identity-bundle.schema.json @@ -0,0 +1,110 @@ +{ + "$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", "digest", "redactionState"], + "properties": { + "componentId": { "enum": ["identity-declaration", "soul-declaration", "ward-declaration"] }, + "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" }, + "retention": { + "type": "object", "additionalProperties": false, + "required": ["classification", "verifierAccess", "recordedAt", "tombstoneState", "replicaPurgeState", "redactionState"], + "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 }, + "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": { + "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}$" }, + "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 c64d5c5..3168551 100644 --- a/tests/conformance/README.md +++ b/tests/conformance/README.md @@ -12,3 +12,13 @@ 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. +`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/README.md b/tests/conformance/embodiment-bindings/README.md new file mode 100644 index 0000000..81f5a92 --- /dev/null +++ b/tests/conformance/embodiment-bindings/README.md @@ -0,0 +1,46 @@ +# 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 \ + --historical-bundle path/to/bundle.json \ + --trusted-ledger path/to/ledger.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`. +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. 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. + +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/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..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/01-active-direct.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/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/01-ambiguous-alias.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/02-stale-cached-revision.json b/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/02-stale-cached-revision.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/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/02-unique-alias-resolution.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/03-retired-historical-record.json b/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/03-retired-historical-record.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/03-revoked-revision.json b/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/03-revoked-revision.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/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/04-restoration-with-lineage.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/04-retired-dispatch.json b/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/04-retired-dispatch.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/05-new-revision-same-familiar.json b/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/05-new-revision-same-familiar.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/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/05-principal-mismatch.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/06-fork-new-root.json b/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json new file mode 100644 index 0000000..f617e7a --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/06-fork-new-root.json @@ -0,0 +1,62 @@ +{ + "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" + }, + "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": "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 new file mode 100644 index 0000000..30ac4b9 --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/06-tampered-bundle-digest.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": "Tampered" + }, + "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": "33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226" + } +} 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..b0185ed --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/07-succession.json @@ -0,0 +1,62 @@ +{ + "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" + }, + "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": "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 new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/08-direct-coven-session.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/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/bundles/09-revocation-before-commit.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/09-revocation-before-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/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/09-scheduled-automation-run.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/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/10-scheduled-automation-attempt.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/10-unknown-field.json b/tests/conformance/embodiment-bindings/bundles/10-unknown-field.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/10-unknown-field.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/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/11-psyche-delegated-execution.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/12-tampered-binding-digest.json b/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/12-tampered-binding-digest.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/13-cached-superseded-apparently-active.json b/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/13-cached-superseded-apparently-active.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/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/13-privacy-authorized-historical-read.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/14-unverifiable-authentication.json b/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/14-unverifiable-authentication.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/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/15-lineage-self-predecessor.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/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/bundles/15-revocation-after-commit.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/15-revocation-after-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/16-timezone-missing.json b/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/16-timezone-missing.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/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 new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/17-malformed-calendar-time.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/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/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.json new file mode 100644 index 0000000..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/18-tombstone-without-purge.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/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/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..363a45d --- /dev/null +++ b/tests/conformance/embodiment-bindings/bundles/20-revocation-at-commit-outcome-none.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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 new file mode 100644 index 0000000..c73aa4a --- /dev/null +++ b/tests/conformance/embodiment-bindings/manifest.json @@ -0,0 +1,442 @@ +{ + "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-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 + }, + { + "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": [ + { + "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" + }, + { + "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" + }, + { + "expected": "negative", + "file": "34-stale-trusted-ledger.json", + "errorCode": "E_TRUSTED_LEDGER" + }, + { + "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" + }, + { + "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" + }, + { + "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" + }, + { + "expected": "negative", + "file": "60-rounded-generation-collision.json", + "errorCode": "E_SCHEMA" + }, + { + "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/01-ambiguous-alias.json b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json new file mode 100644 index 0000000..4fe1de8 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/01-ambiguous-alias.json @@ -0,0 +1,133 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAG1fcGmPA8dChCLQ73sVClfVhLqd+mfyCIra7Ju/H55Y=", + "signature": "0eOvJn8PRsrfUPQfHqENXnrpevJ+EcC7bznsPeAUPU23l/gCNl81+Vm615Eh4Vgg+csA3B/8dU/FLuGlcGT0BQ==" + } + } + } + } + }, + "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": "5fde92071e1ceda6e0a3a1fe17662431e95df19de0dae21cedf73388fb7a6fdd" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAG1fcGmPA8dChCLQ73sVClfVhLqd+mfyCIra7Ju/H55Y=", + "signature": "IrZw9cxxztTIrHuFJsMzh7ovn5Qi1Wy67zr40L9HxXYEevtkaEEoP4QQluoXD1avKhk39QKlQOolKS2aXMsLAA==" + }, + "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": "5fde92071e1ceda6e0a3a1fe17662431e95df19de0dae21cedf73388fb7a6fdd" + }, + "aliasResolution": { + "alias": "Sage", + "authoritative": false, + "resolvedRootIds": [ + "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": "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 new file mode 100644 index 0000000..37e10db --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/02-stale-cached-revision.json @@ -0,0 +1,126 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEA5v3EdUg/isNc1zeKwAMyPdlS9T5vxbRsGBkAllfTdNI=", + "signature": "0bzpZLj1RuVs5NiwDdKof7z+EeQpCQ/VAYbZoRsr8HCK2vf7MvHWLsalTyB/pGTEk0QGhV8MXq2nv8KG8gwbAw==" + } + } + } + } + }, + "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: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": "eb83e1cabe7ce0611daa6b67693bf0552f001f83227887319652844c470629b0" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA5v3EdUg/isNc1zeKwAMyPdlS9T5vxbRsGBkAllfTdNI=", + "signature": "ITCqWHmhRXEXhDjjjiZOAeRFIRR4YePudKvI8f2hPf4Etu4zlxLxcjlPyjmFD2yKkcKhSahoGcja7T2t3yS1Bw==" + }, + "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": "eb83e1cabe7ce0611daa6b67693bf0552f001f83227887319652844c470629b0" + }, + "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/03-revoked-revision.json b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json new file mode 100644 index 0000000..e540804 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/03-revoked-revision.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAKMzFT570vGhIhmqDHYS5t/MsO115zptQSdAxVPJWT8Q=", + "signature": "I1cjag9CaW0pbmR36xq7Lbl7PhdsW6zwNs8UVWkpa1ITB+HYqSFTxCzRMBF2QUd5y6++lW3k8FPqb5Wcd0uUBg==" + } + } + } + } + }, + "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": "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": "6d46655f75b8d97a71c21b2af476882a433cda9896e2c01314fc4cbf333144c5" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAKMzFT570vGhIhmqDHYS5t/MsO115zptQSdAxVPJWT8Q=", + "signature": "tilH0yJ6SDzSsWxehrcWFMU+be9022VUrSixNT7RHWkODx4GCkY4AXebdDUoTx6Pc5w/13EFaF+Cqdtv4/1XDQ==" + }, + "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": "6d46655f75b8d97a71c21b2af476882a433cda9896e2c01314fc4cbf333144c5" + }, + "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: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 new file mode 100644 index 0000000..64a3ece --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/04-retired-dispatch.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEACm8e+rdGwHwzd4Vd2azqvhXuQNIux4ZxEff4H193DJo=", + "signature": "i6PFLD/oDq/aKHm1TCcVEly0NcWKzDT0jn/4RRGioP7K97sIz3AQ0dCWhN8xsIQeDLVRVkuvWTv1VS0RQf2ZBQ==" + } + } + } + } + }, + "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": "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": "7e58dbf64cdacdca8f35399b640804bce7225eaf0b4728dec1b26ad98253aee2" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEACm8e+rdGwHwzd4Vd2azqvhXuQNIux4ZxEff4H193DJo=", + "signature": "Qkti/P/jSCKlY8TlH8T6o7sPbgjyQgQBSFpFWmjOXYxJB3OLihnG/5cCMj5wgolGC++iNiZZoYDbeXbdaevDDw==" + }, + "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": "7e58dbf64cdacdca8f35399b640804bce7225eaf0b4728dec1b26ad98253aee2" + }, + "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/05-principal-mismatch.json b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json new file mode 100644 index 0000000..0830511 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/05-principal-mismatch.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAfUFEQEknOaDBZxQpy+vrjj3NWsUhg8qWTVhuy93X/s0=", + "signature": "/fLF8+biIfENhnGrLLaMomjNcjO3XXTARvLjOBr/Pk6AFHcrCffiWYluksfB6pngRAPMeggy57WJ5wkMfJ0fBg==" + } + } + } + } + }, + "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: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": "7f8e5c4ae764b5b1a3ae30683e489dc0e8fd8ccf87c8bb78c47eba8a4be7a4e6" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAfUFEQEknOaDBZxQpy+vrjj3NWsUhg8qWTVhuy93X/s0=", + "signature": "a6PxcKREQaylB+La01FF0p9k2/K/nUscsn75Wad+QOb9dRAxqRJbn0lzxCN2NzNI7MGUCf+G17147kIs8kYUAA==" + }, + "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": "7f8e5c4ae764b5b1a3ae30683e489dc0e8fd8ccf87c8bb78c47eba8a4be7a4e6" + }, + "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/06-tampered-bundle-digest.json b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json new file mode 100644 index 0000000..8e9bc57 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/06-tampered-bundle-digest.json @@ -0,0 +1,125 @@ +{ + "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", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "same_familiar_revision", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALJpWKCFkDoy2e/aiXFhG+EI48bJhwUOAzdFxt+0uCrc=", + "signature": "M2SmIxJ2RBLK+k/Ew6/+nRKZ/p66vsviPf1m+OeUetNaKnE0wZiSA0Neig9af+InFlBLuSg6UsUAGroCcDtMBw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226" + }, + "historicalBundleRef": "urn:sha256:33e7f2d5c7d88d8b0e305ad058b08da24152ef7efd2464d6cc4ede297b787226" + }, + "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": "689dac5e8e93ac4d004ac233fd1eab33b704a56375320227c174f59212e0a63f" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEALJpWKCFkDoy2e/aiXFhG+EI48bJhwUOAzdFxt+0uCrc=", + "signature": "MlPeLoWyY7ZPwXfjbSWFcZtNYtNiEiDkP2X4QZCqlB5FNvf+M8/dxI2LN3F2MstlFMhi+tS0fXW0RFLVVQ8HBA==" + }, + "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": "689dac5e8e93ac4d004ac233fd1eab33b704a56375320227c174f59212e0a63f" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:oak", + "identityRevisionId": "familiar-revision:oak:3", + "lineagePosition": 3, + "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 new file mode 100644 index 0000000..5eed8cf --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/07-degraded-history-dispatch.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEA4W+JjJXBTm/z5r9eLmrJInAXewIBFK1PHdwSq4PhIJc=", + "signature": "yV+K4htyrG2kHohdZ57bmymKZ/WPaeL5ZBzcg2fX2pXkm60rD1vgrZFhYZkK9cgjWUs8kLD2wkujmbyJq7bnBA==" + } + } + } + } + }, + "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": "degraded", + "readAuthorization": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "0cfa78f80da2e6a5a7077ef0660f8457f0f35bc6d37db8d0afc3d4e69de084a7" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA4W+JjJXBTm/z5r9eLmrJInAXewIBFK1PHdwSq4PhIJc=", + "signature": "muY6svzt+67cIqbEi8C99t55cHNyEU72lPK4Mj2Cc22FerztSRDqidvr2GBdlxzHEAcXbQgNDKgouJ3ec4fMDQ==" + }, + "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": "0cfa78f80da2e6a5a7077ef0660f8457f0f35bc6d37db8d0afc3d4e69de084a7" + }, + "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/08-unauthorized-history-dispatch.json b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json new file mode 100644 index 0000000..3d7a631 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/08-unauthorized-history-dispatch.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAIJQOaHnsiBOBOwV3eW+N9O93MiIuohT9IRFMtzlW15g=", + "signature": "uq+jnJXksP+txtaVwRvXas5xHS1HGrMEWKxiti2cccYV+yO+VLwFjUbAKP65228/6Q9VwNPXKXzSvwSDYTkNCQ==" + } + } + } + } + }, + "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": "unavailable", + "readAuthorization": "not_authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "0153e2e4db4f5793061382fc2489ec5a74dd81f82d62eafbdbf853049f346a52" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAIJQOaHnsiBOBOwV3eW+N9O93MiIuohT9IRFMtzlW15g=", + "signature": "jDqqtd+rkCQGVVdo/VUqluVzNDdQpBWxXsMBQ3pZlaTysk7MtnudSU9UJZBp7n9LzgPPzyoQqEZ5sepR/zQMCA==" + }, + "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": "0153e2e4db4f5793061382fc2489ec5a74dd81f82d62eafbdbf853049f346a52" + }, + "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/09-revocation-before-commit.json b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json new file mode 100644 index 0000000..82c74b8 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/09-revocation-before-commit.json @@ -0,0 +1,126 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAyTlkK7fzDPRy9r5zm9jd3EBqEnSFv44ouA/xcotmmG8=", + "signature": "CbwkjxQ/j/yaD5yuHe/79hAOGQGC/IwnnE/gqGEpS+/i4+SGiiGDMBgr8i1KqHzxvio09i44hyzb8UtnU4k2Cg==" + } + } + } + } + }, + "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": "before_commit", + "revokedAt": "2026-09-03T08:59:59Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "97657c6541294c821c444d464dda2237fe46056ae18b34a901057afa2cced19b" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAyTlkK7fzDPRy9r5zm9jd3EBqEnSFv44ouA/xcotmmG8=", + "signature": "LlVWCteeJWwQ/jlt8BpzK5V0WfOh5u+3vDilEfH/hVCD7ziWmY+/f+Taaf6SsrLg3gKqUm1w0yo1R8KBpzGVDg==" + }, + "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": "97657c6541294c821c444d464dda2237fe46056ae18b34a901057afa2cced19b" + }, + "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/10-unknown-field.json b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json new file mode 100644 index 0000000..0b0a24d --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/10-unknown-field.json @@ -0,0 +1,126 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAOKf95OtbWrc2JecAzzV1NWJs1cGmZX1jb8qTn6BS64I=", + "signature": "XZkUansEi3fFq7oaaRfrFna17yEs8KW0+xRBSvEqoc+rIHQI4BfsR1GGIsfuTwLf1EPPA0xp5yhm6Cw6llvyDQ==" + } + } + } + } + }, + "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": "5b616d35aaf3b985d15f91b0161ae914cece887feb8f64b6793c36a4eb61275e" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAOKf95OtbWrc2JecAzzV1NWJs1cGmZX1jb8qTn6BS64I=", + "signature": "6i2GbVoLaVvddJuMh5quruRm9NY3BCPqV2PWOBfsbUxIUbGY1fAf7ntX/1xoPtGdTR5uYNebuDvFBrL8M6VKDQ==" + }, + "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": "5b616d35aaf3b985d15f91b0161ae914cece887feb8f64b6793c36a4eb61275e" + }, + "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": "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/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..60751bc --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/12-tampered-binding-digest.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAoAellUx3nUhHggfgp8D7sLhL5uRuf719RMmpJkzjWIc=", + "signature": "BOY7fSJ1Yg+e+QGS57odYl8NCrYJYLU+c7xDTJsZKxTbMxY2HVHqsk3Bdedg0r12EhBf0q+0b7jxFT9VjAhkAQ==" + } + } + } + } + }, + "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": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAoAellUx3nUhHggfgp8D7sLhL5uRuf719RMmpJkzjWIc=", + "signature": "y+FDxhRp+zuEWnehT9mINtJ6/RQEoRC/MKsSW+YRv31iwVprH4wN2XqDebNnG8iCP6G+InCuFXqXJerD/hOMDQ==" + }, + "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": "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": "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 new file mode 100644 index 0000000..3f6b81a --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/13-cached-superseded-apparently-active.json @@ -0,0 +1,125 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEAxSPTjFvOTPZ4KxIZHzvYiX/ENuhM7kscWHLPf9MdjWU=", + "signature": "tm5YprVuKWOde+e5Zm8PI4Nht0mkyvO1XS4BR6mBdABluGTh2XS8mpPgpZqv/5fRRyJoVIt9IW9FT71pVTeFDA==" + } + } + } + } + }, + "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": "321bf8108f586c26b663c77f3c019411bcb63cf5942b95fb9d616aa538ababd1" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxSPTjFvOTPZ4KxIZHzvYiX/ENuhM7kscWHLPf9MdjWU=", + "signature": "oSR2w5sRqm4MQvXsTqsjasjazUXqBKbBZ4EsXMhfOD+bcyJAyIxnklvzjHxcGKTIIZD5Frbrs70dcaNHmNPVBg==" + }, + "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": "321bf8108f586c26b663c77f3c019411bcb63cf5942b95fb9d616aa538ababd1" + }, + "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: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 new file mode 100644 index 0000000..d3be55c --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/14-unverifiable-authentication.json @@ -0,0 +1,125 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEAEAciDQCka+m1zH8BLn3RAK8v/peMIm9hfTtDzYmsxZk=", + "signature": "oxAwCobLm4EfniccxIyaKumJvAax7i5tDLGJZ96j9xjFy+SEEpFvs2gByQ5HwBaaG8kiIs2aOyJgep6Fhs2oCw==" + } + } + } + } + }, + "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": "dc3c3084c4663b5b1fec1cb11c1b7f4875997fb535511113c5edd30854d81f72" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAEAciDQCka+m1zH8BLn3RAK8v/peMIm9hfTtDzYmsxZk=", + "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": "dc3c3084c4663b5b1fec1cb11c1b7f4875997fb535511113c5edd30854d81f72" + }, + "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/15-lineage-self-predecessor.json b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json new file mode 100644 index 0000000..0c1e033 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/15-lineage-self-predecessor.json @@ -0,0 +1,125 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEA7jaVbMDKif8m/cS2sjwqj8Fq93g4lTIWLsC+Qjax7WU=", + "signature": "NNLPwrm/IfHB0u5Pghyk/oNelZovROxXdGgP0Yz1ceILDw75kJ3cQEidYyv2VqfaTbeuenxt9gD7NUCK1qBwDg==" + } + } + } + } + }, + "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": "75c3f299947bc3d0a97527b7c4685a506b36836931b72619b2051592a0b8cd62" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA7jaVbMDKif8m/cS2sjwqj8Fq93g4lTIWLsC+Qjax7WU=", + "signature": "wGR8E7U1A64ILujGLH5s9h6ACqkJQIPwI53Hf1TizYa9Tb9gi4NLsSarERyP+eP9eMASOVQy6qBq6SC9qSdVDg==" + }, + "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": "75c3f299947bc3d0a97527b7c4685a506b36836931b72619b2051592a0b8cd62" + }, + "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/16-timezone-missing.json b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json new file mode 100644 index 0000000..c758648 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/16-timezone-missing.json @@ -0,0 +1,125 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEA4mlWX1saPgHzcDBF9pxuKikhjdHAJXcm1MpIxWEZ31M=", + "signature": "muttnZygZOLpRhYaLQpBMw6v+wzKOV0qHv6160iBo0IrC6jebZ7AcZoB897S2E84Eu10uMFoZ+d6qVvYXhiGDA==" + } + } + } + } + }, + "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: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": "c1e51cd20a48dc34975016bb1a16bc89c2f29733e1f8fba6d393b8621f77932c" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA4mlWX1saPgHzcDBF9pxuKikhjdHAJXcm1MpIxWEZ31M=", + "signature": "aA6IXcX1K3vrMgmVE9JWQMS0FimGAPFxF5xwq/Oi+ozq74yX+/tKN7GjqL+4Z6G/hzKmVsKfTzwmZc72SzSSAw==" + }, + "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": "c1e51cd20a48dc34975016bb1a16bc89c2f29733e1f8fba6d393b8621f77932c" + }, + "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/17-malformed-calendar-time.json b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json new file mode 100644 index 0000000..2fba6d0 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/17-malformed-calendar-time.json @@ -0,0 +1,125 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEABj21Zm9we7tIitPzeShI7prb2mslt/ZM5mLlURHLw7k=", + "signature": "hWnNOU2+PA9YNWfJR3zuG5KHWmBQWHFh+bq1fvd+891RZtRlBNgwvq4k+aXEAD4XzAx990ztiPVIvOCi8yvADg==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "historicalBundleRef": "urn:sha256:d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8" + }, + "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": "f3f3ca0f7eab1ee4e2509cb154d527f0bdcba3c71ce02beee8b1f46e33027744" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEABj21Zm9we7tIitPzeShI7prb2mslt/ZM5mLlURHLw7k=", + "signature": "nhNAOCO5ydfCv3OZ3tg5cxqbi+Zlqzc/mdYLiPcktjgGn2/67WI2pTAy4SWtZz5GhozSk+HP1etT0qexfNs4BQ==" + }, + "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": "f3f3ca0f7eab1ee4e2509cb154d527f0bdcba3c71ce02beee8b1f46e33027744" + }, + "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/18-tombstone-without-purge.json b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json new file mode 100644 index 0000000..d823861 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/18-tombstone-without-purge.json @@ -0,0 +1,125 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEA2RY7n1awiISCt2fWCCAvr1BViGLNOqlD/vLUF/U19Hs=", + "signature": "jXD/Ltrdtr4JUDRD/xbXDdIiD6fQUf8Fztiw+JazWv9+cm3uMIqVM0jvMIQDfCKy1zkpjTmm70JOcbNjbXNqCA==" + } + } + } + } + }, + "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": "0795cf4e014c8c64b44761184825bd0cef786ce278e7c22bfc9d822ac99ae83f" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA2RY7n1awiISCt2fWCCAvr1BViGLNOqlD/vLUF/U19Hs=", + "signature": "ORmbW06+5pVbvHfa6loRcdT4JnX5iPf6Te3edy5jI27hQ0yrff56v4HeOXFN1Ehew4H1fu5Sdu+eE5dYwEoYCw==" + }, + "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": "0795cf4e014c8c64b44761184825bd0cef786ce278e7c22bfc9d822ac99ae83f" + }, + "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/19-verified-history-missing-bundle.json b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json new file mode 100644 index 0000000..5727c4d --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/19-verified-history-missing-bundle.json @@ -0,0 +1,125 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEAczsiveLtHIJ6IfNcAGzOPm1UPApwX0DOaLv/p7IYtKg=", + "signature": "lneojFM0EHPK4VFHKvSOt/xY1o/HF52rN6V6VDVkxpa0mpGEyPd4J9jR6otaxfns3C6gODXYNo1OnpdCsKZmDQ==" + } + } + } + } + }, + "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": "8dafb543a710833c5c3056171c17a06c5841be342df034d66858fc9440bb9275" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAczsiveLtHIJ6IfNcAGzOPm1UPApwX0DOaLv/p7IYtKg=", + "signature": "sqSZqmECdCQVsHRTKfkfFnQdCFElOAuhde6o2blew2IHs7xkcEzsR1YyMRaEmz/60MCAzzfQEr214+LJWUKzBA==" + }, + "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": "8dafb543a710833c5c3056171c17a06c5841be342df034d66858fc9440bb9275" + }, + "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/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..5673249 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/20-revocation-at-commit-outcome-none.json @@ -0,0 +1,126 @@ +{ + "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": { + "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": "MCowBQYDK2VwAyEAXJ0fwapn5NgcoBLiO9eIb3kPKQmjfvV6qFW4HV5WOgY=", + "signature": "XK/PmN1t2/QufRFps4GhumeHrBcPkO52842Z5sw8uNIddOrO6DhXRez3IH9rLCyvwM4QFeK23wWgoTdagjUuBg==" + } + } + } + } + }, + "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", + "revokedAt": "2026-09-03T09:00:00Z" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "37e3a9e2e91bed7b1d6a2efdadab8a7158f08c2b06946cada558bd77f1ab3af7" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAXJ0fwapn5NgcoBLiO9eIb3kPKQmjfvV6qFW4HV5WOgY=", + "signature": "8xWAtM16LVDd3a2Kuh3tjn/xeH256PPHd1Eac8j+1H9SGdwTlMjNB9JlmU59/Ipx/nNB0lXunbJu/7KO0sQhAA==" + }, + "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": "37e3a9e2e91bed7b1d6a2efdadab8a7158f08c2b06946cada558bd77f1ab3af7" + }, + "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/21-stale-active-cache.json b/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json new file mode 100644 index 0000000..988d21f --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/21-stale-active-cache.json @@ -0,0 +1,125 @@ +{ + "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", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAaRQtDaZIiN1wN0mBhoNr3brAELv2X44UqA/lRFQm+Pw=", + "signature": "xX5TgearLVNJVYqZJ4ja9ubI30amAFIAgGQ/aoxvrOSaO1dB68QbPWO4/s2Zd+qvhn2PaWS84t4KW1HDir+JBQ==" + } + } + } + } + }, + "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": "d32024b6fdde2bdf072310436ad5e9eac3fcec3dcbb9bd63f05cdacb5809c411" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAaRQtDaZIiN1wN0mBhoNr3brAELv2X44UqA/lRFQm+Pw=", + "signature": "WDG20PQ1z68D/rrx/NRLu6tQoCzjR8T+YxwbV5Gi6yIfm+41/c8cYQwFcff1h92nr5qW6dtn0zOv1A15HJzbCg==" + }, + "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": "d32024b6fdde2bdf072310436ad5e9eac3fcec3dcbb9bd63f05cdacb5809c411" + }, + "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..df694cf --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/23-unknown-schema-version.json @@ -0,0 +1,125 @@ +{ + "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", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA89qcJfk52UCTgrJZPL6MTr7s2YPDkjZPFZmXlofdvyE=", + "signature": "lRi9Ng5Ot7+nl1Jufww9qcm/U8P9oXHzyvadpYMss8XgpCLOu1hPQFJXEatGeVAoXVNKFDudpi7YWtn7kc2hBA==" + } + } + } + } + }, + "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": "82861f79d7590474f61efc3b68647204e08d18aefb57b187d80593cdde135f99" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA89qcJfk52UCTgrJZPL6MTr7s2YPDkjZPFZmXlofdvyE=", + "signature": "Qjx4+26two9zKFbHKBANW2P2KEiWyuUWAvNeIskv43VRHWMPvp7Qv7pyAgOE13itbykTpWG6EEC4wa0A6CEHDQ==" + }, + "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": "82861f79d7590474f61efc3b68647204e08d18aefb57b187d80593cdde135f99" + }, + "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..3a6776f --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/24-redacted-verified-history.json @@ -0,0 +1,125 @@ +{ + "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", + "successorBundleDigest": "d8bf5ff8d456eee731fd272fd30c4efc5210055e642290c80ec2dad3bc905bba", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAQvUgbr5SFIy9NVgrOQKUq6p5J9OhjjH6rmQ2MnAwRLk=", + "signature": "bg9HYr9Ue50om9EbfGBUh2rtnT65FAA7Fz9GTOCVWNReqa9P9Z+QXLjZZmd38cbufMsZB009e6GT8TNLATPoAA==" + } + } + } + } + }, + "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": "52a5ab76e520974ebf7eb042955f45473be8dffefd55f66f378180a10b5b84e9" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAQvUgbr5SFIy9NVgrOQKUq6p5J9OhjjH6rmQ2MnAwRLk=", + "signature": "8O4V8qb3f8pf0L6MeBqDOya16/XVS+Y4OCAGyWU/pSqy+Ws1yvBjm/ZPHd11baRb87FmML7OBpuMolXFj2O3BQ==" + }, + "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": "52a5ab76e520974ebf7eb042955f45473be8dffefd55f66f378180a10b5b84e9" + }, + "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/negative/25-enlarged-stale-cache.json b/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json new file mode 100644 index 0000000..4aec187 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/25-enlarged-stale-cache.json @@ -0,0 +1,125 @@ +{ + "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", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxHOVCWvxMT+ptm4Z7v+Psonw5rx95rZSx4yeXIXrOp4=", + "signature": "8TEo0vrk4BLLgl444GYSGStzYYjMvr6bKKIwJ62Q/csrYTXA9H72hZMXiWqyUoBRo8+5TNa1A+/5DOE/cf8bCw==" + } + } + } + } + }, + "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": "4cac8ecbbd7d2d45117059f3402bb374fb95186654e08e0dad96af1a358524c9" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAxHOVCWvxMT+ptm4Z7v+Psonw5rx95rZSx4yeXIXrOp4=", + "signature": "HV0wFAFZB503P7nTp8x1PN2FEYrj1o1nn6Qv+DACvf9fszEWihwnWWMY8upMMjPlIrLlakjDysEZSQcyGbyCDQ==" + }, + "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": "4cac8ecbbd7d2d45117059f3402bb374fb95186654e08e0dad96af1a358524c9" + }, + "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..22e7972 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/26-future-cache-observation.json @@ -0,0 +1,125 @@ +{ + "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", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAdvKVd7Vt0XZ5oAq90vEJJ+gkA9+Kg0NlNtWE4MY4oqw=", + "signature": "8rnW+ZdWzHgbSLbkusEjit4TzjC5TV6suDSEojAMo6g5kX8rZzqzpH/msTHcArT926r6Bui7Vv+JXY0/P7B1Aw==" + } + } + } + } + }, + "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": "7d799aa2589b95b51aa94ea2b8b21d39c3dc68411630585a252be6e9a085135a" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAdvKVd7Vt0XZ5oAq90vEJJ+gkA9+Kg0NlNtWE4MY4oqw=", + "signature": "SfB2KhauD3c40Kg8IIK4S0ofV+9ESNuyZPJt0SPh8saxuJCrAhGT0yGuacWV/RW4Y6mY4lAASerD1I5ObemPBg==" + }, + "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": "7d799aa2589b95b51aa94ea2b8b21d39c3dc68411630585a252be6e9a085135a" + }, + "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..5984166 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/27-lone-surrogate.json @@ -0,0 +1,125 @@ +{ + "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", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAb0ha0Kuy3JFBnJ6Dx7fvHmrODaGL1YBW1i7n9pHJehY=", + "signature": "9P8eHnb1bMYpsRSRy44DZ4Ft+z5awBe/TUGKTa4jW5lMuz98QdHly+qJ0cpy4gt+txkFO7Q4zz1DpZKSlIcSCQ==" + } + } + } + } + }, + "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": "1a6762e458c1c1862de583217958452ee95f077ad679fbc87360ab834d851516" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAb0ha0Kuy3JFBnJ6Dx7fvHmrODaGL1YBW1i7n9pHJehY=", + "signature": "Xb3kB9LOAJQjwTvLoIOUlB4cIrPIuGG9RADB7garFneSTeFfRVoqO5EnaFzJ5HxtDexisaalNstGJ7A4XEmpBg==" + }, + "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": "1a6762e458c1c1862de583217958452ee95f077ad679fbc87360ab834d851516" + }, + "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..0d9fd94 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/28-erased-content-verified.json @@ -0,0 +1,125 @@ +{ + "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", + "successorBundleDigest": "1c42e70843e959c5edba65f7c0f4c96f5d892e6f62f7702ee608acc42d52d74f", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEADYQEktSjgnVE1BOXmm76jN+1DAKs3J0g1VWmEQ7gSLQ=", + "signature": "7U7Ti5atuZC57V6k+gAjrZ+LQyP8oN8IN/6WBkv4KSMDjz5C9PlCz3dKGJ4tnKPBI8VYbe96an/b1DYJu3yzBg==" + } + } + } + } + }, + "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": "8c27ae523d473aa995eaef9cdb64dd7c5520cdc0b4c704df24792ce83b9bb053" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEADYQEktSjgnVE1BOXmm76jN+1DAKs3J0g1VWmEQ7gSLQ=", + "signature": "YcUE0dsIv1uVSKVTdrSoIlKwy5+pOs2e+3z6FQldEvjKMV3wxVu3ckIiTzKBke8bR6gn05AF6acsexSLZ35YDw==" + }, + "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": "8c27ae523d473aa995eaef9cdb64dd7c5520cdc0b4c704df24792ce83b9bb053" + }, + "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/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" + } +} 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/negative/33-missing-unverifiable.json b/tests/conformance/embodiment-bindings/negative/33-missing-unverifiable.json new file mode 100644 index 0000000..86875c1 --- /dev/null +++ b/tests/conformance/embodiment-bindings/negative/33-missing-unverifiable.json @@ -0,0 +1,125 @@ +{ + "profile": "familiar.embodiment_binding.v1", + "schemaVersion": "1.0.0", + "bindingId": "binding-33-missing-unverifiable", + "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": "unverifiable", + "readAuthorization": "not_requested" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "6e14bd042827154421cf1ec4c4a211a8f236b35b6fd14be22d5822b7d16a7c2f" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEANNWKkwY1EDwoGtFcolqkQPuUHOU9oeKC/Hie9Thb/Us=", + "signature": "SnFa8FU/T/dEYHThRI0lj06WrO2MhPYciwOYo2/wdnYvmE8GF0Egs/YwOEj9qKiQi/fyKW5DZ9Ewpvs5rN8uCw==" + }, + "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": "6e14bd042827154421cf1ec4c4a211a8f236b35b6fd14be22d5822b7d16a7c2f" + }, + "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/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/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/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/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/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/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/positive/01-active-direct.json b/tests/conformance/embodiment-bindings/positive/01-active-direct.json new file mode 100644 index 0000000..bb4102c --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/01-active-direct.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/positive/02-unique-alias-resolution.json b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json new file mode 100644 index 0000000..ceb3a0e --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/02-unique-alias-resolution.json @@ -0,0 +1,132 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAaY6C1CvA4C9ilBjq99loWS4KkgcKMucxF6eBBzHttYk=", + "signature": "scLMKJj0w2Kn9JtqlPAwodkOFGzbnkxGiDesRQFAo9YdoNv1oTQ/ih+LXkNq/2ApCrZ7dDb+FjKSm7pGAjuKCA==" + } + } + } + } + }, + "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": "f85571c5eb1f832c21dfe56b428882363c57d5fab735d702ba82fdf6c7e79a47" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAaY6C1CvA4C9ilBjq99loWS4KkgcKMucxF6eBBzHttYk=", + "signature": "9JCTtvA33XjK4NTeVW14B0ThO+drTiXBeebPrEe9qMRg92+6QDKBxGE28/Mkwhp8QTwCrj/k5upk5/9FIDkqBg==" + }, + "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": "f85571c5eb1f832c21dfe56b428882363c57d5fab735d702ba82fdf6c7e79a47" + }, + "aliasResolution": { + "alias": "Sage", + "authoritative": false, + "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": "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 new file mode 100644 index 0000000..c9f4115 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/03-retired-historical-record.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "af139c169c7e28dfa453384ae133acded1462469b87b42334337065ee165b12f" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAC5rjZ9EJ//+LyEaV2xILs6J07MfVz1yV/xRKGsAEZq0=", + "signature": "yJraTL300+/NSQ1BkVidj75TEFvJChKKJKqPQeh383sT1i+xGqOxuzIY+wPfHMgMQYZO5ygiHgE+wwB/7ilBDw==" + }, + "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": "af139c169c7e28dfa453384ae133acded1462469b87b42334337065ee165b12f" + }, + "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/04-restoration-with-lineage.json b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json new file mode 100644 index 0000000..4036398 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/04-restoration-with-lineage.json @@ -0,0 +1,125 @@ +{ + "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", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "restoration", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:oak", + "successorIdentityRevisionId": "familiar-revision:oak:3", + "successorBundleDigest": "d048ee8d8081f7efce5b98a26565c6745f4ffc1dd72e107239e1e9b8df55c9c8", + "successorDeclarationDigest": "8392e679b9e15102cac7593352a44ccf8bcf76421f2546e3e2eb29ab1e1e6dd6", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEACcBCd+t6AZJD0x0yID7srZ7AhFjAM4+9Mh+col4e75Q=", + "signature": "4niJv3fOCe7nZt2AdMSl0+4O6vczDNjkBnr2X1FEEgLE0rP7NRXmZa8O6e9Cnsc6Qpo4AaZ86Sq0icLEXvpeAA==" + } + } + } + } + }, + "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": "519c566b2d70d792f4a01e8d5abdffc1f1fad1d2024549e28b9a43b3416c671e" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEACcBCd+t6AZJD0x0yID7srZ7AhFjAM4+9Mh+col4e75Q=", + "signature": "3ixXOUp8UT09amkB9W1aHW51t/1jTLUahOaub6yNbkxgMPEAXiEycTltGK/s2jqGKW5OBjXlzYUwGl5k4wXkCA==" + }, + "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": "519c566b2d70d792f4a01e8d5abdffc1f1fad1d2024549e28b9a43b3416c671e" + }, + "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/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..47f4e56 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/05-new-revision-same-familiar.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "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": "c41187cf140b5c4ea96b962553bbb8742d831bca3505bc7d3724bf73e420df50" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAOBKGjkSdpgzbWc8oVu52nTlVjTbwSUefmojVgDY3lXA=", + "signature": "NzK4LbDghVGwmKRV/zaLeOoRPYwWLuwRFGbes/zuE5fJrpcU6Lg4qVLjCaNaRyKhgAF123mbz7k7NxKmD6H9Ag==" + }, + "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": "c41187cf140b5c4ea96b962553bbb8742d831bca3505bc7d3724bf73e420df50" + }, + "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/positive/06-fork-new-root.json b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json new file mode 100644 index 0000000..5597c13 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/06-fork-new-root.json @@ -0,0 +1,125 @@ +{ + "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", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "fork_new_root", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:maple", + "successorIdentityRevisionId": "familiar-revision:maple:0", + "successorBundleDigest": "06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534", + "successorDeclarationDigest": "e97cb110eb3ded123930545fe90cb20ce705c61419aa11f5a23f7f447e4ed079", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA0NH1jPkhEeIrCGHIVKXohcKiEdCYHvl+O7e0LK4nSy8=", + "signature": "QZfNAe9guSXJUeaUXx0v7jnePSI78a4H+uURE46ahPJOo54RfbFsVc/mMjmJyqLtDNFSozbPZPfURveMbRdRBw==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "e97cb110eb3ded123930545fe90cb20ce705c61419aa11f5a23f7f447e4ed079" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534" + }, + "historicalBundleRef": "urn:sha256:06332d1e0d74cd50abfceca1594b2b3dcd03a0d27d25f3393c247d54a3f01534" + }, + "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": "77524669665b06d8212156ba86418d848b1c5d98a5e6aa1be26d265d5a36d279" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA0NH1jPkhEeIrCGHIVKXohcKiEdCYHvl+O7e0LK4nSy8=", + "signature": "BViS0OgX2BJHeaUuHjMseOrhV1fmbfmWZniMCvY+RxLfkAK8qYagLggr21J5ToihHahdPff+ts+E4cl3qeYjDA==" + }, + "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": "77524669665b06d8212156ba86418d848b1c5d98a5e6aa1be26d265d5a36d279" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:maple", + "identityRevisionId": "familiar-revision:maple:0", + "lineagePosition": 0, + "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 new file mode 100644 index 0000000..5aeaf87 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/07-succession.json @@ -0,0 +1,125 @@ +{ + "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", + "identityBundleRef": "urn:sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "transition": { + "relationship": "succession", + "predecessorBundleDigest": "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "successorFamiliarRootId": "familiar-root:willow", + "successorIdentityRevisionId": "familiar-revision:willow:0", + "successorBundleDigest": "19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291", + "successorDeclarationDigest": "b4ce2e6913e66f082a0974207a12067ca850b0585fbc8ae8abc2d39a57d39504", + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAjRelodI9UZ0ABaXMvcn/LkvIAsdfBlrvVFUSq0zx2W0=", + "signature": "kREqEih/JCPfmae0M0DsXGR+yGBp5tAFyyYTlIogY57aFsTS9y4lZxMxhxDPoi2onYl1YCjOtxnRaM/5u+VgAA==" + } + } + } + } + }, + "identityBundle": { + "canonicalization": "jcs-rfc8785", + "declarationDigest": { + "algorithm": "sha-256", + "value": "b4ce2e6913e66f082a0974207a12067ca850b0585fbc8ae8abc2d39a57d39504" + }, + "bundleDigest": { + "algorithm": "sha-256", + "value": "19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291" + }, + "historicalBundleRef": "urn:sha256:19ee0a8cdf41c5659311b5fd5c774442028b23f889fdd9579167e1bb85994291" + }, + "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": "cf6ae57ea0ffa861c2f002065bf3ce9cb17824bafca408285cc1f79dd2cb34c0" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAjRelodI9UZ0ABaXMvcn/LkvIAsdfBlrvVFUSq0zx2W0=", + "signature": "J65FYcFECSRYlgBz7+lW+k9DDLuSrrfR+lHRZZOkYd8P2ciqgMbr5E5N46f7M0mhuqLKO3RrAhqesOfmmABsDg==" + }, + "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": "cf6ae57ea0ffa861c2f002065bf3ce9cb17824bafca408285cc1f79dd2cb34c0" + }, + "resolutionSnapshot": { + "snapshotId": "snapshot:oak-dispatch-001", + "resolvedAt": "2026-09-03T09:00:00Z", + "familiarRootId": "familiar-root:willow", + "identityRevisionId": "familiar-revision:willow:0", + "lineagePosition": 0, + "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 new file mode 100644 index 0000000..13398a1 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/08-direct-coven-session.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEA+6zKoYB0C6wlGwhULZz0MAyxCLU9pSq/gtGg35LZdqU=", + "signature": "L0ZyQOdTwV5j0i5WVdwuK7JMrVd951SUeP3KtOFX2tsUSsKDtnzaGSzCVKIZ8D3+QJDfdMawfJe/faTXd4JXAg==" + } + } + } + } + }, + "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: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": "d314680598d007084f0ce514b0907e73dd6ec3a2b8b4a2a6228414df5306af47" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEA+6zKoYB0C6wlGwhULZz0MAyxCLU9pSq/gtGg35LZdqU=", + "signature": "TaSzuUf1QfGs71vdox9uNn42cbx2IlBHTCbjO4dk/Os+4gj8McbHGCW51sEO4GAMTyKO39WZnZZiexAzoexzAQ==" + }, + "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": "d314680598d007084f0ce514b0907e73dd6ec3a2b8b4a2a6228414df5306af47" + }, + "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/positive/09-scheduled-automation-run.json b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json new file mode 100644 index 0000000..cc0061d --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/09-scheduled-automation-run.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAgqTdMpEstGgDIRhC7EEK91Hthd/YatmHf4xlLz8ylIQ=", + "signature": "EqBUqsRJ2ETK420vQu6eLh9JpxBW+QQLrxzeUe07jSEgI8qGowWBb17hhrJopJifO1WS6TifZjw3zTU75GCXAg==" + } + } + } + } + }, + "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": "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": "3fd824ae4c68fb524cce9941268b12642f615e29241d15ef6c96046ad93fa473" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAgqTdMpEstGgDIRhC7EEK91Hthd/YatmHf4xlLz8ylIQ=", + "signature": "7Li0bSTx0jKDDiD35TJ6CFtdGnXtirLqbB/Inm1FFBeiyWU8i8+Je+BZWc9Cuz4zKbHZkTjPI2KpTyRC0AMvCg==" + }, + "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": "3fd824ae4c68fb524cce9941268b12642f615e29241d15ef6c96046ad93fa473" + }, + "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/positive/10-scheduled-automation-attempt.json b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json new file mode 100644 index 0000000..6628193 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/10-scheduled-automation-attempt.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAf84T9ceTGy8cE9zeYQC6afxKtV3jn5Sk8/Grknkml18=", + "signature": "E2gHUJHTjG9noqnrpA7Z9tc1A4/kjxqGEIVaRlEjgsGsnnrKwbE94KRAFhqBaGYsTdr06EfM73NevL0DOZs6Aw==" + } + } + } + } + }, + "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": "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": "986374294e207333628e3924622121e257972e868f5107cf36304a7587724d33" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAf84T9ceTGy8cE9zeYQC6afxKtV3jn5Sk8/Grknkml18=", + "signature": "q2rQFeCIFRkMhBKsa6AmPfkhQpQkkbToaW9VEAQTNjimJKOAO0mWrCCjqK4BUcwg44Stqk+FA4Me5UcS844tCg==" + }, + "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": "986374294e207333628e3924622121e257972e868f5107cf36304a7587724d33" + }, + "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/positive/11-psyche-delegated-execution.json b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json new file mode 100644 index 0000000..93ca161 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/11-psyche-delegated-execution.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAdxtgMKoCtBqZ45IQnKwmxpngZ7QZIc/K5DggWbTIaHg=", + "signature": "W6JD6MmPzveg6C0bxUZD1j9KNQLwidYHq5495K+3fagOUgVe7w0t0/qA0eziEcsBJZCvtb257bTp9y7Bjt9hDA==" + } + } + } + } + }, + "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": "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": "fae0263a1e9b6a47cad090c611cc0c9cda792b28e14a111960ba56694033aec7" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAdxtgMKoCtBqZ45IQnKwmxpngZ7QZIc/K5DggWbTIaHg=", + "signature": "88kqvMQmtJtn9OZsoSMQa1YbQnt8r5fGBrEFy86/r1ho+3B4K9hx825q21ReYfskzWOwE0k4ob852PP1BCSdDg==" + }, + "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": "fae0263a1e9b6a47cad090c611cc0c9cda792b28e14a111960ba56694033aec7" + }, + "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/positive/12-degraded-historical-bundle.json b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json new file mode 100644 index 0000000..4b282dd --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/12-degraded-historical-bundle.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAgU6K1VzRI2GDA47fspmVkFSZqG8UdAT2074D34ajbQ4=", + "signature": "6IHl8s59/M9P8VamxW3tI8tT1mc5mrdOGZHkZE7Ig7OscjqX1mCi+vwM8RLtUrOD+kDo5Ekc9onwZTrRTrxHBw==" + } + } + } + } + }, + "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": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "1f680da15b8ac1128ae090f4a1bc911b4ae35bf99a49fe4909b5233c649b5a6e" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAgU6K1VzRI2GDA47fspmVkFSZqG8UdAT2074D34ajbQ4=", + "signature": "sztru0z76aRIo3IAnIhj4NxhP+tcWa95oIfIH4euus6tEVKBjVyoX4W4x6AiZczNYTYCJAKxBAH6rQvfqBiEDQ==" + }, + "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": "1f680da15b8ac1128ae090f4a1bc911b4ae35bf99a49fe4909b5233c649b5a6e" + }, + "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/13-privacy-authorized-historical-read.json b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json new file mode 100644 index 0000000..6d87cb5 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/13-privacy-authorized-historical-read.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAGRi7PE/DtvbWDpuOCjzRgfAP+Xcy2dpGiLZEZiJMmdA=", + "signature": "qn80Bt0Ulk/1/qrmdo59ilqbyDxbDEWY/AxM4o8oPggX8Fv6f6nZEOZoWVGzGZa2xSGey6uozdEYCeL2kt9IAg==" + } + } + } + } + }, + "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": "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": "d817a7ec1f2f1ed34b92d8461cb55e2c92299a85e590febe0bfbcf3c26208e79" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAGRi7PE/DtvbWDpuOCjzRgfAP+Xcy2dpGiLZEZiJMmdA=", + "signature": "l1xD9GdZQ5NDFgr120wLzw74yNlvjYfYoWup/GtXudiErTshktVUF+WtGOUs27ZpS1Kldb2akSIpY2dlSQxxDw==" + }, + "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": "d817a7ec1f2f1ed34b92d8461cb55e2c92299a85e590febe0bfbcf3c26208e79" + }, + "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/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..bf90578 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/14-privacy-unauthorized-read-denied.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "MCowBQYDK2VwAyEAdjIkwbKWps7/Lyf2SdwOEkA6owIkzH6jygtbm89E+34=", + "signature": "9UJVzYic79W6hvs96xCAz1Rh+u+Szgqwvlc/ad/q/pVKQQH0UV0qq8ryTbByKqDl1MhVdUFszqGu0P3UGhglDA==" + } + } + } + } + }, + "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": "unavailable", + "readAuthorization": "not_authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "b91cf30863b83b09a3024a818def64ddb23305e21af374a92a894a8808db0160" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAdjIkwbKWps7/Lyf2SdwOEkA6owIkzH6jygtbm89E+34=", + "signature": "GDUPpjBoQNnY4IEdO+3bXKdGdM7oRlg7Q0rk3Ews8eF+H2Y1jhJBvUH6UBvu6LNvSgUhAlXdEVnxXRghwxo8AA==" + }, + "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": "b91cf30863b83b09a3024a818def64ddb23305e21af374a92a894a8808db0160" + }, + "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/15-revocation-after-commit.json b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.json new file mode 100644 index 0000000..fab1867 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/15-revocation-after-commit.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/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 new file mode 100644 index 0000000..88663d6 --- /dev/null +++ b/tests/conformance/embodiment-bindings/positive/17-erased-redacted-historical.json @@ -0,0 +1,125 @@ +{ + "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", + "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": "authorized" + }, + "revocation": { + "outcome": "none" + }, + "integrity": { + "algorithm": "sha-256", + "canonicalization": "jcs-rfc8785", + "bindingDigest": "cb094611cc4acc10ccb942d290b16ccd97c7b70b44a8adc3a3fdcd1c351084e7" + }, + "authentication": { + "method": "ed25519", + "signerId": "authority:oak", + "publicKey": "MCowBQYDK2VwAyEAH61Mv5nZ15SIbKsWkZAWjXSz980U1BYk4FhaG/mUk9c=", + "signature": "xzT65zbck5hAZ4o8t3bSEBihmLSPEkeEwO3Q/d7gaGt8pMOISsXOTUXPUQdVDtljCzEyaQM7uIcpgY7oI4o9BQ==" + }, + "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": "cb094611cc4acc10ccb942d290b16ccd97c7b70b44a8adc3a3fdcd1c351084e7" + }, + "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/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/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/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/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/tests/conformance/run-conformance.sh b/tests/conformance/run-conformance.sh index 9a1d0a3..d2dd102 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 @@ -11,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 @@ -24,7 +29,7 @@ run_case() { expected=$2 label=$3 - output_file=$(mktemp "${TMPDIR:-/tmp}/familiar-conformance.XXXXXX") + output_file="$OUTPUT_FILE" node "$VALIDATOR" "$case_path" >"$output_file" 2>&1 status=$? @@ -54,7 +59,51 @@ negative expected fail but passed: ${label}" fi fi - rm -f "$output_file" +} + +run_binding_case() { + vector_path=$1 + expected=$2 + label=$3 + expected_code=$4 + + output_file="$OUTPUT_FILE" + bundle_path="$SUITE_DIR/embodiment-bindings/bundles/$(basename "$vector_path")" + ledger_path="$SUITE_DIR/embodiment-bindings/ledgers/$(basename "$vector_path")" + 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 + 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 ] && grep -Fq "[$expected_code]" "$output_file"; 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 + } printf 'Familiar Contract conformance suite\n\n' @@ -73,6 +122,72 @@ done printf '\n' +binding_positive_total=0 +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 + 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 + name=$(basename "$vector_path") + run_binding_case "$vector_path" "fail" "embodiment-bindings/negative/$name" "$(binding_code negative "$name")" +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" @@ -84,6 +199,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..1a85ca9 100644 --- a/validators/README.md +++ b/validators/README.md @@ -11,8 +11,24 @@ 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 \ + --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 ``` +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 @@ -42,6 +58,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 +98,33 @@ 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, non-verified +history used as current authority, principal mismatches, digest tampering, and +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: + +```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. + +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 2f35bde..a2983b8 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,444 @@ 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); +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); +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) { + 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 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); + 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(hasInvalidIJsonValue); + else if (isObject(value)) return Object.entries(value).some(([key, item]) => hasInvalidIJsonValue(key) || hasInvalidIJsonValue(item)); + return false; +} + +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; + delete committed.authentication; + delete committed.commit.verifiedBindingDigest; + 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}))$/); + 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 { + const key = crypto.createPublicKey({ + key: Buffer.from(authentication.publicKey, 'base64'), format: 'der', type: 'spki' + }); + 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; + } +} + +function digestObject(value) { + return crypto.createHash('sha256').update(canonicalJson(value), 'utf8').digest('hex'); +} + +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, + successorBundleDigest: transition.successorBundleDigest, + successorDeclarationDigest: transition.successorDeclarationDigest + })); +} + +function validateHistoricalBundle(bundle, binding) { + const violations = []; + 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; + 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 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; + } + if (component.redactionState === 'redacted') redactedCount++; + 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.')); + } + 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; +} + +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, 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.')]; + if (!validateEmbodimentBindingSchema(binding)) { + return (validateEmbodimentBindingSchema.errors || []).map(error => + bindingViolation('E_SCHEMA', `schema ${error.instancePath || '/'} [${error.keyword}]`, error.message || 'schema violation') + ); + } + + 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, 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(); + + if (identityBundle.historicalBundleRef !== `urn:sha256:${identityBundle.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(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(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 (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)) { + 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; + if (roots.length !== 1 || roots[0] !== familiar.familiarRootId) { + 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(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(bindingViolation('E_ORDERING', 'revisionRecordedAt', 'The revision cannot be recorded after the binding decision.')); + } + 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(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)) { + 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.')); + } + 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; + 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 || predecessor.identityRevisionId === familiar.identityRevisionId || + !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.')); + } + } + if (lineage.relationship === 'restoration' && (!predecessor || predecessor.status !== 'retired')) { + 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 || + !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.')); + } + + 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) || + !Number.isSafeInteger(trustedLedger.generation) || + trustedLedger.generation < 0 || + trustedLedger.generation !== resolutionSnapshot.authoritativeLedgerGeneration || + trustedLedger.headRevisionId !== familiar.identityRevisionId || + trustedLedger.status !== statusAtDecision.status || + !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 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') { + 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(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(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 (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' + ? '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') { + 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.')); + } + 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 (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 (postCommitRevocationSupplied) violations.push(...validatePostCommitRevocation(postCommitRevocation, binding)); + return violations; +} + +function validateEmbodimentBindingFile(filePath, historicalBundlePath, trustedLedgerPath, postCommitRevocationPath) { + let binding; + try { + binding = parseJsonNoDuplicate(fs.readFileSync(filePath, 'utf8')); + 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}`)]; + } + let historicalBundle; + if (historicalBundlePath) { + try { + historicalBundle = parseJsonNoDuplicate(fs.readFileSync(historicalBundlePath, 'utf8')); + 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')); + 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}`)]; } + } + 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, + Boolean(postCommitRevocationPath) + ); +} + // ── SOUL.md parser ──────────────────────────────────────────────────────────── // SOUL.md is a Markdown file with conventions-based structure. // We check for required sections/patterns, not strict frontmatter. @@ -420,6 +859,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 ] [--trusted-ledger ] [--post-commit-revocation ] ${bold('Examples:')} node validate.js examples/sage @@ -433,6 +873,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 +882,61 @@ ${bold('Exit codes:')} process.exit(0); } + if (args[0] === '--embodiment-binding') { + if (args.length < 2) { + console.error(red('Error: --embodiment-binding requires a JSON file.')); + 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 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); + } + 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); + } + 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)) {