From 550f2cbff94279610a1c8ad193d34aac13279b05 Mon Sep 17 00:00:00 2001 From: Labyricorn Date: Mon, 20 Jul 2026 07:39:50 -0700 Subject: [PATCH] Implement HARP and CPL milestones through v0.5.11 --- IMPLEMENTATION_STATUS.md | 17 +- PROMPTS.md | 2 +- README.md | 6 +- docs/provenance/COMPLETION-CHECKLIST.md | 50 +- docs/provenance/README.md | 13 +- .../STAGE-1-NORMATIVE-SPECIFICATION.md | 178 +- .../STAGE-10-EXPORT-PRIVACY-SECURITY.md | 55 + .../STAGE-11-VERIFICATION-MATRIX.md | 44 + docs/provenance/STAGE-2-SCHEMA-PACKAGE.md | 74 +- docs/provenance/STAGE-3-NATIVE-CPL-SERVICE.md | 111 + .../STAGE-4-CONFORMING-PROJECT-BOUNDARY.md | 91 + .../provenance/STAGE-5-PHASE-1-CPL-ROUTING.md | 62 + .../STAGE-6-MANUSCRIPT-COMPOSITION-LINEAGE.md | 42 + .../STAGE-7-CONTRIBUTION-MAP-PROJECTION.md | 44 + docs/provenance/STAGE-8-HARP-GENERATION.md | 58 + .../STAGE-9-HARP-CPL-USER-INTERFACES.md | 39 + docs/provenance/STATE-MACHINES.md | 58 +- package-lock.json | 4 +- package.json | 6 +- schemas/provenance/v1/README.md | 18 +- schemas/provenance/v1/catalog.json | 1125 +- .../v1/composition-operation.schema.json | 374 + .../v1/content-reference.schema.json | 7 + .../v1/contribution-map.schema.json | 409 + .../v1/deposit-snapshot.schema.json | 125 + .../v1/expression-segment.schema.json | 256 + .../composition-operation.invalid.json | 1383 ++ .../invalid/contribution-map.invalid.json | 10270 ++++++++++++++ .../invalid/deposit-snapshot.invalid.json | 736 + .../invalid/expression-segment.invalid.json | 2205 +++ .../invalid/harp-export-manifest.invalid.json | 5945 +++++++++ .../human-authorship-record.invalid.json | 11072 ++++++++++++++++ .../invalid/project-manifest.invalid.json | 206 +- .../registration-policy-profile.invalid.json | 3789 ++++++ .../sanitized-export-manifest.invalid.json | 802 +- .../valid/composition-operation.valid.json | 33 + .../valid/contribution-map.valid.json | 88 + .../valid/deposit-snapshot.valid.json | 23 + .../valid/expression-segment.valid.json | 41 + .../valid/harp-export-manifest.valid.json | 82 + .../valid/human-authorship-record.valid.json | 92 + .../valid/project-manifest.valid.json | 5 +- .../registration-policy-profile.valid.json | 81 + .../sanitized-export-manifest.valid.json | 11 +- .../v1/harp-export-manifest.schema.json | 438 + .../v1/human-authorship-record.schema.json | 588 + .../v1/project-manifest.schema.json | 19 +- .../registration-policy-profile.schema.json | 236 + .../registries/assertion-boundary-kinds.json | 17 + .../assertion-confidence-dimensions.json | 17 + .../assertion-evaluation-statuses.json | 17 + .../assertion-evidence-classes.json | 17 + .../assertion-lifecycle-phases.json | 17 + .../v1/registries/assertion-reason-codes.json | 17 + .../composition-assertion-predicates.json | 47 + .../composition-operation-kinds.json | 55 + .../registries/contribution-map-layers.json | 47 + .../v1/registries/harp-explanation-codes.json | 47 + .../v1/registries/harp-limitation-codes.json | 63 + .../v1/registries/recorded-origin-kinds.json | 47 + .../registration-treatment-suggestions.json | 47 + .../transformation-relationships.json | 63 + .../v1/sanitized-export-manifest.schema.json | 53 +- .../composition-and-harp-classification.json | 881 ++ .../vectors/contribution-map-determinism.json | 288 + .../v1/vectors/harp-deposit-staleness.json | 287 + .../v1/vectors/sanitized-export.json | 53 +- .../v1/vectors/self-digest-identities.json | 674 + scripts/generate-provenance-stage2.mjs | 362 +- src-tauri/Cargo.lock | 13 +- src-tauri/Cargo.toml | 4 +- src-tauri/src/lib.rs | 1500 ++- src-tauri/src/project_format.rs | 463 + src-tauri/src/provenance/assertions.rs | 57 + src-tauri/src/provenance/canonical.rs | 207 + src-tauri/src/provenance/composition.rs | 1227 ++ src-tauri/src/provenance/contribution_map.rs | 1577 +++ src-tauri/src/provenance/explorer.rs | 559 + src-tauri/src/provenance/export.rs | 1036 ++ src-tauri/src/provenance/harp.rs | 1472 ++ src-tauri/src/provenance/identifiers.rs | 148 + src-tauri/src/provenance/ledger.rs | 462 + src-tauri/src/provenance/mod.rs | 93 + src-tauri/src/provenance/phase1.rs | 1383 ++ src-tauri/src/provenance/projections.rs | 19 + src-tauri/src/provenance/records.rs | 182 + src-tauri/src/provenance/recovery.rs | 404 + src-tauri/src/provenance/tests.rs | 311 + src-tauri/src/provenance/verifier.rs | 438 + src-tauri/src/provenance/writer.rs | 678 + src-tauri/tauri.conf.json | 2 +- src/HarpExportPanel.tsx | 123 + src/ProvenanceWorkspace.tsx | 345 + src/Thinkloom.tsx | 207 +- src/export.css | 3 + src/provenance.css | 7 + tests/composition-provenance.test.mjs | 60 + tests/contribution-map.test.mjs | 61 + tests/harp-export.test.mjs | 71 + tests/harp-generation.test.mjs | 77 + tests/native-app.test.mjs | 10 +- tests/native-cpl.test.mjs | 66 + tests/phase1-provenance.test.mjs | 61 + tests/project-format.test.mjs | 55 + tests/provenance-schema.test.mjs | 163 +- tests/provenance-ui.test.mjs | 75 + tests/verification-matrix.test.mjs | 89 + tests/windows-package.test.mjs | 47 + vite.config.ts | 33 +- 109 files changed, 57576 insertions(+), 741 deletions(-) create mode 100644 docs/provenance/STAGE-10-EXPORT-PRIVACY-SECURITY.md create mode 100644 docs/provenance/STAGE-11-VERIFICATION-MATRIX.md create mode 100644 docs/provenance/STAGE-3-NATIVE-CPL-SERVICE.md create mode 100644 docs/provenance/STAGE-4-CONFORMING-PROJECT-BOUNDARY.md create mode 100644 docs/provenance/STAGE-5-PHASE-1-CPL-ROUTING.md create mode 100644 docs/provenance/STAGE-6-MANUSCRIPT-COMPOSITION-LINEAGE.md create mode 100644 docs/provenance/STAGE-7-CONTRIBUTION-MAP-PROJECTION.md create mode 100644 docs/provenance/STAGE-8-HARP-GENERATION.md create mode 100644 docs/provenance/STAGE-9-HARP-CPL-USER-INTERFACES.md create mode 100644 schemas/provenance/v1/composition-operation.schema.json create mode 100644 schemas/provenance/v1/contribution-map.schema.json create mode 100644 schemas/provenance/v1/deposit-snapshot.schema.json create mode 100644 schemas/provenance/v1/expression-segment.schema.json create mode 100644 schemas/provenance/v1/fixtures/invalid/composition-operation.invalid.json create mode 100644 schemas/provenance/v1/fixtures/invalid/contribution-map.invalid.json create mode 100644 schemas/provenance/v1/fixtures/invalid/deposit-snapshot.invalid.json create mode 100644 schemas/provenance/v1/fixtures/invalid/expression-segment.invalid.json create mode 100644 schemas/provenance/v1/fixtures/invalid/harp-export-manifest.invalid.json create mode 100644 schemas/provenance/v1/fixtures/invalid/human-authorship-record.invalid.json create mode 100644 schemas/provenance/v1/fixtures/invalid/registration-policy-profile.invalid.json create mode 100644 schemas/provenance/v1/fixtures/valid/composition-operation.valid.json create mode 100644 schemas/provenance/v1/fixtures/valid/contribution-map.valid.json create mode 100644 schemas/provenance/v1/fixtures/valid/deposit-snapshot.valid.json create mode 100644 schemas/provenance/v1/fixtures/valid/expression-segment.valid.json create mode 100644 schemas/provenance/v1/fixtures/valid/harp-export-manifest.valid.json create mode 100644 schemas/provenance/v1/fixtures/valid/human-authorship-record.valid.json create mode 100644 schemas/provenance/v1/fixtures/valid/registration-policy-profile.valid.json create mode 100644 schemas/provenance/v1/harp-export-manifest.schema.json create mode 100644 schemas/provenance/v1/human-authorship-record.schema.json create mode 100644 schemas/provenance/v1/registration-policy-profile.schema.json create mode 100644 schemas/provenance/v1/registries/composition-assertion-predicates.json create mode 100644 schemas/provenance/v1/registries/composition-operation-kinds.json create mode 100644 schemas/provenance/v1/registries/contribution-map-layers.json create mode 100644 schemas/provenance/v1/registries/harp-explanation-codes.json create mode 100644 schemas/provenance/v1/registries/harp-limitation-codes.json create mode 100644 schemas/provenance/v1/registries/recorded-origin-kinds.json create mode 100644 schemas/provenance/v1/registries/registration-treatment-suggestions.json create mode 100644 schemas/provenance/v1/registries/transformation-relationships.json create mode 100644 schemas/provenance/v1/vectors/composition-and-harp-classification.json create mode 100644 schemas/provenance/v1/vectors/contribution-map-determinism.json create mode 100644 schemas/provenance/v1/vectors/harp-deposit-staleness.json create mode 100644 src-tauri/src/project_format.rs create mode 100644 src-tauri/src/provenance/assertions.rs create mode 100644 src-tauri/src/provenance/canonical.rs create mode 100644 src-tauri/src/provenance/composition.rs create mode 100644 src-tauri/src/provenance/contribution_map.rs create mode 100644 src-tauri/src/provenance/explorer.rs create mode 100644 src-tauri/src/provenance/export.rs create mode 100644 src-tauri/src/provenance/harp.rs create mode 100644 src-tauri/src/provenance/identifiers.rs create mode 100644 src-tauri/src/provenance/ledger.rs create mode 100644 src-tauri/src/provenance/mod.rs create mode 100644 src-tauri/src/provenance/phase1.rs create mode 100644 src-tauri/src/provenance/projections.rs create mode 100644 src-tauri/src/provenance/records.rs create mode 100644 src-tauri/src/provenance/recovery.rs create mode 100644 src-tauri/src/provenance/tests.rs create mode 100644 src-tauri/src/provenance/verifier.rs create mode 100644 src-tauri/src/provenance/writer.rs create mode 100644 src/HarpExportPanel.tsx create mode 100644 src/ProvenanceWorkspace.tsx create mode 100644 src/export.css create mode 100644 src/provenance.css create mode 100644 tests/composition-provenance.test.mjs create mode 100644 tests/contribution-map.test.mjs create mode 100644 tests/harp-export.test.mjs create mode 100644 tests/harp-generation.test.mjs create mode 100644 tests/native-cpl.test.mjs create mode 100644 tests/phase1-provenance.test.mjs create mode 100644 tests/project-format.test.mjs create mode 100644 tests/provenance-ui.test.mjs create mode 100644 tests/verification-matrix.test.mjs create mode 100644 tests/windows-package.test.mjs diff --git a/IMPLEMENTATION_STATUS.md b/IMPLEMENTATION_STATUS.md index 5ac6284..4da4278 100644 --- a/IMPLEMENTATION_STATUS.md +++ b/IMPLEMENTATION_STATUS.md @@ -1,6 +1,8 @@ # Thinkloom implementation status -Status date: 2026-07-18 +Status date: 2026-07-19 + +Release convention: provenance Milestone N maps to application version `0.5.N`; this progression is assumed for subsequent milestones unless explicitly overridden. ## Completed locally @@ -13,6 +15,17 @@ Status date: 2026-07-18 - M7 export/backup/evidence: Markdown, HTML, PDF, text, backup ZIP, evidence ZIP, sanitization disclosure, hashes, manifest, atomic finalization, and strict ZIP import validation. - Provenance Stage 2 contract (v0.3.0): 38 JSON Schema Draft 2020-12 schemas, valid/invalid fixture suites, canonical JSON and JSONL vectors, event-chain vectors, protected-record/key-rotation vectors, retention-policy vectors, and a formal release-files Merkle construction. - Canonical assertion envelopes (v0.4.0): immutable provenance assertions, point-in-time evaluations, six semantic registries, independent confidence dimensions, evidence classes, stable reason codes, and deterministic dependency-invalidation vectors. +- HARP/CPL normative amendment (v0.5.1): one unambiguous CPL ledger meaning; exact-deposit, non-authoritative HARP projection; integrity-only cryptographic claims; contribution-dimension separation; explicit user approval; U.S. literary Standard Application policy profile; HARP staleness; prohibited UI claims; and the v0.5.x preview-project boundary. +- Composition/HARP schema extension (v0.5.2): seven additive schemas, eight independent semantic registries, exhaustive valid/invalid fixtures, deterministic contribution-map and exact-deposit HARP vectors, self-digest identities, staleness checks, v0.4 assertion compatibility, and declared v0.6.0 schema compatibility. +- Native CPL service (v0.5.3): modular Rust provenance boundary; NFC plus RFC 8785-compatible canonicalization; prefixed sortable IDs; exact millisecond timestamps; OS-level exclusive writer locks; stable action idempotency; durable SQLite intents; same-filesystem immutable-record staging; active and sealed ledger segments; chain-head recovery and quarantine; rebuildable indexes; structured native verification reports; and deterministic crash injection across record, ledger, head, SQLite, and rotation boundaries. +- Conforming project boundary (v0.5.4): exact CPL 1.0 marker; formal project manifest; conforming `records/`, segmented `provenance/ledger/`, `reports/`, and `.app/` layout; inspection-before-recovery classification; verified-only editable activation; read-only legacy refusal; Show Project Folder; byte-preserving preservation archives; and explicit legacy backup-import rejection. +- Phase 1 CPL routing (v0.5.5): typed native commands and operation-specific immutable records for turns, assistant responses, sessions, context, ideas, drafting-paper changes, distillation, external material, voice transcription, and provider lifecycle; request-before-I/O ordering; response/failure capture; writer-lock-free provider I/O; and deterministic UI reconstruction from canonical records and ledger events. +- Manuscript composition and lineage (v0.5.6): instrumented TipTap transaction capture at meaningful boundaries; typed origins for direct human, transcription, AI, paste/import, restoration, and unattested expression; shared drafting/finalization path; Unicode-scalar lineage preserving AI preimages through human revision; invocation-bound partial AI dispositions; writer-lock-atomic preimage validation; and deterministic manuscript/span replay from canonical composition records. +- Contribution-map projection (v0.5.7): exact frozen Markdown deposits; deterministic bytewise span normalization and structural splitting; complete non-overlapping Unicode-scalar coverage; stable ancestry through split/merge; chapter, paragraph, and fixed-layout page locators; independent inclusion/selection/arrangement assertions with current evaluations; explicit stale, degraded, unverified, and unattested boundaries; and coverage wording that cannot be presented as a human-authorship percentage. +- Deterministic HARP generation (v0.5.8): explicit approval recorded before generation; canonical exact-deposit HARP and manifest records; one-page summary, visual contribution map, representative transformations, AI-system disclosure, coverage/limitations, suggested registration language, verification material, and supporting archive manifest; shared report metadata; sanitization-aware excerpts; idempotent regeneration; and deterministic manuscript, deposit, policy, assertion, dependency, approval, and verification staleness. +- HARP/CPL user interfaces (v0.5.9): native verification and composition timeline; immutable-record inspection; final-expression lineage; assertion/evaluation detail; explicit exact, degraded, stale, and unverified boundaries; HARP statement-to-record traces; seven-step preparation wizard; evidence/declaration/derived/suggested/legal category separation; stale resolution and non-exact acceptance gates; archive selection; and resettable explicit generation approval. +- HARP export, privacy, and security (v0.5.10): separate registration worksheet, human-readable HARP, canonical machine HARP, exact deposit copy, sanitized archive, and full-private archive; current-HARP and exact-deposit gates; allowlisted sanitized content; user-selected identity redaction; seven HARP-specific omission categories with per-disclosure and aggregate hashes; retained-file and source-binding verification; explicit selective-completeness scope; non-mutating CPL export; and private-archive warnings. +- Verification matrix and release safety (v0.5.11): executable coverage for every required schema, canonicalization, concurrency, crash-recovery, rotation, composition-lineage, voice, staleness, Unicode, native/frontend consistency, sanitized disclosure, and prohibited-wording scenario; origin-preserving selection/arrangement; authoritative release blocking for incomplete, failed, or unsafe verification; and packaged Windows executable/MSI/NSIS launch verification. - Product surface: Sites, Next, Vinext, Cloudflare, and browser-companion code and configuration have been removed. Tauri is the sole application target. ## External release gates @@ -28,8 +41,6 @@ These items cannot be honestly certified from this workspace alone and need proj ## Remaining hardening -- Replace the current MVP provenance persistence path with the approved [Thinkloom 1.0 Stage 1 normative provenance subsystem](docs/provenance/README.md). The specification and formal schemas/fixtures are complete; native implementation and fault-injection conformance remain future stages. - - Run microphone/VAD/transcription integration tests once the approved model assets are supplied. - Run signed clean-install, upgrade, downgrade-warning, and uninstall tests on each release platform. - Run full 20,000-word interaction and fault-injection profiling on packaged release hardware. diff --git a/PROMPTS.md b/PROMPTS.md index 4ef2972..0dfbcd4 100644 --- a/PROMPTS.md +++ b/PROMPTS.md @@ -1,6 +1,6 @@ # Thinkloom prompt configuration -Thinkloom 0.5.0 exposes every instruction sent to a language model as editable JSON. The desktop app creates a prompts folder in its operating-system configuration directory and shows its exact path under Settings → Prompt configuration. Use Open prompt folder to open it. +Thinkloom 0.5.11 exposes every instruction sent to a language model as editable JSON. The desktop app creates a prompts folder in its operating-system configuration directory and shows its exact path under Settings → Prompt configuration. Use Open prompt folder to open it. Prompt files are loaded immediately before every model request. Save a valid edit, then make the next request; no restart or rebuild is required. Thinkloom preserves existing prompt instructions. When a release introduces a required prompt field, it adds only the missing field and wraps legacy conversation instructions with the new modular context variables. diff --git a/README.md b/README.md index be7ed6a..3bda04c 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,7 @@ cargo test Judges should not need to rebuild Thinkloom. A public Windows x64 installer release will be linked from [JUDGING.md](JUDGING.md) before submission. No Thinkloom account is required. The included sample project demonstrates the primary workflow without credentials; live model requests additionally require a local Ollama instance or an entrant-supplied OpenAI/OpenAI-compatible credential. ## Project storage -A Thinkloom project is self-contained. Canonical files live under `manuscript/`, `ideas/`, `conversations/`, `provenance/`, and `style/`. Live SQLite state and rotating snapshots are under `.thinkloom/` and are excluded from the project's hidden Git history. Audio retention is always false; no audio file extension is created by the native service. +A Thinkloom project is self-contained. Canonical publication files live under `manuscript/`, `ideas/`, `conversations/`, and `style/`; immutable native records and segmented ledger evidence live under `records/` and `provenance/ledger/`. Live SQLite state, rotating snapshots, writer locks, same-filesystem staging, and recovery quarantine live under `.app/`, which is excluded from the project's hidden Git history. Audio retention is always false; no audio file extension is created by the native service. ## Prompt configuration @@ -89,9 +89,9 @@ See [PROMPTS.md](PROMPTS.md) for each file's effect, variables, editing workflow ## Provenance architecture -The approved Thinkloom 1.0 provenance architecture is documented in the [Stage 1 normative provenance specification](docs/provenance/README.md). It defines the future single-writer subsystem, canonical records, segmented ledger, recovery protocol, retention policy, native verification, and release bindings. +The Thinkloom 0.5.11 [provenance package](docs/provenance/README.md) combines the 0.5.1 normative HARP/CPL amendment, the additive 0.5.2 composition/HARP schemas, the 0.5.3 modular native CPL service, the 0.5.4 conforming project boundary, the 0.5.5 typed Phase 1 route, the 0.5.6 manuscript composition-lineage route, the 0.5.7 frozen-deposit contribution-map projection, the 0.5.8 deterministic HARP generator, the 0.5.9 connected HARP/CPL user interfaces, the 0.5.10 export/privacy/security boundary, and the 0.5.11 executable verification matrix and release gate. -Thinkloom 0.5.0 extends the formal Stage 2 package with canonical provenance assertions, point-in-time evaluations, versioned semantic registries, and deterministic invalidation vectors. The current native provenance writer must not be represented as conforming until the later implementation and fault-injection stages are complete. +Thinkloom 0.5.11 retains the six distinct 0.5.10 HARP artifacts and adds an executable verification matrix, origin-preserving selection/arrangement behavior, prohibited score/legal-claim scans, a native release-finalization gate, and a packaged Windows launch/installer gate. Sanitized output is allowlisted, supports user-selected identity redaction, discloses and hashes every required omission class, and verifies retained file hashes plus CPL/HARP/deposit bindings as a `selective_disclosed_subset`. It never claims completeness, a human-authorship percentage, or a legal determination. Export does not advance or rewrite the CPL chain. The 0.5.4 `thinkloom-cpl` boundary remains unchanged: unmarked v0.5.x projects are read-only previews and are never converted, regenerated, verified as CPL, or used to generate HARP. ## Provider setup diff --git a/docs/provenance/COMPLETION-CHECKLIST.md b/docs/provenance/COMPLETION-CHECKLIST.md index 322f302..f172315 100644 --- a/docs/provenance/COMPLETION-CHECKLIST.md +++ b/docs/provenance/COMPLETION-CHECKLIST.md @@ -2,6 +2,8 @@ Status: **Normative traceability and handoff gate** +Document release: **Thinkloom 0.5.1** + Stage 1 is complete only when every item below is represented without contradiction in the normative specification and state-machine companion. This checklist also defines the minimum Stage 2 and later implementation test handoff. ## 1. Normative specification gate @@ -9,6 +11,16 @@ Stage 1 is complete only when every item below is represented without contradict | Requirement | Normative location | Status | |---|---|---| | Correct tamper-evident claim and trust limitation | Specification §§3, 26 | Complete | +| CPL is the product name for the one canonical ledger, not a second ledger | Specification §3.1 | Complete | +| HARP is a non-authoritative reproducible projection bound to one exact deposit | Specification §§3.1, 15.2–15.4 | Complete | +| Cryptographic verification is limited to integrity, not identity or authorship | Specification §§3, 15.4 | Complete | +| Product and UI terms have one normative meaning | Specification §§3.1–3.2 | Complete | +| Copyrightability, originality, ownership, and authorship conclusions are prohibited | Specification §§3.1–3.2, 15.3 | Complete | +| Recorded origin, transformation, selection/arrangement, evaluation, and suggested treatment remain independent | Specification §§3.1, 10, 15.3 | Complete | +| Deposit digest, revision, and stable segment ID outrank derived page locators | Specification §15.2 | Complete | +| Post-deposit editing makes current-work HARP applicability stale without falsifying historical integrity | Specification §15.2; State Machines §12 | Complete | +| Suggested registration language is editable and explicitly approved | Specification §15.3; State Machines §12 | Complete | +| Initial U.S. literary-work Standard Application policy profile | Specification §15.5 | Complete | | Authority hierarchy | Specification §4 | Complete | | Self-contained repository boundaries | Specification §5 | Complete | | Stable IDs and contiguous event sequences | Specification §6 | Complete | @@ -50,7 +62,7 @@ Stage 1 is complete only when every item below is represented without contradict | Pre-durable-write secret filtering | Specification §21 | Complete | | No audio retention | Specification §21 | Complete | | Sanitization versus emergency purge | Specification §22; State Machines §10 | Complete | -| Explicit legacy preview-project policy | Specification §23 | Complete | +| Explicit v0.5.x preview-project and CPL-marker boundary | Specification §23; State Machines §11 | Complete | | Stage 2 formal schema inventory | Specification §24 | Complete | | Migration deferred until after 1.0.0 | Specification §§23–24, 26 | Complete | @@ -79,9 +91,15 @@ Required outputs: - Versioned assertion lifecycle, reason-code, confidence-dimension, evidence-class, and boundary-kind registries. - Assertion self-digest, dependency invalidation, superseding evaluation, and consumer-decision vectors. - Invalid fixtures proving unknown provenance, generation, compatibility, or confidence cannot validate as exact. +- Additive composition schemas for composition operations, expression segments, contribution maps, deposit snapshots, registration policy profiles, human-authorship records, and HARP export manifests. +- Versioned registries for composition-operation kinds, recorded-origin kinds, transformation relationships, contribution-map layers, suggested registration treatment, HARP limitation/explanation codes, and composition assertion predicates. +- Fixtures proving unknown identity, origin, generation, or lineage cannot validate as an exact HARP classification. +- Compatibility declarations preserve existing v0.4 assertion semantics and identify the v0.6 runtime target; project-format conformance requires the exact marker introduced by Milestone 4 / 0.5.4. Stage 2 must preserve the distinction between the provenance schema version and the Thinkloom application version. +Thinkloom 0.5.2 fulfills this Stage 2 handoff with 47 schemas, 14 registries, exhaustive schema fixtures, and deterministic composition, contribution-map, deposit, HARP, staleness, and export-manifest vectors. This is schema-package completion only; CPL runtime conformance remains targeted to Thinkloom 0.6.0. + ## 3. Durable-boundary fault-injection matrix The native implementation and test harness MUST support deterministic termination or injected failure after: @@ -122,6 +140,8 @@ For each boundary, tests MUST prove one of: 4. Recovery quarantines it without presenting false success. 5. Authoritative contradiction is reported and editing remains blocked. +Thinkloom 0.5.3 fulfills the native CPL writer subset of this matrix through immutable-record durability, ledger append, chain-head advancement, SQLite application, idempotent completion, and segment rotation. Git checkpoint, release, backup, and import-specific injection points remain assigned to their later implementation milestones. + ## 4. Concurrency and idempotency tests - Hundreds of concurrent frontend commands serialize without event loss or sequence gaps. @@ -183,6 +203,18 @@ For each boundary, tests MUST prove one of: - Digest and generation changes deterministically invalidate dependent evaluations - Later evaluations supersede current usability without mutating earlier assertion or evaluation records - Derived projections never synthesize exact without an authoritative exact evaluation +- Complete, ordered, non-overlapping contribution-map coverage for complex Unicode +- Recorded origin remains independent of transformation and selection/arrangement overlays +- Paste/import never defaults to recorded direct human input +- Human revision of accepted AI output retains the AI preimage and later human operations +- Coverage statements name their denominator and never express a human or AI percentage +- Page locators change only with an identified layout profile and never replace stable segment identity +- Identical canonical inputs produce byte-identical HARP and contribution-map content +- Every HARP statement traces to its CPL event, record, assertion, evaluation, or user approval +- Unknown or unattested boundaries remain visible and cannot validate as exact +- Any post-deposit edit or restore deterministically makes current-work HARP applicability stale +- Historical HARP integrity remains independently verifiable for its unchanged exact deposit +- Policy-profile updates do not rewrite an existing HARP ## 7. Privacy, secret, and encryption tests @@ -238,17 +270,25 @@ For each boundary, tests MUST prove one of: - Git-only damage yields warning when authoritative evidence remains valid. - Missing authoritative records yield `FAILED`. - Unsafe archive structure yields `UNSAFE`. +- UI uses **HARP integrity verified**, never **authorship verified**. +- UI visibly separates evidence facts, declarations, recorded origin, transformations, selection/arrangement, evaluations, suggestions, and Office determinations. +- Prohibited-phrase tests reject human/AI percentages, authorship or originality scores, and legal-conclusion claims. +- Registration suggestions remain editable and generation is blocked until the exact strings receive explicit approval. +- A stale HARP shows both current-work staleness and historical deposit verification status. -## 10. Legacy 1.0 behavior tests +## 10. Legacy preview/CPL boundary tests - Known preview markers are detected without modifying the project. - Normal opening and editing are refused. - Show Project Folder remains available. - Raw archival ZIP preserves the selected legacy tree without conversion. - The archive is labeled as unverified and unconverted. -- No 1.0 provenance verification or evidence report is offered. +- No CPL 1.0 provenance verification, HARP, or CPL evidence report is offered. - Legacy Git history remains unchanged. -- No migration schema or implied migration success appears in 1.0. +- No migration schema or implied migration success appears before/at 1.0.0. +- A v0.5.x project or `schemaVersion: 1.0` field cannot satisfy the CPL marker check. +- No preview project can invoke CPL verification or HARP generation. +- Only the exact supported CPL marker may proceed to recovery, and the marker alone does not establish conformance. ## 11. Stage 1 disposition @@ -259,4 +299,4 @@ Stage 1 is **complete** when: - The Stage 2 schema work uses this checklist as its acceptance boundary. - Any future architectural change is recorded as a versioned normative amendment rather than an informal implementation choice. -Completion of Stage 1 does not claim implementation conformance and does not change the current application version. +Completion of the 0.5.1 normative amendment did not claim runtime implementation or CPL project conformance. Thinkloom 0.5.3 supplies the native service and its core writer fault-injection suite. Thinkloom 0.5.4 completes the project-format boundary: exact-marker projects must pass structure, recovery, and native verification gates, while unmarked preview projects remain untouched and preservation-only. Thinkloom 0.5.5 then routes Phase 1 through typed canonical commands, reconstructs the ideation UI by ledger replay, and records provider intent before I/O with response or failure afterward. Thinkloom 0.5.6 captures manuscript transactions through the shared TipTap path, preserves scalar-level expression lineage, and deterministically replays the manuscript from immutable composition commands. Thinkloom 0.5.7 freezes exact deposit revisions and deterministically projects complete scalar contribution maps with structural locators, independent assertions, current evaluations, and visible evidence boundaries. Thinkloom 0.5.8 then generates the complete explicitly approved HARP report set without LLM classification or legal conclusions and deterministically marks it stale after manuscript, deposit, policy, assertion, or dependency changes. Thinkloom 0.5.9 exposes that evidence through native-verifier-backed CPL exploration and a gated HARP preparation workflow in which every evidentiary statement traces through assertions, evaluations, and underlying records. Thinkloom 0.5.10 creates the six separate HARP export artifacts, discloses and hash-binds every sanitized omission category, verifies retained evidence against CPL/HARP/deposit bindings, and preserves the source chain without claiming sanitized completeness. Thinkloom 0.5.11 completes the executable verification matrix, origin-preserving arrangement checks, native release gate, prohibited-wording scans, and packaged Windows executable/MSI/NSIS end-to-end gate. diff --git a/docs/provenance/README.md b/docs/provenance/README.md index 78058f4..ef9b639 100644 --- a/docs/provenance/README.md +++ b/docs/provenance/README.md @@ -1,11 +1,20 @@ # Thinkloom provenance specification -This directory contains the approved normative specification and formal Stage 2 contract for the Thinkloom 1.0 provenance subsystem. +This directory contains the Thinkloom 0.5.1 normative HARP/CPL specification, the additive Thinkloom 0.5.2 formal schema package, the Thinkloom 0.5.3 modular native CPL service record, the Thinkloom 0.5.4 conforming project-boundary record, the Thinkloom 0.5.5 typed Phase 1 routing record, the Thinkloom 0.5.6 manuscript composition-lineage record, the Thinkloom 0.5.7 contribution-map projection record, the Thinkloom 0.5.8 deterministic HARP-generation record, the Thinkloom 0.5.9 connected HARP/CPL interface record, the Thinkloom 0.5.10 export/privacy/security record, and the Thinkloom 0.5.11 executable verification-matrix record. - [Stage 1 Normative Specification](STAGE-1-NORMATIVE-SPECIFICATION.md) - [State Machines and Recovery Protocols](STATE-MACHINES.md) - [Stage 1 Completion Checklist](COMPLETION-CHECKLIST.md) - [Stage 2 Completion and Verification](STAGE-2-SCHEMA-PACKAGE.md) - [Stage 2 JSON Schema package](../../schemas/provenance/v1/README.md) +- [Stage 3 Native CPL Service](STAGE-3-NATIVE-CPL-SERVICE.md) +- [Stage 4 Conforming Project Boundary](STAGE-4-CONFORMING-PROJECT-BOUNDARY.md) +- [Stage 5 Phase 1 CPL Routing](STAGE-5-PHASE-1-CPL-ROUTING.md) +- [Stage 6 Manuscript Composition and Lineage](STAGE-6-MANUSCRIPT-COMPOSITION-LINEAGE.md) +- [Stage 7 Contribution-Map Projection](STAGE-7-CONTRIBUTION-MAP-PROJECTION.md) +- [Stage 8 Deterministic HARP Generation](STAGE-8-HARP-GENERATION.md) +- [Stage 9 HARP and CPL User Interfaces](STAGE-9-HARP-CPL-USER-INTERFACES.md) +- [Stage 10 Export, Privacy, and Security](STAGE-10-EXPORT-PRIVACY-SECURITY.md) +- [Stage 11 Verification Matrix](STAGE-11-VERIFICATION-MATRIX.md) -Thinkloom 0.4.0 includes the 40-schema Draft 2020-12 package, versioned assertion registries, valid and invalid fixtures, and deterministic conformance vectors. The native writer does not yet implement this contract and must not be represented as conforming until the later implementation and fault-injection stages are complete. +Thinkloom 0.5.11 makes the complete milestone verification matrix executable, preserves origin during selection/arrangement moves, blocks release finalization unless native verification is complete and safe, scans shipped wording for prohibited scores and legal conclusions, and verifies the packaged Windows executable plus MSI and NSIS artifacts. The six 0.5.10 export artifacts and the read-only boundary for unmarked preview projects remain unchanged. diff --git a/docs/provenance/STAGE-1-NORMATIVE-SPECIFICATION.md b/docs/provenance/STAGE-1-NORMATIVE-SPECIFICATION.md index 4aadad3..a3af40b 100644 --- a/docs/provenance/STAGE-1-NORMATIVE-SPECIFICATION.md +++ b/docs/provenance/STAGE-1-NORMATIVE-SPECIFICATION.md @@ -1,17 +1,21 @@ # Thinkloom Stage 1 Normative Provenance Specification Status: **Approved architecture baseline for formal schema work** -Target: **Thinkloom 1.0.0** -Provenance schema family: **1.0** +Document release: **Thinkloom 0.5.1** + +Runtime conformance target: **Thinkloom 0.6.0; project-format conformance 1.0** + +Provenance schema family: **1.0** + Migration support: **Deferred until after Thinkloom 1.0.0** ## 1. Purpose and precedence -This specification defines the authority, persistence, integrity, privacy, recovery, verification, backup, and release contracts for Thinkloom provenance. +This specification defines the authority, persistence, integrity, privacy, recovery, verification, backup, release, Composition Provenance Ledger (CPL), and Human Authorship Record of Provenance (HARP) contracts for Thinkloom provenance. It supersedes the provenance-specific transaction order, single-ledger layout, mutable-record assumptions, live-database snapshot method, and release-binding sequence in the earlier MVP architecture and implementation plans. It does not supersede their product requirements, native Tauri boundary, preview-first generation model, user-control requirements, accessibility requirements, or prohibition on retained audio. -Thinkloom 0.4.0 includes the formal Stage 2 schemas, canonical assertion envelopes, and verification vectors, but its native writer is not represented as conforming to this specification. Full conformance begins only after the native implementation and required fault-injection tests are complete. +Thinkloom 0.5.1 includes this normative HARP/CPL amendment and preserves the existing formal Stage 2 schemas, canonical assertion envelopes, and verification vectors, but its native writer is not represented as CPL-conforming. Full conformance begins only after the native implementation and required fault-injection tests are complete. ## 2. Normative language @@ -27,25 +31,61 @@ Thinkloom provenance is: > A local, transactionally coordinated, tamper-evident creative-process record with configurable retention, native verification, recoverable storage, and reproducible release manifests. +The correct HARP/CPL product claim is: + +> A Human Authorship Record of Provenance (HARP) is a reproducible evidence projection for an exact deposit, backed by cryptographically verifiable integrity evidence in Thinkloom's Composition Provenance Ledger (CPL). + Thinkloom MUST NOT claim that local provenance is tamper-proof, an independently trusted timestamp, conclusive legal proof, or a quantitative measure of human versus AI authorship. +Cryptographic verification establishes only the integrity and internal linkage of the retained bytes within the verifier's stated scope. It MUST NOT, without separately identified evidence, be represented as verification of a person's identity, the truth of a user declaration, legal authorship, originality, copyrightability, ownership, or registrability. A signature or local key proves control of that key; it proves identity only when the key has a separately verified identity binding. + The strongest valid claim without an external anchor is: > The system can detect changes relative to a previously retained chain head, signed release, or external anchor. +### 3.1 Normative product terms + +The following meanings are exclusive and binding throughout product copy, schemas, reports, tests, and implementation: + +- **Composition Provenance Ledger (CPL)** is the product-facing name for the single canonical provenance ledger defined by §§12–13. CPL is not a new ledger, side ledger, report, database, or replacement for the existing ledger. A conforming project has one CPL whose events bind immutable records, assertions, and evaluations under §4. +- **CPL record** is an immutable authoritative record referenced by a CPL event. The term does not include SQLite rows, UI state, derived indexes, generated reports, or uncommitted temporary data. +- **Deposit** is the exact file selected by the user for a registration submission or other declared evidentiary purpose and frozen in a deposit snapshot. A manuscript revision, editor state, export recipe, or filename alone is not a deposit. +- **Human Authorship Record of Provenance (HARP)** is a non-authoritative, deterministic, reproducible projection of CPL records and evaluations bound to one exact deposit. The word “Authorship” in the product name describes the subject of the evidence record; it is not a Thinkloom determination that any expression is legally authored, original, or copyrightable. +- **Recorded origin** describes what the CPL records about how expression entered the composition. It is an evidence classification, not a legal conclusion. +- **Transformation relationship** describes how expression changed or derived from earlier expression. +- **Selection/arrangement overlay** describes recorded relationships among surviving expression or structural units. It is independent of their recorded origin and MUST NOT be encoded as a text-origin category. +- **Suggested registration treatment** is editable application language produced under a versioned policy profile. It is neither an evidence fact nor a legal determination. +- **Legal determination** includes copyrightability, originality, authorship, ownership, and registrability. Thinkloom and HARP do not make these determinations. + +No second meaning, abbreviation expansion, or competing product label MAY be used for CPL or HARP in a conforming product surface. + +### 3.2 Prohibited claims and required UI terminology + +Thinkloom, CPL, HARP, exports, and marketing MUST NOT state or imply: + +- A “human percentage,” “AI percentage,” authorship score, originality score, copyrightability score, or equivalent quantitative legal proxy +- “Copyright verified,” “copyrightable,” “originality proven,” “proven human author,” “legally human-authored,” “registration-ready,” “Copyright Office approved,” or “authorship certified” +- That typing time, edit count, word count, retained-word ratio, prompt count, or any other activity metric determines originality or authorship +- That a paste, import, self-declaration, cryptographic signature, or successful integrity check by itself proves identity or human authorship +- That `VERIFIED` or `exact` means anything beyond the explicitly named integrity or evidentiary scope + +Product surfaces MUST distinguish and label these categories: **Evidence fact**, **User declaration**, **Recorded origin**, **Transformation relationship**, **Selection/arrangement overlay**, **Evidentiary evaluation**, **Suggested registration language**, and **Copyright Office determination**. The UI MAY use “integrity verified” only with the verified scope and chain head visible. It MUST use “self-declared identity” unless stronger identity evidence and its verification method are present. + ## 4. Authority hierarchy The following hierarchy is binding: -1. **Immutable filesystem records, canonical provenance assertions, point-in-time assertion evaluations, and the provenance ledger** are authoritative evidence when bound by ledger references. +1. **Immutable filesystem records, canonical provenance assertions, point-in-time assertion evaluations, and the canonical provenance ledger (product name: CPL)** are authoritative evidence when bound by CPL event references. 2. **Canonical publication files and manuscript revisions** are authoritative publication content when bound by ledger references. 3. **Release manifests** are authoritative bindings for a completed release. 4. **SQLite** stores operational state, UI state, write intents, idempotency indexes, and rebuildable query indexes. 5. **Git** stores meaningful milestone history and release state but is not the provenance authority. -6. **Derived indexes and generated reports** are disposable, reproducible caches or projections. +6. **Derived indexes, contribution maps, HARP documents, and generated reports** are disposable, reproducible projections. They are non-authoritative even when their bytes and source bindings verify. SQLite MUST NOT be the only location of an evidentiary fact. A valid ledger MUST take precedence over contradictory SQLite state. Git failure MUST NOT invalidate an otherwise valid provenance ledger. +A HARP MUST NOT add, promote, or repair an evidentiary fact. Every factual HARP statement MUST trace to a CPL record, assertion, evaluation, or explicit user declaration bound by a CPL event. If the required basis is unknown, unattested, stale, degraded, or unverified, the HARP MUST preserve that boundary rather than infer a favorable classification. + ## 5. Repository boundaries A conforming 1.0 project SHOULD organize authoritative and operational data under these boundaries: @@ -60,7 +100,8 @@ publication-project/ │ ├── invocations/ │ ├── prompt-templates/ │ ├── sources/ -│ └── transformations/ +│ ├── transformations/ +│ └── composition/ ├── provenance/ │ ├── schema/ │ ├── ledger/active/ @@ -69,7 +110,9 @@ publication-project/ │ ├── integrity/ │ └── report-config/ ├── releases/ +├── deposits/ ├── reports/ +│ └── harp/ ├── assets/ ├── .app/ │ ├── state.sqlite @@ -85,7 +128,7 @@ Large PDFs, ZIP packages, and regenerable binaries SHOULD remain outside ordinar ## 6. Identifiers and event ordering -Stable sortable identifiers SHOULD use ULIDs with type prefixes, including `event_`, `record_`, `intent_`, `turn_`, `session_`, `invocation_`, `revision_`, `fragment_`, `checkpoint_`, `release_`, `assertion_`, and `evaluation_`. +Stable sortable identifiers SHOULD use ULIDs with type prefixes, including `event_`, `record_`, `intent_`, `turn_`, `session_`, `invocation_`, `revision_`, `segment_`, `deposit_`, `harp_`, `policy_`, `fragment_`, `checkpoint_`, `release_`, `assertion_`, and `evaluation_`. Identifiers MAY be allocated before an operation commits. Abandoned identifiers MUST NOT be reused. @@ -187,6 +230,16 @@ Supported coordinate systems MUST be explicit, such as `utf8_byte`, `unicode_sca Meaningful manual editing MUST be grouped into edit transactions rather than keystroke events. A transaction SHOULD close on focus loss, configured idle interval, section change, AI operation, checkpoint, phase change, document close, explicit save, or milestone. +Composition provenance MUST keep these dimensions independent: + +1. Recorded origin +2. Transformation relationship +3. Selection/arrangement overlay +4. Evidentiary evaluation +5. Suggested registration treatment + +Recorded-origin values MUST distinguish at least recorded direct human input, human expressive input mediated by transcription, accepted AI output, imported or pasted material, system restoration, and unattested expression. Paste or import MUST NOT default to recorded direct human input. Human modification of AI-origin material MUST retain the AI preimage lineage and the later human operations; it MUST NOT rewrite the earlier origin as human. Unknown identity, generation, origin, or lineage MUST remain unknown or unattested and MUST NOT validate as an exact classification. + ## 11. Retention, export, and encryption policies These are independent settings: @@ -199,7 +252,7 @@ default_export_profile: full | sanitized ### 11.1 Minimal retention -Minimal provenance is the REQUIRED default for Thinkloom 1.0. It retains final user-approved input, operation purpose, prompt-template identity/hash, input references/hashes, provider/model identity, accepted generated text, disposition metadata, manuscript lineage, checkpoints, and releases. +Minimal provenance is the REQUIRED default for a CPL 1.0-conforming project. It retains final user-approved input, operation purpose, prompt-template identity/hash, input references/hashes, provider/model identity, accepted generated text, disposition metadata, manuscript lineage, checkpoints, and releases. It MUST NOT retain raw speech hypotheses, complete provider-facing prompts, complete supplied context, unaccepted raw model responses, or provider transport metadata. @@ -357,6 +410,8 @@ Assertion evaluation statuses are: Every evaluation MUST assess these dimensions independently: `integrity`, `identity`, `chronology`, `derivation`, `authorship`, and `completeness`. Dimension values are `exact`, `degraded`, `unverified`, or `not_applicable`. Numeric confidence scores and human-versus-AI percentages MUST NOT be used. +For compatibility with the existing v0.4 assertion registry, the wire-level dimension name `authorship` is retained. In this specification it means only the sufficiency of recorded evidence for the assertion's explicitly bounded authorship-related predicate. It MUST NOT be displayed or interpreted as legal authorship, copyrightability, originality, or a HARP conclusion; an `exact` value means only that the retained evidence satisfies that declared predicate and scope. + An `exact` evaluation MUST have no uncertainty boundary, MUST contain valid results for every non-shadow dependency, and MUST contain no `degraded` or `unverified` confidence dimension. Shadow evidence never contributes authority and MAY remain unevaluated without changing exactness. A non-exact evaluation MUST identify the exact boundary, affected dimensions, dependencies when applicable, and a stable reason code. Unknown provenance, source generation, compatibility, or confidence MUST NOT silently produce an `exact` evaluation. Evidence classes are `mandatory_live`, `mandatory_retained`, `advisory`, and `shadow`. Missing or incompatible mandatory evidence prohibits `exact`. Advisory or shadow evidence MAY degrade completeness or another named dimension but MUST NOT silently change an authoritative assertion. @@ -365,6 +420,78 @@ Assertion and evaluation reason codes, lifecycle phases, statuses, dimensions, e Derived indexes and reports MAY project assertions and the latest applicable evaluations, but remain non-authoritative consumers. They MUST NOT synthesize an `exact` result when no valid authoritative evaluation exists. +### 15.2 Deposit snapshots and authoritative locators + +A HARP MUST bind one immutable deposit snapshot containing at least: + +- Deposit ID and deposit-snapshot schema version +- Exact deposit-file digest and byte length +- Deposit media type and sanitized display name +- Bound manuscript revision ID and revision digest +- CPL chain head digest and event sequence used for the projection +- Layout-profile ID and digest when page locators are emitted +- Creation timestamp, application version, and schema versions + +The deposit revision, deposit digest, and stable expression-segment ID are authoritative locators. Chapter, paragraph, line, and page numbers are derived locators. A page number MUST identify its layout profile and MUST NOT be used as the sole identity of expression or as an authoritative range boundary. + +Freezing a deposit does not freeze the working manuscript. Any edit or restoration after the bound deposit snapshot, or any change to the selected deposit bytes, creates a newer dependency state and MUST make the HARP `stale` for the current work. Staleness does not falsify or invalidate a previously verified historical HARP for its exact bound deposit; the UI MUST show both facts. A stale HARP is immutable and MUST be regenerated from a new deposit snapshot rather than updated in place. + +### 15.3 HARP content and generation + +HARP generation MUST be deterministic and MUST NOT use an LLM to classify authorship, decide originality or copyrightability, fill an evidence gap, or formulate a legal conclusion. Identical canonical inputs, policy profile, generator version, and sanitization profile MUST produce byte-identical machine-readable HARP content. + +A canonical HARP MUST include: + +- HARP ID, schema version, application version, and generator version +- Exact deposit binding required by §15.2 +- CPL chain head and sequence used for projection +- A complete contribution-map coverage statement with an explicit denominator and coordinate unit +- Recorded-origin, transformation, and selection/arrangement layers kept separate +- Current applicable assertion evaluations and visible exact, degraded, stale, unverified, unknown, and unattested boundaries +- AI systems and models recorded as used for included expression, with unavailable identity represented as unknown +- Representative transformations linked to their CPL basis +- Suggested `Author Created`, `Material Excluded`, and `New Material Included` language when supported by the selected policy profile +- Every user declaration, including author identity, labeled as a declaration and identified as self-declared unless stronger evidence is present +- Limitation, sanitization, and omission disclosures +- The policy-profile ID, version, source retrieval date, and source digests or stable source references +- A verification report and manifest binding every emitted artifact and digest +- A clear statement that the U.S. Copyright Office, not Thinkloom, determines copyrightability and registration scope + +Coverage MUST describe only the scope of recorded evidence. For example, it MAY state that a percentage of normalized Unicode scalar positions has recorded origin. It MUST NOT relabel that denominator as “human,” “human-authored,” “original,” or “copyrightable.” Selection and arrangement MUST appear as relationship overlays and MUST NOT change the recorded-origin layer. + +Suggested registration language MUST be generated only after the user selects a deposit and policy profile, reviews the evidence classifications and limitations, edits or accepts the proposed text, and explicitly approves generation. Approval MUST bind the exact approved strings and their source HARP inputs in CPL. Thinkloom MUST NOT submit an application, assert that the language is legally sufficient, or silently replace user-approved language when a policy profile changes. + +### 15.4 HARP verification and traceability + +HARP verification is a scoped integrity operation. It MUST verify artifact hashes, manifest bindings, deposit bytes, CPL source head and records, schema and generator compatibility, policy-profile binding, sanitization disclosures, and deterministic regeneration when the required generator is available. + +Every factual claim and suggested treatment in a HARP MUST expose a trace path to the supporting CPL event, record, assertion, evaluation, and any user approval. A successful verification MUST be labeled **HARP integrity verified** and MUST show the exact deposit digest. It MUST NOT be labeled **authorship verified**. + +The following states are independent and MUST NOT be collapsed: + +- CPL verification status under §15 +- HARP integrity verification status +- HARP applicability: `current` or `stale` +- Evidence boundary: `exact`, `degraded`, `stale`, `unverified`, `unknown`, or `unattested` +- Policy-profile currency: `current`, `superseded`, or `unavailable` +- User approval status for suggested registration language + +### 15.5 Initial U.S. Copyright Office policy profile + +The initial policy profile MUST be a versioned, read-only profile scoped to **United States / literary work / Standard Application**. It MUST identify its effective application scope and MUST refuse to produce application-field suggestions for unsupported jurisdictions, work classes, group registrations, or application types. + +The initial profile MUST cite, at minimum, the following official sources with retrieval date `2026-07-19`: + +- [Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence](https://www.copyright.gov/ai/ai_policy_guidance.pdf), effective March 16, 2023 +- [Copyright and Artificial Intelligence, Part 2: Copyrightability](https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf), January 2025 +- [Standard Application Help: Author](https://www.copyright.gov/eco/help-author.html) +- [Standard Application Help: Limitation of Claim](https://www.copyright.gov/eco/help-limitation.html) +- [37 C.F.R. § 202.3](https://www.copyright.gov/title37/202/37cfr202-3.html) + +The profile MUST encode field terminology separately from evidentiary classifications and MUST support suggested text for `Author Created`, `Material Excluded`, `New Material Included`, and, when appropriate, `Note to CO`. The `Author Created` and `New Material Included` suggestions MUST remain mutually consistent. The profile MUST disclose recorded use of AI and MUST support describing human contributions and excluding more-than-de-minimis AI-generated content as directed by the cited guidance, while leaving case-specific judgment and the final wording to the user and the Office. Every suggestion screen and generated worksheet MUST state that the text is suggested, editable, not legal advice, and subject to Copyright Office review. + +Policy rules MUST NOT convert CPL activity metrics or recorded-origin categories into copyrightability conclusions. Prompts, selection/arrangement, and modifications MAY be described as evidence only; their legal sufficiency MUST remain undetermined. A published profile is immutable. A policy update creates a new profile version; it MUST NOT silently change or regenerate an existing HARP. A HARP bound to a superseded profile remains historically reproducible and MUST visibly disclose that profile status. + ## 16. Derived indexes Derived indexes MUST be reproducible from authoritative records. Deterministic index content MUST use stable sorting, locale-independent comparison, canonical inputs, fixed schema/configuration, no random identifiers, and no current timestamp. @@ -444,16 +571,28 @@ A purge MAY rewrite affected records, ledger hashes, and Git history only throug Ordinary editing MUST NOT invoke purge behavior. -## 23. Legacy preview projects +## 23. Legacy preview projects and CPL conformance boundary -Thinkloom 1.0 MUST detect known preview/experimental project markers and refuse normal opening or editing. It MUST preserve the original project untouched, explain that migration is deferred, offer Show Project Folder, and permit a byte-preserving raw archival ZIP labeled: +Only a project with the exact, supported conformance marker below MAY be treated as CPL-conforming: -```text -Legacy project preservation archive -Not verified or converted by Thinkloom 1.0.0 +```json +{ + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0" +} ``` -Thinkloom 1.0 MUST NOT import legacy records into schema 1.0, regenerate or verify their provenance under 1.0 rules, create a 1.0 evidence report, modify their Git history, or present them as migrated. Formal legacy reading, conversion, and migration begin after 1.0.0. +The marker is necessary but not sufficient: schema compatibility, required CPL structure, startup recovery, and native verification gates still apply. A `schemaVersion: 1.0` field or any preview-era marker MUST NOT be interpreted as this conformance marker. + +Thinkloom 0.6 and later MUST detect projects created by any v0.5.x release or earlier and other known preview/experimental project markers before any project mutation. It MUST refuse normal opening, editing, provenance regeneration, CPL verification, and HARP generation. It MUST preserve the original project untouched, explain that migration is deferred until after Thinkloom 1.0.0, offer Show Project Folder, and permit a byte-preserving raw archival ZIP labeled: + +```text +Legacy preview-project preservation archive +Not verified, converted, or CPL-conforming +``` + +Thinkloom MUST NOT import legacy records into CPL schema 1.0, synthesize CPL events from legacy state, regenerate or verify their provenance under CPL rules, create a HARP or CPL evidence report, modify their Git history, or present them as migrated or partially conforming. Formal legacy reading, conversion, and migration begin only after Thinkloom 1.0.0 and require a future normative migration specification. ## 24. Formal schema inventory for Stage 2 @@ -500,9 +639,16 @@ release-manifest.schema.json release-state.schema.json sanitized-export-manifest.schema.json purge-manifest.schema.json +composition-operation.schema.json +expression-segment.schema.json +contribution-map.schema.json +deposit-snapshot.schema.json +registration-policy-profile.schema.json +human-authorship-record.schema.json +harp-export-manifest.schema.json ``` -Prompt-template, provenance-assertion, and other self-digesting schemas MUST define exact digest identity objects. Migration schemas are deferred until after Thinkloom 1.0.0. +Prompt-template, provenance-assertion, contribution-map, registration-policy-profile, human-authorship-record, HARP export-manifest, and other self-digesting schemas MUST define exact digest identity objects. Migration schemas are deferred until after Thinkloom 1.0.0. ## 25. Required implementation characteristics diff --git a/docs/provenance/STAGE-10-EXPORT-PRIVACY-SECURITY.md b/docs/provenance/STAGE-10-EXPORT-PRIVACY-SECURITY.md new file mode 100644 index 0000000..7ab42d0 --- /dev/null +++ b/docs/provenance/STAGE-10-EXPORT-PRIVACY-SECURITY.md @@ -0,0 +1,55 @@ +# Stage 10 — Export, privacy, and security + +Status: **Complete for Thinkloom 0.5.10** + +Milestone/version rule: **Milestone 10 → 0.5.10** + +## Delivered artifacts + +The native HARP export service creates six separate artifacts from one current, exact-deposit HARP: + +1. registration worksheet; +2. human-readable HARP; +3. canonical machine-readable HARP; +4. exact deposit copy; +5. sanitized supporting archive; and +6. full private archive. + +The exact machine-readable HARP and deposit remain unchanged private artifacts. User-selected author-name redaction applies only to sanitized human-readable presentations. A stale HARP or a deposit whose bytes no longer match its recorded digest cannot be exported. + +## Sanitized archive boundary + +The sanitized archive is assembled from an allowlist of derived presentation and structural-evidence files. It never copies raw records or ledger segments and excludes the deposit and full machine-readable HARP. Its omission manifest always addresses: + +- private conversations; +- rejected model output; +- credentials and authorization material; +- personal identifiers selected for redaction; +- internal paths; +- provider metadata not required for disclosure; and +- protected source bodies. + +Each omission entry contains its category, action, affected-record count, retained-evidence binding digest, and disclosure digest. The manifest separately hashes the ordered omission-rule set. + +## Verification and completeness + +Before publication, the native verifier reopens the sanitized ZIP and checks: + +- every required omission category is present; +- every disclosure digest and the aggregate rules digest recompute; +- every retained file exists and matches its byte length and SHA-256 binding; and +- the CPL chain head, HARP digest, and deposit digest match the expected source bindings. + +Success is reported as `verified_selective`, never as complete. The manifest declares `selective_disclosed_subset` and states that verification covers disclosed retained evidence only. It does not claim that omitted private history is present or that provenance integrity decides identity or legal authorship. + +Export writes only derived files under `exports/harp/`. It does not append a CPL event, rewrite a record, advance the source chain, or alter the exact deposit. The full private archive carries an explicit sharing warning and includes the exact deposit, private HARP artifacts, records, ledger segments, and generated report material. + +## Acceptance evidence + +- A native integration test generates an exact HARP, creates all six artifacts, and proves the CPL chain head is unchanged. +- The test confirms the sanitized ZIP contains no raw records, ledger segments, deposit copy, or exact machine HARP and that selected identity text is absent. +- The same test confirms the full private archive retains the deposit, records, and ledger. +- Schema vectors validate the selective completeness claim and recompute every omission-disclosure digest. +- UI tests cover artifact separation, redaction selection, privacy warnings, omission disclosure, and re-verification. + +Unmarked preview projects retain the preservation-only boundary and cannot use HARP export commands. diff --git a/docs/provenance/STAGE-11-VERIFICATION-MATRIX.md b/docs/provenance/STAGE-11-VERIFICATION-MATRIX.md new file mode 100644 index 0000000..d0b1c0a --- /dev/null +++ b/docs/provenance/STAGE-11-VERIFICATION-MATRIX.md @@ -0,0 +1,44 @@ +# Stage 11 — Verification matrix + +Status: **Complete for Thinkloom 0.5.11** + +Milestone/version rule: **Milestone 11 → 0.5.11** + +## Release rule + +Release finalization is a native security boundary. Immediately before changing `project.json`, appending `RELEASE_FINALIZED`, committing, or tagging, Thinkloom runs the authoritative native CPL verifier. Only `VERIFIED` and `VERIFIED_WITH_WARNINGS` may proceed. `INCOMPLETE`, `FAILED`, and `UNSAFE` return `RELEASE_VERIFICATION_BLOCKED` without creating release state. The frontend uses the same five native status values and does not optimistically mark a release finalized. + +## Executable matrix + +| Required scenario | Executable coverage | +| --- | --- | +| Schema fixtures and deterministic regeneration | `provenance-schema.test.mjs`; generated fixture and vector diff gate | +| Canonical JSON, Unicode, timestamps, paths, and JSONL | Schema vector suite plus native canonical and identifier tests | +| Duplicate action and concurrent writer behavior | Native idempotency, conflict, OS-lock, and concurrent-preimage tests | +| Failure after every durable write phase | Native crash injection for record, ledger, chain-head, SQLite, and segment-rotation boundaries | +| Segment rotation and cross-segment verification | Native sealed/active segment linkage and recovery tests | +| Manual typing and deletion | Typed Phase 1 replay and native composition deletion test | +| Paste/import behavior | Instrumented paste signal and imported-origin replay test | +| Human revision of AI-origin material | Native mixed-origin transformation/revision lineage test | +| AI transformation of human material | Native AI-acceptance replacement with source lineage test | +| Partial AI acceptance | Exact accepted/rejected Unicode scalar disposition test | +| Selection and arrangement without changing origin | Origin-preserving native move implementation and mismatch refusal test | +| Voice transcription with no audio persistence | Typed transcription record and no-audio path/digest/file tests | +| Restore and checkpoint lineage | Restoration replay, checkpoint flush, and immutable record tests | +| Unknown and unattested spans | Unverified coverage and boundary tests without negative authorship inference | +| Deposit/HARP staleness | Frozen-map and HARP dependency/revision staleness tests | +| Complete segment coverage across complex Unicode | Combining mark, modifier, ZWJ, flag, CJK, and CRLF scalar coverage test | +| Native verifier/frontend consistency | Shared status-set test plus native and frontend release gates | +| Sanitized archive disclosure | Omission-category, retained-file, binding, and selective-scope tests | +| Prohibited score/legal wording | Production-source scan for numeric human scores and affirmative legal conclusions | +| Packaged Windows end-to-end | Release executable PE check, MSI and NSIS signature/version checks, and hidden launch smoke test | + +`tests/verification-matrix.test.mjs` is the executable index for this table. It fails if a required native or frontend case disappears. `tests/windows-package.test.mjs` is intentionally a post-build Windows gate and is run by `npm run verify:windows-package`. + +## Origin-preserving arrangement + +A `move` operation may only rearrange the exact existing Unicode scalar multiset. Thinkloom moves the existing lineage units, retaining recorded origin, ancestry, lineage references, and prior operation references, while appending the move operation identity. A move that inserts, deletes, or substitutes content is rejected before any CPL event is committed. + +## Interpretation boundary + +The matrix verifies integrity, chronology, replay, origin records, transformation records, coverage, disclosure, and release safety. It does not produce a human-authorship score or determine legal authorship, originality, copyrightability, ownership, or registrability. diff --git a/docs/provenance/STAGE-2-SCHEMA-PACKAGE.md b/docs/provenance/STAGE-2-SCHEMA-PACKAGE.md index 2e6316f..b7d75a2 100644 --- a/docs/provenance/STAGE-2-SCHEMA-PACKAGE.md +++ b/docs/provenance/STAGE-2-SCHEMA-PACKAGE.md @@ -1,43 +1,71 @@ # Thinkloom Stage 2 Provenance Schema Package -Status: **Complete for Thinkloom 0.4.0** -Schema family: **1.0** +Status: **Complete for Thinkloom 0.5.2** + +Schema family: **1.0, additive catalog 1.1** + Dialect: **JSON Schema Draft 2020-12** + +CPL runtime target: **Thinkloom 0.6.0** + Runtime conformance: **Not yet implemented** ## Scope -Stage 2 formalizes the approved provenance architecture without changing native application behavior. It provides deterministic contracts and verification evidence for the later native-writer implementation. Migration support remains deferred until after Thinkloom 1.0.0. +The 0.5.2 package extends the existing provenance schema family with composition-specific records rather than overloading v0.4 assertions or edit transactions. It formalizes the normative HARP/CPL model without changing native application behavior. Existing v0.4 `provenance-assertion` and `assertion-evaluation` instances and semantics remain valid. + +Migration support remains deferred until after Thinkloom 1.0.0. Projects created before the Milestone 4 marker remain preview projects and MUST NOT be represented as CPL-conforming merely because these schemas are present. ## Package -The machine-readable package is in [`schemas/provenance/v1`](../../schemas/provenance/v1/README.md). `catalog.json` identifies all 40 schemas, the schema and application versions, compatibility, fixture locations, and the generator. +The machine-readable package is in [`schemas/provenance/v1`](../../schemas/provenance/v1/README.md). `catalog.json` identifies all 47 schemas, 14 registries, package/schema/application versions, per-entry introduction and compatibility, fixture locations, the v0.6.0 runtime target, and the generator. + +The seven additive schemas are: + +- `composition-operation.schema.json` +- `expression-segment.schema.json` +- `contribution-map.schema.json` +- `deposit-snapshot.schema.json` +- `registration-policy-profile.schema.json` +- `human-authorship-record.schema.json` +- `harp-export-manifest.schema.json` Each schema has: - one valid canonical fixture; - invalid cases for every top-level required field and the closed-object policy; - populated nested cases for enum, const, pattern, numeric, string, and array bounds; and -- explicit conditional failures for protected records, recovery envelopes, assertion generations, and exact evaluation rules where ordinary keyword mutation is insufficient. +- explicit conditional failures for operation/origin consistency and exact-classification identity, generation, origin, lineage, AI-system identity, coverage, and applicability boundaries. + +## Independent registries + +The package adds versioned registries for: + +- composition operation kinds; +- recorded origin kinds; +- transformation relationships; +- contribution-map layers; +- suggested registration treatments; +- HARP limitation codes; +- HARP explanation codes; and +- composition assertion predicates: `derived_from`, `generated_by`, `modified_by_human`, `selected_by_human`, `arranged_by_human`, and `included_in_deposit`. + +Recorded origin, transformation, selection/arrangement, evidentiary evaluation, and suggested registration treatment remain independent. A paste cannot default to direct human input, and selection/arrangement cannot alter text origin. ## Deterministic vectors -The vector suite covers: +In addition to the existing canonicalization, ledger, assertion, privacy, backup, and release vectors, the suite now covers: -- RFC 8785-compatible serialization after Thinkloom Unicode NFC preprocessing; -- prohibited non-finite, undefined, and NFC-colliding values; -- exact millisecond UTC timestamps and repository-relative path restrictions; -- LF-only canonical JSONL, contiguous events, event self-digests, and cross-segment seals; -- prompt-template, protected-record, event, and release self-digest identities; -- minimal and full-private retention behavior; -- device and recovery key envelopes plus key rotation; -- non-mutating sanitized exports and omission-rule disclosure; -- deterministic derived indexes; -- backup and release manifests plus the release-files Merkle root; -- all verification statuses and finding severities; -- immutable assertion envelopes and exact self-digest identity; -- point-in-time exact, degraded, refused, stale, and unverified evaluations; and -- versioned reason, lifecycle, confidence, evidence, boundary, and consumer-decision registries. +- all composition-operation origin rules; +- exact expression-segment classification boundaries; +- refusal of exact HARP classification for unknown origin, identity, generation, lineage, or AI-system identity; +- complete ordered non-overlapping Unicode-scalar contribution-map coverage; +- byte-stable map generation from different input orders; +- contribution-map, policy-profile, HARP, and HARP-manifest self-digest identities; +- exact deposit, manuscript revision, CPL head, policy profile, and export-manifest bindings; +- HARP staleness after a later manuscript revision without invalidating historical deposit integrity; +- explicit approval of editable suggested registration language; and +- prohibited human/AI percentage and legal-score fields. ## Verification @@ -47,14 +75,14 @@ Regenerate deterministically: npm run provenance:schema:generate ``` -Validate schemas, fixtures, and vectors: +Validate schemas, fixtures, registries, and vectors: ```powershell npm run provenance:schema:test ``` -The schema tests are also part of `npm test`. Generated output must be committed with its generator and tests. A clean regeneration is required before changing any formal schema or vector. +The schema tests are also part of `npm test`. Generated output must be committed with its generator and tests. A clean second regeneration must produce no changes. ## Next boundary -Thinkloom 0.4.0 must not claim native provenance conformance. The next implementation stage replaces the MVP persistence path with the approved single-writer protocol and then executes the durable-boundary fault-injection matrix. +Thinkloom 0.5.2 is schema-complete for this milestone but MUST NOT claim native CPL or HARP runtime conformance. Thinkloom 0.5.3 subsequently implemented the native CPL service and its core crash-injection matrix. Thinkloom 0.5.4 then established the exact-marker project boundary; all earlier unmarked projects remain read-only previews. diff --git a/docs/provenance/STAGE-3-NATIVE-CPL-SERVICE.md b/docs/provenance/STAGE-3-NATIVE-CPL-SERVICE.md new file mode 100644 index 0000000..b852aab --- /dev/null +++ b/docs/provenance/STAGE-3-NATIVE-CPL-SERVICE.md @@ -0,0 +1,111 @@ +# Stage 3 Native CPL Service + +Status: **Complete for Thinkloom 0.5.3** + +Implementation milestone: **3** + +Application release: **Thinkloom 0.5.3** + +Schema family: **Provenance 1.0 with the additive 0.5.2 composition/HARP package** + +Project-format conformance target: **Thinkloom 0.6.0 / CPL 1.0** + +## Outcome + +Thinkloom 0.5.3 replaces frontend and monolithic Rust provenance authority with one modular native Composition Provenance Ledger service. The service creates immutable records, assigns contiguous event sequences, writes canonical ledger events, advances the chain head, maintains rebuildable SQLite indexes, performs recovery, and returns structured native verification reports. + +The implementation is organized under `src-tauri/src/provenance/`: + +```text +canonical.rs +identifiers.rs +records.rs +writer.rs +ledger.rs +recovery.rs +verifier.rs +composition.rs +assertions.rs +projections.rs +harp.rs +export.rs +``` + +## Canonical identity + +The native canonicalization implementation: + +- Normalizes JSON keys and string values to Unicode NFC. +- Rejects NFC key collisions. +- Orders object keys using RFC 8785 UTF-16 ordering. +- Emits UTF-8 without a BOM and JSONL with LF delimiters. +- Applies deterministic JSON number rendering, including normalized exponent signs and negative zero. +- Produces lowercase `sha256:` digest strings. +- Defines explicit identity objects for records and events, excluding only their respective self-digest fields. + +Native tests reproduce the Stage 2 key-order, NFC, and number vectors. Canonical timestamps use RFC 3339 UTC with exactly millisecond precision. Native identifiers use type prefixes plus a sortable millisecond and per-millisecond sequence component. + +## Single-writer transaction + +Each mutation receives a stable `client_action_id` and executes while holding an exclusive operating-system file lock for that project. The lock is held only for native provenance mutation and recovery; provider calls and Git work remain outside it. + +The writer follows the normative phase sequence: + +```text +PREPARED +RECORDS_DURABLE +LEDGER_APPENDED +CHAIN_HEAD_ADVANCED +SQLITE_APPLIED +COMPLETE +``` + +Unsafe or abandoned operations finish as `QUARANTINED` or `FAILED`. Immutable records are canonicalized and flushed in same-filesystem staging before atomic movement into `records/`. The event sequence is derived from the verified ledger immediately before append and is never reserved by SQLite. + +Committed action receipts make identical retries return the original event and record references. Reusing the same action ID with a different canonical command digest is an integrity error. + +## Segmented ledger and recovery + +The ledger maintains one active JSONL segment and immutable sealed segments. Default rotation thresholds are 10,000 events or 10 MiB. Each sealed manifest binds its previous segment digest, event range, event count, byte length, file digest, and seal timestamp. + +Recovery runs under the writer lock and can: + +- Remove an unreferenced incomplete active JSONL suffix. +- Complete an interrupted segment-manifest move after validating its digest. +- Advance a chain head that is behind a complete durable event. +- Reconstruct a missing head from the verified final event. +- Quarantine staged or final immutable records that have no committed event. +- Replay committed actions and rebuild SQLite event, record, and idempotency indexes. +- Refuse automatic repair when the head is ahead of the readable ledger or an authoritative contradiction exists. + +## Native verification + +The verifier returns the normative `VERIFIED`, `VERIFIED_WITH_WARNINGS`, `INCOMPLETE`, `FAILED`, or `UNSAFE` status with scoped findings. It checks: + +- Project identity, exact timestamps, contiguous sequences, previous-event links, and event digests. +- Active and sealed segment readability and sealed-manifest bindings. +- Chain-head agreement with the final readable event. +- Safe record paths, canonical record bytes, record identity, and referenced digests. +- Registered assertion and evaluation structure when those record types are present. +- Rebuildable SQLite index agreement, reported only as a warning when stale or unavailable. + +React no longer creates provenance hashes, chain heads, authoritative events, evidence-package hashes, or a local “valid” result. It supplies a stable action identifier and renders only the native verification report. Browser fallback explicitly refuses to synthesize an evidence package. + +## Verification matrix + +The Rust suite injects deterministic termination after every native writer durability boundary: + +- Write-intent creation. +- First staged record write. +- Record flush, atomic move, and directory durability step. +- Active-segment and sealed-manifest flushes. +- Segment and manifest moves and next-active-segment creation. +- Ledger append before flush and after flush. +- Chain-head temporary write, atomic replacement, and directory durability step. +- SQLite application and final completion. + +For every point, recovery proves that the action is absent and retryable, committed and idempotently discoverable, deterministically completed, or quarantined without false success. Separate tests cover concurrent writers, conflicting retries, cross-segment verification, tamper detection, and SQLite reconstruction. + +## Release boundary + +Thinkloom 0.5.3 completes Milestone 3 and provides the native CPL service, but remains a v0.5 preview release. It does not add the unambiguous conforming project marker or convert existing preview projects. Milestone 4, released as 0.5.4 under the milestone/version convention, subsequently established that project boundary. The limitation in this Stage 3 record continues to apply to every unmarked project. diff --git a/docs/provenance/STAGE-4-CONFORMING-PROJECT-BOUNDARY.md b/docs/provenance/STAGE-4-CONFORMING-PROJECT-BOUNDARY.md new file mode 100644 index 0000000..d604a8b --- /dev/null +++ b/docs/provenance/STAGE-4-CONFORMING-PROJECT-BOUNDARY.md @@ -0,0 +1,91 @@ +# Stage 4 — Conforming project boundary + +Status: **Complete for Thinkloom 0.5.4** + +Milestone/version rule: **Milestone 4 → 0.5.4** + +Project format: **thinkloom-cpl 1.0** +Provenance conformance marker: **cpl-1.0** + +## Outcome + +Thinkloom 0.5.4 establishes an unambiguous boundary between newly created CPL projects and every earlier preview project. The opener classifies a selected directory by reading `project.json` and the minimum required structure before it invokes recovery, verification, SQLite, Git, or any other mutating service. + +Only this exact marker is supported: + +```json +{ + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0" +} +``` + +`schemaVersion: "1.0"`, `schema_version: "1.0"`, an incomplete marker, or a differently versioned marker is not sufficient. + +## New-project contract + +New 0.5.4 projects: + +- serialize the formal snake-case project manifest; +- include the exact supported marker; +- bind the initial project manifest and provenance policy as immutable CPL records; +- initialize `records/`, active and sealed `provenance/ledger/` storage, `reports/`, and operational `.app/` storage; +- keep writer locks under `.app/locks/`, same-filesystem staging under `.app/temp/staging/`, recovery quarantine under `.app/recovery/`, and SQLite under `.app/state.sqlite`; +- pass CPL recovery and native verification before becoming editable when reopened. + +The marker is necessary but not sufficient. Missing required directories produce `CPL_BLOCKED`; an integrity result other than `VERIFIED` or `VERIFIED_WITH_WARNINGS` also leaves the project unavailable for editing. + +## Classification states + +| Classification | Meaning | Permitted actions | +| --- | --- | --- | +| `CPL_CONFORMING` | Exact marker, supported schema and required structure; native recovery and verification pass | Normal editable opening | +| `LEGACY_PREVIEW_READ_ONLY` | Marker absent, including v0.5 projects with only `schemaVersion: "1.0"` | Explain, Show Project Folder, preservation archive | +| `UNSUPPORTED_READ_ONLY` | Invalid, partial, or unsupported marker/manifest | Explain and Show Project Folder | +| `CPL_BLOCKED` | Exact marker is present, but structure, schema compatibility, recovery, or integrity gate fails | Explain and Show Project Folder; no editable activation | + +Classification itself is read-only. A read-only selection clears the active editable project so subsequent persistence and provenance commands cannot target either the legacy project or a previously open project by mistake. + +## Legacy preservation + +Thinkloom does not load legacy state into the editor and does not invoke CPL recovery for an unmarked project. The UI exposes only: + +- **Show project folder**; and +- **Create preservation archive** for `LEGACY_PREVIEW_READ_ONLY` projects. + +The archive must be saved outside the source project. It stores each source file without content transformation, retains directory and symbolic-link entries, and includes this label: + +```text +Legacy preview-project preservation archive +Not verified, converted, or CPL-conforming +``` + +The native implementation inventories the source before and after archive creation. If any entry changes during the operation, it removes the incomplete destination archive and reports a retryable failure. Legacy backup import is explicitly refused. + +## Prohibited legacy behavior + +Before a future post-1.0 migration specification, Thinkloom 0.5.4 does not: + +- add a marker to a legacy project; +- convert or import legacy preview data into CPL; +- synthesize records or ledger events; +- run CPL recovery or represent legacy provenance as verified; +- modify Git history; +- generate CPL evidence or HARP artifacts. + +## Acceptance evidence + +Native tests prove that: + +- `schemaVersion: "1.0"` without the marker is classified as legacy; +- inspection leaves the complete source inventory unchanged; +- exact markers remain blocked until the required layout exists; +- partial and unsupported markers never enter recovery; +- preservation archives reproduce arbitrary binary file bytes while leaving the source inventory unchanged. + +Static application acceptance tests additionally enforce inspection-before-recovery ordering, `.app` operational paths, exact marker constants, legacy-only controls, and the absence of `.thinkloom` runtime storage. + +## Remaining boundary + +Milestone 4 establishes project-format and opener conformance only. Phase 1 typed reconstruction is assigned to Milestone 5 / 0.5.5. Composition transaction lineage, contribution-map generation, HARP generation, dedicated CPL/HARP interfaces, export hardening, and the full release verification matrix remain assigned to later milestones. No HARP or legal conclusion is produced by this milestone. diff --git a/docs/provenance/STAGE-5-PHASE-1-CPL-ROUTING.md b/docs/provenance/STAGE-5-PHASE-1-CPL-ROUTING.md new file mode 100644 index 0000000..472b072 --- /dev/null +++ b/docs/provenance/STAGE-5-PHASE-1-CPL-ROUTING.md @@ -0,0 +1,62 @@ +# Stage 5 — Phase 1 CPL routing + +Status: **Complete for Thinkloom 0.5.5** + +Milestone/version rule: **Milestone 5 → 0.5.5** + +## Outcome + +Thinkloom 0.5.5 removes the generic `persist_state` provenance route. Phase 1 now submits typed native commands to the CPL service, and the ideation workspace is reconstructed by replaying canonical `phase1-operation` records in ledger order. SQLite's `phase1_projection` table is a disposable cache and can be rebuilt from the ledger and immutable records. + +The React state object is no longer written as an authoritative record or SQLite recovery source. Canonical Phase 1 replay covers: + +- human typed turns and voice-mediated human turns; +- retained assistant responses and their provider invocation identity; +- session creation, activation, and title revision; +- persona, challenge level, genre, lore, provider context, and cloud-approval changes; +- idea creation, merging, selection/status changes, and every idea revision; +- human or assistant transcript turns appended to the drafting paper; +- manual drafting-paper edits and clearing; +- distillation request, response, and accepted disposition; +- pasted/imported/external material declarations; and +- provider invocation requests, responses, and bounded failures. + +## Record model + +Every Phase 1 event binds exactly one authoritative `phase1-operation` record containing a validated `Phase1Command`. The same event also binds operation-specific evidence records such as `transcript-turn`, `idea-revision`, `drafting-paper-revision`, `invocation-request`, `invocation-response`, `invocation-failure`, `disposition-revision`, and `source-declaration`. + +Typed commands use stable `client_action_id` values and the native writer's existing idempotency, canonicalization, writer lock, staging, ledger, chain-head, and recovery rules. They set `operational_state` to `None`; the former `application-state-snapshot` route is not used by the application. + +## Provider lifecycle boundary + +Before a model request or provider connectivity request performs network I/O, the runtime commits a `ProviderInvocationRequested` command containing: + +- invocation and session identifiers; +- purpose and provider context; +- canonical digests for prompt template, input, and supplied context; and +- the exact request time. + +The CPL write completes and releases the exclusive writer lock before provider I/O begins. A successful call is followed by `ProviderInvocationResponded`; an error or unsuccessful connectivity result is followed by `ProviderInvocationFailed` with a bounded summary. A retained assistant turn separately binds the response to the visible conversation. + +## Voice and external material + +Voice recognition yields a human `transcript-turn` with `input_mode: voice_transcription`. Its companion record fixes `audio_retained` to `false` and `audio_reference` to null. No audio body, path, identifier, or digest is recorded. + +Paste handlers prevent an undeclared state-only insertion and instead commit `ExternalContentDeclared` with the retained text, target, resulting text, and the writer-facing declaration. Paste is recorded as external material; it is not automatically classified as human-authored. + +## Reconstruction and recovery + +`load_phase1_projection` reads canonical ledger events and records. It does not load a serialized React object. Recovery index rebuilding also reconstructs the disposable Phase 1 cache from those canonical inputs. Derived `ideas/ideas.json` and `conversations/sessions.json` files are convenience mirrors, not replay authority. + +Focused native tests prove: + +- typed records reconstruct Phase 1 after deleting the projection cache; +- reconstruction does not require `application-state-snapshot`; +- a provider request is durable before simulated I/O and another writer can proceed between request and outcome; and +- voice transcription retains text without an audio reference or audio digest. + +Static acceptance tests additionally ensure the frontend uses the typed command/projection routes, all required command and evidence families exist, and response/failure recording follows provider I/O. + +## Boundary retained + +This milestone instruments Phase 1 only. Manuscript transaction capture, surviving-expression lineage, partial AI acceptance ranges, contribution maps, HARP generation, and dedicated CPL/HARP interfaces remain assigned to later milestones. Thinkloom 0.5.5 does not generate HARP, infer copyrightability, or convert unmarked preview projects. diff --git a/docs/provenance/STAGE-6-MANUSCRIPT-COMPOSITION-LINEAGE.md b/docs/provenance/STAGE-6-MANUSCRIPT-COMPOSITION-LINEAGE.md new file mode 100644 index 0000000..af37215 --- /dev/null +++ b/docs/provenance/STAGE-6-MANUSCRIPT-COMPOSITION-LINEAGE.md @@ -0,0 +1,42 @@ +# Stage 6 — Manuscript composition and lineage + +Status: **Complete for Thinkloom 0.5.6** + +Milestone/version rule: **Milestone 6 → 0.5.6** + +## Delivered boundary + +Thinkloom 0.5.6 makes typed native composition commands the authoritative manuscript history. TipTap/ProseMirror `onUpdate` transactions are coalesced at idle, focus-loss, section-change, AI-operation, checkpoint, phase-change, explicit-save, and document-close boundaries. Paste, drop/move, and restoration have explicit boundary signals as well. The drafting and finalization views use the same structured editor; no finalization textarea can bypass CPL capture. + +Every command supplies the exact prior and resulting manuscript. Native replay rejects stale preimages and no-op commands before an event is committed. A Unicode-scalar prefix/suffix diff derives the changed range without using edit counts, elapsed time, word counts, retained-word ratios, or any other originality heuristic. + +## Recorded origins and lineage + +Inserted expression is classified as one of: + +- recorded direct human input; +- human expressive input via transcription; +- accepted AI output; +- imported or pasted material; +- system restoration; or +- unattested expression. + +Paste is explicitly mapped to `imported_or_pasted`, never automatically to human authorship. New or legacy manuscript baselines that lack composition evidence are initialized as `unattested`. + +The native projection tracks lineage per normalized Unicode scalar and emits complete, non-overlapping expression spans. Each span carries stable ancestry, lineage references, operation references, origin, exact text, and a content digest. When a writer revises AI-origin text, replacement units reference the deleted AI ancestry and operation chain, preserving both the AI preimage and the later human operation. + +## AI acceptance + +AI acceptance records bind the provider invocation, retained response, accepted scalar ranges, rejected scalar ranges, partial/full disposition, operation, and result manuscript revision. Native validation requires non-empty in-range spans, rejects overlaps, requires complete scalar coverage, and verifies that the partial flag agrees with the rejected disposition. + +## Canonical replay and derived files + +The immutable `composition-command` record is the authoritative replay input. Each edit also emits `composition-operation`, `composition-content`, `manuscript-revision`, and `expression-segment` records; AI acceptance adds `ai-acceptance-disposition`. SQLite's `composition_projection` is disposable and rebuilt from ledger events and canonical records. `manuscript/manuscript.md` is written only from the resulting native projection. + +Composition preparation and its CPL write execute under the same exclusive project writer lock, so concurrent clients cannot commit two edits against the same preimage. The UI additionally serializes composition commands in submission order. + +## Acceptance evidence + +The Rust suite verifies mixed manual, paste, AI, human-revision, and restoration replay; Unicode-scalar partial-AI ranges; rejection of stale preimages without ledger mutation; exactly-one concurrent preimage commits; and idempotent retries with action-ID conflict detection. Static application tests verify the shared editor path, required boundaries and origins, paste classification, AI range bindings, canonical replay, and cache rebuild integration. + +Milestone 6 did not itself produce the contribution-map projection or HARP. The contribution-map projection is delivered by Milestone 7 / 0.5.7; HARP remains assigned to Milestone 8. diff --git a/docs/provenance/STAGE-7-CONTRIBUTION-MAP-PROJECTION.md b/docs/provenance/STAGE-7-CONTRIBUTION-MAP-PROJECTION.md new file mode 100644 index 0000000..7386963 --- /dev/null +++ b/docs/provenance/STAGE-7-CONTRIBUTION-MAP-PROJECTION.md @@ -0,0 +1,44 @@ +# Stage 7 — Contribution-map projection + +Status: **Complete for Thinkloom 0.5.7** + +Milestone/version rule: **Milestone 7 → 0.5.7** + +## Delivered boundary + +Thinkloom 0.5.7 adds a deterministic native contribution-map generator over the 0.5.6 composition ledger. Finalizing a release freezes the exact replayed manuscript as an immutable Markdown deposit, binds it to the manuscript revision and pre-projection CPL chain head, and records the deposit snapshot, contribution map, assertions, evaluations, and complete projection bundle as canonical CPL records. + +The native `freeze_contribution_map` and `load_contribution_map` commands also expose the projection independently of the later HARP interface. Repeating a request against the same revision and configuration reuses the existing frozen map instead of creating a time-dependent duplicate. + +## Deterministic coverage + +The generator sorts source spans with bytewise ordering, validates complete source coverage, and normalizes equivalent adjacent source splits before projection. It then splits expression at structural and fixed-layout boundaries while retaining the composition ancestry ID, lineage references, and operation references. Projected ranges are ordered, non-overlapping, and cover every Unicode scalar position in the frozen deposit exactly once. + +Map identity excludes only `contribution_map_sha256`. IDs, configuration, layout profile, segment boundaries, assertions, and map digest are derived from canonical inputs; generation time, locale, database index order, and presentation sorting do not affect the map bytes. + +## Structural locators + +Chapter and paragraph locators are derived from the frozen Markdown structure. Page locators use the recorded layout profile's fixed Unicode-scalar capacity, defaulting to 1,800 positions. Locators are derived metadata: the authoritative anchors remain the deposit digest, manuscript revision, scalar range, and stable segment ancestry. + +## Independent evidence dimensions + +Recorded origin and transformation remain properties of expression lineage. `included_in_deposit`, `selected_by_human`, and `arranged_by_human` are separate assertions; selection and arrangement assertions are emitted only when their explicit request declarations are true. Every emitted assertion has a point-in-time evaluation bound to a chain head and dependency results. + +The map never converts provenance coverage into an originality or human-authorship percentage. Its denominator is explicitly defined as all normalized Unicode scalar positions in the exact frozen deposit. `recorded_positions` counts positions with a recorded origin other than `unattested`. + +## Visible boundaries + +The native projection exposes range-addressed boundaries for: + +- `unattested` expression with no recorded origin; +- `degraded` lineage or missing frozen-deposit evidence; +- `unverified` CPL or provenance evidence; and +- `stale` deposit or manuscript-revision dependencies. + +Loading a frozen map re-evaluates its immutable assertions against current canonical state. A later composition revision makes the map stale without rewriting the frozen map record. + +## Acceptance evidence + +The Rust suite verifies byte-identical maps for reordered canonical inputs, normalization of equivalent source splits, structural and page splitting with stable ancestry, explicit unattested coverage, exact-map reuse, missing-deposit degradation, inconclusive-verification boundaries, and deterministic staleness after a later manuscript revision. Static integration tests verify native commands, release freezing, canonical record types, coverage invariants, locator layers, independent assertions, and all boundary states. + +Milestone 7 does not generate HARP or make copyrightability conclusions. Deterministic HARP generation remains assigned to Milestone 8. diff --git a/docs/provenance/STAGE-8-HARP-GENERATION.md b/docs/provenance/STAGE-8-HARP-GENERATION.md new file mode 100644 index 0000000..ec46e4a --- /dev/null +++ b/docs/provenance/STAGE-8-HARP-GENERATION.md @@ -0,0 +1,58 @@ +# Stage 8 — Deterministic HARP generation + +Status: **Complete for Thinkloom 0.5.8** + +Milestone/version rule: **Milestone 8 → 0.5.8** + +## Delivered boundary + +Thinkloom 0.5.8 adds a deterministic native Human Authorship Record of Provenance generator over the exact frozen deposit and contribution map delivered in 0.5.7. The `generate_harp` command requires explicit approval of the identity declaration, suggested registration language, and sanitization profile. It records that approval before generation, then records the HARP, export manifest, and complete generation bundle as immutable CPL records. `load_harp` reconstructs the latest record and reevaluates its applicability against current canonical state. + +The generator is evidence projection code. It does not call an LLM, classify legal authorship, infer originality, compute a human percentage, or decide copyrightability or registration scope. + +## Generated report set + +Each generation creates a deterministic `reports/harp/{harp_id}/` tree containing: + +- a one-page human-authorship summary; +- a visual SVG final-text contribution map; +- representative transformation comparisons; +- an AI-system and model disclosure; +- provenance coverage and limitations; +- suggested **Author Created**, **Material Excluded**, **New Material Included**, and **Note to CO** language; +- canonical machine-readable `harp.json`; +- a verification report; +- the canonical contribution map used by the reports; +- a supporting archive manifest; and +- a schema-valid HARP export manifest. + +Every generated report carries the exact deposit digest, manuscript revision and digest, CPL chain head and sequence, HARP/schema/application versions, policy-profile ID/version/digest/retrieval date, sanitization profile, and a statement that copyrightability remains a U.S. Copyright Office determination. + +## Determinism and disclosure + +HARP identity is derived from canonical immutable dependencies: the deposit, manuscript revision, contribution map, source CPL binding, bundled read-only policy profile, assertion set, declared dependency set, and approved request. Repeating an identical request replays the same approval action and returns the existing byte-identical HARP without adding ledger events. + +Accepted-AI-output segments are joined to recorded invocation requests to disclose provider and model identity. Missing identity is represented as `unknown` and prevents `exact` evidentiary status. Representative transformations are selected by stable operation ID; the `sanitized` profile omits source excerpts while retaining hashes and structural facts. + +Coverage always uses normalized Unicode scalar positions. It describes provenance coverage and is never presented as an authorship percentage. + +## Staleness + +Loading HARP reevaluates its dependencies without rewriting the historical record. The result becomes visibly stale when any of the following changes or becomes unavailable: + +- active manuscript revision; +- frozen deposit bytes or digest; +- contribution-map digest or classification; +- registration policy-profile digest; +- immutable assertion set; +- assertion or lineage dependency set; +- approved HARP request; or +- native CPL verification state. + +The historical exact-deposit HARP remains inspectable while its current-work applicability changes to `stale` with deterministic reason codes. + +## Acceptance evidence + +The native Rust suite generates the complete artifact tree from a verified CPL project, verifies exact status, checks idempotent regeneration and stable event count, then edits the manuscript and verifies deterministic staleness. Additional tests mutate each dependency class, validate the bundled policy digest and application compatibility, prohibit model/network/classifier dependencies, verify every report and shared metadata field, and validate every generated Stage 2 schema fixture. + +Milestone 8 supplies the native generator and artifact contract. The guided approval/preview user interface remains assigned to Milestone 9. diff --git a/docs/provenance/STAGE-9-HARP-CPL-USER-INTERFACES.md b/docs/provenance/STAGE-9-HARP-CPL-USER-INTERFACES.md new file mode 100644 index 0000000..159a9a8 --- /dev/null +++ b/docs/provenance/STAGE-9-HARP-CPL-USER-INTERFACES.md @@ -0,0 +1,39 @@ +# Stage 9 — HARP and CPL user interfaces + +Status: **Complete for Thinkloom 0.5.9** + +Milestone/version rule: **Milestone 9 → 0.5.9** + +## Delivered boundary + +Thinkloom 0.5.9 replaces the simplified provenance preview with two connected native-data views. The CPL explorer displays native verification status, the composition timeline and immutable records, final-text expression lineage, assertions and current evaluations, and exact, degraded, stale, or unverified evidence boundaries. When a HARP exists, its statement trace connects each evidentiary or derived statement to the relevant CPL segments, assertions, evaluations, and records. User declarations identify their approval records and explicitly show that assertions and evaluations are not applicable. + +The HARP preparation wizard requires the user to review or create an exact frozen deposit, confirm an identity declaration, inspect AI-system disclosures and contribution classifications, resolve stale evidence or explicitly accept other non-exact boundaries, preview and edit suggested application language, choose a sanitized or full-private supporting archive, and explicitly approve generation. The approval gate resets when approval-relevant inputs change. + +## Evidence-language boundary + +The interface visibly separates: + +- evidence facts read from CPL records; +- user declarations recorded at approval; +- deterministic derived classifications; +- editable suggested application language; and +- legal determinations Thinkloom does not make. + +Verification status comes from the native CPL verifier. The frontend does not manufacture a `valid` declaration, derive authorship percentages, or decide authorship, originality, copyrightability, ownership, or registrability. + +## Native projections + +- `load_cpl_explorer` verifies the project and returns a read-only event, record, composition, contribution-map, HARP, and statement-trace projection. +- `prepare_harp` returns the current frozen map, recorded AI-system disclosures, immutable policy profile, existing HARP, suggested language, and legal-scope statement without generating an artifact. +- `freeze_contribution_map` and `generate_harp` remain the only mutation commands used by the wizard. + +The explorer projection exposes structural identifiers and digests required for tracing; it does not expose protected record bodies as a shortcut for frontend classification. + +## Acceptance evidence + +- Static UI tests cover both views, native command wiring, the evidence categories, the seven preparation steps, explicit approval, and the no-percentage/no-frontend-validity boundary. +- A native integration test creates a CPL project, freezes an exact deposit, generates a HARP, verifies the chain, and proves the HARP claim summary reaches non-empty segment, assertion, evaluation, and underlying-record sets. +- Identity remains visibly classified as a user declaration: it links to approval records while assertion and evaluation links are explicitly not applicable. + +Unmarked preview projects retain the preservation-only behavior established in 0.5.4 and cannot be represented as CPL-conforming evidence. diff --git a/docs/provenance/STATE-MACHINES.md b/docs/provenance/STATE-MACHINES.md index b70f3e7..2835814 100644 --- a/docs/provenance/STATE-MACHINES.md +++ b/docs/provenance/STATE-MACHINES.md @@ -52,7 +52,7 @@ The same `client_action_id` with a materially different canonical command digest ## 2. Startup recovery -Recovery begins before an editable project becomes active. It obtains the project writer lock and classifies the project: +For a project already classified as CPL-conforming under §11, recovery begins before it becomes editable. Recovery obtains the project writer lock and classifies the project: ```text CLEAN @@ -252,3 +252,59 @@ Content already discarded under minimal retention cannot be recreated. Content a Emergency purge is not ordinary recovery. It requires a separate confirmed state machine that freezes the source, identifies every affected record/reference/index/Git object/export, creates a purge manifest, rewrites retained evidence and Git history, establishes a new chain root, verifies the result, and records the superseded root when safe. The UI MUST disclose that earlier copies, backups, releases, and exports cannot be revoked. + +## 11. Project-format and CPL-conformance classification + +Project classification MUST complete without modifying the selected directory and before startup recovery, verification, or any other provenance command. + +```mermaid +stateDiagram-v2 + [*] --> INSPECTING: read marker and minimum structure only + INSPECTING --> LEGACY_PREVIEW_READ_ONLY: marker absent or v0.5.x-or-earlier preview + INSPECTING --> UNSUPPORTED_READ_ONLY: CPL marker present but unsupported + INSPECTING --> CPL_RECOVERY_REQUIRED: exact supported CPL marker + CPL_RECOVERY_REQUIRED --> CPL_EDITABLE: recovery and required verification pass + CPL_RECOVERY_REQUIRED --> CPL_BLOCKED: incomplete, failed, unsafe, or incompatible + LEGACY_PREVIEW_READ_ONLY --> PRESERVATION_ARCHIVE: explicit user request + PRESERVATION_ARCHIVE --> LEGACY_PREVIEW_READ_ONLY: byte-preserving archive complete +``` + +`LEGACY_PREVIEW_READ_ONLY` permits only explanation, Show Project Folder, and a byte-preserving preservation archive. It MUST NOT invoke CPL recovery, synthesize records, generate HARP, or write a marker. A `schemaVersion: 1.0` field is not a CPL marker. Only the exact supported marker in Specification §23 can enter `CPL_RECOVERY_REQUIRED`, and the marker alone never establishes conformance. + +## 12. Deposit and HARP lifecycle + +HARP applicability, HARP integrity verification, CPL verification, evidence-boundary status, policy-profile currency, and user approval are independent state dimensions. + +```mermaid +stateDiagram-v2 + [*] --> WORKING + WORKING --> DEPOSIT_FROZEN: select exact file; bind digest and manuscript revision + DEPOSIT_FROZEN --> EVIDENCE_PROJECTED: deterministic contribution map + EVIDENCE_PROJECTED --> USER_REVIEW: show facts, declarations, boundaries, and suggestions + USER_REVIEW --> LANGUAGE_APPROVED: user edits or accepts exact suggested strings + LANGUAGE_APPROVED --> GENERATED: generate immutable HARP and manifest + GENERATED --> CURRENT: native integrity verification succeeds + DEPOSIT_FROZEN --> STALE: manuscript edit or restore + EVIDENCE_PROJECTED --> STALE: manuscript edit, restore, or dependency change + USER_REVIEW --> STALE: manuscript edit, restore, or dependency change + LANGUAGE_APPROVED --> STALE: manuscript edit, restore, or dependency change + GENERATED --> STALE: current work or bound dependency changes + CURRENT --> STALE: current work or bound dependency changes + STALE --> DEPOSIT_FROZEN: select and freeze a new exact deposit +``` + +### 12.1 Deposit freeze + +Under the writer lock, Thinkloom MUST validate that the project is CPL-conforming, finish meaningful edit transactions, select the exact deposit file, compute its digest and byte length, and bind the manuscript revision, CPL chain head and sequence, and layout profile. It then records the immutable deposit snapshot and CPL event. Page, chapter, paragraph, and line locators are derived; stable expression-segment IDs, revision IDs, and digests remain authoritative. + +### 12.2 Projection and review + +Projection and report rendering occur outside the writer lock from frozen canonical inputs. Before generation, the user MUST be shown unattested, unknown, degraded, stale, and unverified boundaries; self-declared identity status; recorded AI-system disclosures; the policy-profile version; and editable suggested registration language. Selection/arrangement overlays MUST remain separate from recorded origin. + +The transition to `LANGUAGE_APPROVED` requires an explicit user action that binds the exact `Author Created`, `Material Excluded`, `New Material Included`, and optional `Note to CO` strings. Merely opening, previewing, or exporting a draft does not approve them. + +### 12.3 Generation, verification, and staleness + +Under the writer lock, Thinkloom revalidates every frozen dependency and the approval digest before recording the immutable HARP, manifest, and generation event. Native verification then checks the HARP artifact bindings and source CPL scope. Success produces `CURRENT` and the label **HARP integrity verified**, never **authorship verified**. + +Any later manuscript edit or restoration makes the HARP stale for the current work, even when the exact historical deposit and HARP remain byte-valid. A changed deposit, assertion, evaluation dependency, sanitization profile, or other bound input also makes the affected HARP stale. Publishing a new policy profile does not rewrite an existing HARP; its separately reported policy status becomes `superseded`. Regeneration always starts from a new immutable deposit snapshot and never mutates the prior HARP. diff --git a/package-lock.json b/package-lock.json index e857b2b..94c9243 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "thinkloom", - "version": "0.5.0", + "version": "0.5.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "thinkloom", - "version": "0.5.0", + "version": "0.5.11", "license": "AGPL-3.0-only", "dependencies": { "@tiptap/markdown": "^3.28.0", diff --git a/package.json b/package.json index 943e6f3..f120851 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "thinkloom", - "version": "0.5.0", + "version": "0.5.11", "author": "Christopher Chambers", "license": "AGPL-3.0-only", "repository": "https://github.com/Labyricorn/thinkloom-openai-hackathon.git", @@ -16,7 +16,9 @@ "preview": "vite preview", "typecheck": "tsc --noEmit", "lint": "eslint src tests scripts vite.config.ts", - "test": "npm run typecheck && node tests/native-app.test.mjs && npm run provenance:schema:test", + "test": "npm run typecheck && node tests/native-app.test.mjs && node tests/native-cpl.test.mjs && node tests/project-format.test.mjs && node tests/phase1-provenance.test.mjs && node tests/composition-provenance.test.mjs && node tests/contribution-map.test.mjs && node tests/harp-generation.test.mjs && node tests/provenance-ui.test.mjs && node tests/harp-export.test.mjs && node tests/verification-matrix.test.mjs && npm run provenance:schema:test", + "test:windows-package": "node tests/windows-package.test.mjs", + "verify:windows-package": "npm run tauri build && npm run test:windows-package", "tauri": "tauri", "provenance:schema:generate": "node scripts/generate-provenance-stage2.mjs", "provenance:schema:test": "node tests/provenance-schema.test.mjs" diff --git a/schemas/provenance/v1/README.md b/schemas/provenance/v1/README.md index f21b0f9..c8a8994 100644 --- a/schemas/provenance/v1/README.md +++ b/schemas/provenance/v1/README.md @@ -1,12 +1,16 @@ # Thinkloom provenance schemas 1.0 -This generated package is the formal Stage 2 contract for the approved provenance architecture. It targets JSON Schema Draft 2020-12 and ships with 40 schemas, valid fixtures, invalid fixture suites, and deterministic verification vectors. +Package release: **Thinkloom 0.5.2** -- `catalog.json` is the machine-readable inventory. -- `*.schema.json` are the formal contracts. -- `registries` defines assertion lifecycle, evaluation status, confidence, evidence, boundary, and reason semantics. +CPL runtime target: **Thinkloom 0.6.0** + +This generated additive package is the formal schema contract for the approved provenance architecture, composition lineage, and HARP projection. It targets JSON Schema Draft 2020-12 and ships with 47 schemas, valid fixtures, invalid fixture suites, versioned semantic registries, and deterministic verification vectors. + +- `catalog.json` declares package, schema-family, per-schema introduction, and v0.6.0 compatibility without claiming native CPL conformance. +- `*.schema.json` are closed formal contracts. The seven composition/HARP records extend rather than overload v0.4 assertions or edit transactions. +- `registries` keeps recorded origin, transformation, selection/arrangement, evidentiary evaluation, and suggested registration treatment independent. - `fixtures/valid` contains one canonical valid instance per schema. -- `fixtures/invalid` covers required fields, closed-object policy, and populated enum, pattern, and numeric/string/array bounds. -- `vectors` fixes canonicalization, timestamps, paths, JSONL, event and segment chains, self-digests, protected records, key rotation and recovery, retention policy, sanitized export, deterministic indexes, verification reports, canonical assertions and evaluations, dependency invalidation, backups, and release-Merkle behavior. +- `fixtures/invalid` covers required fields, closed-object policy, populated constraints, and HARP-specific unknown-origin, identity, generation, and lineage boundaries. +- `vectors` fixes canonicalization, event and segment chains, self-digests, protected records, deterministic contribution maps, exact-deposit HARP binding, staleness, policy profiles, assertions/evaluations, backups, sanitization, and release-Merkle behavior. -Regenerate with `npm run provenance:schema:generate`. Verify with `npm run provenance:schema:test`. Generated files must be committed together with generator and vector changes. Runtime adoption is a later implementation stage; presence of this package does not imply the current native writer already conforms. +Existing v0.4 provenance-assertion and assertion-evaluation semantics remain valid. Regenerate with `npm run provenance:schema:generate`. Verify with `npm run provenance:schema:test`. Generated files must be committed together with generator and vector changes. Package presence does not confer CPL project-format conformance. Thinkloom 0.5.4 established the exact CPL 1.0 project marker and opener boundary. Thinkloom 0.5.5 adds typed, replayable Phase 1 commands, and Thinkloom 0.5.6 adds deterministic manuscript composition lineage, and Thinkloom 0.5.7 adds the frozen-deposit contribution-map projection, and Thinkloom 0.5.8 adds deterministic exact-deposit HARP generation, and Thinkloom 0.5.9 adds connected native CPL exploration and gated HARP preparation, and Thinkloom 0.5.10 adds separate registration artifacts plus verifiable sanitized and full-private HARP archives, and Thinkloom 0.5.11 adds the executable verification matrix, native release gate, origin-preserving arrangement checks, and packaged Windows end-to-end gate, without converting unmarked v0.5.x preview projects. diff --git a/schemas/provenance/v1/catalog.json b/schemas/provenance/v1/catalog.json index c7b72ab..110f6d7 100644 --- a/schemas/provenance/v1/catalog.json +++ b/schemas/provenance/v1/catalog.json @@ -1,48 +1,340 @@ { - "catalog_version": "1.0", + "catalog_version": "1.1", + "package_version": "0.5.2", "dialect": "https://json-schema.org/draft/2020-12/schema", "provenance_schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.2", "compatible_application_versions": [ - "0.4.0" + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" ], + "cpl_runtime_target": "0.6.0", "native_writer_conformance": false, + "assertion_semantics_compatibility": "Existing v0.4 provenance-assertion and assertion-evaluation semantics remain valid and unchanged by the additive composition extension.", "registries": [ { "name": "assertion-lifecycle-phases", "description": "Immutable assertion lifecycle phase observed when the relationship was asserted.", + "registry_version": "1.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/registries/assertion-lifecycle-phases.json", "file": "registries/assertion-lifecycle-phases.json" }, { "name": "assertion-evaluation-statuses", "description": "Consumer-facing point-in-time assertion conclusions.", + "registry_version": "1.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/registries/assertion-evaluation-statuses.json", "file": "registries/assertion-evaluation-statuses.json" }, { "name": "assertion-confidence-dimensions", "description": "Independent non-numeric confidence dimensions.", + "registry_version": "1.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/registries/assertion-confidence-dimensions.json", "file": "registries/assertion-confidence-dimensions.json" }, { "name": "assertion-evidence-classes", "description": "Evidence availability and authority requirements.", + "registry_version": "1.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/registries/assertion-evidence-classes.json", "file": "registries/assertion-evidence-classes.json" }, { "name": "assertion-boundary-kinds", "description": "Machine-readable boundaries preventing an unqualified exact conclusion.", + "registry_version": "1.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/registries/assertion-boundary-kinds.json", "file": "registries/assertion-boundary-kinds.json" }, { "name": "assertion-reason-codes", "description": "Stable explanations for assertion creation and evaluation outcomes.", + "registry_version": "1.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/registries/assertion-reason-codes.json", "file": "registries/assertion-reason-codes.json" + }, + { + "name": "composition-operation-kinds", + "description": "Composition-specific immutable operation kinds.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/composition-operation-kinds.json", + "file": "registries/composition-operation-kinds.json" + }, + { + "name": "recorded-origin-kinds", + "description": "Evidence classifications for how expression entered the composition, never legal authorship categories.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/recorded-origin-kinds.json", + "file": "registries/recorded-origin-kinds.json" + }, + { + "name": "transformation-relationships", + "description": "Independent relationships describing how expression changed or derived.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/transformation-relationships.json", + "file": "registries/transformation-relationships.json" + }, + { + "name": "contribution-map-layers", + "description": "Independent projection layers that must not be collapsed into recorded origin.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/contribution-map-layers.json", + "file": "registries/contribution-map-layers.json" + }, + { + "name": "registration-treatment-suggestions", + "description": "Editable policy-profile suggestions, not evidence facts or legal determinations.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/registration-treatment-suggestions.json", + "file": "registries/registration-treatment-suggestions.json" + }, + { + "name": "harp-limitation-codes", + "description": "Stable HARP limitation disclosures.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/harp-limitation-codes.json", + "file": "registries/harp-limitation-codes.json" + }, + { + "name": "harp-explanation-codes", + "description": "Stable explanations of HARP scope and interpretation.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/harp-explanation-codes.json", + "file": "registries/harp-explanation-codes.json" + }, + { + "name": "composition-assertion-predicates", + "description": "Canonical composition relationship predicates used by existing provenance assertions.", + "registry_version": "1.1", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registries/composition-assertion-predicates.json", + "file": "registries/composition-assertion-predicates.json" } ], "normative_specification": "../../../docs/provenance/STAGE-1-NORMATIVE-SPECIFICATION.md", @@ -50,6 +342,23 @@ "schemas": [ { "name": "assertion-evaluation", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/assertion-evaluation.schema.json", "file": "assertion-evaluation.schema.json", "valid_fixture": "fixtures/valid/assertion-evaluation.valid.json", @@ -57,6 +366,23 @@ }, { "name": "backup-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/backup-manifest.schema.json", "file": "backup-manifest.schema.json", "valid_fixture": "fixtures/valid/backup-manifest.valid.json", @@ -64,27 +390,158 @@ }, { "name": "chain-head", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/chain-head.schema.json", "file": "chain-head.schema.json", "valid_fixture": "fixtures/valid/chain-head.valid.json", "invalid_fixture": "fixtures/invalid/chain-head.invalid.json" }, + { + "name": "composition-operation", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/composition-operation.schema.json", + "file": "composition-operation.schema.json", + "valid_fixture": "fixtures/valid/composition-operation.valid.json", + "invalid_fixture": "fixtures/invalid/composition-operation.invalid.json" + }, { "name": "content-reference", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/content-reference.schema.json", "file": "content-reference.schema.json", "valid_fixture": "fixtures/valid/content-reference.valid.json", "invalid_fixture": "fixtures/invalid/content-reference.invalid.json" }, + { + "name": "contribution-map", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/contribution-map.schema.json", + "file": "contribution-map.schema.json", + "valid_fixture": "fixtures/valid/contribution-map.valid.json", + "invalid_fixture": "fixtures/invalid/contribution-map.invalid.json" + }, { "name": "conversation-session", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/conversation-session.schema.json", "file": "conversation-session.schema.json", "valid_fixture": "fixtures/valid/conversation-session.valid.json", "invalid_fixture": "fixtures/invalid/conversation-session.invalid.json" }, + { + "name": "deposit-snapshot", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/deposit-snapshot.schema.json", + "file": "deposit-snapshot.schema.json", + "valid_fixture": "fixtures/valid/deposit-snapshot.valid.json", + "invalid_fixture": "fixtures/invalid/deposit-snapshot.invalid.json" + }, { "name": "derived-index-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/derived-index-manifest.schema.json", "file": "derived-index-manifest.schema.json", "valid_fixture": "fixtures/valid/derived-index-manifest.valid.json", @@ -92,6 +549,23 @@ }, { "name": "disposition-revision", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/disposition-revision.schema.json", "file": "disposition-revision.schema.json", "valid_fixture": "fixtures/valid/disposition-revision.valid.json", @@ -99,6 +573,23 @@ }, { "name": "edit-transaction", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/edit-transaction.schema.json", "file": "edit-transaction.schema.json", "valid_fixture": "fixtures/valid/edit-transaction.valid.json", @@ -106,13 +597,110 @@ }, { "name": "encrypted-key-envelope", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/encrypted-key-envelope.schema.json", "file": "encrypted-key-envelope.schema.json", "valid_fixture": "fixtures/valid/encrypted-key-envelope.valid.json", "invalid_fixture": "fixtures/invalid/encrypted-key-envelope.invalid.json" }, + { + "name": "expression-segment", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/expression-segment.schema.json", + "file": "expression-segment.schema.json", + "valid_fixture": "fixtures/valid/expression-segment.valid.json", + "invalid_fixture": "fixtures/invalid/expression-segment.invalid.json" + }, + { + "name": "harp-export-manifest", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/harp-export-manifest.schema.json", + "file": "harp-export-manifest.schema.json", + "valid_fixture": "fixtures/valid/harp-export-manifest.valid.json", + "invalid_fixture": "fixtures/invalid/harp-export-manifest.invalid.json" + }, + { + "name": "human-authorship-record", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/human-authorship-record.schema.json", + "file": "human-authorship-record.schema.json", + "valid_fixture": "fixtures/valid/human-authorship-record.valid.json", + "invalid_fixture": "fixtures/invalid/human-authorship-record.invalid.json" + }, { "name": "idea", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/idea.schema.json", "file": "idea.schema.json", "valid_fixture": "fixtures/valid/idea.valid.json", @@ -120,6 +708,23 @@ }, { "name": "idea-revision", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/idea-revision.schema.json", "file": "idea-revision.schema.json", "valid_fixture": "fixtures/valid/idea-revision.valid.json", @@ -127,6 +732,23 @@ }, { "name": "invocation-failure", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/invocation-failure.schema.json", "file": "invocation-failure.schema.json", "valid_fixture": "fixtures/valid/invocation-failure.valid.json", @@ -134,6 +756,23 @@ }, { "name": "invocation-request", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/invocation-request.schema.json", "file": "invocation-request.schema.json", "valid_fixture": "fixtures/valid/invocation-request.valid.json", @@ -141,6 +780,23 @@ }, { "name": "invocation-response", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/invocation-response.schema.json", "file": "invocation-response.schema.json", "valid_fixture": "fixtures/valid/invocation-response.valid.json", @@ -148,6 +804,23 @@ }, { "name": "invocation-state", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/invocation-state.schema.json", "file": "invocation-state.schema.json", "valid_fixture": "fixtures/valid/invocation-state.valid.json", @@ -155,6 +828,23 @@ }, { "name": "invocation-stream-state", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/invocation-stream-state.schema.json", "file": "invocation-stream-state.schema.json", "valid_fixture": "fixtures/valid/invocation-stream-state.valid.json", @@ -162,6 +852,23 @@ }, { "name": "invocation-stream-summary", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/invocation-stream-summary.schema.json", "file": "invocation-stream-summary.schema.json", "valid_fixture": "fixtures/valid/invocation-stream-summary.valid.json", @@ -169,6 +876,23 @@ }, { "name": "ledger-segment-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/ledger-segment-manifest.schema.json", "file": "ledger-segment-manifest.schema.json", "valid_fixture": "fixtures/valid/ledger-segment-manifest.valid.json", @@ -176,6 +900,23 @@ }, { "name": "manuscript-revision", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/manuscript-revision.schema.json", "file": "manuscript-revision.schema.json", "valid_fixture": "fixtures/valid/manuscript-revision.valid.json", @@ -183,6 +924,23 @@ }, { "name": "model-capability-snapshot", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/model-capability-snapshot.schema.json", "file": "model-capability-snapshot.schema.json", "valid_fixture": "fixtures/valid/model-capability-snapshot.valid.json", @@ -190,6 +948,23 @@ }, { "name": "model-configuration-snapshot", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/model-configuration-snapshot.schema.json", "file": "model-configuration-snapshot.schema.json", "valid_fixture": "fixtures/valid/model-configuration-snapshot.valid.json", @@ -197,6 +972,23 @@ }, { "name": "project-key-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/project-key-manifest.schema.json", "file": "project-key-manifest.schema.json", "valid_fixture": "fixtures/valid/project-key-manifest.valid.json", @@ -204,6 +996,23 @@ }, { "name": "project-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/project-manifest.schema.json", "file": "project-manifest.schema.json", "valid_fixture": "fixtures/valid/project-manifest.valid.json", @@ -211,6 +1020,23 @@ }, { "name": "prompt-template", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/prompt-template.schema.json", "file": "prompt-template.schema.json", "valid_fixture": "fixtures/valid/prompt-template.valid.json", @@ -218,6 +1044,23 @@ }, { "name": "prompt-template-reference", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/prompt-template-reference.schema.json", "file": "prompt-template-reference.schema.json", "valid_fixture": "fixtures/valid/prompt-template-reference.valid.json", @@ -225,6 +1068,23 @@ }, { "name": "provenance-assertion", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/provenance-assertion.schema.json", "file": "provenance-assertion.schema.json", "valid_fixture": "fixtures/valid/provenance-assertion.valid.json", @@ -232,6 +1092,23 @@ }, { "name": "provenance-event", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/provenance-event.schema.json", "file": "provenance-event.schema.json", "valid_fixture": "fixtures/valid/provenance-event.valid.json", @@ -239,6 +1116,23 @@ }, { "name": "provenance-policy", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/provenance-policy.schema.json", "file": "provenance-policy.schema.json", "valid_fixture": "fixtures/valid/provenance-policy.valid.json", @@ -246,6 +1140,23 @@ }, { "name": "purge-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/purge-manifest.schema.json", "file": "purge-manifest.schema.json", "valid_fixture": "fixtures/valid/purge-manifest.valid.json", @@ -253,6 +1164,23 @@ }, { "name": "record-envelope", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/record-envelope.schema.json", "file": "record-envelope.schema.json", "valid_fixture": "fixtures/valid/record-envelope.valid.json", @@ -260,13 +1188,68 @@ }, { "name": "recovery-key-envelope", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/recovery-key-envelope.schema.json", "file": "recovery-key-envelope.schema.json", "valid_fixture": "fixtures/valid/recovery-key-envelope.valid.json", "invalid_fixture": "fixtures/invalid/recovery-key-envelope.invalid.json" }, + { + "name": "registration-policy-profile", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "id": "https://thinkloom.app/schemas/provenance/1.0/registration-policy-profile.schema.json", + "file": "registration-policy-profile.schema.json", + "valid_fixture": "fixtures/valid/registration-policy-profile.valid.json", + "invalid_fixture": "fixtures/invalid/registration-policy-profile.invalid.json" + }, { "name": "release-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/release-manifest.schema.json", "file": "release-manifest.schema.json", "valid_fixture": "fixtures/valid/release-manifest.valid.json", @@ -274,6 +1257,23 @@ }, { "name": "release-state", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/release-state.schema.json", "file": "release-state.schema.json", "valid_fixture": "fixtures/valid/release-state.valid.json", @@ -281,6 +1281,23 @@ }, { "name": "sanitized-export-manifest", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/sanitized-export-manifest.schema.json", "file": "sanitized-export-manifest.schema.json", "valid_fixture": "fixtures/valid/sanitized-export-manifest.valid.json", @@ -288,6 +1305,23 @@ }, { "name": "text-fragment-reference", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/text-fragment-reference.schema.json", "file": "text-fragment-reference.schema.json", "valid_fixture": "fixtures/valid/text-fragment-reference.valid.json", @@ -295,6 +1329,23 @@ }, { "name": "transcript-correction", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/transcript-correction.schema.json", "file": "transcript-correction.schema.json", "valid_fixture": "fixtures/valid/transcript-correction.valid.json", @@ -302,6 +1353,23 @@ }, { "name": "transcript-normalization", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/transcript-normalization.schema.json", "file": "transcript-normalization.schema.json", "valid_fixture": "fixtures/valid/transcript-normalization.valid.json", @@ -309,6 +1377,23 @@ }, { "name": "transcript-turn", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/transcript-turn.schema.json", "file": "transcript-turn.schema.json", "valid_fixture": "fixtures/valid/transcript-turn.valid.json", @@ -316,6 +1401,23 @@ }, { "name": "verification-report", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/verification-report.schema.json", "file": "verification-report.schema.json", "valid_fixture": "fixtures/valid/verification-report.valid.json", @@ -323,6 +1425,23 @@ }, { "name": "write-intent", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "id": "https://thinkloom.app/schemas/provenance/1.0/write-intent.schema.json", "file": "write-intent.schema.json", "valid_fixture": "fixtures/valid/write-intent.valid.json", diff --git a/schemas/provenance/v1/composition-operation.schema.json b/schemas/provenance/v1/composition-operation.schema.json new file mode 100644 index 0000000..6be8b21 --- /dev/null +++ b/schemas/provenance/v1/composition-operation.schema.json @@ -0,0 +1,374 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://thinkloom.app/schemas/provenance/1.0/composition-operation.schema.json", + "title": "Composition operation", + "description": "Immutable composition-specific insertion, deletion, replacement, movement, paste, transcription, AI acceptance, or restoration operation; it does not overload edit transactions or assertions.", + "type": "object", + "properties": { + "schema_version": { + "const": "1.0" + }, + "operation_id": { + "type": "string", + "pattern": "^operation_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "project_id": { + "type": "string", + "pattern": "^project_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "operation_kind": { + "enum": [ + "insert", + "delete", + "replace", + "move", + "paste", + "transcription", + "ai_acceptance", + "restoration" + ] + }, + "client_action_id": { + "type": "string", + "minLength": 8, + "maxLength": 200 + }, + "base_revision_id": { + "type": "string", + "pattern": "^revision_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "result_revision_id": { + "type": "string", + "pattern": "^revision_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "operation_sequence": { + "type": "integer", + "minimum": 1 + }, + "source_range": { + "anyOf": [ + { + "$ref": "https://thinkloom.app/schemas/provenance/1.0/text-fragment-reference.schema.json" + }, + { + "type": "null" + } + ] + }, + "destination_coordinate_system": { + "enum": [ + "utf8_byte", + "unicode_scalar", + "utf16_code_unit", + "editor_position" + ] + }, + "destination_start": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ] + }, + "inserted_content_sha256": { + "anyOf": [ + { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + { + "type": "null" + } + ] + }, + "deleted_content_sha256": { + "anyOf": [ + { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + { + "type": "null" + } + ] + }, + "source_record_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9_]*_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + }, + "invocation_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^invocation_[0-9A-HJKMNP-TV-Z]{26}$" + }, + { + "type": "null" + } + ] + }, + "disposition_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^disposition_[0-9A-HJKMNP-TV-Z]{26}$" + }, + { + "type": "null" + } + ] + }, + "recorded_origin_kind": { + "enum": [ + "recorded_direct_human_input", + "human_expressive_input_via_transcription", + "accepted_ai_output", + "imported_or_pasted", + "system_restoration", + "unattested" + ] + }, + "actor_identity_status": { + "enum": [ + "verified", + "self_declared", + "unknown", + "not_applicable" + ] + }, + "transformation_relationships": { + "type": "array", + "items": { + "enum": [ + "inserted", + "deleted", + "replaced", + "moved", + "pasted_from_external", + "transcribed_from_human_speech", + "generated_by_ai", + "modified_by_human", + "restored_from_revision", + "derived_from" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "lineage_reference_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9_]*_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "minItems": 1, + "uniqueItems": true + }, + "recorded_at": { + "type": "string", + "format": "date-time", + "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$" + } + }, + "required": [ + "schema_version", + "operation_id", + "project_id", + "operation_kind", + "client_action_id", + "base_revision_id", + "result_revision_id", + "operation_sequence", + "source_range", + "destination_coordinate_system", + "destination_start", + "inserted_content_sha256", + "deleted_content_sha256", + "source_record_ids", + "invocation_id", + "disposition_id", + "recorded_origin_kind", + "actor_identity_status", + "transformation_relationships", + "lineage_reference_ids", + "recorded_at" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "operation_kind": { + "const": "paste" + } + }, + "required": [ + "operation_kind" + ] + }, + "then": { + "properties": { + "recorded_origin_kind": { + "const": "imported_or_pasted" + } + } + } + }, + { + "if": { + "properties": { + "operation_kind": { + "const": "transcription" + } + }, + "required": [ + "operation_kind" + ] + }, + "then": { + "properties": { + "recorded_origin_kind": { + "const": "human_expressive_input_via_transcription" + } + } + } + }, + { + "if": { + "properties": { + "operation_kind": { + "const": "ai_acceptance" + } + }, + "required": [ + "operation_kind" + ] + }, + "then": { + "properties": { + "recorded_origin_kind": { + "const": "accepted_ai_output" + }, + "invocation_id": { + "type": "string", + "pattern": "^invocation_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "disposition_id": { + "type": "string", + "pattern": "^disposition_[0-9A-HJKMNP-TV-Z]{26}$" + } + } + } + }, + { + "if": { + "properties": { + "operation_kind": { + "const": "restoration" + } + }, + "required": [ + "operation_kind" + ] + }, + "then": { + "properties": { + "recorded_origin_kind": { + "const": "system_restoration" + } + } + } + }, + { + "if": { + "properties": { + "operation_kind": { + "const": "delete" + } + }, + "required": [ + "operation_kind" + ] + }, + "then": { + "properties": { + "source_range": { + "$ref": "https://thinkloom.app/schemas/provenance/1.0/text-fragment-reference.schema.json" + }, + "inserted_content_sha256": { + "type": "null" + }, + "deleted_content_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + } + } + }, + { + "if": { + "properties": { + "operation_kind": { + "enum": [ + "insert", + "paste", + "transcription", + "ai_acceptance", + "restoration" + ] + } + }, + "required": [ + "operation_kind" + ] + }, + "then": { + "properties": { + "inserted_content_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + } + } + } + ], + "examples": [ + { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + ] +} diff --git a/schemas/provenance/v1/content-reference.schema.json b/schemas/provenance/v1/content-reference.schema.json index c9a4bc5..5433a57 100644 --- a/schemas/provenance/v1/content-reference.schema.json +++ b/schemas/provenance/v1/content-reference.schema.json @@ -21,6 +21,13 @@ "idea_revision", "manuscript_revision", "edit_transaction", + "composition_operation", + "expression_segment", + "contribution_map", + "deposit_snapshot", + "registration_policy_profile", + "human_authorship_record", + "harp_export_manifest", "prompt_template", "model_configuration", "provenance_assertion", diff --git a/schemas/provenance/v1/contribution-map.schema.json b/schemas/provenance/v1/contribution-map.schema.json new file mode 100644 index 0000000..83ba5c6 --- /dev/null +++ b/schemas/provenance/v1/contribution-map.schema.json @@ -0,0 +1,409 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://thinkloom.app/schemas/provenance/1.0/contribution-map.schema.json", + "title": "Deposit contribution map", + "description": "Deterministic non-authoritative projection providing complete ordered deposit coverage while keeping origin, transformation, selection/arrangement, evaluation, and registration treatment independent. Its digest identity excludes contribution_map_sha256.", + "type": "object", + "properties": { + "schema_version": { + "const": "1.0" + }, + "contribution_map_id": { + "type": "string", + "pattern": "^map_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "project_id": { + "type": "string", + "pattern": "^project_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "deposit_id": { + "type": "string", + "pattern": "^deposit_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "deposit_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "manuscript_revision_id": { + "type": "string", + "pattern": "^revision_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "manuscript_revision_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "cpl_chain_head": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "cpl_event_sequence": { + "type": "integer", + "minimum": 1 + }, + "coordinate_system": { + "const": "unicode_scalar" + }, + "coverage": { + "type": "object", + "properties": { + "denominator": { + "type": "integer", + "minimum": 0 + }, + "recorded_positions": { + "type": "integer", + "minimum": 0 + }, + "coverage_status": { + "enum": [ + "complete", + "partial" + ] + }, + "denominator_unit": { + "const": "normalized_unicode_scalar_position" + }, + "denominator_definition": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "denominator", + "recorded_positions", + "coverage_status", + "denominator_unit", + "denominator_definition" + ], + "additionalProperties": false + }, + "layers": { + "type": "array", + "items": { + "enum": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment", + "structural_locator" + ] + }, + "minItems": 5, + "uniqueItems": true, + "allOf": [ + { + "contains": { + "const": "recorded_origin" + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "const": "transformation" + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "const": "selection_arrangement" + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "const": "evidentiary_evaluation" + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "const": "suggested_registration_treatment" + }, + "minContains": 1, + "maxContains": 1 + } + ] + }, + "segments": { + "type": "array", + "items": { + "$ref": "https://thinkloom.app/schemas/provenance/1.0/expression-segment.schema.json" + }, + "minItems": 1 + }, + "structural_locators": { + "type": "array", + "items": { + "type": "object", + "properties": { + "segment_id": { + "type": "string", + "pattern": "^segment_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "chapter": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "null" + } + ] + }, + "paragraph": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "null" + } + ] + }, + "page": { + "anyOf": [ + { + "type": "integer", + "minimum": 1 + }, + { + "type": "null" + } + ] + } + }, + "required": [ + "segment_id", + "chapter", + "paragraph", + "page" + ], + "additionalProperties": false + } + }, + "layout_profile": { + "anyOf": [ + { + "type": "object", + "properties": { + "layout_profile_id": { + "type": "string", + "pattern": "^layout_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "layout_profile_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "layout_profile_id", + "layout_profile_sha256" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "generator": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "configuration_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "name", + "version", + "configuration_sha256" + ], + "additionalProperties": false + }, + "classification_status": { + "enum": [ + "exact", + "degraded", + "stale", + "unverified" + ] + }, + "contribution_map_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "schema_version", + "contribution_map_id", + "project_id", + "deposit_id", + "deposit_sha256", + "manuscript_revision_id", + "manuscript_revision_sha256", + "cpl_chain_head", + "cpl_event_sequence", + "coordinate_system", + "coverage", + "layers", + "segments", + "structural_locators", + "layout_profile", + "generator", + "classification_status", + "contribution_map_sha256" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "classification_status": { + "const": "exact" + } + }, + "required": [ + "classification_status" + ] + }, + "then": { + "properties": { + "coverage": { + "type": "object", + "properties": { + "coverage_status": { + "const": "complete" + } + }, + "required": [ + "coverage_status" + ] + }, + "segments": { + "type": "array", + "items": { + "allOf": [ + { + "$ref": "https://thinkloom.app/schemas/provenance/1.0/expression-segment.schema.json" + }, + { + "type": "object", + "properties": { + "classification_status": { + "const": "exact" + } + }, + "required": [ + "classification_status" + ] + } + ] + } + } + } + } + } + ], + "examples": [ + { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + ] +} diff --git a/schemas/provenance/v1/deposit-snapshot.schema.json b/schemas/provenance/v1/deposit-snapshot.schema.json new file mode 100644 index 0000000..72511c2 --- /dev/null +++ b/schemas/provenance/v1/deposit-snapshot.schema.json @@ -0,0 +1,125 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://thinkloom.app/schemas/provenance/1.0/deposit-snapshot.schema.json", + "title": "Exact deposit snapshot", + "description": "Immutable binding of the exact selected deposit file, manuscript revision, CPL head, and optional layout profile.", + "type": "object", + "properties": { + "schema_version": { + "const": "1.0" + }, + "deposit_id": { + "type": "string", + "pattern": "^deposit_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "project_id": { + "type": "string", + "pattern": "^project_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "application_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "deposit_path": { + "type": "string", + "minLength": 1, + "pattern": "^(?!/)(?![A-Za-z]:)(?!.*\\\\)(?!.*(?:^|/)\\.\\.?(?:/|$))[^\\u0000-\\u001f]+$" + }, + "media_type": { + "type": "string", + "minLength": 1 + }, + "byte_length": { + "type": "integer", + "minimum": 1 + }, + "deposit_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "manuscript_revision_id": { + "type": "string", + "pattern": "^revision_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "manuscript_revision_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "cpl_chain_head": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "cpl_event_sequence": { + "type": "integer", + "minimum": 1 + }, + "layout_profile": { + "anyOf": [ + { + "type": "object", + "properties": { + "layout_profile_id": { + "type": "string", + "pattern": "^layout_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "layout_profile_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "layout_profile_id", + "layout_profile_sha256" + ], + "additionalProperties": false + }, + { + "type": "null" + } + ] + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$" + } + }, + "required": [ + "schema_version", + "deposit_id", + "project_id", + "application_version", + "deposit_path", + "media_type", + "byte_length", + "deposit_sha256", + "manuscript_revision_id", + "manuscript_revision_sha256", + "cpl_chain_head", + "cpl_event_sequence", + "layout_profile", + "created_at" + ], + "additionalProperties": false, + "examples": [ + { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + ] +} diff --git a/schemas/provenance/v1/expression-segment.schema.json b/schemas/provenance/v1/expression-segment.schema.json new file mode 100644 index 0000000..b745158 --- /dev/null +++ b/schemas/provenance/v1/expression-segment.schema.json @@ -0,0 +1,256 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://thinkloom.app/schemas/provenance/1.0/expression-segment.schema.json", + "title": "Surviving expression segment", + "description": "Stable surviving deposit expression with revision-bound range, digest, recorded origin, lineage, transformations, and separate selection/arrangement assertions.", + "type": "object", + "properties": { + "schema_version": { + "const": "1.0" + }, + "segment_id": { + "type": "string", + "pattern": "^segment_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "project_id": { + "type": "string", + "pattern": "^project_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "revision_id": { + "type": "string", + "pattern": "^revision_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "segment_sequence": { + "type": "integer", + "minimum": 1 + }, + "range": { + "$ref": "https://thinkloom.app/schemas/provenance/1.0/text-fragment-reference.schema.json" + }, + "content_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "normalized_unicode_scalar_length": { + "type": "integer", + "minimum": 1 + }, + "recorded_origin_kind": { + "enum": [ + "recorded_direct_human_input", + "human_expressive_input_via_transcription", + "accepted_ai_output", + "imported_or_pasted", + "system_restoration", + "unattested" + ] + }, + "actor_identity_status": { + "enum": [ + "verified", + "self_declared", + "unknown", + "not_applicable" + ] + }, + "generation_status": { + "enum": [ + "recorded", + "unknown" + ] + }, + "lineage_status": { + "enum": [ + "recorded", + "unattested", + "unknown" + ] + }, + "lineage_reference_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9_]*_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + }, + "operation_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^operation_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + }, + "transformation_relationships": { + "type": "array", + "items": { + "enum": [ + "inserted", + "deleted", + "replaced", + "moved", + "pasted_from_external", + "transcribed_from_human_speech", + "generated_by_ai", + "modified_by_human", + "restored_from_revision", + "derived_from" + ] + }, + "uniqueItems": true + }, + "assertion_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^assertion_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + }, + "selection_arrangement_assertion_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^assertion_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + }, + "included_in_deposit_assertion_id": { + "anyOf": [ + { + "type": "string", + "pattern": "^assertion_[0-9A-HJKMNP-TV-Z]{26}$" + }, + { + "type": "null" + } + ] + }, + "classification_status": { + "enum": [ + "exact", + "degraded", + "stale", + "unverified" + ] + } + }, + "required": [ + "schema_version", + "segment_id", + "project_id", + "revision_id", + "segment_sequence", + "range", + "content_sha256", + "normalized_unicode_scalar_length", + "recorded_origin_kind", + "actor_identity_status", + "generation_status", + "lineage_status", + "lineage_reference_ids", + "operation_ids", + "transformation_relationships", + "assertion_ids", + "selection_arrangement_assertion_ids", + "included_in_deposit_assertion_id", + "classification_status" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "classification_status": { + "const": "exact" + } + }, + "required": [ + "classification_status" + ] + }, + "then": { + "properties": { + "recorded_origin_kind": { + "enum": [ + "recorded_direct_human_input", + "human_expressive_input_via_transcription", + "accepted_ai_output", + "imported_or_pasted", + "system_restoration" + ] + }, + "actor_identity_status": { + "enum": [ + "verified", + "self_declared", + "not_applicable" + ] + }, + "generation_status": { + "const": "recorded" + }, + "lineage_status": { + "const": "recorded" + }, + "lineage_reference_ids": { + "type": "array", + "minItems": 1 + }, + "operation_ids": { + "type": "array", + "minItems": 1 + }, + "assertion_ids": { + "type": "array", + "minItems": 1 + }, + "included_in_deposit_assertion_id": { + "type": "string", + "pattern": "^assertion_[0-9A-HJKMNP-TV-Z]{26}$" + } + } + } + } + ], + "examples": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/composition-operation.invalid.json b/schemas/provenance/v1/fixtures/invalid/composition-operation.invalid.json new file mode 100644 index 0000000..8d102ee --- /dev/null +++ b/schemas/provenance/v1/fixtures/invalid/composition-operation.invalid.json @@ -0,0 +1,1383 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/composition-operation.schema.json", + "cases": [ + { + "description": "composition-operation.schema_version: reject missing required property", + "instance": { + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.operation_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.project_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.operation_kind: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.client_action_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.base_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.result_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.operation_sequence: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.source_range: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.destination_coordinate_system: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.destination_start: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.inserted_content_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.deleted_content_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.source_record_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.invocation_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.disposition_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.recorded_origin_kind: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.actor_identity_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.transformation_relationships: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.lineage_reference_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.recorded_at: reject missing required property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ] + } + }, + { + "description": "composition-operation: reject unexpected property", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z", + "__unexpected": true + } + }, + { + "description": "composition-operation.schema_version: reject value different from const", + "instance": { + "schema_version": "__INVALID_CONST__", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.operation_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "invalid-id", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.project_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "invalid-id", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.operation_kind: reject value outside enum", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "__INVALID_ENUM__", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.client_action_id: reject string below minLength", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.client_action_id: reject string above maxLength", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.base_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "invalid-id", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.result_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "invalid-id", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.operation_sequence: reject value below minimum", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 0, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.destination_coordinate_system: reject value outside enum", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "__INVALID_ENUM__", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.destination_start: reject value below minimum", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": -1, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.inserted_content_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:INVALID", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.source_record_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "invalid-id" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.recorded_origin_kind: reject value outside enum", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "__INVALID_ENUM__", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.actor_identity_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "__INVALID_ENUM__", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.transformation_relationships: reject array below minItems", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.transformation_relationships[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "__INVALID_ENUM__" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.lineage_reference_ids: reject array below minItems", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.lineage_reference_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "invalid-id" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation.recorded_at: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "not-a-timestamp" + } + }, + { + "description": "composition-operation: paste cannot claim direct human-input origin", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "paste", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "composition-operation: AI acceptance requires invocation and disposition", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "ai_acceptance", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "accepted_ai_output", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/contribution-map.invalid.json b/schemas/provenance/v1/fixtures/invalid/contribution-map.invalid.json new file mode 100644 index 0000000..3eb2930 --- /dev/null +++ b/schemas/provenance/v1/fixtures/invalid/contribution-map.invalid.json @@ -0,0 +1,10270 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/contribution-map.schema.json", + "cases": [ + { + "description": "contribution-map.schema_version: reject missing required property", + "instance": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.contribution_map_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.project_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.deposit_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.deposit_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.manuscript_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.manuscript_revision_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.cpl_chain_head: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.cpl_event_sequence: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coordinate_system: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layers: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layout_profile: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.classification_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.contribution_map_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact" + } + }, + { + "description": "contribution-map: reject unexpected property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "__unexpected": true + } + }, + { + "description": "contribution-map.schema_version: reject value different from const", + "instance": { + "schema_version": "__INVALID_CONST__", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.contribution_map_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "invalid-id", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.project_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "invalid-id", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.deposit_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "invalid-id", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.deposit_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:INVALID", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.manuscript_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "invalid-id", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.manuscript_revision_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:INVALID", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.cpl_chain_head: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:INVALID", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.cpl_event_sequence: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 0, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coordinate_system: reject value different from const", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "__INVALID_CONST__", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.denominator: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.recorded_positions: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.coverage_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.denominator_unit: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.denominator_definition: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position" + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage: reject unexpected property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage.", + "__unexpected": true + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.denominator: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": -1, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.recorded_positions: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": -1, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.coverage_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "__INVALID_ENUM__", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.denominator_unit: reject value different from const", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "__INVALID_CONST__", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.coverage.denominator_definition: reject string below minLength", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "" + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layers: reject array below minItems", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layers[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "__INVALID_ENUM__", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments: reject array below minItems", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].schema_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].segment_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].project_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].segment_sequence: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].content_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].normalized_unicode_scalar_length: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].recorded_origin_kind: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].actor_identity_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].generation_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].lineage_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].lineage_reference_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].operation_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].transformation_relationships: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].assertion_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].selection_arrangement_assertion_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].included_in_deposit_assertion_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].classification_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0]: reject unexpected property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact", + "__unexpected": true + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].schema_version: reject value different from const", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "__INVALID_CONST__", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].segment_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "invalid-id", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].project_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "invalid-id", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "invalid-id", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].segment_sequence: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 0, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.schema_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.document_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.coordinate_system: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.start: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.end: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.preimage_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.text_fragment_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range: reject unexpected property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C", + "__unexpected": true + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.schema_version: reject value different from const", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "__INVALID_CONST__", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.document_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "invalid-id", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.coordinate_system: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "__INVALID_ENUM__", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.start: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": -1, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.end: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": -1, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.preimage_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:INVALID", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].range.text_fragment_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "invalid-id" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].content_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:INVALID", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].normalized_unicode_scalar_length: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 0, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].recorded_origin_kind: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "__INVALID_ENUM__", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].actor_identity_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "__INVALID_ENUM__", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].generation_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "__INVALID_ENUM__", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].lineage_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "__INVALID_ENUM__", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].lineage_reference_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "invalid-id" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].operation_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "invalid-id" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].transformation_relationships[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "__INVALID_ENUM__" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].assertion_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "invalid-id" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].included_in_deposit_assertion_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "invalid-id", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.segments[0].classification_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "__INVALID_ENUM__" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].segment_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].chapter: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].paragraph: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].page: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0]: reject unexpected property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1, + "__unexpected": true + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].segment_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "invalid-id", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].chapter: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 0, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].paragraph: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 0, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.structural_locators[0].page: reject value below minimum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 0 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layout_profile.layout_profile_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layout_profile.layout_profile_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layout_profile: reject unexpected property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "__unexpected": true + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layout_profile.layout_profile_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "invalid-id", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.layout_profile.layout_profile_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:INVALID" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator.name: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator.version: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator.configuration_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator: reject unexpected property", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "__unexpected": true + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator.name: reject string below minLength", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator.version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": " invalid!", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.generator.configuration_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:INVALID" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.classification_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "__INVALID_ENUM__", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map.contribution_map_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:INVALID" + } + }, + { + "description": "contribution-map: partial coverage cannot be exact", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "partial", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + }, + { + "description": "contribution-map: non-exact segment cannot produce exact map", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "unverified" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/deposit-snapshot.invalid.json b/schemas/provenance/v1/fixtures/invalid/deposit-snapshot.invalid.json new file mode 100644 index 0000000..304714d --- /dev/null +++ b/schemas/provenance/v1/fixtures/invalid/deposit-snapshot.invalid.json @@ -0,0 +1,736 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/deposit-snapshot.schema.json", + "cases": [ + { + "description": "deposit-snapshot.schema_version: reject missing required property", + "instance": { + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.deposit_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.project_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.application_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.deposit_path: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.media_type: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.byte_length: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.deposit_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.manuscript_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.manuscript_revision_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.cpl_chain_head: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.cpl_event_sequence: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.layout_profile: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.created_at: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + } + } + }, + { + "description": "deposit-snapshot: reject unexpected property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z", + "__unexpected": true + } + }, + { + "description": "deposit-snapshot.schema_version: reject value different from const", + "instance": { + "schema_version": "__INVALID_CONST__", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.deposit_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "invalid-id", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.project_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "invalid-id", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.application_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": " invalid!", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.deposit_path: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "../outside-project", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.deposit_path: reject string below minLength", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.media_type: reject string below minLength", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.byte_length: reject value below minimum", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 0, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.deposit_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:INVALID", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.manuscript_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "invalid-id", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.manuscript_revision_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:INVALID", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.cpl_chain_head: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:INVALID", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.cpl_event_sequence: reject value below minimum", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 0, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.layout_profile.layout_profile_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.layout_profile.layout_profile_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.layout_profile: reject unexpected property", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "__unexpected": true + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.layout_profile.layout_profile_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "invalid-id", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.layout_profile.layout_profile_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:INVALID" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } + }, + { + "description": "deposit-snapshot.created_at: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "not-a-timestamp" + } + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/expression-segment.invalid.json b/schemas/provenance/v1/fixtures/invalid/expression-segment.invalid.json new file mode 100644 index 0000000..ecc0caf --- /dev/null +++ b/schemas/provenance/v1/fixtures/invalid/expression-segment.invalid.json @@ -0,0 +1,2205 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/expression-segment.schema.json", + "cases": [ + { + "description": "expression-segment.schema_version: reject missing required property", + "instance": { + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.segment_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.project_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.segment_sequence: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.content_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.normalized_unicode_scalar_length: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.recorded_origin_kind: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.actor_identity_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.generation_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.lineage_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.lineage_reference_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.operation_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.transformation_relationships: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.assertion_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.selection_arrangement_assertion_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.included_in_deposit_assertion_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "classification_status": "exact" + } + }, + { + "description": "expression-segment.classification_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V" + } + }, + { + "description": "expression-segment: reject unexpected property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact", + "__unexpected": true + } + }, + { + "description": "expression-segment.schema_version: reject value different from const", + "instance": { + "schema_version": "__INVALID_CONST__", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.segment_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "invalid-id", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.project_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "invalid-id", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "invalid-id", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.segment_sequence: reject value below minimum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 0, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.schema_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.document_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.coordinate_system: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.start: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.end: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.preimage_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.text_fragment_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range: reject unexpected property", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C", + "__unexpected": true + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.schema_version: reject value different from const", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "__INVALID_CONST__", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.document_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "invalid-id", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.coordinate_system: reject value outside enum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "__INVALID_ENUM__", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.start: reject value below minimum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": -1, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.end: reject value below minimum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": -1, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.preimage_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:INVALID", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.range.text_fragment_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "invalid-id" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.content_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:INVALID", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.normalized_unicode_scalar_length: reject value below minimum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 0, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.recorded_origin_kind: reject value outside enum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "__INVALID_ENUM__", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.actor_identity_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "__INVALID_ENUM__", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.generation_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "__INVALID_ENUM__", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.lineage_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "__INVALID_ENUM__", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.lineage_reference_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "invalid-id" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.operation_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "invalid-id" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.transformation_relationships[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "__INVALID_ENUM__" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.assertion_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "invalid-id" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.included_in_deposit_assertion_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "invalid-id", + "classification_status": "exact" + } + }, + { + "description": "expression-segment.classification_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "__INVALID_ENUM__" + } + }, + { + "description": "expression-segment: unattested origin cannot be exact", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "unattested", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment: unknown identity cannot be exact", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "unknown", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment: unknown generation cannot be exact", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "unknown", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + { + "description": "expression-segment: unknown lineage cannot be exact", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "unknown", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/harp-export-manifest.invalid.json b/schemas/provenance/v1/fixtures/invalid/harp-export-manifest.invalid.json new file mode 100644 index 0000000..1d9acf1 --- /dev/null +++ b/schemas/provenance/v1/fixtures/invalid/harp-export-manifest.invalid.json @@ -0,0 +1,5945 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/harp-export-manifest.schema.json", + "cases": [ + { + "description": "harp-export-manifest.schema_version: reject missing required property", + "instance": { + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.manifest_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.project_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.harp_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.harp_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.deposit_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.deposit_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.contribution_map_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.contribution_map_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.cpl_chain_head: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.verification_report_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.sanitization_profile: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.sanitization_rules_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.omissions: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.created_at: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.manifest_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "harp-export-manifest: reject unexpected property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324", + "__unexpected": true + } + }, + { + "description": "harp-export-manifest.schema_version: reject value different from const", + "instance": { + "schema_version": "__INVALID_CONST__", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.manifest_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "invalid-id", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.project_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "invalid-id", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.harp_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "invalid-id", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.harp_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:INVALID", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.deposit_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "invalid-id", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.deposit_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:INVALID", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.contribution_map_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "invalid-id", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.contribution_map_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:INVALID", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.cpl_chain_head: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:INVALID", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.deposit_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.manuscript_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.manuscript_revision_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.cpl_chain_head: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.cpl_event_sequence: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.harp_schema_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.harp_generator_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.application_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.policy_profile_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.policy_profile_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.policy_profile_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.policy_retrieval_date: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.sanitization_profile: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.legal_scope_statement: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private" + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata: reject unexpected property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office.", + "__unexpected": true + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.deposit_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:INVALID", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.manuscript_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "invalid-id", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.manuscript_revision_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:INVALID", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.cpl_chain_head: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:INVALID", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.cpl_event_sequence: reject value below minimum", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 0, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.harp_schema_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": " invalid!", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.harp_generator_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": " invalid!", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.application_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": " invalid!", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.policy_profile_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "invalid-id", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.policy_profile_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": " invalid!", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.policy_profile_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:INVALID", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.sanitization_profile: reject value outside enum", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "__INVALID_ENUM__", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.report_metadata.legal_scope_statement: reject string below minLength", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "" + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.verification_report_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:INVALID", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.sanitization_profile: reject value outside enum", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "__INVALID_ENUM__", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.sanitization_rules_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:INVALID", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files: reject array below minItems", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].role: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].path: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].size: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].privacy_classification: reject missing required property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048 + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0]: reject unexpected property", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration", + "__unexpected": true + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].role: reject value outside enum", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "__INVALID_ENUM__", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].path: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "../outside-project", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].path: reject string below minLength", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:INVALID", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].size: reject value below minimum", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 0, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.files[0].privacy_classification: reject value outside enum", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "__INVALID_ENUM__" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.created_at: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "not-a-timestamp", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + }, + { + "description": "harp-export-manifest.manifest_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:INVALID" + } + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/human-authorship-record.invalid.json b/schemas/provenance/v1/fixtures/invalid/human-authorship-record.invalid.json new file mode 100644 index 0000000..78fb6e4 --- /dev/null +++ b/schemas/provenance/v1/fixtures/invalid/human-authorship-record.invalid.json @@ -0,0 +1,11072 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/human-authorship-record.schema.json", + "cases": [ + { + "description": "human-authorship-record.schema_version: reject missing required property", + "instance": { + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.harp_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.project_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.application_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.generator_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.cpl_binding: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.contribution_map: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.evidentiary_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.applicability_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.generation_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.origin_coverage_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.lineage_coverage_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.claim_summary: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.representative_transformation_operation_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.limitation_codes: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.explanation_codes: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.sanitization_profile: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.harp_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private" + } + }, + { + "description": "human-authorship-record: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "__unexpected": true + } + }, + { + "description": "human-authorship-record.schema_version: reject value different from const", + "instance": { + "schema_version": "__INVALID_CONST__", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.harp_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "invalid-id", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.project_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "invalid-id", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.application_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": " invalid!", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.generator_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": " invalid!", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.deposit_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.deposit_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.manuscript_revision_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.manuscript_revision_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "__unexpected": true + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.deposit_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "invalid-id", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.deposit_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:INVALID", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.manuscript_revision_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "invalid-id", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.deposit.manuscript_revision_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:INVALID" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.cpl_binding.chain_head: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.cpl_binding.event_sequence: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444" + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.cpl_binding: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42, + "__unexpected": true + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.cpl_binding.chain_head: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:INVALID", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.cpl_binding.event_sequence: reject value below minimum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 0 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.contribution_map.contribution_map_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.contribution_map.contribution_map_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.contribution_map: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "__unexpected": true + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.contribution_map.contribution_map_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "invalid-id", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.contribution_map.contribution_map_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:INVALID" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.policy_profile_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.profile_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.profile_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.retrieved_on: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current", + "__unexpected": true + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.policy_profile_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "invalid-id", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.profile_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": " invalid!", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.profile_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:INVALID", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.policy_profile.status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "__INVALID_ENUM__" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.evidentiary_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "__INVALID_ENUM__", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.applicability_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "__INVALID_ENUM__", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.generation_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "__INVALID_ENUM__", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.origin_coverage_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "__INVALID_ENUM__", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.lineage_coverage_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "__INVALID_ENUM__", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.declared_name: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.identity_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.evidence_reference_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.user_approved: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ] + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true, + "__unexpected": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.declared_name: reject string below minLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.identity_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "__INVALID_ENUM__", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.evidence_reference_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "invalid-id" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.identity_declaration.user_approved: reject value different from const", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": false + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.claim_summary: reject string below minLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.claim_summary: reject string above maxLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].provider_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].model_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].identity_status: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].included_expression_segment_ids: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded" + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0]: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ], + "__unexpected": true + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].provider_id: reject string below minLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].model_id: reject string below minLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].identity_status: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "__INVALID_ENUM__", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.ai_system_disclosures[0].included_expression_segment_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "invalid-id" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.unit: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.denominator: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.recorded_positions: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.statement: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12 + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin.", + "__unexpected": true + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.unit: reject value different from const", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "__INVALID_CONST__", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.denominator: reject value below minimum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": -1, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.recorded_positions: reject value below minimum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": -1, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.coverage.statement: reject string below minLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "" + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.author_created: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.material_excluded: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.new_material_included: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.note_to_co: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.registration_treatment_suggestions: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.user_approved: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.approval_event_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.approved_language_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language: reject unexpected property", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "__unexpected": true + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.author_created: reject string above maxLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.material_excluded: reject string above maxLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.new_material_included: reject string above maxLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.note_to_co: reject string above maxLength", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.registration_treatment_suggestions[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "__INVALID_ENUM__", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.user_approved: reject value different from const", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": false, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.approval_event_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "invalid-id", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.suggested_registration_language.approved_language_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:INVALID" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.representative_transformation_operation_ids[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "invalid-id" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.limitation_codes: reject array below minItems", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.limitation_codes[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "__INVALID_ENUM__", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.explanation_codes: reject array below minItems", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.explanation_codes[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "__INVALID_ENUM__", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.sanitization_profile: reject value outside enum", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "__INVALID_ENUM__", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record.harp_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:INVALID" + } + }, + { + "description": "human-authorship-record: unknown identity cannot be exact", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": null, + "identity_status": "unknown", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record: unknown generation cannot be exact", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "unknown", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record: unknown origin cannot be exact", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "unknown", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record: unknown lineage cannot be exact", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "unknown", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record: unknown AI-system identity cannot be exact", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": null, + "model_id": null, + "identity_status": "unknown", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + { + "description": "human-authorship-record: human percentage is a prohibited field", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "human_percentage": 100 + } + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/project-manifest.invalid.json b/schemas/provenance/v1/fixtures/invalid/project-manifest.invalid.json index e986365..a539711 100644 --- a/schemas/provenance/v1/fixtures/invalid/project-manifest.invalid.json +++ b/schemas/provenance/v1/fixtures/invalid/project-manifest.invalid.json @@ -1,10 +1,64 @@ { "schema": "https://thinkloom.app/schemas/provenance/1.0/project-manifest.schema.json", "cases": [ + { + "description": "project-manifest.project_format: reject missing required property", + "instance": { + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", + "schema_version": "1.0", + "application_version": "0.5.11", + "project_id": "project_01J00000000000000000000001", + "title": "The Attention Commons", + "created_at": "2026-07-17T18:42:10.123Z", + "updated_at": "2026-07-17T18:43:11.456Z", + "current_phase": "ideation", + "publication_status": "working", + "provenance_policy_id": "policy_01J0000000000000000000000H", + "audio_retained": false + } + }, + { + "description": "project-manifest.project_format_version: reject missing required property", + "instance": { + "project_format": "thinkloom-cpl", + "provenance_conformance": "cpl-1.0", + "schema_version": "1.0", + "application_version": "0.5.11", + "project_id": "project_01J00000000000000000000001", + "title": "The Attention Commons", + "created_at": "2026-07-17T18:42:10.123Z", + "updated_at": "2026-07-17T18:43:11.456Z", + "current_phase": "ideation", + "publication_status": "working", + "provenance_policy_id": "policy_01J0000000000000000000000H", + "audio_retained": false + } + }, + { + "description": "project-manifest.provenance_conformance: reject missing required property", + "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "schema_version": "1.0", + "application_version": "0.5.11", + "project_id": "project_01J00000000000000000000001", + "title": "The Attention Commons", + "created_at": "2026-07-17T18:42:10.123Z", + "updated_at": "2026-07-17T18:43:11.456Z", + "current_phase": "ideation", + "publication_status": "working", + "provenance_policy_id": "policy_01J0000000000000000000000H", + "audio_retained": false + } + }, { "description": "project-manifest.schema_version: reject missing required property", "instance": { - "application_version": "0.4.0", + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -18,6 +72,9 @@ { "description": "project-manifest.application_version: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", @@ -32,8 +89,11 @@ { "description": "project-manifest.project_id: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", "updated_at": "2026-07-17T18:43:11.456Z", @@ -46,8 +106,11 @@ { "description": "project-manifest.title: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "created_at": "2026-07-17T18:42:10.123Z", "updated_at": "2026-07-17T18:43:11.456Z", @@ -60,8 +123,11 @@ { "description": "project-manifest.created_at: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "updated_at": "2026-07-17T18:43:11.456Z", @@ -74,8 +140,11 @@ { "description": "project-manifest.updated_at: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -88,8 +157,11 @@ { "description": "project-manifest.current_phase: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -102,8 +174,11 @@ { "description": "project-manifest.publication_status: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -116,8 +191,11 @@ { "description": "project-manifest.provenance_policy_id: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -130,8 +208,11 @@ { "description": "project-manifest.audio_retained: reject missing required property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -144,8 +225,11 @@ { "description": "project-manifest: reject unexpected property", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -157,11 +241,68 @@ "__unexpected": true } }, + { + "description": "project-manifest.project_format: reject value different from const", + "instance": { + "project_format": "__INVALID_CONST__", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", + "schema_version": "1.0", + "application_version": "0.5.11", + "project_id": "project_01J00000000000000000000001", + "title": "The Attention Commons", + "created_at": "2026-07-17T18:42:10.123Z", + "updated_at": "2026-07-17T18:43:11.456Z", + "current_phase": "ideation", + "publication_status": "working", + "provenance_policy_id": "policy_01J0000000000000000000000H", + "audio_retained": false + } + }, + { + "description": "project-manifest.project_format_version: reject value different from const", + "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "__INVALID_CONST__", + "provenance_conformance": "cpl-1.0", + "schema_version": "1.0", + "application_version": "0.5.11", + "project_id": "project_01J00000000000000000000001", + "title": "The Attention Commons", + "created_at": "2026-07-17T18:42:10.123Z", + "updated_at": "2026-07-17T18:43:11.456Z", + "current_phase": "ideation", + "publication_status": "working", + "provenance_policy_id": "policy_01J0000000000000000000000H", + "audio_retained": false + } + }, + { + "description": "project-manifest.provenance_conformance: reject value different from const", + "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "__INVALID_CONST__", + "schema_version": "1.0", + "application_version": "0.5.11", + "project_id": "project_01J00000000000000000000001", + "title": "The Attention Commons", + "created_at": "2026-07-17T18:42:10.123Z", + "updated_at": "2026-07-17T18:43:11.456Z", + "current_phase": "ideation", + "publication_status": "working", + "provenance_policy_id": "policy_01J0000000000000000000000H", + "audio_retained": false + } + }, { "description": "project-manifest.schema_version: reject value different from const", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "__INVALID_CONST__", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -175,6 +316,9 @@ { "description": "project-manifest.application_version: reject pattern mismatch", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", "application_version": " invalid!", "project_id": "project_01J00000000000000000000001", @@ -190,8 +334,11 @@ { "description": "project-manifest.project_id: reject pattern mismatch", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "invalid-id", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -205,8 +352,11 @@ { "description": "project-manifest.title: reject string below minLength", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "", "created_at": "2026-07-17T18:42:10.123Z", @@ -220,8 +370,11 @@ { "description": "project-manifest.created_at: reject pattern mismatch", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "not-a-timestamp", @@ -235,8 +388,11 @@ { "description": "project-manifest.updated_at: reject pattern mismatch", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -250,8 +406,11 @@ { "description": "project-manifest.current_phase: reject value outside enum", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -265,8 +424,11 @@ { "description": "project-manifest.publication_status: reject value outside enum", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -280,8 +442,11 @@ { "description": "project-manifest.provenance_policy_id: reject pattern mismatch", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", @@ -295,8 +460,11 @@ { "description": "project-manifest.audio_retained: reject value different from const", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", diff --git a/schemas/provenance/v1/fixtures/invalid/registration-policy-profile.invalid.json b/schemas/provenance/v1/fixtures/invalid/registration-policy-profile.invalid.json new file mode 100644 index 0000000..c200202 --- /dev/null +++ b/schemas/provenance/v1/fixtures/invalid/registration-policy-profile.invalid.json @@ -0,0 +1,3789 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/registration-policy-profile.schema.json", + "cases": [ + { + "description": "registration-policy-profile.schema_version: reject missing required property", + "instance": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.policy_profile_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.profile_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.application_version: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.compatible_application_versions: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.jurisdiction: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.work_class: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.application_type: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.supported_treatment_suggestions: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.disclaimer_text: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.copyright_office_determination_required: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.read_only: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.profile_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true + } + }, + { + "description": "registration-policy-profile: reject unexpected property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "__unexpected": true + } + }, + { + "description": "registration-policy-profile.schema_version: reject value different from const", + "instance": { + "schema_version": "__INVALID_CONST__", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.policy_profile_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "invalid-id", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.profile_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": " invalid!", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.application_version: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": " invalid!", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.compatible_application_versions: reject array below minItems", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.compatible_application_versions[0]: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + " invalid!", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.jurisdiction: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "__INVALID_CONST__", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.work_class: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "__INVALID_CONST__", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.application_type: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "__INVALID_CONST__", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources: reject array below minItems", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0].title: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0].source_url: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0].source_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0].published_on: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0].retrieved_on: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0]: reject unexpected property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19", + "__unexpected": true + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0].title: reject string below minLength", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.official_sources[0].source_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:INVALID", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.author_created: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.material_excluded: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.new_material_included: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.note_to_co: reject missing required property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology: reject unexpected property", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO", + "__unexpected": true + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.author_created: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "__INVALID_CONST__", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.material_excluded: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "__INVALID_CONST__", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.new_material_included: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "__INVALID_CONST__", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.field_terminology.note_to_co: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "__INVALID_CONST__" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.supported_treatment_suggestions: reject array below minItems", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.supported_treatment_suggestions[0]: reject value outside enum", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "__INVALID_ENUM__", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.disclaimer_text: reject string below minLength", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.copyright_office_determination_required: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": false, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.read_only: reject value different from const", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": false, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + }, + { + "description": "registration-policy-profile.profile_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:INVALID" + } + } + ] +} diff --git a/schemas/provenance/v1/fixtures/invalid/sanitized-export-manifest.invalid.json b/schemas/provenance/v1/fixtures/invalid/sanitized-export-manifest.invalid.json index a47d41d..c3e3db9 100644 --- a/schemas/provenance/v1/fixtures/invalid/sanitized-export-manifest.invalid.json +++ b/schemas/provenance/v1/fixtures/invalid/sanitized-export-manifest.invalid.json @@ -6,19 +6,26 @@ "instance": { "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -31,19 +38,26 @@ "instance": { "schema_version": "1.0", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -56,19 +70,122 @@ "instance": { "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.harp_id: reject missing required property", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.harp_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.deposit_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -82,18 +199,25 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -107,18 +231,89 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.completeness_claim: reject missing required property", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.verification_scope_statement: reject missing required property", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -132,12 +327,17 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -151,18 +351,25 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -176,13 +383,20 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", @@ -195,19 +409,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -220,19 +441,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -247,19 +475,26 @@ "schema_version": "__INVALID_CONST__", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -273,19 +508,26 @@ "schema_version": "1.0", "export_id": "invalid-id", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -299,19 +541,125 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "invalid-id", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.harp_id: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "invalid-id", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.harp_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:INVALID", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.deposit_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:INVALID", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -325,19 +673,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:INVALID", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -351,19 +706,92 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "__INVALID_CONST__", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.completeness_claim: reject value different from const", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "__INVALID_CONST__", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.verification_scope_statement: reject string below minLength", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -377,18 +805,25 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -402,18 +837,25 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -427,18 +869,89 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", - "action": "exclude" + "action": "exclude", + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.omission_rules[0].retained_binding_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.omission_rules[0].disclosure_sha256: reject missing required property", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -452,20 +965,27 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b", "__unexpected": true } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -479,19 +999,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "__INVALID_ENUM__", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -505,19 +1032,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "__INVALID_ENUM__", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -531,19 +1065,92 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": -1 + "count": -1, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.omission_rules[0].retained_binding_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:INVALID", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", + "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "size": 1024 + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + } + }, + { + "description": "sanitized-export-manifest.omission_rules[0].disclosure_sha256: reject pattern mismatch", + "instance": { + "schema_version": "1.0", + "export_id": "record_01J00000000000000000000005", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", + "omission_rules": [ + { + "category": "private_conversation", + "action": "exclude", + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:INVALID" + } + ], + "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "files": [ + { + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -557,19 +1164,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:INVALID", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } @@ -583,13 +1197,20 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", @@ -603,13 +1224,20 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", @@ -628,19 +1256,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "size": 1024 } ], @@ -653,19 +1288,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444" } ], @@ -678,19 +1320,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024, "__unexpected": true @@ -705,13 +1354,20 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", @@ -731,13 +1387,20 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", @@ -757,19 +1420,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:INVALID", "size": 1024 } @@ -783,19 +1453,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": -1 } @@ -809,19 +1486,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } diff --git a/schemas/provenance/v1/fixtures/valid/composition-operation.valid.json b/schemas/provenance/v1/fixtures/valid/composition-operation.valid.json new file mode 100644 index 0000000..2c4259c --- /dev/null +++ b/schemas/provenance/v1/fixtures/valid/composition-operation.valid.json @@ -0,0 +1,33 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/composition-operation.schema.json", + "description": "Valid Composition operation example.", + "instance": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } +} diff --git a/schemas/provenance/v1/fixtures/valid/contribution-map.valid.json b/schemas/provenance/v1/fixtures/valid/contribution-map.valid.json new file mode 100644 index 0000000..a17232e --- /dev/null +++ b/schemas/provenance/v1/fixtures/valid/contribution-map.valid.json @@ -0,0 +1,88 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/contribution-map.schema.json", + "description": "Valid Deposit contribution map example.", + "instance": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + } +} diff --git a/schemas/provenance/v1/fixtures/valid/deposit-snapshot.valid.json b/schemas/provenance/v1/fixtures/valid/deposit-snapshot.valid.json new file mode 100644 index 0000000..65dd54c --- /dev/null +++ b/schemas/provenance/v1/fixtures/valid/deposit-snapshot.valid.json @@ -0,0 +1,23 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/deposit-snapshot.schema.json", + "description": "Valid Exact deposit snapshot example.", + "instance": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + } +} diff --git a/schemas/provenance/v1/fixtures/valid/expression-segment.valid.json b/schemas/provenance/v1/fixtures/valid/expression-segment.valid.json new file mode 100644 index 0000000..5614da9 --- /dev/null +++ b/schemas/provenance/v1/fixtures/valid/expression-segment.valid.json @@ -0,0 +1,41 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/expression-segment.schema.json", + "description": "Valid Surviving expression segment example.", + "instance": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } +} diff --git a/schemas/provenance/v1/fixtures/valid/harp-export-manifest.valid.json b/schemas/provenance/v1/fixtures/valid/harp-export-manifest.valid.json new file mode 100644 index 0000000..15f18bf --- /dev/null +++ b/schemas/provenance/v1/fixtures/valid/harp-export-manifest.valid.json @@ -0,0 +1,82 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/harp-export-manifest.schema.json", + "description": "Valid HARP export manifest example.", + "instance": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } +} diff --git a/schemas/provenance/v1/fixtures/valid/human-authorship-record.valid.json b/schemas/provenance/v1/fixtures/valid/human-authorship-record.valid.json new file mode 100644 index 0000000..f5c2fc9 --- /dev/null +++ b/schemas/provenance/v1/fixtures/valid/human-authorship-record.valid.json @@ -0,0 +1,92 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/human-authorship-record.schema.json", + "description": "Valid Human Authorship Record of Provenance example.", + "instance": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } +} diff --git a/schemas/provenance/v1/fixtures/valid/project-manifest.valid.json b/schemas/provenance/v1/fixtures/valid/project-manifest.valid.json index f31e8ff..e73a1c3 100644 --- a/schemas/provenance/v1/fixtures/valid/project-manifest.valid.json +++ b/schemas/provenance/v1/fixtures/valid/project-manifest.valid.json @@ -2,8 +2,11 @@ "schema": "https://thinkloom.app/schemas/provenance/1.0/project-manifest.schema.json", "description": "Valid Project manifest example.", "instance": { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", diff --git a/schemas/provenance/v1/fixtures/valid/registration-policy-profile.valid.json b/schemas/provenance/v1/fixtures/valid/registration-policy-profile.valid.json new file mode 100644 index 0000000..7c52bce --- /dev/null +++ b/schemas/provenance/v1/fixtures/valid/registration-policy-profile.valid.json @@ -0,0 +1,81 @@ +{ + "schema": "https://thinkloom.app/schemas/provenance/1.0/registration-policy-profile.schema.json", + "description": "Valid Registration policy profile example.", + "instance": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } +} diff --git a/schemas/provenance/v1/fixtures/valid/sanitized-export-manifest.valid.json b/schemas/provenance/v1/fixtures/valid/sanitized-export-manifest.valid.json index dcec593..c9f28d8 100644 --- a/schemas/provenance/v1/fixtures/valid/sanitized-export-manifest.valid.json +++ b/schemas/provenance/v1/fixtures/valid/sanitized-export-manifest.valid.json @@ -5,19 +5,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } diff --git a/schemas/provenance/v1/harp-export-manifest.schema.json b/schemas/provenance/v1/harp-export-manifest.schema.json new file mode 100644 index 0000000..b3455ee --- /dev/null +++ b/schemas/provenance/v1/harp-export-manifest.schema.json @@ -0,0 +1,438 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://thinkloom.app/schemas/provenance/1.0/harp-export-manifest.schema.json", + "title": "HARP export manifest", + "description": "Immutable manifest binding the HARP, contribution map, exact deposit, verification report, archive artifacts, sanitization rules, omissions, and hashes. Its digest identity excludes manifest_sha256.", + "type": "object", + "properties": { + "schema_version": { + "const": "1.0" + }, + "manifest_id": { + "type": "string", + "pattern": "^manifest_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "project_id": { + "type": "string", + "pattern": "^project_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "harp_id": { + "type": "string", + "pattern": "^harp_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "harp_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "deposit_id": { + "type": "string", + "pattern": "^deposit_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "deposit_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "contribution_map_id": { + "type": "string", + "pattern": "^map_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "contribution_map_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "cpl_chain_head": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "report_metadata": { + "type": "object", + "properties": { + "deposit_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "manuscript_revision_id": { + "type": "string", + "pattern": "^revision_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "manuscript_revision_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "cpl_chain_head": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "cpl_event_sequence": { + "type": "integer", + "minimum": 1 + }, + "harp_schema_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+$" + }, + "harp_generator_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "application_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "policy_profile_id": { + "type": "string", + "pattern": "^policyprofile_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "policy_profile_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "policy_profile_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "policy_retrieval_date": { + "type": "string", + "format": "date" + }, + "sanitization_profile": { + "enum": [ + "full_private", + "sanitized" + ] + }, + "legal_scope_statement": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "deposit_sha256", + "manuscript_revision_id", + "manuscript_revision_sha256", + "cpl_chain_head", + "cpl_event_sequence", + "harp_schema_version", + "harp_generator_version", + "application_version", + "policy_profile_id", + "policy_profile_version", + "policy_profile_sha256", + "policy_retrieval_date", + "sanitization_profile", + "legal_scope_statement" + ], + "additionalProperties": false + }, + "verification_report_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "sanitization_profile": { + "enum": [ + "full_private", + "sanitized" + ] + }, + "sanitization_rules_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "omissions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "category": { + "enum": [ + "private_conversation", + "rejected_output", + "rejected_model_output", + "credential", + "credential_authorization_material", + "personal_identifier", + "internal_path", + "provider_metadata", + "provider_metadata_not_required", + "protected_source_body", + "other" + ] + }, + "action": { + "enum": [ + "exclude", + "redact", + "summarize" + ] + }, + "count": { + "type": "integer", + "minimum": 1 + }, + "disclosure_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "category", + "action", + "count", + "disclosure_sha256" + ], + "additionalProperties": false + } + }, + "files": { + "type": "array", + "items": { + "type": "object", + "properties": { + "role": { + "enum": [ + "human_readable_harp", + "machine_readable_harp", + "contribution_map", + "deposit_copy", + "verification_report", + "supporting_archive" + ] + }, + "path": { + "type": "string", + "minLength": 1, + "pattern": "^(?!/)(?![A-Za-z]:)(?!.*\\\\)(?!.*(?:^|/)\\.\\.?(?:/|$))[^\\u0000-\\u001f]+$" + }, + "sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "size": { + "type": "integer", + "minimum": 1 + }, + "privacy_classification": { + "enum": [ + "registration", + "deposit", + "sanitized_evidence", + "private" + ] + } + }, + "required": [ + "role", + "path", + "sha256", + "size", + "privacy_classification" + ], + "additionalProperties": false + }, + "minItems": 6, + "uniqueItems": true, + "allOf": [ + { + "contains": { + "type": "object", + "properties": { + "role": { + "const": "human_readable_harp" + } + }, + "required": [ + "role" + ] + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "type": "object", + "properties": { + "role": { + "const": "machine_readable_harp" + } + }, + "required": [ + "role" + ] + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "type": "object", + "properties": { + "role": { + "const": "contribution_map" + } + }, + "required": [ + "role" + ] + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "type": "object", + "properties": { + "role": { + "const": "deposit_copy" + } + }, + "required": [ + "role" + ] + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "type": "object", + "properties": { + "role": { + "const": "verification_report" + } + }, + "required": [ + "role" + ] + }, + "minContains": 1, + "maxContains": 1 + }, + { + "contains": { + "type": "object", + "properties": { + "role": { + "const": "supporting_archive" + } + }, + "required": [ + "role" + ] + }, + "minContains": 1, + "maxContains": 1 + } + ] + }, + "created_at": { + "type": "string", + "format": "date-time", + "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$" + }, + "manifest_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "schema_version", + "manifest_id", + "project_id", + "harp_id", + "harp_sha256", + "deposit_id", + "deposit_sha256", + "contribution_map_id", + "contribution_map_sha256", + "cpl_chain_head", + "report_metadata", + "verification_report_sha256", + "sanitization_profile", + "sanitization_rules_sha256", + "omissions", + "files", + "created_at", + "manifest_sha256" + ], + "additionalProperties": false, + "examples": [ + { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + } + ] +} diff --git a/schemas/provenance/v1/human-authorship-record.schema.json b/schemas/provenance/v1/human-authorship-record.schema.json new file mode 100644 index 0000000..d50f48f --- /dev/null +++ b/schemas/provenance/v1/human-authorship-record.schema.json @@ -0,0 +1,588 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://thinkloom.app/schemas/provenance/1.0/human-authorship-record.schema.json", + "title": "Human Authorship Record of Provenance", + "description": "Canonical machine-readable, non-authoritative, exact-deposit HARP projection. Exact status is evidentiary only and cannot determine legal authorship, originality, copyrightability, or a human percentage. Its digest identity excludes harp_sha256.", + "type": "object", + "properties": { + "schema_version": { + "const": "1.0" + }, + "harp_id": { + "type": "string", + "pattern": "^harp_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "project_id": { + "type": "string", + "pattern": "^project_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "application_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "generator_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "deposit": { + "type": "object", + "properties": { + "deposit_id": { + "type": "string", + "pattern": "^deposit_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "deposit_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "manuscript_revision_id": { + "type": "string", + "pattern": "^revision_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "manuscript_revision_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "deposit_id", + "deposit_sha256", + "manuscript_revision_id", + "manuscript_revision_sha256" + ], + "additionalProperties": false + }, + "cpl_binding": { + "type": "object", + "properties": { + "chain_head": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "event_sequence": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ + "chain_head", + "event_sequence" + ], + "additionalProperties": false + }, + "contribution_map": { + "type": "object", + "properties": { + "contribution_map_id": { + "type": "string", + "pattern": "^map_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "contribution_map_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "contribution_map_id", + "contribution_map_sha256" + ], + "additionalProperties": false + }, + "policy_profile": { + "type": "object", + "properties": { + "policy_profile_id": { + "type": "string", + "pattern": "^policyprofile_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "profile_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "profile_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "retrieved_on": { + "type": "string", + "format": "date" + }, + "status": { + "enum": [ + "current", + "superseded", + "unavailable" + ] + } + }, + "required": [ + "policy_profile_id", + "profile_version", + "profile_sha256", + "retrieved_on", + "status" + ], + "additionalProperties": false + }, + "evidentiary_status": { + "enum": [ + "exact", + "degraded", + "stale", + "unverified" + ] + }, + "applicability_status": { + "enum": [ + "current", + "stale" + ] + }, + "generation_status": { + "enum": [ + "recorded", + "unknown" + ] + }, + "origin_coverage_status": { + "enum": [ + "complete", + "partial", + "unknown" + ] + }, + "lineage_coverage_status": { + "enum": [ + "complete", + "partial", + "unknown" + ] + }, + "identity_declaration": { + "type": "object", + "properties": { + "declared_name": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "identity_status": { + "enum": [ + "verified", + "self_declared", + "unknown" + ] + }, + "evidence_reference_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9_]*_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + }, + "user_approved": { + "const": true + } + }, + "required": [ + "declared_name", + "identity_status", + "evidence_reference_ids", + "user_approved" + ], + "additionalProperties": false + }, + "claim_summary": { + "type": "string", + "minLength": 1, + "maxLength": 4000 + }, + "ai_system_disclosures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider_id": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "model_id": { + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "null" + } + ] + }, + "identity_status": { + "enum": [ + "recorded", + "unknown" + ] + }, + "included_expression_segment_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^segment_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + } + }, + "required": [ + "provider_id", + "model_id", + "identity_status", + "included_expression_segment_ids" + ], + "additionalProperties": false + } + }, + "coverage": { + "type": "object", + "properties": { + "unit": { + "const": "normalized_unicode_scalar_positions" + }, + "denominator": { + "type": "integer", + "minimum": 0 + }, + "recorded_positions": { + "type": "integer", + "minimum": 0 + }, + "statement": { + "type": "string", + "minLength": 1 + } + }, + "required": [ + "unit", + "denominator", + "recorded_positions", + "statement" + ], + "additionalProperties": false + }, + "suggested_registration_language": { + "type": "object", + "properties": { + "author_created": { + "type": "string", + "maxLength": 1000 + }, + "material_excluded": { + "type": "string", + "maxLength": 1000 + }, + "new_material_included": { + "type": "string", + "maxLength": 1000 + }, + "note_to_co": { + "anyOf": [ + { + "type": "string", + "maxLength": 2000 + }, + { + "type": "null" + } + ] + }, + "registration_treatment_suggestions": { + "type": "array", + "items": { + "enum": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ] + }, + "uniqueItems": true + }, + "user_approved": { + "const": true + }, + "approval_event_id": { + "type": "string", + "pattern": "^event_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "approved_language_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "author_created", + "material_excluded", + "new_material_included", + "note_to_co", + "registration_treatment_suggestions", + "user_approved", + "approval_event_id", + "approved_language_sha256" + ], + "additionalProperties": false + }, + "representative_transformation_operation_ids": { + "type": "array", + "items": { + "type": "string", + "pattern": "^operation_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "uniqueItems": true + }, + "limitation_codes": { + "type": "array", + "items": { + "enum": [ + "SELF_DECLARED_IDENTITY", + "UNKNOWN_IDENTITY", + "UNKNOWN_ORIGIN", + "UNKNOWN_GENERATION", + "UNKNOWN_LINEAGE", + "UNATTESTED_EXPRESSION", + "DEGRADED_COVERAGE", + "SUPERSEDED_POLICY_PROFILE", + "SANITIZED_EVIDENCE", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "explanation_codes": { + "type": "array", + "items": { + "enum": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "sanitization_profile": { + "enum": [ + "full_private", + "sanitized" + ] + }, + "harp_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "schema_version", + "harp_id", + "project_id", + "application_version", + "generator_version", + "deposit", + "cpl_binding", + "contribution_map", + "policy_profile", + "evidentiary_status", + "applicability_status", + "generation_status", + "origin_coverage_status", + "lineage_coverage_status", + "identity_declaration", + "claim_summary", + "ai_system_disclosures", + "coverage", + "suggested_registration_language", + "representative_transformation_operation_ids", + "limitation_codes", + "explanation_codes", + "sanitization_profile", + "harp_sha256" + ], + "additionalProperties": false, + "allOf": [ + { + "if": { + "properties": { + "evidentiary_status": { + "const": "exact" + } + }, + "required": [ + "evidentiary_status" + ] + }, + "then": { + "properties": { + "applicability_status": { + "const": "current" + }, + "generation_status": { + "const": "recorded" + }, + "origin_coverage_status": { + "const": "complete" + }, + "lineage_coverage_status": { + "const": "complete" + }, + "identity_declaration": { + "type": "object", + "properties": { + "identity_status": { + "enum": [ + "verified", + "self_declared" + ] + } + }, + "required": [ + "identity_status" + ] + }, + "ai_system_disclosures": { + "type": "array", + "items": { + "type": "object", + "properties": { + "identity_status": { + "const": "recorded" + } + }, + "required": [ + "identity_status" + ] + } + }, + "policy_profile": { + "type": "object", + "properties": { + "status": { + "const": "current" + } + }, + "required": [ + "status" + ] + } + } + } + } + ], + "examples": [ + { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + ] +} diff --git a/schemas/provenance/v1/project-manifest.schema.json b/schemas/provenance/v1/project-manifest.schema.json index 51e874f..12e1d08 100644 --- a/schemas/provenance/v1/project-manifest.schema.json +++ b/schemas/provenance/v1/project-manifest.schema.json @@ -2,9 +2,18 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://thinkloom.app/schemas/provenance/1.0/project-manifest.schema.json", "title": "Project manifest", - "description": "Canonical identity and lifecycle metadata for a 1.0 project.", + "description": "Canonical identity, exact CPL conformance marker, and lifecycle metadata for a 1.0 project.", "type": "object", "properties": { + "project_format": { + "const": "thinkloom-cpl" + }, + "project_format_version": { + "const": "1.0" + }, + "provenance_conformance": { + "const": "cpl-1.0" + }, "schema_version": { "const": "1.0" }, @@ -56,6 +65,9 @@ } }, "required": [ + "project_format", + "project_format_version", + "provenance_conformance", "schema_version", "application_version", "project_id", @@ -70,8 +82,11 @@ "additionalProperties": false, "examples": [ { + "project_format": "thinkloom-cpl", + "project_format_version": "1.0", + "provenance_conformance": "cpl-1.0", "schema_version": "1.0", - "application_version": "0.4.0", + "application_version": "0.5.11", "project_id": "project_01J00000000000000000000001", "title": "The Attention Commons", "created_at": "2026-07-17T18:42:10.123Z", diff --git a/schemas/provenance/v1/registration-policy-profile.schema.json b/schemas/provenance/v1/registration-policy-profile.schema.json new file mode 100644 index 0000000..0db3486 --- /dev/null +++ b/schemas/provenance/v1/registration-policy-profile.schema.json @@ -0,0 +1,236 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://thinkloom.app/schemas/provenance/1.0/registration-policy-profile.schema.json", + "title": "Registration policy profile", + "description": "Immutable read-only U.S. literary-work Standard Application terminology and disclaimer profile. Its digest identity excludes profile_sha256.", + "type": "object", + "properties": { + "schema_version": { + "const": "1.0" + }, + "policy_profile_id": { + "type": "string", + "pattern": "^policyprofile_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "profile_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "application_version": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "compatible_application_versions": { + "type": "array", + "items": { + "type": "string", + "pattern": "^\\d+\\.\\d+\\.\\d+$" + }, + "minItems": 1, + "uniqueItems": true + }, + "jurisdiction": { + "const": "US" + }, + "work_class": { + "const": "literary_work" + }, + "application_type": { + "const": "standard_application" + }, + "official_sources": { + "type": "array", + "items": { + "type": "object", + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "source_url": { + "type": "string", + "format": "uri" + }, + "source_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "published_on": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ] + }, + "retrieved_on": { + "type": "string", + "format": "date" + } + }, + "required": [ + "title", + "source_url", + "source_sha256", + "published_on", + "retrieved_on" + ], + "additionalProperties": false + }, + "minItems": 5 + }, + "field_terminology": { + "type": "object", + "properties": { + "author_created": { + "const": "Author Created" + }, + "material_excluded": { + "const": "Material Excluded" + }, + "new_material_included": { + "const": "New Material Included" + }, + "note_to_co": { + "const": "Note to CO" + } + }, + "required": [ + "author_created", + "material_excluded", + "new_material_included", + "note_to_co" + ], + "additionalProperties": false + }, + "supported_treatment_suggestions": { + "type": "array", + "items": { + "enum": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ] + }, + "minItems": 1, + "uniqueItems": true + }, + "disclaimer_text": { + "type": "string", + "minLength": 1 + }, + "copyright_office_determination_required": { + "const": true + }, + "read_only": { + "const": true + }, + "profile_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + } + }, + "required": [ + "schema_version", + "policy_profile_id", + "profile_version", + "application_version", + "compatible_application_versions", + "jurisdiction", + "work_class", + "application_type", + "official_sources", + "field_terminology", + "supported_treatment_suggestions", + "disclaimer_text", + "copyright_office_determination_required", + "read_only", + "profile_sha256" + ], + "additionalProperties": false, + "examples": [ + { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + } + ] +} diff --git a/schemas/provenance/v1/registries/assertion-boundary-kinds.json b/schemas/provenance/v1/registries/assertion-boundary-kinds.json index 8c81f9c..22b5c9e 100644 --- a/schemas/provenance/v1/registries/assertion-boundary-kinds.json +++ b/schemas/provenance/v1/registries/assertion-boundary-kinds.json @@ -2,6 +2,23 @@ "registry_version": "1.0", "provenance_schema_version": "1.0", "application_version": "0.4.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "name": "assertion-boundary-kinds", "description": "Machine-readable boundaries preventing an unqualified exact conclusion.", "entries": [ diff --git a/schemas/provenance/v1/registries/assertion-confidence-dimensions.json b/schemas/provenance/v1/registries/assertion-confidence-dimensions.json index 233bb79..2f7ced2 100644 --- a/schemas/provenance/v1/registries/assertion-confidence-dimensions.json +++ b/schemas/provenance/v1/registries/assertion-confidence-dimensions.json @@ -2,6 +2,23 @@ "registry_version": "1.0", "provenance_schema_version": "1.0", "application_version": "0.4.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "name": "assertion-confidence-dimensions", "description": "Independent non-numeric confidence dimensions.", "values": [ diff --git a/schemas/provenance/v1/registries/assertion-evaluation-statuses.json b/schemas/provenance/v1/registries/assertion-evaluation-statuses.json index 4f7128b..10bbda1 100644 --- a/schemas/provenance/v1/registries/assertion-evaluation-statuses.json +++ b/schemas/provenance/v1/registries/assertion-evaluation-statuses.json @@ -2,6 +2,23 @@ "registry_version": "1.0", "provenance_schema_version": "1.0", "application_version": "0.4.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "name": "assertion-evaluation-statuses", "description": "Consumer-facing point-in-time assertion conclusions.", "entries": [ diff --git a/schemas/provenance/v1/registries/assertion-evidence-classes.json b/schemas/provenance/v1/registries/assertion-evidence-classes.json index 2073af5..4e4ab50 100644 --- a/schemas/provenance/v1/registries/assertion-evidence-classes.json +++ b/schemas/provenance/v1/registries/assertion-evidence-classes.json @@ -2,6 +2,23 @@ "registry_version": "1.0", "provenance_schema_version": "1.0", "application_version": "0.4.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "name": "assertion-evidence-classes", "description": "Evidence availability and authority requirements.", "entries": [ diff --git a/schemas/provenance/v1/registries/assertion-lifecycle-phases.json b/schemas/provenance/v1/registries/assertion-lifecycle-phases.json index 6e83e47..48f98dd 100644 --- a/schemas/provenance/v1/registries/assertion-lifecycle-phases.json +++ b/schemas/provenance/v1/registries/assertion-lifecycle-phases.json @@ -2,6 +2,23 @@ "registry_version": "1.0", "provenance_schema_version": "1.0", "application_version": "0.4.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "name": "assertion-lifecycle-phases", "description": "Immutable assertion lifecycle phase observed when the relationship was asserted.", "entries": [ diff --git a/schemas/provenance/v1/registries/assertion-reason-codes.json b/schemas/provenance/v1/registries/assertion-reason-codes.json index ebcfb89..82d67e3 100644 --- a/schemas/provenance/v1/registries/assertion-reason-codes.json +++ b/schemas/provenance/v1/registries/assertion-reason-codes.json @@ -2,6 +2,23 @@ "registry_version": "1.0", "provenance_schema_version": "1.0", "application_version": "0.4.0", + "introduced_in_application_version": "0.4.0", + "compatible_application_versions": [ + "0.4.0", + "0.5.0", + "0.5.1", + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], "name": "assertion-reason-codes", "description": "Stable explanations for assertion creation and evaluation outcomes.", "entries": [ diff --git a/schemas/provenance/v1/registries/composition-assertion-predicates.json b/schemas/provenance/v1/registries/composition-assertion-predicates.json new file mode 100644 index 0000000..9d366a8 --- /dev/null +++ b/schemas/provenance/v1/registries/composition-assertion-predicates.json @@ -0,0 +1,47 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "composition-assertion-predicates", + "description": "Canonical composition relationship predicates used by existing provenance assertions.", + "entries": [ + { + "code": "derived_from", + "meaning": "Assertion relationship: derived from." + }, + { + "code": "generated_by", + "meaning": "Assertion relationship: generated by." + }, + { + "code": "modified_by_human", + "meaning": "Assertion relationship: modified by human." + }, + { + "code": "selected_by_human", + "meaning": "Assertion relationship: selected by human." + }, + { + "code": "arranged_by_human", + "meaning": "Assertion relationship: arranged by human." + }, + { + "code": "included_in_deposit", + "meaning": "Assertion relationship: included in deposit." + } + ] +} diff --git a/schemas/provenance/v1/registries/composition-operation-kinds.json b/schemas/provenance/v1/registries/composition-operation-kinds.json new file mode 100644 index 0000000..083905c --- /dev/null +++ b/schemas/provenance/v1/registries/composition-operation-kinds.json @@ -0,0 +1,55 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "composition-operation-kinds", + "description": "Composition-specific immutable operation kinds.", + "entries": [ + { + "code": "insert", + "meaning": "Insert expression at a revision-bound destination." + }, + { + "code": "delete", + "meaning": "Delete expression identified by an exact preimage range." + }, + { + "code": "replace", + "meaning": "Replace an exact preimage range with new expression." + }, + { + "code": "move", + "meaning": "Move expression while retaining stable lineage." + }, + { + "code": "paste", + "meaning": "Insert pasted material whose human authorship is not inferred." + }, + { + "code": "transcription", + "meaning": "Insert human expressive input mediated by transcription without retaining audio." + }, + { + "code": "ai_acceptance", + "meaning": "Accept expression from a recorded model invocation and disposition." + }, + { + "code": "restoration", + "meaning": "Restore expression from a recorded earlier revision." + } + ] +} diff --git a/schemas/provenance/v1/registries/contribution-map-layers.json b/schemas/provenance/v1/registries/contribution-map-layers.json new file mode 100644 index 0000000..b38e300 --- /dev/null +++ b/schemas/provenance/v1/registries/contribution-map-layers.json @@ -0,0 +1,47 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "contribution-map-layers", + "description": "Independent projection layers that must not be collapsed into recorded origin.", + "entries": [ + { + "code": "recorded_origin", + "meaning": "Contribution-map layer: recorded origin." + }, + { + "code": "transformation", + "meaning": "Contribution-map layer: transformation." + }, + { + "code": "selection_arrangement", + "meaning": "Contribution-map layer: selection arrangement." + }, + { + "code": "evidentiary_evaluation", + "meaning": "Contribution-map layer: evidentiary evaluation." + }, + { + "code": "suggested_registration_treatment", + "meaning": "Contribution-map layer: suggested registration treatment." + }, + { + "code": "structural_locator", + "meaning": "Contribution-map layer: structural locator." + } + ] +} diff --git a/schemas/provenance/v1/registries/harp-explanation-codes.json b/schemas/provenance/v1/registries/harp-explanation-codes.json new file mode 100644 index 0000000..5299994 --- /dev/null +++ b/schemas/provenance/v1/registries/harp-explanation-codes.json @@ -0,0 +1,47 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "harp-explanation-codes", + "description": "Stable explanations of HARP scope and interpretation.", + "entries": [ + { + "code": "INTEGRITY_ONLY_VERIFICATION", + "meaning": "HARP explanation: integrity only verification." + }, + { + "code": "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "meaning": "HARP explanation: recorded origin not legal authorship." + }, + { + "code": "SELECTION_ARRANGEMENT_IS_OVERLAY", + "meaning": "HARP explanation: selection arrangement is overlay." + }, + { + "code": "PAGE_LOCATORS_ARE_DERIVED", + "meaning": "HARP explanation: page locators are derived." + }, + { + "code": "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "meaning": "HARP explanation: registration language is suggested." + }, + { + "code": "HARP_STALE_AFTER_EDIT", + "meaning": "HARP explanation: harp stale after edit." + } + ] +} diff --git a/schemas/provenance/v1/registries/harp-limitation-codes.json b/schemas/provenance/v1/registries/harp-limitation-codes.json new file mode 100644 index 0000000..4ec091f --- /dev/null +++ b/schemas/provenance/v1/registries/harp-limitation-codes.json @@ -0,0 +1,63 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "harp-limitation-codes", + "description": "Stable HARP limitation disclosures.", + "entries": [ + { + "code": "SELF_DECLARED_IDENTITY", + "meaning": "HARP limitation: self declared identity." + }, + { + "code": "UNKNOWN_IDENTITY", + "meaning": "HARP limitation: unknown identity." + }, + { + "code": "UNKNOWN_ORIGIN", + "meaning": "HARP limitation: unknown origin." + }, + { + "code": "UNKNOWN_GENERATION", + "meaning": "HARP limitation: unknown generation." + }, + { + "code": "UNKNOWN_LINEAGE", + "meaning": "HARP limitation: unknown lineage." + }, + { + "code": "UNATTESTED_EXPRESSION", + "meaning": "HARP limitation: unattested expression." + }, + { + "code": "DEGRADED_COVERAGE", + "meaning": "HARP limitation: degraded coverage." + }, + { + "code": "SUPERSEDED_POLICY_PROFILE", + "meaning": "HARP limitation: superseded policy profile." + }, + { + "code": "SANITIZED_EVIDENCE", + "meaning": "HARP limitation: sanitized evidence." + }, + { + "code": "COPYRIGHT_OFFICE_DETERMINES_SCOPE", + "meaning": "HARP limitation: copyright office determines scope." + } + ] +} diff --git a/schemas/provenance/v1/registries/recorded-origin-kinds.json b/schemas/provenance/v1/registries/recorded-origin-kinds.json new file mode 100644 index 0000000..6f7c92f --- /dev/null +++ b/schemas/provenance/v1/registries/recorded-origin-kinds.json @@ -0,0 +1,47 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "recorded-origin-kinds", + "description": "Evidence classifications for how expression entered the composition, never legal authorship categories.", + "entries": [ + { + "code": "recorded_direct_human_input", + "meaning": "CPL records direct human expressive input." + }, + { + "code": "human_expressive_input_via_transcription", + "meaning": "CPL records human expressive input mediated by transcription." + }, + { + "code": "accepted_ai_output", + "meaning": "Expression was accepted from a recorded AI-system output." + }, + { + "code": "imported_or_pasted", + "meaning": "Expression entered through import or paste without inferred authorship." + }, + { + "code": "system_restoration", + "meaning": "Expression was restored from a recorded project revision." + }, + { + "code": "unattested", + "meaning": "No exact recorded origin is available for the expression." + } + ] +} diff --git a/schemas/provenance/v1/registries/registration-treatment-suggestions.json b/schemas/provenance/v1/registries/registration-treatment-suggestions.json new file mode 100644 index 0000000..0bfe441 --- /dev/null +++ b/schemas/provenance/v1/registries/registration-treatment-suggestions.json @@ -0,0 +1,47 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "registration-treatment-suggestions", + "description": "Editable policy-profile suggestions, not evidence facts or legal determinations.", + "entries": [ + { + "code": "claim_as_human_contribution", + "meaning": "Suggested registration treatment: claim as human contribution." + }, + { + "code": "exclude_ai_generated_material", + "meaning": "Suggested registration treatment: exclude ai generated material." + }, + { + "code": "describe_new_human_material", + "meaning": "Suggested registration treatment: describe new human material." + }, + { + "code": "disclose_ai_use", + "meaning": "Suggested registration treatment: disclose ai use." + }, + { + "code": "manual_review_required", + "meaning": "Suggested registration treatment: manual review required." + }, + { + "code": "no_suggestion", + "meaning": "Suggested registration treatment: no suggestion." + } + ] +} diff --git a/schemas/provenance/v1/registries/transformation-relationships.json b/schemas/provenance/v1/registries/transformation-relationships.json new file mode 100644 index 0000000..f338349 --- /dev/null +++ b/schemas/provenance/v1/registries/transformation-relationships.json @@ -0,0 +1,63 @@ +{ + "registry_version": "1.1", + "provenance_schema_version": "1.0", + "application_version": "0.5.2", + "introduced_in_application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "name": "transformation-relationships", + "description": "Independent relationships describing how expression changed or derived.", + "entries": [ + { + "code": "inserted", + "meaning": "Recorded composition transformation: inserted." + }, + { + "code": "deleted", + "meaning": "Recorded composition transformation: deleted." + }, + { + "code": "replaced", + "meaning": "Recorded composition transformation: replaced." + }, + { + "code": "moved", + "meaning": "Recorded composition transformation: moved." + }, + { + "code": "pasted_from_external", + "meaning": "Recorded composition transformation: pasted from external." + }, + { + "code": "transcribed_from_human_speech", + "meaning": "Recorded composition transformation: transcribed from human speech." + }, + { + "code": "generated_by_ai", + "meaning": "Recorded composition transformation: generated by ai." + }, + { + "code": "modified_by_human", + "meaning": "Recorded composition transformation: modified by human." + }, + { + "code": "restored_from_revision", + "meaning": "Recorded composition transformation: restored from revision." + }, + { + "code": "derived_from", + "meaning": "Recorded composition transformation: derived from." + } + ] +} diff --git a/schemas/provenance/v1/sanitized-export-manifest.schema.json b/schemas/provenance/v1/sanitized-export-manifest.schema.json index ef7136b..6c023b8 100644 --- a/schemas/provenance/v1/sanitized-export-manifest.schema.json +++ b/schemas/provenance/v1/sanitized-export-manifest.schema.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://thinkloom.app/schemas/provenance/1.0/sanitized-export-manifest.schema.json", "title": "Sanitized export manifest", - "description": "Disclosure and file inventory for a non-mutating sanitized evidence export.", + "description": "Disclosure, retained-evidence bindings, completeness boundary, and file inventory for a non-mutating sanitized HARP export.", "type": "object", "properties": { "schema_version": { @@ -16,6 +16,18 @@ "type": "string", "pattern": "^project_[0-9A-HJKMNP-TV-Z]{26}$" }, + "harp_id": { + "type": "string", + "pattern": "^harp_[0-9A-HJKMNP-TV-Z]{26}$" + }, + "harp_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "deposit_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, "source_chain_head": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" @@ -23,6 +35,13 @@ "profile": { "const": "sanitized" }, + "completeness_claim": { + "const": "selective_disclosed_subset" + }, + "verification_scope_statement": { + "type": "string", + "minLength": 1 + }, "omission_rules": { "type": "array", "items": { @@ -32,10 +51,14 @@ "enum": [ "private_conversation", "rejected_output", + "rejected_model_output", "provider_detail", + "provider_metadata_not_required", + "credential_authorization_material", "personal_identifier", "internal_path", "source_body", + "protected_source_body", "other" ] }, @@ -49,12 +72,22 @@ "count": { "type": "integer", "minimum": 0 + }, + "retained_binding_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" + }, + "disclosure_sha256": { + "type": "string", + "pattern": "^sha256:[a-f0-9]{64}$" } }, "required": [ "category", "action", - "count" + "count", + "retained_binding_sha256", + "disclosure_sha256" ], "additionalProperties": false } @@ -101,8 +134,13 @@ "schema_version", "export_id", "project_id", + "harp_id", + "harp_sha256", + "deposit_sha256", "source_chain_head", "profile", + "completeness_claim", + "verification_scope_statement", "omission_rules", "rules_sha256", "files", @@ -114,19 +152,26 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:b58311ab980eecb4da1b7af0b80a6151eb0f90e287c6b30352e0b91eab8cb59b" } ], "rules_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } diff --git a/schemas/provenance/v1/vectors/composition-and-harp-classification.json b/schemas/provenance/v1/vectors/composition-and-harp-classification.json new file mode 100644 index 0000000..d77498c --- /dev/null +++ b/schemas/provenance/v1/vectors/composition-and-harp-classification.json @@ -0,0 +1,881 @@ +{ + "vector_version": "1.1", + "operations": { + "direct_human_insert": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000X", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "insert", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "inserted" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + }, + "paste": { + "schema_version": "1.0", + "operation_id": "operation_01J00000000000000000000007", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "paste", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "record_01J00000000000000000000005" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "imported_or_pasted", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "pasted_from_external" + ], + "lineage_reference_ids": [ + "record_01J00000000000000000000005" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + }, + "transcription": { + "schema_version": "1.0", + "operation_id": "operation_01J00000000000000000000008", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "transcription", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "human_expressive_input_via_transcription", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "transcribed_from_human_speech" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + }, + "ai_acceptance": { + "schema_version": "1.0", + "operation_id": "operation_01J00000000000000000000009", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "ai_acceptance", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": "invocation_01J00000000000000000000008", + "disposition_id": "disposition_01J0000000000000000000000M", + "recorded_origin_kind": "accepted_ai_output", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "generated_by_ai" + ], + "lineage_reference_ids": [ + "turn_01J00000000000000000000007" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + }, + "restoration": { + "schema_version": "1.0", + "operation_id": "operation_01J0000000000000000000000A", + "project_id": "project_01J00000000000000000000001", + "operation_kind": "restoration", + "client_action_id": "client-action-composition-0001", + "base_revision_id": "revision_01J0000000000000000000000A", + "result_revision_id": "revision_01J0000000000000000000000B", + "operation_sequence": 1, + "source_range": null, + "destination_coordinate_system": "unicode_scalar", + "destination_start": 0, + "inserted_content_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "deleted_content_sha256": null, + "source_record_ids": [ + "turn_01J00000000000000000000007" + ], + "invocation_id": null, + "disposition_id": null, + "recorded_origin_kind": "system_restoration", + "actor_identity_status": "self_declared", + "transformation_relationships": [ + "restored_from_revision" + ], + "lineage_reference_ids": [ + "revision_01J0000000000000000000000A" + ], + "recorded_at": "2026-07-17T18:42:10.123Z" + } + }, + "exact_expression_segment": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + }, + "exact_harp": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + }, + "forbidden_exact_segments": { + "unknown_origin": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "unattested", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + }, + "unknown_identity": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "unknown", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + }, + "unknown_generation": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "unknown", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + }, + "unknown_lineage": { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "unknown", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + }, + "forbidden_exact_harps": { + "unknown_origin": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "unknown", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + }, + "unknown_identity": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": null, + "identity_status": "unknown", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + }, + "unknown_generation": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "unknown", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + }, + "unknown_lineage": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "unknown", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + }, + "unknown_ai_system": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": null, + "model_id": null, + "identity_status": "unknown", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + } + }, + "independent_dimensions": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "prohibited_claim_fields": [ + "human_percentage", + "ai_percentage", + "authorship_score", + "originality_score", + "copyrightability_score" + ] +} diff --git a/schemas/provenance/v1/vectors/contribution-map-determinism.json b/schemas/provenance/v1/vectors/contribution-map-determinism.json new file mode 100644 index 0000000..40435f9 --- /dev/null +++ b/schemas/provenance/v1/vectors/contribution-map-determinism.json @@ -0,0 +1,288 @@ +{ + "vector_version": "1.1", + "input_orders": [ + [ + { + "schema_version": "1.0", + "segment_id": "segment_01J00000000000000000000006", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 2, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 12, + "end": 24, + "preimage_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "text_fragment_id": "fragment_01J00000000000000000000007" + }, + "content_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + }, + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + }, + { + "schema_version": "1.0", + "segment_id": "segment_01J00000000000000000000006", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 2, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 12, + "end": 24, + "preimage_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "text_fragment_id": "fragment_01J00000000000000000000007" + }, + "content_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ] + ], + "sorting_rule": "Sort by segment_sequence, then stable segment_id; never use locale-sensitive presentation order.", + "deterministic_map": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 24, + "recorded_positions": 24, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + }, + { + "schema_version": "1.0", + "segment_id": "segment_01J00000000000000000000006", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 2, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 12, + "end": 24, + "preimage_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "text_fragment_id": "fragment_01J00000000000000000000007" + }, + "content_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + }, + { + "segment_id": "segment_01J00000000000000000000006", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:568b3548bcb906577710b712fba674e0c53ec0abe55a2285b36b5eeeeb387501" + }, + "canonical_map_sha256": "sha256:ec5fc311ca63f1c06d99519ef8a9be66cc22f7075bcfd60f410143f4cd821aac", + "coverage_invariant": "Ranges are ordered, non-overlapping, and cover every normalized Unicode scalar position from zero through the denominator.", + "locator_invariant": "Revision, deposit digest, and stable segment ID are authoritative; page, chapter, and paragraph are layout-derived." +} diff --git a/schemas/provenance/v1/vectors/harp-deposit-staleness.json b/schemas/provenance/v1/vectors/harp-deposit-staleness.json new file mode 100644 index 0000000..5ab116c --- /dev/null +++ b/schemas/provenance/v1/vectors/harp-deposit-staleness.json @@ -0,0 +1,287 @@ +{ + "vector_version": "1.1", + "deposit_snapshot": { + "schema_version": "1.0", + "deposit_id": "deposit_01J00000000000000000000000", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "deposit_path": "deposits/registration-manuscript.pdf", + "media_type": "application/pdf", + "byte_length": 4096, + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "created_at": "2026-07-17T18:42:10.123Z" + }, + "current_harp": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + }, + "stale_after_edit": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J00000000000000000000008", + "manuscript_revision_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "stale", + "applicability_status": "stale", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE", + "SUPERSEDED_POLICY_PROFILE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:0ff68e9327f252d6091f1fdeff6c430a3ad39f238ef892b182bd12be890d691f" + }, + "export_manifest": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + }, + "changed_dependency": { + "kind": "manuscript_revision", + "previous_revision_id": "revision_01J0000000000000000000000B", + "current_revision_id": "revision_01J00000000000000000000008", + "previous_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "current_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888" + }, + "historical_integrity_rule": "Staleness for the current work does not invalidate the immutable HARP for its original exact deposit.", + "registration_language_rule": "All suggested application strings are editable and bound only after explicit user approval.", + "legal_scope_rule": "HARP does not determine identity, legal authorship, originality, copyrightability, ownership, or registrability." +} diff --git a/schemas/provenance/v1/vectors/sanitized-export.json b/schemas/provenance/v1/vectors/sanitized-export.json index ee5de8b..783e24a 100644 --- a/schemas/provenance/v1/vectors/sanitized-export.json +++ b/schemas/provenance/v1/vectors/sanitized-export.json @@ -8,29 +8,68 @@ "schema_version": "1.0", "export_id": "record_01J00000000000000000000005", "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "deposit_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", "source_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "profile": "sanitized", + "completeness_claim": "selective_disclosed_subset", + "verification_scope_statement": "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", "omission_rules": [ { "category": "private_conversation", "action": "exclude", - "count": 2 + "count": 2, + "retained_binding_sha256": "sha256:1111111111111111111111111111111111111111111111111111111111111111", + "disclosure_sha256": "sha256:64ead691b41bafd27f9c7e7150bdb766e3cc3d2e164be3c6b399959598a4f57d" + }, + { + "category": "rejected_model_output", + "action": "exclude", + "count": 1, + "retained_binding_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "disclosure_sha256": "sha256:00c0f1cf14c2bdba5b294841f8718f7642a007bd76151c5d3069fd8759821416" + }, + { + "category": "credential_authorization_material", + "action": "exclude", + "count": 0, + "retained_binding_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "disclosure_sha256": "sha256:05967f8907578a38d3b081032d0983743d4c95fcb566d5d27e2c456cb1ba1356" }, { "category": "personal_identifier", "action": "redact", - "count": 1 + "count": 1, + "retained_binding_sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "disclosure_sha256": "sha256:f54dc437448c7d005fd0c6962a97bd22755dd0881b6859a2fcc7fbc060849f00" }, { - "category": "provider_detail", - "action": "summarize", - "count": 1 + "category": "internal_path", + "action": "exclude", + "count": 7, + "retained_binding_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555", + "disclosure_sha256": "sha256:5a9f0f685ba0214dd28031540e39723c0b40400ee2bf26b1b377ab5e0e0154be" + }, + { + "category": "provider_metadata_not_required", + "action": "exclude", + "count": 1, + "retained_binding_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666", + "disclosure_sha256": "sha256:f8d42c231ae64ab0cfcdba2a35a0ee835855601b35da1c4951ad5ff798b63022" + }, + { + "category": "protected_source_body", + "action": "exclude", + "count": 3, + "retained_binding_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "disclosure_sha256": "sha256:3d54ac69d716e9d4d42f552639cc4d2d485d653fd23bd952a600ea42808833b8" } ], - "rules_sha256": "sha256:352ccc3dde25000a1d6dd006a4c0376f73b7805736232b09458696928d3036f6", + "rules_sha256": "sha256:d5602e31249a5d9d78732f268b043df1c0c8b7bd769d41386dead89dcc9e553a", "files": [ { - "path": "final-manuscript.md", + "path": "evidence/harp-binding.json", "sha256": "sha256:4444444444444444444444444444444444444444444444444444444444444444", "size": 1024 } diff --git a/schemas/provenance/v1/vectors/self-digest-identities.json b/schemas/provenance/v1/vectors/self-digest-identities.json index b389b32..129b0f5 100644 --- a/schemas/provenance/v1/vectors/self-digest-identities.json +++ b/schemas/provenance/v1/vectors/self-digest-identities.json @@ -125,5 +125,679 @@ "release-manifest.json", "release-files.sha256" ] + }, + "contribution_map": { + "identity": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact" + }, + "digest": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "complete_record": { + "schema_version": "1.0", + "contribution_map_id": "map_01J0000000000000000000000Z", + "project_id": "project_01J00000000000000000000001", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "coordinate_system": "unicode_scalar", + "coverage": { + "denominator": 12, + "recorded_positions": 12, + "coverage_status": "complete", + "denominator_unit": "normalized_unicode_scalar_position", + "denominator_definition": "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage." + }, + "layers": [ + "recorded_origin", + "transformation", + "selection_arrangement", + "evidentiary_evaluation", + "suggested_registration_treatment" + ], + "segments": [ + { + "schema_version": "1.0", + "segment_id": "segment_01J0000000000000000000000Y", + "project_id": "project_01J00000000000000000000001", + "revision_id": "revision_01J0000000000000000000000B", + "segment_sequence": 1, + "range": { + "schema_version": "1.0", + "document_revision_id": "revision_01J0000000000000000000000B", + "coordinate_system": "unicode_scalar", + "start": 0, + "end": 12, + "preimage_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "text_fragment_id": "fragment_01J0000000000000000000000C" + }, + "content_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "normalized_unicode_scalar_length": 12, + "recorded_origin_kind": "recorded_direct_human_input", + "actor_identity_status": "self_declared", + "generation_status": "recorded", + "lineage_status": "recorded", + "lineage_reference_ids": [ + "operation_01J0000000000000000000000X" + ], + "operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "transformation_relationships": [ + "inserted" + ], + "assertion_ids": [ + "assertion_01J0000000000000000000000V" + ], + "selection_arrangement_assertion_ids": [], + "included_in_deposit_assertion_id": "assertion_01J0000000000000000000000V", + "classification_status": "exact" + } + ], + "structural_locators": [ + { + "segment_id": "segment_01J0000000000000000000000Y", + "chapter": 1, + "paragraph": 1, + "page": 1 + } + ], + "layout_profile": { + "layout_profile_id": "layout_01J00000000000000000000005", + "layout_profile_sha256": "sha256:5555555555555555555555555555555555555555555555555555555555555555" + }, + "generator": { + "name": "thinkloom-contribution-map", + "version": "1.0.0", + "configuration_sha256": "sha256:6666666666666666666666666666666666666666666666666666666666666666" + }, + "classification_status": "exact", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "excluded_fields": [ + "contribution_map_sha256" + ] + }, + "registration_policy_profile": { + "identity": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true + }, + "digest": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "complete_record": { + "schema_version": "1.0", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "application_version": "0.5.2", + "compatible_application_versions": [ + "0.5.2", + "0.5.3", + "0.5.4", + "0.5.5", + "0.5.6", + "0.5.7", + "0.5.8", + "0.5.9", + "0.5.10", + "0.5.11", + "0.6.0" + ], + "jurisdiction": "US", + "work_class": "literary_work", + "application_type": "standard_application", + "official_sources": [ + { + "title": "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", + "source_url": "https://www.copyright.gov/ai/ai_policy_guidance.pdf", + "source_sha256": "sha256:7777777777777777777777777777777777777777777777777777777777777777", + "published_on": "2023-03-16", + "retrieved_on": "2026-07-19" + }, + { + "title": "Copyright and Artificial Intelligence, Part 2: Copyrightability", + "source_url": "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", + "source_sha256": "sha256:8888888888888888888888888888888888888888888888888888888888888888", + "published_on": "2025-01-29", + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Author", + "source_url": "https://www.copyright.gov/eco/help-author.html", + "source_sha256": "sha256:9999999999999999999999999999999999999999999999999999999999999999", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "Standard Application Help: Limitation of Claim", + "source_url": "https://www.copyright.gov/eco/help-limitation.html", + "source_sha256": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "published_on": null, + "retrieved_on": "2026-07-19" + }, + { + "title": "37 C.F.R. 202.3", + "source_url": "https://www.copyright.gov/title37/202/37cfr202-3.html", + "source_sha256": "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "published_on": null, + "retrieved_on": "2026-07-19" + } + ], + "field_terminology": { + "author_created": "Author Created", + "material_excluded": "Material Excluded", + "new_material_included": "New Material Included", + "note_to_co": "Note to CO" + }, + "supported_treatment_suggestions": [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion" + ], + "disclaimer_text": "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", + "copyright_office_determination_required": true, + "read_only": true, + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba" + }, + "excluded_fields": [ + "profile_sha256" + ] + }, + "human_authorship_record": { + "identity": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private" + }, + "digest": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "complete_record": { + "schema_version": "1.0", + "harp_id": "harp_01J00000000000000000000002", + "project_id": "project_01J00000000000000000000001", + "application_version": "0.5.2", + "generator_version": "1.0.0", + "deposit": { + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222" + }, + "cpl_binding": { + "chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "event_sequence": 42 + }, + "contribution_map": { + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00" + }, + "policy_profile": { + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "profile_version": "1.0.0", + "profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "retrieved_on": "2026-07-19", + "status": "current" + }, + "evidentiary_status": "exact", + "applicability_status": "current", + "generation_status": "recorded", + "origin_coverage_status": "complete", + "lineage_coverage_status": "complete", + "identity_declaration": { + "declared_name": "Example Author", + "identity_status": "self_declared", + "evidence_reference_ids": [ + "assertion_01J0000000000000000000000V" + ], + "user_approved": true + }, + "claim_summary": "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", + "ai_system_disclosures": [ + { + "provider_id": "openai", + "model_id": "gpt-example", + "identity_status": "recorded", + "included_expression_segment_ids": [ + "segment_01J0000000000000000000000Y" + ] + } + ], + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": 12, + "recorded_positions": 12, + "statement": "12 of 12 normalized Unicode scalar positions have recorded origin." + }, + "suggested_registration_language": { + "author_created": "Text and revisions described in the attached provenance record", + "material_excluded": "AI-generated text identified in the attached provenance record", + "new_material_included": "Human-authored text and revisions", + "note_to_co": "This work contains disclosed AI-generated material.", + "registration_treatment_suggestions": [ + "disclose_ai_use", + "manual_review_required" + ], + "user_approved": true, + "approval_event_id": "event_01J00000000000000000000004", + "approved_language_sha256": "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "representative_transformation_operation_ids": [ + "operation_01J0000000000000000000000X" + ], + "limitation_codes": [ + "SELF_DECLARED_IDENTITY", + "COPYRIGHT_OFFICE_DETERMINES_SCOPE" + ], + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", + "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", + "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", + "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": "full_private", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9" + }, + "excluded_fields": [ + "harp_sha256" + ] + }, + "harp_export_manifest": { + "identity": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z" + }, + "digest": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324", + "complete_record": { + "schema_version": "1.0", + "manifest_id": "manifest_01J00000000000000000000003", + "project_id": "project_01J00000000000000000000001", + "harp_id": "harp_01J00000000000000000000002", + "harp_sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "deposit_id": "deposit_01J00000000000000000000000", + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "contribution_map_id": "map_01J0000000000000000000000Z", + "contribution_map_sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "report_metadata": { + "deposit_sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "manuscript_revision_id": "revision_01J0000000000000000000000B", + "manuscript_revision_sha256": "sha256:2222222222222222222222222222222222222222222222222222222222222222", + "cpl_chain_head": "sha256:4444444444444444444444444444444444444444444444444444444444444444", + "cpl_event_sequence": 42, + "harp_schema_version": "1.0", + "harp_generator_version": "1.0.0", + "application_version": "0.5.11", + "policy_profile_id": "policyprofile_01J00000000000000000000004", + "policy_profile_version": "1.0.0", + "policy_profile_sha256": "sha256:77bfc640282012169a92feb92b9539ca6826b798659cb3f7d07beb864e53abba", + "policy_retrieval_date": "2026-07-19", + "sanitization_profile": "full_private", + "legal_scope_statement": "Copyrightability and registration scope remain determinations of the U.S. Copyright Office." + }, + "verification_report_sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "sanitization_profile": "full_private", + "sanitization_rules_sha256": "sha256:0000000000000000000000000000000000000000000000000000000000000000", + "omissions": [], + "files": [ + { + "role": "human_readable_harp", + "path": "reports/harp/harp.pdf", + "sha256": "sha256:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", + "size": 2048, + "privacy_classification": "registration" + }, + { + "role": "machine_readable_harp", + "path": "reports/harp/harp.json", + "sha256": "sha256:20e3ba5bb0c6c25c8d047e0e8b82a17044193e0b8ce521612d48cc85fed5feb9", + "size": 4096, + "privacy_classification": "registration" + }, + { + "role": "contribution_map", + "path": "reports/harp/contribution-map.json", + "sha256": "sha256:28562ec310a4eda35436bf01ec534d0639939365af453e3c922c492ee0ebff00", + "size": 3072, + "privacy_classification": "registration" + }, + { + "role": "deposit_copy", + "path": "deposits/registration-manuscript.pdf", + "sha256": "sha256:3333333333333333333333333333333333333333333333333333333333333333", + "size": 4096, + "privacy_classification": "deposit" + }, + { + "role": "verification_report", + "path": "reports/harp/verification.json", + "sha256": "sha256:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "size": 1024, + "privacy_classification": "registration" + }, + { + "role": "supporting_archive", + "path": "reports/harp/supporting-archive.zip", + "sha256": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "size": 8192, + "privacy_classification": "private" + } + ], + "created_at": "2026-07-17T18:43:11.456Z", + "manifest_sha256": "sha256:50be7f8f16d6f83dc58ec26670499403ccc2f7f7655e28cd8e1bf7485d768324" + }, + "excluded_fields": [ + "manifest_sha256" + ] } } diff --git a/scripts/generate-provenance-stage2.mjs b/scripts/generate-provenance-stage2.mjs index 68a2cfc..9267a8c 100644 --- a/scripts/generate-provenance-stage2.mjs +++ b/scripts/generate-provenance-stage2.mjs @@ -24,6 +24,9 @@ const ids = { policy: typedId("policy", "H"), correction: typedId("correction", "J"), normalization: typedId("normalization", "K"), disposition: typedId("disposition", "M"), transaction: typedId("transaction", "N"), failure: typedId("failure", "P"), stream: typedId("stream", "Q"), purge: typedId("purge", "R"), assertion: typedId("assertion", "V"), evaluation: typedId("evaluation", "W"), + operation: typedId("operation", "X"), segment: typedId("segment", "Y"), map: typedId("map", "Z"), + deposit: typedId("deposit", "0"), harp: typedId("harp", "2"), manifest: typedId("manifest", "3"), + policyProfile: typedId("policyprofile", "4"), layout: typedId("layout", "5"), }; if (!Object.values(ids).every((value) => /^[a-z]+_[0-9A-HJKMNP-TV-Z]{26}$/.test(value))) throw new Error("Generated fixture identifier is invalid."); @@ -50,6 +53,14 @@ const confidenceValues = ["exact", "degraded", "unverified", "not_applicable"]; const evidenceClasses = ["mandatory_live", "mandatory_retained", "advisory", "shadow"]; const assertionBoundaryKinds = ["missing_provenance", "unknown_generation", "evidence_access", "compatibility", "dependency_change", "policy", "interpretation", "coverage"]; const dependencyResultStatuses = ["valid", "missing", "changed", "inaccessible", "incompatible", "not_evaluated"]; +const compositionOperationKinds = ["insert", "delete", "replace", "move", "paste", "transcription", "ai_acceptance", "restoration"]; +const recordedOriginKinds = ["recorded_direct_human_input", "human_expressive_input_via_transcription", "accepted_ai_output", "imported_or_pasted", "system_restoration", "unattested"]; +const transformationRelationships = ["inserted", "deleted", "replaced", "moved", "pasted_from_external", "transcribed_from_human_speech", "generated_by_ai", "modified_by_human", "restored_from_revision", "derived_from"]; +const contributionMapLayers = ["recorded_origin", "transformation", "selection_arrangement", "evidentiary_evaluation", "suggested_registration_treatment", "structural_locator"]; +const registrationTreatmentSuggestions = ["claim_as_human_contribution", "exclude_ai_generated_material", "describe_new_human_material", "disclose_ai_use", "manual_review_required", "no_suggestion"]; +const harpLimitationCodes = ["SELF_DECLARED_IDENTITY", "UNKNOWN_IDENTITY", "UNKNOWN_ORIGIN", "UNKNOWN_GENERATION", "UNKNOWN_LINEAGE", "UNATTESTED_EXPRESSION", "DEGRADED_COVERAGE", "SUPERSEDED_POLICY_PROFILE", "SANITIZED_EVIDENCE", "COPYRIGHT_OFFICE_DETERMINES_SCOPE"]; +const harpExplanationCodes = ["INTEGRITY_ONLY_VERIFICATION", "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", "SELECTION_ARRANGEMENT_IS_OVERLAY", "PAGE_LOCATORS_ARE_DERIVED", "REGISTRATION_LANGUAGE_IS_SUGGESTED", "HARP_STALE_AFTER_EDIT"]; +const compositionAssertionPredicates = ["derived_from", "generated_by", "modified_by_human", "selected_by_human", "arranged_by_human", "included_in_deposit"]; const assertionReasonCodes = [ "DIRECT_HASH_LINKED_DERIVATION", "VERIFIED_TRANSITIVE_DERIVATION", @@ -141,7 +152,7 @@ const contentReferenceExample = { add("content-reference", "Content reference", closed({ schema_version: schemaVersion, record_id: typedIdentifier, - record_type: { enum: ["conversation_turn", "invocation_request", "invocation_response", "invocation_failure", "idea_revision", "manuscript_revision", "edit_transaction", "prompt_template", "model_configuration", "provenance_assertion", "assertion_evaluation", "release_file", "source", "other"] }, + record_type: { enum: ["conversation_turn", "invocation_request", "invocation_response", "invocation_failure", "idea_revision", "manuscript_revision", "edit_transaction", "composition_operation", "expression_segment", "contribution_map", "deposit_snapshot", "registration_policy_profile", "human_authorship_record", "harp_export_manifest", "prompt_template", "model_configuration", "provenance_assertion", "assertion_evaluation", "release_file", "source", "other"] }, sha256: sha, path: nullable(repositoryPath), revision_id: nullable(identifier("revision")), @@ -156,11 +167,11 @@ add("provenance-policy", "Provenance policy", closed({ }), policyExample, "Prospective project retention, protection, and export defaults."); const projectExample = { - schema_version: "1.0", application_version: "0.4.0", project_id: ids.project, title: "The Attention Commons", created_at: timestampValue, updated_at: laterTimestamp, current_phase: "ideation", publication_status: "working", provenance_policy_id: ids.policy, audio_retained: false, + project_format: "thinkloom-cpl", project_format_version: "1.0", provenance_conformance: "cpl-1.0", schema_version: "1.0", application_version: "0.5.11", project_id: ids.project, title: "The Attention Commons", created_at: timestampValue, updated_at: laterTimestamp, current_phase: "ideation", publication_status: "working", provenance_policy_id: ids.policy, audio_retained: false, }; add("project-manifest", "Project manifest", closed({ - schema_version: schemaVersion, application_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, project_id: identifier("project"), title: nonEmptyString, description: { type: "string" }, created_at: timestamp, updated_at: timestamp, current_phase: { enum: ["ideation", "drafting", "finalization"] }, publication_status: { enum: ["working", "finalized", "published"] }, provenance_policy_id: identifier("policy"), audio_retained: { const: false }, -}, ["schema_version", "application_version", "project_id", "title", "created_at", "updated_at", "current_phase", "publication_status", "provenance_policy_id", "audio_retained"]), projectExample, "Canonical identity and lifecycle metadata for a 1.0 project."); + project_format: { const: "thinkloom-cpl" }, project_format_version: { const: "1.0" }, provenance_conformance: { const: "cpl-1.0" }, schema_version: schemaVersion, application_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, project_id: identifier("project"), title: nonEmptyString, description: { type: "string" }, created_at: timestamp, updated_at: timestamp, current_phase: { enum: ["ideation", "drafting", "finalization"] }, publication_status: { enum: ["working", "finalized", "published"] }, provenance_policy_id: identifier("policy"), audio_retained: { const: false }, +}, ["project_format", "project_format_version", "provenance_conformance", "schema_version", "application_version", "project_id", "title", "created_at", "updated_at", "current_phase", "publication_status", "provenance_policy_id", "audio_retained"]), projectExample, "Canonical identity, exact CPL conformance marker, and lifecycle metadata for a 1.0 project."); const writeIntentExample = { schema_version: "1.0", intent_id: ids.intent, client_action_id: "client-action-0001", project_id: ids.project, operation_type: "IDEA_ACCEPTED", phase: "PREPARED", event_id: null, event_sequence: null, staged_path: ".app/temp/intents/intent.json", command_sha256: digest("3"), result: null, created_at: timestampValue, updated_at: timestampValue, @@ -478,12 +489,127 @@ const releaseFiles = [{ path: "manuscript/final-manuscript.md", sha256: digest(" const releaseExample = { schema_version: "1.0", application_version: "0.4.0", release_id: ids.release, project_id: ids.project, version: "1.0.0", created_at: laterTimestamp, source_commit: "0123456789abcdef0123456789abcdef01234567", source_chain_head: digest("4"), source_manuscript: { path: "manuscript/final-manuscript.md", sha256: digest("4") }, sanitized: false, files: releaseFiles, release_files_merkle_root: releaseMerkleRoot(releaseFiles), merkle_algorithm: "thinkloom-release-merkle-v1" }; add("release-manifest", "Release manifest", closed({ schema_version: schemaVersion, application_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, release_id: identifier("release"), project_id: identifier("project"), version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, created_at: timestamp, source_commit: { type: "string", pattern: "^[a-f0-9]{40,64}$" }, source_chain_head: sha, source_manuscript: closed({ path: repositoryPath, sha256: sha }), sanitized: { type: "boolean" }, files: arrayOf(fileEntry, { minItems: 1 }), release_files_merkle_root: sha, merkle_algorithm: { const: "thinkloom-release-merkle-v1" } }), releaseExample, "Non-self-referential binding of a frozen source to verified release files."); -const sanitizedExample = { schema_version: "1.0", export_id: ids.record, project_id: ids.project, source_chain_head: digest("4"), profile: "sanitized", omission_rules: [{ category: "private_conversation", action: "exclude", count: 2 }], rules_sha256: digest("6"), files: [{ path: "final-manuscript.md", sha256: digest("4"), size: 1024 }], created_at: laterTimestamp }; -add("sanitized-export-manifest", "Sanitized export manifest", closed({ schema_version: schemaVersion, export_id: identifier("record"), project_id: identifier("project"), source_chain_head: sha, profile: { const: "sanitized" }, omission_rules: arrayOf(closed({ category: { enum: ["private_conversation", "rejected_output", "provider_detail", "personal_identifier", "internal_path", "source_body", "other"] }, action: { enum: ["exclude", "redact", "summarize"] }, count: { type: "integer", minimum: 0 } })), rules_sha256: sha, files: arrayOf(fileEntry, { minItems: 1 }), created_at: timestamp }), sanitizedExample, "Disclosure and file inventory for a non-mutating sanitized evidence export."); +const sanitizedExampleIdentity = { category: "private_conversation", action: "exclude", count: 2, retained_binding_sha256: digest("5") }; +const sanitizedExample = { + schema_version: "1.0", export_id: ids.record, project_id: ids.project, harp_id: ids.harp, harp_sha256: digest("3"), deposit_sha256: digest("2"), source_chain_head: digest("4"), profile: "sanitized", completeness_claim: "selective_disclosed_subset", verification_scope_statement: "Verified only against disclosed retained evidence; this archive is intentionally incomplete.", omission_rules: [{ ...sanitizedExampleIdentity, disclosure_sha256: sha256(sanitizedExampleIdentity) }], rules_sha256: digest("6"), files: [{ path: "evidence/harp-binding.json", sha256: digest("4"), size: 1024 }], created_at: laterTimestamp, +}; +add("sanitized-export-manifest", "Sanitized export manifest", closed({ + schema_version: schemaVersion, export_id: identifier("record"), project_id: identifier("project"), harp_id: identifier("harp"), harp_sha256: sha, deposit_sha256: sha, source_chain_head: sha, profile: { const: "sanitized" }, completeness_claim: { const: "selective_disclosed_subset" }, verification_scope_statement: nonEmptyString, + omission_rules: arrayOf(closed({ category: { enum: ["private_conversation", "rejected_output", "rejected_model_output", "provider_detail", "provider_metadata_not_required", "credential_authorization_material", "personal_identifier", "internal_path", "source_body", "protected_source_body", "other"] }, action: { enum: ["exclude", "redact", "summarize"] }, count: { type: "integer", minimum: 0 }, retained_binding_sha256: sha, disclosure_sha256: sha })), rules_sha256: sha, files: arrayOf(fileEntry, { minItems: 1 }), created_at: timestamp, +}), sanitizedExample, "Disclosure, retained-evidence bindings, completeness boundary, and file inventory for a non-mutating sanitized HARP export."); +const compositionOperationExample = { + schema_version: "1.0", operation_id: ids.operation, project_id: ids.project, operation_kind: "insert", client_action_id: "client-action-composition-0001", base_revision_id: ids.revision, result_revision_id: ids.revision2, operation_sequence: 1, source_range: null, destination_coordinate_system: "unicode_scalar", destination_start: 0, inserted_content_sha256: digest("1"), deleted_content_sha256: null, source_record_ids: [ids.turn], invocation_id: null, disposition_id: null, recorded_origin_kind: "recorded_direct_human_input", actor_identity_status: "self_declared", transformation_relationships: ["inserted"], lineage_reference_ids: [ids.turn], recorded_at: timestampValue, +}; +const compositionOperationRules = { allOf: [ + { if: { properties: { operation_kind: { const: "paste" } }, required: ["operation_kind"] }, then: { properties: { recorded_origin_kind: { const: "imported_or_pasted" } } } }, + { if: { properties: { operation_kind: { const: "transcription" } }, required: ["operation_kind"] }, then: { properties: { recorded_origin_kind: { const: "human_expressive_input_via_transcription" } } } }, + { if: { properties: { operation_kind: { const: "ai_acceptance" } }, required: ["operation_kind"] }, then: { properties: { recorded_origin_kind: { const: "accepted_ai_output" }, invocation_id: identifier("invocation"), disposition_id: identifier("disposition") } } }, + { if: { properties: { operation_kind: { const: "restoration" } }, required: ["operation_kind"] }, then: { properties: { recorded_origin_kind: { const: "system_restoration" } } } }, + { if: { properties: { operation_kind: { const: "delete" } }, required: ["operation_kind"] }, then: { properties: { source_range: ref("text-fragment-reference"), inserted_content_sha256: { type: "null" }, deleted_content_sha256: sha } } }, + { if: { properties: { operation_kind: { enum: ["insert", "paste", "transcription", "ai_acceptance", "restoration"] } }, required: ["operation_kind"] }, then: { properties: { inserted_content_sha256: sha } } }, +] }; +add("composition-operation", "Composition operation", closed({ + schema_version: schemaVersion, operation_id: identifier("operation"), project_id: identifier("project"), operation_kind: { enum: compositionOperationKinds }, client_action_id: { type: "string", minLength: 8, maxLength: 200 }, base_revision_id: identifier("revision"), result_revision_id: identifier("revision"), operation_sequence: { type: "integer", minimum: 1 }, source_range: nullable(ref("text-fragment-reference")), destination_coordinate_system: { enum: ["utf8_byte", "unicode_scalar", "utf16_code_unit", "editor_position"] }, destination_start: nullable({ type: "integer", minimum: 0 }), inserted_content_sha256: nullable(sha), deleted_content_sha256: nullable(sha), source_record_ids: arrayOf(typedIdentifier, { uniqueItems: true }), invocation_id: nullable(identifier("invocation")), disposition_id: nullable(identifier("disposition")), recorded_origin_kind: { enum: recordedOriginKinds }, actor_identity_status: { enum: ["verified", "self_declared", "unknown", "not_applicable"] }, transformation_relationships: arrayOf({ enum: transformationRelationships }, { minItems: 1, uniqueItems: true }), lineage_reference_ids: arrayOf(typedIdentifier, { minItems: 1, uniqueItems: true }), recorded_at: timestamp, +}, undefined, compositionOperationRules), compositionOperationExample, "Immutable composition-specific insertion, deletion, replacement, movement, paste, transcription, AI acceptance, or restoration operation; it does not overload edit transactions or assertions."); +const expressionRangeExample = { ...textRangeExample, document_revision_id: ids.revision2, coordinate_system: "unicode_scalar", start: 0, end: 12, preimage_sha256: digest("2"), text_fragment_id: ids.fragment }; +const expressionSegmentExample = { + schema_version: "1.0", segment_id: ids.segment, project_id: ids.project, revision_id: ids.revision2, segment_sequence: 1, range: expressionRangeExample, content_sha256: digest("2"), normalized_unicode_scalar_length: 12, recorded_origin_kind: "recorded_direct_human_input", actor_identity_status: "self_declared", generation_status: "recorded", lineage_status: "recorded", lineage_reference_ids: [ids.operation], operation_ids: [ids.operation], transformation_relationships: ["inserted"], assertion_ids: [ids.assertion], selection_arrangement_assertion_ids: [], included_in_deposit_assertion_id: ids.assertion, classification_status: "exact", +}; +const expressionSegmentRules = { allOf: [{ + if: { properties: { classification_status: { const: "exact" } }, required: ["classification_status"] }, + then: { properties: { + recorded_origin_kind: { enum: recordedOriginKinds.filter((value) => value !== "unattested") }, + actor_identity_status: { enum: ["verified", "self_declared", "not_applicable"] }, + generation_status: { const: "recorded" }, lineage_status: { const: "recorded" }, + lineage_reference_ids: { type: "array", minItems: 1 }, operation_ids: { type: "array", minItems: 1 }, assertion_ids: { type: "array", minItems: 1 }, included_in_deposit_assertion_id: identifier("assertion"), + } }, +}] }; +add("expression-segment", "Surviving expression segment", closed({ + schema_version: schemaVersion, segment_id: identifier("segment"), project_id: identifier("project"), revision_id: identifier("revision"), segment_sequence: { type: "integer", minimum: 1 }, range: ref("text-fragment-reference"), content_sha256: sha, normalized_unicode_scalar_length: { type: "integer", minimum: 1 }, recorded_origin_kind: { enum: recordedOriginKinds }, actor_identity_status: { enum: ["verified", "self_declared", "unknown", "not_applicable"] }, generation_status: { enum: ["recorded", "unknown"] }, lineage_status: { enum: ["recorded", "unattested", "unknown"] }, lineage_reference_ids: arrayOf(typedIdentifier, { uniqueItems: true }), operation_ids: arrayOf(identifier("operation"), { uniqueItems: true }), transformation_relationships: arrayOf({ enum: transformationRelationships }, { uniqueItems: true }), assertion_ids: arrayOf(identifier("assertion"), { uniqueItems: true }), selection_arrangement_assertion_ids: arrayOf(identifier("assertion"), { uniqueItems: true }), included_in_deposit_assertion_id: nullable(identifier("assertion")), classification_status: { enum: ["exact", "degraded", "stale", "unverified"] }, +}, undefined, expressionSegmentRules), expressionSegmentExample, "Stable surviving deposit expression with revision-bound range, digest, recorded origin, lineage, transformations, and separate selection/arrangement assertions."); + +const depositSnapshotExample = { + schema_version: "1.0", deposit_id: ids.deposit, project_id: ids.project, application_version: "0.5.2", deposit_path: "deposits/registration-manuscript.pdf", media_type: "application/pdf", byte_length: 4096, deposit_sha256: digest("3"), manuscript_revision_id: ids.revision2, manuscript_revision_sha256: digest("2"), cpl_chain_head: digest("4"), cpl_event_sequence: 42, layout_profile: { layout_profile_id: ids.layout, layout_profile_sha256: digest("5") }, created_at: timestampValue, +}; +add("deposit-snapshot", "Exact deposit snapshot", closed({ + schema_version: schemaVersion, deposit_id: identifier("deposit"), project_id: identifier("project"), application_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, deposit_path: repositoryPath, media_type: nonEmptyString, byte_length: { type: "integer", minimum: 1 }, deposit_sha256: sha, manuscript_revision_id: identifier("revision"), manuscript_revision_sha256: sha, cpl_chain_head: sha, cpl_event_sequence: { type: "integer", minimum: 1 }, layout_profile: nullable(closed({ layout_profile_id: identifier("layout"), layout_profile_sha256: sha })), created_at: timestamp, +}), depositSnapshotExample, "Immutable binding of the exact selected deposit file, manuscript revision, CPL head, and optional layout profile."); + +const contributionCoverageDefinition = "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage."; +const requiredContributionLayers = ["recorded_origin", "transformation", "selection_arrangement", "evidentiary_evaluation", "suggested_registration_treatment"]; +const contributionLayersSchema = arrayOf({ enum: contributionMapLayers }, { minItems: requiredContributionLayers.length, uniqueItems: true, allOf: requiredContributionLayers.map((layer) => ({ contains: { const: layer }, minContains: 1, maxContains: 1 })) }); +const contributionMapIdentity = { + schema_version: "1.0", contribution_map_id: ids.map, project_id: ids.project, deposit_id: ids.deposit, deposit_sha256: depositSnapshotExample.deposit_sha256, manuscript_revision_id: ids.revision2, manuscript_revision_sha256: digest("2"), cpl_chain_head: digest("4"), cpl_event_sequence: 42, coordinate_system: "unicode_scalar", coverage: { denominator: 12, recorded_positions: 12, coverage_status: "complete", denominator_unit: "normalized_unicode_scalar_position", denominator_definition: contributionCoverageDefinition }, layers: requiredContributionLayers, segments: [expressionSegmentExample], structural_locators: [{ segment_id: ids.segment, chapter: 1, paragraph: 1, page: 1 }], layout_profile: depositSnapshotExample.layout_profile, generator: { name: "thinkloom-contribution-map", version: "1.0.0", configuration_sha256: digest("6") }, classification_status: "exact", +}; +const contributionMapExample = { ...contributionMapIdentity, contribution_map_sha256: sha256(contributionMapIdentity) }; +const contributionMapRules = { allOf: [{ + if: { properties: { classification_status: { const: "exact" } }, required: ["classification_status"] }, + then: { properties: { coverage: { type: "object", properties: { coverage_status: { const: "complete" } }, required: ["coverage_status"] }, segments: { type: "array", items: { allOf: [ref("expression-segment"), { type: "object", properties: { classification_status: { const: "exact" } }, required: ["classification_status"] }] } } } }, +}] }; +add("contribution-map", "Deposit contribution map", closed({ + schema_version: schemaVersion, contribution_map_id: identifier("map"), project_id: identifier("project"), deposit_id: identifier("deposit"), deposit_sha256: sha, manuscript_revision_id: identifier("revision"), manuscript_revision_sha256: sha, cpl_chain_head: sha, cpl_event_sequence: { type: "integer", minimum: 1 }, coordinate_system: { const: "unicode_scalar" }, coverage: closed({ denominator: { type: "integer", minimum: 0 }, recorded_positions: { type: "integer", minimum: 0 }, coverage_status: { enum: ["complete", "partial"] }, denominator_unit: { const: "normalized_unicode_scalar_position" }, denominator_definition: nonEmptyString }), layers: contributionLayersSchema, segments: arrayOf(ref("expression-segment"), { minItems: 1 }), structural_locators: arrayOf(closed({ segment_id: identifier("segment"), chapter: nullable({ type: "integer", minimum: 1 }), paragraph: nullable({ type: "integer", minimum: 1 }), page: nullable({ type: "integer", minimum: 1 }) })), layout_profile: nullable(closed({ layout_profile_id: identifier("layout"), layout_profile_sha256: sha })), generator: closed({ name: nonEmptyString, version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, configuration_sha256: sha }), classification_status: { enum: ["exact", "degraded", "stale", "unverified"] }, contribution_map_sha256: sha, +}, undefined, contributionMapRules), contributionMapExample, "Deterministic non-authoritative projection providing complete ordered deposit coverage while keeping origin, transformation, selection/arrangement, evaluation, and registration treatment independent. Its digest identity excludes contribution_map_sha256."); + +const policyProfileIdentity = { + schema_version: "1.0", policy_profile_id: ids.policyProfile, profile_version: "1.0.0", application_version: "0.5.2", compatible_application_versions: ["0.5.2", "0.5.3", "0.5.4", "0.5.5", "0.5.6", "0.5.7", "0.5.8", "0.5.9", "0.5.10", "0.5.11", "0.6.0"], jurisdiction: "US", work_class: "literary_work", application_type: "standard_application", official_sources: [ + { title: "Copyright Registration Guidance: Works Containing Material Generated by Artificial Intelligence", source_url: "https://www.copyright.gov/ai/ai_policy_guidance.pdf", source_sha256: digest("7"), published_on: "2023-03-16", retrieved_on: "2026-07-19" }, + { title: "Copyright and Artificial Intelligence, Part 2: Copyrightability", source_url: "https://www.copyright.gov/ai/Copyright-and-Artificial-Intelligence-Part-2-Copyrightability-Report.pdf", source_sha256: digest("8"), published_on: "2025-01-29", retrieved_on: "2026-07-19" }, + { title: "Standard Application Help: Author", source_url: "https://www.copyright.gov/eco/help-author.html", source_sha256: digest("9"), published_on: null, retrieved_on: "2026-07-19" }, + { title: "Standard Application Help: Limitation of Claim", source_url: "https://www.copyright.gov/eco/help-limitation.html", source_sha256: digest("a"), published_on: null, retrieved_on: "2026-07-19" }, + { title: "37 C.F.R. 202.3", source_url: "https://www.copyright.gov/title37/202/37cfr202-3.html", source_sha256: digest("b"), published_on: null, retrieved_on: "2026-07-19" }, + ], field_terminology: { author_created: "Author Created", material_excluded: "Material Excluded", new_material_included: "New Material Included", note_to_co: "Note to CO" }, supported_treatment_suggestions: registrationTreatmentSuggestions, disclaimer_text: "Suggested, editable language; not legal advice. The U.S. Copyright Office determines copyrightability and registration scope.", copyright_office_determination_required: true, read_only: true, +}; +const policyProfileExample = { ...policyProfileIdentity, profile_sha256: sha256(policyProfileIdentity) }; +add("registration-policy-profile", "Registration policy profile", closed({ + schema_version: schemaVersion, policy_profile_id: identifier("policyprofile"), profile_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, application_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, compatible_application_versions: arrayOf({ type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, { minItems: 1, uniqueItems: true }), jurisdiction: { const: "US" }, work_class: { const: "literary_work" }, application_type: { const: "standard_application" }, official_sources: arrayOf(closed({ title: nonEmptyString, source_url: { type: "string", format: "uri" }, source_sha256: sha, published_on: nullable({ type: "string", format: "date" }), retrieved_on: { type: "string", format: "date" } }), { minItems: 5 }), field_terminology: closed({ author_created: { const: "Author Created" }, material_excluded: { const: "Material Excluded" }, new_material_included: { const: "New Material Included" }, note_to_co: { const: "Note to CO" } }), supported_treatment_suggestions: arrayOf({ enum: registrationTreatmentSuggestions }, { minItems: 1, uniqueItems: true }), disclaimer_text: nonEmptyString, copyright_office_determination_required: { const: true }, read_only: { const: true }, profile_sha256: sha, +}), policyProfileExample, "Immutable read-only U.S. literary-work Standard Application terminology and disclaimer profile. Its digest identity excludes profile_sha256."); + +const harpIdentity = { + schema_version: "1.0", harp_id: ids.harp, project_id: ids.project, application_version: "0.5.2", generator_version: "1.0.0", deposit: { deposit_id: ids.deposit, deposit_sha256: depositSnapshotExample.deposit_sha256, manuscript_revision_id: ids.revision2, manuscript_revision_sha256: digest("2") }, cpl_binding: { chain_head: digest("4"), event_sequence: 42 }, contribution_map: { contribution_map_id: ids.map, contribution_map_sha256: contributionMapExample.contribution_map_sha256 }, policy_profile: { policy_profile_id: ids.policyProfile, profile_version: policyProfileIdentity.profile_version, profile_sha256: policyProfileExample.profile_sha256, retrieved_on: "2026-07-19", status: "current" }, evidentiary_status: "exact", applicability_status: "current", generation_status: "recorded", origin_coverage_status: "complete", lineage_coverage_status: "complete", identity_declaration: { declared_name: "Example Author", identity_status: "self_declared", evidence_reference_ids: [ids.assertion], user_approved: true }, claim_summary: "CPL records direct human input, accepted AI output, and subsequent recorded transformations for the exact deposit.", ai_system_disclosures: [{ provider_id: "openai", model_id: "gpt-example", identity_status: "recorded", included_expression_segment_ids: [ids.segment] }], coverage: { unit: "normalized_unicode_scalar_positions", denominator: 12, recorded_positions: 12, statement: "12 of 12 normalized Unicode scalar positions have recorded origin." }, suggested_registration_language: { author_created: "Text and revisions described in the attached provenance record", material_excluded: "AI-generated text identified in the attached provenance record", new_material_included: "Human-authored text and revisions", note_to_co: "This work contains disclosed AI-generated material.", registration_treatment_suggestions: ["disclose_ai_use", "manual_review_required"], user_approved: true, approval_event_id: ids.event2, approved_language_sha256: digest("c") }, representative_transformation_operation_ids: [ids.operation], limitation_codes: ["SELF_DECLARED_IDENTITY", "COPYRIGHT_OFFICE_DETERMINES_SCOPE"], explanation_codes: harpExplanationCodes, sanitization_profile: "full_private", +}; +const harpExample = { ...harpIdentity, harp_sha256: sha256(harpIdentity) }; +const harpRules = { allOf: [{ + if: { properties: { evidentiary_status: { const: "exact" } }, required: ["evidentiary_status"] }, + then: { properties: { + applicability_status: { const: "current" }, generation_status: { const: "recorded" }, origin_coverage_status: { const: "complete" }, lineage_coverage_status: { const: "complete" }, + identity_declaration: { type: "object", properties: { identity_status: { enum: ["verified", "self_declared"] } }, required: ["identity_status"] }, + ai_system_disclosures: { type: "array", items: { type: "object", properties: { identity_status: { const: "recorded" } }, required: ["identity_status"] } }, + policy_profile: { type: "object", properties: { status: { const: "current" } }, required: ["status"] }, + } }, +}] }; +add("human-authorship-record", "Human Authorship Record of Provenance", closed({ + schema_version: schemaVersion, harp_id: identifier("harp"), project_id: identifier("project"), application_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, generator_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, deposit: closed({ deposit_id: identifier("deposit"), deposit_sha256: sha, manuscript_revision_id: identifier("revision"), manuscript_revision_sha256: sha }), cpl_binding: closed({ chain_head: sha, event_sequence: { type: "integer", minimum: 1 } }), contribution_map: closed({ contribution_map_id: identifier("map"), contribution_map_sha256: sha }), policy_profile: closed({ policy_profile_id: identifier("policyprofile"), profile_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, profile_sha256: sha, retrieved_on: { type: "string", format: "date" }, status: { enum: ["current", "superseded", "unavailable"] } }), evidentiary_status: { enum: ["exact", "degraded", "stale", "unverified"] }, applicability_status: { enum: ["current", "stale"] }, generation_status: { enum: ["recorded", "unknown"] }, origin_coverage_status: { enum: ["complete", "partial", "unknown"] }, lineage_coverage_status: { enum: ["complete", "partial", "unknown"] }, identity_declaration: closed({ declared_name: nullable(nonEmptyString), identity_status: { enum: ["verified", "self_declared", "unknown"] }, evidence_reference_ids: arrayOf(typedIdentifier, { uniqueItems: true }), user_approved: { const: true } }), claim_summary: { type: "string", minLength: 1, maxLength: 4000 }, ai_system_disclosures: arrayOf(closed({ provider_id: nullable(nonEmptyString), model_id: nullable(nonEmptyString), identity_status: { enum: ["recorded", "unknown"] }, included_expression_segment_ids: arrayOf(identifier("segment"), { uniqueItems: true }) })), coverage: closed({ unit: { const: "normalized_unicode_scalar_positions" }, denominator: { type: "integer", minimum: 0 }, recorded_positions: { type: "integer", minimum: 0 }, statement: nonEmptyString }), suggested_registration_language: closed({ author_created: { type: "string", maxLength: 1000 }, material_excluded: { type: "string", maxLength: 1000 }, new_material_included: { type: "string", maxLength: 1000 }, note_to_co: nullable({ type: "string", maxLength: 2000 }), registration_treatment_suggestions: arrayOf({ enum: registrationTreatmentSuggestions }, { uniqueItems: true }), user_approved: { const: true }, approval_event_id: identifier("event"), approved_language_sha256: sha }), representative_transformation_operation_ids: arrayOf(identifier("operation"), { uniqueItems: true }), limitation_codes: arrayOf({ enum: harpLimitationCodes }, { minItems: 1, uniqueItems: true }), explanation_codes: arrayOf({ enum: harpExplanationCodes }, { minItems: 1, uniqueItems: true }), sanitization_profile: { enum: ["full_private", "sanitized"] }, harp_sha256: sha, +}, undefined, harpRules), harpExample, "Canonical machine-readable, non-authoritative, exact-deposit HARP projection. Exact status is evidentiary only and cannot determine legal authorship, originality, copyrightability, or a human percentage. Its digest identity excludes harp_sha256."); + +const harpArtifactRoles = ["human_readable_harp", "machine_readable_harp", "contribution_map", "deposit_copy", "verification_report", "supporting_archive"]; +const manifestFiles = [ + { role: "human_readable_harp", path: "reports/harp/harp.pdf", sha256: digest("d"), size: 2048, privacy_classification: "registration" }, + { role: "machine_readable_harp", path: "reports/harp/harp.json", sha256: harpExample.harp_sha256, size: 4096, privacy_classification: "registration" }, + { role: "contribution_map", path: "reports/harp/contribution-map.json", sha256: contributionMapExample.contribution_map_sha256, size: 3072, privacy_classification: "registration" }, + { role: "deposit_copy", path: "deposits/registration-manuscript.pdf", sha256: depositSnapshotExample.deposit_sha256, size: 4096, privacy_classification: "deposit" }, + { role: "verification_report", path: "reports/harp/verification.json", sha256: digest("e"), size: 1024, privacy_classification: "registration" }, + { role: "supporting_archive", path: "reports/harp/supporting-archive.zip", sha256: digest("f"), size: 8192, privacy_classification: "private" }, +]; +const harpReportMetadataExample = { + deposit_sha256: depositSnapshotExample.deposit_sha256, manuscript_revision_id: ids.revision2, manuscript_revision_sha256: digest("2"), cpl_chain_head: digest("4"), cpl_event_sequence: 42, harp_schema_version: "1.0", harp_generator_version: "1.0.0", application_version: "0.5.11", policy_profile_id: ids.policyProfile, policy_profile_version: policyProfileIdentity.profile_version, policy_profile_sha256: policyProfileExample.profile_sha256, policy_retrieval_date: "2026-07-19", sanitization_profile: "full_private", legal_scope_statement: "Copyrightability and registration scope remain determinations of the U.S. Copyright Office.", +}; +const harpReportMetadataSchema = closed({ + deposit_sha256: sha, manuscript_revision_id: identifier("revision"), manuscript_revision_sha256: sha, cpl_chain_head: sha, cpl_event_sequence: { type: "integer", minimum: 1 }, harp_schema_version: { type: "string", pattern: "^\\d+\\.\\d+$" }, harp_generator_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, application_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, policy_profile_id: identifier("policyprofile"), policy_profile_version: { type: "string", pattern: "^\\d+\\.\\d+\\.\\d+$" }, policy_profile_sha256: sha, policy_retrieval_date: { type: "string", format: "date" }, sanitization_profile: { enum: ["full_private", "sanitized"] }, legal_scope_statement: nonEmptyString, +}); +const harpManifestIdentity = { + schema_version: "1.0", manifest_id: ids.manifest, project_id: ids.project, harp_id: ids.harp, harp_sha256: harpExample.harp_sha256, deposit_id: ids.deposit, deposit_sha256: depositSnapshotExample.deposit_sha256, contribution_map_id: ids.map, contribution_map_sha256: contributionMapExample.contribution_map_sha256, cpl_chain_head: digest("4"), report_metadata: harpReportMetadataExample, verification_report_sha256: digest("e"), sanitization_profile: "full_private", sanitization_rules_sha256: digest("0"), omissions: [], files: manifestFiles, created_at: laterTimestamp, +}; +const harpManifestExample = { ...harpManifestIdentity, manifest_sha256: sha256(harpManifestIdentity) }; +const manifestFilesSchema = arrayOf(closed({ role: { enum: harpArtifactRoles }, path: repositoryPath, sha256: sha, size: { type: "integer", minimum: 1 }, privacy_classification: { enum: ["registration", "deposit", "sanitized_evidence", "private"] } }), { minItems: harpArtifactRoles.length, uniqueItems: true, allOf: harpArtifactRoles.map((role) => ({ contains: { type: "object", properties: { role: { const: role } }, required: ["role"] }, minContains: 1, maxContains: 1 })) }); +add("harp-export-manifest", "HARP export manifest", closed({ + schema_version: schemaVersion, manifest_id: identifier("manifest"), project_id: identifier("project"), harp_id: identifier("harp"), harp_sha256: sha, deposit_id: identifier("deposit"), deposit_sha256: sha, contribution_map_id: identifier("map"), contribution_map_sha256: sha, cpl_chain_head: sha, report_metadata: harpReportMetadataSchema, verification_report_sha256: sha, sanitization_profile: { enum: ["full_private", "sanitized"] }, sanitization_rules_sha256: sha, omissions: arrayOf(closed({ category: { enum: ["private_conversation", "rejected_output", "rejected_model_output", "credential", "credential_authorization_material", "personal_identifier", "internal_path", "provider_metadata", "provider_metadata_not_required", "protected_source_body", "other"] }, action: { enum: ["exclude", "redact", "summarize"] }, count: { type: "integer", minimum: 1 }, disclosure_sha256: sha })), files: manifestFilesSchema, created_at: timestamp, manifest_sha256: sha, +}), harpManifestExample, "Immutable manifest binding the HARP, contribution map, exact deposit, verification report, archive artifacts, sanitization rules, omissions, and hashes. Its digest identity excludes manifest_sha256."); const purgeExample = { schema_version: "1.0", purge_id: ids.purge, project_id: ids.project, requested_at: timestampValue, completed_at: laterTimestamp, reason: "Remove accidentally retained credential", superseded_chain_head: digest("4"), new_chain_root: digest("5"), affected_record_ids: [ids.record], affected_paths: ["records/invocations/request.json"], git_history_rewritten: true, prior_copies_revocable: false, confirmation_phrase_sha256: digest("6") }; add("purge-manifest", "Emergency purge manifest", closed({ schema_version: schemaVersion, purge_id: identifier("purge"), project_id: identifier("project"), requested_at: timestamp, completed_at: timestamp, reason: nonEmptyString, superseded_chain_head: sha, new_chain_root: sha, affected_record_ids: arrayOf(identifier("record"), { minItems: 1, uniqueItems: true }), affected_paths: arrayOf(repositoryPath, { uniqueItems: true }), git_history_rewritten: { const: true }, prior_copies_revocable: { const: false }, confirmation_phrase_sha256: sha }), purgeExample, "Explicit disclosure of a destructive provenance and Git reconstitution."); const schemaNames = [...schemas.keys()].sort(); +const compositionSchemaNames = new Set(["composition-operation", "expression-segment", "contribution-map", "deposit-snapshot", "registration-policy-profile", "human-authorship-record", "harp-export-manifest"]); +const compositionRegistryNames = new Set(["composition-operation-kinds", "recorded-origin-kinds", "transformation-relationships", "contribution-map-layers", "registration-treatment-suggestions", "harp-limitation-codes", "harp-explanation-codes", "composition-assertion-predicates"]); function clone(value) { return structuredClone(value); @@ -643,7 +769,36 @@ function invalidCases(name, schema, example) { instance.reason_code = "DEPENDENCY_DIGEST_MISMATCH"; }); } - if (!cases.length) throw new Error(`No invalid fixture cases generated for ${name}.`); + if (name === "composition-operation") { + push("composition-operation: paste cannot claim direct human-input origin", (instance) => { + instance.operation_kind = "paste"; + instance.recorded_origin_kind = "recorded_direct_human_input"; + }); + push("composition-operation: AI acceptance requires invocation and disposition", (instance) => { + instance.operation_kind = "ai_acceptance"; + instance.recorded_origin_kind = "accepted_ai_output"; + instance.invocation_id = null; + instance.disposition_id = null; + }); + } + if (name === "expression-segment") { + push("expression-segment: unattested origin cannot be exact", (instance) => { instance.recorded_origin_kind = "unattested"; }); + push("expression-segment: unknown identity cannot be exact", (instance) => { instance.actor_identity_status = "unknown"; }); + push("expression-segment: unknown generation cannot be exact", (instance) => { instance.generation_status = "unknown"; }); + push("expression-segment: unknown lineage cannot be exact", (instance) => { instance.lineage_status = "unknown"; }); + } + if (name === "contribution-map") { + push("contribution-map: partial coverage cannot be exact", (instance) => { instance.coverage.coverage_status = "partial"; }); + push("contribution-map: non-exact segment cannot produce exact map", (instance) => { instance.segments[0].classification_status = "unverified"; }); + } + if (name === "human-authorship-record") { + push("human-authorship-record: unknown identity cannot be exact", (instance) => { instance.identity_declaration.identity_status = "unknown"; instance.identity_declaration.declared_name = null; }); + push("human-authorship-record: unknown generation cannot be exact", (instance) => { instance.generation_status = "unknown"; }); + push("human-authorship-record: unknown origin cannot be exact", (instance) => { instance.origin_coverage_status = "unknown"; }); + push("human-authorship-record: unknown lineage cannot be exact", (instance) => { instance.lineage_coverage_status = "unknown"; }); + push("human-authorship-record: unknown AI-system identity cannot be exact", (instance) => { instance.ai_system_disclosures[0].identity_status = "unknown"; instance.ai_system_disclosures[0].provider_id = null; instance.ai_system_disclosures[0].model_id = null; }); + push("human-authorship-record: human percentage is a prohibited field", (instance) => { instance.human_percentage = 100; }); + } if (!cases.length) throw new Error(`No invalid fixture cases generated for ${name}.`); return cases; } @@ -744,25 +899,88 @@ const registries = [ { code: "CHRONOLOGY_INCOMPLETE", permitted_statuses: ["degraded", "unverified"] }, { code: "COMPLETENESS_INCOMPLETE", permitted_statuses: ["degraded", "unverified"] }, ], + }, { + name: "composition-operation-kinds", + description: "Composition-specific immutable operation kinds.", + entries: [ + { code: "insert", meaning: "Insert expression at a revision-bound destination." }, + { code: "delete", meaning: "Delete expression identified by an exact preimage range." }, + { code: "replace", meaning: "Replace an exact preimage range with new expression." }, + { code: "move", meaning: "Move expression while retaining stable lineage." }, + { code: "paste", meaning: "Insert pasted material whose human authorship is not inferred." }, + { code: "transcription", meaning: "Insert human expressive input mediated by transcription without retaining audio." }, + { code: "ai_acceptance", meaning: "Accept expression from a recorded model invocation and disposition." }, + { code: "restoration", meaning: "Restore expression from a recorded earlier revision." }, + ], + }, + { + name: "recorded-origin-kinds", + description: "Evidence classifications for how expression entered the composition, never legal authorship categories.", + entries: [ + { code: "recorded_direct_human_input", meaning: "CPL records direct human expressive input." }, + { code: "human_expressive_input_via_transcription", meaning: "CPL records human expressive input mediated by transcription." }, + { code: "accepted_ai_output", meaning: "Expression was accepted from a recorded AI-system output." }, + { code: "imported_or_pasted", meaning: "Expression entered through import or paste without inferred authorship." }, + { code: "system_restoration", meaning: "Expression was restored from a recorded project revision." }, + { code: "unattested", meaning: "No exact recorded origin is available for the expression." }, + ], + }, + { + name: "transformation-relationships", + description: "Independent relationships describing how expression changed or derived.", + entries: transformationRelationships.map((code) => ({ code, meaning: `Recorded composition transformation: ${code.replaceAll("_", " ")}.` })), + }, + { + name: "contribution-map-layers", + description: "Independent projection layers that must not be collapsed into recorded origin.", + entries: contributionMapLayers.map((code) => ({ code, meaning: `Contribution-map layer: ${code.replaceAll("_", " ")}.` })), + }, + { + name: "registration-treatment-suggestions", + description: "Editable policy-profile suggestions, not evidence facts or legal determinations.", + entries: registrationTreatmentSuggestions.map((code) => ({ code, meaning: `Suggested registration treatment: ${code.replaceAll("_", " ")}.` })), + }, + { + name: "harp-limitation-codes", + description: "Stable HARP limitation disclosures.", + entries: harpLimitationCodes.map((code) => ({ code, meaning: `HARP limitation: ${code.toLowerCase().replaceAll("_", " ")}.` })), + }, + { + name: "harp-explanation-codes", + description: "Stable explanations of HARP scope and interpretation.", + entries: harpExplanationCodes.map((code) => ({ code, meaning: `HARP explanation: ${code.toLowerCase().replaceAll("_", " ")}.` })), + }, + { + name: "composition-assertion-predicates", + description: "Canonical composition relationship predicates used by existing provenance assertions.", + entries: compositionAssertionPredicates.map((code) => ({ code, meaning: `Assertion relationship: ${code.replaceAll("_", " ")}.` })), }, ].map((registry) => ({ - registry_version: "1.0", + registry_version: compositionRegistryNames.has(registry.name) ? "1.1" : "1.0", provenance_schema_version: "1.0", - application_version: "0.4.0", + application_version: compositionRegistryNames.has(registry.name) ? "0.5.2" : "0.4.0", + introduced_in_application_version: compositionRegistryNames.has(registry.name) ? "0.5.2" : "0.4.0", + compatible_application_versions: compositionRegistryNames.has(registry.name) ? ["0.5.2", "0.5.3", "0.5.4", "0.5.5", "0.5.6", "0.5.7", "0.5.8", "0.5.9", "0.5.10", "0.5.11", "0.6.0"] : ["0.4.0", "0.5.0", "0.5.1", "0.5.2", "0.5.3", "0.5.4", "0.5.5", "0.5.6", "0.5.7", "0.5.8", "0.5.9", "0.5.10", "0.5.11", "0.6.0"], ...registry, entries: registry.entries.map((entry) => registry.name === "assertion-reason-codes" ? { ...entry, meaning: assertionReasonMeanings[entry.code] } : entry), })); for (const registry of registries) await writeJson(path.join(registryDir, `${registry.name}.json`), registry); const catalog = { - catalog_version: "1.0", + catalog_version: "1.1", + package_version: "0.5.2", dialect: draft, provenance_schema_version: "1.0", - application_version: "0.4.0", - compatible_application_versions: ["0.4.0"], + application_version: "0.5.2", + compatible_application_versions: ["0.4.0", "0.5.0", "0.5.1", "0.5.2", "0.5.3", "0.5.4", "0.5.5", "0.5.6", "0.5.7", "0.5.8", "0.5.9", "0.5.10", "0.5.11", "0.6.0"], + cpl_runtime_target: "0.6.0", native_writer_conformance: false, - registries: registries.map(({ name, description }) => ({ + assertion_semantics_compatibility: "Existing v0.4 provenance-assertion and assertion-evaluation semantics remain valid and unchanged by the additive composition extension.", + registries: registries.map(({ name, description, registry_version, introduced_in_application_version, compatible_application_versions }) => ({ name, description, + registry_version, + introduced_in_application_version, + compatible_application_versions, id: `${baseId}/registries/${name}.json`, file: `registries/${name}.json`, })), @@ -770,6 +988,8 @@ const catalog = { generated_by: "scripts/generate-provenance-stage2.mjs", schemas: schemaNames.map((name) => ({ name, + introduced_in_application_version: compositionSchemaNames.has(name) ? "0.5.2" : "0.4.0", + compatible_application_versions: compositionSchemaNames.has(name) ? ["0.5.2", "0.5.3", "0.5.4", "0.5.5", "0.5.6", "0.5.7", "0.5.8", "0.5.9", "0.5.10", "0.5.11", "0.6.0"] : ["0.4.0", "0.5.0", "0.5.1", "0.5.2", "0.5.3", "0.5.4", "0.5.5", "0.5.6", "0.5.7", "0.5.8", "0.5.9", "0.5.10", "0.5.11", "0.6.0"], id: schemas.get(name).$id, file: `${name}.schema.json`, valid_fixture: `fixtures/valid/${name}.valid.json`, @@ -972,15 +1192,25 @@ await writeJson(path.join(vectorDir, "self-digest-identities.json"), { merkle_identity: releaseFiles, digest: releaseMerkleRoot(releaseFiles), excluded_paths: ["release-manifest.json", "release-files.sha256"], - }, + }, contribution_map: { identity: contributionMapIdentity, digest: contributionMapExample.contribution_map_sha256, complete_record: contributionMapExample, excluded_fields: ["contribution_map_sha256"] }, + registration_policy_profile: { identity: policyProfileIdentity, digest: policyProfileExample.profile_sha256, complete_record: policyProfileExample, excluded_fields: ["profile_sha256"] }, + human_authorship_record: { identity: harpIdentity, digest: harpExample.harp_sha256, complete_record: harpExample, excluded_fields: ["harp_sha256"] }, + harp_export_manifest: { identity: harpManifestIdentity, digest: harpManifestExample.manifest_sha256, complete_record: harpManifestExample, excluded_fields: ["manifest_sha256"] }, }); +const sanitizationRule = (category, action, count, retainedBinding) => { + const identity = { category, action, count, retained_binding_sha256: retainedBinding }; + return { ...identity, disclosure_sha256: sha256(identity) }; +}; const sanitizationRules = [ - { category: "private_conversation", action: "exclude", count: 2 }, - { category: "personal_identifier", action: "redact", count: 1 }, - { category: "provider_detail", action: "summarize", count: 1 }, -]; -const sanitizedManifestVector = { + sanitizationRule("private_conversation", "exclude", 2, digest("1")), + sanitizationRule("rejected_model_output", "exclude", 1, digest("2")), + sanitizationRule("credential_authorization_material", "exclude", 0, digest("3")), + sanitizationRule("personal_identifier", "redact", 1, digest("4")), + sanitizationRule("internal_path", "exclude", 7, digest("5")), + sanitizationRule("provider_metadata_not_required", "exclude", 1, digest("6")), + sanitizationRule("protected_source_body", "exclude", 3, digest("7")), +];const sanitizedManifestVector = { ...sanitizedExample, omission_rules: sanitizationRules, rules_sha256: sha256(sanitizationRules), @@ -1137,7 +1367,97 @@ await writeJson(path.join(vectorDir, "assertion-envelope-and-invalidation.json") "Consumers decide from canonical assertions, evaluations, and registries without producer-specific internal state.", ], }); -const readme = `# Thinkloom provenance schemas 1.0\n\nThis generated package is the formal Stage 2 contract for the approved provenance architecture. It targets JSON Schema Draft 2020-12 and ships with ${schemaNames.length} schemas, valid fixtures, invalid fixture suites, and deterministic verification vectors.\n\n- \`catalog.json\` is the machine-readable inventory.\n- \`*.schema.json\` are the formal contracts.\n- \`registries\` defines assertion lifecycle, evaluation status, confidence, evidence, boundary, and reason semantics.\n- \`fixtures/valid\` contains one canonical valid instance per schema.\n- \`fixtures/invalid\` covers required fields, closed-object policy, and populated enum, pattern, and numeric/string/array bounds.\n- \`vectors\` fixes canonicalization, timestamps, paths, JSONL, event and segment chains, self-digests, protected records, key rotation and recovery, retention policy, sanitized export, deterministic indexes, verification reports, canonical assertions and evaluations, dependency invalidation, backups, and release-Merkle behavior.\n\nRegenerate with \`npm run provenance:schema:generate\`. Verify with \`npm run provenance:schema:test\`. Generated files must be committed together with generator and vector changes. Runtime adoption is a later implementation stage; presence of this package does not imply the current native writer already conforms.\n`; -await writeFile(path.join(output, "README.md"), readme, "utf8"); +const secondExpressionSegment = { + ...expressionSegmentExample, + segment_id: typedId("segment", "6"), + segment_sequence: 2, + range: { ...expressionSegmentExample.range, start: 12, end: 24, preimage_sha256: digest("6"), text_fragment_id: typedId("fragment", "7") }, + content_sha256: digest("6"), +}; +const contributionInputsA = [secondExpressionSegment, expressionSegmentExample]; +const contributionInputsB = [...contributionInputsA].reverse(); +const sortedContributionSegments = [...contributionInputsA].sort((left, right) => left.segment_sequence - right.segment_sequence || (left.segment_id < right.segment_id ? -1 : left.segment_id > right.segment_id ? 1 : 0)); +const deterministicContributionMapIdentity = { + ...contributionMapIdentity, + coverage: { denominator: 24, recorded_positions: 24, coverage_status: "complete", denominator_unit: "normalized_unicode_scalar_position", denominator_definition: contributionCoverageDefinition }, + segments: sortedContributionSegments, + structural_locators: [ + { segment_id: expressionSegmentExample.segment_id, chapter: 1, paragraph: 1, page: 1 }, + { segment_id: secondExpressionSegment.segment_id, chapter: 1, paragraph: 1, page: 1 }, + ], +}; +const deterministicContributionMap = { ...deterministicContributionMapIdentity, contribution_map_sha256: sha256(deterministicContributionMapIdentity) }; +await writeJson(path.join(vectorDir, "composition-and-harp-classification.json"), { + vector_version: "1.1", + operations: { + direct_human_insert: compositionOperationExample, + paste: { ...compositionOperationExample, operation_id: typedId("operation", "7"), operation_kind: "paste", recorded_origin_kind: "imported_or_pasted", transformation_relationships: ["pasted_from_external"], source_record_ids: [ids.record], lineage_reference_ids: [ids.record] }, + transcription: { ...compositionOperationExample, operation_id: typedId("operation", "8"), operation_kind: "transcription", recorded_origin_kind: "human_expressive_input_via_transcription", transformation_relationships: ["transcribed_from_human_speech"] }, + ai_acceptance: { ...compositionOperationExample, operation_id: typedId("operation", "9"), operation_kind: "ai_acceptance", recorded_origin_kind: "accepted_ai_output", invocation_id: ids.invocation, disposition_id: ids.disposition, transformation_relationships: ["generated_by_ai"] }, + restoration: { ...compositionOperationExample, operation_id: typedId("operation", "A"), operation_kind: "restoration", recorded_origin_kind: "system_restoration", transformation_relationships: ["restored_from_revision"], lineage_reference_ids: [ids.revision] }, + }, + exact_expression_segment: expressionSegmentExample, + exact_harp: harpExample, + forbidden_exact_segments: { + unknown_origin: { ...expressionSegmentExample, recorded_origin_kind: "unattested" }, + unknown_identity: { ...expressionSegmentExample, actor_identity_status: "unknown" }, + unknown_generation: { ...expressionSegmentExample, generation_status: "unknown" }, + unknown_lineage: { ...expressionSegmentExample, lineage_status: "unknown" }, + }, + forbidden_exact_harps: { + unknown_origin: { ...harpExample, origin_coverage_status: "unknown" }, + unknown_identity: { ...harpExample, identity_declaration: { ...harpExample.identity_declaration, declared_name: null, identity_status: "unknown" } }, + unknown_generation: { ...harpExample, generation_status: "unknown" }, + unknown_lineage: { ...harpExample, lineage_coverage_status: "unknown" }, + unknown_ai_system: { ...harpExample, ai_system_disclosures: [{ provider_id: null, model_id: null, identity_status: "unknown", included_expression_segment_ids: [ids.segment] }] }, + }, + independent_dimensions: ["recorded_origin", "transformation", "selection_arrangement", "evidentiary_evaluation", "suggested_registration_treatment"], + prohibited_claim_fields: ["human_percentage", "ai_percentage", "authorship_score", "originality_score", "copyrightability_score"], +}); +await writeJson(path.join(vectorDir, "contribution-map-determinism.json"), { + vector_version: "1.1", + input_orders: [contributionInputsA, contributionInputsB], + sorting_rule: "Sort by segment_sequence, then stable segment_id; never use locale-sensitive presentation order.", + deterministic_map: deterministicContributionMap, + canonical_map_sha256: sha256(canonicalize(deterministicContributionMap)), + coverage_invariant: "Ranges are ordered, non-overlapping, and cover every normalized Unicode scalar position from zero through the denominator.", + locator_invariant: "Revision, deposit digest, and stable segment ID are authoritative; page, chapter, and paragraph are layout-derived.", +}); +const staleHarpIdentity = { + ...harpIdentity, + evidentiary_status: "stale", + applicability_status: "stale", + deposit: { ...harpIdentity.deposit, manuscript_revision_id: typedId("revision", "8"), manuscript_revision_sha256: digest("8") }, + limitation_codes: [...harpIdentity.limitation_codes, "SUPERSEDED_POLICY_PROFILE"], +}; +const staleHarp = { ...staleHarpIdentity, harp_sha256: sha256(staleHarpIdentity) }; +await writeJson(path.join(vectorDir, "harp-deposit-staleness.json"), { + vector_version: "1.1", + deposit_snapshot: depositSnapshotExample, + current_harp: harpExample, + stale_after_edit: staleHarp, + export_manifest: harpManifestExample, + changed_dependency: { kind: "manuscript_revision", previous_revision_id: ids.revision2, current_revision_id: staleHarp.deposit.manuscript_revision_id, previous_sha256: digest("2"), current_sha256: staleHarp.deposit.manuscript_revision_sha256 }, + historical_integrity_rule: "Staleness for the current work does not invalidate the immutable HARP for its original exact deposit.", + registration_language_rule: "All suggested application strings are editable and bound only after explicit user approval.", + legal_scope_rule: "HARP does not determine identity, legal authorship, originality, copyrightability, ownership, or registrability.", +}); +const readme = `# Thinkloom provenance schemas 1.0 + +Package release: **Thinkloom 0.5.2** + +CPL runtime target: **Thinkloom 0.6.0** + +This generated additive package is the formal schema contract for the approved provenance architecture, composition lineage, and HARP projection. It targets JSON Schema Draft 2020-12 and ships with ${schemaNames.length} schemas, valid fixtures, invalid fixture suites, versioned semantic registries, and deterministic verification vectors. + +- \`catalog.json\` declares package, schema-family, per-schema introduction, and v0.6.0 compatibility without claiming native CPL conformance. +- \`*.schema.json\` are closed formal contracts. The seven composition/HARP records extend rather than overload v0.4 assertions or edit transactions. +- \`registries\` keeps recorded origin, transformation, selection/arrangement, evidentiary evaluation, and suggested registration treatment independent. +- \`fixtures/valid\` contains one canonical valid instance per schema. +- \`fixtures/invalid\` covers required fields, closed-object policy, populated constraints, and HARP-specific unknown-origin, identity, generation, and lineage boundaries. +- \`vectors\` fixes canonicalization, event and segment chains, self-digests, protected records, deterministic contribution maps, exact-deposit HARP binding, staleness, policy profiles, assertions/evaluations, backups, sanitization, and release-Merkle behavior. + +Existing v0.4 provenance-assertion and assertion-evaluation semantics remain valid. Regenerate with \`npm run provenance:schema:generate\`. Verify with \`npm run provenance:schema:test\`. Generated files must be committed together with generator and vector changes. Package presence does not confer CPL project-format conformance. Thinkloom 0.5.4 established the exact CPL 1.0 project marker and opener boundary. Thinkloom 0.5.5 adds typed, replayable Phase 1 commands, and Thinkloom 0.5.6 adds deterministic manuscript composition lineage, and Thinkloom 0.5.7 adds the frozen-deposit contribution-map projection, and Thinkloom 0.5.8 adds deterministic exact-deposit HARP generation, and Thinkloom 0.5.9 adds connected native CPL exploration and gated HARP preparation, and Thinkloom 0.5.10 adds separate registration artifacts plus verifiable sanitized and full-private HARP archives, and Thinkloom 0.5.11 adds the executable verification matrix, native release gate, origin-preserving arrangement checks, and packaged Windows end-to-end gate, without converting unmarked v0.5.x preview projects. +`;await writeFile(path.join(output, "README.md"), readme, "utf8"); console.log(`Generated ${schemaNames.length} provenance schemas and fixtures in ${path.relative(root, output)}.`); \ No newline at end of file diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 44d3806..3d4ad96 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3980,7 +3980,7 @@ dependencies = [ [[package]] name = "thinkloom" -version = "0.5.0" +version = "0.5.11" dependencies = [ "chrono", "hex", @@ -3989,12 +3989,14 @@ dependencies = [ "reqwest 0.12.28", "rfd", "rusqlite", + "ryu", "serde", "serde_json", "sha2", "tauri", "tauri-build", "tempfile", + "unicode-normalization", "uuid", "walkdir", "zip", @@ -4426,6 +4428,15 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-normalization" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.13.3" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 0714c53..fda2a65 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "thinkloom" -version = "0.5.0" +version = "0.5.11" description = "Local-first writing studio with creative provenance" authors = ["Christopher Chambers"] license = "AGPL-3.0-only" @@ -24,6 +24,8 @@ sha2 = "0.10" hex = "0.4" chrono = { version = "0.4", features = ["serde"] } uuid = { version = "1", features = ["v4", "serde"] } +unicode-normalization = "0.1" +ryu = "1" reqwest = { version = "0.12", default-features = false, features = ["blocking", "json", "rustls-tls"] } zip = { version = "2", default-features = false, features = ["deflate"] } keyring = "3" diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 3ebe388..288624c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,12 +1,14 @@ +pub mod project_format; +pub mod provenance; + use chrono::Utc; -use rusqlite::{params, Connection}; +use rusqlite::Connection; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::{json, Value}; -use sha2::{Digest, Sha256}; use std::{ collections::HashMap, fs, - io::Write, + io::{Read, Write}, path::{Path, PathBuf}, process::Command, sync::Mutex, @@ -25,6 +27,13 @@ const PROMPT_GUIDE: &str = include_str!("../../PROMPTS.md"); #[derive(Default)] struct RuntimeState { active_project: Mutex>, + read_only_project: Mutex>, +} + +#[derive(Debug, Clone)] +struct ReadOnlyProject { + path: PathBuf, + classification: project_format::ProjectClassification, } #[derive(Debug, Serialize)] @@ -36,6 +45,12 @@ struct CommandError { } type CommandResult = Result; +impl From for CommandError { + fn from(error: provenance::CplError) -> Self { + Self::new(&error.code, error.message, error.recoverable) + } +} + impl CommandError { fn new(code: &str, message: impl Into, recoverable: bool) -> Self { Self { @@ -50,36 +65,26 @@ impl CommandError { } #[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] struct ProjectManifest { + #[serde(rename = "project_format")] + project_format: String, + #[serde(rename = "project_format_version")] + project_format_version: String, + #[serde(rename = "provenance_conformance")] + provenance_conformance: String, schema_version: String, application_version: String, - id: String, + project_id: String, title: String, + description: String, created_at: String, updated_at: String, current_phase: String, publication_status: String, + provenance_policy_id: String, audio_retained: bool, } -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -struct ProvenanceEvent { - schema_version: String, - event_id: String, - project_id: String, - timestamp: String, - event_type: String, - actor: Value, - provider: Option, - inputs: Vec, - outputs: Vec, - metadata: Value, - previous_event_hash: Option, - event_hash: String, -} - #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] struct ProviderProfile { @@ -125,9 +130,12 @@ struct ConnectionResult { #[serde(rename_all = "camelCase")] struct ProjectSummary { path: String, - manifest: ProjectManifest, + manifest: Option, + classification: project_format::ProjectClassification, + editable: bool, provenance_valid: bool, recovery_available: bool, + message: String, } fn active_path(state: &State) -> CommandResult { @@ -167,16 +175,14 @@ fn atomic_write(path: &Path, bytes: &[u8]) -> CommandResult<()> { file.sync_all() .map_err(|e| CommandError::io("Could not flush temporary file", e))?; } - if path.exists() { - fs::remove_file(path) - .map_err(|e| CommandError::io("Could not replace canonical file", e))?; - } - fs::rename(&temp, path).map_err(|e| CommandError::io("Could not finalize canonical file", e)) + provenance::ledger::atomic_replace(&temp, path)?; + provenance::ledger::sync_directory(parent)?; + Ok(()) } fn write_json(path: &Path, value: &impl Serialize) -> CommandResult<()> { - let bytes = serde_json::to_vec_pretty(value) + let value = serde_json::to_value(value) .map_err(|e| CommandError::new("SERIALIZE_ERROR", e.to_string(), false))?; - atomic_write(path, &bytes) + atomic_write(path, &provenance::canonical::canonicalize(&value)?) } fn prompt_config_dir(app: &AppHandle) -> CommandResult { app.path() @@ -411,12 +417,12 @@ fn open_prompt_folder(app: AppHandle) -> CommandResult { } fn init_db(root: &Path) -> CommandResult { - let state_dir = root.join(".thinkloom"); + let state_dir = root.join(".app"); fs::create_dir_all(&state_dir) .map_err(|e| CommandError::io("Could not create live state folder", e))?; let db = Connection::open(state_dir.join("state.sqlite")) .map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - db.execute_batch("PRAGMA journal_mode=WAL; PRAGMA foreign_keys=ON; CREATE TABLE IF NOT EXISTS project_state (id INTEGER PRIMARY KEY CHECK(id=1), json TEXT NOT NULL, updated_at TEXT NOT NULL); CREATE TABLE IF NOT EXISTS provenance_events (event_id TEXT PRIMARY KEY, event_type TEXT NOT NULL, timestamp TEXT NOT NULL, event_hash TEXT NOT NULL, summary TEXT); CREATE TABLE IF NOT EXISTS staged_generations (id TEXT PRIMARY KEY, state TEXT NOT NULL, json TEXT NOT NULL, updated_at TEXT NOT NULL);").map_err(|e| CommandError::new("MIGRATION_ERROR", e.to_string(), false))?; + db.execute_batch("PRAGMA journal_mode=WAL; PRAGMA foreign_keys=ON; CREATE TABLE IF NOT EXISTS project_state (id INTEGER PRIMARY KEY CHECK(id=1), json TEXT NOT NULL, updated_at TEXT NOT NULL); CREATE TABLE IF NOT EXISTS staged_generations (id TEXT PRIMARY KEY, state TEXT NOT NULL, json TEXT NOT NULL, updated_at TEXT NOT NULL);").map_err(|e| CommandError::new("MIGRATION_ERROR", e.to_string(), false))?; Ok(db) } fn run_git(root: &Path, args: &[&str]) -> CommandResult<()> { @@ -449,20 +455,7 @@ fn init_history(root: &Path) -> CommandResult<()> { } Ok(()) } -fn head_hash(root: &Path) -> CommandResult> { - let path = root.join("provenance/chain-head.json"); - if !path.exists() { - return Ok(None); - } - let value: Value = serde_json::from_slice( - &fs::read(path).map_err(|e| CommandError::io("Could not read history head", e))?, - ) - .map_err(|e| CommandError::new("PROVENANCE_INVALID", e.to_string(), true))?; - Ok(value - .get("eventHash") - .and_then(Value::as_str) - .map(str::to_owned)) -} + fn append_event( root: &Path, project_id: &str, @@ -470,108 +463,91 @@ fn append_event( actor: &str, summary: &str, metadata: Value, -) -> CommandResult { - let previous = head_hash(root)?; - let mut event = ProvenanceEvent { - schema_version: SCHEMA_VERSION.into(), - event_id: Uuid::new_v4().to_string(), - project_id: project_id.into(), - timestamp: Utc::now().to_rfc3339(), - event_type: event_type.into(), - actor: json!({"type": actor}), - provider: None, - inputs: vec![], - outputs: vec![], +) -> CommandResult { + let client_action_id = provenance::identifiers::sortable_id("action")?; + Ok(provenance::CplService::new(root, project_id).write(provenance::WriteCommand { + client_action_id, + project_id: project_id.to_owned(), + event_type: event_type.to_owned(), + actor: actor.to_owned(), metadata: json!({"summary": summary, "details": metadata}), - previous_event_hash: previous, - event_hash: String::new(), - }; - let canonical = serde_json::to_vec(&json!({"schemaVersion":event.schema_version,"eventId":event.event_id,"projectId":event.project_id,"timestamp":event.timestamp,"eventType":event.event_type,"actor":event.actor,"provider":event.provider,"inputs":event.inputs,"outputs":event.outputs,"metadata":event.metadata,"previousEventHash":event.previous_event_hash})).map_err(|e| CommandError::new("SERIALIZE_ERROR", e.to_string(), false))?; - event.event_hash = hex::encode(Sha256::digest(canonical)); - let journal = root.join("provenance/events.jsonl"); - fs::create_dir_all(journal.parent().unwrap()) - .map_err(|e| CommandError::io("Could not create history folder", e))?; - let mut file = fs::OpenOptions::new() - .create(true) - .append(true) - .open(&journal) - .map_err(|e| CommandError::io("Could not open history journal", e))?; - serde_json::to_writer(&mut file, &event) - .map_err(|e| CommandError::new("SERIALIZE_ERROR", e.to_string(), false))?; - file.write_all(b"\n") - .map_err(|e| CommandError::io("Could not append history event", e))?; - file.sync_all() - .map_err(|e| CommandError::io("Could not flush history event", e))?; - write_json( - &root.join("provenance/chain-head.json"), - &json!({"eventId":event.event_id,"eventHash":event.event_hash,"updatedAt":event.timestamp}), - )?; - let db = init_db(root)?; - db.execute("INSERT OR REPLACE INTO provenance_events(event_id,event_type,timestamp,event_hash,summary) VALUES(?1,?2,?3,?4,?5)", params![event.event_id,event.event_type,event.timestamp,event.event_hash,summary]).map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - Ok(event) -} - -fn verify_chain_at(root: &Path) -> CommandResult { - let journal = root.join("provenance/events.jsonl"); - if !journal.exists() { - return Ok(false); - } - let contents = - fs::read_to_string(&journal).map_err(|e| CommandError::io("Could not read history", e))?; - let mut previous: Option = None; - let mut last = None; - for (index, line) in contents.lines().enumerate() { - if line.trim().is_empty() { - continue; - } - let event: ProvenanceEvent = serde_json::from_str(line).map_err(|e| { - CommandError::new( - "PROVENANCE_INVALID", - format!("Event {} is malformed: {e}", index + 1), - true, - ) - })?; - if event.previous_event_hash != previous { - return Ok(false); - } - let canonical = serde_json::to_vec(&json!({"schemaVersion":event.schema_version,"eventId":event.event_id,"projectId":event.project_id,"timestamp":event.timestamp,"eventType":event.event_type,"actor":event.actor,"provider":event.provider,"inputs":event.inputs,"outputs":event.outputs,"metadata":event.metadata,"previousEventHash":event.previous_event_hash})).map_err(|e| CommandError::new("SERIALIZE_ERROR", e.to_string(), false))?; - if hex::encode(Sha256::digest(canonical)) != event.event_hash { - return Ok(false); - } - previous = Some(event.event_hash.clone()); - last = previous.clone(); - } - Ok(last == head_hash(root)?) + records: vec![provenance::RecordInput { + record_type: "native-action".to_owned(), + payload: json!({"event_type": event_type, "actor": actor, "summary": summary, "details": metadata}), + }], + operational_state: None, + })?) } fn project_layout(root: &Path) -> CommandResult<()> { - for folder in [ - "manuscript/sections", - "ideas", - "conversations/transcripts", - "provenance/reports", - "style", - "assets", - "exports", - ".thinkloom", - ] { + project_format::initialize_conforming_layout(root)?; + for folder in ["style", "exports"] { fs::create_dir_all(root.join(folder)) - .map_err(|e| CommandError::io("Could not create project structure", e))?; + .map_err(|error| CommandError::io("Could not create project structure", error))?; } atomic_write( &root.join(".gitignore"), - b".thinkloom/\nexports/*.pdf\nexports/*.zip\n*.tmp\n*.wav\n*.mp3\n", + b".app/\nreports/\nexports/*.pdf\nexports/*.zip\n*.tmp\n*.wav\n*.mp3\n", )?; Ok(()) } + fn read_manifest(root: &Path) -> CommandResult { serde_json::from_slice( &fs::read(root.join("project.json")) - .map_err(|e| CommandError::io("Could not read project", e))?, + .map_err(|error| CommandError::io("Could not read project", error))?, ) - .map_err(|e| CommandError::new("PROJECT_INVALID", e.to_string(), false)) + .map_err(|error| CommandError::new("PROJECT_INVALID", error.to_string(), false)) } + +fn set_read_only_project( + state: &State, + root: &Path, + classification: project_format::ProjectClassification, +) -> CommandResult<()> { + *state + .active_project + .lock() + .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? = + None; + *state + .read_only_project + .lock() + .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? = + Some(ReadOnlyProject { + path: root.to_path_buf(), + classification, + }); + Ok(()) +} + +fn set_editable_project(state: &State, root: &Path) -> CommandResult<()> { + *state + .read_only_project + .lock() + .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? = + None; + *state + .active_project + .lock() + .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? = + Some(root.to_path_buf()); + Ok(()) +} + +fn read_only_summary(root: &Path, inspection: project_format::ProjectInspection) -> ProjectSummary { + ProjectSummary { + path: root.to_string_lossy().into_owned(), + manifest: None, + classification: inspection.classification, + editable: false, + provenance_valid: false, + recovery_available: false, + message: inspection.message, + } +} + fn snapshot(root: &Path) -> CommandResult { - let db = root.join(".thinkloom/state.sqlite"); + let db = root.join(".app/state.sqlite"); if !db.exists() { return Err(CommandError::new( "NO_SNAPSHOT", @@ -579,17 +555,17 @@ fn snapshot(root: &Path) -> CommandResult { true, )); } - let snapshots = root.join(".thinkloom/snapshots"); + let snapshots = root.join(".app/snapshots"); fs::create_dir_all(&snapshots) - .map_err(|e| CommandError::io("Could not create snapshot folder", e))?; + .map_err(|error| CommandError::io("Could not create snapshot folder", error))?; let destination = snapshots.join(format!( "state-{}.sqlite", Utc::now().format("%Y%m%d-%H%M%S") )); fs::copy(&db, &destination) - .map_err(|e| CommandError::io("Could not create database snapshot", e))?; + .map_err(|error| CommandError::io("Could not create database snapshot", error))?; let mut existing: Vec<_> = fs::read_dir(&snapshots) - .map_err(|e| CommandError::io("Could not inspect snapshots", e))? + .map_err(|error| CommandError::io("Could not inspect snapshots", error))? .filter_map(Result::ok) .collect(); existing.sort_by_key(|entry| entry.file_name()); @@ -616,11 +592,23 @@ fn create_project( state: State, ) -> CommandResult { let base = PathBuf::from(path); + let title = title.trim().to_owned(); + if title.is_empty() { + return Err(CommandError::new( + "PROJECT_TITLE_REQUIRED", + "Enter a project title before creating its CPL boundary.", + true, + )); + } let safe_name: String = title .chars() - .map(|c| { - if c.is_alphanumeric() || c == '-' || c == '_' || c == ' ' { - c + .map(|character| { + if character.is_alphanumeric() + || character == '-' + || character == '_' + || character == ' ' + { + character } else { '-' } @@ -639,16 +627,21 @@ fn create_project( )); } project_layout(&root)?; - let timestamp = Utc::now().to_rfc3339(); + let timestamp = provenance::identifiers::timestamp_millis(); let manifest = ProjectManifest { + project_format: project_format::PROJECT_FORMAT.into(), + project_format_version: project_format::PROJECT_FORMAT_VERSION.into(), + provenance_conformance: project_format::PROVENANCE_CONFORMANCE.into(), schema_version: SCHEMA_VERSION.into(), application_version: APP_VERSION.into(), - id: Uuid::new_v4().to_string(), + project_id: provenance::identifiers::sortable_id("project")?, + description: String::new(), title: title.clone(), created_at: timestamp.clone(), updated_at: timestamp, current_phase: "ideation".into(), publication_status: "working".into(), + provenance_policy_id: provenance::identifiers::sortable_id("policy")?, audio_retained: false, }; write_json(&root.join("project.json"), &manifest)?; @@ -666,14 +659,40 @@ fn create_project( write_json(&root.join("style/sample-references.json"), &json!([]))?; init_db(&root)?; let history_ok = init_history(&root).is_ok(); - append_event( - &root, - &manifest.id, - "PROJECT_CREATED", - "user", - &format!("Created {title}"), - json!({"historyAvailable":history_ok}), - )?; + provenance::CplService::new(&root, &manifest.project_id).write(provenance::WriteCommand { + client_action_id: provenance::identifiers::sortable_id("action")?, + project_id: manifest.project_id.clone(), + event_type: "PROJECT_CREATED".to_owned(), + actor: "user".to_owned(), + metadata: json!({ + "summary": format!("Created {title}"), + "historyAvailable": history_ok, + "projectFormat": project_format::PROJECT_FORMAT, + "projectFormatVersion": project_format::PROJECT_FORMAT_VERSION, + "provenanceConformance": project_format::PROVENANCE_CONFORMANCE + }), + records: vec![ + provenance::RecordInput { + record_type: "project-manifest".to_owned(), + payload: serde_json::to_value(&manifest).map_err(|error| { + CommandError::new("SERIALIZE_ERROR", error.to_string(), false) + })?, + }, + provenance::RecordInput { + record_type: "provenance-policy".to_owned(), + payload: json!({ + "schema_version": SCHEMA_VERSION, + "policy_id": manifest.provenance_policy_id, + "project_id": manifest.project_id, + "retention_mode": "minimal", + "encryption_mode": "none", + "default_export_profile": "sanitized", + "effective_at": manifest.created_at + }), + }, + ], + operational_state: None, + })?; if history_ok { let _ = run_git( &root, @@ -684,124 +703,450 @@ fn create_project( "manuscript", "ideas", "conversations", + "records", "provenance", "style", ], ); let _ = run_git(&root, &["commit", "--quiet", "-m", "Project created"]); } - *state - .active_project - .lock() - .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? = - Some(root.clone()); + set_editable_project(&state, &root)?; Ok(ProjectSummary { path: root.to_string_lossy().into_owned(), - manifest, + manifest: Some(manifest), + classification: project_format::ProjectClassification::CplConforming, + editable: true, provenance_valid: true, recovery_available: false, + message: "Created a CPL 1.0-conforming project boundary.".to_owned(), }) } #[tauri::command] fn open_project(path: String, state: State) -> CommandResult { let root = PathBuf::from(path); - let manifest = read_manifest(&root)?; - if manifest.schema_version != SCHEMA_VERSION { - return Err(CommandError::new( - "SCHEMA_UNSUPPORTED", - format!( - "This project uses schema {}. Thinkloom supports {SCHEMA_VERSION}.", + let inspection = project_format::inspect_project(&root)?; + if inspection.classification != project_format::ProjectClassification::CplConforming { + set_read_only_project(&state, &root, inspection.classification)?; + return Ok(read_only_summary(&root, inspection)); + } + + set_read_only_project( + &state, + &root, + project_format::ProjectClassification::CplBlocked, + )?; + let manifest = match read_manifest(&root) { + Ok(manifest) => manifest, + Err(error) => { + return Ok(read_only_summary( + &root, + project_format::ProjectInspection { + classification: project_format::ProjectClassification::UnsupportedReadOnly, + message: format!( + "The exact marker is present, but the project manifest is incompatible: {}. No recovery was attempted.", + error.message + ), + }, + )); + } + }; + if manifest.schema_version != SCHEMA_VERSION + || manifest.project_format != project_format::PROJECT_FORMAT + || manifest.project_format_version != project_format::PROJECT_FORMAT_VERSION + || manifest.provenance_conformance != project_format::PROVENANCE_CONFORMANCE + { + let inspection = project_format::ProjectInspection { + classification: project_format::ProjectClassification::CplBlocked, + message: format!( + "The project marker is recognized, but schema {} is incompatible with supported schema {SCHEMA_VERSION}. No recovery was attempted.", manifest.schema_version ), - false, - )); + }; + set_read_only_project(&state, &root, inspection.classification)?; + return Ok(read_only_summary(&root, inspection)); } - init_db(&root)?; - *state - .active_project - .lock() - .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? = - Some(root.clone()); - let valid = verify_chain_at(&root).unwrap_or(false); - let recovery = root.join(".thinkloom/snapshots").exists(); - let _ = append_event( - &root, - &manifest.id, - "PROJECT_OPENED", - "user", - "Reopened project", - json!({"chainWasValid":valid}), + + let recovery_report = match provenance::CplService::new(&root, &manifest.project_id).recover() { + Ok(report) => report, + Err(error) => { + return Ok(ProjectSummary { + path: root.to_string_lossy().into_owned(), + manifest: Some(manifest), + classification: project_format::ProjectClassification::CplBlocked, + editable: false, + provenance_valid: false, + recovery_available: true, + message: format!( + "CPL recovery was unable to establish a safe editable state: {}", + error.message + ), + }); + } + }; + let valid = matches!( + recovery_report.verification.status, + provenance::VerificationStatus::Verified + | provenance::VerificationStatus::VerifiedWithWarnings ); + let recovery_available = !matches!( + recovery_report.classification, + provenance::RecoveryClassification::Clean + ) || root.join(".app/snapshots").exists(); + if !valid { + let inspection = project_format::ProjectInspection { + classification: project_format::ProjectClassification::CplBlocked, + message: format!( + "CPL recovery completed with verification status {:?}; the project remains read-only.", + recovery_report.verification.status + ), + }; + set_read_only_project(&state, &root, inspection.classification)?; + return Ok(ProjectSummary { + path: root.to_string_lossy().into_owned(), + manifest: Some(manifest), + classification: inspection.classification, + editable: false, + provenance_valid: false, + recovery_available, + message: inspection.message, + }); + } + + set_editable_project(&state, &root)?; Ok(ProjectSummary { path: root.to_string_lossy().into_owned(), - manifest, - provenance_valid: valid, - recovery_available: recovery, + manifest: Some(manifest), + classification: project_format::ProjectClassification::CplConforming, + editable: true, + provenance_valid: true, + recovery_available, + message: "CPL recovery and native verification passed; the project is editable.".to_owned(), }) } +fn selected_project_path(state: &State) -> CommandResult { + if let Some(selection) = state + .read_only_project + .lock() + .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? + .as_ref() + { + return Ok(selection.path.clone()); + } + active_path(state) +} + #[tauri::command] -fn persist_state(app_state: Value, state: State) -> CommandResult<()> { - let root = active_path(&state)?; - let manifest = read_manifest(&root)?; - let serialized = serde_json::to_string(&app_state) - .map_err(|e| CommandError::new("SERIALIZE_ERROR", e.to_string(), false))?; - let mut db = init_db(&root)?; - let transaction = db - .transaction() - .map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - transaction.execute("INSERT INTO project_state(id,json,updated_at) VALUES(1,?1,?2) ON CONFLICT(id) DO UPDATE SET json=excluded.json,updated_at=excluded.updated_at", params![serialized,Utc::now().to_rfc3339()]).map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - transaction - .commit() - .map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - let event = app_state - .get("events") - .and_then(Value::as_array) - .and_then(|events| events.last()) - .cloned() - .unwrap_or_else(|| json!({})); - let summary = event - .get("summary") - .and_then(Value::as_str) - .unwrap_or("Saved project change"); - append_event( - &root, - &manifest.id, - event - .get("type") - .and_then(Value::as_str) - .unwrap_or("STATE_MUTATED"), - event.get("actor").and_then(Value::as_str).unwrap_or("user"), - summary, - json!({"clientEventId":event.get("id")}), - )?; - if let Some(manuscript) = app_state.get("manuscript").and_then(Value::as_str) { - atomic_write( - &root.join("manuscript/manuscript.md"), - manuscript.as_bytes(), - )?; +fn show_project_folder(state: State) -> CommandResult { + let directory = selected_project_path(&state)?; + #[cfg(target_os = "windows")] + let mut command = Command::new("explorer.exe"); + #[cfg(target_os = "macos")] + let mut command = Command::new("open"); + #[cfg(all(unix, not(target_os = "macos")))] + let mut command = Command::new("xdg-open"); + command + .arg(&directory) + .spawn() + .map_err(|error| CommandError::io("Could not show the project folder", error))?; + Ok(directory.to_string_lossy().into_owned()) +} + +#[tauri::command] +fn create_legacy_preservation_archive(state: State) -> CommandResult> { + let selection = state + .read_only_project + .lock() + .map_err(|_| CommandError::new("STATE_LOCKED", "Project state is unavailable.", true))? + .clone() + .ok_or_else(|| { + CommandError::new( + "NO_LEGACY_PROJECT", + "Select an unmarked legacy preview project first.", + true, + ) + })?; + if selection.classification != project_format::ProjectClassification::LegacyPreviewReadOnly { + return Err(CommandError::new( + "LEGACY_ARCHIVE_NOT_PERMITTED", + "Only unmarked legacy preview projects can receive a preservation archive.", + false, + )); } - if let Some(ideas) = app_state.get("ideas") { - write_json(&root.join("ideas/ideas.json"), ideas)?; + let default_name = selection + .path + .file_name() + .and_then(|name| name.to_str()) + .filter(|name| !name.is_empty()) + .unwrap_or("legacy-preview-project"); + let Some(destination) = rfd::FileDialog::new() + .set_title("Save legacy preview-project preservation archive") + .set_file_name(format!("{default_name}-preservation.zip")) + .add_filter("ZIP archive", &["zip"]) + .save_file() + else { + return Ok(None); + }; + project_format::create_legacy_preservation_archive(&selection.path, &destination)?; + Ok(Some(destination.to_string_lossy().into_owned())) +} +fn refresh_phase1_files( + root: &Path, + projection: &provenance::phase1::Phase1Projection, +) -> CommandResult<()> { + write_json(&root.join("ideas/ideas.json"), &projection.ideas)?; + let mut sessions = projection.sessions.clone(); + sessions.retain(|session| session.id != projection.active_session_id); + if !projection.active_session_id.is_empty() { + sessions.push(projection.current_session_snapshot()); } - if let Some(turns) = app_state.get("turns") { - write_json( - &root.join("conversations/sessions.json"), - &json!([{"id":"active-session","mode":"typed","turns":turns}]), - )?; - } - write_json( - &root.join("style/profile.json"), - &json!({"schemaVersion":SCHEMA_VERSION,"traits":app_state.get("styleTraits"),"disallowedHabits":app_state.get("disallowedHabits")}), - )?; - let _ = snapshot(&root); + write_json(&root.join("conversations/sessions.json"), &sessions)?; Ok(()) } #[tauri::command] -fn verify_provenance(state: State) -> CommandResult { - verify_chain_at(&active_path(&state)?) +fn apply_phase1_command( + command: provenance::phase1::Phase1Command, + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + let result = provenance::phase1::apply_command(&root, &manifest.project_id, command)?; + refresh_phase1_files(&root, &result.projection)?; + Ok(result) +} + +#[tauri::command] +fn load_phase1_projection( + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::phase1::reconstruct( + &root, + &manifest.project_id, + )?) +} + +#[tauri::command] +fn apply_composition_command( + command: provenance::composition::CompositionCommand, + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + let result = provenance::composition::apply_command(&root, &manifest.project_id, command)?; + atomic_write( + &root.join("manuscript/manuscript.md"), + result.projection.manuscript.as_bytes(), + )?; + Ok(result) +} + +#[tauri::command] +fn load_composition_projection( + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::composition::reconstruct( + &root, + &manifest.project_id, + )?) +} + +#[tauri::command] +fn ensure_composition_projection( + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + let projection = provenance::composition::reconstruct(&root, &manifest.project_id)?; + if projection.initialized { + return Ok(projection); + } + let manuscript = + fs::read_to_string(root.join("manuscript/manuscript.md")).map_err(|error| { + CommandError::io( + "Could not read the existing manuscript for unattested initialization", + error, + ) + })?; + let digest = provenance::canonical::sha256_digest(manuscript.as_bytes()); + let result = provenance::composition::apply_command( + &root, + &manifest.project_id, + provenance::composition::CompositionCommand { + client_action_id: format!( + "composition_initialize_{}", + digest.trim_start_matches("sha256:") + ), + actor: "system".to_owned(), + summary: "Initialized existing manuscript as unattested expression".to_owned(), + occurred_at: provenance::identifiers::timestamp_millis(), + action: provenance::composition::CompositionAction::Initialize { + text: manuscript, + origin: provenance::composition::RecordedOrigin::Unattested, + }, + }, + )?; + Ok(result.projection) +} + +#[tauri::command] +fn refresh_non_phase1_files(app_state: Value, state: State) -> CommandResult<()> { + let root = active_path(&state)?; + write_json( + &root.join("style/profile.json"), + &json!({"schemaVersion":SCHEMA_VERSION,"traits":app_state.get("styleTraits"),"disallowedHabits":app_state.get("disallowedHabits")}), + )?; + Ok(()) +} +#[tauri::command] +fn freeze_contribution_map( + request: Option, + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::contribution_map::freeze_current( + &root, + &manifest.project_id, + request.unwrap_or_default(), + )?) +} + +#[tauri::command] +fn load_contribution_map( + state: State, +) -> CommandResult> { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::contribution_map::load_latest( + &root, + &manifest.project_id, + )?) +} +#[tauri::command] +fn load_cpl_explorer( + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::explorer::load(&root, &manifest.project_id)?) +} + +#[tauri::command] +fn prepare_harp(state: State) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::harp::prepare_current( + &root, + &manifest.project_id, + )?) +} +#[tauri::command] +fn export_harp_artifacts( + request: provenance::export::HarpExportRequest, + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::export::create_harp_exports( + &root, + &manifest.project_id, + request, + )?) +} + +#[tauri::command] +fn verify_harp_sanitized_archive( + archive_path: String, + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + let harp = provenance::harp::load_latest(&root, &manifest.project_id)?.ok_or_else(|| { + CommandError::new( + "HARP_EXPORT_REQUIRED", + "Generate HARP before verifying its sanitized archive.", + true, + ) + })?; + let chain = harp.harp["cpl_binding"]["chain_head"] + .as_str() + .ok_or_else(|| { + CommandError::new( + "HARP_BINDING_INVALID", + "HARP has no CPL chain binding.", + false, + ) + })?; + let harp_sha256 = harp.harp["harp_sha256"] + .as_str() + .ok_or_else(|| CommandError::new("HARP_BINDING_INVALID", "HARP has no digest.", false))?; + let deposit_sha256 = harp.harp["deposit"]["deposit_sha256"] + .as_str() + .ok_or_else(|| { + CommandError::new("HARP_BINDING_INVALID", "HARP has no deposit digest.", false) + })?; + let requested = PathBuf::from(archive_path); + let target = if requested.is_absolute() { + requested + } else { + root.join(requested) + }; + let canonical_root = fs::canonicalize(&root) + .map_err(|error| CommandError::io("Could not resolve the project folder", error))?; + let canonical_target = fs::canonicalize(&target) + .map_err(|error| CommandError::io("Could not resolve the sanitized archive", error))?; + if !canonical_target.starts_with(canonical_root.join("exports").join("harp")) { + return Err(CommandError::new( + "HARP_ARCHIVE_PATH_REFUSED", + "Only sanitized HARP archives inside this project's export folder can be verified here.", + false, + )); + } + Ok(provenance::export::verify_sanitized_archive( + &canonical_target, + Some((chain, harp_sha256, deposit_sha256)), + )?) +} +#[tauri::command] +fn generate_harp( + request: provenance::harp::HarpGenerationRequest, + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::harp::generate_current( + &root, + &manifest.project_id, + request, + )?) +} + +#[tauri::command] +fn load_harp( + state: State, +) -> CommandResult> { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::harp::load_latest(&root, &manifest.project_id)?) +} +#[tauri::command] +fn verify_provenance(state: State) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::verify_project(&root, &manifest.project_id)?) +} + +#[tauri::command] +fn recover_provenance(state: State) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + Ok(provenance::recover_project(&root, &manifest.project_id)?) } #[tauri::command] @@ -810,7 +1155,7 @@ fn create_checkpoint(name: String, state: State) -> CommandResult< let manifest = read_manifest(&root)?; append_event( &root, - &manifest.id, + &manifest.project_id, "CHECKPOINT_CREATED", "user", &format!("Saved version {name}"), @@ -824,6 +1169,7 @@ fn create_checkpoint(name: String, state: State) -> CommandResult< "manuscript", "ideas", "conversations", + "deposits", "provenance", "style", ], @@ -849,109 +1195,217 @@ fn store_provider_secret(profile_id: String, secret: String) -> CommandResult<() true, )); } - keyring::Entry::new("com.thinkloom.desktop", &profile_id) + keyring::Entry::new("com.app.desktop", &profile_id) .map_err(|e| CommandError::new("CREDENTIAL_ERROR", e.to_string(), true))? .set_password(&secret) .map_err(|e| CommandError::new("CREDENTIAL_ERROR", e.to_string(), true)) } #[tauri::command] fn delete_provider_secret(profile_id: String) -> CommandResult<()> { - keyring::Entry::new("com.thinkloom.desktop", &profile_id) + keyring::Entry::new("com.app.desktop", &profile_id) .map_err(|e| CommandError::new("CREDENTIAL_ERROR", e.to_string(), true))? .delete_credential() .map_err(|e| CommandError::new("CREDENTIAL_ERROR", e.to_string(), true)) } #[tauri::command] -fn test_provider(profile: ProviderProfile) -> CommandResult { - if profile.mode == "cloud" && profile.kind != "openai" { - return Ok(ConnectionResult { - ok: false, - message: "Cloud processing must be approved in the project before testing.".into(), - }); - } - let endpoint = profile.endpoint.trim_end_matches('/'); - let url = if profile.kind == "ollama" { - format!("{endpoint}/api/tags") - } else { - format!("{endpoint}/models") +fn test_provider( + profile: ProviderProfile, + client_action_id: String, + invocation_id: String, + session_id: String, + state: State, +) -> CommandResult { + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + let requested_at = provenance::identifiers::timestamp_millis(); + let provider = provenance::phase1::Phase1Provider { + kind: profile.kind.clone(), + name: profile.name.clone(), + endpoint: profile.endpoint.clone(), + model: profile.model.clone(), + mode: profile.mode.clone(), + connected: false, }; - let mut request = reqwest::blocking::Client::builder() - .timeout(std::time::Duration::from_secs(8)) - .build() - .map_err(|e| CommandError::new("PROVIDER_ERROR", e.to_string(), true))? - .get(url); - if profile.kind == "openai" { - let secret = keyring::Entry::new("com.thinkloom.desktop", "openai") - .ok() - .and_then(|entry| entry.get_password().ok()) - .ok_or_else(|| { - CommandError::new( - "CREDENTIAL_MISSING", - "Save the OpenAI credential in the system vault first.", - true, - ) - })?; - request = request.bearer_auth(secret); - } - let response = match request.send() { - Ok(response) => response, - Err(error) => { + provenance::phase1::apply_command( + &root, + &manifest.project_id, + provenance::phase1::Phase1Command { + client_action_id: format!("{client_action_id}:request"), + actor: "user".to_owned(), + summary: "Requested provider connectivity test".to_owned(), + occurred_at: requested_at.clone(), + operation: provenance::phase1::Phase1Operation::ProviderInvocationRequested { + invocation: provenance::phase1::ProviderInvocation { + invocation_id: invocation_id.clone(), + purpose: "provider_test".to_owned(), + session_id, + provider, + prompt_template_sha256: provenance::phase1::canonical_text_digest( + "provider-connectivity-test", + )?, + input_sha256: provenance::phase1::canonical_text_digest(&profile.model)?, + context_sha256: provenance::phase1::canonical_text_digest(&profile.endpoint)?, + requested_at, + }, + }, + }, + )?; + + // The connectivity request runs after the durable request event and without a writer lock. + let outcome = (|| -> CommandResult { + if profile.mode == "cloud" && profile.kind != "openai" { return Ok(ConnectionResult { ok: false, - message: format!("Could not reach {}: {}", profile.name, error), + message: "Cloud processing must be approved in the project before testing.".into(), }); } - }; - if !response.status().is_success() { - return Ok(ConnectionResult { - ok: false, - message: format!( - "{} responded with status {}.", - profile.name, - response.status() - ), - }); - } - if profile.kind == "ollama" { - let value: Value = response - .json() - .map_err(|error| CommandError::new("PROVIDER_RESPONSE", error.to_string(), true))?; - let requested = profile.model.trim(); - let installed = value - .get("models") - .and_then(Value::as_array) - .into_iter() - .flatten() - .filter_map(|model| model.get("name").and_then(Value::as_str)) - .collect::>(); - let available = installed.iter().any(|name| { - *name == requested - || name.strip_suffix(":latest") == Some(requested) - || requested.strip_suffix(":latest") == Some(*name) - }); - if !available { + let endpoint = profile.endpoint.trim_end_matches('/'); + let url = if profile.kind == "ollama" { + format!("{endpoint}/api/tags") + } else { + format!("{endpoint}/models") + }; + let mut request = reqwest::blocking::Client::builder() + .timeout(std::time::Duration::from_secs(8)) + .build() + .map_err(|e| CommandError::new("PROVIDER_ERROR", e.to_string(), true))? + .get(url); + if profile.kind == "openai" { + let secret = keyring::Entry::new("com.app.desktop", "openai") + .ok() + .and_then(|entry| entry.get_password().ok()) + .ok_or_else(|| { + CommandError::new( + "CREDENTIAL_MISSING", + "Save the OpenAI credential in the system vault first.", + true, + ) + })?; + request = request.bearer_auth(secret); + } + let response = match request.send() { + Ok(response) => response, + Err(error) => { + return Ok(ConnectionResult { + ok: false, + message: format!("Could not reach {}: {}", profile.name, error), + }); + } + }; + if !response.status().is_success() { return Ok(ConnectionResult { ok: false, message: format!( - "Ollama is running, but model '{}' is not installed. Available: {}.", - requested, - installed - .iter() - .take(5) - .copied() - .collect::>() - .join(", ") + "{} responded with status {}.", + profile.name, + response.status() ), }); } + if profile.kind == "ollama" { + let value: Value = response + .json() + .map_err(|error| CommandError::new("PROVIDER_RESPONSE", error.to_string(), true))?; + let requested = profile.model.trim(); + let installed = value + .get("models") + .and_then(Value::as_array) + .into_iter() + .flatten() + .filter_map(|model| model.get("name").and_then(Value::as_str)) + .collect::>(); + let available = installed.iter().any(|name| { + *name == requested + || name.strip_suffix(":latest") == Some(requested) + || requested.strip_suffix(":latest") == Some(*name) + }); + if !available { + return Ok(ConnectionResult { + ok: false, + message: format!( + "Ollama is running, but model '{}' is not installed. Available: {}.", + requested, + installed + .iter() + .take(5) + .copied() + .collect::>() + .join(", ") + ), + }); + } + } + Ok(ConnectionResult { + ok: true, + message: format!("{} is ready with {}.", profile.name, profile.model), + }) + })(); + match outcome { + Ok(result) if result.ok => { + let created_at = provenance::identifiers::timestamp_millis(); + provenance::phase1::apply_command( + &root, + &manifest.project_id, + provenance::phase1::Phase1Command { + client_action_id: format!("{client_action_id}:response"), + actor: "system".to_owned(), + summary: "Provider connectivity test succeeded".to_owned(), + occurred_at: created_at.clone(), + operation: provenance::phase1::Phase1Operation::ProviderInvocationResponded { + invocation_id, + retained_text: result.message.clone(), + content_sha256: provenance::phase1::canonical_text_digest(&result.message)?, + created_at, + }, + }, + )?; + Ok(result) + } + Ok(result) => { + let occurred_at = provenance::identifiers::timestamp_millis(); + provenance::phase1::apply_command( + &root, + &manifest.project_id, + provenance::phase1::Phase1Command { + client_action_id: format!("{client_action_id}:failure"), + actor: "system".to_owned(), + summary: "Provider connectivity test failed".to_owned(), + occurred_at: occurred_at.clone(), + operation: provenance::phase1::Phase1Operation::ProviderInvocationFailed { + invocation_id, + code: "PROVIDER_TEST_FAILED".to_owned(), + bounded_summary: result.message.chars().take(512).collect(), + recoverable: true, + occurred_at, + }, + }, + )?; + Ok(result) + } + Err(error) => { + let occurred_at = provenance::identifiers::timestamp_millis(); + provenance::phase1::apply_command( + &root, + &manifest.project_id, + provenance::phase1::Phase1Command { + client_action_id: format!("{client_action_id}:failure"), + actor: "system".to_owned(), + summary: "Provider connectivity test failed".to_owned(), + occurred_at: occurred_at.clone(), + operation: provenance::phase1::Phase1Operation::ProviderInvocationFailed { + invocation_id, + code: error.code.clone(), + bounded_summary: error.message.chars().take(512).collect(), + recoverable: error.recoverable, + occurred_at, + }, + }, + )?; + Err(error) + } } - Ok(ConnectionResult { - ok: true, - message: format!("{} is ready with {}.", profile.name, profile.model), - }) } - fn pdf_bytes(title: &str, manuscript: &str) -> Vec { let mut lines = vec![title.to_string()]; lines.extend( @@ -999,9 +1453,9 @@ fn pdf_bytes(title: &str, manuscript: &str) -> Vec { pdf } fn file_hash(path: &Path) -> CommandResult { - Ok(hex::encode(Sha256::digest(fs::read(path).map_err( - |e| CommandError::io("Could not hash export", e), - )?))) + Ok(provenance::canonical::sha256_digest( + &fs::read(path).map_err(|e| CommandError::io("Could not hash export", e))?, + )) } #[tauri::command] @@ -1069,7 +1523,32 @@ fn export_project( atomic_write(&p, &pdf_bytes(&manifest.title, &markdown))?; p } - "evidence" => create_evidence(&root, &manifest, sanitized)?, + "evidence" => { + let result = provenance::export::create_harp_exports( + &root, + &manifest.project_id, + provenance::export::HarpExportRequest { + redact_personal_identifiers: sanitized, + }, + )?; + let role = if sanitized { + "sanitized_supporting_archive" + } else { + "full_private_archive" + }; + let artifact = result + .artifacts + .iter() + .find(|artifact| artifact.role == role) + .ok_or_else(|| { + CommandError::new( + "HARP_EXPORT_MISSING", + "The requested HARP archive was not created.", + false, + ) + })?; + root.join(artifact.path.replace('/', std::path::MAIN_SEPARATOR_STR)) + } _ => { return Err(CommandError::new( "FORMAT_UNSUPPORTED", @@ -1080,7 +1559,7 @@ fn export_project( }; append_event( &root, - &manifest.id, + &manifest.project_id, "EXPORT_CREATED", "user", &format!("Created {format} export"), @@ -1094,58 +1573,6 @@ fn escape_html(value: &str) -> String { .replace('<', "<") .replace('>', ">") } -fn create_evidence( - root: &Path, - manifest: &ProjectManifest, - sanitized: bool, -) -> CommandResult { - let destination = root - .join("exports") - .join(format!("{}-evidence.zip", manifest.id)); - let temp = destination.with_extension("zip.tmp"); - let file = fs::File::create(&temp) - .map_err(|e| CommandError::io("Could not create evidence package", e))?; - let mut zip = ZipWriter::new(file); - let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Deflated); - let markdown = fs::read(root.join("manuscript/manuscript.md")) - .map_err(|e| CommandError::io("Could not read manuscript", e))?; - zip.start_file("final-manuscript.md", options) - .map_err(|e| CommandError::new("EXPORT_ERROR", e.to_string(), true))?; - zip.write_all(&markdown) - .map_err(|e| CommandError::io("Could not write evidence", e))?; - let report=format!("# Creative Process Record\n\nProject: {}\n\nThis package records creative-process relationships and is not a legal conclusion.\n\nSanitized subset: {}\n\nHistory events are hash-chained with SHA-256.\n",manifest.title,sanitized); - zip.start_file("creative-process-report.md", options) - .map_err(|e| CommandError::new("EXPORT_ERROR", e.to_string(), true))?; - zip.write_all(report.as_bytes()) - .map_err(|e| CommandError::io("Could not write report", e))?; - if !sanitized { - let events = fs::read(root.join("provenance/events.jsonl")) - .map_err(|e| CommandError::io("Could not read provenance", e))?; - zip.start_file("provenance-events.jsonl", options) - .map_err(|e| CommandError::new("EXPORT_ERROR", e.to_string(), true))?; - zip.write_all(&events) - .map_err(|e| CommandError::io("Could not write provenance", e))?; - } - let export_manifest = json!({"schemaVersion":SCHEMA_VERSION,"projectId":manifest.id,"createdAt":Utc::now().to_rfc3339(),"applicationVersion":APP_VERSION,"sanitized":sanitized,"provenanceChainHead":head_hash(root)?,"files":[{"path":"final-manuscript.md","sha256":hex::encode(Sha256::digest(&markdown))}]}); - zip.start_file("export-manifest.json", options) - .map_err(|e| CommandError::new("EXPORT_ERROR", e.to_string(), true))?; - zip.write_all( - serde_json::to_string_pretty(&export_manifest) - .unwrap() - .as_bytes(), - ) - .map_err(|e| CommandError::io("Could not write manifest", e))?; - zip.finish() - .map_err(|e| CommandError::new("EXPORT_ERROR", e.to_string(), true))?; - if destination.exists() { - fs::remove_file(&destination) - .map_err(|e| CommandError::io("Could not replace evidence package", e))?; - } - fs::rename(&temp, &destination) - .map_err(|e| CommandError::io("Could not finalize evidence package", e))?; - Ok(destination) -} - fn add_tree_to_zip(zip: &mut ZipWriter, root: &Path) -> CommandResult> { let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Deflated); let mut files = Vec::new(); @@ -1177,7 +1604,7 @@ fn add_tree_to_zip(zip: &mut ZipWriter, root: &Path) -> CommandResult< zip.write_all(&bytes) .map_err(|e| CommandError::io("Could not write backup file", e))?; files.push( - json!({"path":name,"sha256":hex::encode(Sha256::digest(&bytes)),"size":bytes.len()}), + json!({"path":name,"sha256":provenance::canonical::sha256_digest(&bytes),"size":bytes.len()}), ); } Ok(files) @@ -1190,7 +1617,7 @@ fn create_backup(state: State) -> CommandResult { let _ = snapshot(&root); let destination = root .join("exports") - .join(format!("{}-backup.zip", manifest.id)); + .join(format!("{}-backup.zip", manifest.project_id)); let temp = destination.with_extension("zip.tmp"); fs::create_dir_all(destination.parent().unwrap()) .map_err(|e| CommandError::io("Could not create export folder", e))?; @@ -1198,29 +1625,21 @@ fn create_backup(state: State) -> CommandResult { fs::File::create(&temp).map_err(|e| CommandError::io("Could not create backup", e))?; let mut zip = ZipWriter::new(file); let files = add_tree_to_zip(&mut zip, &root)?; - let backup_manifest = json!({"schemaVersion":SCHEMA_VERSION,"applicationVersion":APP_VERSION,"projectId":manifest.id,"createdAt":Utc::now().to_rfc3339(),"files":files}); + let backup_manifest = json!({"schemaVersion":SCHEMA_VERSION,"applicationVersion":APP_VERSION,"projectId":manifest.project_id,"createdAt":provenance::identifiers::timestamp_millis(),"files":files}); zip.start_file( "backup-manifest.json", SimpleFileOptions::default().compression_method(zip::CompressionMethod::Deflated), ) .map_err(|e| CommandError::new("BACKUP_ERROR", e.to_string(), true))?; - zip.write_all( - serde_json::to_string_pretty(&backup_manifest) - .unwrap() - .as_bytes(), - ) - .map_err(|e| CommandError::io("Could not write backup manifest", e))?; + zip.write_all(&provenance::canonical::canonicalize(&backup_manifest)?) + .map_err(|e| CommandError::io("Could not write backup manifest", e))?; zip.finish() .map_err(|e| CommandError::new("BACKUP_ERROR", e.to_string(), true))?; - if destination.exists() { - fs::remove_file(&destination) - .map_err(|e| CommandError::io("Could not replace backup", e))?; - } - fs::rename(&temp, &destination) - .map_err(|e| CommandError::io("Could not finalize backup", e))?; + provenance::ledger::atomic_replace(&temp, &destination)?; + provenance::ledger::sync_directory(destination.parent().unwrap())?; append_event( &root, - &manifest.id, + &manifest.project_id, "BACKUP_CREATED", "user", "Created restorable project backup", @@ -1235,6 +1654,25 @@ fn import_backup(archive_path: String, destination: String) -> CommandResult 10_000 { return Err(CommandError::new( "BACKUP_LIMIT", @@ -1330,6 +1768,7 @@ fn rebuild_repository(state: State) -> CommandResult<()> { "manuscript", "ideas", "conversations", + "deposits", "provenance", "style", ], @@ -1341,7 +1780,7 @@ fn rebuild_repository(state: State) -> CommandResult<()> { let manifest = read_manifest(&root)?; append_event( &root, - &manifest.id, + &manifest.project_id, "PROVENANCE_REBUILT", "system", "Rebuilt project history from canonical files", @@ -1364,18 +1803,25 @@ fn finalize_release(state: State) -> CommandResult { true, )); } + let verification = provenance::verify_project(&root, &manifest.project_id)?; + provenance::verifier::require_release_verification(&verification)?; manifest.publication_status = "finalized".into(); - manifest.updated_at = Utc::now().to_rfc3339(); + manifest.updated_at = provenance::identifiers::timestamp_millis(); write_json(&root.join("project.json"), &manifest)?; let release = format!("release-{}", Utc::now().format("%Y%m%d-%H%M%S")); append_event( &root, - &manifest.id, + &manifest.project_id, "RELEASE_FINALIZED", "user", &format!("Finalized {release}"), json!({"releaseId":release}), )?; + provenance::contribution_map::freeze_current( + &root, + &manifest.project_id, + provenance::contribution_map::ContributionMapRequest::default(), + )?; run_git( &root, &[ @@ -1384,6 +1830,7 @@ fn finalize_release(state: State) -> CommandResult { "manuscript", "ideas", "conversations", + "deposits", "provenance", "style", ], @@ -1415,31 +1862,6 @@ fn diagnostics(state: State) -> Value { json!({"applicationVersion":APP_VERSION,"schemaVersion":SCHEMA_VERSION,"platform":std::env::consts::OS,"projectOpen":project.is_some(),"projectPath":project,"audioRetention":false,"promptLogging":false,"responseLogging":false}) } -#[tauri::command] -fn load_project_state(state: State) -> CommandResult> { - let root = active_path(&state)?; - let db = init_db(&root)?; - let mut statement = db - .prepare("SELECT json FROM project_state WHERE id=1") - .map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - let mut rows = statement - .query([]) - .map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - if let Some(row) = rows - .next() - .map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))? - { - let raw: String = row - .get(0) - .map_err(|e| CommandError::new("DATABASE_ERROR", e.to_string(), true))?; - Ok(Some(serde_json::from_str(&raw).map_err(|e| { - CommandError::new("PROJECT_INVALID", e.to_string(), true) - })?)) - } else { - Ok(None) - } -} - #[tauri::command] fn generate_text( app: AppHandle, @@ -1447,6 +1869,10 @@ fn generate_text( prompt_variables: HashMap, cloud_approved: bool, purpose: String, + client_action_id: String, + invocation_id: String, + session_id: String, + state: State, ) -> CommandResult { if profile.mode == "cloud" && !cloud_approved { return Err(CommandError::new( @@ -1455,65 +1881,159 @@ fn generate_text( true, )); } - let (system, prompt) = prompts_for_request(&app, &purpose, prompt_variables)?; - let client = reqwest::blocking::Client::builder() - .timeout(std::time::Duration::from_secs(90)) - .build() - .map_err(|e| CommandError::new("PROVIDER_ERROR", e.to_string(), true))?; - let (url, body) = if profile.kind == "ollama" { - ( - format!("{}/api/chat", profile.endpoint.trim_end_matches('/')), - json!({"model":profile.model,"stream":false,"messages":[{"role":"system","content":system},{"role":"user","content":prompt}]}), - ) + let root = active_path(&state)?; + let manifest = read_manifest(&root)?; + let context_value = serde_json::to_value(&prompt_variables) + .map_err(|error| CommandError::new("SERIALIZE_ERROR", error.to_string(), false))?; + let context_sha256 = provenance::canonical::canonical_digest(&context_value)?; + let prompt_purpose = if purpose == "distillation" { + "drafting" } else { - ( - format!( - "{}/chat/completions", - profile.endpoint.trim_end_matches('/') - ), - json!({"model":profile.model,"stream":false,"messages":[{"role":"system","content":system},{"role":"user","content":prompt}]}), - ) + &purpose }; - let mut request = client.post(url).json(&body); - if profile.kind != "ollama" { - if let Ok(entry) = keyring::Entry::new("com.thinkloom.desktop", &profile.kind) { - if let Ok(secret) = entry.get_password() { - request = request.bearer_auth(secret); + let (system, prompt) = prompts_for_request(&app, prompt_purpose, prompt_variables)?; + let provider = provenance::phase1::Phase1Provider { + kind: profile.kind.clone(), + name: profile.name.clone(), + endpoint: profile.endpoint.clone(), + model: profile.model.clone(), + mode: profile.mode.clone(), + connected: true, + }; + let requested_at = provenance::identifiers::timestamp_millis(); + let request = provenance::phase1::Phase1Command { + client_action_id: format!("{client_action_id}:request"), + actor: "user".to_owned(), + summary: format!("Requested {purpose} provider invocation"), + occurred_at: requested_at.clone(), + operation: provenance::phase1::Phase1Operation::ProviderInvocationRequested { + invocation: provenance::phase1::ProviderInvocation { + invocation_id: invocation_id.clone(), + purpose: purpose.clone(), + session_id, + provider, + prompt_template_sha256: provenance::phase1::canonical_text_digest(&system)?, + input_sha256: provenance::phase1::canonical_text_digest(&prompt)?, + context_sha256, + requested_at, + }, + }, + }; + let requested = provenance::phase1::apply_command(&root, &manifest.project_id, request)?; + if let Some(completed) = requested.projection.invocations.get(&invocation_id) { + if completed.status == "responded" { + if let Some(text) = &completed.retained_text { + return Ok(text.clone()); } } } - let response = request.send().map_err(|e| { - CommandError::new( - "PROVIDER_UNAVAILABLE", - format!("The request is preserved and can be retried: {e}"), - true, - ) - })?; - if !response.status().is_success() { - return Err(CommandError::new( - "PROVIDER_RESPONSE", - format!( - "The provider returned {}. The request is preserved for retry.", - response.status() - ), - true, - )); - } - let value: Value = response - .json() - .map_err(|e| CommandError::new("STRUCTURED_OUTPUT_INVALID", e.to_string(), true))?; - value - .pointer("/message/content") - .or_else(|| value.pointer("/choices/0/message/content")) - .and_then(Value::as_str) - .map(str::to_owned) - .ok_or_else(|| { + + // No CPL writer lock is held while provider I/O runs. + let provider_outcome = (|| -> CommandResult { + let client = reqwest::blocking::Client::builder() + .timeout(std::time::Duration::from_secs(90)) + .build() + .map_err(|e| CommandError::new("PROVIDER_ERROR", e.to_string(), true))?; + let (url, body) = if profile.kind == "ollama" { + ( + format!("{}/api/chat", profile.endpoint.trim_end_matches('/')), + json!({"model":profile.model,"stream":false,"messages":[{"role":"system","content":system},{"role":"user","content":prompt}]}), + ) + } else { + ( + format!( + "{}/chat/completions", + profile.endpoint.trim_end_matches('/') + ), + json!({"model":profile.model,"stream":false,"messages":[{"role":"system","content":system},{"role":"user","content":prompt}]}), + ) + }; + let mut request = client.post(url).json(&body); + if profile.kind != "ollama" { + if let Ok(entry) = keyring::Entry::new("com.app.desktop", &profile.kind) { + if let Ok(secret) = entry.get_password() { + request = request.bearer_auth(secret); + } + } + } + let response = request.send().map_err(|e| { CommandError::new( - "STRUCTURED_OUTPUT_INVALID", - "The provider returned no usable passage. Retry or switch providers.", + "PROVIDER_UNAVAILABLE", + format!("The request is preserved and can be retried: {e}"), true, ) - }) + })?; + if !response.status().is_success() { + return Err(CommandError::new( + "PROVIDER_RESPONSE", + format!( + "The provider returned {}. The request is preserved for retry.", + response.status() + ), + true, + )); + } + let value: Value = response + .json() + .map_err(|e| CommandError::new("STRUCTURED_OUTPUT_INVALID", e.to_string(), true))?; + value + .pointer("/message/content") + .or_else(|| value.pointer("/choices/0/message/content")) + .and_then(Value::as_str) + .map(str::to_owned) + .ok_or_else(|| { + CommandError::new( + "STRUCTURED_OUTPUT_INVALID", + "The provider returned no usable passage. Retry or switch providers.", + true, + ) + }) + })(); + + match provider_outcome { + Ok(text) => { + let created_at = provenance::identifiers::timestamp_millis(); + provenance::phase1::apply_command( + &root, + &manifest.project_id, + provenance::phase1::Phase1Command { + client_action_id: format!("{client_action_id}:response"), + actor: "assistant".to_owned(), + summary: format!("Retained {purpose} provider response"), + occurred_at: created_at.clone(), + operation: provenance::phase1::Phase1Operation::ProviderInvocationResponded { + invocation_id, + retained_text: text.clone(), + content_sha256: provenance::phase1::canonical_text_digest(&text)?, + created_at, + }, + }, + )?; + Ok(text) + } + Err(error) => { + let occurred_at = provenance::identifiers::timestamp_millis(); + let bounded_summary = error.message.chars().take(512).collect::(); + provenance::phase1::apply_command( + &root, + &manifest.project_id, + provenance::phase1::Phase1Command { + client_action_id: format!("{client_action_id}:failure"), + actor: "system".to_owned(), + summary: format!("Recorded failed {purpose} provider invocation"), + occurred_at: occurred_at.clone(), + operation: provenance::phase1::Phase1Operation::ProviderInvocationFailed { + invocation_id, + code: error.code.clone(), + bounded_summary, + recoverable: error.recoverable, + occurred_at, + }, + }, + )?; + Err(error) + } + } } #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { @@ -1523,9 +2043,24 @@ pub fn run() { choose_project_folder, create_project, open_project, - load_project_state, - persist_state, + show_project_folder, + create_legacy_preservation_archive, + load_phase1_projection, + apply_phase1_command, + refresh_non_phase1_files, + apply_composition_command, + load_composition_projection, + ensure_composition_projection, + freeze_contribution_map, + load_contribution_map, + load_cpl_explorer, + prepare_harp, + generate_harp, + export_harp_artifacts, + verify_harp_sanitized_archive, + load_harp, verify_provenance, + recover_provenance, create_checkpoint, store_provider_secret, delete_provider_secret, @@ -1583,14 +2118,19 @@ mod tests { let temp = tempfile::tempdir().unwrap(); project_layout(temp.path()).unwrap(); let manifest = ProjectManifest { + project_format: project_format::PROJECT_FORMAT.into(), + project_format_version: project_format::PROJECT_FORMAT_VERSION.into(), + provenance_conformance: project_format::PROVENANCE_CONFORMANCE.into(), schema_version: SCHEMA_VERSION.into(), application_version: APP_VERSION.into(), - id: "test".into(), + project_id: "test".into(), + description: String::new(), title: "Test".into(), - created_at: Utc::now().to_rfc3339(), - updated_at: Utc::now().to_rfc3339(), + created_at: provenance::identifiers::timestamp_millis(), + updated_at: provenance::identifiers::timestamp_millis(), current_phase: "ideation".into(), publication_status: "working".into(), + provenance_policy_id: "policy_test".into(), audio_retained: false, }; write_json(&temp.path().join("project.json"), &manifest).unwrap(); @@ -1603,13 +2143,25 @@ mod tests { json!({}), ) .unwrap(); - assert!(verify_chain_at(temp.path()).unwrap()); - let journal = temp.path().join("provenance/events.jsonl"); + assert!(matches!( + provenance::verify_project(temp.path(), "test") + .unwrap() + .status, + provenance::VerificationStatus::Verified + )); + let journal = temp + .path() + .join("provenance/ledger/active/segment-000001.jsonl"); let changed = fs::read_to_string(&journal) .unwrap() .replace("Created", "Changed"); fs::write(&journal, changed).unwrap(); - assert!(!verify_chain_at(temp.path()).unwrap()); + assert_eq!( + provenance::verify_project(temp.path(), "test") + .unwrap() + .status, + provenance::VerificationStatus::Failed + ); } #[test] fn project_layout_never_creates_audio_files() { diff --git a/src-tauri/src/project_format.rs b/src-tauri/src/project_format.rs new file mode 100644 index 0000000..91fca90 --- /dev/null +++ b/src-tauri/src/project_format.rs @@ -0,0 +1,463 @@ +//! Project-format classification and legacy preservation boundaries. +//! +//! Inspection is deliberately read-only. Only an exact supported marker can +//! proceed to CPL recovery; every other recognized project remains read-only. + +use crate::provenance::{canonical::sha256_digest, CplError, CplResult}; +use serde::Serialize; +use serde_json::Value; +use std::{ + fs::{self, File}, + io::{Read, Write}, + path::Path, +}; +use walkdir::WalkDir; +use zip::{write::SimpleFileOptions, CompressionMethod, ZipWriter}; + +pub const PROJECT_FORMAT: &str = "thinkloom-cpl"; +pub const PROJECT_FORMAT_VERSION: &str = "1.0"; +pub const PROVENANCE_CONFORMANCE: &str = "cpl-1.0"; + +pub fn manifest_has_supported_marker(bytes: &[u8]) -> bool { + serde_json::from_slice::(bytes).is_ok_and(|value| { + value.get("project_format").and_then(Value::as_str) == Some(PROJECT_FORMAT) + && value.get("project_format_version").and_then(Value::as_str) + == Some(PROJECT_FORMAT_VERSION) + && value.get("provenance_conformance").and_then(Value::as_str) + == Some(PROVENANCE_CONFORMANCE) + }) +} + +pub const REQUIRED_DIRECTORIES: &[&str] = &[ + "records", + "provenance/ledger/active", + "provenance/ledger/sealed", + "reports", + ".app", + ".app/locks", + ".app/temp", + ".app/recovery", +]; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum ProjectClassification { + CplConforming, + LegacyPreviewReadOnly, + UnsupportedReadOnly, + CplBlocked, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ProjectInspection { + pub classification: ProjectClassification, + pub message: String, +} + +pub fn initialize_conforming_layout(root: &Path) -> CplResult<()> { + for directory in [ + "manuscript/sections", + "ideas", + "conversations/transcripts", + "records/conversations", + "records/invocations", + "records/prompt-templates", + "records/sources", + "records/transformations", + "records/composition", + "provenance/schema", + "provenance/ledger/active", + "provenance/ledger/sealed", + "provenance/indexes", + "provenance/integrity", + "provenance/report-config", + "releases", + "deposits", + "reports/harp", + "assets", + ".app/locks", + ".app/temp", + ".app/temp/staging", + ".app/recovery/orphans", + ".app/snapshots", + ] { + fs::create_dir_all(root.join(directory)).map_err(|error| { + CplError::io("Could not create the conforming project layout", error) + })?; + } + Ok(()) +} + +pub fn inspect_project(root: &Path) -> CplResult { + let manifest_path = root.join("project.json"); + if !manifest_path.is_file() { + return Err(CplError::new( + "PROJECT_INVALID", + "The selected folder does not contain project.json.", + false, + )); + } + let bytes = fs::read(&manifest_path) + .map_err(|error| CplError::io("Could not read the project marker", error))?; + let value: Value = match serde_json::from_slice(&bytes) { + Ok(value) => value, + Err(_) => { + return Ok(ProjectInspection { + classification: ProjectClassification::UnsupportedReadOnly, + message: "The project manifest is not valid JSON. It was not modified, recovered, or verified.".to_owned(), + }) + } + }; + + let format = value.get("project_format").and_then(Value::as_str); + let version = value.get("project_format_version").and_then(Value::as_str); + let conformance = value.get("provenance_conformance").and_then(Value::as_str); + let marker_absent = [ + "project_format", + "project_format_version", + "provenance_conformance", + ] + .iter() + .all(|key| value.get(key).is_none()); + if marker_absent { + return Ok(ProjectInspection { + classification: ProjectClassification::LegacyPreviewReadOnly, + message: "Legacy preview project detected. Migration is deferred until after Thinkloom 1.0.0; only folder access and a byte-preserving preservation archive are available.".to_owned(), + }); + } + if format != Some(PROJECT_FORMAT) + || version != Some(PROJECT_FORMAT_VERSION) + || conformance != Some(PROVENANCE_CONFORMANCE) + { + return Ok(ProjectInspection { + classification: ProjectClassification::UnsupportedReadOnly, + message: "The project has an incomplete or unsupported CPL marker. It was not modified, recovered, or verified.".to_owned(), + }); + } + + let missing = REQUIRED_DIRECTORIES + .iter() + .filter(|relative| { + let path = root.join(relative); + !path.is_dir() + || fs::symlink_metadata(&path) + .is_ok_and(|metadata| metadata.file_type().is_symlink()) + }) + .copied() + .collect::>(); + if !missing.is_empty() { + return Ok(ProjectInspection { + classification: ProjectClassification::CplBlocked, + message: format!( + "The CPL marker is present, but the required project structure is incomplete: {}. No recovery was attempted.", + missing.join(", ") + ), + }); + } + + Ok(ProjectInspection { + classification: ProjectClassification::CplConforming, + message: "The exact supported CPL 1.0 marker and required project structure are present." + .to_owned(), + }) +} + +#[derive(Debug, Clone, PartialEq, Eq)] +struct InventoryEntry { + path: String, + kind: &'static str, + digest_or_target: String, +} + +fn source_inventory(source: &Path) -> CplResult> { + let mut entries = Vec::new(); + for entry in WalkDir::new(source).follow_links(false).into_iter() { + let entry = entry.map_err(|error| { + CplError::new( + "LEGACY_ARCHIVE_READ_FAILED", + format!("Could not inspect the legacy project: {error}"), + true, + ) + })?; + if entry.path() == source { + continue; + } + let relative = entry + .path() + .strip_prefix(source) + .map_err(|error| CplError::new("LEGACY_ARCHIVE_PATH_FAILED", error.to_string(), false))? + .to_string_lossy() + .replace('\\', "/"); + let metadata = fs::symlink_metadata(entry.path()) + .map_err(|error| CplError::io("Could not inspect a legacy project entry", error))?; + if metadata.file_type().is_symlink() { + let target = fs::read_link(entry.path()) + .map_err(|error| CplError::io("Could not read a legacy project link", error))?; + entries.push(InventoryEntry { + path: relative, + kind: "symlink", + digest_or_target: target.to_string_lossy().into_owned(), + }); + } else if metadata.is_dir() { + entries.push(InventoryEntry { + path: relative, + kind: "directory", + digest_or_target: String::new(), + }); + } else if metadata.is_file() { + entries.push(InventoryEntry { + path: relative, + kind: "file", + digest_or_target: sha256_digest(&fs::read(entry.path()).map_err(|error| { + CplError::io("Could not read a legacy project file", error) + })?), + }); + } else { + return Err(CplError::new( + "LEGACY_ARCHIVE_UNSUPPORTED_ENTRY", + format!("The legacy project contains an unsupported entry: {relative}"), + false, + )); + } + } + entries.sort_by(|left, right| left.path.as_bytes().cmp(right.path.as_bytes())); + Ok(entries) +} + +pub fn create_legacy_preservation_archive(source: &Path, destination: &Path) -> CplResult<()> { + let inspection = inspect_project(source)?; + if inspection.classification != ProjectClassification::LegacyPreviewReadOnly { + return Err(CplError::new( + "LEGACY_ARCHIVE_NOT_PERMITTED", + "Preservation archives are available only for unmarked legacy preview projects.", + false, + )); + } + let source = fs::canonicalize(source) + .map_err(|error| CplError::io("Could not resolve the legacy project folder", error))?; + let parent = destination.parent().ok_or_else(|| { + CplError::new( + "LEGACY_ARCHIVE_PATH_INVALID", + "The preservation archive destination has no parent folder.", + false, + ) + })?; + let parent = fs::canonicalize(parent) + .map_err(|error| CplError::io("Could not resolve the archive destination", error))?; + let destination = parent.join(destination.file_name().ok_or_else(|| { + CplError::new( + "LEGACY_ARCHIVE_PATH_INVALID", + "Choose a complete ZIP destination.", + false, + ) + })?); + if destination.starts_with(&source) { + return Err(CplError::new( + "LEGACY_ARCHIVE_INSIDE_PROJECT", + "The preservation archive must be saved outside the legacy project so the source remains untouched.", + false, + )); + } + + let before = source_inventory(&source)?; + let temporary = parent.join(format!( + ".{}.{}.tmp", + destination + .file_name() + .and_then(|name| name.to_str()) + .unwrap_or("legacy-preservation.zip"), + uuid::Uuid::new_v4() + )); + let result = (|| -> CplResult<()> { + let file = File::create(&temporary) + .map_err(|error| CplError::io("Could not create the preservation archive", error))?; + let mut zip = ZipWriter::new(file); + let stored = SimpleFileOptions::default().compression_method(CompressionMethod::Stored); + zip.start_file("PRESERVATION-NOTICE.txt", stored) + .map_err(zip_error)?; + zip.write_all(b"Legacy preview-project preservation archive\nNot verified, converted, or CPL-conforming\nMigration is deferred until after Thinkloom 1.0.0.\n") + .map_err(|error| CplError::io("Could not write the preservation label", error))?; + + for item in &before { + let archive_path = format!("legacy-project/{}", item.path); + let source_path = item + .path + .split('/') + .fold(source.clone(), |path, component| path.join(component)); + match item.kind { + "directory" => zip + .add_directory(format!("{archive_path}/"), stored) + .map_err(zip_error)?, + "symlink" => { + let link_options = stored.unix_permissions(0o120777); + zip.start_file(archive_path, link_options) + .map_err(zip_error)?; + zip.write_all(item.digest_or_target.as_bytes()) + .map_err(|error| { + CplError::io("Could not preserve a legacy project link", error) + })?; + } + "file" => { + zip.start_file(archive_path, stored).map_err(zip_error)?; + let mut input = File::open(&source_path).map_err(|error| { + CplError::io("Could not read a legacy project file", error) + })?; + let mut bytes = Vec::new(); + input.read_to_end(&mut bytes).map_err(|error| { + CplError::io("Could not read a legacy project file", error) + })?; + zip.write_all(&bytes).map_err(|error| { + CplError::io("Could not preserve a legacy project file", error) + })?; + } + _ => unreachable!(), + } + } + let file = zip.finish().map_err(zip_error)?; + file.sync_all() + .map_err(|error| CplError::io("Could not flush the preservation archive", error))?; + crate::provenance::ledger::atomic_replace(&temporary, &destination)?; + crate::provenance::ledger::sync_directory(&parent)?; + Ok(()) + })(); + if result.is_err() { + let _ = fs::remove_file(&temporary); + return result; + } + let after = source_inventory(&source)?; + if before != after { + let _ = fs::remove_file(&destination); + return Err(CplError::new( + "LEGACY_PROJECT_CHANGED_DURING_ARCHIVE", + "The legacy project changed while it was being archived. The incomplete archive was removed; retry after writes stop.", + true, + )); + } + Ok(()) +} + +fn zip_error(error: zip::result::ZipError) -> CplError { + CplError::new("LEGACY_ARCHIVE_FAILED", error.to_string(), true) +} + +#[cfg(test)] +mod tests { + use super::*; + use std::io::Read; + use tempfile::tempdir; + use zip::ZipArchive; + + fn write_manifest(root: &Path, value: Value) { + fs::write( + root.join("project.json"), + serde_json::to_vec(&value).unwrap(), + ) + .unwrap(); + } + + #[test] + fn schema_version_without_marker_is_legacy_and_inspection_is_read_only() { + let temp = tempdir().unwrap(); + write_manifest( + temp.path(), + serde_json::json!({"schemaVersion":"1.0","applicationVersion":"0.5.3"}), + ); + fs::write(temp.path().join("original.bin"), [0, 1, 2, 255]).unwrap(); + let before = source_inventory(temp.path()).unwrap(); + let result = inspect_project(temp.path()).unwrap(); + assert_eq!( + result.classification, + ProjectClassification::LegacyPreviewReadOnly + ); + assert_eq!(before, source_inventory(temp.path()).unwrap()); + } + + #[test] + fn exact_marker_requires_the_complete_layout() { + let temp = tempdir().unwrap(); + write_manifest( + temp.path(), + serde_json::json!({ + "project_format": PROJECT_FORMAT, + "project_format_version": PROJECT_FORMAT_VERSION, + "provenance_conformance": PROVENANCE_CONFORMANCE + }), + ); + assert_eq!( + inspect_project(temp.path()).unwrap().classification, + ProjectClassification::CplBlocked + ); + initialize_conforming_layout(temp.path()).unwrap(); + assert_eq!( + inspect_project(temp.path()).unwrap().classification, + ProjectClassification::CplConforming + ); + } + + #[test] + fn unsupported_or_partial_marker_never_enters_cpl_recovery() { + let temp = tempdir().unwrap(); + write_manifest( + temp.path(), + serde_json::json!({ + "project_format": PROJECT_FORMAT, + "project_format_version": "2.0", + "provenance_conformance": PROVENANCE_CONFORMANCE + }), + ); + assert_eq!( + inspect_project(temp.path()).unwrap().classification, + ProjectClassification::UnsupportedReadOnly + ); + } + + #[test] + fn preservation_archive_retains_source_bytes_without_changing_source() { + let source_parent = tempdir().unwrap(); + let source = source_parent.path().join("preview"); + fs::create_dir_all(source.join("nested")).unwrap(); + write_manifest( + &source, + serde_json::json!({"schemaVersion":"1.0","applicationVersion":"0.5.3"}), + ); + let original = [0, 13, 10, 255, 128, 42]; + fs::write(source.join("nested/data.bin"), original).unwrap(); + let before = source_inventory(&source).unwrap(); + let destination_parent = tempdir().unwrap(); + let destination = destination_parent.path().join("preview-preservation.zip"); + create_legacy_preservation_archive(&source, &destination).unwrap(); + assert_eq!(before, source_inventory(&source).unwrap()); + + let mut archive = ZipArchive::new(File::open(destination).unwrap()).unwrap(); + let mut restored = Vec::new(); + archive + .by_name("legacy-project/nested/data.bin") + .unwrap() + .read_to_end(&mut restored) + .unwrap(); + assert_eq!(restored, original); + let mut notice = String::new(); + archive + .by_name("PRESERVATION-NOTICE.txt") + .unwrap() + .read_to_string(&mut notice) + .unwrap(); + assert!(notice.contains("Not verified, converted, or CPL-conforming")); + } + #[test] + fn preservation_archive_cannot_write_inside_the_legacy_project() { + let source = tempdir().unwrap(); + write_manifest( + source.path(), + serde_json::json!({"schemaVersion":"1.0","applicationVersion":"0.5.3"}), + ); + fs::write(source.path().join("original.txt"), b"unchanged").unwrap(); + let before = source_inventory(source.path()).unwrap(); + let destination = source.path().join("preservation.zip"); + let error = create_legacy_preservation_archive(source.path(), &destination) + .expect_err("an archive inside the source must be refused"); + assert_eq!(error.code, "LEGACY_ARCHIVE_INSIDE_PROJECT"); + assert_eq!(before, source_inventory(source.path()).unwrap()); + assert!(!destination.exists()); + } +} diff --git a/src-tauri/src/provenance/assertions.rs b/src-tauri/src/provenance/assertions.rs new file mode 100644 index 0000000..c558750 --- /dev/null +++ b/src-tauri/src/provenance/assertions.rs @@ -0,0 +1,57 @@ +use super::records::CplRecord; + +const PREDICATES: &[&str] = &[ + "derived_from", + "generated_by", + "modified_by_human", + "selected_by_human", + "arranged_by_human", + "included_in_deposit", +]; + +const EVALUATION_STATUSES: &[&str] = &["exact", "degraded", "refused", "stale", "unverified"]; + +pub fn validate_record(record: &CplRecord) -> Result<(), String> { + match record.record_type.as_str() { + "provenance-assertion" => { + let predicate = record + .payload + .get("predicate") + .and_then(|value| value.as_str()) + .ok_or("A provenance assertion requires a predicate.")?; + if !PREDICATES.contains(&predicate) { + return Err(format!( + "Unknown composition assertion predicate '{predicate}'." + )); + } + if !record + .payload + .get("dependencies") + .is_some_and(|value| value.is_array()) + { + return Err("A provenance assertion requires explicit dependencies.".to_owned()); + } + } + "assertion-evaluation" => { + let status = record + .payload + .get("status") + .and_then(|value| value.as_str()) + .ok_or("An assertion evaluation requires a status.")?; + if !EVALUATION_STATUSES.contains(&status) { + return Err(format!("Unknown assertion evaluation status '{status}'.")); + } + if record + .payload + .get("evaluated_against") + .and_then(|value| value.get("chain_head")) + .and_then(|value| value.as_str()) + .is_none() + { + return Err("An assertion evaluation must bind an explicit chain head.".to_owned()); + } + } + _ => {} + } + Ok(()) +} diff --git a/src-tauri/src/provenance/canonical.rs b/src-tauri/src/provenance/canonical.rs new file mode 100644 index 0000000..8fcb412 --- /dev/null +++ b/src-tauri/src/provenance/canonical.rs @@ -0,0 +1,207 @@ +use super::{CplError, CplResult}; +use serde_json::{Map, Number, Value}; +use sha2::{Digest, Sha256}; +use std::cmp::Ordering; +use unicode_normalization::UnicodeNormalization; + +fn utf16_cmp(left: &str, right: &str) -> Ordering { + left.encode_utf16().cmp(right.encode_utf16()) +} + +pub fn normalize_nfc(value: &Value) -> CplResult { + match value { + Value::Null | Value::Bool(_) | Value::Number(_) => Ok(value.clone()), + Value::String(text) => Ok(Value::String(text.nfc().collect())), + Value::Array(values) => values + .iter() + .map(normalize_nfc) + .collect::>>() + .map(Value::Array), + Value::Object(values) => { + let mut normalized = Map::new(); + for (key, child) in values { + let key: String = key.nfc().collect(); + if normalized.contains_key(&key) { + return Err(CplError::new( + "CPL_NFC_KEY_COLLISION", + format!("Multiple object keys normalize to '{key}'."), + false, + )); + } + normalized.insert(key, normalize_nfc(child)?); + } + Ok(Value::Object(normalized)) + } + } +} + +fn canonical_number(number: &Number) -> CplResult { + if let Some(value) = number.as_i64() { + return Ok(value.to_string()); + } + if let Some(value) = number.as_u64() { + return Ok(value.to_string()); + } + let value = number.as_f64().ok_or_else(|| { + CplError::new( + "CPL_NUMBER_INVALID", + "The JSON number is not finite.", + false, + ) + })?; + if !value.is_finite() { + return Err(CplError::new( + "CPL_NUMBER_INVALID", + "NaN and infinity are prohibited.", + false, + )); + } + if value == 0.0 { + return Ok("0".to_owned()); + } + let mut buffer = ryu::Buffer::new(); + let rendered = buffer.format_finite(value); + let rendered = rendered.strip_suffix(".0").unwrap_or(rendered); + let Some(exponent_index) = rendered.find('e') else { + return Ok(rendered.to_owned()); + }; + let (negative, unsigned) = rendered + .strip_prefix('-') + .map_or((false, rendered), |value| (true, value)); + let exponent_index = unsigned.find('e').unwrap_or(exponent_index); + let mantissa = &unsigned[..exponent_index]; + let exponent: i32 = unsigned[exponent_index + 1..].parse().map_err(|error| { + CplError::new( + "CPL_NUMBER_INVALID", + format!("Invalid numeric exponent: {error}"), + false, + ) + })?; + let point = mantissa.find('.').unwrap_or(mantissa.len()) as i32; + let digits = mantissa.replace('.', ""); + let decimal_position = point + exponent; + let scientific_exponent = decimal_position - 1; + let body = if (0..21).contains(&scientific_exponent) { + if decimal_position as usize >= digits.len() { + format!( + "{}{}", + digits, + "0".repeat(decimal_position as usize - digits.len()) + ) + } else { + let split = decimal_position as usize; + format!("{}.{}", &digits[..split], &digits[split..]) + } + } else if (-6..0).contains(&scientific_exponent) { + format!("0.{}{}", "0".repeat((-decimal_position) as usize), digits) + } else { + let fraction = &digits[1..]; + let coefficient = if fraction.is_empty() { + digits[..1].to_owned() + } else { + format!("{}.{}", &digits[..1], fraction) + }; + format!( + "{coefficient}e{}{scientific_exponent}", + if scientific_exponent >= 0 { "+" } else { "" } + ) + }; + Ok(if negative { format!("-{body}") } else { body }) +} + +fn write_canonical(value: &Value, output: &mut String) -> CplResult<()> { + match value { + Value::Null => output.push_str("null"), + Value::Bool(value) => output.push_str(if *value { "true" } else { "false" }), + Value::Number(value) => output.push_str(&canonical_number(value)?), + Value::String(value) => { + output.push_str(&serde_json::to_string(value).map_err(|error| { + CplError::new("CPL_CANONICALIZATION_FAILED", error.to_string(), false) + })?) + } + Value::Array(values) => { + output.push('['); + for (index, child) in values.iter().enumerate() { + if index > 0 { + output.push(','); + } + write_canonical(child, output)?; + } + output.push(']'); + } + Value::Object(values) => { + output.push('{'); + let mut entries: Vec<_> = values.iter().collect(); + entries.sort_by(|(left, _), (right, _)| utf16_cmp(left, right)); + for (index, (key, child)) in entries.into_iter().enumerate() { + if index > 0 { + output.push(','); + } + output.push_str(&serde_json::to_string(key).map_err(|error| { + CplError::new("CPL_CANONICALIZATION_FAILED", error.to_string(), false) + })?); + output.push(':'); + write_canonical(child, output)?; + } + output.push('}'); + } + } + Ok(()) +} + +pub fn canonicalize(value: &Value) -> CplResult> { + let normalized = normalize_nfc(value)?; + let mut output = String::new(); + write_canonical(&normalized, &mut output)?; + Ok(output.into_bytes()) +} + +pub fn sha256_digest(bytes: &[u8]) -> String { + format!("sha256:{}", hex::encode(Sha256::digest(bytes))) +} +pub fn canonical_digest(value: &Value) -> CplResult { + canonicalize(value).map(|bytes| sha256_digest(&bytes)) +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + + #[test] + fn matches_normative_canonicalization_vectors() { + let cases = [ + ( + json!({"z":1,"a":2,"nested":{"beta":true,"alpha":false}}), + "{\"a\":2,\"nested\":{\"alpha\":false,\"beta\":true},\"z\":1}", + ), + ( + json!({"text":"Cafe\u{301}","e\u{301}":"normalize keys and values"}), + "{\"text\":\"Café\",\"é\":\"normalize keys and values\"}", + ), + ( + json!({"numbers":[333333333.3333333,1e30,4.5,0.002,1e-27]}), + "{\"numbers\":[333333333.3333333,1e+30,4.5,0.002,1e-27]}", + ), + ( + json!({"numbers":[1e20,1e-6,1e21,1e-7]}), + "{\"numbers\":[100000000000000000000,0.000001,1e+21,1e-7]}", + ), + ]; + for (input, expected) in cases { + assert_eq!( + String::from_utf8(canonicalize(&input).unwrap()).unwrap(), + expected + ); + } + } + + #[test] + fn rejects_nfc_key_collisions() { + let value: Value = serde_json::from_str("{\"é\":1,\"é\":2}").unwrap(); + assert_eq!( + normalize_nfc(&value).unwrap_err().code, + "CPL_NFC_KEY_COLLISION" + ); + } +} diff --git a/src-tauri/src/provenance/composition.rs b/src-tauri/src/provenance/composition.rs new file mode 100644 index 0000000..6907132 --- /dev/null +++ b/src-tauri/src/provenance/composition.rs @@ -0,0 +1,1227 @@ +//! Typed manuscript composition capture, lineage preservation, and deterministic replay. + +use super::{ + canonical::{canonical_digest, canonicalize}, + ledger::{self, LedgerPaths}, + records::{CplEvent, CplRecord, RecordInput, WriteCommand, WriteResult}, + writer::{init_database, CplService}, + CplError, CplResult, CPL_SCHEMA_VERSION, +}; +use rusqlite::params; +use serde::{Deserialize, Serialize}; +use serde_json::json; +use sha2::{Digest, Sha256}; +use std::{collections::BTreeSet, fs, path::Path}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum CompositionOperationKind { + Insert, + Delete, + Replace, + Move, + Paste, + Transcription, + AiAcceptance, + Restoration, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum RecordedOrigin { + RecordedDirectHumanInput, + HumanExpressiveInputViaTranscription, + AcceptedAiOutput, + ImportedOrPasted, + SystemRestoration, + Unattested, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum CompositionBoundary { + Initialization, + Idle, + FocusLoss, + SectionChange, + AiOperation, + Checkpoint, + PhaseChange, + ExplicitSave, + DocumentClose, + Paste, + Restoration, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ScalarRange { + pub start: usize, + pub end: usize, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct AiAcceptanceContext { + pub invocation_id: String, + pub response_text: String, + pub accepted_ranges: Vec, + pub rejected_ranges: Vec, + pub partial: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde( + tag = "kind", + rename_all = "SCREAMING_SNAKE_CASE", + rename_all_fields = "camelCase" +)] +pub enum CompositionAction { + Initialize { + text: String, + origin: RecordedOrigin, + }, + Edit { + before_text: String, + after_text: String, + boundary: CompositionBoundary, + origin: RecordedOrigin, + #[serde(default, skip_serializing_if = "Option::is_none")] + operation_kind_hint: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + ai_acceptance: Option, + }, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct CompositionCommand { + pub client_action_id: String, + pub actor: String, + pub summary: String, + pub occurred_at: String, + pub action: CompositionAction, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ExpressionSpan { + pub segment_id: String, + pub ancestry_segment_id: String, + pub start: usize, + pub end: usize, + pub text: String, + pub content_sha256: String, + pub origin: RecordedOrigin, + pub lineage_reference_ids: Vec, + pub operation_ids: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +struct LineageUnit { + character: char, + origin: RecordedOrigin, + ancestry_segment_id: String, + lineage_reference_ids: Vec, + operation_ids: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct CompositionProjection { + pub schema_version: String, + pub project_id: String, + pub initialized: bool, + pub manuscript: String, + pub revision_id: String, + pub operation_count: u64, + pub spans: Vec, + pub updated_at: String, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + units: Vec, +} + +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct CompositionCommandResult { + pub write: WriteResult, + pub projection: CompositionProjection, +} + +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +struct CompositionOperationRecord { + operation_id: String, + operation_kind: CompositionOperationKind, + base_revision_id: String, + result_revision_id: String, + operation_sequence: u64, + source_start: usize, + source_end: usize, + destination_start: usize, + inserted_content_sha256: Option, + deleted_content_sha256: Option, + recorded_origin: RecordedOrigin, + transformation_relationships: Vec, + lineage_reference_ids: Vec, + invocation_id: Option, + disposition_id: Option, + boundary: CompositionBoundary, +} + +impl CompositionProjection { + fn empty(project_id: &str) -> Self { + Self { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + project_id: project_id.to_owned(), + initialized: false, + manuscript: String::new(), + revision_id: String::new(), + operation_count: 0, + spans: Vec::new(), + updated_at: String::new(), + units: Vec::new(), + } + } + + fn apply( + &mut self, + command: &CompositionCommand, + ) -> CplResult> { + command.validate()?; + match &command.action { + CompositionAction::Initialize { text, origin } => { + if self.initialized { + return Err(CplError::new( + "COMPOSITION_ALREADY_INITIALIZED", + "The manuscript composition stream is already initialized.", + false, + )); + } + let revision_id = stable_id("revision", &command.client_action_id); + let ancestry = + stable_id("segment", &format!("{}:initial", command.client_action_id)); + self.units = text + .chars() + .map(|character| LineageUnit { + character, + origin: *origin, + ancestry_segment_id: ancestry.clone(), + lineage_reference_ids: vec![revision_id.clone()], + operation_ids: vec![], + }) + .collect(); + self.initialized = true; + self.manuscript = text.clone(); + self.revision_id = revision_id; + self.updated_at = command.occurred_at.clone(); + self.rebuild_spans()?; + Ok(None) + } + CompositionAction::Edit { + before_text, + after_text, + boundary, + origin, + operation_kind_hint, + ai_acceptance, + } => { + if !self.initialized { + return Err(CplError::new( + "COMPOSITION_NOT_INITIALIZED", + "Initialize manuscript composition before recording edits.", + false, + )); + } + if &self.manuscript != before_text { + return Err(CplError::new("COMPOSITION_BASE_MISMATCH", "The edit preimage does not match the current canonical manuscript revision.", true)); + } + if before_text == after_text { + return Err(CplError::new( + "COMPOSITION_NO_CHANGE", + "A composition boundary with no manuscript change is not an operation.", + true, + )); + } + let before = before_text.chars().collect::>(); + let after = after_text.chars().collect::>(); + let prefix = common_prefix(&before, &after); + let suffix = common_suffix(&before[prefix..], &after[prefix..]); + let source_end = before.len() - suffix; + let result_end = after.len() - suffix; + let deleted = before[prefix..source_end].iter().collect::(); + let inserted = after[prefix..result_end].iter().collect::(); + let operation_kind = + operation_kind_hint.unwrap_or_else(|| infer_kind(&deleted, &inserted, *origin)); + if !origin_allowed_for_operation(operation_kind, *origin) { + return Err(CplError::new( + "COMPOSITION_ORIGIN_INVALID", + "The recorded origin is incompatible with the composition operation.", + false, + )); + } + validate_ai_acceptance(operation_kind, ai_acceptance.as_ref())?; + + let operation_id = stable_id("operation", &command.client_action_id); + let result_revision_id = stable_id("revision", &command.client_action_id); + let disposition_id = ai_acceptance + .as_ref() + .map(|_| stable_id("disposition", &command.client_action_id)); + let deleted_units = self.units[prefix..source_end].to_vec(); + let mut lineage = BTreeSet::new(); + for unit in &deleted_units { + lineage.insert(unit.ancestry_segment_id.clone()); + lineage.extend(unit.lineage_reference_ids.iter().cloned()); + lineage.extend(unit.operation_ids.iter().cloned()); + } + if let Some(ai) = ai_acceptance { + lineage.insert(ai.invocation_id.clone()); + } + if lineage.is_empty() { + lineage.insert(self.revision_id.clone()); + } + let ancestry = + stable_id("segment", &format!("{}:insert", command.client_action_id)); + let inserted_units = if operation_kind == CompositionOperationKind::Move { + moved_units(&deleted_units, &inserted, &operation_id)? + } else { + inserted + .chars() + .map(|character| LineageUnit { + character, + origin: *origin, + ancestry_segment_id: ancestry.clone(), + lineage_reference_ids: lineage.iter().cloned().collect(), + operation_ids: vec![operation_id.clone()], + }) + .collect::>() + }; + self.units.splice(prefix..source_end, inserted_units); + self.manuscript = self.units.iter().map(|unit| unit.character).collect(); + if self.manuscript != *after_text { + return Err(CplError::new( + "COMPOSITION_REPLAY_DIVERGED", + "The recorded operation did not reproduce its declared result.", + false, + )); + } + let base_revision_id = self.revision_id.clone(); + self.revision_id = result_revision_id.clone(); + self.operation_count += 1; + self.updated_at = command.occurred_at.clone(); + self.rebuild_spans()?; + Ok(Some(CompositionOperationRecord { + operation_id, + operation_kind, + base_revision_id, + result_revision_id, + operation_sequence: self.operation_count, + source_start: prefix, + source_end, + destination_start: prefix, + inserted_content_sha256: (!inserted.is_empty()) + .then(|| text_digest(&inserted)) + .transpose()?, + deleted_content_sha256: (!deleted.is_empty()) + .then(|| text_digest(&deleted)) + .transpose()?, + recorded_origin: *origin, + transformation_relationships: relationships( + operation_kind, + !deleted.is_empty(), + ), + lineage_reference_ids: lineage.into_iter().collect(), + invocation_id: ai_acceptance + .as_ref() + .map(|value| value.invocation_id.clone()), + disposition_id, + boundary: *boundary, + })) + } + } + } + + fn rebuild_spans(&mut self) -> CplResult<()> { + let mut spans = Vec::new(); + let mut start = 0; + while start < self.units.len() { + let first = &self.units[start]; + let mut end = start + 1; + while end < self.units.len() { + let next = &self.units[end]; + if next.origin != first.origin + || next.ancestry_segment_id != first.ancestry_segment_id + || next.lineage_reference_ids != first.lineage_reference_ids + || next.operation_ids != first.operation_ids + { + break; + } + end += 1; + } + let text = self.units[start..end] + .iter() + .map(|unit| unit.character) + .collect::(); + spans.push(ExpressionSpan { + segment_id: stable_id( + "segment", + &format!("{}:{start}:{}", self.revision_id, first.ancestry_segment_id), + ), + ancestry_segment_id: first.ancestry_segment_id.clone(), + start, + end, + content_sha256: text_digest(&text)?, + text, + origin: first.origin, + lineage_reference_ids: first.lineage_reference_ids.clone(), + operation_ids: first.operation_ids.clone(), + }); + start = end; + } + self.spans = spans; + Ok(()) + } +} + +impl CompositionCommand { + fn validate(&self) -> CplResult<()> { + for (label, value) in [ + ("client_action_id", self.client_action_id.as_str()), + ("actor", self.actor.as_str()), + ("summary", self.summary.as_str()), + ("occurred_at", self.occurred_at.as_str()), + ] { + if value.trim().is_empty() || value.chars().any(char::is_control) { + return Err(CplError::new( + "COMPOSITION_COMMAND_INVALID", + format!("{label} is empty or contains control characters."), + false, + )); + } + } + if !matches!(self.actor.as_str(), "user" | "assistant" | "system") { + return Err(CplError::new( + "COMPOSITION_ACTOR_INVALID", + "Composition actor must be user, assistant, or system.", + false, + )); + } + Ok(()) + } +} + +pub fn apply_command( + root: &Path, + project_id: &str, + command: CompositionCommand, +) -> CplResult { + let service = CplService::new(root, project_id); + let client_action_id = command.client_action_id.clone(); + let write = service.write_prepared(&client_action_id, || { + let events = ledger::read_all_events(&LedgerPaths::new(root))?; + if let Some(event) = events + .iter() + .find(|event| event.client_action_id == command.client_action_id) + { + return match composition_command_from_event(root, event)? { + Some(existing) if existing == command => Ok(None), + _ => Err(CplError::new("CPL_IDEMPOTENCY_CONFLICT", "The client_action_id was already committed with a different canonical command.", false)), + }; + } + let mut projected = reconstruct_from_events(root, project_id, &events)?; + let operation = projected.apply(&command)?; + let mut records = vec![RecordInput { + record_type: "composition-command".into(), + payload: json!({"schema_version": CPL_SCHEMA_VERSION, "command": command}), + }]; + if let Some(operation) = &operation { + records.push(RecordInput { + record_type: "composition-operation".into(), + payload: serde_json::to_value(operation).map_err(serialization_error)?, + }); + let (deleted, inserted) = changed_content(&command.action)?; + records.push(RecordInput { record_type: "composition-content".into(), payload: json!({"operation_id": operation.operation_id, "deleted_text": deleted, "inserted_text": inserted}) }); + if let CompositionAction::Edit { + ai_acceptance: Some(ai), + .. + } = &command.action + { + records.push(RecordInput { record_type: "ai-acceptance-disposition".into(), payload: json!({"operation_id": operation.operation_id, "disposition_id": operation.disposition_id, "invocation_id": ai.invocation_id, "response_text": ai.response_text, "accepted_ranges": ai.accepted_ranges, "rejected_ranges": ai.rejected_ranges, "partial": ai.partial, "result_revision_id": operation.result_revision_id}) }); + } + } else { + records.push(RecordInput { record_type: "composition-initialization".into(), payload: json!({"revision_id": projected.revision_id, "origin": projected.spans.first().map(|span| span.origin), "text_sha256": text_digest(&projected.manuscript)?}) }); + } + records.push(RecordInput { record_type: "manuscript-revision".into(), payload: json!({"revision_id": projected.revision_id, "manuscript": projected.manuscript, "content_sha256": text_digest(&projected.manuscript)?, "operation_count": projected.operation_count}) }); + for span in &projected.spans { + records.push(RecordInput { + record_type: "expression-segment".into(), + payload: serde_json::to_value(span).map_err(serialization_error)?, + }); + } + let boundary = match &command.action { + CompositionAction::Initialize { .. } => CompositionBoundary::Initialization, + CompositionAction::Edit { boundary, .. } => *boundary, + }; + Ok(Some(WriteCommand { + client_action_id: command.client_action_id.clone(), + project_id: project_id.to_owned(), + event_type: format!("COMPOSITION_{}", serde_json::to_value(boundary).unwrap().as_str().unwrap().to_ascii_uppercase()), + actor: command.actor.clone(), + metadata: json!({"summary": command.summary, "composition_boundary": boundary, "result_revision_id": projected.revision_id}), + records, + operational_state: None, + })) + })?; + let projection = reconstruct(root, project_id)?; + cache_projection(root, &projection)?; + Ok(CompositionCommandResult { write, projection }) +} + +pub fn reconstruct(root: &Path, project_id: &str) -> CplResult { + let events = ledger::read_all_events(&LedgerPaths::new(root))?; + reconstruct_from_events(root, project_id, &events) +} + +fn composition_command_from_event( + root: &Path, + event: &CplEvent, +) -> CplResult> { + let references = event + .record_references + .iter() + .filter(|reference| reference.record_type == "composition-command") + .collect::>(); + if references.is_empty() { + return Ok(None); + } + if references.len() != 1 { + return Err(CplError::new( + "COMPOSITION_COMMAND_AMBIGUOUS", + "A composition event must bind exactly one composition-command record.", + false, + )); + } + let path = references[0] + .path + .split('/') + .fold(root.to_path_buf(), |path, part| path.join(part)); + let bytes = fs::read(&path) + .map_err(|error| CplError::io("Could not read a composition command record", error))?; + let record: CplRecord = serde_json::from_slice(&bytes) + .map_err(|error| CplError::new("COMPOSITION_RECORD_INVALID", error.to_string(), false))?; + if canonicalize(&serde_json::to_value(&record).map_err(serialization_error)?)? != bytes { + return Err(CplError::new( + "COMPOSITION_RECORD_NONCANONICAL", + format!("{} is not canonical JSON.", path.display()), + false, + )); + } + let command = + serde_json::from_value(record.payload.get("command").cloned().ok_or_else(|| { + CplError::new( + "COMPOSITION_COMMAND_MISSING", + "The composition command record has no command.", + false, + ) + })?) + .map_err(|error| CplError::new("COMPOSITION_COMMAND_INVALID", error.to_string(), false))?; + Ok(Some(command)) +} + +pub(crate) fn reconstruct_from_events( + root: &Path, + project_id: &str, + events: &[CplEvent], +) -> CplResult { + let mut projection = CompositionProjection::empty(project_id); + for event in events { + if let Some(command) = composition_command_from_event(root, event)? { + projection.apply(&command)?; + } + } + Ok(projection) +} + +pub(crate) fn rebuild_projection_cache( + root: &Path, + project_id: &str, + events: &[CplEvent], +) -> CplResult<()> { + cache_projection(root, &reconstruct_from_events(root, project_id, events)?) +} + +fn cache_projection(root: &Path, projection: &CompositionProjection) -> CplResult<()> { + let database = init_database(root)?; + database.execute("CREATE TABLE IF NOT EXISTS composition_projection (id INTEGER PRIMARY KEY CHECK(id=1), json TEXT NOT NULL, operation_count INTEGER NOT NULL, updated_at TEXT NOT NULL)", []).map_err(super::writer::database_error)?; + let json = serde_json::to_string(projection).map_err(serialization_error)?; + database.execute("INSERT INTO composition_projection(id,json,operation_count,updated_at) VALUES(1,?1,?2,?3) ON CONFLICT(id) DO UPDATE SET json=excluded.json,operation_count=excluded.operation_count,updated_at=excluded.updated_at", params![json, projection.operation_count, projection.updated_at]).map_err(super::writer::database_error)?; + Ok(()) +} + +pub fn origin_allowed_for_operation( + operation: CompositionOperationKind, + origin: RecordedOrigin, +) -> bool { + match operation { + CompositionOperationKind::Paste => origin == RecordedOrigin::ImportedOrPasted, + CompositionOperationKind::Transcription => { + origin == RecordedOrigin::HumanExpressiveInputViaTranscription + } + CompositionOperationKind::AiAcceptance => origin == RecordedOrigin::AcceptedAiOutput, + CompositionOperationKind::Restoration => origin == RecordedOrigin::SystemRestoration, + CompositionOperationKind::Delete | CompositionOperationKind::Move => true, + CompositionOperationKind::Insert | CompositionOperationKind::Replace => matches!( + origin, + RecordedOrigin::RecordedDirectHumanInput + | RecordedOrigin::AcceptedAiOutput + | RecordedOrigin::Unattested + ), + } +} + +fn validate_ai_acceptance( + kind: CompositionOperationKind, + ai: Option<&AiAcceptanceContext>, +) -> CplResult<()> { + if (kind == CompositionOperationKind::AiAcceptance) != ai.is_some() { + return Err(CplError::new("AI_ACCEPTANCE_BINDING_INVALID", "AI acceptance operations require exactly one invocation response and disposition binding.", false)); + } + if let Some(ai) = ai { + let length = ai.response_text.chars().count(); + if ai.invocation_id.trim().is_empty() + || ai.accepted_ranges.is_empty() + || ai + .accepted_ranges + .iter() + .chain(&ai.rejected_ranges) + .any(|range| range.start >= range.end || range.end > length) + { + return Err(CplError::new("AI_ACCEPTANCE_RANGE_INVALID", "Accepted and rejected AI response ranges must be non-empty scalar ranges within the retained response.", false)); + } + let mut dispositions = vec![0_u8; length]; + for (value, ranges) in [(1_u8, &ai.accepted_ranges), (2_u8, &ai.rejected_ranges)] { + for range in ranges { + for disposition in &mut dispositions[range.start..range.end] { + if *disposition != 0 { + return Err(CplError::new( + "AI_ACCEPTANCE_RANGE_OVERLAP", + "Accepted and rejected AI response ranges must not overlap.", + false, + )); + } + *disposition = value; + } + } + } + if dispositions.contains(&0) || ai.partial != !ai.rejected_ranges.is_empty() { + return Err(CplError::new("AI_ACCEPTANCE_DISPOSITION_INCOMPLETE", "AI acceptance must disposition every Unicode scalar as accepted or rejected and accurately declare whether acceptance was partial.", false)); + } + } + Ok(()) +} + +fn changed_content(action: &CompositionAction) -> CplResult<(String, String)> { + let CompositionAction::Edit { + before_text, + after_text, + .. + } = action + else { + return Ok((String::new(), String::new())); + }; + let before = before_text.chars().collect::>(); + let after = after_text.chars().collect::>(); + let prefix = common_prefix(&before, &after); + let suffix = common_suffix(&before[prefix..], &after[prefix..]); + Ok(( + before[prefix..before.len() - suffix].iter().collect(), + after[prefix..after.len() - suffix].iter().collect(), + )) +} + +fn infer_kind(deleted: &str, inserted: &str, origin: RecordedOrigin) -> CompositionOperationKind { + match origin { + RecordedOrigin::ImportedOrPasted => CompositionOperationKind::Paste, + RecordedOrigin::HumanExpressiveInputViaTranscription => { + CompositionOperationKind::Transcription + } + RecordedOrigin::AcceptedAiOutput => CompositionOperationKind::AiAcceptance, + RecordedOrigin::SystemRestoration => CompositionOperationKind::Restoration, + _ if inserted.is_empty() => CompositionOperationKind::Delete, + _ if deleted.is_empty() => CompositionOperationKind::Insert, + _ => CompositionOperationKind::Replace, + } +} + +fn relationships(kind: CompositionOperationKind, replaced: bool) -> Vec { + let mut values = vec![match kind { + CompositionOperationKind::Insert => "inserted", + CompositionOperationKind::Delete => "deleted", + CompositionOperationKind::Replace => "replaced", + CompositionOperationKind::Move => "moved", + CompositionOperationKind::Paste => "pasted_from_external", + CompositionOperationKind::Transcription => "transcribed_from_human_speech", + CompositionOperationKind::AiAcceptance => "generated_by_ai", + CompositionOperationKind::Restoration => "restored_from_revision", + } + .to_owned()]; + if replaced + && matches!( + kind, + CompositionOperationKind::Insert | CompositionOperationKind::Replace + ) + { + values.push("modified_by_human".into()); + } + values +} + +fn moved_units( + source: &[LineageUnit], + destination: &str, + operation_id: &str, +) -> CplResult> { + let mut remaining = source.iter().cloned().map(Some).collect::>(); + let mut result = Vec::with_capacity(remaining.len()); + for character in destination.chars() { + let index = remaining + .iter() + .position(|unit| unit.as_ref().is_some_and(|unit| unit.character == character)) + .ok_or_else(|| { + CplError::new( + "COMPOSITION_MOVE_CONTENT_MISMATCH", + "A move may only select and rearrange existing expression without changing its content.", + false, + ) + })?; + let mut unit = remaining[index].take().expect("matched move unit"); + unit.operation_ids.push(operation_id.to_owned()); + result.push(unit); + } + if remaining.iter().any(Option::is_some) { + return Err(CplError::new( + "COMPOSITION_MOVE_CONTENT_MISMATCH", + "A move may only select and rearrange existing expression without changing its content.", + false, + )); + } + Ok(result) +} +fn common_prefix(before: &[char], after: &[char]) -> usize { + before + .iter() + .zip(after) + .take_while(|(left, right)| left == right) + .count() +} +fn common_suffix(before: &[char], after: &[char]) -> usize { + before + .iter() + .rev() + .zip(after.iter().rev()) + .take_while(|(left, right)| left == right) + .count() +} +fn text_digest(text: &str) -> CplResult { + canonical_digest(&json!({"text": text})) +} +fn serialization_error(error: impl std::fmt::Display) -> CplError { + CplError::new("COMPOSITION_SERIALIZATION_FAILED", error.to_string(), false) +} + +fn stable_id(prefix: &str, source: &str) -> String { + const ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ"; + let digest = Sha256::digest(source.as_bytes()); + let mut value = String::with_capacity(26); + let mut buffer = 0u32; + let mut bits = 0u8; + for byte in digest { + buffer = (buffer << 8) | u32::from(byte); + bits += 8; + while bits >= 5 && value.len() < 26 { + bits -= 5; + value.push(ALPHABET[((buffer >> bits) & 31) as usize] as char); + } + if value.len() == 26 { + break; + } + } + format!("{prefix}_{value}") +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::provenance::identifiers::timestamp_millis; + use tempfile::tempdir; + + fn command(id: &str, action: CompositionAction) -> CompositionCommand { + CompositionCommand { + client_action_id: id.into(), + actor: "user".into(), + summary: id.into(), + occurred_at: timestamp_millis(), + action, + } + } + fn initialize(root: &Path) { + apply_command( + root, + "project_test", + command( + "initialize", + CompositionAction::Initialize { + text: String::new(), + origin: RecordedOrigin::Unattested, + }, + ), + ) + .unwrap(); + } + fn edit( + root: &Path, + id: &str, + before: &str, + after: &str, + origin: RecordedOrigin, + hint: Option, + ai: Option, + ) { + apply_command( + root, + "project_test", + command( + id, + CompositionAction::Edit { + before_text: before.into(), + after_text: after.into(), + boundary: CompositionBoundary::Idle, + origin, + operation_kind_hint: hint, + ai_acceptance: ai, + }, + ), + ) + .unwrap(); + } + + #[test] + fn replays_manual_paste_ai_revision_and_restoration_with_lineage() { + let temp = tempdir().unwrap(); + initialize(temp.path()); + edit( + temp.path(), + "human", + "", + "Human", + RecordedOrigin::RecordedDirectHumanInput, + None, + None, + ); + edit( + temp.path(), + "paste", + "Human", + "Human source", + RecordedOrigin::ImportedOrPasted, + None, + None, + ); + let ai = AiAcceptanceContext { + invocation_id: "invocation_one".into(), + response_text: " AI unused".into(), + accepted_ranges: vec![ScalarRange { start: 0, end: 3 }], + rejected_ranges: vec![ScalarRange { start: 3, end: 10 }], + partial: true, + }; + edit( + temp.path(), + "ai", + "Human source", + "Human source AI", + RecordedOrigin::AcceptedAiOutput, + Some(CompositionOperationKind::AiAcceptance), + Some(ai), + ); + edit( + temp.path(), + "revise", + "Human source AI", + "Human source art", + RecordedOrigin::RecordedDirectHumanInput, + None, + None, + ); + edit( + temp.path(), + "restore", + "Human source art", + "Restored", + RecordedOrigin::SystemRestoration, + Some(CompositionOperationKind::Restoration), + None, + ); + let projection = reconstruct(temp.path(), "project_test").unwrap(); + assert_eq!(projection.manuscript, "Restored"); + assert_eq!(projection.operation_count, 5); + assert!(projection + .spans + .iter() + .all(|span| !span.lineage_reference_ids.is_empty())); + assert_eq!( + projection.spans[0].origin, + RecordedOrigin::SystemRestoration + ); + } + + #[test] + fn unicode_scalar_diff_and_partial_ai_ranges_are_exact() { + let temp = tempdir().unwrap(); + initialize(temp.path()); + edit( + temp.path(), + "emoji", + "", + "A🧵B", + RecordedOrigin::RecordedDirectHumanInput, + None, + None, + ); + let ai = AiAcceptanceContext { + invocation_id: "invocation_emoji".into(), + response_text: "é🦀tail".into(), + accepted_ranges: vec![ScalarRange { start: 0, end: 2 }], + rejected_ranges: vec![ScalarRange { start: 2, end: 6 }], + partial: true, + }; + edit( + temp.path(), + "partial", + "A🧵B", + "Aé🦀B", + RecordedOrigin::AcceptedAiOutput, + Some(CompositionOperationKind::AiAcceptance), + Some(ai), + ); + let projection = reconstruct(temp.path(), "project_test").unwrap(); + assert_eq!(projection.manuscript, "Aé🦀B"); + assert_eq!( + projection + .spans + .iter() + .map(|span| span.end - span.start) + .sum::(), + 4 + ); + let events = ledger::read_all_events(&LedgerPaths::new(temp.path())).unwrap(); + assert!(events + .iter() + .flat_map(|event| &event.record_references) + .any(|reference| reference.record_type == "ai-acceptance-disposition")); + } + + #[test] + fn refuses_a_stale_preimage_without_committing_an_event() { + let temp = tempdir().unwrap(); + initialize(temp.path()); + let before = ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(); + let result = apply_command( + temp.path(), + "project_test", + command( + "stale", + CompositionAction::Edit { + before_text: "wrong".into(), + after_text: "new".into(), + boundary: CompositionBoundary::Idle, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ), + ); + assert_eq!(result.unwrap_err().code, "COMPOSITION_BASE_MISMATCH"); + assert_eq!( + ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(), + before + ); + } + #[test] + fn concurrent_edits_against_one_preimage_commit_exactly_once() { + use std::sync::{Arc, Barrier}; + + let temp = tempdir().unwrap(); + initialize(temp.path()); + let root = temp.path().to_path_buf(); + let barrier = Arc::new(Barrier::new(3)); + let handles = ["concurrent_a", "concurrent_b"].map(|id| { + let root = root.clone(); + let barrier = barrier.clone(); + std::thread::spawn(move || { + barrier.wait(); + apply_command( + &root, + "project_test", + command( + id, + CompositionAction::Edit { + before_text: String::new(), + after_text: id.chars().last().unwrap().to_string(), + boundary: CompositionBoundary::Idle, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ), + ) + }) + }); + barrier.wait(); + let results = handles.map(|handle| handle.join().unwrap()); + assert_eq!(results.iter().filter(|result| result.is_ok()).count(), 1); + assert_eq!( + results + .iter() + .filter_map(|result| result.as_ref().err()) + .filter(|error| error.code == "COMPOSITION_BASE_MISMATCH") + .count(), + 1 + ); + assert_eq!( + ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(), + 2 + ); + assert!(matches!( + reconstruct(temp.path(), "project_test") + .unwrap() + .manuscript + .as_str(), + "a" | "b" + )); + } + #[test] + fn retries_are_idempotent_and_action_id_reuse_conflicts() { + let temp = tempdir().unwrap(); + let initialization = command( + "retry_initialize", + CompositionAction::Initialize { + text: "base".into(), + origin: RecordedOrigin::Unattested, + }, + ); + assert!( + !apply_command(temp.path(), "project_test", initialization.clone()) + .unwrap() + .write + .idempotent_replay + ); + assert!( + apply_command(temp.path(), "project_test", initialization) + .unwrap() + .write + .idempotent_replay + ); + + let change = command( + "retry_edit", + CompositionAction::Edit { + before_text: "base".into(), + after_text: "based".into(), + boundary: CompositionBoundary::ExplicitSave, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ); + assert!( + !apply_command(temp.path(), "project_test", change.clone()) + .unwrap() + .write + .idempotent_replay + ); + assert!( + apply_command(temp.path(), "project_test", change) + .unwrap() + .write + .idempotent_replay + ); + assert_eq!( + ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(), + 2 + ); + + let conflict = command( + "retry_edit", + CompositionAction::Edit { + before_text: "based".into(), + after_text: "different".into(), + boundary: CompositionBoundary::Idle, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ); + assert_eq!( + apply_command(temp.path(), "project_test", conflict) + .unwrap_err() + .code, + "CPL_IDEMPOTENCY_CONFLICT" + ); + } + #[test] + fn selection_and_arrangement_preserve_each_source_origin() { + let temp = tempdir().unwrap(); + initialize(temp.path()); + edit( + temp.path(), + "move_human", + "", + "AB", + RecordedOrigin::RecordedDirectHumanInput, + None, + None, + ); + edit( + temp.path(), + "move_import", + "AB", + "ABC", + RecordedOrigin::ImportedOrPasted, + None, + None, + ); + edit( + temp.path(), + "move_arrange", + "ABC", + "CAB", + RecordedOrigin::RecordedDirectHumanInput, + Some(CompositionOperationKind::Move), + None, + ); + let projection = reconstruct(temp.path(), "project_test").unwrap(); + assert_eq!(projection.manuscript, "CAB"); + assert_eq!(projection.spans[0].text, "C"); + assert_eq!(projection.spans[0].origin, RecordedOrigin::ImportedOrPasted); + assert_eq!(projection.spans[1].text, "AB"); + assert_eq!( + projection.spans[1].origin, + RecordedOrigin::RecordedDirectHumanInput + ); + assert!(projection.spans.iter().all(|span| span + .operation_ids + .iter() + .any(|id| id.starts_with("operation_")))); + + let events_before = ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(); + let mismatch = apply_command( + temp.path(), + "project_test", + command( + "move_changes_content", + CompositionAction::Edit { + before_text: "CAB".into(), + after_text: "CAD".into(), + boundary: CompositionBoundary::Idle, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: Some(CompositionOperationKind::Move), + ai_acceptance: None, + }, + ), + ) + .unwrap_err(); + assert_eq!(mismatch.code, "COMPOSITION_MOVE_CONTENT_MISMATCH"); + assert_eq!( + ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(), + events_before + ); + } + + #[test] + fn ai_transformation_human_revision_and_deletion_keep_exact_lineage() { + let temp = tempdir().unwrap(); + initialize(temp.path()); + edit( + temp.path(), + "transform_human", + "", + "Human phrase", + RecordedOrigin::RecordedDirectHumanInput, + None, + None, + ); + edit( + temp.path(), + "transform_ai", + "Human phrase", + "Machine phrase", + RecordedOrigin::AcceptedAiOutput, + Some(CompositionOperationKind::AiAcceptance), + Some(AiAcceptanceContext { + invocation_id: "invocation_transform".into(), + response_text: "Machine phrase".into(), + accepted_ranges: vec![ScalarRange { start: 0, end: 14 }], + rejected_ranges: vec![], + partial: false, + }), + ); + let ai_projection = reconstruct(temp.path(), "project_test").unwrap(); + assert!(ai_projection + .spans + .iter() + .any(|span| span.origin == RecordedOrigin::AcceptedAiOutput)); + assert!(ai_projection + .spans + .iter() + .any(|span| span.origin == RecordedOrigin::RecordedDirectHumanInput)); + assert!(ai_projection + .spans + .iter() + .filter(|span| span.origin == RecordedOrigin::AcceptedAiOutput) + .all(|span| span + .lineage_reference_ids + .iter() + .any(|id| id == "invocation_transform"))); + + edit( + temp.path(), + "transform_revise", + "Machine phrase", + "Reworked phrase", + RecordedOrigin::RecordedDirectHumanInput, + None, + None, + ); + edit( + temp.path(), + "transform_delete", + "Reworked phrase", + "Reworked", + RecordedOrigin::RecordedDirectHumanInput, + None, + None, + ); + let revised = reconstruct(temp.path(), "project_test").unwrap(); + assert_eq!(revised.manuscript, "Reworked"); + assert!(revised + .spans + .iter() + .all(|span| span.origin == RecordedOrigin::RecordedDirectHumanInput)); + assert!(revised + .spans + .iter() + .all(|span| !span.lineage_reference_ids.is_empty())); + } +} diff --git a/src-tauri/src/provenance/contribution_map.rs b/src-tauri/src/provenance/contribution_map.rs new file mode 100644 index 0000000..8fc8589 --- /dev/null +++ b/src-tauri/src/provenance/contribution_map.rs @@ -0,0 +1,1577 @@ +//! Deterministic contribution-map projection over a frozen manuscript revision. + +use super::{ + canonical::{canonical_digest, canonicalize}, + composition::{self, ExpressionSpan, RecordedOrigin}, + ledger::{self, LedgerPaths}, + records::{CplRecord, RecordInput, WriteCommand}, + verifier, CplError, CplResult, CplService, VerificationStatus, CPL_SCHEMA_VERSION, +}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use sha2::{Digest, Sha256}; +use std::{collections::BTreeSet, fs, path::Path}; + +const GENERATOR_NAME: &str = "thinkloom-contribution-map"; +const GENERATOR_VERSION: &str = "1.0.0"; +const APPLICATION_VERSION: &str = env!("CARGO_PKG_VERSION"); +const DEFAULT_PAGE_SCALAR_CAPACITY: usize = 1_800; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ContributionMapRequest { + #[serde(default = "default_page_capacity")] + pub page_scalar_capacity: usize, + #[serde(default)] + pub selected_by_human: bool, + #[serde(default)] + pub arranged_by_human: bool, +} + +impl Default for ContributionMapRequest { + fn default() -> Self { + Self { + page_scalar_capacity: DEFAULT_PAGE_SCALAR_CAPACITY, + selected_by_human: false, + arranged_by_human: false, + } + } +} + +fn default_page_capacity() -> usize { + DEFAULT_PAGE_SCALAR_CAPACITY +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "snake_case")] +pub enum ClassificationStatus { + Exact, + Degraded, + Stale, + Unverified, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct Coverage { + pub denominator: usize, + pub recorded_positions: usize, + pub coverage_status: String, + pub denominator_unit: String, + pub denominator_definition: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct TextFragmentRange { + pub schema_version: String, + pub document_revision_id: String, + pub coordinate_system: String, + pub start: usize, + pub end: usize, + pub preimage_sha256: String, + pub text_fragment_id: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct MapSegment { + pub schema_version: String, + pub segment_id: String, + pub project_id: String, + pub revision_id: String, + pub segment_sequence: usize, + pub range: TextFragmentRange, + pub content_sha256: String, + pub normalized_unicode_scalar_length: usize, + pub recorded_origin_kind: RecordedOrigin, + pub actor_identity_status: String, + pub generation_status: String, + pub lineage_status: String, + pub lineage_reference_ids: Vec, + pub operation_ids: Vec, + pub transformation_relationships: Vec, + pub assertion_ids: Vec, + pub selection_arrangement_assertion_ids: Vec, + pub included_in_deposit_assertion_id: Option, + pub classification_status: ClassificationStatus, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct StructuralLocator { + pub segment_id: String, + pub chapter: Option, + pub paragraph: Option, + pub page: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct LayoutProfile { + pub layout_profile_id: String, + pub layout_profile_sha256: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct GeneratorIdentity { + pub name: String, + pub version: String, + pub configuration_sha256: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ContributionMap { + pub schema_version: String, + pub contribution_map_id: String, + pub project_id: String, + pub deposit_id: String, + pub deposit_sha256: String, + pub manuscript_revision_id: String, + pub manuscript_revision_sha256: String, + pub cpl_chain_head: String, + pub cpl_event_sequence: u64, + pub coordinate_system: String, + pub coverage: Coverage, + pub layers: Vec, + pub segments: Vec, + pub structural_locators: Vec, + pub layout_profile: Option, + pub generator: GeneratorIdentity, + pub classification_status: ClassificationStatus, + pub contribution_map_sha256: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct DepositSnapshot { + pub schema_version: String, + pub deposit_id: String, + pub project_id: String, + pub application_version: String, + pub deposit_path: String, + pub media_type: String, + pub byte_length: usize, + pub deposit_sha256: String, + pub manuscript_revision_id: String, + pub manuscript_revision_sha256: String, + pub cpl_chain_head: String, + pub cpl_event_sequence: u64, + pub layout_profile: Option, + pub created_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct ProjectionBoundary { + pub boundary_id: String, + pub status: String, + pub kind: String, + pub start: usize, + pub end: usize, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct ContributionMapProjection { + pub deposit: DepositSnapshot, + pub contribution_map: ContributionMap, + pub assertions: Vec, + pub assertion_evaluations: Vec, + pub boundaries: Vec, +} + +#[derive(Debug, Clone)] +pub struct ContributionMapInput { + pub project_id: String, + pub manuscript: String, + pub revision_id: String, + pub spans: Vec, + pub deposit_id: String, + pub deposit_path: String, + pub cpl_chain_head: String, + pub cpl_event_sequence: u64, + pub source_event_id: String, + pub source_timestamp: String, + pub source_verified: bool, + pub request: ContributionMapRequest, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +struct LocatorValue { + chapter: usize, + paragraph: usize, + page: usize, +} + +pub fn build(input: ContributionMapInput) -> CplResult { + if input.manuscript.is_empty() { + return Err(CplError::new( + "CONTRIBUTION_MAP_EMPTY", + "A frozen contribution map requires a non-empty manuscript.", + true, + )); + } + if input.request.page_scalar_capacity == 0 { + return Err(CplError::new( + "LAYOUT_PROFILE_INVALID", + "The page scalar capacity must be greater than zero.", + false, + )); + } + + let manuscript_sha256 = raw_digest(input.manuscript.as_bytes()); + let deposit_sha256 = manuscript_sha256.clone(); + let configuration = json!({ + "algorithm": "unicode-scalar-structural-split-v1", + "arranged_by_human": input.request.arranged_by_human, + "page_scalar_capacity": input.request.page_scalar_capacity, + "selected_by_human": input.request.selected_by_human, + }); + let configuration_sha256 = canonical_digest(&configuration)?; + let layout_profile = LayoutProfile { + layout_profile_id: stable_id("layout", &configuration_sha256), + layout_profile_sha256: configuration_sha256.clone(), + }; + let map_id = stable_id( + "map", + &format!( + "{}:{}:{}", + input.deposit_id, input.revision_id, configuration_sha256 + ), + ); + let locators = locator_values(&input.manuscript, input.request.page_scalar_capacity); + let source = input.manuscript.chars().collect::>(); + let mut source_spans = input.spans.clone(); + source_spans.sort_by(|left, right| { + left.start + .cmp(&right.start) + .then_with(|| left.end.cmp(&right.end)) + .then_with(|| left.segment_id.as_bytes().cmp(right.segment_id.as_bytes())) + }); + validate_source_coverage(&source_spans, source.len())?; + let source_spans = merge_source_spans(source_spans)?; + + let mut segments = Vec::new(); + let mut structural_locators = Vec::new(); + let mut boundaries = Vec::new(); + for span in source_spans { + let ancestry_content_sha256 = raw_digest(span.text.as_bytes()); + let mut start = span.start; + while start < span.end { + let locator = locators[start]; + let mut end = start + 1; + while end < span.end && locators[end] == locator { + end += 1; + } + let text = source[start..end].iter().collect::(); + let segment_id = stable_id( + "segment", + &format!( + "{}:{}:{}:{}:{}", + input.deposit_id, span.ancestry_segment_id, start, end, ancestry_content_sha256 + ), + ); + let included_assertion_id = stable_id( + "assertion", + &format!("included:{}:{}", input.deposit_id, segment_id), + ); + let mut assertion_ids = vec![included_assertion_id.clone()]; + let mut selection_arrangement_assertion_ids = Vec::new(); + if input.request.selected_by_human { + let id = stable_id( + "assertion", + &format!("selected:{}:{}", input.deposit_id, segment_id), + ); + assertion_ids.push(id.clone()); + selection_arrangement_assertion_ids.push(id); + } + if input.request.arranged_by_human { + let id = stable_id( + "assertion", + &format!("arranged:{}:{}", input.deposit_id, segment_id), + ); + assertion_ids.push(id.clone()); + selection_arrangement_assertion_ids.push(id); + } + let status = segment_status(&span, input.source_verified); + let relationships = transformation_relationships(&span); + let content_sha256 = raw_digest(text.as_bytes()); + let segment = MapSegment { + schema_version: CPL_SCHEMA_VERSION.into(), + segment_id: segment_id.clone(), + project_id: input.project_id.clone(), + revision_id: input.revision_id.clone(), + segment_sequence: segments.len() + 1, + range: TextFragmentRange { + schema_version: CPL_SCHEMA_VERSION.into(), + document_revision_id: input.revision_id.clone(), + coordinate_system: "unicode_scalar".into(), + start, + end, + preimage_sha256: manuscript_sha256.clone(), + text_fragment_id: stable_id( + "fragment", + &format!("{}:{start}:{end}:{content_sha256}", input.revision_id), + ), + }, + content_sha256, + normalized_unicode_scalar_length: end - start, + recorded_origin_kind: span.origin, + actor_identity_status: actor_identity(span.origin).into(), + generation_status: if span.origin == RecordedOrigin::Unattested { + "unknown".into() + } else { + "recorded".into() + }, + lineage_status: if span.origin == RecordedOrigin::Unattested { + "unattested".into() + } else if span.lineage_reference_ids.is_empty() { + "unknown".into() + } else { + "recorded".into() + }, + lineage_reference_ids: sorted_unique( + span.lineage_reference_ids + .iter() + .cloned() + .chain(std::iter::once(span.ancestry_segment_id.clone())) + .collect(), + ), + operation_ids: sorted_unique(span.operation_ids.clone()), + transformation_relationships: relationships, + assertion_ids, + selection_arrangement_assertion_ids, + included_in_deposit_assertion_id: Some(included_assertion_id), + classification_status: status, + }; + if status != ClassificationStatus::Exact { + boundaries.push(boundary_for_segment(&segment, status)); + } + structural_locators.push(StructuralLocator { + segment_id, + chapter: Some(locator.chapter), + paragraph: Some(locator.paragraph), + page: Some(locator.page), + }); + segments.push(segment); + start = end; + } + } + validate_map_coverage(&segments, source.len())?; + + let recorded_positions = segments + .iter() + .filter(|segment| segment.recorded_origin_kind != RecordedOrigin::Unattested) + .map(|segment| segment.normalized_unicode_scalar_length) + .sum::(); + let classification_status = aggregate_status(&segments); + let coverage = Coverage { + denominator: source.len(), + recorded_positions, + coverage_status: if recorded_positions == source.len() { + "complete".into() + } else { + "partial".into() + }, + denominator_unit: "normalized_unicode_scalar_position".into(), + denominator_definition: "All normalized Unicode scalar positions in the exact frozen deposit manuscript; this is provenance coverage, not a human-authorship percentage.".into(), + }; + let mut contribution_map = ContributionMap { + schema_version: CPL_SCHEMA_VERSION.into(), + contribution_map_id: map_id, + project_id: input.project_id.clone(), + deposit_id: input.deposit_id.clone(), + deposit_sha256: deposit_sha256.clone(), + manuscript_revision_id: input.revision_id.clone(), + manuscript_revision_sha256: manuscript_sha256.clone(), + cpl_chain_head: input.cpl_chain_head.clone(), + cpl_event_sequence: input.cpl_event_sequence, + coordinate_system: "unicode_scalar".into(), + coverage, + layers: vec![ + "recorded_origin".into(), + "transformation".into(), + "selection_arrangement".into(), + "evidentiary_evaluation".into(), + "suggested_registration_treatment".into(), + "structural_locator".into(), + ], + segments, + structural_locators, + layout_profile: Some(layout_profile.clone()), + generator: GeneratorIdentity { + name: GENERATOR_NAME.into(), + version: GENERATOR_VERSION.into(), + configuration_sha256, + }, + classification_status, + contribution_map_sha256: String::new(), + }; + refresh_map_digest(&mut contribution_map)?; + + let deposit = DepositSnapshot { + schema_version: CPL_SCHEMA_VERSION.into(), + deposit_id: input.deposit_id, + project_id: input.project_id, + application_version: APPLICATION_VERSION.into(), + deposit_path: input.deposit_path, + media_type: "text/markdown; charset=utf-8".into(), + byte_length: input.manuscript.len(), + deposit_sha256, + manuscript_revision_id: input.revision_id, + manuscript_revision_sha256: manuscript_sha256, + cpl_chain_head: input.cpl_chain_head, + cpl_event_sequence: input.cpl_event_sequence, + layout_profile: Some(layout_profile), + created_at: input.source_timestamp.clone(), + }; + let assertions = build_assertions( + &contribution_map, + &deposit, + &input.source_event_id, + &input.source_timestamp, + )?; + let assertion_evaluations = build_evaluations( + &assertions, + &deposit, + &input.source_event_id, + &deposit.cpl_chain_head, + deposit.cpl_event_sequence, + &input.source_timestamp, + classification_status, + )?; + Ok(ContributionMapProjection { + deposit, + contribution_map, + assertions, + assertion_evaluations, + boundaries, + }) +} + +pub fn freeze_current( + root: &Path, + project_id: &str, + request: ContributionMapRequest, +) -> CplResult { + if request.page_scalar_capacity == 0 { + return Err(CplError::new( + "LAYOUT_PROFILE_INVALID", + "The page scalar capacity must be greater than zero.", + false, + )); + } + if let Some(existing) = load_latest(root, project_id)? { + let current = composition::reconstruct(root, project_id)?; + let config = configuration_digest(&request)?; + if existing.contribution_map.manuscript_revision_id == current.revision_id + && existing.contribution_map.generator.configuration_sha256 == config + { + return Ok(existing); + } + } + + let projection = composition::reconstruct(root, project_id)?; + if !projection.initialized || projection.manuscript.is_empty() { + return Err(CplError::new( + "CONTRIBUTION_MAP_EMPTY", + "Initialize and write the manuscript before freezing a contribution map.", + true, + )); + } + let paths = LedgerPaths::new(root); + let head = ledger::read_chain_head(&paths)?.ok_or_else(|| { + CplError::new( + "CONTRIBUTION_MAP_NO_CHAIN_HEAD", + "A frozen contribution map requires an existing CPL chain head.", + true, + ) + })?; + let source_verified = matches!( + verifier::verify_project(root, project_id)?.status, + VerificationStatus::Verified | VerificationStatus::VerifiedWithWarnings + ); + let deposit_sha256 = raw_digest(projection.manuscript.as_bytes()); + let config = configuration_digest(&request)?; + let deposit_id = stable_id( + "deposit", + &format!( + "{project_id}:{}:{deposit_sha256}:{}:{config}", + projection.revision_id, head.event_sha256 + ), + ); + let deposit_path = format!("deposits/{deposit_id}.md"); + let input = ContributionMapInput { + project_id: project_id.into(), + manuscript: projection.manuscript.clone(), + revision_id: projection.revision_id.clone(), + spans: projection.spans, + deposit_id: deposit_id.clone(), + deposit_path: deposit_path.clone(), + cpl_chain_head: head.event_sha256.clone(), + cpl_event_sequence: head.event_sequence, + source_event_id: head.event_id.clone(), + source_timestamp: head.updated_at.clone(), + source_verified, + request, + }; + let bundle = build(input)?; + write_deposit(root, &deposit_path, projection.manuscript.as_bytes())?; + let client_action_id = stable_id("action", &format!("contribution-map:{deposit_id}:{config}")); + let service = CplService::new(root, project_id); + let bundle_value = serde_json::to_value(&bundle).map_err(serialization_error)?; + let map_value = serde_json::to_value(&bundle.contribution_map).map_err(serialization_error)?; + let deposit_value = serde_json::to_value(&bundle.deposit).map_err(serialization_error)?; + let assertions = bundle.assertions.clone(); + let evaluations = bundle.assertion_evaluations.clone(); + let events = ledger::read_all_events(&paths)?; + if !events + .iter() + .any(|event| event.client_action_id == client_action_id) + { + service.write(WriteCommand { + client_action_id, + project_id: project_id.into(), + event_type: "CONTRIBUTION_MAP_FROZEN".into(), + actor: "system".into(), + metadata: json!({ + "contribution_map_id": bundle.contribution_map.contribution_map_id, + "deposit_id": bundle.deposit.deposit_id, + "manuscript_revision_id": bundle.deposit.manuscript_revision_id, + "source_chain_head": bundle.deposit.cpl_chain_head, + }), + records: std::iter::once(RecordInput { + record_type: "deposit-snapshot".into(), + payload: deposit_value, + }) + .chain(std::iter::once(RecordInput { + record_type: "contribution-map".into(), + payload: map_value, + })) + .chain(assertions.into_iter().map(|payload| RecordInput { + record_type: "provenance-assertion".into(), + payload, + })) + .chain(evaluations.into_iter().map(|payload| RecordInput { + record_type: "assertion-evaluation".into(), + payload, + })) + .chain(std::iter::once(RecordInput { + record_type: "contribution-map-bundle".into(), + payload: bundle_value, + })) + .collect(), + operational_state: None, + })?; + } + load_latest(root, project_id)?.ok_or_else(|| { + CplError::new( + "CONTRIBUTION_MAP_MISSING", + "The frozen contribution map could not be reconstructed from canonical records.", + false, + ) + }) +} + +pub fn load_latest(root: &Path, project_id: &str) -> CplResult> { + let events = ledger::read_all_events(&LedgerPaths::new(root))?; + for event in events.iter().rev() { + for reference in event.record_references.iter().rev() { + if reference.record_type != "contribution-map-bundle" { + continue; + } + let record = read_record(root, &reference.path)?; + let mut projection: ContributionMapProjection = serde_json::from_value(record.payload) + .map_err(|error| { + CplError::new("CONTRIBUTION_MAP_INVALID", error.to_string(), false) + })?; + if projection.deposit.project_id != project_id { + return Err(CplError::new( + "CONTRIBUTION_MAP_PROJECT_MISMATCH", + "The contribution map belongs to a different project.", + false, + )); + } + evaluate_current(root, project_id, &mut projection)?; + return Ok(Some(projection)); + } + } + Ok(None) +} + +pub fn canonical_map_bytes(map: &ContributionMap) -> CplResult> { + canonicalize(&serde_json::to_value(map).map_err(serialization_error)?) +} + +fn evaluate_current( + root: &Path, + project_id: &str, + projection: &mut ContributionMapProjection, +) -> CplResult<()> { + let current = composition::reconstruct(root, project_id)?; + let deposit_path = projection + .deposit + .deposit_path + .split('/') + .fold(root.to_path_buf(), |path, part| path.join(part)); + let mut global_status = projection.contribution_map.classification_status; + let mut global_boundary = None; + if !deposit_path.exists() { + global_status = ClassificationStatus::Degraded; + global_boundary = Some(( + "degraded", + "deposit_missing", + "The frozen deposit copy is unavailable.", + )); + } else { + let bytes = fs::read(&deposit_path) + .map_err(|error| CplError::io("Could not read the frozen deposit", error))?; + if raw_digest(&bytes) != projection.deposit.deposit_sha256 { + global_status = ClassificationStatus::Stale; + global_boundary = Some(( + "stale", + "deposit_changed", + "The frozen deposit digest no longer matches.", + )); + } + } + if current.revision_id != projection.deposit.manuscript_revision_id { + global_status = ClassificationStatus::Stale; + global_boundary = Some(( + "stale", + "revision_changed", + "The active manuscript revision differs from the frozen deposit revision.", + )); + } + let verification = verifier::verify_project(root, project_id)?; + if !matches!( + verification.status, + VerificationStatus::Verified | VerificationStatus::VerifiedWithWarnings + ) && global_status != ClassificationStatus::Stale + { + global_status = ClassificationStatus::Unverified; + global_boundary = Some(( + "unverified", + "verification", + "Native CPL verification is not currently conclusive.", + )); + } + if let Some((status, kind, message)) = global_boundary { + let denominator = projection.contribution_map.coverage.denominator; + projection.boundaries.push(ProjectionBoundary { + boundary_id: stable_id( + "boundary", + &format!("{}:{status}:{kind}", projection.deposit.deposit_id), + ), + status: status.into(), + kind: kind.into(), + start: 0, + end: denominator, + message: message.into(), + }); + for segment in &mut projection.contribution_map.segments { + segment.classification_status = global_status; + } + projection.contribution_map.classification_status = global_status; + } + let current_head = ledger::read_chain_head(&LedgerPaths::new(root))?.ok_or_else(|| { + CplError::new( + "CONTRIBUTION_MAP_NO_CHAIN_HEAD", + "The CPL chain head is missing.", + false, + ) + })?; + projection.assertion_evaluations = build_evaluations( + &projection.assertions, + &projection.deposit, + ¤t_head.event_id, + ¤t_head.event_sha256, + current_head.event_sequence, + ¤t_head.updated_at, + global_status, + )?; + refresh_map_digest(&mut projection.contribution_map)?; + projection.boundaries.sort_by(|left, right| { + left.start + .cmp(&right.start) + .then_with(|| left.end.cmp(&right.end)) + .then_with(|| { + left.boundary_id + .as_bytes() + .cmp(right.boundary_id.as_bytes()) + }) + }); + projection + .boundaries + .dedup_by(|left, right| left.boundary_id == right.boundary_id); + Ok(()) +} + +fn build_assertions( + map: &ContributionMap, + deposit: &DepositSnapshot, + source_event_id: &str, + source_timestamp: &str, +) -> CplResult> { + let mut assertions = Vec::new(); + for segment in &map.segments { + let predicates = std::iter::once(( + "included_in_deposit", + segment.included_in_deposit_assertion_id.clone().unwrap(), + )) + .chain( + segment + .selection_arrangement_assertion_ids + .iter() + .map(|id| { + let predicate = if id + == &stable_id( + "assertion", + &format!("selected:{}:{}", deposit.deposit_id, segment.segment_id), + ) { + "selected_by_human" + } else { + "arranged_by_human" + }; + (predicate, id.clone()) + }), + ); + for (predicate, assertion_id) in predicates { + let mut assertion = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "assertion_id": assertion_id, + "project_id": map.project_id, + "subject": {"entity_type": "other", "entity_id": segment.segment_id, "content_sha256": segment.content_sha256}, + "predicate": predicate, + "object": {"entity_type": "release", "entity_id": deposit.deposit_id, "content_sha256": deposit.deposit_sha256}, + "source_anchor": {"event_id": source_event_id, "event_sequence": deposit.cpl_event_sequence, "event_hash": deposit.cpl_chain_head}, + "source_generation": {"project_epoch": 1, "artifact_revision": null, "transcript_revision": null}, + "lifecycle_phase": "finalized", + "producer": {"subsystem": "contribution_map_generator", "application_version": APPLICATION_VERSION}, + "provenance": {"basis": if predicate == "included_in_deposit" {"deterministic_derivation"} else {"declared_relationship"}, "evidence": [{"evidence_id": source_event_id, "evidence_type": "provenance_event", "content_sha256": deposit.cpl_chain_head}]}, + "dependencies": [ + {"dependency_id": source_event_id, "dependency_type": "provenance_event", "expected_sha256": deposit.cpl_chain_head, "expected_generation": {"project_epoch": 1, "artifact_revision": null, "transcript_revision": null}, "evidence_class": "mandatory_retained", "role": "source_anchor", "confidence_dimensions": ["integrity", "chronology", "derivation"]}, + {"dependency_id": deposit.manuscript_revision_id, "dependency_type": "artifact_revision", "expected_sha256": deposit.manuscript_revision_sha256, "expected_generation": {"project_epoch": 1, "artifact_revision": null, "transcript_revision": null}, "evidence_class": "mandatory_retained", "role": "other", "confidence_dimensions": ["integrity", "derivation", "completeness"]} + ], + "reason_code": "DIRECT_HASH_LINKED_DERIVATION", + "created_at": source_timestamp, + }); + let digest = canonical_digest(&assertion)?; + assertion["assertion_sha256"] = Value::String(digest); + assertions.push(assertion); + } + } + assertions.sort_by(|left, right| { + left["assertion_id"] + .as_str() + .unwrap_or_default() + .as_bytes() + .cmp( + right["assertion_id"] + .as_str() + .unwrap_or_default() + .as_bytes(), + ) + }); + Ok(assertions) +} + +fn build_evaluations( + assertions: &[Value], + deposit: &DepositSnapshot, + evaluated_event_id: &str, + evaluated_chain_head: &str, + evaluated_event_sequence: u64, + evaluated_at: &str, + map_status: ClassificationStatus, +) -> CplResult> { + let (status, reason, boundary, dependency_status) = match map_status { + ClassificationStatus::Exact => ( + "exact", + "DIRECT_HASH_LINKED_DERIVATION", + Value::Null, + "valid", + ), + ClassificationStatus::Stale => ( + "stale", + "DEPENDENCY_GENERATION_MISMATCH", + json!({"kind":"dependency_change","affected_dimensions":["integrity","derivation","completeness"],"dependency_ids":[deposit.manuscript_revision_id],"compatibility":null}), + "changed", + ), + ClassificationStatus::Degraded => ( + "unverified", + "REQUIRED_EVIDENCE_MISSING", + json!({"kind":"evidence_access","affected_dimensions":["integrity","derivation","completeness"],"dependency_ids":[deposit.manuscript_revision_id],"compatibility":null}), + "missing", + ), + ClassificationStatus::Unverified => ( + "unverified", + "REQUIRED_PROVENANCE_UNKNOWN", + json!({"kind":"missing_provenance","affected_dimensions":["integrity","derivation","completeness"],"dependency_ids":[deposit.manuscript_revision_id],"compatibility":null}), + "not_evaluated", + ), + }; + let mut evaluations = Vec::new(); + for assertion in assertions { + let assertion_id = assertion["assertion_id"].as_str().unwrap_or_default(); + let assertion_sha256 = assertion["assertion_sha256"].as_str().unwrap_or_default(); + let evaluation_id = stable_id( + "evaluation", + &format!("{assertion_id}:{status}:{evaluated_event_id}"), + ); + evaluations.push(json!({ + "schema_version": CPL_SCHEMA_VERSION, + "evaluation_id": evaluation_id, + "assertion_id": assertion_id, + "assertion_sha256": assertion_sha256, + "project_id": deposit.project_id, + "evaluated_against": {"chain_head": evaluated_chain_head, "event_sequence": evaluated_event_sequence, "project_epoch": 1, "schema_catalog_sha256": schema_catalog_digest()}, + "evaluator": {"subsystem": "contribution_map_evaluator", "application_version": APPLICATION_VERSION}, + "status": status, + "confidence": {"integrity": if status == "exact" {"exact"} else {"unverified"}, "identity":"not_applicable", "chronology": if status == "exact" {"exact"} else {"unverified"}, "derivation": if status == "exact" {"exact"} else {"unverified"}, "authorship":"not_applicable", "completeness": if status == "exact" {"exact"} else {"unverified"}}, + "boundary": boundary, + "dependency_results": [ + {"dependency_id": assertion["source_anchor"]["event_id"], "evidence_class":"mandatory_retained", "status":"valid", "observed_sha256": deposit.cpl_chain_head, "observed_generation":{"project_epoch":1,"artifact_revision":null,"transcript_revision":null}}, + {"dependency_id": deposit.manuscript_revision_id, "evidence_class":"mandatory_retained", "status": dependency_status, "observed_sha256": if dependency_status == "valid" {Value::String(deposit.manuscript_revision_sha256.clone())} else {Value::Null}, "observed_generation":{"project_epoch":1,"artifact_revision":null,"transcript_revision":null}} + ], + "reason_code": reason, + "supersedes_evaluation_id": null, + "evaluated_at": evaluated_at, + })); + } + Ok(evaluations) +} + +fn locator_values(manuscript: &str, page_capacity: usize) -> Vec { + let chars = manuscript.chars().collect::>(); + let mut values = vec![ + LocatorValue { + chapter: 1, + paragraph: 1, + page: 1 + }; + chars.len() + ]; + let mut offset = 0usize; + let mut chapter = 1usize; + let mut paragraph = 0usize; + let mut seen_heading = false; + let mut previous_blank = true; + for line in manuscript.split_inclusive('\n') { + let visible = line.trim_end_matches(['\r', '\n']); + let blank = visible.trim().is_empty(); + let heading = visible.starts_with("# ") || visible.starts_with("## "); + if heading { + if seen_heading { + chapter += 1; + } + seen_heading = true; + } + if !blank && previous_blank { + paragraph += 1; + } + let line_length = line.chars().count(); + for index in offset..offset + line_length { + values[index] = LocatorValue { + chapter, + paragraph: paragraph.max(1), + page: index / page_capacity + 1, + }; + } + offset += line_length; + previous_blank = blank; + } + values +} + +fn merge_source_spans(spans: Vec) -> CplResult> { + let mut merged: Vec = Vec::new(); + for span in spans { + if let Some(previous) = merged.last_mut() { + if previous.end == span.start + && previous.origin == span.origin + && previous.ancestry_segment_id == span.ancestry_segment_id + && previous.lineage_reference_ids == span.lineage_reference_ids + && previous.operation_ids == span.operation_ids + { + previous.end = span.end; + previous.text.push_str(&span.text); + previous.content_sha256 = raw_digest(previous.text.as_bytes()); + continue; + } + } + merged.push(span); + } + Ok(merged) +} +fn validate_source_coverage(spans: &[ExpressionSpan], denominator: usize) -> CplResult<()> { + let mut cursor = 0usize; + for span in spans { + if span.start != cursor || span.end <= span.start || span.end > denominator { + return Err(CplError::new( + "CONTRIBUTION_MAP_SOURCE_COVERAGE_INVALID", + "Composition spans must be ordered, non-overlapping, and cover the frozen manuscript exactly.", + false, + )); + } + cursor = span.end; + } + if cursor != denominator { + return Err(CplError::new( + "CONTRIBUTION_MAP_SOURCE_COVERAGE_INVALID", + "Composition spans do not cover every frozen manuscript Unicode scalar.", + false, + )); + } + Ok(()) +} + +fn validate_map_coverage(segments: &[MapSegment], denominator: usize) -> CplResult<()> { + let mut cursor = 0usize; + for (index, segment) in segments.iter().enumerate() { + if segment.segment_sequence != index + 1 + || segment.range.start != cursor + || segment.range.end <= segment.range.start + || segment.normalized_unicode_scalar_length != segment.range.end - segment.range.start + { + return Err(CplError::new( + "CONTRIBUTION_MAP_COVERAGE_INVALID", + "Projected segments must provide complete ordered non-overlapping scalar coverage.", + false, + )); + } + cursor = segment.range.end; + } + if cursor != denominator { + return Err(CplError::new( + "CONTRIBUTION_MAP_COVERAGE_INVALID", + "Projected segment coverage does not equal the declared denominator.", + false, + )); + } + Ok(()) +} + +fn segment_status(span: &ExpressionSpan, source_verified: bool) -> ClassificationStatus { + if !source_verified { + ClassificationStatus::Unverified + } else if span.origin == RecordedOrigin::Unattested { + ClassificationStatus::Unverified + } else if span.lineage_reference_ids.is_empty() || span.operation_ids.is_empty() { + ClassificationStatus::Degraded + } else { + ClassificationStatus::Exact + } +} + +fn aggregate_status(segments: &[MapSegment]) -> ClassificationStatus { + if segments + .iter() + .any(|segment| segment.classification_status == ClassificationStatus::Stale) + { + ClassificationStatus::Stale + } else if segments + .iter() + .any(|segment| segment.classification_status == ClassificationStatus::Degraded) + { + ClassificationStatus::Degraded + } else if segments + .iter() + .any(|segment| segment.classification_status == ClassificationStatus::Unverified) + { + ClassificationStatus::Unverified + } else { + ClassificationStatus::Exact + } +} + +fn boundary_for_segment(segment: &MapSegment, status: ClassificationStatus) -> ProjectionBoundary { + let (name, kind, message) = if segment.recorded_origin_kind == RecordedOrigin::Unattested { + ( + "unattested", + "unattested_expression", + "No recorded origin resolves this surviving expression range.", + ) + } else if status == ClassificationStatus::Degraded { + ( + "degraded", + "lineage_incomplete", + "Recorded origin exists, but required lineage or operation evidence is incomplete.", + ) + } else { + ( + "unverified", + "verification", + "This range could not be verified against the current CPL evidence.", + ) + }; + ProjectionBoundary { + boundary_id: stable_id( + "boundary", + &format!( + "{}:{name}:{}:{}", + segment.segment_id, segment.range.start, segment.range.end + ), + ), + status: name.into(), + kind: kind.into(), + start: segment.range.start, + end: segment.range.end, + message: message.into(), + } +} + +fn transformation_relationships(span: &ExpressionSpan) -> Vec { + let mut values = BTreeSet::new(); + match span.origin { + RecordedOrigin::RecordedDirectHumanInput => { + values.insert( + if span + .lineage_reference_ids + .iter() + .any(|id| id.starts_with("operation_")) + { + "modified_by_human" + } else { + "inserted" + }, + ); + } + RecordedOrigin::HumanExpressiveInputViaTranscription => { + values.insert("transcribed_from_human_speech"); + } + RecordedOrigin::AcceptedAiOutput => { + values.insert("generated_by_ai"); + } + RecordedOrigin::ImportedOrPasted => { + values.insert("pasted_from_external"); + } + RecordedOrigin::SystemRestoration => { + values.insert("restored_from_revision"); + } + RecordedOrigin::Unattested => { + values.insert("derived_from"); + } + } + values.into_iter().map(str::to_owned).collect() +} + +fn actor_identity(origin: RecordedOrigin) -> &'static str { + match origin { + RecordedOrigin::RecordedDirectHumanInput + | RecordedOrigin::HumanExpressiveInputViaTranscription => "self_declared", + RecordedOrigin::AcceptedAiOutput | RecordedOrigin::SystemRestoration => "not_applicable", + RecordedOrigin::ImportedOrPasted | RecordedOrigin::Unattested => "unknown", + } +} + +fn configuration_digest(request: &ContributionMapRequest) -> CplResult { + canonical_digest(&json!({ + "algorithm": "unicode-scalar-structural-split-v1", + "arranged_by_human": request.arranged_by_human, + "page_scalar_capacity": request.page_scalar_capacity, + "selected_by_human": request.selected_by_human, + })) +} + +fn refresh_map_digest(map: &mut ContributionMap) -> CplResult<()> { + let mut identity = serde_json::to_value(&*map).map_err(serialization_error)?; + identity + .as_object_mut() + .expect("ContributionMap always serializes as an object") + .remove("contribution_map_sha256"); + map.contribution_map_sha256 = canonical_digest(&identity)?; + Ok(()) +} + +fn sorted_unique(values: Vec) -> Vec { + values + .into_iter() + .collect::>() + .into_iter() + .collect() +} + +fn raw_digest(bytes: &[u8]) -> String { + format!("sha256:{:x}", Sha256::digest(bytes)) +} + +fn schema_catalog_digest() -> String { + raw_digest(include_bytes!( + "../../../schemas/provenance/v1/catalog.json" + )) +} + +fn stable_id(prefix: &str, source: &str) -> String { + const ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ"; + let digest = Sha256::digest(source.as_bytes()); + let mut value = String::with_capacity(26); + let mut buffer = 0u32; + let mut bits = 0u8; + for byte in digest { + buffer = (buffer << 8) | u32::from(byte); + bits += 8; + while bits >= 5 && value.len() < 26 { + bits -= 5; + value.push(ALPHABET[((buffer >> bits) & 31) as usize] as char); + } + if value.len() == 26 { + break; + } + } + format!("{prefix}_{value}") +} + +fn write_deposit(root: &Path, relative: &str, bytes: &[u8]) -> CplResult<()> { + let path = relative + .split('/') + .fold(root.to_path_buf(), |path, part| path.join(part)); + let parent = path.parent().ok_or_else(|| { + CplError::new( + "DEPOSIT_PATH_INVALID", + "The deposit path has no parent.", + false, + ) + })?; + fs::create_dir_all(parent) + .map_err(|error| CplError::io("Could not create the deposits directory", error))?; + let temporary = parent.join(format!( + ".{}.tmp", + path.file_name().unwrap().to_string_lossy() + )); + fs::write(&temporary, bytes) + .map_err(|error| CplError::io("Could not stage the frozen deposit", error))?; + ledger::atomic_replace(&temporary, &path)?; + ledger::sync_directory(parent)?; + Ok(()) +} + +fn read_record(root: &Path, relative: &str) -> CplResult { + let path = relative + .split('/') + .fold(root.to_path_buf(), |path, part| path.join(part)); + let bytes = fs::read(&path) + .map_err(|error| CplError::io("Could not read a contribution-map record", error))?; + let record: CplRecord = serde_json::from_slice(&bytes).map_err(|error| { + CplError::new("CONTRIBUTION_MAP_RECORD_INVALID", error.to_string(), false) + })?; + if canonicalize(&serde_json::to_value(&record).map_err(serialization_error)?)? != bytes { + return Err(CplError::new( + "CONTRIBUTION_MAP_RECORD_NONCANONICAL", + format!("{} is not canonical JSON.", path.display()), + false, + )); + } + Ok(record) +} + +fn serialization_error(error: impl std::fmt::Display) -> CplError { + CplError::new( + "CONTRIBUTION_MAP_SERIALIZATION_FAILED", + error.to_string(), + false, + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::provenance::{composition::CompositionAction, identifiers::timestamp_millis}; + use tempfile::tempdir; + + fn formal_project_id() -> &'static str { + "project_01J00000000000000000000001" + } + + fn command(id: &str, action: CompositionAction) -> composition::CompositionCommand { + composition::CompositionCommand { + client_action_id: id.into(), + actor: "user".into(), + summary: id.into(), + occurred_at: timestamp_millis(), + action, + } + } + + fn sample_projection(spans: Vec) -> ContributionMapProjection { + sample_projection_with_verification(spans, true) + } + + fn sample_projection_with_verification( + spans: Vec, + source_verified: bool, + ) -> ContributionMapProjection { + build(ContributionMapInput { + project_id: formal_project_id().into(), + manuscript: "# One\n\nAlpha beta\n\n## Two\n\nGamma 🧵 delta".into(), + revision_id: "revision_01J0000000000000000000000B".into(), + spans, + deposit_id: "deposit_01J00000000000000000000000".into(), + deposit_path: "deposits/manuscript.md".into(), + cpl_chain_head: format!("sha256:{}", "4".repeat(64)), + cpl_event_sequence: 42, + source_event_id: "event_01J00000000000000000000004".into(), + source_timestamp: "2026-07-17T18:42:10.123Z".into(), + source_verified, + request: ContributionMapRequest { + page_scalar_capacity: 12, + selected_by_human: true, + arranged_by_human: true, + }, + }) + .unwrap() + } + + fn sample_spans() -> Vec { + let manuscript = "# One\n\nAlpha beta\n\n## Two\n\nGamma 🧵 delta"; + let split = manuscript.find("## Two").unwrap(); + let scalar_split = manuscript[..split].chars().count(); + let denominator = manuscript.chars().count(); + vec![ + ExpressionSpan { + segment_id: stable_id("segment", "source-one"), + ancestry_segment_id: stable_id("segment", "ancestry-one"), + start: 0, + end: scalar_split, + text: manuscript.chars().take(scalar_split).collect(), + content_sha256: raw_digest(manuscript[..split].as_bytes()), + origin: RecordedOrigin::RecordedDirectHumanInput, + lineage_reference_ids: vec![stable_id("operation", "op-one")], + operation_ids: vec![stable_id("operation", "op-one")], + }, + ExpressionSpan { + segment_id: stable_id("segment", "source-two"), + ancestry_segment_id: stable_id("segment", "ancestry-two"), + start: scalar_split, + end: denominator, + text: manuscript.chars().skip(scalar_split).collect(), + content_sha256: raw_digest(manuscript[split..].as_bytes()), + origin: RecordedOrigin::AcceptedAiOutput, + lineage_reference_ids: vec![stable_id("operation", "op-two")], + operation_ids: vec![stable_id("operation", "op-two")], + }, + ] + } + + #[test] + fn identical_canonical_input_is_byte_identical_for_any_span_order() { + let spans = sample_spans(); + let forward = sample_projection(spans.clone()); + let reverse = sample_projection(spans.into_iter().rev().collect()); + assert_eq!( + canonical_map_bytes(&forward.contribution_map).unwrap(), + canonical_map_bytes(&reverse.contribution_map).unwrap() + ); + assert_eq!(forward.contribution_map, reverse.contribution_map); + let mut identity = serde_json::to_value(&forward.contribution_map).unwrap(); + identity + .as_object_mut() + .unwrap() + .remove("contribution_map_sha256"); + assert_eq!( + canonical_digest(&identity).unwrap(), + forward.contribution_map.contribution_map_sha256 + ); + } + + #[test] + fn equivalent_adjacent_source_splits_merge_to_the_same_map() { + let original = sample_spans(); + let expected = sample_projection(original.clone()); + let first = &original[0]; + let split = 5usize; + let left_text = first.text.chars().take(split).collect::(); + let right_text = first.text.chars().skip(split).collect::(); + let mut left = first.clone(); + left.end = split; + left.text = left_text.clone(); + left.content_sha256 = raw_digest(left_text.as_bytes()); + let mut right = first.clone(); + right.start = split; + right.text = right_text.clone(); + right.content_sha256 = raw_digest(right_text.as_bytes()); + let actual = sample_projection(vec![right, original[1].clone(), left]); + assert_eq!(expected.contribution_map, actual.contribution_map); + } + #[test] + fn splits_at_structural_and_page_boundaries_without_losing_ancestry() { + let projection = sample_projection(sample_spans()); + let denominator = projection.contribution_map.coverage.denominator; + assert!(projection.contribution_map.segments.len() > 2); + assert_eq!( + projection + .contribution_map + .segments + .iter() + .map(|segment| segment.normalized_unicode_scalar_length) + .sum::(), + denominator + ); + assert!(projection + .contribution_map + .segments + .iter() + .all(|segment| !segment.lineage_reference_ids.is_empty())); + assert!(projection + .contribution_map + .structural_locators + .iter() + .any(|locator| locator.chapter == Some(2))); + assert!(projection + .contribution_map + .structural_locators + .iter() + .any(|locator| locator.page.unwrap() > 1)); + } + + #[test] + fn reports_unattested_coverage_without_calling_it_non_human() { + let mut spans = sample_spans(); + spans[0].origin = RecordedOrigin::Unattested; + spans[0].lineage_reference_ids.clear(); + spans[0].operation_ids.clear(); + let projection = sample_projection(spans); + assert_eq!( + projection.contribution_map.classification_status, + ClassificationStatus::Unverified + ); + assert_eq!( + projection.contribution_map.coverage.coverage_status, + "partial" + ); + assert!(projection + .contribution_map + .coverage + .denominator_definition + .contains("not a human-authorship percentage")); + assert!(projection + .boundaries + .iter() + .any(|boundary| boundary.status == "unattested")); + } + + #[test] + fn inconclusive_source_verification_is_visibly_unverified() { + let projection = sample_projection_with_verification(sample_spans(), false); + assert_eq!( + projection.contribution_map.classification_status, + ClassificationStatus::Unverified + ); + assert!(projection + .boundaries + .iter() + .all(|boundary| boundary.status == "unverified")); + } + #[test] + fn frozen_map_becomes_stale_after_a_later_composition_revision() { + let temp = tempdir().unwrap(); + let project_id = formal_project_id(); + composition::apply_command( + temp.path(), + project_id, + command( + "initialize_map", + CompositionAction::Initialize { + text: "Frozen text".into(), + origin: RecordedOrigin::Unattested, + }, + ), + ) + .unwrap(); + let frozen = + freeze_current(temp.path(), project_id, ContributionMapRequest::default()).unwrap(); + assert_eq!( + frozen.contribution_map.manuscript_revision_id, + composition::reconstruct(temp.path(), project_id) + .unwrap() + .revision_id + ); + composition::apply_command( + temp.path(), + project_id, + command( + "later_edit", + CompositionAction::Edit { + before_text: "Frozen text".into(), + after_text: "Frozen text changed".into(), + boundary: composition::CompositionBoundary::Idle, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ), + ) + .unwrap(); + let evaluated = load_latest(temp.path(), project_id).unwrap().unwrap(); + assert_eq!( + evaluated.contribution_map.classification_status, + ClassificationStatus::Stale + ); + assert!(evaluated + .boundaries + .iter() + .any(|boundary| boundary.status == "stale")); + assert!(evaluated + .assertion_evaluations + .iter() + .all(|evaluation| evaluation["status"] == "stale")); + } + #[test] + fn verified_frozen_map_is_exact_and_reused_for_identical_input() { + let temp = tempdir().unwrap(); + let project_id = formal_project_id(); + composition::apply_command( + temp.path(), + project_id, + command( + "exact_initialize", + CompositionAction::Initialize { + text: String::new(), + origin: RecordedOrigin::Unattested, + }, + ), + ) + .unwrap(); + composition::apply_command( + temp.path(), + project_id, + command( + "exact_human_edit", + CompositionAction::Edit { + before_text: String::new(), + after_text: "# Chapter\n\nRecorded expression".into(), + boundary: composition::CompositionBoundary::ExplicitSave, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ), + ) + .unwrap(); + let request = ContributionMapRequest::default(); + let first = freeze_current(temp.path(), project_id, request.clone()).unwrap(); + assert_eq!( + first.contribution_map.classification_status, + ClassificationStatus::Exact + ); + assert!(first.boundaries.is_empty()); + assert!(first + .assertion_evaluations + .iter() + .all(|evaluation| evaluation["status"] == "exact")); + let event_count = ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(); + let second = freeze_current(temp.path(), project_id, request).unwrap(); + assert_eq!(first.contribution_map, second.contribution_map); + assert_eq!( + ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(), + event_count + ); + } + #[test] + fn missing_frozen_deposit_is_visibly_degraded() { + let temp = tempdir().unwrap(); + let project_id = formal_project_id(); + composition::apply_command( + temp.path(), + project_id, + command( + "degraded_initialize", + CompositionAction::Initialize { + text: String::new(), + origin: RecordedOrigin::Unattested, + }, + ), + ) + .unwrap(); + composition::apply_command( + temp.path(), + project_id, + command( + "degraded_human_edit", + CompositionAction::Edit { + before_text: String::new(), + after_text: "Recorded expression".into(), + boundary: composition::CompositionBoundary::Checkpoint, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ), + ) + .unwrap(); + let frozen = + freeze_current(temp.path(), project_id, ContributionMapRequest::default()).unwrap(); + let deposit_path = frozen + .deposit + .deposit_path + .split('/') + .fold(temp.path().to_path_buf(), |path, part| path.join(part)); + fs::remove_file(deposit_path).unwrap(); + let evaluated = load_latest(temp.path(), project_id).unwrap().unwrap(); + assert_eq!( + evaluated.contribution_map.classification_status, + ClassificationStatus::Degraded + ); + assert!(evaluated + .boundaries + .iter() + .any(|boundary| boundary.status == "degraded")); + assert!(evaluated + .assertion_evaluations + .iter() + .all(|evaluation| evaluation["status"] == "unverified")); + } + #[test] + fn complex_unicode_has_complete_contiguous_segment_coverage() { + let manuscript = "# Café\n\nnaïve e\u{301} 🧑🏽‍💻 🇺🇳 中文\r\nline"; + let denominator = manuscript.chars().count(); + let span = ExpressionSpan { + segment_id: stable_id("segment", "unicode-source"), + ancestry_segment_id: stable_id("segment", "unicode-ancestry"), + start: 0, + end: denominator, + text: manuscript.into(), + content_sha256: raw_digest(manuscript.as_bytes()), + origin: RecordedOrigin::RecordedDirectHumanInput, + lineage_reference_ids: vec![stable_id("operation", "unicode-op")], + operation_ids: vec![stable_id("operation", "unicode-op")], + }; + let projection = build(ContributionMapInput { + project_id: formal_project_id().into(), + manuscript: manuscript.into(), + revision_id: "revision_01J0000000000000000000000B".into(), + spans: vec![span], + deposit_id: "deposit_01J00000000000000000000000".into(), + deposit_path: "deposits/unicode.md".into(), + cpl_chain_head: format!("sha256:{}", "7".repeat(64)), + cpl_event_sequence: 11, + source_event_id: "event_01J00000000000000000000004".into(), + source_timestamp: "2026-07-19T12:00:00.000Z".into(), + source_verified: true, + request: ContributionMapRequest { + page_scalar_capacity: 7, + selected_by_human: true, + arranged_by_human: true, + }, + }) + .unwrap(); + let segments = &projection.contribution_map.segments; + assert_eq!( + projection.contribution_map.coverage.denominator, + denominator + ); + assert_eq!( + segments + .iter() + .map(|segment| segment.normalized_unicode_scalar_length) + .sum::(), + denominator + ); + assert_eq!(segments.first().unwrap().range.start, 0); + assert_eq!(segments.last().unwrap().range.end, denominator); + assert!(segments + .windows(2) + .all(|pair| pair[0].range.end == pair[1].range.start)); + assert!(segments.iter().all(|segment| { + segment.range.end - segment.range.start == segment.normalized_unicode_scalar_length + })); + } +} diff --git a/src-tauri/src/provenance/explorer.rs b/src-tauri/src/provenance/explorer.rs new file mode 100644 index 0000000..1fc510f --- /dev/null +++ b/src-tauri/src/provenance/explorer.rs @@ -0,0 +1,559 @@ +//! Read-only CPL explorer and HARP traceability projection. + +use super::{ + composition::{self, CompositionProjection}, + contribution_map::{self, ContributionMapProjection}, + harp::{self, HarpProjection}, + ledger::{self, LedgerPaths}, + records::{CplRecord, VerificationReport}, + verifier, CplResult, +}; +use serde::Serialize; +use serde_json::Value; +use std::{collections::BTreeSet, fs, path::Path}; + +#[derive(Debug, Clone, Serialize)] +pub struct ExplorerRecord { + pub record_id: String, + pub record_type: String, + pub path: String, + pub record_sha256: String, + pub subject_ids: Vec, + pub accessible: bool, +} + +#[derive(Debug, Clone, Serialize)] +pub struct ExplorerEvent { + pub event_id: String, + pub event_sequence: u64, + pub timestamp: String, + pub event_type: String, + pub actor: String, + pub event_sha256: String, + pub previous_event_sha256: Option, + pub records: Vec, +} + +#[derive(Debug, Clone, Serialize)] +pub struct HarpStatementTrace { + pub statement_id: String, + pub harp_path: String, + pub statement: String, + pub category: String, + pub segment_ids: Vec, + pub assertion_ids: Vec, + pub evaluation_ids: Vec, + pub record_ids: Vec, + pub trace_note: String, +} + +#[derive(Debug, Clone, Serialize)] +pub struct CplExplorerProjection { + pub verification: VerificationReport, + pub events: Vec, + pub composition: CompositionProjection, + pub contribution_map: Option, + pub harp: Option, + pub harp_statement_traces: Vec, +} + +pub fn load(root: &Path, project_id: &str) -> CplResult { + let verification = verifier::verify_project(root, project_id)?; + let events = explorer_events(root)?; + let composition = composition::reconstruct(root, project_id)?; + let contribution_map = contribution_map::load_latest(root, project_id)?; + let harp = harp::load_latest(root, project_id)?; + let harp_statement_traces = match (&harp, &contribution_map) { + (Some(harp), Some(map)) => statement_traces(harp, map, &events), + _ => Vec::new(), + }; + Ok(CplExplorerProjection { + verification, + events, + composition, + contribution_map, + harp, + harp_statement_traces, + }) +} + +fn explorer_events(root: &Path) -> CplResult> { + ledger::read_all_events(&LedgerPaths::new(root))? + .into_iter() + .map(|event| { + let records = event + .record_references + .iter() + .map(|reference| { + let path = resolve_relative(root, &reference.path); + let record = fs::read(&path) + .ok() + .and_then(|bytes| serde_json::from_slice::(&bytes).ok()); + let subject_ids = record + .as_ref() + .map(|record| identifiers_in(&record.payload)) + .unwrap_or_default(); + ExplorerRecord { + record_id: reference.record_id.clone(), + record_type: reference.record_type.clone(), + path: reference.path.clone(), + record_sha256: reference.record_sha256.clone(), + subject_ids, + accessible: record.is_some(), + } + }) + .collect(); + Ok(ExplorerEvent { + event_id: event.event_id, + event_sequence: event.event_sequence, + timestamp: event.timestamp, + event_type: event.event_type, + actor: event.actor, + event_sha256: event.event_sha256, + previous_event_sha256: event.previous_event_sha256, + records, + }) + }) + .collect() +} + +fn statement_traces( + harp: &HarpProjection, + map: &ContributionMapProjection, + events: &[ExplorerEvent], +) -> Vec { + let all_segments = map + .contribution_map + .segments + .iter() + .map(|segment| segment.segment_id.clone()) + .collect::>(); + let all_assertions = map + .assertions + .iter() + .filter_map(|value| value["assertion_id"].as_str().map(str::to_owned)) + .collect::>(); + let all_evaluations = map + .assertion_evaluations + .iter() + .filter_map(|value| value["evaluation_id"].as_str().map(str::to_owned)) + .collect::>(); + let all_records = matching_records( + events, + &all_segments, + &all_assertions, + &all_evaluations, + &["human-authorship-record", "harp-export-manifest"], + ); + let approval_records = matching_records( + events, + &[], + &[], + &[], + &["harp-generation-approval", "human-authorship-record"], + ); + let mut traces = vec![ + trace( + "deposit-binding", + "deposit", + format!("Exact deposit {} is bound to manuscript revision {}.", harp.harp["deposit"]["deposit_sha256"].as_str().unwrap_or("unknown"), harp.harp["deposit"]["manuscript_revision_id"].as_str().unwrap_or("unknown")), + "evidence_fact", + &all_segments, + &all_assertions, + &all_evaluations, + &all_records, + "The deposit binding is supported by inclusion assertions, their current evaluations, the frozen map, and deposit records.", + ), + trace( + "cpl-binding", + "cpl_binding", + format!("HARP uses CPL chain sequence {} at {}.", harp.harp["cpl_binding"]["event_sequence"], harp.harp["cpl_binding"]["chain_head"].as_str().unwrap_or("unknown")), + "evidence_fact", + &all_segments, + &all_assertions, + &all_evaluations, + &all_records, + "The chain binding is checked only by the native verifier.", + ), + trace( + "contribution-map-binding", + "contribution_map", + format!("Contribution map {} has digest {}.", harp.harp["contribution_map"]["contribution_map_id"].as_str().unwrap_or("unknown"), harp.harp["contribution_map"]["contribution_map_sha256"].as_str().unwrap_or("unknown")), + "derived_classification", + &all_segments, + &all_assertions, + &all_evaluations, + &all_records, + "The map is a deterministic projection of recorded origin, lineage, assertions, and evaluations.", + ), + trace( + "evidentiary-status", + "evidentiary_status", + format!("Evidentiary status is {} and applicability is {}.", harp.harp["evidentiary_status"].as_str().unwrap_or("unknown"), harp.applicability_status), + "derived_classification", + &all_segments, + &all_assertions, + &all_evaluations, + &all_records, + "This status describes recorded evidence integrity and coverage; it is not a frontend validity or legal-authorship declaration.", + ), + trace( + "claim-summary", + "claim_summary", + harp.harp["claim_summary"].as_str().unwrap_or("No claim summary recorded.").to_owned(), + "derived_classification", + &all_segments, + &all_assertions, + &all_evaluations, + &all_records, + "Every included segment is connected to its inclusion assertion, current evaluation, and underlying composition records.", + ), + trace( + "coverage", + "coverage.statement", + harp.harp["coverage"]["statement"].as_str().unwrap_or("No coverage statement recorded.").to_owned(), + "derived_classification", + &all_segments, + &all_assertions, + &all_evaluations, + &all_records, + "Coverage counts normalized Unicode scalar positions with recorded provenance; it is never a human-authorship percentage.", + ), + trace( + "identity-declaration", + "identity_declaration", + format!("Identity was {} as {}.", harp.harp["identity_declaration"]["identity_status"].as_str().unwrap_or("unknown"), harp.harp["identity_declaration"]["declared_name"].as_str().unwrap_or("unnamed")), + "user_declaration", + &[], + &[], + &[], + &approval_records, + "Identity is a user declaration tied to the approval record; Thinkloom does not infer or verify it unless separate evidence is recorded.", + ), + trace( + "policy-profile", + "policy_profile", + format!("Registration suggestions use policy profile {} version {}, retrieved {}.", harp.harp["policy_profile"]["policy_profile_id"].as_str().unwrap_or("unknown"), harp.harp["policy_profile"]["profile_version"].as_str().unwrap_or("unknown"), harp.harp["policy_profile"]["retrieved_on"].as_str().unwrap_or("unknown")), + "evidence_fact", + &[], + &[], + &[], + &all_records, + "The immutable policy-profile identity and digest are embedded in the HARP record.", + ), + trace( + "registration-language", + "suggested_registration_language", + "Author Created, Material Excluded, New Material Included, and Note to CO language was explicitly approved.".into(), + "suggested_application_language", + &all_segments, + &all_assertions, + &all_evaluations, + &approval_records, + "The wording is an approved suggestion linked to the evidence set and approval event; it is editable and is not legal advice.", + ), + trace( + "limitations", + "limitation_codes", + format!("HARP records {} limitation codes.", harp.harp["limitation_codes"].as_array().map_or(0, Vec::len)), + "derived_classification", + &all_segments, + &all_assertions, + &all_evaluations, + &all_records, + "Limitations expose missing, degraded, sanitized, self-declared, or legally undetermined dimensions.", + ), + trace( + "legal-scope", + "explanation_codes", + harp.report_metadata.legal_scope_statement.clone(), + "legal_determination_not_made", + &[], + &[], + &[], + &all_records, + "This is an explicit boundary: Thinkloom does not make the listed legal determinations.", + ), + ]; + for (index, disclosure) in harp.harp["ai_system_disclosures"] + .as_array() + .into_iter() + .flatten() + .enumerate() + { + let segment_ids = disclosure["included_expression_segment_ids"] + .as_array() + .into_iter() + .flatten() + .filter_map(Value::as_str) + .map(str::to_owned) + .collect::>(); + let assertion_ids = assertion_ids_for_segments(map, &segment_ids); + let evaluation_ids = evaluation_ids_for_assertions(map, &assertion_ids); + let records = matching_records(events, &segment_ids, &assertion_ids, &evaluation_ids, &[]); + traces.push(trace( + &format!("ai-disclosure-{index}"), + &format!("ai_system_disclosures[{index}]"), + format!("Provider {} model {} is recorded for {} included segments.", disclosure["provider_id"].as_str().unwrap_or("unknown"), disclosure["model_id"].as_str().unwrap_or("unknown"), segment_ids.len()), + "evidence_fact", + &segment_ids, + &assertion_ids, + &evaluation_ids, + &records, + "AI-system identity is read from recorded invocation requests and joined to accepted-output segment lineage.", + )); + } + traces +} + +fn trace( + statement_id: &str, + harp_path: &str, + statement: String, + category: &str, + segment_ids: &[String], + assertion_ids: &[String], + evaluation_ids: &[String], + record_ids: &[String], + trace_note: &str, +) -> HarpStatementTrace { + HarpStatementTrace { + statement_id: statement_id.into(), + harp_path: harp_path.into(), + statement, + category: category.into(), + segment_ids: segment_ids.to_vec(), + assertion_ids: assertion_ids.to_vec(), + evaluation_ids: evaluation_ids.to_vec(), + record_ids: record_ids.to_vec(), + trace_note: trace_note.into(), + } +} + +fn assertion_ids_for_segments(map: &ContributionMapProjection, segments: &[String]) -> Vec { + map.contribution_map + .segments + .iter() + .filter(|segment| segments.contains(&segment.segment_id)) + .flat_map(|segment| segment.assertion_ids.iter().cloned()) + .collect::>() + .into_iter() + .collect() +} + +fn evaluation_ids_for_assertions( + map: &ContributionMapProjection, + assertions: &[String], +) -> Vec { + map.assertion_evaluations + .iter() + .filter(|value| { + value["assertion_id"] + .as_str() + .is_some_and(|id| assertions.iter().any(|assertion| assertion == id)) + }) + .filter_map(|value| value["evaluation_id"].as_str().map(str::to_owned)) + .collect() +} + +fn matching_records( + events: &[ExplorerEvent], + segments: &[String], + assertions: &[String], + evaluations: &[String], + record_types: &[&str], +) -> Vec { + let wanted = segments + .iter() + .chain(assertions) + .chain(evaluations) + .collect::>(); + events + .iter() + .flat_map(|event| &event.records) + .filter(|record| { + record_types.contains(&record.record_type.as_str()) + || record.subject_ids.iter().any(|id| wanted.contains(id)) + }) + .map(|record| record.record_id.clone()) + .collect::>() + .into_iter() + .collect() +} + +fn identifiers_in(value: &Value) -> Vec { + let mut values = BTreeSet::new(); + collect_identifiers(value, &mut values); + values.into_iter().collect() +} + +fn collect_identifiers(value: &Value, output: &mut BTreeSet) { + match value { + Value::String(value) if is_identifier(value) => { + output.insert(value.clone()); + } + Value::Array(values) => { + for value in values { + collect_identifiers(value, output); + } + } + Value::Object(values) => { + for value in values.values() { + collect_identifiers(value, output); + } + } + _ => {} + } +} + +fn is_identifier(value: &str) -> bool { + const PREFIXES: &[&str] = &[ + "assertion_", + "deposit_", + "disposition_", + "evaluation_", + "event_", + "fragment_", + "harp_", + "invocation_", + "map_", + "operation_", + "record_", + "revision_", + "segment_", + ]; + PREFIXES.iter().any(|prefix| value.starts_with(prefix)) +} + +fn resolve_relative(root: &Path, relative: &str) -> std::path::PathBuf { + relative + .split('/') + .fold(root.to_path_buf(), |path, part| path.join(part)) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn recursively_finds_traceable_identifiers_without_hashes_or_text() { + let value = serde_json::json!({ + "subject": { "segment_id": "segment_01J0000000000000000000000Y" }, + "dependencies": ["assertion_01J0000000000000000000000V"], + "digest": "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "text": "ordinary prose", + }); + assert_eq!( + identifiers_in(&value), + vec![ + "assertion_01J0000000000000000000000V".to_owned(), + "segment_01J0000000000000000000000Y".to_owned(), + ] + ); + } + + #[test] + fn every_evidentiary_harp_statement_links_to_native_cpl_evidence() { + use crate::provenance::{ + composition::{ + CompositionAction, CompositionBoundary, CompositionCommand, RecordedOrigin, + }, + contribution_map::ContributionMapRequest, + harp::{HarpGenerationRequest, RegistrationLanguageInput}, + identifiers::timestamp_millis, + records::VerificationStatus, + }; + + let temp = tempfile::tempdir().unwrap(); + let project_id = "project_01J00000000000000000000009"; + let apply = |id: &str, action: CompositionAction| { + composition::apply_command( + temp.path(), + project_id, + CompositionCommand { + client_action_id: id.into(), + actor: "user".into(), + summary: id.into(), + occurred_at: timestamp_millis(), + action, + }, + ) + .unwrap(); + }; + apply( + "explorer_initialize", + CompositionAction::Initialize { + text: String::new(), + origin: RecordedOrigin::Unattested, + }, + ); + apply( + "explorer_human_edit", + CompositionAction::Edit { + before_text: String::new(), + after_text: "Traceable human expression.".into(), + boundary: CompositionBoundary::ExplicitSave, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ); + contribution_map::freeze_current( + temp.path(), + project_id, + ContributionMapRequest::default(), + ) + .unwrap(); + harp::generate_current( + temp.path(), + project_id, + HarpGenerationRequest { + declared_name: Some("Example Author".into()), + identity_status: "self_declared".into(), + identity_evidence_reference_ids: vec![], + sanitization_profile: "sanitized".into(), + suggested_registration_language: RegistrationLanguageInput::default(), + user_approved: true, + }, + ) + .unwrap(); + + let projection = load(temp.path(), project_id).unwrap(); + assert_eq!(projection.verification.status, VerificationStatus::Verified); + assert!(!projection.events.is_empty()); + assert!(projection.harp.is_some()); + assert!(!projection.harp_statement_traces.is_empty()); + + for trace in &projection.harp_statement_traces { + assert!(!trace.statement.is_empty()); + assert!(!trace.harp_path.is_empty()); + assert!(!trace.record_ids.is_empty()); + if matches!( + trace.category.as_str(), + "derived_classification" | "suggested_application_language" + ) { + assert!(!trace.assertion_ids.is_empty()); + assert!(!trace.evaluation_ids.is_empty()); + } + } + let claim = projection + .harp_statement_traces + .iter() + .find(|trace| trace.statement_id == "claim-summary") + .unwrap(); + assert!(!claim.segment_ids.is_empty()); + assert!(!claim.assertion_ids.is_empty()); + assert!(!claim.evaluation_ids.is_empty()); + assert!(!claim.record_ids.is_empty()); + + let identity = projection + .harp_statement_traces + .iter() + .find(|trace| trace.statement_id == "identity-declaration") + .unwrap(); + assert_eq!(identity.category, "user_declaration"); + assert!(identity.assertion_ids.is_empty()); + assert!(identity.evaluation_ids.is_empty()); + assert!(!identity.record_ids.is_empty()); + } +} diff --git a/src-tauri/src/provenance/export.rs b/src-tauri/src/provenance/export.rs new file mode 100644 index 0000000..b66f63d --- /dev/null +++ b/src-tauri/src/provenance/export.rs @@ -0,0 +1,1036 @@ +//! Non-mutating HARP registration exports and privacy-preserving archives. +//! +//! Sanitized archives are deliberately selective. They bind retained structural +//! evidence to the source CPL and disclose every omitted category without +//! claiming to contain the complete private project. + +use super::{ + canonical::{canonical_digest, canonicalize, sha256_digest}, + contribution_map, + harp::{self, HarpProjection, LEGAL_SCOPE_STATEMENT}, + ledger::{self, LedgerPaths}, + records::CplRecord, + CplError, CplResult, CPL_SCHEMA_VERSION, +}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use std::{ + collections::{BTreeMap, BTreeSet}, + fs, + io::{Read, Write}, + path::{Path, PathBuf}, +}; +use walkdir::WalkDir; +use zip::{write::SimpleFileOptions, ZipArchive, ZipWriter}; + +const SELECTIVE_CLAIM: &str = "selective_disclosed_subset"; +const VERIFICATION_SCOPE: &str = "Verified against the disclosed retained evidence and source bindings. The sanitized archive is intentionally incomplete and is not evidence of complete project history, identity, or legal authorship."; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ExportFileBinding { + pub path: String, + pub sha256: String, + pub byte_length: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ExportBinding { + pub source_chain_head_sha256: String, + pub sanitization_profile: String, + pub omissions: Vec, + pub files: Vec, + pub content_sha256: String, +} + +impl ExportBinding { + pub fn verify(&self) -> CplResult { + let identity = serde_json::to_value(( + &self.source_chain_head_sha256, + &self.sanitization_profile, + &self.omissions, + &self.files, + )) + .map_err(serialization_error)?; + Ok(canonical_digest(&identity)? == self.content_sha256) + } +} + +pub fn disclosure_for_omission(category: &str, retained_binding: &Value) -> CplResult { + Ok(json!({ + "category": category, + "retained_binding_sha256": canonical_digest(retained_binding)?, + })) +} + +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct HarpExportRequest { + #[serde(default)] + pub redact_personal_identifiers: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct HarpExportArtifact { + pub role: String, + pub path: String, + pub sha256: String, + pub byte_length: u64, + pub privacy_classification: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct SanitizedArchiveVerification { + pub status: String, + pub archive_sha256: String, + pub source_chain_head: String, + pub harp_sha256: String, + pub deposit_sha256: String, + pub retained_file_count: usize, + pub omission_disclosure_count: usize, + pub completeness_claim: String, + pub verification_scope_statement: String, + pub findings: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct HarpExportResult { + pub export_directory: String, + pub artifacts: Vec, + pub sanitized_manifest: Value, + pub sanitized_verification: SanitizedArchiveVerification, +} + +#[derive(Clone)] +struct ArchiveEntry { + path: String, + bytes: Vec, +} + +pub fn create_harp_exports( + root: &Path, + project_id: &str, + request: HarpExportRequest, +) -> CplResult { + let harp = harp::load_latest(root, project_id)?.ok_or_else(|| { + CplError::new( + "HARP_EXPORT_REQUIRED", + "Generate and approve a HARP before creating registration exports.", + true, + ) + })?; + if harp.applicability_status != "current" { + return Err(CplError::new( + "HARP_EXPORT_STALE", + "The current HARP is stale. Freeze the current deposit and regenerate HARP before export.", + true, + )); + } + let map = contribution_map::load_latest(root, project_id)?.ok_or_else(|| { + CplError::new( + "HARP_EXPORT_MAP_REQUIRED", + "The HARP contribution map is unavailable.", + true, + ) + })?; + let harp_id = required_string(&harp.harp, "harp_id")?; + let harp_sha256 = required_string(&harp.harp, "harp_sha256")?; + let source_chain_head = required_string(&harp.harp["cpl_binding"], "chain_head")?; + let deposit_sha256 = required_string(&harp.harp["deposit"], "deposit_sha256")?; + let created_at = required_string(&harp.export_manifest, "created_at")?; + let export_directory = format!("exports/harp/{harp_id}"); + + let deposit_path = resolve_relative(root, &map.deposit.deposit_path); + let deposit = fs::read(&deposit_path) + .map_err(|error| CplError::io("Could not read the exact HARP deposit", error))?; + if sha256_digest(&deposit) != deposit_sha256 { + return Err(CplError::new( + "HARP_EXPORT_DEPOSIT_MISMATCH", + "The deposit copy no longer matches the HARP binding.", + false, + )); + } + + let declared_name = harp.harp["identity_declaration"]["declared_name"] + .as_str() + .unwrap_or_default(); + let worksheet = registration_worksheet(&harp, declared_name); + let readable = human_readable_harp(&harp, declared_name); + let machine = canonicalize(&harp.harp)?; + let sanitized_name = if request.redact_personal_identifiers && !declared_name.is_empty() { + "[REDACTED BY USER]" + } else { + declared_name + }; + let sanitized_worksheet = registration_worksheet(&harp, sanitized_name); + let sanitized_readable = human_readable_harp(&harp, sanitized_name); + + let separate = vec![ + ( + "registration_worksheet", + "registration-worksheet.md", + worksheet.into_bytes(), + "registration", + ), + ( + "human_readable_harp", + "human-readable-harp.md", + readable.into_bytes(), + "registration", + ), + ( + "machine_readable_harp", + "machine-readable-harp.json", + machine, + "registration", + ), + ( + "deposit_copy", + "deposit-copy.md", + deposit.clone(), + "deposit", + ), + ]; + let mut artifacts = Vec::new(); + for (role, name, bytes, privacy) in &separate { + let relative = format!("{export_directory}/{name}"); + write_relative(root, &relative, bytes)?; + artifacts.push(artifact(role, &relative, bytes, privacy)); + } + + let binding = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "harp_id": harp_id, + "harp_sha256": harp_sha256, + "deposit_sha256": deposit_sha256, + "contribution_map_id": harp.harp["contribution_map"]["contribution_map_id"], + "contribution_map_sha256": harp.harp["contribution_map"]["contribution_map_sha256"], + "source_chain_head": source_chain_head, + "source_event_sequence": harp.harp["cpl_binding"]["event_sequence"], + "applicability_status": harp.applicability_status, + "verification_scope_statement": VERIFICATION_SCOPE, + "legal_scope_statement": LEGAL_SCOPE_STATEMENT, + }); + let verification_binding = sanitized_verification_binding(&harp); + let omission_counts = omission_counts(root, &harp, request.redact_personal_identifiers)?; + let omissions = omission_disclosures( + &omission_counts, + &source_chain_head, + &harp_sha256, + &deposit_sha256, + )?; + + let mut sanitized_entries = vec![ + ArchiveEntry { + path: "registration-worksheet.md".into(), + bytes: sanitized_worksheet.into_bytes(), + }, + ArchiveEntry { + path: "human-readable-harp.md".into(), + bytes: sanitized_readable.into_bytes(), + }, + ArchiveEntry { + path: "evidence/harp-binding.json".into(), + bytes: canonicalize(&binding)?, + }, + ArchiveEntry { + path: "evidence/contribution-map.json".into(), + bytes: contribution_map::canonical_map_bytes(&map.contribution_map)?, + }, + ArchiveEntry { + path: "evidence/verification-binding.json".into(), + bytes: canonicalize(&verification_binding)?, + }, + ]; + sanitized_entries.sort_by(|left, right| left.path.cmp(&right.path)); + let sanitized_inventory = inventory(&sanitized_entries); + let rules_sha256 = canonical_digest(&Value::Array(omissions.clone()))?; + let export_id = harp_id.replacen("harp_", "record_", 1); + let sanitized_manifest = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "export_id": export_id, + "project_id": project_id, + "harp_id": harp_id, + "harp_sha256": harp_sha256, + "deposit_sha256": deposit_sha256, + "source_chain_head": source_chain_head, + "profile": "sanitized", + "completeness_claim": SELECTIVE_CLAIM, + "verification_scope_statement": VERIFICATION_SCOPE, + "omission_rules": omissions, + "rules_sha256": rules_sha256, + "files": sanitized_inventory, + "created_at": created_at, + }); + let manifest_bytes = canonicalize(&sanitized_manifest)?; + let sanitized_path = format!("{export_directory}/sanitized-supporting-archive.zip"); + write_archive( + root, + &sanitized_path, + &sanitized_entries, + "omission-manifest.json", + &manifest_bytes, + )?; + let sanitized_archive = fs::read(resolve_relative(root, &sanitized_path)) + .map_err(|error| CplError::io("Could not read the sanitized archive", error))?; + artifacts.push(artifact( + "sanitized_supporting_archive", + &sanitized_path, + &sanitized_archive, + "sanitized_evidence", + )); + + let full_entries = full_private_entries(root, &separate, &harp, &map.deposit.deposit_path)?; + let full_manifest = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "project_id": project_id, + "harp_id": harp_id, + "harp_sha256": harp_sha256, + "deposit_sha256": deposit_sha256, + "source_chain_head": source_chain_head, + "profile": "full_private", + "privacy_warning": "Contains private CPL records, ledger metadata, source bodies, and the exact deposit. Keep private unless each file has been reviewed.", + "files": inventory(&full_entries), + "created_at": created_at, + }); + let full_path = format!("{export_directory}/full-private-archive.zip"); + write_archive( + root, + &full_path, + &full_entries, + "full-private-manifest.json", + &canonicalize(&full_manifest)?, + )?; + let full_archive = fs::read(resolve_relative(root, &full_path)) + .map_err(|error| CplError::io("Could not read the full private archive", error))?; + artifacts.push(artifact( + "full_private_archive", + &full_path, + &full_archive, + "private", + )); + + let verification = verify_sanitized_archive( + &resolve_relative(root, &sanitized_path), + Some((&source_chain_head, &harp_sha256, &deposit_sha256)), + )?; + if verification.status != "verified_selective" { + return Err(CplError::new( + "HARP_SANITIZED_EXPORT_FAILED", + "The sanitized archive did not pass retained-evidence verification.", + false, + )); + } + Ok(HarpExportResult { + export_directory, + artifacts, + sanitized_manifest, + sanitized_verification: verification, + }) +} + +pub fn verify_sanitized_archive( + path: &Path, + expected: Option<(&str, &str, &str)>, +) -> CplResult { + let archive_bytes = fs::read(path) + .map_err(|error| CplError::io("Could not read the sanitized archive", error))?; + let file = fs::File::open(path) + .map_err(|error| CplError::io("Could not open the sanitized archive", error))?; + let mut archive = ZipArchive::new(file) + .map_err(|error| CplError::new("HARP_ARCHIVE_INVALID", error.to_string(), false))?; + let manifest: Value = { + let mut item = archive.by_name("omission-manifest.json").map_err(|_| { + CplError::new( + "HARP_ARCHIVE_MANIFEST_MISSING", + "The sanitized archive has no omission manifest.", + false, + ) + })?; + let mut bytes = Vec::new(); + item.read_to_end(&mut bytes) + .map_err(|error| CplError::io("Could not read the omission manifest", error))?; + serde_json::from_slice(&bytes).map_err(|error| { + CplError::new("HARP_ARCHIVE_MANIFEST_INVALID", error.to_string(), false) + })? + }; + let source_chain_head = required_string(&manifest, "source_chain_head")?; + let harp_sha256 = required_string(&manifest, "harp_sha256")?; + let deposit_sha256 = required_string(&manifest, "deposit_sha256")?; + let mut findings = Vec::new(); + if manifest["completeness_claim"] != SELECTIVE_CLAIM { + findings.push("The manifest does not declare a selective disclosed subset.".into()); + } + if manifest["verification_scope_statement"] != VERIFICATION_SCOPE { + findings.push("The verification scope statement is missing or changed.".into()); + } + let omissions = manifest["omission_rules"].as_array().ok_or_else(|| { + CplError::new( + "HARP_ARCHIVE_OMISSIONS_INVALID", + "The omission disclosure list is invalid.", + false, + ) + })?; + if canonical_digest(&Value::Array(omissions.clone()))? != manifest["rules_sha256"] { + findings.push("The omission-rule digest does not match.".into()); + } + let categories = omissions + .iter() + .filter_map(|rule| rule["category"].as_str()) + .collect::>(); + for category in omission_categories() { + if !categories.contains(category) { + findings.push(format!("Omission category {category} is not disclosed.")); + } + } + for rule in omissions { + let retained_identity = json!({ + "category": rule["category"], + "source_chain_head": source_chain_head, + "harp_sha256": harp_sha256, + "deposit_sha256": deposit_sha256, + }); + if canonical_digest(&retained_identity)? != rule["retained_binding_sha256"] { + findings.push(format!( + "Omission disclosure {} is not bound to the disclosed retained evidence.", + rule["category"].as_str().unwrap_or("unknown") + )); + } + let identity = json!({ + "category": rule["category"], + "action": rule["action"], + "count": rule["count"], + "retained_binding_sha256": rule["retained_binding_sha256"], + }); + if canonical_digest(&identity)? != rule["disclosure_sha256"] { + findings.push(format!( + "Omission disclosure {} has an invalid digest.", + rule["category"].as_str().unwrap_or("unknown") + )); + } + } + let files = manifest["files"].as_array().ok_or_else(|| { + CplError::new( + "HARP_ARCHIVE_FILES_INVALID", + "The retained-file inventory is invalid.", + false, + ) + })?; + let mut retained_files = BTreeMap::>::new(); + for binding in files { + let name = required_string(binding, "path")?; + if name.contains('\\') || name.starts_with('/') || name.contains("../") { + findings.push(format!("Unsafe retained path {name}.")); + continue; + } + match archive.by_name(&name) { + Ok(mut item) => { + let mut bytes = Vec::new(); + item.read_to_end(&mut bytes).map_err(|error| { + CplError::io("Could not read retained sanitized evidence", error) + })?; + if sha256_digest(&bytes) != binding["sha256"] + || bytes.len() as u64 != binding["size"].as_u64().unwrap_or(u64::MAX) + { + findings.push(format!("Retained file {name} does not match its binding.")); + } + retained_files.insert(name.clone(), bytes); + } + Err(_) => findings.push(format!("Retained file {name} is missing.")), + } + } + match retained_files.get("evidence/harp-binding.json") { + Some(bytes) => { + let binding: Value = serde_json::from_slice(bytes).map_err(|error| { + CplError::new("HARP_ARCHIVE_BINDING_INVALID", error.to_string(), false) + })?; + if binding["source_chain_head"] != source_chain_head + || binding["harp_sha256"] != harp_sha256 + || binding["deposit_sha256"] != deposit_sha256 + { + findings + .push("The retained HARP binding does not match the omission manifest.".into()); + } + if let Some(map_bytes) = retained_files.get("evidence/contribution-map.json") { + let mut map: Value = serde_json::from_slice(map_bytes).map_err(|error| { + CplError::new("HARP_ARCHIVE_MAP_INVALID", error.to_string(), false) + })?; + let recorded = map["contribution_map_sha256"].clone(); + map.as_object_mut() + .ok_or_else(|| { + CplError::new( + "HARP_ARCHIVE_MAP_INVALID", + "The retained contribution map is not an object.", + false, + ) + })? + .remove("contribution_map_sha256"); + if canonical_digest(&map)? != recorded + || binding["contribution_map_sha256"] != recorded + { + findings.push("The retained contribution map self-digest does not match the HARP binding.".into()); + } + } else { + findings.push("The retained contribution map is missing.".into()); + } + } + None => findings.push("The retained HARP binding is missing.".into()), + } + if let Some((chain, harp, deposit)) = expected { + if source_chain_head != chain || harp_sha256 != harp || deposit_sha256 != deposit { + findings.push( + "The archive does not match the expected CPL, HARP, or deposit binding.".into(), + ); + } + } + Ok(SanitizedArchiveVerification { + status: if findings.is_empty() { + "verified_selective".into() + } else { + "failed".into() + }, + archive_sha256: sha256_digest(&archive_bytes), + source_chain_head, + harp_sha256, + deposit_sha256, + retained_file_count: files.len(), + omission_disclosure_count: omissions.len(), + completeness_claim: SELECTIVE_CLAIM.into(), + verification_scope_statement: VERIFICATION_SCOPE.into(), + findings, + }) +} + +fn registration_worksheet(harp: &HarpProjection, declared_name: &str) -> String { + let language = &harp.harp["suggested_registration_language"]; + format!( + "# Registration worksheet\n\n- HARP: `{}`\n- Exact deposit: `{}`\n- CPL chain: `{}` at sequence `{}`\n- Applicant/author declaration: {}\n- Identity status: `{}`\n- HARP applicability: `{}`\n\n## Author Created\n\n{}\n\n## Material Excluded\n\n{}\n\n## New Material Included\n\n{}\n\n## Note to CO\n\n{}\n\nThis is suggested application language, not legal advice.\n\n{}\n", + harp.harp["harp_id"].as_str().unwrap_or("unknown"), + harp.harp["deposit"]["deposit_sha256"].as_str().unwrap_or("unknown"), + harp.harp["cpl_binding"]["chain_head"].as_str().unwrap_or("unknown"), + harp.harp["cpl_binding"]["event_sequence"], + if declared_name.is_empty() { "Not declared" } else { declared_name }, + harp.harp["identity_declaration"]["identity_status"].as_str().unwrap_or("unknown"), + harp.applicability_status, + language["author_created"].as_str().unwrap_or_default(), + language["material_excluded"].as_str().unwrap_or_default(), + language["new_material_included"].as_str().unwrap_or_default(), + language["note_to_co"].as_str().unwrap_or("None"), + LEGAL_SCOPE_STATEMENT, + ) +} + +fn human_readable_harp(harp: &HarpProjection, declared_name: &str) -> String { + format!( + "# Human Authorship Record of Provenance\n\n- HARP ID: `{}`\n- Exact deposit digest: `{}`\n- Manuscript revision: `{}`\n- CPL chain head / sequence: `{}` / `{}`\n- Evidentiary status: `{}`\n- Applicability: `{}`\n- Declared author: {}\n- Identity status: `{}`\n\n## Evidence claim\n\n{}\n\n## Coverage\n\n{}\n\nThis record verifies provenance integrity and retained evidence relationships. It does not report a human-authorship percentage and does not claim complete private history in a sanitized archive.\n\n{}\n", + harp.harp["harp_id"].as_str().unwrap_or("unknown"), + harp.harp["deposit"]["deposit_sha256"].as_str().unwrap_or("unknown"), + harp.harp["deposit"]["manuscript_revision_id"].as_str().unwrap_or("unknown"), + harp.harp["cpl_binding"]["chain_head"].as_str().unwrap_or("unknown"), + harp.harp["cpl_binding"]["event_sequence"], + harp.harp["evidentiary_status"].as_str().unwrap_or("unknown"), + harp.applicability_status, + if declared_name.is_empty() { "Not declared" } else { declared_name }, + harp.harp["identity_declaration"]["identity_status"].as_str().unwrap_or("unknown"), + harp.harp["claim_summary"].as_str().unwrap_or_default(), + harp.harp["coverage"]["statement"].as_str().unwrap_or_default(), + LEGAL_SCOPE_STATEMENT, + ) +} + +fn sanitized_verification_binding(harp: &HarpProjection) -> Value { + json!({ + "schema_version": CPL_SCHEMA_VERSION, + "harp_id": harp.harp["harp_id"], + "harp_sha256": harp.harp["harp_sha256"], + "native_cpl_status": harp.verification_artifact["native_cpl_verification"]["status"], + "event_count": harp.verification_artifact["native_cpl_verification"]["event_count"], + "record_count": harp.verification_artifact["native_cpl_verification"]["record_count"], + "dependency_checks": harp.verification_artifact["dependency_checks"], + "verification_scope_statement": VERIFICATION_SCOPE, + }) +} + +fn omission_counts( + root: &Path, + harp: &HarpProjection, + redact_personal_identifiers: bool, +) -> CplResult> { + let mut counts = omission_categories() + .iter() + .map(|category| ((*category).to_owned(), 0usize)) + .collect::>(); + for event in ledger::read_all_events(&LedgerPaths::new(root))? { + for reference in event.record_references { + let bytes = fs::read(resolve_relative(root, &reference.path)) + .map_err(|error| CplError::io("Could not inspect a private CPL record", error))?; + let record: CplRecord = serde_json::from_slice(&bytes).map_err(|error| { + CplError::new("HARP_EXPORT_RECORD_INVALID", error.to_string(), false) + })?; + let kind = record.payload["kind"].as_str().unwrap_or_default(); + if matches!(kind, "HUMAN_TURN_CREATED" | "ASSISTANT_TURN_CREATED") { + counts + .entry("private_conversation".into()) + .and_modify(|value| *value += 1); + } + if kind == "CLOUD_APPROVAL_CHANGED" { + counts + .entry("credential_authorization_material".into()) + .and_modify(|value| *value += 1); + } + if matches!( + kind, + "PROVIDER_CONTEXT_CHANGED" | "PROVIDER_INVOCATION_REQUESTED" + ) { + counts + .entry("provider_metadata_not_required".into()) + .and_modify(|value| *value += 1); + } + if contains_rejected_output(&record.payload) { + counts + .entry("rejected_model_output".into()) + .and_modify(|value| *value += 1); + } + if matches!( + reference.record_type.as_str(), + "composition-content" | "composition-initialization" | "phase1-operation" + ) { + counts + .entry("protected_source_body".into()) + .and_modify(|value| *value += 1); + } + counts + .entry("internal_path".into()) + .and_modify(|value| *value += 1); + } + } + counts + .entry("protected_source_body".into()) + .and_modify(|value| *value += 1); + if redact_personal_identifiers + && harp.harp["identity_declaration"]["declared_name"] + .as_str() + .is_some_and(|name| !name.is_empty()) + { + counts.insert("personal_identifier".into(), 1); + } + Ok(counts) +} + +fn contains_rejected_output(value: &Value) -> bool { + match value { + Value::Object(values) => { + values.get("disposition").and_then(Value::as_str) == Some("rejected") + || values + .get("rejectedRanges") + .or_else(|| values.get("rejected_ranges")) + .and_then(Value::as_array) + .is_some_and(|ranges| !ranges.is_empty()) + || values.values().any(contains_rejected_output) + } + Value::Array(values) => values.iter().any(contains_rejected_output), + _ => false, + } +} + +fn omission_disclosures( + counts: &BTreeMap, + source_chain_head: &str, + harp_sha256: &str, + deposit_sha256: &str, +) -> CplResult> { + omission_categories() + .iter() + .map(|category| { + let action = if *category == "personal_identifier" { + "redact" + } else { + "exclude" + }; + let retained = json!({ + "category": category, + "source_chain_head": source_chain_head, + "harp_sha256": harp_sha256, + "deposit_sha256": deposit_sha256, + }); + let identity = json!({ + "category": category, + "action": action, + "count": counts.get(*category).copied().unwrap_or_default(), + "retained_binding_sha256": canonical_digest(&retained)?, + }); + let mut disclosure = identity.clone(); + disclosure["disclosure_sha256"] = Value::String(canonical_digest(&identity)?); + Ok(disclosure) + }) + .collect() +} + +fn omission_categories() -> &'static [&'static str] { + &[ + "private_conversation", + "rejected_model_output", + "credential_authorization_material", + "personal_identifier", + "internal_path", + "provider_metadata_not_required", + "protected_source_body", + ] +} + +fn full_private_entries( + root: &Path, + separate: &[(&str, &str, Vec, &str)], + harp: &HarpProjection, + deposit_path: &str, +) -> CplResult> { + let mut entries = separate + .iter() + .map(|(_, name, bytes, _)| ArchiveEntry { + path: (*name).into(), + bytes: bytes.clone(), + }) + .collect::>(); + let roots = ["records", "provenance/ledger", &harp.report_directory]; + for relative_root in roots { + let absolute_root = resolve_relative(root, relative_root); + if !absolute_root.exists() { + continue; + } + for entry in WalkDir::new(&absolute_root) + .follow_links(false) + .into_iter() + .filter_map(Result::ok) + .filter(|entry| entry.file_type().is_file()) + { + let relative = entry + .path() + .strip_prefix(root) + .map_err(|error| { + CplError::new("HARP_EXPORT_PATH_INVALID", error.to_string(), false) + })? + .to_string_lossy() + .replace('\\', "/"); + let bytes = fs::read(entry.path()) + .map_err(|error| CplError::io("Could not read private HARP evidence", error))?; + entries.push(ArchiveEntry { + path: format!("project/{relative}"), + bytes, + }); + } + } + if !entries.iter().any(|entry| entry.path == "deposit-copy.md") { + entries.push(ArchiveEntry { + path: "deposit-copy.md".into(), + bytes: fs::read(resolve_relative(root, deposit_path)) + .map_err(|error| CplError::io("Could not read the private deposit", error))?, + }); + } + entries.sort_by(|left, right| left.path.cmp(&right.path)); + entries.dedup_by(|left, right| left.path == right.path); + Ok(entries) +} + +fn inventory(entries: &[ArchiveEntry]) -> Vec { + entries + .iter() + .map(|entry| { + json!({ + "path": entry.path, + "sha256": sha256_digest(&entry.bytes), + "size": entry.bytes.len(), + }) + }) + .collect() +} + +fn write_archive( + root: &Path, + relative: &str, + entries: &[ArchiveEntry], + manifest_name: &str, + manifest: &[u8], +) -> CplResult<()> { + let destination = resolve_relative(root, relative); + let parent = destination.parent().ok_or_else(|| { + CplError::new( + "HARP_EXPORT_PATH_INVALID", + "The archive path has no parent.", + false, + ) + })?; + fs::create_dir_all(parent) + .map_err(|error| CplError::io("Could not create the HARP export directory", error))?; + let temporary = destination.with_extension("zip.tmp"); + let file = fs::File::create(&temporary) + .map_err(|error| CplError::io("Could not stage the HARP archive", error))?; + let mut zip = ZipWriter::new(file); + let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Deflated); + for entry in entries { + zip.start_file(&entry.path, options) + .map_err(|error| CplError::new("HARP_ARCHIVE_WRITE_FAILED", error.to_string(), true))?; + zip.write_all(&entry.bytes) + .map_err(|error| CplError::io("Could not write a HARP archive entry", error))?; + } + zip.start_file(manifest_name, options) + .map_err(|error| CplError::new("HARP_ARCHIVE_WRITE_FAILED", error.to_string(), true))?; + zip.write_all(manifest) + .map_err(|error| CplError::io("Could not write the HARP archive manifest", error))?; + let mut output = zip + .finish() + .map_err(|error| CplError::new("HARP_ARCHIVE_WRITE_FAILED", error.to_string(), true))?; + output + .flush() + .map_err(|error| CplError::io("Could not flush the HARP archive", error))?; + output + .sync_all() + .map_err(|error| CplError::io("Could not sync the HARP archive", error))?; + ledger::atomic_replace(&temporary, &destination)?; + ledger::sync_directory(parent)?; + Ok(()) +} + +fn write_relative(root: &Path, relative: &str, bytes: &[u8]) -> CplResult<()> { + let destination = resolve_relative(root, relative); + let parent = destination.parent().ok_or_else(|| { + CplError::new( + "HARP_EXPORT_PATH_INVALID", + "The export path has no parent.", + false, + ) + })?; + fs::create_dir_all(parent) + .map_err(|error| CplError::io("Could not create the HARP export directory", error))?; + let temporary = parent.join(format!( + ".{}.tmp", + destination + .file_name() + .unwrap_or_default() + .to_string_lossy() + )); + fs::write(&temporary, bytes) + .map_err(|error| CplError::io("Could not stage a HARP export artifact", error))?; + ledger::atomic_replace(&temporary, &destination)?; + ledger::sync_directory(parent)?; + Ok(()) +} + +fn artifact(role: &str, path: &str, bytes: &[u8], privacy: &str) -> HarpExportArtifact { + HarpExportArtifact { + role: role.into(), + path: path.into(), + sha256: sha256_digest(bytes), + byte_length: bytes.len() as u64, + privacy_classification: privacy.into(), + } +} + +fn required_string(value: &Value, field: &str) -> CplResult { + value[field].as_str().map(str::to_owned).ok_or_else(|| { + CplError::new( + "HARP_EXPORT_BINDING_INVALID", + format!("The HARP export is missing {field}."), + false, + ) + }) +} + +fn resolve_relative(root: &Path, relative: &str) -> PathBuf { + relative + .split('/') + .fold(root.to_path_buf(), |path, part| path.join(part)) +} + +fn serialization_error(error: impl std::fmt::Display) -> CplError { + CplError::new("CPL_EXPORT_INVALID", error.to_string(), false) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn export_binding_detects_changes() { + let mut binding = ExportBinding { + source_chain_head_sha256: "sha256:a".into(), + sanitization_profile: "sanitized".into(), + omissions: vec!["private_conversation".into()], + files: vec![], + content_sha256: String::new(), + }; + let identity = serde_json::to_value(( + &binding.source_chain_head_sha256, + &binding.sanitization_profile, + &binding.omissions, + &binding.files, + )) + .unwrap(); + binding.content_sha256 = canonical_digest(&identity).unwrap(); + assert!(binding.verify().unwrap()); + binding.omissions.push("protected_source_body".into()); + assert!(!binding.verify().unwrap()); + } + + #[test] + fn rejection_detection_is_structural() { + assert!(contains_rejected_output(&json!({ + "disposition": "rejected" + }))); + assert!(contains_rejected_output(&json!({ + "nested": { "rejectedRanges": [{"start": 0, "end": 2}] } + }))); + assert!(!contains_rejected_output(&json!({ + "disposition": "accepted" + }))); + } + + #[test] + fn creates_six_separate_artifacts_and_verifies_selective_archive_without_mutation() { + use crate::provenance::{ + composition::{ + CompositionAction, CompositionBoundary, CompositionCommand, RecordedOrigin, + }, + contribution_map::ContributionMapRequest, + harp::{HarpGenerationRequest, RegistrationLanguageInput}, + identifiers::timestamp_millis, + }; + + let temp = tempfile::tempdir().unwrap(); + let project_id = "project_01J00000000000000000000010"; + let apply = |id: &str, action: CompositionAction| { + crate::provenance::composition::apply_command( + temp.path(), + project_id, + CompositionCommand { + client_action_id: id.into(), + actor: "user".into(), + summary: id.into(), + occurred_at: timestamp_millis(), + action, + }, + ) + .unwrap(); + }; + apply( + "export_initialize", + CompositionAction::Initialize { + text: String::new(), + origin: RecordedOrigin::Unattested, + }, + ); + apply( + "export_human_edit", + CompositionAction::Edit { + before_text: String::new(), + after_text: "Exact registered expression.".into(), + boundary: CompositionBoundary::ExplicitSave, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ); + crate::provenance::contribution_map::freeze_current( + temp.path(), + project_id, + ContributionMapRequest::default(), + ) + .unwrap(); + crate::provenance::harp::generate_current( + temp.path(), + project_id, + HarpGenerationRequest { + declared_name: Some("Example Author".into()), + identity_status: "self_declared".into(), + identity_evidence_reference_ids: vec![], + sanitization_profile: "full_private".into(), + suggested_registration_language: RegistrationLanguageInput::default(), + user_approved: true, + }, + ) + .unwrap(); + let head_before = ledger::read_chain_head(&LedgerPaths::new(temp.path())) + .unwrap() + .unwrap(); + + let result = create_harp_exports( + temp.path(), + project_id, + HarpExportRequest { + redact_personal_identifiers: true, + }, + ) + .unwrap(); + let roles = result + .artifacts + .iter() + .map(|artifact| artifact.role.as_str()) + .collect::>(); + assert_eq!( + roles, + BTreeSet::from([ + "registration_worksheet", + "human_readable_harp", + "machine_readable_harp", + "deposit_copy", + "sanitized_supporting_archive", + "full_private_archive", + ]) + ); + assert_eq!(result.sanitized_verification.status, "verified_selective"); + assert_eq!(result.sanitized_verification.omission_disclosure_count, 7); + assert_eq!( + result.sanitized_manifest["completeness_claim"], + SELECTIVE_CLAIM + ); + let head_after = ledger::read_chain_head(&LedgerPaths::new(temp.path())) + .unwrap() + .unwrap(); + assert_eq!( + head_before, head_after, + "export must not mutate the CPL chain" + ); + + let sanitized = result + .artifacts + .iter() + .find(|artifact| artifact.role == "sanitized_supporting_archive") + .unwrap(); + let file = fs::File::open(resolve_relative(temp.path(), &sanitized.path)).unwrap(); + let mut archive = ZipArchive::new(file).unwrap(); + let names = (0..archive.len()) + .map(|index| archive.by_index(index).unwrap().name().to_owned()) + .collect::>(); + assert!(!names.iter().any(|name| name.contains("records/") + || name.contains("ledger/") + || name == "deposit-copy.md" + || name == "machine-readable-harp.json")); + let mut readable = String::new(); + archive + .by_name("human-readable-harp.md") + .unwrap() + .read_to_string(&mut readable) + .unwrap(); + assert!(!readable.contains("Example Author")); + assert!(readable.contains("[REDACTED BY USER]")); + + let private = result + .artifacts + .iter() + .find(|artifact| artifact.role == "full_private_archive") + .unwrap(); + let file = fs::File::open(resolve_relative(temp.path(), &private.path)).unwrap(); + let mut archive = ZipArchive::new(file).unwrap(); + let names = (0..archive.len()) + .map(|index| archive.by_index(index).unwrap().name().to_owned()) + .collect::>(); + assert!(names + .iter() + .any(|name| name.starts_with("project/records/"))); + assert!(names + .iter() + .any(|name| name.starts_with("project/provenance/ledger/"))); + assert!(names.iter().any(|name| name == "deposit-copy.md")); + } +} diff --git a/src-tauri/src/provenance/harp.rs b/src-tauri/src/provenance/harp.rs new file mode 100644 index 0000000..8640d50 --- /dev/null +++ b/src-tauri/src/provenance/harp.rs @@ -0,0 +1,1472 @@ +//! Deterministic Human Authorship Record of Provenance generation. +//! +//! HARP projects already-recorded CPL evidence. It never calls a model, +//! classifies legal authorship, computes a human percentage, or decides +//! copyrightability. + +use super::{ + canonical::{canonical_digest, canonicalize}, + composition::{self, RecordedOrigin}, + contribution_map::{self, ClassificationStatus, ContributionMapProjection}, + ledger::{self, LedgerPaths}, + records::{CplEvent, CplRecord, RecordInput, VerificationStatus, WriteCommand}, + verifier, CplError, CplResult, CplService, CPL_SCHEMA_VERSION, +}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use sha2::{Digest, Sha256}; +use std::{ + collections::{BTreeMap, BTreeSet}, + fs, + path::{Path, PathBuf}, +}; + +const GENERATOR_VERSION: &str = "1.0.0"; +const APPLICATION_VERSION: &str = env!("CARGO_PKG_VERSION"); +const POLICY_FIXTURE: &str = include_str!( + "../../../schemas/provenance/v1/fixtures/valid/registration-policy-profile.valid.json" +); + +pub const LEGAL_SCOPE_STATEMENT: &str = "Copyrightability and registration scope remain determinations of the U.S. Copyright Office. HARP is a non-authoritative evidence projection; integrity verification does not determine identity, legal authorship, originality, copyrightability, ownership, or registrability."; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RegistrationLanguageInput { + pub author_created: String, + pub material_excluded: String, + pub new_material_included: String, + #[serde(default)] + pub note_to_co: Option, + #[serde(default)] + pub registration_treatment_suggestions: Vec, +} + +impl Default for RegistrationLanguageInput { + fn default() -> Self { + Self { + author_created: "Human-authored text and human revisions identified in the attached provenance record".into(), + material_excluded: "AI-generated text identified in the attached provenance record".into(), + new_material_included: "Human-authored text, revisions, selection, and arrangement identified in the attached provenance record".into(), + note_to_co: Some("This work contains disclosed AI-generated material; see the attached provenance record.".into()), + registration_treatment_suggestions: vec!["disclose_ai_use".into(), "manual_review_required".into()], + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct HarpGenerationRequest { + #[serde(default)] + pub declared_name: Option, + #[serde(default = "default_identity_status")] + pub identity_status: String, + #[serde(default)] + pub identity_evidence_reference_ids: Vec, + #[serde(default = "default_sanitization_profile")] + pub sanitization_profile: String, + #[serde(default)] + pub suggested_registration_language: RegistrationLanguageInput, + pub user_approved: bool, +} + +fn default_identity_status() -> String { + "self_declared".into() +} +fn default_sanitization_profile() -> String { + "full_private".into() +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +pub struct HarpDependencyBinding { + pub deposit_sha256: String, + pub manuscript_revision_id: String, + pub manuscript_revision_sha256: String, + pub contribution_map_sha256: String, + pub chain_head_sha256: String, + pub chain_event_sequence: u64, + pub policy_profile_sha256: String, + pub assertion_set_sha256: String, + pub dependency_set_sha256: String, + pub approval_sha256: String, +} + +pub fn is_stale(recorded: &HarpDependencyBinding, current: &HarpDependencyBinding) -> bool { + recorded != current +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct HarpReportMetadata { + pub deposit_sha256: String, + pub manuscript_revision_id: String, + pub manuscript_revision_sha256: String, + pub cpl_chain_head: String, + pub cpl_event_sequence: u64, + pub harp_schema_version: String, + pub harp_generator_version: String, + pub application_version: String, + pub policy_profile_id: String, + pub policy_profile_version: String, + pub policy_profile_sha256: String, + pub policy_retrieval_date: String, + pub sanitization_profile: String, + pub legal_scope_statement: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct GeneratedFile { + pub role: String, + pub path: String, + pub sha256: String, + pub size: usize, + pub privacy_classification: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct HarpProjection { + pub harp: Value, + pub export_manifest: Value, + pub verification_artifact: Value, + pub report_metadata: HarpReportMetadata, + pub dependencies: HarpDependencyBinding, + pub report_directory: String, + pub generated_files: Vec, + pub applicability_status: String, + pub stale_reasons: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +struct StoredHarpBundle { + projection: HarpProjection, + approval_request: HarpGenerationRequest, +} + +#[derive(Debug, Clone)] +struct PolicyProfile { + value: Value, + id: String, + version: String, + sha256: String, + retrieved_on: String, + status: String, +} + +struct Artifact { + path: String, + bytes: Vec, + privacy: String, +} +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HarpPreparation { + pub contribution_map: ContributionMapProjection, + pub ai_system_disclosures: Vec, + pub existing_harp: Option, + pub policy_profile: Value, + pub suggested_registration_language: RegistrationLanguageInput, + pub legal_scope_statement: String, +} + +pub fn prepare_current(root: &Path, project_id: &str) -> CplResult { + let contribution_map = contribution_map::load_latest(root, project_id)?.ok_or_else(|| { + CplError::new( + "HARP_CONTRIBUTION_MAP_REQUIRED", + "Freeze the exact deposit contribution map before preparing HARP.", + true, + ) + })?; + let policy = bundled_policy_profile()?; + let invocations = invocation_identities(root)?; + let ai_system_disclosures = ai_disclosures(&contribution_map, &invocations); + Ok(HarpPreparation { + contribution_map, + ai_system_disclosures, + existing_harp: load_latest(root, project_id)?, + policy_profile: policy.value, + suggested_registration_language: RegistrationLanguageInput::default(), + legal_scope_statement: LEGAL_SCOPE_STATEMENT.into(), + }) +} + +pub fn generate_current( + root: &Path, + project_id: &str, + request: HarpGenerationRequest, +) -> CplResult { + validate_request(&request)?; + let map = contribution_map::load_latest(root, project_id)?.ok_or_else(|| { + CplError::new( + "HARP_CONTRIBUTION_MAP_REQUIRED", + "Freeze the exact deposit contribution map before generating HARP.", + true, + ) + })?; + if map.contribution_map.classification_status == ClassificationStatus::Stale { + return Err(CplError::new( + "HARP_CONTRIBUTION_MAP_STALE", + "The contribution map is stale. Freeze the current manuscript before generating HARP.", + true, + )); + } + let policy = bundled_policy_profile()?; + let request_digest = + canonical_digest(&serde_json::to_value(&request).map_err(serialization_error)?)?; + let seed = source_dependency_seed(&map, &policy, &request_digest)?; + let service = CplService::new(root, project_id); + let approval = service.write(WriteCommand { + client_action_id: stable_id("action", &format!("harp-approval:{seed}")), + project_id: project_id.into(), + event_type: "HARP_GENERATION_APPROVED".into(), + actor: "user".into(), + metadata: json!({ + "contribution_map_id": map.contribution_map.contribution_map_id, + "deposit_id": map.deposit.deposit_id, + "request_sha256": request_digest, + "user_approved": true, + }), + records: vec![RecordInput { + record_type: "harp-generation-approval".into(), + payload: serde_json::to_value(&request).map_err(serialization_error)?, + }], + operational_state: None, + })?; + if let Some(existing) = load_latest(root, project_id)? { + if existing.dependencies.approval_sha256 == request_digest + && existing.dependencies.contribution_map_sha256 + == map.contribution_map.contribution_map_sha256 + && existing.applicability_status == "current" + { + return Ok(existing); + } + } + let native_verification = verifier::verify_project(root, project_id)?; + let invocations = invocation_identities(root)?; + let operations = representative_operations(root, &map, &request.sanitization_profile)?; + let mut projection = build_projection( + project_id, + &map, + &policy, + &request, + &request_digest, + &approval.event, + &invocations, + &operations, + &native_verification, + )?; + write_projection_files(root, &mut projection, &map, &operations)?; + let client_action_id = stable_id( + "action", + &format!("harp-generated:{}", projection.harp["harp_sha256"]), + ); + if !ledger::read_all_events(&LedgerPaths::new(root))? + .iter() + .any(|event| event.client_action_id == client_action_id) + { + let stored = StoredHarpBundle { + projection: projection.clone(), + approval_request: request, + }; + service.write(WriteCommand { + client_action_id, + project_id: project_id.into(), + event_type: "HARP_GENERATED".into(), + actor: "system".into(), + metadata: json!({ + "harp_id": projection.harp["harp_id"], + "harp_sha256": projection.harp["harp_sha256"], + "deposit_sha256": projection.dependencies.deposit_sha256, + "source_chain_head": projection.dependencies.chain_head_sha256, + }), + records: vec![ + RecordInput { + record_type: "human-authorship-record".into(), + payload: projection.harp.clone(), + }, + RecordInput { + record_type: "harp-export-manifest".into(), + payload: projection.export_manifest.clone(), + }, + RecordInput { + record_type: "harp-generation-bundle".into(), + payload: serde_json::to_value(stored).map_err(serialization_error)?, + }, + ], + operational_state: None, + })?; + } + Ok(projection) +} + +pub fn load_latest(root: &Path, project_id: &str) -> CplResult> { + for event in ledger::read_all_events(&LedgerPaths::new(root))? + .iter() + .rev() + { + for reference in event.record_references.iter().rev() { + if reference.record_type != "harp-generation-bundle" { + continue; + } + let record = read_record(root, &reference.path, false)?; + let stored: StoredHarpBundle = serde_json::from_value(record.payload) + .map_err(|error| CplError::new("HARP_RECORD_INVALID", error.to_string(), false))?; + if stored.projection.harp["project_id"] != project_id { + return Err(CplError::new( + "HARP_PROJECT_MISMATCH", + "The HARP belongs to a different project.", + false, + )); + } + let mut projection = stored.projection; + evaluate_current(root, project_id, &stored.approval_request, &mut projection)?; + return Ok(Some(projection)); + } + } + Ok(None) +} + +#[allow(clippy::too_many_arguments)] +fn build_projection( + project_id: &str, + map: &ContributionMapProjection, + policy: &PolicyProfile, + request: &HarpGenerationRequest, + request_digest: &str, + approval_event: &CplEvent, + invocations: &BTreeMap, + operations: &[Value], + native_verification: &super::VerificationReport, +) -> CplResult { + let dependencies = HarpDependencyBinding { + deposit_sha256: map.deposit.deposit_sha256.clone(), + manuscript_revision_id: map.deposit.manuscript_revision_id.clone(), + manuscript_revision_sha256: map.deposit.manuscript_revision_sha256.clone(), + contribution_map_sha256: map.contribution_map.contribution_map_sha256.clone(), + chain_head_sha256: map.deposit.cpl_chain_head.clone(), + chain_event_sequence: map.deposit.cpl_event_sequence, + policy_profile_sha256: policy.sha256.clone(), + assertion_set_sha256: assertion_set_digest(map)?, + dependency_set_sha256: dependency_set_digest(map)?, + approval_sha256: request_digest.into(), + }; + let harp_id = stable_id( + "harp", + &canonical_digest(&serde_json::to_value(&dependencies).map_err(serialization_error)?)?, + ); + let metadata = HarpReportMetadata { + deposit_sha256: dependencies.deposit_sha256.clone(), + manuscript_revision_id: dependencies.manuscript_revision_id.clone(), + manuscript_revision_sha256: dependencies.manuscript_revision_sha256.clone(), + cpl_chain_head: dependencies.chain_head_sha256.clone(), + cpl_event_sequence: dependencies.chain_event_sequence, + harp_schema_version: CPL_SCHEMA_VERSION.into(), + harp_generator_version: GENERATOR_VERSION.into(), + application_version: APPLICATION_VERSION.into(), + policy_profile_id: policy.id.clone(), + policy_profile_version: policy.version.clone(), + policy_profile_sha256: policy.sha256.clone(), + policy_retrieval_date: policy.retrieved_on.clone(), + sanitization_profile: request.sanitization_profile.clone(), + legal_scope_statement: LEGAL_SCOPE_STATEMENT.into(), + }; + let ai = ai_disclosures(map, invocations); + let origin_complete = map.contribution_map.coverage.coverage_status == "complete"; + let lineage_complete = map + .contribution_map + .segments + .iter() + .all(|segment| segment.lineage_status == "recorded"); + let generation_recorded = map + .contribution_map + .segments + .iter() + .all(|segment| segment.generation_status == "recorded"); + let ai_recorded = ai.iter().all(|item| item["identity_status"] == "recorded"); + let exact = map.contribution_map.classification_status == ClassificationStatus::Exact + && origin_complete + && lineage_complete + && generation_recorded + && ai_recorded + && policy.status == "current"; + let evidentiary_status = if exact { + "exact" + } else { + match map.contribution_map.classification_status { + ClassificationStatus::Stale => "stale", + ClassificationStatus::Unverified => "unverified", + _ => "degraded", + } + }; + let language = approved_language(request, &approval_event.event_id)?; + let operation_ids = operations + .iter() + .filter_map(|value| value["operation_id"].as_str().map(str::to_owned)) + .collect::>(); + let mut harp = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "harp_id": harp_id, + "project_id": project_id, + "application_version": APPLICATION_VERSION, + "generator_version": GENERATOR_VERSION, + "deposit": { + "deposit_id": map.deposit.deposit_id, + "deposit_sha256": map.deposit.deposit_sha256, + "manuscript_revision_id": map.deposit.manuscript_revision_id, + "manuscript_revision_sha256": map.deposit.manuscript_revision_sha256, + }, + "cpl_binding": { "chain_head": map.deposit.cpl_chain_head, "event_sequence": map.deposit.cpl_event_sequence }, + "contribution_map": { + "contribution_map_id": map.contribution_map.contribution_map_id, + "contribution_map_sha256": map.contribution_map.contribution_map_sha256, + }, + "policy_profile": { + "policy_profile_id": policy.id, + "profile_version": policy.version, + "profile_sha256": policy.sha256, + "retrieved_on": policy.retrieved_on, + "status": policy.status, + }, + "evidentiary_status": evidentiary_status, + "applicability_status": "current", + "generation_status": if generation_recorded { "recorded" } else { "unknown" }, + "origin_coverage_status": if origin_complete { "complete" } else { "partial" }, + "lineage_coverage_status": if lineage_complete { "complete" } else { "partial" }, + "identity_declaration": { + "declared_name": request.declared_name, + "identity_status": request.identity_status, + "evidence_reference_ids": sorted_unique(request.identity_evidence_reference_ids.clone()), + "user_approved": true, + }, + "claim_summary": claim_summary(map), + "ai_system_disclosures": ai, + "coverage": { + "unit": "normalized_unicode_scalar_positions", + "denominator": map.contribution_map.coverage.denominator, + "recorded_positions": map.contribution_map.coverage.recorded_positions, + "statement": format!("{} of {} normalized Unicode scalar positions have recorded origin. This is provenance coverage, not a human-authorship percentage.", map.contribution_map.coverage.recorded_positions, map.contribution_map.coverage.denominator), + }, + "suggested_registration_language": language, + "representative_transformation_operation_ids": operation_ids, + "limitation_codes": limitation_codes(request, map, &ai, policy, origin_complete, lineage_complete), + "explanation_codes": [ + "INTEGRITY_ONLY_VERIFICATION", "RECORDED_ORIGIN_NOT_LEGAL_AUTHORSHIP", + "SELECTION_ARRANGEMENT_IS_OVERLAY", "PAGE_LOCATORS_ARE_DERIVED", + "REGISTRATION_LANGUAGE_IS_SUGGESTED", "HARP_STALE_AFTER_EDIT" + ], + "sanitization_profile": request.sanitization_profile, + "harp_sha256": "", + }); + refresh_self_digest(&mut harp, "harp_sha256")?; + let verification_artifact = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "report_metadata": metadata, + "harp_id": harp["harp_id"], + "harp_sha256": harp["harp_sha256"], + "dependency_checks": { + "deposit_digest_matches": true, + "manuscript_revision_matches": true, + "contribution_map_digest_matches": true, + "assertion_set_digest": dependencies.assertion_set_sha256, + "dependency_set_digest": dependencies.dependency_set_sha256, + "policy_profile_digest_matches": true, + "approval_recorded": true, + }, + "native_cpl_verification": native_verification, + "verification_scope": LEGAL_SCOPE_STATEMENT, + }); + Ok(HarpProjection { + harp, + export_manifest: Value::Null, + verification_artifact, + report_metadata: metadata, + dependencies, + report_directory: format!("reports/harp/{harp_id}"), + generated_files: vec![], + applicability_status: "current".into(), + stale_reasons: vec![], + }) +} +fn write_projection_files( + root: &Path, + projection: &mut HarpProjection, + map: &ContributionMapProjection, + operations: &[Value], +) -> CplResult<()> { + let directory = &projection.report_directory; + let metadata = &projection.report_metadata; + let artifacts = vec![ + Artifact { + path: format!("{directory}/human-authorship-summary.md"), + bytes: summary_markdown(&projection.harp, metadata).into_bytes(), + privacy: "registration".into(), + }, + Artifact { + path: format!("{directory}/final-text-contribution-map.svg"), + bytes: contribution_map_svg(map, metadata).into_bytes(), + privacy: "registration".into(), + }, + Artifact { + path: format!("{directory}/representative-transformations.md"), + bytes: transformations_markdown(operations, metadata).into_bytes(), + privacy: privacy_class(&metadata.sanitization_profile).into(), + }, + Artifact { + path: format!("{directory}/ai-system-disclosure.md"), + bytes: ai_disclosure_markdown(&projection.harp, metadata).into_bytes(), + privacy: "registration".into(), + }, + Artifact { + path: format!("{directory}/coverage-and-limitations.md"), + bytes: coverage_markdown(&projection.harp, metadata).into_bytes(), + privacy: "registration".into(), + }, + Artifact { + path: format!("{directory}/registration-language.md"), + bytes: registration_markdown(&projection.harp, metadata).into_bytes(), + privacy: "registration".into(), + }, + Artifact { + path: format!("{directory}/harp.json"), + bytes: canonicalize(&projection.harp)?, + privacy: "registration".into(), + }, + Artifact { + path: format!("{directory}/verification-report.json"), + bytes: canonicalize(&projection.verification_artifact)?, + privacy: "registration".into(), + }, + Artifact { + path: format!("{directory}/contribution-map.json"), + bytes: contribution_map::canonical_map_bytes(&map.contribution_map)?, + privacy: "registration".into(), + }, + ]; + for artifact in &artifacts { + write_relative(root, &artifact.path, &artifact.bytes)?; + } + let mut archive = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "archive_id": stable_id("archive", projection.harp["harp_sha256"].as_str().unwrap_or_default()), + "harp_id": projection.harp["harp_id"], + "report_metadata": metadata, + "files": artifacts.iter().map(artifact_description).collect::>(), + "archive_sha256": "", + }); + refresh_self_digest(&mut archive, "archive_sha256")?; + let archive_path = format!("{directory}/supporting-archive-manifest.json"); + let archive_bytes = canonicalize(&archive)?; + write_relative(root, &archive_path, &archive_bytes)?; + let deposit_bytes = fs::read(resolve_relative(root, &map.deposit.deposit_path)) + .map_err(|error| CplError::io("Could not read the exact deposit", error))?; + let find = |suffix: &str| { + artifacts + .iter() + .find(|item| item.path.ends_with(suffix)) + .expect("fixed artifact exists") + }; + let summary = find("human-authorship-summary.md"); + let harp = find("harp.json"); + let map_file = find("contribution-map.json"); + let verify = find("verification-report.json"); + let files = vec![ + manifest_file("human_readable_harp", summary), + manifest_file("machine_readable_harp", harp), + manifest_file("contribution_map", map_file), + GeneratedFile { + role: "deposit_copy".into(), + path: map.deposit.deposit_path.clone(), + sha256: raw_digest(&deposit_bytes), + size: deposit_bytes.len(), + privacy_classification: "deposit".into(), + }, + manifest_file("verification_report", verify), + GeneratedFile { + role: "supporting_archive".into(), + path: archive_path, + sha256: raw_digest(&archive_bytes), + size: archive_bytes.len(), + privacy_classification: privacy_class(&metadata.sanitization_profile).into(), + }, + ]; + let sanitization_rules = json!({ + "profile": metadata.sanitization_profile, + "full_private": "Representative text excerpts may be retained in the private project.", + "sanitized": "Text bodies and protected source bodies are omitted; hashes and structural facts remain." + }); + let omissions = if metadata.sanitization_profile == "sanitized" { + vec![json!({ + "category": "protected_source_body", "action": "exclude", "count": 1, + "disclosure_sha256": canonical_digest(&json!({"category":"protected_source_body","action":"exclude","count":1}))? + })] + } else { + vec![] + }; + let mut manifest = json!({ + "schema_version": CPL_SCHEMA_VERSION, + "manifest_id": stable_id("manifest", projection.harp["harp_sha256"].as_str().unwrap_or_default()), + "project_id": projection.harp["project_id"], + "harp_id": projection.harp["harp_id"], + "harp_sha256": projection.harp["harp_sha256"], + "deposit_id": projection.harp["deposit"]["deposit_id"], + "deposit_sha256": projection.harp["deposit"]["deposit_sha256"], + "contribution_map_id": projection.harp["contribution_map"]["contribution_map_id"], + "contribution_map_sha256": projection.harp["contribution_map"]["contribution_map_sha256"], + "cpl_chain_head": projection.harp["cpl_binding"]["chain_head"], + "report_metadata": metadata, + "verification_report_sha256": raw_digest(&verify.bytes), + "sanitization_profile": metadata.sanitization_profile, + "sanitization_rules_sha256": canonical_digest(&sanitization_rules)?, + "omissions": omissions, + "files": files, + "created_at": map.deposit.created_at, + "manifest_sha256": "", + }); + refresh_self_digest(&mut manifest, "manifest_sha256")?; + write_relative( + root, + &format!("{directory}/manifest.json"), + &canonicalize(&manifest)?, + )?; + projection.export_manifest = manifest; + projection.generated_files = files; + Ok(()) +} + +fn evaluate_current( + root: &Path, + project_id: &str, + request: &HarpGenerationRequest, + projection: &mut HarpProjection, +) -> CplResult<()> { + let mut reasons = Vec::new(); + let policy = bundled_policy_profile()?; + let request_digest = + canonical_digest(&serde_json::to_value(request).map_err(serialization_error)?)?; + if composition::reconstruct(root, project_id)?.revision_id + != projection.dependencies.manuscript_revision_id + { + reasons.push("manuscript_revision_changed".into()); + } + let deposit = projection + .generated_files + .iter() + .find(|file| file.role == "deposit_copy"); + match deposit.and_then(|file| fs::read(resolve_relative(root, &file.path)).ok()) { + Some(bytes) if raw_digest(&bytes) == projection.dependencies.deposit_sha256 => {} + Some(_) => reasons.push("deposit_digest_changed".into()), + None => reasons.push("deposit_unavailable".into()), + } + match contribution_map::load_latest(root, project_id) { + Ok(Some(map)) => { + if map.contribution_map.contribution_map_sha256 + != projection.dependencies.contribution_map_sha256 + { + reasons.push("contribution_map_changed".into()); + } + if assertion_set_digest(&map)? != projection.dependencies.assertion_set_sha256 { + reasons.push("assertion_set_changed".into()); + } + if dependency_set_digest(&map)? != projection.dependencies.dependency_set_sha256 { + reasons.push("dependency_set_changed".into()); + } + if map.contribution_map.classification_status == ClassificationStatus::Stale { + reasons.push("contribution_map_stale".into()); + } + } + Ok(None) => reasons.push("contribution_map_unavailable".into()), + Err(_) => reasons.push("contribution_map_or_dependency_unverified".into()), + } + if policy.sha256 != projection.dependencies.policy_profile_sha256 { + reasons.push("policy_profile_changed".into()); + } + if request_digest != projection.dependencies.approval_sha256 { + reasons.push("approval_changed".into()); + } + if !matches!( + verifier::verify_project(root, project_id).map(|report| report.status), + Ok(VerificationStatus::Verified | VerificationStatus::VerifiedWithWarnings) + ) { + reasons.push("cpl_verification_failed".into()); + } + reasons.sort(); + reasons.dedup(); + if reasons.is_empty() { + projection.applicability_status = "current".into(); + projection.stale_reasons.clear(); + } else { + projection.applicability_status = "stale".into(); + projection.stale_reasons = reasons; + projection.harp["applicability_status"] = json!("stale"); + projection.harp["evidentiary_status"] = json!("stale"); + } + Ok(()) +} +fn validate_request(request: &HarpGenerationRequest) -> CplResult<()> { + if !request.user_approved { + return Err(CplError::new("HARP_APPROVAL_REQUIRED", "HARP generation requires explicit user approval of identity and suggested registration language.", true)); + } + if !matches!( + request.identity_status.as_str(), + "verified" | "self_declared" | "unknown" + ) { + return Err(CplError::new( + "HARP_IDENTITY_STATUS_INVALID", + "identityStatus must be verified, self_declared, or unknown.", + false, + )); + } + if !matches!( + request.sanitization_profile.as_str(), + "full_private" | "sanitized" + ) { + return Err(CplError::new( + "HARP_SANITIZATION_INVALID", + "sanitizationProfile must be full_private or sanitized.", + false, + )); + } + let language = &request.suggested_registration_language; + for (name, value, maximum) in [ + ("authorCreated", language.author_created.as_str(), 1000usize), + ( + "materialExcluded", + language.material_excluded.as_str(), + 1000, + ), + ( + "newMaterialIncluded", + language.new_material_included.as_str(), + 1000, + ), + ] { + if value.chars().count() > maximum { + return Err(CplError::new( + "HARP_LANGUAGE_TOO_LONG", + format!("{name} exceeds {maximum} characters."), + true, + )); + } + } + if request + .declared_name + .as_deref() + .is_none_or(|name| name.trim().is_empty()) + && request.identity_status != "unknown" + { + return Err(CplError::new( + "HARP_DECLARED_NAME_REQUIRED", + "A declared name is required unless identity status is unknown.", + true, + )); + } + Ok(()) +} + +fn approved_language(request: &HarpGenerationRequest, approval_event_id: &str) -> CplResult { + let input = &request.suggested_registration_language; + let mut treatments = sorted_unique(input.registration_treatment_suggestions.clone()); + if treatments.is_empty() { + treatments.push("no_suggestion".into()); + } + let allowed = [ + "claim_as_human_contribution", + "exclude_ai_generated_material", + "describe_new_human_material", + "disclose_ai_use", + "manual_review_required", + "no_suggestion", + ]; + if treatments + .iter() + .any(|value| !allowed.contains(&value.as_str())) + { + return Err(CplError::new( + "HARP_TREATMENT_INVALID", + "A registration treatment suggestion is not recognized by the policy profile.", + false, + )); + } + let identity = json!({ + "author_created": input.author_created, + "material_excluded": input.material_excluded, + "new_material_included": input.new_material_included, + "note_to_co": input.note_to_co, + "registration_treatment_suggestions": treatments, + }); + Ok(json!({ + "author_created": input.author_created, + "material_excluded": input.material_excluded, + "new_material_included": input.new_material_included, + "note_to_co": input.note_to_co, + "registration_treatment_suggestions": treatments, + "user_approved": true, + "approval_event_id": approval_event_id, + "approved_language_sha256": canonical_digest(&identity)?, + })) +} + +fn bundled_policy_profile() -> CplResult { + let fixture: Value = serde_json::from_str(POLICY_FIXTURE) + .map_err(|error| CplError::new("HARP_POLICY_INVALID", error.to_string(), false))?; + let value = fixture["instance"].clone(); + let mut identity = value.clone(); + let object = identity.as_object_mut().ok_or_else(|| { + CplError::new( + "HARP_POLICY_INVALID", + "The bundled policy profile is not an object.", + false, + ) + })?; + let declared = object + .remove("profile_sha256") + .and_then(|value| value.as_str().map(str::to_owned)) + .ok_or_else(|| { + CplError::new( + "HARP_POLICY_INVALID", + "The bundled policy profile has no digest.", + false, + ) + })?; + if declared != canonical_digest(&identity)? { + return Err(CplError::new( + "HARP_POLICY_DIGEST_INVALID", + "The bundled policy profile digest does not verify.", + false, + )); + } + let retrieved_on = value["official_sources"] + .as_array() + .and_then(|sources| { + sources + .iter() + .filter_map(|source| source["retrieved_on"].as_str()) + .max() + }) + .unwrap_or("unknown") + .to_owned(); + let compatible = value["compatible_application_versions"] + .as_array() + .is_some_and(|versions| { + versions + .iter() + .any(|version| version == APPLICATION_VERSION) + }); + Ok(PolicyProfile { + id: value["policy_profile_id"] + .as_str() + .unwrap_or_default() + .into(), + version: value["profile_version"].as_str().unwrap_or_default().into(), + sha256: declared, + retrieved_on, + status: if compatible { "current" } else { "superseded" }.into(), + value, + }) +} + +fn source_dependency_seed( + map: &ContributionMapProjection, + policy: &PolicyProfile, + approval_sha256: &str, +) -> CplResult { + canonical_digest(&json!({ + "deposit_sha256": map.deposit.deposit_sha256, + "revision_id": map.deposit.manuscript_revision_id, + "map_sha256": map.contribution_map.contribution_map_sha256, + "policy_sha256": policy.sha256, + "assertions_sha256": assertion_set_digest(map)?, + "dependencies_sha256": dependency_set_digest(map)?, + "approval_sha256": approval_sha256, + })) +} + +fn assertion_set_digest(map: &ContributionMapProjection) -> CplResult { + canonical_digest(&json!({ "assertions": map.assertions })) +} + +fn dependency_set_digest(map: &ContributionMapProjection) -> CplResult { + canonical_digest(&json!({ + "assertion_dependencies": map.assertions.iter().map(|value| value.get("dependencies").cloned().unwrap_or(Value::Null)).collect::>(), + "segment_lineage": map.contribution_map.segments.iter().map(|segment| json!({ + "segment_id": segment.segment_id, + "lineage_reference_ids": segment.lineage_reference_ids, + "operation_ids": segment.operation_ids, + })).collect::>(), + "generator_configuration_sha256": map.contribution_map.generator.configuration_sha256, + })) +} + +fn claim_summary(map: &ContributionMapProjection) -> String { + format!("CPL records origin and lineage for {} of {} normalized Unicode scalar positions in the exact deposit, including recorded transformations and accepted AI output where present. These are evidence facts, not legal authorship or copyrightability conclusions.", map.contribution_map.coverage.recorded_positions, map.contribution_map.coverage.denominator) +} + +fn limitation_codes( + request: &HarpGenerationRequest, + map: &ContributionMapProjection, + ai: &[Value], + policy: &PolicyProfile, + origin_complete: bool, + lineage_complete: bool, +) -> Vec { + let mut values = BTreeSet::new(); + match request.identity_status.as_str() { + "self_declared" => { + values.insert("SELF_DECLARED_IDENTITY".to_owned()); + } + "unknown" => { + values.insert("UNKNOWN_IDENTITY".to_owned()); + } + _ => {} + } + if !origin_complete { + values.insert("UNKNOWN_ORIGIN".into()); + } + if !lineage_complete { + values.insert("UNKNOWN_LINEAGE".into()); + } + if map + .contribution_map + .segments + .iter() + .any(|segment| segment.generation_status == "unknown") + { + values.insert("UNKNOWN_GENERATION".into()); + } + if map + .contribution_map + .segments + .iter() + .any(|segment| segment.recorded_origin_kind == RecordedOrigin::Unattested) + { + values.insert("UNATTESTED_EXPRESSION".into()); + } + if map.contribution_map.classification_status != ClassificationStatus::Exact { + values.insert("DEGRADED_COVERAGE".into()); + } + if ai.iter().any(|value| value["identity_status"] == "unknown") { + values.insert("UNKNOWN_GENERATION".into()); + } + if policy.status != "current" { + values.insert("SUPERSEDED_POLICY_PROFILE".into()); + } + if request.sanitization_profile == "sanitized" { + values.insert("SANITIZED_EVIDENCE".into()); + } + values.insert("COPYRIGHT_OFFICE_DETERMINES_SCOPE".into()); + values.into_iter().collect() +} + +fn invocation_identities(root: &Path) -> CplResult> { + let mut identities = BTreeMap::new(); + for event in ledger::read_all_events(&LedgerPaths::new(root))? { + for reference in event.record_references { + if reference.record_type != "invocation-request" { + continue; + } + let record = read_record(root, &reference.path, true)?; + let id = record.payload["invocationId"] + .as_str() + .or_else(|| record.payload["invocation_id"].as_str()); + let provider = &record.payload["provider"]; + let provider_id = provider["kind"] + .as_str() + .or_else(|| provider["name"].as_str()); + let model_id = provider["model"].as_str(); + if let (Some(id), Some(provider_id), Some(model_id)) = (id, provider_id, model_id) { + identities.insert(id.into(), (provider_id.into(), model_id.into())); + } + } + } + Ok(identities) +} + +fn ai_disclosures( + map: &ContributionMapProjection, + invocations: &BTreeMap, +) -> Vec { + let mut grouped: BTreeMap<(Option, Option), BTreeSet> = BTreeMap::new(); + for segment in &map.contribution_map.segments { + if segment.recorded_origin_kind != RecordedOrigin::AcceptedAiOutput { + continue; + } + let identity = segment + .lineage_reference_ids + .iter() + .find_map(|id| invocations.get(id)) + .cloned(); + let key = identity.map_or((None, None), |(provider, model)| { + (Some(provider), Some(model)) + }); + grouped + .entry(key) + .or_default() + .insert(segment.segment_id.clone()); + } + grouped + .into_iter() + .map(|((provider, model), segments)| { + let recorded = provider.is_some() && model.is_some(); + json!({ + "provider_id": provider, + "model_id": model, + "identity_status": if recorded { "recorded" } else { "unknown" }, + "included_expression_segment_ids": segments.into_iter().collect::>(), + }) + }) + .collect() +} + +fn representative_operations( + root: &Path, + map: &ContributionMapProjection, + sanitization: &str, +) -> CplResult> { + let wanted = map + .contribution_map + .segments + .iter() + .flat_map(|segment| segment.operation_ids.iter().cloned()) + .collect::>(); + let mut operations = BTreeMap::::new(); + let mut content = BTreeMap::::new(); + for event in ledger::read_all_events(&LedgerPaths::new(root))? { + for reference in event.record_references { + if reference.record_type != "composition-operation" + && reference.record_type != "composition-content" + { + continue; + } + let record = read_record(root, &reference.path, true)?; + let id = record.payload["operation_id"] + .as_str() + .or_else(|| record.payload["operationId"].as_str()) + .unwrap_or_default() + .to_owned(); + if !wanted.contains(&id) { + continue; + } + if reference.record_type == "composition-operation" { + operations.insert(id, record.payload); + } else { + content.insert(id, record.payload); + } + } + } + Ok(operations.into_iter().take(5).map(|(id, operation)| { + let body = content.get(&id); + let deleted = body.and_then(|value| value["deleted_text"].as_str().or_else(|| value["deletedText"].as_str())).unwrap_or_default(); + let inserted = body.and_then(|value| value["inserted_text"].as_str().or_else(|| value["insertedText"].as_str())).unwrap_or_default(); + json!({ + "operation_id": id, + "operation_kind": operation["operation_kind"].as_str().or_else(|| operation["operationKind"].as_str()).unwrap_or("unknown"), + "transformation_relationships": operation["transformation_relationships"].as_array().or_else(|| operation["transformationRelationships"].as_array()).cloned().unwrap_or_default(), + "before_sha256": raw_digest(deleted.as_bytes()), + "after_sha256": raw_digest(inserted.as_bytes()), + "before_excerpt": if sanitization == "full_private" { Value::String(excerpt(deleted)) } else { Value::Null }, + "after_excerpt": if sanitization == "full_private" { Value::String(excerpt(inserted)) } else { Value::Null }, + }) + }).collect()) +} +fn summary_markdown(harp: &Value, metadata: &HarpReportMetadata) -> String { + format!("# Human Authorship Record of Provenance\n\n{}\n\n## One-page summary\n\n{}\n\n- Evidentiary status: `{}`\n- Applicability: `{}`\n- Recorded-origin coverage: {}\n- Identity declaration: `{}`\n- AI systems disclosed: {}\n\n## Suggested registration language\n\n- **Author Created:** {}\n- **Material Excluded:** {}\n- **New Material Included:** {}\n\n## Important limitation\n\n{}\n", metadata_markdown(metadata), harp["claim_summary"].as_str().unwrap_or_default(), harp["evidentiary_status"].as_str().unwrap_or_default(), harp["applicability_status"].as_str().unwrap_or_default(), harp["coverage"]["statement"].as_str().unwrap_or_default(), harp["identity_declaration"]["identity_status"].as_str().unwrap_or_default(), harp["ai_system_disclosures"].as_array().map_or(0, Vec::len), harp["suggested_registration_language"]["author_created"].as_str().unwrap_or_default(), harp["suggested_registration_language"]["material_excluded"].as_str().unwrap_or_default(), harp["suggested_registration_language"]["new_material_included"].as_str().unwrap_or_default(), LEGAL_SCOPE_STATEMENT) +} + +fn transformations_markdown(operations: &[Value], metadata: &HarpReportMetadata) -> String { + let mut output = format!( + "# Representative transformation comparisons\n\n{}\n", + metadata_markdown(metadata) + ); + if operations.is_empty() { + output.push_str( + "\nNo recorded transformation operation is represented in the final deposit.\n", + ); + } + for operation in operations { + let relationships = operation["transformation_relationships"] + .as_array() + .map(|items| { + items + .iter() + .filter_map(Value::as_str) + .collect::>() + .join(", ") + }) + .unwrap_or_default(); + output.push_str(&format!("\n## `{}`\n\n- Kind: `{}`\n- Relationships: `{}`\n- Before digest: `{}`\n- After digest: `{}`\n", operation["operation_id"].as_str().unwrap_or_default(), operation["operation_kind"].as_str().unwrap_or_default(), relationships, operation["before_sha256"].as_str().unwrap_or_default(), operation["after_sha256"].as_str().unwrap_or_default())); + if let Some(before) = operation["before_excerpt"].as_str() { + output.push_str(&format!( + "- Before excerpt: `{}`\n", + markdown_inline(before) + )); + } + if let Some(after) = operation["after_excerpt"].as_str() { + output.push_str(&format!("- After excerpt: `{}`\n", markdown_inline(after))); + } + } + output.push_str(&format!("\n{}\n", LEGAL_SCOPE_STATEMENT)); + output +} + +fn ai_disclosure_markdown(harp: &Value, metadata: &HarpReportMetadata) -> String { + let mut output = format!( + "# AI-system and model disclosure\n\n{}\n", + metadata_markdown(metadata) + ); + let disclosures = harp["ai_system_disclosures"] + .as_array() + .cloned() + .unwrap_or_default(); + if disclosures.is_empty() { + output.push_str("\nNo accepted-AI-output segment is included in the exact deposit.\n"); + } + for item in disclosures { + output.push_str(&format!( + "\n- Provider: `{}`; model: `{}`; identity status: `{}`; included segments: {}\n", + item["provider_id"].as_str().unwrap_or("unknown"), + item["model_id"].as_str().unwrap_or("unknown"), + item["identity_status"].as_str().unwrap_or("unknown"), + item["included_expression_segment_ids"] + .as_array() + .map_or(0, Vec::len) + )); + } + output.push_str(&format!("\n{}\n", LEGAL_SCOPE_STATEMENT)); + output +} + +fn coverage_markdown(harp: &Value, metadata: &HarpReportMetadata) -> String { + let limitations = harp["limitation_codes"] + .as_array() + .map(|items| { + items + .iter() + .filter_map(Value::as_str) + .map(|item| format!("- `{item}`")) + .collect::>() + .join("\n") + }) + .unwrap_or_default(); + format!("# Provenance coverage and limitations\n\n{}\n\n{}\n\n## Limitation codes\n\n{}\n\nCoverage describes recorded provenance positions and is not a human-authorship percentage.\n\n{}\n", metadata_markdown(metadata), harp["coverage"]["statement"].as_str().unwrap_or_default(), limitations, LEGAL_SCOPE_STATEMENT) +} + +fn registration_markdown(harp: &Value, metadata: &HarpReportMetadata) -> String { + let value = &harp["suggested_registration_language"]; + format!("# Suggested registration language\n\n{}\n\nThis language is suggested, editable, explicitly user-approved for this HARP generation, and is not legal advice.\n\n## Author Created\n\n{}\n\n## Material Excluded\n\n{}\n\n## New Material Included\n\n{}\n\n## Note to CO\n\n{}\n\n{}\n", metadata_markdown(metadata), value["author_created"].as_str().unwrap_or_default(), value["material_excluded"].as_str().unwrap_or_default(), value["new_material_included"].as_str().unwrap_or_default(), value["note_to_co"].as_str().unwrap_or("None"), LEGAL_SCOPE_STATEMENT) +} + +fn contribution_map_svg(map: &ContributionMapProjection, metadata: &HarpReportMetadata) -> String { + let mut counts = BTreeMap::::new(); + for segment in &map.contribution_map.segments { + *counts + .entry(format!("{:?}", segment.recorded_origin_kind)) + .or_default() += segment.normalized_unicode_scalar_length; + } + let colors = [ + "#2563eb", "#16a34a", "#9333ea", "#ea580c", "#64748b", "#dc2626", + ]; + let denominator = map.contribution_map.coverage.denominator.max(1); + let mut x = 40.0; + let mut bars = String::new(); + let mut legend = String::new(); + for (index, (label, count)) in counts.iter().enumerate() { + let width = 920.0 * (*count as f64 / denominator as f64); + bars.push_str(&format!("{}: {} scalar positions", colors[index % colors.len()], xml_escape(label), count)); + legend.push_str(&format!("{} — {}", 280 + index * 28, colors[index % colors.len()], 293 + index * 28, xml_escape(label), count)); + x += width; + } + format!("Visual final-text contribution mapDeposit {}; revision {}; CPL chain head {}; sequence {}; HARP schema {}; generator {}; application {}; policy profile {} version {} retrieved {}; sanitization {}. {} This visualization is provenance coverage, not a human-authorship percentage.Final-text contribution mapExact deposit: {}Revision: {} · CPL sequence: {}Policy: {} · retrieved {}{} scalar positions · provenance coverage, not a human-authorship percentage{bars}{legend}Copyrightability remains a U.S. Copyright Office determination.", xml_escape(&metadata.deposit_sha256), xml_escape(&metadata.manuscript_revision_id), xml_escape(&metadata.cpl_chain_head), metadata.cpl_event_sequence, xml_escape(&metadata.harp_schema_version), xml_escape(&metadata.harp_generator_version), xml_escape(&metadata.application_version), xml_escape(&metadata.policy_profile_id), xml_escape(&metadata.policy_profile_version), xml_escape(&metadata.policy_retrieval_date), xml_escape(&metadata.sanitization_profile), xml_escape(LEGAL_SCOPE_STATEMENT), xml_escape(&metadata.deposit_sha256), xml_escape(&metadata.manuscript_revision_id), metadata.cpl_event_sequence, xml_escape(&metadata.policy_profile_version), xml_escape(&metadata.policy_retrieval_date), map.contribution_map.coverage.denominator) +} + +fn metadata_markdown(metadata: &HarpReportMetadata) -> String { + format!("- Exact deposit digest: `{}`\n- Manuscript revision: `{}` (`{}`)\n- CPL chain head / sequence: `{}` / `{}`\n- HARP schema / generator / application: `{}` / `{}` / `{}`\n- Policy profile: `{}` version `{}` (`{}`), retrieved `{}`\n- Sanitization profile: `{}`", metadata.deposit_sha256, metadata.manuscript_revision_id, metadata.manuscript_revision_sha256, metadata.cpl_chain_head, metadata.cpl_event_sequence, metadata.harp_schema_version, metadata.harp_generator_version, metadata.application_version, metadata.policy_profile_id, metadata.policy_profile_version, metadata.policy_profile_sha256, metadata.policy_retrieval_date, metadata.sanitization_profile) +} + +fn artifact_description(artifact: &Artifact) -> Value { + json!({"path": artifact.path, "sha256": raw_digest(&artifact.bytes), "size": artifact.bytes.len(), "privacy_classification": artifact.privacy}) +} +fn manifest_file(role: &str, artifact: &Artifact) -> GeneratedFile { + GeneratedFile { + role: role.into(), + path: artifact.path.clone(), + sha256: raw_digest(&artifact.bytes), + size: artifact.bytes.len(), + privacy_classification: artifact.privacy.clone(), + } +} +fn privacy_class(profile: &str) -> &'static str { + if profile == "sanitized" { + "sanitized_evidence" + } else { + "private" + } +} +fn excerpt(value: &str) -> String { + value.chars().take(240).collect() +} +fn markdown_inline(value: &str) -> String { + value.replace('`', "'").replace(['\r', '\n'], " ") +} +fn xml_escape(value: &str) -> String { + value + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('"', """) + .replace('\'', "'") +} +fn sorted_unique(values: Vec) -> Vec { + values + .into_iter() + .collect::>() + .into_iter() + .collect() +} +fn raw_digest(bytes: &[u8]) -> String { + format!("sha256:{:x}", Sha256::digest(bytes)) +} + +fn stable_id(prefix: &str, source: &str) -> String { + const ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ"; + let digest = Sha256::digest(source.as_bytes()); + let mut value = String::with_capacity(26); + let mut buffer = 0u32; + let mut bits = 0u8; + for byte in digest { + buffer = (buffer << 8) | u32::from(byte); + bits += 8; + while bits >= 5 && value.len() < 26 { + bits -= 5; + value.push(ALPHABET[((buffer >> bits) & 31) as usize] as char); + } + if value.len() == 26 { + break; + } + } + format!("{prefix}_{value}") +} + +fn refresh_self_digest(value: &mut Value, field: &str) -> CplResult<()> { + let mut identity = value.clone(); + identity + .as_object_mut() + .ok_or_else(|| { + CplError::new( + "HARP_SERIALIZATION_FAILED", + "A digest-bearing artifact must be an object.", + false, + ) + })? + .remove(field); + value[field] = json!(canonical_digest(&identity)?); + Ok(()) +} + +fn resolve_relative(root: &Path, relative: &str) -> PathBuf { + relative + .split('/') + .fold(root.to_path_buf(), |path, part| path.join(part)) +} + +fn write_relative(root: &Path, relative: &str, bytes: &[u8]) -> CplResult<()> { + let path = resolve_relative(root, relative); + let parent = path.parent().ok_or_else(|| { + CplError::new( + "HARP_PATH_INVALID", + "A HARP output path has no parent.", + false, + ) + })?; + fs::create_dir_all(parent) + .map_err(|error| CplError::io("Could not create the HARP report directory", error))?; + let temporary = parent.join(format!( + ".{}.tmp", + path.file_name().unwrap().to_string_lossy() + )); + fs::write(&temporary, bytes) + .map_err(|error| CplError::io("Could not stage a HARP report", error))?; + ledger::atomic_replace(&temporary, &path)?; + ledger::sync_directory(parent)?; + Ok(()) +} + +fn read_record(root: &Path, relative: &str, verify_canonical: bool) -> CplResult { + let path = resolve_relative(root, relative); + let bytes = fs::read(&path) + .map_err(|error| CplError::io("Could not read a HARP dependency record", error))?; + let record: CplRecord = serde_json::from_slice(&bytes) + .map_err(|error| CplError::new("HARP_RECORD_INVALID", error.to_string(), false))?; + if verify_canonical + && canonicalize(&serde_json::to_value(&record).map_err(serialization_error)?)? != bytes + { + return Err(CplError::new( + "HARP_RECORD_NONCANONICAL", + format!("{} is not canonical JSON.", path.display()), + false, + )); + } + Ok(record) +} + +fn serialization_error(error: impl std::fmt::Display) -> CplError { + CplError::new("HARP_SERIALIZATION_FAILED", error.to_string(), false) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn dependency_changes_are_stale() { + let original = HarpDependencyBinding { + deposit_sha256: "sha256:a".into(), + manuscript_revision_id: "revision_a".into(), + manuscript_revision_sha256: "sha256:b".into(), + contribution_map_sha256: "sha256:c".into(), + chain_head_sha256: "sha256:d".into(), + chain_event_sequence: 1, + policy_profile_sha256: "sha256:e".into(), + assertion_set_sha256: "sha256:f".into(), + dependency_set_sha256: "sha256:g".into(), + approval_sha256: "sha256:h".into(), + }; + for field in 0..6 { + let mut changed = original.clone(); + match field { + 0 => changed.deposit_sha256.push('1'), + 1 => changed.manuscript_revision_id.push('1'), + 2 => changed.contribution_map_sha256.push('1'), + 3 => changed.policy_profile_sha256.push('1'), + 4 => changed.assertion_set_sha256.push('1'), + _ => changed.dependency_set_sha256.push('1'), + } + assert!(is_stale(&original, &changed)); + } + assert!(!is_stale(&original, &original)); + } + + #[test] + fn bundled_policy_digest_verifies_and_supports_this_version() { + let profile = bundled_policy_profile().unwrap(); + assert_eq!(profile.status, "current"); + assert!(!profile.value["official_sources"] + .as_array() + .unwrap() + .is_empty()); + } + + #[test] + fn generator_source_contains_no_model_or_legal_classifier() { + let source = include_str!("harp.rs"); + let forbidden_model_call = ["generate", "_text("].concat(); + assert!(!source.contains(&forbidden_model_call)); + let forbidden_http_client = ["req", "west"].concat(); + assert!(!source.contains(&forbidden_http_client)); + let forbidden_percentage = ["human", "_percentage"].concat(); + assert!(!source.contains(&forbidden_percentage)); + assert!(source.contains("Copyright Office")); + } + #[test] + fn generates_all_artifacts_idempotently_and_stales_after_edit() { + use crate::provenance::{ + composition::{CompositionAction, CompositionBoundary, CompositionCommand}, + contribution_map::ContributionMapRequest, + identifiers::timestamp_millis, + }; + let temp = tempfile::tempdir().unwrap(); + let project_id = "project_01J00000000000000000000001"; + let apply = |id: &str, action: CompositionAction| { + composition::apply_command( + temp.path(), + project_id, + CompositionCommand { + client_action_id: id.into(), + actor: "user".into(), + summary: id.into(), + occurred_at: timestamp_millis(), + action, + }, + ) + .unwrap(); + }; + apply( + "harp_initialize", + CompositionAction::Initialize { + text: String::new(), + origin: RecordedOrigin::Unattested, + }, + ); + apply( + "harp_human_edit", + CompositionAction::Edit { + before_text: String::new(), + after_text: "# Recorded work\n\nHuman expression.".into(), + boundary: CompositionBoundary::ExplicitSave, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ); + contribution_map::freeze_current( + temp.path(), + project_id, + ContributionMapRequest::default(), + ) + .unwrap(); + let request = HarpGenerationRequest { + declared_name: Some("Example Author".into()), + identity_status: "self_declared".into(), + identity_evidence_reference_ids: vec![], + sanitization_profile: "full_private".into(), + suggested_registration_language: RegistrationLanguageInput::default(), + user_approved: true, + }; + let first = generate_current(temp.path(), project_id, request.clone()).unwrap(); + assert_eq!(first.applicability_status, "current"); + assert_eq!(first.harp["evidentiary_status"], "exact"); + assert_eq!(first.generated_files.len(), 6); + for name in [ + "human-authorship-summary.md", + "final-text-contribution-map.svg", + "representative-transformations.md", + "ai-system-disclosure.md", + "coverage-and-limitations.md", + "registration-language.md", + "harp.json", + "verification-report.json", + "supporting-archive-manifest.json", + "manifest.json", + ] { + assert!(temp + .path() + .join(&first.report_directory) + .join(name) + .is_file()); + } + let event_count = ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(); + let second = generate_current(temp.path(), project_id, request).unwrap(); + assert_eq!(first.harp, second.harp); + assert_eq!( + ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(), + event_count + ); + apply( + "harp_later_edit", + CompositionAction::Edit { + before_text: "# Recorded work\n\nHuman expression.".into(), + after_text: "# Recorded work\n\nHuman expression changed.".into(), + boundary: CompositionBoundary::Idle, + origin: RecordedOrigin::RecordedDirectHumanInput, + operation_kind_hint: None, + ai_acceptance: None, + }, + ); + let stale = load_latest(temp.path(), project_id).unwrap().unwrap(); + assert_eq!(stale.applicability_status, "stale"); + assert!(stale + .stale_reasons + .iter() + .any(|reason| reason == "manuscript_revision_changed")); + } +} diff --git a/src-tauri/src/provenance/identifiers.rs b/src-tauri/src/provenance/identifiers.rs new file mode 100644 index 0000000..ef7bc48 --- /dev/null +++ b/src-tauri/src/provenance/identifiers.rs @@ -0,0 +1,148 @@ +use super::{CplError, CplResult}; +use chrono::{DateTime, SecondsFormat, Utc}; +use std::sync::{Mutex, OnceLock}; +use uuid::Uuid; + +static ID_CLOCK: OnceLock> = OnceLock::new(); + +pub fn timestamp_millis_at(timestamp: DateTime) -> String { + timestamp.to_rfc3339_opts(SecondsFormat::Millis, true) +} +pub fn timestamp_millis() -> String { + timestamp_millis_at(Utc::now()) +} + +fn validate_prefix(prefix: &str) -> CplResult<()> { + if prefix.is_empty() + || prefix.len() > 24 + || !prefix + .bytes() + .all(|byte| byte.is_ascii_lowercase() || byte == b'_') + { + return Err(CplError::new( + "CPL_ID_PREFIX_INVALID", + "Identifier prefixes must contain lowercase ASCII letters and underscores.", + false, + )); + } + Ok(()) +} + +pub fn sortable_id_at( + prefix: &str, + unix_millis: i64, + sequence: u16, + entropy: &str, +) -> CplResult { + validate_prefix(prefix)?; + if !(0..=0x0000_ffff_ffff_ffff).contains(&unix_millis) + || entropy.len() != 32 + || !entropy.bytes().all(|byte| byte.is_ascii_hexdigit()) + { + return Err(CplError::new( + "CPL_ID_COMPONENT_INVALID", + "Sortable identifier components are invalid.", + false, + )); + } + let mut bytes = [0u8; 16]; + let timestamp = (unix_millis as u64).to_be_bytes(); + bytes[..6].copy_from_slice(×tamp[2..]); + bytes[6..8].copy_from_slice(&sequence.to_be_bytes()); + for (index, byte) in bytes[8..].iter_mut().enumerate() { + *byte = u8::from_str_radix(&entropy[index * 2..index * 2 + 2], 16).map_err(|_| { + CplError::new( + "CPL_ID_COMPONENT_INVALID", + "Sortable identifier entropy is invalid.", + false, + ) + })?; + } + Ok(format!("{prefix}_{}", crockford_128(bytes))) +} + +fn crockford_128(bytes: [u8; 16]) -> String { + const ALPHABET: &[u8; 32] = b"0123456789ABCDEFGHJKMNPQRSTVWXYZ"; + let mut output = String::with_capacity(26); + let mut buffer = 0u32; + let mut bits = 2u8; + for byte in bytes { + buffer = (buffer << 8) | u32::from(byte); + bits += 8; + while bits >= 5 { + bits -= 5; + output.push(ALPHABET[((buffer >> bits) & 31) as usize] as char); + } + } + debug_assert_eq!(output.len(), 26); + output +} + +fn advance_clock(clock: &mut (i64, u16), observed_millis: i64) -> CplResult<(i64, u16)> { + if observed_millis <= clock.0 { + clock.1 = clock.1.checked_add(1).ok_or_else(|| { + CplError::new( + "CPL_ID_SEQUENCE_EXHAUSTED", + "Too many identifiers in one logical millisecond.", + true, + ) + })?; + } else { + *clock = (observed_millis, 0); + } + Ok(*clock) +} + +pub fn sortable_id(prefix: &str) -> CplResult { + let observed_millis = Utc::now().timestamp_millis(); + let mut clock = ID_CLOCK + .get_or_init(|| Mutex::new((-1, 0))) + .lock() + .map_err(|_| { + CplError::new( + "CPL_ID_CLOCK_LOCKED", + "Identifier clock is unavailable.", + true, + ) + })?; + let (logical_millis, sequence) = advance_clock(&mut clock, observed_millis)?; + sortable_id_at( + prefix, + logical_millis, + sequence, + &Uuid::new_v4().simple().to_string(), + ) +} + +#[cfg(test)] +mod tests { + use super::*; + use chrono::TimeZone; + + #[test] + fn identifiers_are_prefixed_and_sort_by_time_then_sequence() { + let first = sortable_id_at("event", 1_700_000_000_000, 0, &"0".repeat(32)).unwrap(); + let second = sortable_id_at("event", 1_700_000_000_000, 1, &"0".repeat(32)).unwrap(); + let third = sortable_id_at("event", 1_700_000_000_001, 0, &"0".repeat(32)).unwrap(); + assert!(first < second && second < third); + assert!(first.starts_with("event_")); + assert_eq!(first.len(), "event_".len() + 26); + assert!(first["event_".len()..] + .bytes() + .all(|byte| b"0123456789ABCDEFGHJKMNPQRSTVWXYZ".contains(&byte))); + } + + #[test] + fn clock_rollback_preserves_identifier_order() { + let mut clock = (2_000, 3); + assert_eq!(advance_clock(&mut clock, 1_999).unwrap(), (2_000, 4)); + assert_eq!(advance_clock(&mut clock, 2_001).unwrap(), (2_001, 0)); + } + + #[test] + fn timestamps_are_exact_utc_milliseconds() { + let value = Utc.with_ymd_and_hms(2026, 7, 17, 18, 42, 10).unwrap() + + chrono::Duration::milliseconds(123); + assert_eq!(timestamp_millis_at(value), "2026-07-17T18:42:10.123Z"); + } +} diff --git a/src-tauri/src/provenance/ledger.rs b/src-tauri/src/provenance/ledger.rs new file mode 100644 index 0000000..7b908d3 --- /dev/null +++ b/src-tauri/src/provenance/ledger.rs @@ -0,0 +1,462 @@ +use super::{ + canonical::{canonical_digest, canonicalize, sha256_digest}, + identifiers::timestamp_millis, + records::{ChainHead, CplEvent, SegmentManifest}, + CplError, CplResult, DurableBoundary, CPL_SCHEMA_VERSION, +}; +use serde::Serialize; +use serde_json::Value; +use std::{ + fs::{self, File, OpenOptions}, + io::Write, + path::{Path, PathBuf}, +}; + +#[derive(Debug, Clone, Copy)] +pub struct LedgerConfig { + pub max_events_per_segment: u64, + pub max_bytes_per_segment: u64, +} + +impl Default for LedgerConfig { + fn default() -> Self { + Self { + max_events_per_segment: 10_000, + max_bytes_per_segment: 10 * 1024 * 1024, + } + } +} + +#[derive(Debug, Clone)] +pub struct LedgerPaths { + pub root: PathBuf, + pub active: PathBuf, + pub sealed: PathBuf, + pub chain_head: PathBuf, +} + +impl LedgerPaths { + pub fn new(project_root: &Path) -> Self { + let root = project_root.join("provenance/ledger"); + Self { + active: root.join("active"), + sealed: root.join("sealed"), + chain_head: root.join("chain-head.json"), + root, + } + } + + pub fn initialize(&self) -> CplResult<()> { + fs::create_dir_all(&self.active) + .and_then(|_| fs::create_dir_all(&self.sealed)) + .map_err(|error| CplError::io("Could not create CPL ledger directories", error))?; + if active_segments(self)?.is_empty() { + let next_number = sealed_segments(self)? + .iter() + .filter_map(|path| parse_segment_number(path)) + .max() + .unwrap_or(0) + + 1; + File::create(self.active.join(segment_filename(next_number))) + .and_then(|file| file.sync_all()) + .map_err(|error| { + CplError::io("Could not initialize the active CPL segment", error) + })?; + sync_directory(&self.active)?; + } + Ok(()) + } +} + +pub fn segment_filename(number: u64) -> String { + format!("segment-{number:06}.jsonl") +} + +pub fn segment_manifest_filename(number: u64) -> String { + format!("segment-{number:06}.manifest.json") +} + +fn parse_segment_number(path: &Path) -> Option { + path.file_name()? + .to_str()? + .strip_prefix("segment-")? + .strip_suffix(".jsonl")? + .parse() + .ok() +} + +pub fn active_segments(paths: &LedgerPaths) -> CplResult> { + let mut segments = fs::read_dir(&paths.active) + .map_err(|error| CplError::io("Could not inspect active CPL segments", error))? + .filter_map(Result::ok) + .map(|entry| entry.path()) + .filter(|path| parse_segment_number(path).is_some()) + .collect::>(); + segments.sort(); + Ok(segments) +} + +pub fn sealed_segments(paths: &LedgerPaths) -> CplResult> { + let mut segments = fs::read_dir(&paths.sealed) + .map_err(|error| CplError::io("Could not inspect sealed CPL segments", error))? + .filter_map(Result::ok) + .map(|entry| entry.path()) + .filter(|path| parse_segment_number(path).is_some()) + .collect::>(); + segments.sort(); + Ok(segments) +} + +pub fn current_active_segment(paths: &LedgerPaths) -> CplResult<(u64, PathBuf)> { + let segments = active_segments(paths)?; + if segments.len() != 1 { + return Err(CplError::new( + "CPL_ACTIVE_SEGMENT_INVALID", + format!( + "Expected exactly one active segment, found {}.", + segments.len() + ), + false, + )); + } + let path = segments[0].clone(); + let number = parse_segment_number(&path).ok_or_else(|| { + CplError::new( + "CPL_SEGMENT_NAME_INVALID", + "The active segment name is invalid.", + false, + ) + })?; + Ok((number, path)) +} + +pub fn read_segment(path: &Path) -> CplResult> { + let bytes = + fs::read(path).map_err(|error| CplError::io("Could not read CPL segment", error))?; + if !bytes.is_empty() && !bytes.ends_with(b"\n") { + return Err(CplError::new( + "CPL_SEGMENT_TRUNCATED", + format!("{} has an incomplete final JSONL line.", path.display()), + true, + )); + } + bytes + .split(|byte| *byte == b'\n') + .filter(|line| !line.is_empty()) + .enumerate() + .map(|(index, line)| { + let event: CplEvent = serde_json::from_slice(line).map_err(|error| { + CplError::new( + "CPL_EVENT_INVALID", + format!("{} line {} is invalid: {error}", path.display(), index + 1), + false, + ) + })?; + if canonical_event_line(&event)? != line { + return Err(CplError::new( + "CPL_EVENT_NONCANONICAL", + format!( + "{} line {} is valid JSON but not canonical JSON.", + path.display(), + index + 1 + ), + false, + )); + } + Ok(event) + }) + .collect() +} + +pub fn read_all_events(paths: &LedgerPaths) -> CplResult> { + let mut events = Vec::new(); + for path in sealed_segments(paths)? { + events.extend(read_segment(&path)?); + } + for path in active_segments(paths)? { + events.extend(read_segment(&path)?); + } + Ok(events) +} + +pub fn read_chain_head(paths: &LedgerPaths) -> CplResult> { + if !paths.chain_head.exists() { + return Ok(None); + } + let bytes = fs::read(&paths.chain_head) + .map_err(|error| CplError::io("Could not read the CPL chain head", error))?; + let head: ChainHead = serde_json::from_slice(&bytes) + .map_err(|error| CplError::new("CPL_CHAIN_HEAD_INVALID", error.to_string(), false))?; + if serialize_canonical(&head)? != bytes { + return Err(CplError::new( + "CPL_CHAIN_HEAD_NONCANONICAL", + "The CPL chain head is not canonical JSON.", + false, + )); + } + Ok(Some(head)) +} + +fn serialize_canonical(value: &T) -> CplResult> { + let value = serde_json::to_value(value) + .map_err(|error| CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false))?; + canonicalize(&value) +} + +pub(crate) fn sync_directory(path: &Path) -> CplResult<()> { + #[cfg(not(target_os = "windows"))] + { + File::open(path) + .and_then(|file| file.sync_all()) + .map_err(|error| CplError::io("Could not flush a CPL directory", error))?; + } + #[cfg(target_os = "windows")] + let _ = path; + Ok(()) +} + +#[cfg(target_os = "windows")] +pub(crate) fn atomic_replace(source: &Path, destination: &Path) -> CplResult<()> { + use std::os::windows::ffi::OsStrExt; + const MOVEFILE_REPLACE_EXISTING: u32 = 0x1; + const MOVEFILE_WRITE_THROUGH: u32 = 0x8; + #[link(name = "Kernel32")] + extern "system" { + fn MoveFileExW(existing: *const u16, replacement: *const u16, flags: u32) -> i32; + } + let source = source + .as_os_str() + .encode_wide() + .chain(Some(0)) + .collect::>(); + let destination = destination + .as_os_str() + .encode_wide() + .chain(Some(0)) + .collect::>(); + let result = unsafe { + MoveFileExW( + source.as_ptr(), + destination.as_ptr(), + MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH, + ) + }; + if result == 0 { + return Err(CplError::io( + "Could not atomically replace a CPL file", + std::io::Error::last_os_error(), + )); + } + Ok(()) +} + +#[cfg(not(target_os = "windows"))] +pub(crate) fn atomic_replace(source: &Path, destination: &Path) -> CplResult<()> { + fs::rename(source, destination) + .map_err(|error| CplError::io("Could not atomically replace a CPL file", error)) +} + +pub(crate) fn write_atomic(path: &Path, value: &T) -> CplResult<()> { + let parent = path.parent().ok_or_else(|| { + CplError::new( + "CPL_PATH_INVALID", + "The CPL file has no parent directory.", + false, + ) + })?; + fs::create_dir_all(parent) + .map_err(|error| CplError::io("Could not create a CPL parent directory", error))?; + let temp = parent.join(format!( + ".{}.tmp", + path.file_name().unwrap_or_default().to_string_lossy() + )); + let bytes = serialize_canonical(value)?; + let mut file = File::create(&temp) + .map_err(|error| CplError::io("Could not create a temporary CPL file", error))?; + file.write_all(&bytes) + .and_then(|_| file.sync_all()) + .map_err(|error| CplError::io("Could not flush a temporary CPL file", error))?; + drop(file); + atomic_replace(&temp, path)?; + sync_directory(parent) +} + +fn last_sealed_digest(paths: &LedgerPaths) -> CplResult> { + sealed_segments(paths)? + .last() + .map(|path| { + fs::read(path) + .map(|bytes| sha256_digest(&bytes)) + .map_err(|error| CplError::io("Could not hash the prior sealed segment", error)) + }) + .transpose() +} + +fn rotate_if_needed( + paths: &LedgerPaths, + config: LedgerConfig, + boundary: &mut dyn FnMut(DurableBoundary) -> CplResult<()>, +) -> CplResult<()> { + let (number, active) = current_active_segment(paths)?; + let bytes = fs::read(&active) + .map_err(|error| CplError::io("Could not inspect the active segment", error))?; + let events = read_segment(&active)?; + if events.is_empty() + || (events.len() as u64) < config.max_events_per_segment + && (bytes.len() as u64) < config.max_bytes_per_segment + { + return Ok(()); + } + OpenOptions::new() + .write(true) + .open(&active) + .and_then(|file| file.sync_all()) + .map_err(|error| { + CplError::io("Could not flush the active segment before sealing", error) + })?; + boundary(DurableBoundary::SegmentFlushed)?; + let manifest = SegmentManifest { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + segment_number: number, + previous_segment_file_sha256: last_sealed_digest(paths)?, + first_event_sha256: events.first().unwrap().event_sha256.clone(), + final_event_sha256: events.last().unwrap().event_sha256.clone(), + first_event_sequence: events.first().unwrap().event_sequence, + final_event_sequence: events.last().unwrap().event_sequence, + event_count: events.len() as u64, + byte_length: bytes.len() as u64, + segment_file_sha256: sha256_digest(&bytes), + sealed_at: timestamp_millis(), + }; + let manifest_temp = paths + .active + .join(format!(".{}.tmp", segment_manifest_filename(number))); + let manifest_bytes = serialize_canonical(&manifest)?; + File::create(&manifest_temp) + .and_then(|mut file| { + file.write_all(&manifest_bytes) + .and_then(|_| file.sync_all()) + }) + .map_err(|error| CplError::io("Could not flush a sealed segment manifest", error))?; + boundary(DurableBoundary::SegmentManifestFlushed)?; + let sealed_segment = paths.sealed.join(segment_filename(number)); + let sealed_manifest = paths.sealed.join(segment_manifest_filename(number)); + atomic_replace(&active, &sealed_segment)?; + boundary(DurableBoundary::SegmentMoved)?; + atomic_replace(&manifest_temp, &sealed_manifest)?; + boundary(DurableBoundary::SegmentManifestMoved)?; + File::create(paths.active.join(segment_filename(number + 1))) + .and_then(|file| file.sync_all()) + .map_err(|error| CplError::io("Could not create the next active segment", error))?; + boundary(DurableBoundary::NewActiveSegmentCreated)?; + sync_directory(&paths.active)?; + sync_directory(&paths.sealed) +} + +pub fn append_event( + paths: &LedgerPaths, + config: LedgerConfig, + mut event: CplEvent, + boundary: &mut dyn FnMut(DurableBoundary) -> CplResult<()>, +) -> CplResult<(CplEvent, ChainHead)> { + paths.initialize()?; + rotate_if_needed(paths, config, boundary)?; + let events = read_all_events(paths)?; + let previous = events.last(); + event.event_sequence = previous.map_or(1, |item| item.event_sequence + 1); + event.previous_event_sha256 = previous.map(|item| item.event_sha256.clone()); + event.event_sha256 = canonical_digest(&event.identity())?; + + let (segment_number, active) = current_active_segment(paths)?; + let mut line = serialize_canonical(&event)?; + line.push(b'\n'); + let mut file = OpenOptions::new() + .create(true) + .append(true) + .open(&active) + .map_err(|error| CplError::io("Could not open the active CPL segment", error))?; + file.write_all(&line) + .map_err(|error| CplError::io("Could not append the CPL event", error))?; + boundary(DurableBoundary::LedgerAppendBeforeFlush)?; + file.sync_all() + .map_err(|error| CplError::io("Could not flush the CPL event", error))?; + boundary(DurableBoundary::LedgerFlushed)?; + + let head = ChainHead { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + project_id: event.project_id.clone(), + segment_number, + segment_file: format!( + "provenance/ledger/active/{}", + segment_filename(segment_number) + ), + event_id: event.event_id.clone(), + event_sequence: event.event_sequence, + event_sha256: event.event_sha256.clone(), + updated_at: event.timestamp.clone(), + }; + let head_temp = paths.root.join(".chain-head.json.tmp"); + let head_bytes = serialize_canonical(&head)?; + File::create(&head_temp) + .and_then(|mut file| file.write_all(&head_bytes).and_then(|_| file.sync_all())) + .map_err(|error| CplError::io("Could not flush the temporary CPL chain head", error))?; + boundary(DurableBoundary::ChainHeadTemporaryWritten)?; + atomic_replace(&head_temp, &paths.chain_head)?; + boundary(DurableBoundary::ChainHeadReplaced)?; + sync_directory(&paths.root)?; + boundary(DurableBoundary::ChainHeadDirectorySynced)?; + Ok((event, head)) +} + +pub fn advance_chain_head( + paths: &LedgerPaths, + project_id: &str, + event: &CplEvent, +) -> CplResult { + let segment_number = locate_event_segment(paths, &event.event_id)?.ok_or_else(|| { + CplError::new( + "CPL_EVENT_NOT_FOUND", + "Cannot advance the chain head to a missing event.", + false, + ) + })?; + let in_active = active_segments(paths)? + .iter() + .any(|path| parse_segment_number(path) == Some(segment_number)); + let kind = if in_active { "active" } else { "sealed" }; + let head = ChainHead { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + project_id: project_id.to_owned(), + segment_number, + segment_file: format!( + "provenance/ledger/{kind}/{}", + segment_filename(segment_number) + ), + event_id: event.event_id.clone(), + event_sequence: event.event_sequence, + event_sha256: event.event_sha256.clone(), + updated_at: timestamp_millis(), + }; + write_atomic(&paths.chain_head, &head)?; + Ok(head) +} + +pub fn locate_event_segment(paths: &LedgerPaths, event_id: &str) -> CplResult> { + let mut segments = sealed_segments(paths)?; + segments.extend(active_segments(paths)?); + for path in segments { + if read_segment(&path)? + .iter() + .any(|event| event.event_id == event_id) + { + return Ok(parse_segment_number(&path)); + } + } + Ok(None) +} + +pub fn canonical_event_line(event: &CplEvent) -> CplResult> { + let value: Value = serde_json::to_value(event) + .map_err(|error| CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false))?; + canonicalize(&value) +} diff --git a/src-tauri/src/provenance/mod.rs b/src-tauri/src/provenance/mod.rs new file mode 100644 index 0000000..175c20a --- /dev/null +++ b/src-tauri/src/provenance/mod.rs @@ -0,0 +1,93 @@ +//! Native Composition Provenance Ledger service. +//! +//! This is the only module allowed to create authoritative records, event +//! digests, ledger entries, chain heads, or native verification results. + +pub mod assertions; +pub mod canonical; +pub mod composition; +pub mod contribution_map; +pub mod explorer; +pub mod export; +pub mod harp; +pub mod identifiers; +pub mod ledger; +pub mod phase1; +pub mod projections; +pub mod records; +pub mod recovery; +pub mod verifier; +pub mod writer; + +use serde::Serialize; +use std::{error::Error, fmt}; + +pub use records::{ + ChainHead, CplEvent, CplRecord, RecordInput, RecoveryClassification, RecoveryReport, + VerificationFinding, VerificationReport, VerificationStatus, WriteCommand, WriteResult, +}; +pub use recovery::recover_project; +pub use verifier::verify_project; +pub use writer::{CplService, WriterConfig}; + +pub const CPL_SCHEMA_VERSION: &str = "1.0"; +pub type CplResult = Result; + +#[derive(Debug, Clone, Serialize)] +pub struct CplError { + pub code: String, + pub message: String, + pub recoverable: bool, +} + +impl CplError { + pub fn new(code: &str, message: impl Into, recoverable: bool) -> Self { + Self { + code: code.to_owned(), + message: message.into(), + recoverable, + } + } + pub fn io(context: &str, error: impl fmt::Display) -> Self { + Self::new("CPL_IO_ERROR", format!("{context}: {error}"), true) + } +} + +impl fmt::Display for CplError { + fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(formatter, "{}: {}", self.code, self.message) + } +} +impl Error for CplError {} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum DurableBoundary { + IntentPrepared, + FirstRecordStaged, + RecordFlushed, + RecordMoved, + RecordDirectorySynced, + SegmentFlushed, + SegmentManifestFlushed, + SegmentMoved, + SegmentManifestMoved, + NewActiveSegmentCreated, + LedgerAppendBeforeFlush, + LedgerFlushed, + ChainHeadTemporaryWritten, + ChainHeadReplaced, + ChainHeadDirectorySynced, + SqliteApplied, + Complete, +} + +#[cfg(test)] +pub(crate) fn injected_failure(boundary: DurableBoundary) -> CplError { + CplError::new( + "CPL_INJECTED_FAILURE", + format!("Injected termination after {boundary:?}"), + true, + ) +} +#[cfg(test)] +mod tests; diff --git a/src-tauri/src/provenance/phase1.rs b/src-tauri/src/provenance/phase1.rs new file mode 100644 index 0000000..1eafc71 --- /dev/null +++ b/src-tauri/src/provenance/phase1.rs @@ -0,0 +1,1383 @@ +//! Typed Phase 1 commands and deterministic projections. +//! +//! `phase1-operation` records are the replay authority for the ideation UI. +//! Specific companion records preserve the evidentiary meaning of each action. + +use super::{ + canonical::{canonical_digest, canonicalize}, + ledger::{self, LedgerPaths}, + records::{CplEvent, CplRecord, RecordInput, WriteCommand, WriteResult}, + writer::{init_database, CplService}, + CplError, CplResult, CPL_SCHEMA_VERSION, +}; +use rusqlite::params; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use std::{collections::BTreeMap, fs, path::Path}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Turn { + pub id: String, + pub speaker: String, + pub text: String, + pub created_at: String, + pub input_mode: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub invocation_id: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Idea { + pub id: String, + pub title: String, + pub summary: String, + pub detail: String, + pub status: String, + #[serde(default)] + pub source_turn_ids: Vec, + #[serde(default)] + pub parent_idea_ids: Vec, + #[serde(default)] + pub tags: Vec, + pub pinned: bool, + pub selected: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub group: Option, + pub created_by: String, + pub revision_number: u64, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Provider { + pub kind: String, + pub name: String, + pub endpoint: String, + pub model: String, + pub mode: String, + pub connected: bool, +} + +impl Default for Phase1Provider { + fn default() -> Self { + Self { + kind: "ollama".to_owned(), + name: "Ollama".to_owned(), + endpoint: "http://127.0.0.1:11434".to_owned(), + model: "llama3.2".to_owned(), + mode: "local".to_owned(), + connected: false, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Session { + pub id: String, + pub title: String, + pub created_at: String, + pub updated_at: String, + pub persona: String, + pub challenge: String, + pub genre: String, + pub lore: String, + #[serde(default)] + pub turns: Vec, + pub workspace: String, + pub summary: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Seed { + pub active_session_id: String, + pub session_title: String, + pub session_created_at: String, + #[serde(default)] + pub sessions: Vec, + #[serde(default)] + pub turns: Vec, + #[serde(default)] + pub ideas: Vec, + pub persona: String, + pub challenge: String, + pub genre: String, + pub lore: String, + pub workspace: String, + pub summary: String, + pub provider: Phase1Provider, + pub cloud_approved: bool, + pub updated_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ProviderInvocation { + pub invocation_id: String, + pub purpose: String, + pub session_id: String, + pub provider: Phase1Provider, + pub prompt_template_sha256: String, + pub input_sha256: String, + pub context_sha256: String, + pub requested_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)] +#[serde(rename_all = "camelCase")] +pub struct InvocationProjection { + pub purpose: String, + pub status: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub retained_text: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub failure_code: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde( + tag = "kind", + rename_all = "SCREAMING_SNAKE_CASE", + rename_all_fields = "camelCase" +)] +pub enum Phase1Operation { + Initialize { + seed: Phase1Seed, + }, + SessionCreated { + session_id: String, + title: String, + created_at: String, + }, + SessionActivated { + session_id: String, + activated_at: String, + }, + SessionTitleRevised { + session_id: String, + title: String, + revised_at: String, + }, + PersonaChanged { + session_id: String, + persona: String, + }, + ChallengeChanged { + session_id: String, + challenge: String, + }, + GenreChanged { + session_id: String, + genre: String, + }, + LoreChanged { + session_id: String, + lore: String, + input_kind: String, + }, + ProviderContextChanged { + provider: Phase1Provider, + }, + CloudApprovalChanged { + approved: bool, + }, + HumanTurnCreated { + session_id: String, + turn: Phase1Turn, + }, + AssistantTurnCreated { + session_id: String, + turn: Phase1Turn, + }, + IdeasChanged { + ideas: Vec, + #[serde(default)] + created_ids: Vec, + }, + DraftingPaperTurnAppended { + session_id: String, + turn_id: String, + }, + DraftingPaperRevised { + session_id: String, + text: String, + input_kind: String, + #[serde(default)] + clear_summary: bool, + }, + ProviderInvocationRequested { + invocation: ProviderInvocation, + }, + ProviderInvocationResponded { + invocation_id: String, + retained_text: String, + content_sha256: String, + created_at: String, + }, + ProviderInvocationFailed { + invocation_id: String, + code: String, + bounded_summary: String, + recoverable: bool, + occurred_at: String, + }, + DistillationDisposed { + invocation_id: String, + disposition: String, + summary: String, + decided_at: String, + }, + ExternalContentDeclared { + source_id: String, + source_kind: String, + target: String, + retained_text: String, + resulting_text: String, + declaration: String, + }, +} + +impl Phase1Operation { + fn event_type(&self) -> &'static str { + match self { + Self::Initialize { .. } => "PHASE1_INITIALIZED", + Self::SessionCreated { .. } => "SESSION_CREATED", + Self::SessionActivated { .. } => "SESSION_ACTIVATED", + Self::SessionTitleRevised { .. } => "SESSION_REVISED", + Self::PersonaChanged { .. } => "PERSONA_CHANGED", + Self::ChallengeChanged { .. } => "CHALLENGE_CHANGED", + Self::GenreChanged { .. } => "GENRE_CHANGED", + Self::LoreChanged { .. } => "LORE_CHANGED", + Self::ProviderContextChanged { .. } => "PROVIDER_CONTEXT_CHANGED", + Self::CloudApprovalChanged { .. } => "CLOUD_APPROVAL_CHANGED", + Self::HumanTurnCreated { turn, .. } if turn.input_mode == "voice_transcription" => { + "VOICE_TRANSCRIPTION_COMMITTED" + } + Self::HumanTurnCreated { .. } => "HUMAN_TURN_CREATED", + Self::AssistantTurnCreated { .. } => "ASSISTANT_RESPONSE_RETAINED", + Self::IdeasChanged { created_ids, .. } if !created_ids.is_empty() => "IDEAS_CREATED", + Self::IdeasChanged { .. } => "IDEAS_REVISED", + Self::DraftingPaperTurnAppended { .. } => "TURN_APPENDED_TO_DRAFTING_PAPER", + Self::DraftingPaperRevised { .. } => "DRAFTING_PAPER_REVISED", + Self::ProviderInvocationRequested { .. } => "PROVIDER_INVOCATION_REQUESTED", + Self::ProviderInvocationResponded { .. } => "PROVIDER_INVOCATION_RESPONDED", + Self::ProviderInvocationFailed { .. } => "PROVIDER_INVOCATION_FAILED", + Self::DistillationDisposed { .. } => "DISTILLATION_DISPOSED", + Self::ExternalContentDeclared { source_kind, .. } if source_kind == "paste" => { + "PASTED_CONTENT_DECLARED" + } + Self::ExternalContentDeclared { source_kind, .. } if source_kind == "import" => { + "IMPORTED_CONTENT_DECLARED" + } + Self::ExternalContentDeclared { .. } => "EXTERNAL_SOURCE_DECLARED", + } + } + + fn evidence_records(&self) -> CplResult> { + let value = serde_json::to_value(self).map_err(|error| { + CplError::new("PHASE1_SERIALIZATION_FAILED", error.to_string(), false) + })?; + let mut records = Vec::new(); + let mut push = |record_type: &str, payload: Value| { + records.push(RecordInput { + record_type: record_type.to_owned(), + payload, + }); + }; + match self { + Self::Initialize { seed } => { + push("phase1-initialization", serde_json::to_value(seed).unwrap()); + push( + "conversation-session", + json!({"session_id": seed.active_session_id, "title": seed.session_title, "created_at": seed.session_created_at}), + ); + for session in &seed.sessions { + push( + "conversation-session", + serde_json::to_value(session).unwrap(), + ); + } + for turn in seed + .turns + .iter() + .chain(seed.sessions.iter().flat_map(|session| &session.turns)) + { + push("transcript-turn", serde_json::to_value(turn).unwrap()); + if turn.input_mode == "voice_transcription" { + push( + "voice-transcription", + json!({"turn": turn, "audio_retained": false, "audio_reference": Value::Null}), + ); + } + } + for idea in &seed.ideas { + push( + "idea", + json!({"idea_id": idea.id, "status": idea.status, "created_at": idea.created_at}), + ); + push("idea-revision", serde_json::to_value(idea).unwrap()); + } + push( + "provider-context-revision", + serde_json::to_value(&seed.provider).unwrap(), + ); + if !seed.lore.is_empty() { + push( + "lore-context-revision", + json!({"session_id": seed.active_session_id, "lore": seed.lore, "input_kind": "initialization"}), + ); + } + if !seed.workspace.is_empty() { + push( + "drafting-paper-revision", + json!({"session_id": seed.active_session_id, "text": seed.workspace, "input_kind": "initialization"}), + ); + } + } + Self::SessionCreated { .. } + | Self::SessionActivated { .. } + | Self::SessionTitleRevised { .. } => push("conversation-session", value), + Self::PersonaChanged { .. } => push("persona-context-revision", value), + Self::ChallengeChanged { .. } => push("challenge-context-revision", value), + Self::GenreChanged { .. } => push("genre-context-revision", value), + Self::LoreChanged { .. } => push("lore-context-revision", value), + Self::ProviderContextChanged { .. } | Self::CloudApprovalChanged { .. } => { + push("provider-context-revision", value) + } + Self::HumanTurnCreated { turn, .. } => { + push("transcript-turn", serde_json::to_value(turn).unwrap()); + if turn.input_mode == "voice_transcription" { + push( + "voice-transcription", + json!({"turn": turn, "audio_retained": false, "audio_reference": Value::Null}), + ); + } + } + Self::AssistantTurnCreated { turn, .. } => { + push("transcript-turn", serde_json::to_value(turn).unwrap()) + } + Self::IdeasChanged { ideas, created_ids } => { + for idea in ideas { + push("idea-revision", serde_json::to_value(idea).unwrap()); + if created_ids.contains(&idea.id) { + push( + "idea", + json!({"idea_id": idea.id, "status": idea.status, "created_at": idea.created_at}), + ); + } + } + } + Self::DraftingPaperTurnAppended { .. } => push("drafting-paper-append", value), + Self::DraftingPaperRevised { .. } => push("drafting-paper-revision", value), + Self::ProviderInvocationRequested { invocation } => push( + "invocation-request", + serde_json::to_value(invocation).unwrap(), + ), + Self::ProviderInvocationResponded { .. } => push("invocation-response", value), + Self::ProviderInvocationFailed { .. } => push("invocation-failure", value), + Self::DistillationDisposed { .. } => push("disposition-revision", value), + Self::ExternalContentDeclared { .. } => push("source-declaration", value), + } + Ok(records) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Command { + pub client_action_id: String, + pub actor: String, + pub summary: String, + pub occurred_at: String, + pub operation: Phase1Operation, +} + +impl Phase1Command { + fn validate(&self) -> CplResult<()> { + for (label, value) in [ + ("client_action_id", self.client_action_id.as_str()), + ("actor", self.actor.as_str()), + ("summary", self.summary.as_str()), + ("occurred_at", self.occurred_at.as_str()), + ] { + if value.trim().is_empty() || value.chars().any(char::is_control) { + return Err(CplError::new( + "PHASE1_COMMAND_INVALID", + format!("{label} is empty or contains control characters."), + false, + )); + } + } + if !matches!(self.actor.as_str(), "user" | "assistant" | "system") { + return Err(CplError::new( + "PHASE1_ACTOR_INVALID", + "Phase 1 actor must be user, assistant, or system.", + false, + )); + } + Ok(()) + } + + fn into_write_command(self, project_id: &str) -> CplResult { + self.validate()?; + let client_action_id = self.client_action_id.clone(); + let event_type = self.operation.event_type().to_owned(); + let actor = self.actor.clone(); + let summary = self.summary.clone(); + let evidence = self.operation.evidence_records()?; + let command = serde_json::to_value(&self) + .map_err(|error| CplError::new("PHASE1_COMMAND_INVALID", error.to_string(), false))?; + let mut records = vec![RecordInput { + record_type: "phase1-operation".to_owned(), + payload: json!({"schema_version": CPL_SCHEMA_VERSION, "command": command}), + }]; + records.extend(evidence); + Ok(WriteCommand { + client_action_id, + project_id: project_id.to_owned(), + event_type, + actor, + metadata: json!({"summary": summary, "phase": "ideation", "typed_command": true}), + records, + operational_state: None, + }) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Activity { + pub id: String, + pub r#type: String, + pub actor: String, + pub at: String, + pub summary: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct Phase1Projection { + pub schema_version: String, + pub project_id: String, + pub initialized: bool, + pub active_session_id: String, + pub session_title: String, + pub session_created_at: String, + pub sessions: Vec, + pub turns: Vec, + pub ideas: Vec, + pub persona: String, + pub challenge: String, + pub genre: String, + pub lore: String, + pub workspace: String, + pub summary: String, + pub provider: Phase1Provider, + pub cloud_approved: bool, + pub activity: Vec, + pub invocations: BTreeMap, + pub updated_at: String, +} + +impl Phase1Projection { + fn empty(project_id: &str) -> Self { + Self { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + project_id: project_id.to_owned(), + initialized: false, + active_session_id: String::new(), + session_title: String::new(), + session_created_at: String::new(), + sessions: Vec::new(), + turns: Vec::new(), + ideas: Vec::new(), + persona: "Supportive Coach".to_owned(), + challenge: "Balanced".to_owned(), + genre: "Fiction".to_owned(), + lore: String::new(), + workspace: String::new(), + summary: String::new(), + provider: Phase1Provider::default(), + cloud_approved: false, + activity: Vec::new(), + invocations: BTreeMap::new(), + updated_at: String::new(), + } + } + + pub fn current_session_snapshot(&self) -> Phase1Session { + Phase1Session { + id: self.active_session_id.clone(), + title: self.session_title.clone(), + created_at: self.session_created_at.clone(), + updated_at: self.updated_at.clone(), + persona: self.persona.clone(), + challenge: self.challenge.clone(), + genre: self.genre.clone(), + lore: self.lore.clone(), + turns: self.turns.clone(), + workspace: self.workspace.clone(), + summary: self.summary.clone(), + } + } + + fn store_current_session(&mut self) { + if self.active_session_id.is_empty() { + return; + } + let snapshot = self.current_session_snapshot(); + if let Some(existing) = self.sessions.iter_mut().find(|item| item.id == snapshot.id) { + *existing = snapshot; + } else { + self.sessions.push(snapshot); + } + } + + fn apply(&mut self, command: &Phase1Command, event: &CplEvent) -> CplResult<()> { + match &command.operation { + Phase1Operation::Initialize { seed } => { + self.initialized = true; + self.active_session_id = seed.active_session_id.clone(); + self.session_title = seed.session_title.clone(); + self.session_created_at = seed.session_created_at.clone(); + self.sessions = seed.sessions.clone(); + self.turns = seed.turns.clone(); + self.ideas = seed.ideas.clone(); + self.persona = seed.persona.clone(); + self.challenge = seed.challenge.clone(); + self.genre = seed.genre.clone(); + self.lore = seed.lore.clone(); + self.workspace = seed.workspace.clone(); + self.summary = seed.summary.clone(); + self.provider = seed.provider.clone(); + self.cloud_approved = seed.cloud_approved; + self.updated_at = seed.updated_at.clone(); + } + Phase1Operation::SessionCreated { + session_id, + title, + created_at, + } => { + self.store_current_session(); + self.active_session_id = session_id.clone(); + self.session_title = title.clone(); + self.session_created_at = created_at.clone(); + self.turns.clear(); + self.workspace.clear(); + self.summary.clear(); + } + Phase1Operation::SessionActivated { session_id, .. } => { + self.store_current_session(); + let target = self + .sessions + .iter() + .find(|session| &session.id == session_id) + .cloned() + .ok_or_else(|| { + CplError::new( + "PHASE1_SESSION_UNKNOWN", + format!("Session {session_id} cannot be activated before it exists."), + false, + ) + })?; + self.active_session_id = target.id; + self.session_title = target.title; + self.session_created_at = target.created_at; + self.persona = target.persona; + self.challenge = target.challenge; + self.genre = target.genre; + self.lore = target.lore; + self.turns = target.turns; + self.workspace = target.workspace; + self.summary = target.summary; + self.sessions.retain(|session| session.id != *session_id); + } + Phase1Operation::SessionTitleRevised { + session_id, title, .. + } => { + require_active(self, session_id)?; + self.session_title = title.clone(); + } + Phase1Operation::PersonaChanged { + session_id, + persona, + } => { + require_active(self, session_id)?; + self.persona = persona.clone(); + } + Phase1Operation::ChallengeChanged { + session_id, + challenge, + } => { + require_active(self, session_id)?; + self.challenge = challenge.clone(); + } + Phase1Operation::GenreChanged { session_id, genre } => { + require_active(self, session_id)?; + self.genre = genre.clone(); + } + Phase1Operation::LoreChanged { + session_id, lore, .. + } => { + require_active(self, session_id)?; + self.lore = lore.clone(); + } + Phase1Operation::ProviderContextChanged { provider } => { + self.provider = provider.clone() + } + Phase1Operation::CloudApprovalChanged { approved } => self.cloud_approved = *approved, + Phase1Operation::HumanTurnCreated { session_id, turn } + | Phase1Operation::AssistantTurnCreated { session_id, turn } => { + require_active(self, session_id)?; + if !self.turns.iter().any(|existing| existing.id == turn.id) { + self.turns.push(turn.clone()); + } + } + Phase1Operation::IdeasChanged { ideas, .. } => { + for idea in ideas { + if let Some(existing) = self.ideas.iter_mut().find(|item| item.id == idea.id) { + *existing = idea.clone(); + } else { + self.ideas.push(idea.clone()); + } + } + } + Phase1Operation::DraftingPaperTurnAppended { + session_id, + turn_id, + } => { + require_active(self, session_id)?; + let text = self + .turns + .iter() + .find(|turn| &turn.id == turn_id) + .map(|turn| turn.text.clone()) + .ok_or_else(|| { + CplError::new( + "PHASE1_TURN_UNKNOWN", + format!("Turn {turn_id} cannot be appended before it exists."), + false, + ) + })?; + if !self.workspace.trim().is_empty() { + self.workspace.push_str("\n\n"); + } + self.workspace.push_str(&text); + } + Phase1Operation::DraftingPaperRevised { + session_id, + text, + clear_summary, + .. + } => { + require_active(self, session_id)?; + self.workspace = text.clone(); + if *clear_summary { + self.summary.clear(); + } + } + Phase1Operation::ProviderInvocationRequested { invocation } => { + self.provider = invocation.provider.clone(); + self.invocations.insert( + invocation.invocation_id.clone(), + InvocationProjection { + purpose: invocation.purpose.clone(), + status: "requested".to_owned(), + retained_text: None, + failure_code: None, + }, + ); + } + Phase1Operation::ProviderInvocationResponded { + invocation_id, + retained_text, + .. + } => { + let invocation = self.invocations.get_mut(invocation_id).ok_or_else(|| { + CplError::new( + "PHASE1_INVOCATION_UNKNOWN", + "A provider response cannot precede its request record.", + false, + ) + })?; + invocation.status = "responded".to_owned(); + invocation.retained_text = Some(retained_text.clone()); + self.provider.connected = true; + } + Phase1Operation::ProviderInvocationFailed { + invocation_id, + code, + .. + } => { + let invocation = self.invocations.get_mut(invocation_id).ok_or_else(|| { + CplError::new( + "PHASE1_INVOCATION_UNKNOWN", + "A provider failure cannot precede its request record.", + false, + ) + })?; + invocation.status = "failed".to_owned(); + invocation.failure_code = Some(code.clone()); + self.provider.connected = false; + } + Phase1Operation::DistillationDisposed { + invocation_id, + disposition, + summary, + .. + } => { + let invocation = self.invocations.get_mut(invocation_id).ok_or_else(|| { + CplError::new( + "PHASE1_INVOCATION_UNKNOWN", + "A distillation disposition cannot precede its invocation.", + false, + ) + })?; + if invocation.purpose != "distillation" || invocation.status != "responded" { + return Err(CplError::new( + "PHASE1_DISTILLATION_INVALID", + "Only a retained distillation response can be disposed.", + false, + )); + } + invocation.status = disposition.clone(); + if matches!(disposition.as_str(), "accepted" | "replaced") { + self.summary = summary.clone(); + } + } + Phase1Operation::ExternalContentDeclared { + target, + resulting_text, + .. + } => match target.as_str() { + "drafting_paper" => self.workspace = resulting_text.clone(), + "lore" => self.lore = resulting_text.clone(), + _ => {} + }, + } + self.updated_at = command.occurred_at.clone(); + self.activity.push(Phase1Activity { + id: command.client_action_id.clone(), + r#type: event.event_type.clone(), + actor: command.actor.clone(), + at: command.occurred_at.clone(), + summary: command.summary.clone(), + }); + Ok(()) + } +} + +fn require_active(projection: &Phase1Projection, session_id: &str) -> CplResult<()> { + if projection.active_session_id == session_id { + Ok(()) + } else { + Err(CplError::new( + "PHASE1_SESSION_MISMATCH", + format!( + "Command targets session {session_id}, but {} is active.", + projection.active_session_id + ), + false, + )) + } +} + +#[derive(Debug, Clone, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Phase1CommandResult { + pub write: WriteResult, + pub projection: Phase1Projection, +} + +pub fn apply_command( + root: &Path, + project_id: &str, + command: Phase1Command, +) -> CplResult { + let write = CplService::new(root, project_id).write(command.into_write_command(project_id)?)?; + let projection = reconstruct(root, project_id)?; + cache_projection(root, &projection)?; + Ok(Phase1CommandResult { write, projection }) +} + +pub fn reconstruct(root: &Path, project_id: &str) -> CplResult { + let events = ledger::read_all_events(&LedgerPaths::new(root))?; + reconstruct_from_events(root, project_id, &events) +} + +pub(crate) fn reconstruct_from_events( + root: &Path, + project_id: &str, + events: &[CplEvent], +) -> CplResult { + let mut projection = Phase1Projection::empty(project_id); + for event in events { + let operations = event + .record_references + .iter() + .filter(|reference| reference.record_type == "phase1-operation") + .collect::>(); + if operations.is_empty() { + continue; + } + if operations.len() != 1 { + return Err(CplError::new( + "PHASE1_OPERATION_AMBIGUOUS", + "A typed Phase 1 event must bind exactly one phase1-operation record.", + false, + )); + } + let path = root.join( + operations[0] + .path + .split('/') + .collect::(), + ); + let bytes = fs::read(&path) + .map_err(|error| CplError::io("Could not read a Phase 1 operation record", error))?; + let record: CplRecord = serde_json::from_slice(&bytes) + .map_err(|error| CplError::new("PHASE1_RECORD_INVALID", error.to_string(), false))?; + if canonicalize( + &serde_json::to_value(&record).map_err(|error| { + CplError::new("PHASE1_RECORD_INVALID", error.to_string(), false) + })?, + )? != bytes + { + return Err(CplError::new( + "PHASE1_RECORD_NONCANONICAL", + format!("{} is not canonical JSON.", path.display()), + false, + )); + } + let command: Phase1Command = + serde_json::from_value(record.payload.get("command").cloned().ok_or_else(|| { + CplError::new( + "PHASE1_COMMAND_MISSING", + "A phase1-operation record has no typed command.", + false, + ) + })?) + .map_err(|error| CplError::new("PHASE1_COMMAND_INVALID", error.to_string(), false))?; + projection.apply(&command, event)?; + } + Ok(projection) +} + +pub(crate) fn rebuild_projection_cache( + root: &Path, + project_id: &str, + events: &[CplEvent], +) -> CplResult<()> { + let projection = reconstruct_from_events(root, project_id, events)?; + cache_projection(root, &projection) +} + +fn cache_projection(root: &Path, projection: &Phase1Projection) -> CplResult<()> { + let database = init_database(root)?; + database + .execute( + "CREATE TABLE IF NOT EXISTS phase1_projection (id INTEGER PRIMARY KEY CHECK(id=1), json TEXT NOT NULL, source_event_count INTEGER NOT NULL, updated_at TEXT NOT NULL)", + [], + ) + .map_err(super::writer::database_error)?; + let json = serde_json::to_string(projection) + .map_err(|error| CplError::new("PHASE1_SERIALIZATION_FAILED", error.to_string(), false))?; + database + .execute( + "INSERT INTO phase1_projection(id,json,source_event_count,updated_at) VALUES(1,?1,?2,?3) ON CONFLICT(id) DO UPDATE SET json=excluded.json,source_event_count=excluded.source_event_count,updated_at=excluded.updated_at", + params![json, projection.activity.len() as u64, projection.updated_at], + ) + .map_err(super::writer::database_error)?; + Ok(()) +} + +pub fn canonical_text_digest(text: &str) -> CplResult { + canonical_digest(&json!({"text": text})) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::provenance::{identifiers::timestamp_millis, writer::rebuild_indexes}; + use tempfile::tempdir; + + fn command(id: &str, operation: Phase1Operation) -> Phase1Command { + Phase1Command { + client_action_id: id.to_owned(), + actor: "user".to_owned(), + summary: id.to_owned(), + occurred_at: timestamp_millis(), + operation, + } + } + + fn seed() -> Phase1Seed { + Phase1Seed { + active_session_id: "session_one".to_owned(), + session_title: "One".to_owned(), + session_created_at: timestamp_millis(), + sessions: vec![], + turns: vec![], + ideas: vec![], + persona: "Supportive Coach".to_owned(), + challenge: "Balanced".to_owned(), + genre: "Fiction".to_owned(), + lore: String::new(), + workspace: String::new(), + summary: String::new(), + provider: Phase1Provider::default(), + cloud_approved: false, + updated_at: timestamp_millis(), + } + } + + #[test] + fn typed_records_reconstruct_phase1_without_an_application_state_snapshot() { + let temp = tempdir().unwrap(); + let project_id = "project_test"; + apply_command( + temp.path(), + project_id, + command("initialize", Phase1Operation::Initialize { seed: seed() }), + ) + .unwrap(); + let turn = Phase1Turn { + id: "turn_one".to_owned(), + speaker: "user".to_owned(), + text: "A human thought".to_owned(), + created_at: timestamp_millis(), + input_mode: "typed".to_owned(), + invocation_id: None, + }; + apply_command( + temp.path(), + project_id, + command( + "turn", + Phase1Operation::HumanTurnCreated { + session_id: "session_one".to_owned(), + turn: turn.clone(), + }, + ), + ) + .unwrap(); + apply_command( + temp.path(), + project_id, + command( + "append", + Phase1Operation::DraftingPaperTurnAppended { + session_id: "session_one".to_owned(), + turn_id: turn.id.clone(), + }, + ), + ) + .unwrap(); + let idea = Phase1Idea { + id: "idea_one".to_owned(), + title: "Idea".to_owned(), + summary: "Summary".to_owned(), + detail: String::new(), + status: "accepted".to_owned(), + source_turn_ids: vec!["turn_one".to_owned()], + parent_idea_ids: vec![], + tags: vec!["test".to_owned()], + pinned: true, + selected: true, + group: None, + created_by: "user".to_owned(), + revision_number: 1, + created_at: timestamp_millis(), + updated_at: timestamp_millis(), + }; + apply_command( + temp.path(), + project_id, + command( + "idea", + Phase1Operation::IdeasChanged { + ideas: vec![idea.clone()], + created_ids: vec![idea.id.clone()], + }, + ), + ) + .unwrap(); + + let events = ledger::read_all_events(&LedgerPaths::new(temp.path())).unwrap(); + assert!(events + .iter() + .flat_map(|event| &event.record_references) + .all(|reference| reference.record_type != "application-state-snapshot")); + let rebuilt = reconstruct(temp.path(), project_id).unwrap(); + assert_eq!(rebuilt.turns, vec![turn]); + assert_eq!(rebuilt.workspace, "A human thought"); + assert_eq!(rebuilt.ideas, vec![idea]); + + let database = init_database(temp.path()).unwrap(); + database + .execute("DELETE FROM phase1_projection", []) + .unwrap(); + drop(database); + rebuild_indexes(temp.path(), &events).unwrap(); + let cached: String = init_database(temp.path()) + .unwrap() + .query_row("SELECT json FROM phase1_projection WHERE id=1", [], |row| { + row.get(0) + }) + .unwrap(); + assert_eq!( + serde_json::from_str::(&cached).unwrap(), + rebuilt + ); + } + + #[test] + fn provider_request_is_durable_before_simulated_io_and_outcome_follows() { + let temp = tempdir().unwrap(); + let project_id = "project_test"; + apply_command( + temp.path(), + project_id, + command("initialize", Phase1Operation::Initialize { seed: seed() }), + ) + .unwrap(); + let invocation = ProviderInvocation { + invocation_id: "invocation_one".to_owned(), + purpose: "conversation".to_owned(), + session_id: "session_one".to_owned(), + provider: Phase1Provider::default(), + prompt_template_sha256: "sha256:prompt".to_owned(), + input_sha256: "sha256:input".to_owned(), + context_sha256: "sha256:context".to_owned(), + requested_at: timestamp_millis(), + }; + apply_command( + temp.path(), + project_id, + command( + "request", + Phase1Operation::ProviderInvocationRequested { + invocation: invocation.clone(), + }, + ), + ) + .unwrap(); + + // This write represents work performed while provider I/O is in flight. + // It succeeds because the request write released the OS writer lock. + apply_command( + temp.path(), + project_id, + command( + "context-during-io", + Phase1Operation::ChallengeChanged { + session_id: "session_one".to_owned(), + challenge: "Rigorous".to_owned(), + }, + ), + ) + .unwrap(); + apply_command( + temp.path(), + project_id, + command( + "response", + Phase1Operation::ProviderInvocationResponded { + invocation_id: invocation.invocation_id.clone(), + retained_text: "Response".to_owned(), + content_sha256: canonical_text_digest("Response").unwrap(), + created_at: timestamp_millis(), + }, + ), + ) + .unwrap(); + let projection = reconstruct(temp.path(), project_id).unwrap(); + assert_eq!(projection.challenge, "Rigorous"); + assert_eq!( + projection.invocations[&invocation.invocation_id].status, + "responded" + ); + let events = ledger::read_all_events(&LedgerPaths::new(temp.path())).unwrap(); + assert_eq!(events[1].event_type, "PROVIDER_INVOCATION_REQUESTED"); + assert_eq!(events[3].event_type, "PROVIDER_INVOCATION_RESPONDED"); + } + + #[test] + fn voice_transcription_retains_text_but_no_audio_reference_or_digest() { + let temp = tempdir().unwrap(); + let project_id = "project_test"; + apply_command( + temp.path(), + project_id, + command("initialize", Phase1Operation::Initialize { seed: seed() }), + ) + .unwrap(); + apply_command( + temp.path(), + project_id, + command( + "voice", + Phase1Operation::HumanTurnCreated { + session_id: "session_one".to_owned(), + turn: Phase1Turn { + id: "turn_voice".to_owned(), + speaker: "user".to_owned(), + text: "Spoken expression".to_owned(), + created_at: timestamp_millis(), + input_mode: "voice_transcription".to_owned(), + invocation_id: None, + }, + }, + ), + ) + .unwrap(); + let events = ledger::read_all_events(&LedgerPaths::new(temp.path())).unwrap(); + let voice = events[1] + .record_references + .iter() + .find(|reference| reference.record_type == "voice-transcription") + .unwrap(); + let bytes = fs::read( + temp.path() + .join(voice.path.replace('/', std::path::MAIN_SEPARATOR_STR)), + ) + .unwrap(); + let text = String::from_utf8(bytes).unwrap(); + assert!(text.contains("Spoken expression")); + assert!(text.contains("\"audio_retained\":false")); + assert!(!text.contains("audio_digest")); + assert!(!text.contains("audio_path")); + } + #[test] + fn every_visible_phase1_field_replays_from_typed_operations() { + let temp = tempdir().unwrap(); + let project_id = "project_complete"; + apply_command( + temp.path(), + project_id, + command("initialize", Phase1Operation::Initialize { seed: seed() }), + ) + .unwrap(); + let human = Phase1Turn { + id: "human".into(), + speaker: "user".into(), + text: "Human text".into(), + created_at: timestamp_millis(), + input_mode: "typed".into(), + invocation_id: None, + }; + let assistant = Phase1Turn { + id: "assistant".into(), + speaker: "assistant".into(), + text: "Assistant text".into(), + created_at: timestamp_millis(), + input_mode: "typed".into(), + invocation_id: Some("conversation".into()), + }; + let provider = Phase1Provider { + kind: "compatible".into(), + name: "Local endpoint".into(), + endpoint: "http://127.0.0.1:1234/v1".into(), + model: "writer".into(), + mode: "local".into(), + connected: false, + }; + let idea_v1 = Phase1Idea { + id: "idea".into(), + title: "Initial".into(), + summary: "Summary".into(), + detail: String::new(), + status: "suggested".into(), + source_turn_ids: vec![human.id.clone()], + parent_idea_ids: vec![], + tags: vec![], + pinned: false, + selected: false, + group: None, + created_by: "user".into(), + revision_number: 1, + created_at: timestamp_millis(), + updated_at: timestamp_millis(), + }; + let idea_v2 = Phase1Idea { + title: "Revised".into(), + status: "accepted".into(), + selected: true, + revision_number: 2, + updated_at: timestamp_millis(), + ..idea_v1.clone() + }; + let distillation = ProviderInvocation { + invocation_id: "distill".into(), + purpose: "distillation".into(), + session_id: "session_one".into(), + provider: provider.clone(), + prompt_template_sha256: "sha256:prompt".into(), + input_sha256: "sha256:input".into(), + context_sha256: "sha256:context".into(), + requested_at: timestamp_millis(), + }; + let failed = ProviderInvocation { + invocation_id: "failed".into(), + purpose: "conversation".into(), + ..distillation.clone() + }; + let operations = vec![ + Phase1Operation::SessionTitleRevised { + session_id: "session_one".into(), + title: "Revised session".into(), + revised_at: timestamp_millis(), + }, + Phase1Operation::PersonaChanged { + session_id: "session_one".into(), + persona: "Creative Partner".into(), + }, + Phase1Operation::ChallengeChanged { + session_id: "session_one".into(), + challenge: "Rigorous".into(), + }, + Phase1Operation::GenreChanged { + session_id: "session_one".into(), + genre: "Poetry".into(), + }, + Phase1Operation::LoreChanged { + session_id: "session_one".into(), + lore: "Manual lore".into(), + input_kind: "manual".into(), + }, + Phase1Operation::ProviderContextChanged { + provider: provider.clone(), + }, + Phase1Operation::CloudApprovalChanged { approved: true }, + Phase1Operation::HumanTurnCreated { + session_id: "session_one".into(), + turn: human.clone(), + }, + Phase1Operation::AssistantTurnCreated { + session_id: "session_one".into(), + turn: assistant.clone(), + }, + Phase1Operation::DraftingPaperTurnAppended { + session_id: "session_one".into(), + turn_id: human.id.clone(), + }, + Phase1Operation::DraftingPaperTurnAppended { + session_id: "session_one".into(), + turn_id: assistant.id.clone(), + }, + Phase1Operation::DraftingPaperRevised { + session_id: "session_one".into(), + text: "Manual paper".into(), + input_kind: "manual".into(), + clear_summary: false, + }, + Phase1Operation::ExternalContentDeclared { + source_id: "draft_source".into(), + source_kind: "paste".into(), + target: "drafting_paper".into(), + retained_text: "Pasted".into(), + resulting_text: "Final paper".into(), + declaration: "Declared paste".into(), + }, + Phase1Operation::ExternalContentDeclared { + source_id: "lore_source".into(), + source_kind: "import".into(), + target: "lore".into(), + retained_text: "Imported".into(), + resulting_text: "Final lore".into(), + declaration: "Declared import".into(), + }, + Phase1Operation::IdeasChanged { + ideas: vec![idea_v1], + created_ids: vec!["idea".into()], + }, + Phase1Operation::IdeasChanged { + ideas: vec![idea_v2.clone()], + created_ids: vec![], + }, + Phase1Operation::ProviderInvocationRequested { + invocation: distillation.clone(), + }, + Phase1Operation::ProviderInvocationResponded { + invocation_id: distillation.invocation_id.clone(), + retained_text: "Distilled".into(), + content_sha256: canonical_text_digest("Distilled").unwrap(), + created_at: timestamp_millis(), + }, + Phase1Operation::DistillationDisposed { + invocation_id: distillation.invocation_id.clone(), + disposition: "accepted".into(), + summary: "Accepted summary".into(), + decided_at: timestamp_millis(), + }, + Phase1Operation::ProviderInvocationRequested { + invocation: failed.clone(), + }, + Phase1Operation::ProviderInvocationFailed { + invocation_id: failed.invocation_id.clone(), + code: "OFFLINE".into(), + bounded_summary: "Unavailable".into(), + recoverable: true, + occurred_at: timestamp_millis(), + }, + Phase1Operation::SessionCreated { + session_id: "session_two".into(), + title: "Two".into(), + created_at: timestamp_millis(), + }, + Phase1Operation::SessionTitleRevised { + session_id: "session_two".into(), + title: "Revised two".into(), + revised_at: timestamp_millis(), + }, + Phase1Operation::SessionActivated { + session_id: "session_one".into(), + activated_at: timestamp_millis(), + }, + ]; + for (index, operation) in operations.into_iter().enumerate() { + apply_command( + temp.path(), + project_id, + command(&format!("operation_{index}"), operation), + ) + .unwrap(); + } + let projection = reconstruct(temp.path(), project_id).unwrap(); + assert_eq!( + ( + projection.active_session_id.as_str(), + projection.session_title.as_str() + ), + ("session_one", "Revised session") + ); + assert_eq!( + ( + projection.persona.as_str(), + projection.challenge.as_str(), + projection.genre.as_str() + ), + ("Creative Partner", "Rigorous", "Poetry") + ); + assert_eq!( + ( + projection.lore.as_str(), + projection.workspace.as_str(), + projection.summary.as_str() + ), + ("Final lore", "Final paper", "Accepted summary") + ); + assert_eq!(projection.provider, provider); + assert!(projection.cloud_approved); + assert_eq!(projection.turns, vec![human, assistant]); + assert_eq!(projection.ideas, vec![idea_v2]); + assert_eq!(projection.invocations["distill"].status, "accepted"); + assert_eq!(projection.invocations["failed"].status, "failed"); + assert_eq!(projection.sessions[0].title, "Revised two"); + } +} diff --git a/src-tauri/src/provenance/projections.rs b/src-tauri/src/provenance/projections.rs new file mode 100644 index 0000000..c51dd97 --- /dev/null +++ b/src-tauri/src/provenance/projections.rs @@ -0,0 +1,19 @@ +use super::{canonical::canonical_digest, records::RecordReference, CplResult}; +use serde_json::{json, Value}; + +pub fn deterministic_projection( + project_id: &str, + chain_head_sha256: &str, + mut records: Vec, +) -> CplResult { + records.sort_by(|left, right| left.record_id.as_bytes().cmp(right.record_id.as_bytes())); + let content = json!({ + "project_id": project_id, + "chain_head_sha256": chain_head_sha256, + "records": records, + }); + Ok(json!({ + "content_sha256": canonical_digest(&content)?, + "content": content, + })) +} diff --git a/src-tauri/src/provenance/records.rs b/src-tauri/src/provenance/records.rs new file mode 100644 index 0000000..7de2c97 --- /dev/null +++ b/src-tauri/src/provenance/records.rs @@ -0,0 +1,182 @@ +use super::{canonical::canonical_digest, CplResult, CPL_SCHEMA_VERSION}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct RecordInput { + pub record_type: String, + pub payload: Value, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct CplRecord { + pub schema_version: String, + pub record_id: String, + pub record_type: String, + pub project_id: String, + pub intent_id: String, + pub client_action_id: String, + pub created_at: String, + pub payload: Value, + pub record_sha256: String, +} +impl CplRecord { + pub fn identity(&self) -> Value { + json!({"schema_version":self.schema_version,"record_id":self.record_id,"record_type":self.record_type,"project_id":self.project_id,"intent_id":self.intent_id,"client_action_id":self.client_action_id,"created_at":self.created_at,"payload":self.payload}) + } + pub fn verify_digest(&self) -> CplResult { + Ok(canonical_digest(&self.identity())? == self.record_sha256) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct RecordReference { + pub record_id: String, + pub record_type: String, + pub path: String, + pub record_sha256: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct CplEvent { + pub schema_version: String, + pub event_id: String, + pub project_id: String, + pub event_sequence: u64, + pub timestamp: String, + pub event_type: String, + pub actor: String, + pub client_action_id: String, + pub command_sha256: String, + pub record_references: Vec, + pub metadata: Value, + pub previous_event_sha256: Option, + pub event_sha256: String, +} +impl CplEvent { + pub fn identity(&self) -> Value { + json!({"schema_version":self.schema_version,"event_id":self.event_id,"project_id":self.project_id,"event_sequence":self.event_sequence,"timestamp":self.timestamp,"event_type":self.event_type,"actor":self.actor,"client_action_id":self.client_action_id,"command_sha256":self.command_sha256,"record_references":self.record_references,"metadata":self.metadata,"previous_event_sha256":self.previous_event_sha256}) + } + pub fn verify_digest(&self) -> CplResult { + Ok(canonical_digest(&self.identity())? == self.event_sha256) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct ChainHead { + pub schema_version: String, + pub project_id: String, + pub segment_number: u64, + pub segment_file: String, + pub event_id: String, + pub event_sequence: u64, + pub event_sha256: String, + pub updated_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct SegmentManifest { + pub schema_version: String, + pub segment_number: u64, + pub previous_segment_file_sha256: Option, + pub first_event_sha256: String, + pub final_event_sha256: String, + pub first_event_sequence: u64, + pub final_event_sequence: u64, + pub event_count: u64, + pub byte_length: u64, + pub segment_file_sha256: String, + pub sealed_at: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct WriteCommand { + pub client_action_id: String, + pub project_id: String, + pub event_type: String, + pub actor: String, + #[serde(default)] + pub metadata: Value, + #[serde(default)] + pub records: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub operational_state: Option, +} +impl WriteCommand { + pub fn digest(&self) -> CplResult { + canonical_digest(&serde_json::to_value(self).map_err(|error| { + super::CplError::new("CPL_COMMAND_INVALID", error.to_string(), false) + })?) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct WriteResult { + pub idempotent_replay: bool, + pub intent_id: String, + pub event: CplEvent, + pub records: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum VerificationStatus { + Verified, + VerifiedWithWarnings, + Incomplete, + Failed, + Unsafe, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct VerificationFinding { + pub code: String, + pub severity: String, + pub scope: String, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct VerificationReport { + pub schema_version: String, + pub report_id: String, + pub project_id: String, + pub status: VerificationStatus, + pub verified_at: String, + pub chain_head: Option, + pub event_count: u64, + pub record_count: u64, + pub findings: Vec, +} +impl VerificationReport { + pub fn empty(project_id: &str, report_id: String, verified_at: String) -> Self { + Self { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + report_id, + project_id: project_id.to_owned(), + status: VerificationStatus::Incomplete, + verified_at, + chain_head: None, + event_count: 0, + record_count: 0, + findings: Vec::new(), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "SCREAMING_SNAKE_CASE")] +pub enum RecoveryClassification { + Clean, + RecoverableAutomatically, + RequiresUserConfirmation, + IntegrityFailure, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct RecoveryReport { + pub classification: RecoveryClassification, + pub actions: Vec, + pub quarantined_paths: Vec, + pub verification: VerificationReport, +} diff --git a/src-tauri/src/provenance/recovery.rs b/src-tauri/src/provenance/recovery.rs new file mode 100644 index 0000000..f18d443 --- /dev/null +++ b/src-tauri/src/provenance/recovery.rs @@ -0,0 +1,404 @@ +use super::{ + canonical::sha256_digest, + ledger::{self, atomic_replace, LedgerPaths}, + records::{ + CplEvent, RecoveryClassification, RecoveryReport, SegmentManifest, VerificationStatus, + }, + verifier, + writer::{init_database, rebuild_indexes, set_intent_phase, ProjectWriterLock}, + CplError, CplResult, +}; +use std::{ + fs::{self, OpenOptions}, + path::{Path, PathBuf}, +}; + +pub fn recover_project(root: &Path, project_id: &str) -> CplResult { + let paths = LedgerPaths::new(root); + paths.initialize()?; + let _lock = ProjectWriterLock::acquire(root)?; + recover_locked(root, project_id) +} + +pub(crate) fn recover_locked(root: &Path, project_id: &str) -> CplResult { + let paths = LedgerPaths::new(root); + paths.initialize()?; + let mut actions = Vec::new(); + let mut quarantined_paths = Vec::new(); + let database = recover_database(root, &mut actions, &mut quarantined_paths)?; + let mut repaired = !actions.is_empty(); + + for entry in fs::read_dir(&paths.active) + .map_err(|error| CplError::io("Could not inspect interrupted segment rotation", error))? + .filter_map(Result::ok) + { + let name = entry.file_name().to_string_lossy().into_owned(); + if !name.starts_with(".segment-") || !name.ends_with(".manifest.json.tmp") { + continue; + } + let manifest: SegmentManifest = + serde_json::from_slice(&fs::read(entry.path()).map_err(|error| { + CplError::io("Could not read an interrupted segment manifest", error) + })?) + .map_err(|error| { + CplError::new("CPL_SEGMENT_MANIFEST_INVALID", error.to_string(), false) + })?; + let sealed_segment = paths + .sealed + .join(ledger::segment_filename(manifest.segment_number)); + let sealed_manifest = paths + .sealed + .join(ledger::segment_manifest_filename(manifest.segment_number)); + if sealed_segment.exists() && !sealed_manifest.exists() { + let bytes = fs::read(&sealed_segment).map_err(|error| { + CplError::io("Could not verify an interrupted sealed segment", error) + })?; + if sha256_digest(&bytes) != manifest.segment_file_sha256 { + return Err(CplError::new( + "CPL_SEGMENT_MANIFEST_MISMATCH", + "Interrupted segment rotation has a manifest/segment digest contradiction.", + false, + )); + } + atomic_replace(&entry.path(), &sealed_manifest)?; + actions.push(format!( + "Completed the durable manifest move for sealed segment {}.", + manifest.segment_number + )); + repaired = true; + } + } + + let head_before = ledger::read_chain_head(&paths)?; + let (_, active) = ledger::current_active_segment(&paths)?; + let active_bytes = fs::read(&active).map_err(|error| { + CplError::io( + "Could not inspect the active segment during recovery", + error, + ) + })?; + if !active_bytes.is_empty() && !active_bytes.ends_with(b"\n") { + let complete_end = active_bytes + .iter() + .rposition(|byte| *byte == b'\n') + .map_or(0, |index| index + 1); + let complete_events = parse_complete_prefix(&active_bytes[..complete_end])?; + let readable_ids = ledger::sealed_segments(&paths)? + .into_iter() + .map(|path| ledger::read_segment(&path)) + .collect::>>()? + .into_iter() + .flatten() + .chain(complete_events.iter().cloned()) + .map(|event| event.event_id) + .collect::>(); + if head_before + .as_ref() + .is_some_and(|head| !readable_ids.iter().any(|id| id == &head.event_id)) + { + let mut verification = verifier::verify_project(root, project_id)?; + verification.status = VerificationStatus::Failed; + return Ok(RecoveryReport { + classification: RecoveryClassification::IntegrityFailure, + actions: vec![ + "Refused to truncate an active suffix referenced by the chain head.".to_owned(), + ], + quarantined_paths, + verification, + }); + } + let file = OpenOptions::new() + .write(true) + .open(&active) + .map_err(|error| CplError::io("Could not open the truncated active segment", error))?; + file.set_len(complete_end as u64) + .and_then(|_| file.sync_all()) + .map_err(|error| { + CplError::io( + "Could not remove an uncommitted partial JSONL suffix", + error, + ) + })?; + actions.push("Removed an incomplete active-segment suffix that was not referenced by the chain head.".to_owned()); + repaired = true; + } + + let events = ledger::read_all_events(&paths)?; + if let Err(message) = validate_event_chain(&events, project_id) { + let mut verification = verifier::verify_project(root, project_id)?; + verification.status = VerificationStatus::Failed; + verification.findings.push(super::VerificationFinding { + code: "CPL_RECOVERY_CHAIN_CONTRADICTION".to_owned(), + severity: "CRITICAL".to_owned(), + scope: "recovery".to_owned(), + message, + }); + return Ok(RecoveryReport { + classification: RecoveryClassification::IntegrityFailure, + actions, + quarantined_paths, + verification, + }); + } + + match (head_before.as_ref(), events.last()) { + (Some(head), Some(last)) + if head.event_id == last.event_id && head.event_sha256 == last.event_sha256 => + { + let number = + ledger::locate_event_segment(&paths, &last.event_id)?.ok_or_else(|| { + CplError::new( + "CPL_EVENT_NOT_FOUND", + "The head event has no segment.", + false, + ) + })?; + let active = ledger::active_segments(&paths)?.iter().any(|path| { + path.file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name == ledger::segment_filename(number)) + }); + let expected = format!( + "provenance/ledger/{}/{}", + if active { "active" } else { "sealed" }, + ledger::segment_filename(number) + ); + if head.segment_number != number || head.segment_file != expected { + ledger::advance_chain_head(&paths, project_id, last)?; + actions.push( + "Rebound the chain head to the recovered segment location after rotation." + .to_owned(), + ); + repaired = true; + } + } + (Some(head), Some(last)) + if events.iter().any(|event| { + event.event_id == head.event_id && event.event_sha256 == head.event_sha256 + }) => + { + ledger::advance_chain_head(&paths, project_id, last)?; + actions.push(format!( + "Advanced the chain head from sequence {} to durable sequence {}.", + head.event_sequence, last.event_sequence + )); + repaired = true; + } + (None, Some(last)) => { + ledger::advance_chain_head(&paths, project_id, last)?; + actions.push(format!( + "Reconstructed the missing chain head at sequence {}.", + last.event_sequence + )); + repaired = true; + } + (Some(_), None) => { + let mut verification = verifier::verify_project(root, project_id)?; + verification.status = VerificationStatus::Failed; + return Ok(RecoveryReport { + classification: RecoveryClassification::IntegrityFailure, + actions: vec![ + "The chain head is ahead of the readable ledger; no event was invented." + .to_owned(), + ], + quarantined_paths, + verification, + }); + } + (Some(_), Some(_)) => { + let mut verification = verifier::verify_project(root, project_id)?; + verification.status = VerificationStatus::Failed; + return Ok(RecoveryReport { classification: RecoveryClassification::IntegrityFailure, actions: vec!["The chain head does not occur in the readable ledger; automatic recovery was refused.".to_owned()], quarantined_paths, verification }); + } + (None, None) => {} + } + + let mut statement = database.prepare("SELECT intent_id,client_action_id,phase,record_paths_json FROM write_intents WHERE phase NOT IN ('COMPLETE','FAILED','QUARANTINED') ORDER BY intent_id") + .map_err(super::writer::database_error)?; + let intents = statement + .query_map([], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, String>(1)?, + row.get::<_, String>(2)?, + row.get::<_, String>(3)?, + )) + }) + .map_err(super::writer::database_error)? + .collect::, _>>() + .map_err(super::writer::database_error)?; + drop(statement); + + for (intent_id, client_action_id, phase, references_json) in intents { + if events + .iter() + .any(|event| event.client_action_id == client_action_id) + { + set_intent_phase(&database, &intent_id, "COMPLETE")?; + actions.push(format!( + "Replayed committed action {client_action_id} into SQLite." + )); + repaired = true; + continue; + } + let references: Vec = + serde_json::from_str(&references_json) + .map_err(|error| CplError::new("CPL_INTENT_INVALID", error.to_string(), false))?; + let quarantine = root.join(".app/recovery/orphans").join(&intent_id); + fs::create_dir_all(&quarantine) + .map_err(|error| CplError::io("Could not create the recovery quarantine", error))?; + let mut moved = false; + for reference in references { + let source = root.join(reference.path.replace('/', std::path::MAIN_SEPARATOR_STR)); + if source.exists() { + let destination = + unique_destination(&quarantine, source.file_name().unwrap_or_default()); + fs::rename(&source, &destination).map_err(|error| { + CplError::io( + "Could not quarantine an uncommitted immutable record", + error, + ) + })?; + quarantined_paths.push(relative_display(root, &destination)); + moved = true; + } + } + let staging = root.join(".app/temp/staging").join(&intent_id); + if staging.exists() { + for entry in fs::read_dir(&staging) + .map_err(|error| CplError::io("Could not inspect abandoned CPL staging", error))? + .filter_map(Result::ok) + { + let destination = unique_destination(&quarantine, &entry.file_name()); + fs::rename(entry.path(), &destination).map_err(|error| { + CplError::io("Could not quarantine abandoned CPL staging", error) + })?; + quarantined_paths.push(relative_display(root, &destination)); + moved = true; + } + let _ = fs::remove_dir(&staging); + } + if moved { + set_intent_phase(&database, &intent_id, "QUARANTINED")?; + actions.push(format!( + "Quarantined uncommitted files for {client_action_id} from phase {phase}." + )); + } else { + set_intent_phase(&database, &intent_id, "FAILED")?; + actions.push(format!( + "Closed abandoned intent {intent_id} with no durable authoritative files." + )); + } + repaired = true; + } + + rebuild_indexes(root, &events)?; + let verification = verifier::verify_project(root, project_id)?; + let classification = if matches!( + verification.status, + VerificationStatus::Failed | VerificationStatus::Unsafe + ) { + RecoveryClassification::IntegrityFailure + } else if repaired { + RecoveryClassification::RecoverableAutomatically + } else { + RecoveryClassification::Clean + }; + Ok(RecoveryReport { + classification, + actions, + quarantined_paths, + verification, + }) +} + +fn recover_database( + root: &Path, + actions: &mut Vec, + quarantined_paths: &mut Vec, +) -> CplResult { + match init_database(root) { + Ok(database) => Ok(database), + Err(original) => { + let database_path = root.join(".app/state.sqlite"); + if !database_path.exists() { + return Err(original); + } + let quarantine = root.join(".app/recovery/orphans").join(format!( + "sqlite-{}", + super::identifiers::sortable_id("recovery")? + )); + fs::create_dir_all(&quarantine).map_err(|error| { + CplError::io("Could not create corrupt-SQLite quarantine", error) + })?; + for suffix in ["", "-wal", "-shm"] { + let source = PathBuf::from(format!("{}{}", database_path.display(), suffix)); + if source.exists() { + let name = source.file_name().unwrap_or_default(); + let destination = quarantine.join(name); + fs::rename(&source, &destination).map_err(|error| { + CplError::io("Could not quarantine corrupt SQLite state", error) + })?; + quarantined_paths.push(relative_display(root, &destination)); + } + } + actions.push(format!("Quarantined unreadable SQLite state after {} and prepared a rebuild from the authoritative ledger.", original.message)); + init_database(root) + } + } +} + +fn parse_complete_prefix(bytes: &[u8]) -> CplResult> { + bytes + .split(|byte| *byte == b'\n') + .filter(|line| !line.is_empty()) + .map(|line| { + serde_json::from_slice(line) + .map_err(|error| CplError::new("CPL_EVENT_INVALID", error.to_string(), false)) + }) + .collect() +} + +fn validate_event_chain(events: &[CplEvent], project_id: &str) -> Result<(), String> { + let mut previous = None; + for (index, event) in events.iter().enumerate() { + if event.project_id != project_id + || event.event_sequence != index as u64 + 1 + || event.previous_event_sha256 != previous + || !event.verify_digest().map_err(|error| error.message)? + { + return Err(format!( + "Authoritative event {} contradicts the expected contiguous chain.", + event.event_id + )); + } + previous = Some(event.event_sha256.clone()); + } + Ok(()) +} + +fn unique_destination(directory: &Path, name: &std::ffi::OsStr) -> PathBuf { + let direct = directory.join(name); + if !direct.exists() { + return direct; + } + let stem = Path::new(name) + .file_stem() + .and_then(|value| value.to_str()) + .unwrap_or("orphan"); + let extension = Path::new(name) + .extension() + .and_then(|value| value.to_str()) + .unwrap_or("bin"); + (1..) + .map(|index| directory.join(format!("{stem}-{index}.{extension}"))) + .find(|path| !path.exists()) + .unwrap() +} + +fn relative_display(root: &Path, path: &Path) -> String { + path.strip_prefix(root) + .unwrap_or(path) + .to_string_lossy() + .replace('\\', "/") +} diff --git a/src-tauri/src/provenance/tests.rs b/src-tauri/src/provenance/tests.rs new file mode 100644 index 0000000..8c515e3 --- /dev/null +++ b/src-tauri/src/provenance/tests.rs @@ -0,0 +1,311 @@ +use super::{ + ledger::{self, LedgerConfig, LedgerPaths}, + writer::{init_database, CplService, WriterConfig}, + DurableBoundary, RecordInput, RecoveryClassification, VerificationStatus, WriteCommand, +}; +use serde_json::json; +use std::sync::Arc; + +fn command(project_id: &str, action: &str, value: i64) -> WriteCommand { + WriteCommand { + client_action_id: action.to_owned(), + project_id: project_id.to_owned(), + event_type: "TEST_ACTION".to_owned(), + actor: "system".to_owned(), + metadata: json!({"value": value}), + records: vec![RecordInput { + record_type: "test-record".to_owned(), + payload: json!({"value": value}), + }], + operational_state: Some(json!({"value": value})), + } +} + +#[test] +fn retries_are_idempotent_and_conflicts_are_rejected() { + let temp = tempfile::tempdir().unwrap(); + let service = CplService::new(temp.path(), "project_test"); + let first = service + .write(command("project_test", "client_action_1", 1)) + .unwrap(); + let replay = service + .write(command("project_test", "client_action_1", 1)) + .unwrap(); + assert_eq!(first.event.event_id, replay.event.event_id); + assert!(replay.idempotent_replay); + assert_eq!( + ledger::read_all_events(&LedgerPaths::new(temp.path())) + .unwrap() + .len(), + 1 + ); + let conflict = service + .write(command("project_test", "client_action_1", 2)) + .unwrap_err(); + assert_eq!(conflict.code, "CPL_IDEMPOTENCY_CONFLICT"); +} + +#[test] +fn os_writer_lock_serializes_concurrent_actions() { + let temp = tempfile::tempdir().unwrap(); + let root = Arc::new(temp.path().to_path_buf()); + std::thread::scope(|scope| { + for index in 0..8 { + let root = Arc::clone(&root); + scope.spawn(move || { + CplService::new(root.as_path(), "project_test") + .write(command( + "project_test", + &format!("client_action_{index}"), + index, + )) + .unwrap(); + }); + } + }); + let events = ledger::read_all_events(&LedgerPaths::new(temp.path())).unwrap(); + assert_eq!(events.len(), 8); + assert_eq!( + events + .iter() + .map(|event| event.event_sequence) + .collect::>(), + (1..=8).collect::>() + ); + assert_eq!( + CplService::new(temp.path(), "project_test") + .verify() + .unwrap() + .status, + VerificationStatus::Verified + ); +} + +#[test] +fn rotates_and_verifies_cross_segment_linkage() { + let temp = tempfile::tempdir().unwrap(); + let service = CplService::with_config( + temp.path(), + "project_test", + WriterConfig { + ledger: LedgerConfig { + max_events_per_segment: 2, + max_bytes_per_segment: u64::MAX, + }, + }, + ); + for index in 0..5 { + service + .write(command( + "project_test", + &format!("rotation_action_{index}"), + index, + )) + .unwrap(); + } + let paths = LedgerPaths::new(temp.path()); + assert_eq!(ledger::sealed_segments(&paths).unwrap().len(), 2); + assert_eq!(ledger::active_segments(&paths).unwrap().len(), 1); + assert_eq!( + service.verify().unwrap().status, + VerificationStatus::Verified + ); +} + +#[test] +fn every_durable_boundary_recovers_and_retries_safely() { + let boundaries = [ + DurableBoundary::IntentPrepared, + DurableBoundary::FirstRecordStaged, + DurableBoundary::RecordFlushed, + DurableBoundary::RecordMoved, + DurableBoundary::RecordDirectorySynced, + DurableBoundary::LedgerAppendBeforeFlush, + DurableBoundary::LedgerFlushed, + DurableBoundary::ChainHeadTemporaryWritten, + DurableBoundary::ChainHeadReplaced, + DurableBoundary::ChainHeadDirectorySynced, + DurableBoundary::SqliteApplied, + DurableBoundary::Complete, + ]; + for boundary in boundaries { + let temp = tempfile::tempdir().unwrap(); + let service = CplService::new(temp.path(), "project_test"); + let action = format!("fault_{boundary:?}"); + let failure = service + .write_with_failure(command("project_test", &action, 7), boundary) + .unwrap_err(); + assert_eq!(failure.code, "CPL_INJECTED_FAILURE", "{boundary:?}"); + let recovery = service.recover().unwrap(); + assert!( + !matches!( + recovery.classification, + RecoveryClassification::IntegrityFailure + ), + "{boundary:?}: {:?}", + recovery.actions + ); + let result = service.write(command("project_test", &action, 7)).unwrap(); + assert_eq!(result.event.event_sequence, 1, "{boundary:?}"); + let report = service.verify().unwrap(); + assert_eq!( + report.status, + VerificationStatus::Verified, + "{boundary:?}: {:?}", + report.findings + ); + assert_eq!(report.event_count, 1, "{boundary:?}"); + } +} + +#[test] +fn recovery_rebuilds_sqlite_from_authoritative_events() { + let temp = tempfile::tempdir().unwrap(); + let service = CplService::new(temp.path(), "project_test"); + service + .write(command("project_test", "rebuild_action", 4)) + .unwrap(); + let database = init_database(temp.path()).unwrap(); + database.execute("DELETE FROM cpl_events", []).unwrap(); + database.execute("DELETE FROM cpl_records", []).unwrap(); + database + .execute("DELETE FROM cpl_action_receipts", []) + .unwrap(); + drop(database); + let recovery = service.recover().unwrap(); + assert!(!matches!( + recovery.classification, + RecoveryClassification::IntegrityFailure + )); + assert_eq!( + service + .write(command("project_test", "rebuild_action", 4)) + .unwrap() + .event + .event_sequence, + 1 + ); + assert_eq!( + service.verify().unwrap().status, + VerificationStatus::Verified + ); +} + +#[test] +fn every_segment_rotation_boundary_recovers_without_sequence_loss() { + let boundaries = [ + DurableBoundary::SegmentFlushed, + DurableBoundary::SegmentManifestFlushed, + DurableBoundary::SegmentMoved, + DurableBoundary::SegmentManifestMoved, + DurableBoundary::NewActiveSegmentCreated, + ]; + for boundary in boundaries { + let temp = tempfile::tempdir().unwrap(); + let service = CplService::with_config( + temp.path(), + "project_test", + WriterConfig { + ledger: LedgerConfig { + max_events_per_segment: 1, + max_bytes_per_segment: u64::MAX, + }, + }, + ); + service + .write(command("project_test", "rotation_seed", 1)) + .unwrap(); + let failure = service + .write_with_failure(command("project_test", "rotation_retry", 2), boundary) + .unwrap_err(); + assert_eq!(failure.code, "CPL_INJECTED_FAILURE", "{boundary:?}"); + let recovery = service.recover().unwrap(); + assert!( + !matches!( + recovery.classification, + RecoveryClassification::IntegrityFailure + ), + "{boundary:?}: {:?}", + recovery.actions + ); + service + .write(command("project_test", "rotation_retry", 2)) + .unwrap(); + let events = ledger::read_all_events(&LedgerPaths::new(temp.path())).unwrap(); + assert_eq!( + events + .iter() + .map(|event| event.event_sequence) + .collect::>(), + vec![1, 2], + "{boundary:?}" + ); + assert_eq!( + service.verify().unwrap().status, + VerificationStatus::Verified, + "{boundary:?}" + ); + } +} + +#[test] +fn corrupt_sqlite_is_quarantined_and_rebuilt_from_canonical_records() { + let temp = tempfile::tempdir().unwrap(); + let service = CplService::new(temp.path(), "project_test"); + let mut rebuild_command = command("project_test", "sqlite_rebuild", 9); + rebuild_command.records[0].record_type = "application-state-snapshot".to_owned(); + service.write(rebuild_command).unwrap(); + std::fs::write( + temp.path().join(".app/state.sqlite"), + b"not a sqlite database", + ) + .unwrap(); + let recovery = service.recover().unwrap(); + assert_eq!( + recovery.classification, + RecoveryClassification::RecoverableAutomatically + ); + assert!(recovery + .actions + .iter() + .any(|action| action.contains("Quarantined unreadable SQLite"))); + assert!(!recovery.quarantined_paths.is_empty()); + let mut replay_command = command("project_test", "sqlite_rebuild", 9); + replay_command.records[0].record_type = "application-state-snapshot".to_owned(); + let replay = service.write(replay_command).unwrap(); + assert!(replay.idempotent_replay); + assert!(!replay.intent_id.is_empty()); + let database = init_database(temp.path()).unwrap(); + let state: String = database + .query_row("SELECT json FROM project_state WHERE id=1", [], |row| { + row.get(0) + }) + .unwrap(); + assert_eq!( + serde_json::from_str::(&state).unwrap(), + json!({"value": 9}) + ); + assert_eq!( + service.verify().unwrap().status, + VerificationStatus::Verified + ); +} + +#[test] +fn stale_lock_file_artifact_does_not_block_the_os_managed_lock() { + let temp = tempfile::tempdir().unwrap(); + std::fs::create_dir_all(temp.path().join(".app")).unwrap(); + std::fs::write( + temp.path().join(".app/cpl.writer.lock"), + b"stale process metadata", + ) + .unwrap(); + let service = CplService::new(temp.path(), "project_test"); + service + .write(command("project_test", "stale_lock_action", 1)) + .unwrap(); + assert_eq!( + service.verify().unwrap().status, + VerificationStatus::Verified + ); +} diff --git a/src-tauri/src/provenance/verifier.rs b/src-tauri/src/provenance/verifier.rs new file mode 100644 index 0000000..60f66e3 --- /dev/null +++ b/src-tauri/src/provenance/verifier.rs @@ -0,0 +1,438 @@ +use super::{ + assertions, + canonical::{canonicalize, sha256_digest}, + identifiers::{sortable_id, timestamp_millis}, + ledger::{self, LedgerPaths}, + records::{ + CplRecord, SegmentManifest, VerificationFinding, VerificationReport, VerificationStatus, + }, + writer::init_database, + CplError, CplResult, +}; +use rusqlite::OptionalExtension; +use std::{ + collections::HashSet, + fs, + path::{Component, Path}, +}; + +fn finding( + code: &str, + severity: &str, + scope: impl Into, + message: impl Into, +) -> VerificationFinding { + VerificationFinding { + code: code.to_owned(), + severity: severity.to_owned(), + scope: scope.into(), + message: message.into(), + } +} + +fn validate_relative_path(path: &str) -> bool { + if path.is_empty() + || path.contains('\\') + || path.contains(':') + || path.chars().any(char::is_control) + { + return false; + } + Path::new(path) + .components() + .all(|component| matches!(component, Component::Normal(_))) +} + +pub fn verify_project(root: &Path, project_id: &str) -> CplResult { + let report_id = sortable_id("report")?; + let verified_at = timestamp_millis(); + let mut report = VerificationReport::empty(project_id, report_id, verified_at); + let paths = LedgerPaths::new(root); + if !paths.root.exists() { + report.findings.push(finding( + "CPL_LEDGER_MISSING", + "ERROR", + "ledger", + "The native CPL ledger has not been initialized.", + )); + return Ok(report); + } + + let mut errors = 0usize; + let mut warnings = 0usize; + let sealed = ledger::sealed_segments(&paths)?; + let mut previous_segment_digest = None; + for segment_path in &sealed { + let number = segment_path + .file_name() + .and_then(|name| name.to_str()) + .and_then(|name| name.strip_prefix("segment-")) + .and_then(|name| name.strip_suffix(".jsonl")) + .and_then(|name| name.parse::().ok()) + .ok_or_else(|| { + CplError::new( + "CPL_SEGMENT_NAME_INVALID", + "A sealed segment filename is invalid.", + false, + ) + })?; + let manifest_path = paths.sealed.join(ledger::segment_manifest_filename(number)); + let bytes = match fs::read(segment_path) { + Ok(bytes) => bytes, + Err(error) => { + errors += 1; + report.findings.push(finding( + "CPL_SEALED_SEGMENT_UNREADABLE", + "CRITICAL", + segment_path.display().to_string(), + error.to_string(), + )); + continue; + } + }; + let manifest_bytes = match fs::read(&manifest_path) { + Ok(bytes) => bytes, + Err(error) => { + errors += 1; + report.findings.push(finding( + "CPL_SEGMENT_MANIFEST_INVALID", + "CRITICAL", + manifest_path.display().to_string(), + error.to_string(), + )); + continue; + } + }; + let manifest: SegmentManifest = match serde_json::from_slice(&manifest_bytes) { + Ok(manifest) => manifest, + Err(error) => { + errors += 1; + report.findings.push(finding( + "CPL_SEGMENT_MANIFEST_INVALID", + "CRITICAL", + manifest_path.display().to_string(), + error.to_string(), + )); + continue; + } + }; + if canonicalize(&serde_json::to_value(&manifest).map_err(|error| { + CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false) + })?)? + != manifest_bytes + { + errors += 1; + report.findings.push(finding( + "CPL_SEGMENT_MANIFEST_NONCANONICAL", + "CRITICAL", + manifest_path.display().to_string(), + "The sealed segment manifest is not canonical JSON.", + )); + } + let events = match ledger::read_segment(segment_path) { + Ok(events) => events, + Err(error) => { + errors += 1; + report.findings.push(finding( + &error.code, + "CRITICAL", + segment_path.display().to_string(), + error.message, + )); + continue; + } + }; + let manifest_valid = !events.is_empty() + && manifest.segment_number == number + && manifest.previous_segment_file_sha256 == previous_segment_digest + && manifest.first_event_sha256 == events.first().unwrap().event_sha256 + && manifest.final_event_sha256 == events.last().unwrap().event_sha256 + && manifest.first_event_sequence == events.first().unwrap().event_sequence + && manifest.final_event_sequence == events.last().unwrap().event_sequence + && manifest.event_count == events.len() as u64 + && manifest.byte_length == bytes.len() as u64 + && manifest.segment_file_sha256 == sha256_digest(&bytes); + if !manifest_valid { + errors += 1; + report.findings.push(finding( + "CPL_SEGMENT_MANIFEST_MISMATCH", + "CRITICAL", + manifest_path.display().to_string(), + "The sealed manifest does not bind the exact segment bytes and event range.", + )); + } + previous_segment_digest = Some(sha256_digest(&bytes)); + } + + let events = match ledger::read_all_events(&paths) { + Ok(events) => events, + Err(error) => { + report.status = VerificationStatus::Failed; + report + .findings + .push(finding(&error.code, "CRITICAL", "ledger", error.message)); + return Ok(report); + } + }; + report.event_count = events.len() as u64; + let mut previous = None; + let mut record_count = 0u64; + let mut event_ids = HashSet::new(); + let mut action_ids = HashSet::new(); + let mut record_ids = HashSet::new(); + for (index, event) in events.iter().enumerate() { + if !event_ids.insert(&event.event_id) || !action_ids.insert(&event.client_action_id) { + errors += 1; + report.findings.push(finding( + "CPL_EVENT_ID_DUPLICATE", + "CRITICAL", + event.event_id.clone(), + "Event IDs and client action IDs must each be unique across the ledger.", + )); + } + let expected_sequence = index as u64 + 1; + if event.project_id != project_id + || event.event_sequence != expected_sequence + || event.previous_event_sha256 != previous + || !event.verify_digest()? + { + errors += 1; + report.findings.push(finding("CPL_EVENT_CHAIN_INVALID", "CRITICAL", event.event_id.clone(), format!("Event sequence {} failed project, sequence, previous-link, or digest verification.", event.event_sequence))); + } + let parsed = chrono::DateTime::parse_from_rfc3339(&event.timestamp).ok(); + let timestamp_valid = parsed + .map(|value| { + value.offset().local_minus_utc() == 0 + && value.timestamp_subsec_millis() * 1_000_000 == value.timestamp_subsec_nanos() + && event.timestamp.ends_with('Z') + && event.timestamp.len() == 24 + }) + .unwrap_or(false); + if !timestamp_valid { + errors += 1; + report.findings.push(finding( + "CPL_TIMESTAMP_INVALID", + "ERROR", + event.event_id.clone(), + "The event timestamp is not exact RFC 3339 UTC millisecond form.", + )); + } + for reference in &event.record_references { + if !record_ids.insert(&reference.record_id) { + errors += 1; + report.findings.push(finding( + "CPL_RECORD_ID_DUPLICATE", + "CRITICAL", + reference.record_id.clone(), + "An immutable record ID is referenced more than once.", + )); + } + record_count += 1; + if !validate_relative_path(&reference.path) { + errors += 1; + report.findings.push(finding( + "CPL_RECORD_PATH_UNSAFE", + "CRITICAL", + reference.record_id.clone(), + "The record path is not a safe project-relative forward-slash path.", + )); + continue; + } + let path = root.join(reference.path.replace('/', std::path::MAIN_SEPARATOR_STR)); + let bytes = match fs::read(&path) { + Ok(bytes) => bytes, + Err(error) => { + errors += 1; + report.findings.push(finding( + "CPL_RECORD_MISSING", + "CRITICAL", + reference.record_id.clone(), + error.to_string(), + )); + continue; + } + }; + let record: CplRecord = match serde_json::from_slice(&bytes) { + Ok(record) => record, + Err(error) => { + errors += 1; + report.findings.push(finding( + "CPL_RECORD_INVALID", + "CRITICAL", + reference.record_id.clone(), + error.to_string(), + )); + continue; + } + }; + let canonical = canonicalize(&serde_json::to_value(&record).map_err(|error| { + CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false) + })?)?; + if canonical != bytes + || record.record_id != reference.record_id + || record.record_type != reference.record_type + || record.record_sha256 != reference.record_sha256 + || !record.verify_digest()? + { + errors += 1; + report.findings.push(finding("CPL_RECORD_DIGEST_INVALID", "CRITICAL", reference.record_id.clone(), "The immutable record bytes, identity, type, or digest do not match the event reference.")); + } + if let Err(message) = assertions::validate_record(&record) { + errors += 1; + report.findings.push(finding( + "CPL_ASSERTION_INVALID", + "ERROR", + reference.record_id.clone(), + message, + )); + } + } + previous = Some(event.event_sha256.clone()); + } + report.record_count = record_count; + + let head = ledger::read_chain_head(&paths)?; + report.chain_head = head.clone(); + let expected_head_location = if let Some(last) = events.last() { + let number = ledger::locate_event_segment(&paths, &last.event_id)?; + if let Some(number) = number { + let active = ledger::active_segments(&paths)?.iter().any(|path| { + path.file_name() + .and_then(|name| name.to_str()) + .is_some_and(|name| name == ledger::segment_filename(number)) + }); + Some(( + number, + format!( + "provenance/ledger/{}/{}", + if active { "active" } else { "sealed" }, + ledger::segment_filename(number) + ), + )) + } else { + None + } + } else { + None + }; + match (events.last(), head.as_ref()) { + (Some(last), Some(head)) + if head.project_id == project_id + && head.event_id == last.event_id + && head.event_sequence == last.event_sequence + && head.event_sha256 == last.event_sha256 + && expected_head_location + .as_ref() + .is_some_and(|(number, path)| { + head.segment_number == *number && head.segment_file == *path + }) => {} + (None, None) => report.findings.push(finding( + "CPL_LEDGER_EMPTY", + "WARNING", + "ledger", + "The ledger is initialized but contains no events.", + )), + _ => { + errors += 1; + report.findings.push(finding( + "CPL_CHAIN_HEAD_MISMATCH", + "CRITICAL", + "chain-head", + "The chain head does not bind the final readable event.", + )); + } + } + + if let Ok(database) = init_database(root) { + let indexed: Option = database + .query_row("SELECT MAX(event_sequence) FROM cpl_events", [], |row| { + row.get(0) + }) + .optional() + .unwrap_or(None) + .flatten(); + let authoritative = events.last().map(|event| event.event_sequence); + if indexed != authoritative { + warnings += 1; + report.findings.push(finding( + "CPL_DERIVED_INDEX_STALE", + "WARNING", + "sqlite", + "The rebuildable SQLite event index is stale.", + )); + } + } else { + warnings += 1; + report.findings.push(finding( + "CPL_DERIVED_INDEX_UNAVAILABLE", + "WARNING", + "sqlite", + "The rebuildable SQLite index could not be inspected.", + )); + } + + report.status = if errors > 0 { + VerificationStatus::Failed + } else if events.is_empty() { + VerificationStatus::Incomplete + } else if warnings > 0 { + VerificationStatus::VerifiedWithWarnings + } else { + VerificationStatus::Verified + }; + if errors == 0 && !events.is_empty() { + report.findings.push(finding("CPL_INTEGRITY_VERIFIED", "INFO", "ledger", format!("Verified {} contiguous events and {} immutable record references against the retained chain head.", events.len(), record_count))); + } + Ok(report) +} +/// Enforces the release boundary against the authoritative native report. +/// Warnings remain visible but do not make an otherwise verified chain unsafe +/// to release. Every other terminal status blocks before release state changes. +pub fn require_release_verification(report: &VerificationReport) -> CplResult<()> { + match report.status { + VerificationStatus::Verified | VerificationStatus::VerifiedWithWarnings => Ok(()), + VerificationStatus::Incomplete + | VerificationStatus::Failed + | VerificationStatus::Unsafe => Err(CplError::new( + "RELEASE_VERIFICATION_BLOCKED", + format!( + "Native CPL verification status {:?} does not permit release finalization.", + report.status + ), + true, + )), + } +} + +#[cfg(test)] +mod release_gate_tests { + use super::*; + + fn report(status: VerificationStatus) -> VerificationReport { + let mut report = VerificationReport::empty( + "project_test", + "report_test".into(), + "2026-07-19T00:00:00.000Z".into(), + ); + report.status = status; + report + } + + #[test] + fn release_gate_accepts_only_complete_safe_native_verification() { + for status in [ + VerificationStatus::Verified, + VerificationStatus::VerifiedWithWarnings, + ] { + require_release_verification(&report(status)).unwrap(); + } + for status in [ + VerificationStatus::Incomplete, + VerificationStatus::Failed, + VerificationStatus::Unsafe, + ] { + let error = require_release_verification(&report(status)).unwrap_err(); + assert_eq!(error.code, "RELEASE_VERIFICATION_BLOCKED"); + } + } +} diff --git a/src-tauri/src/provenance/writer.rs b/src-tauri/src/provenance/writer.rs new file mode 100644 index 0000000..ebc22e4 --- /dev/null +++ b/src-tauri/src/provenance/writer.rs @@ -0,0 +1,678 @@ +use super::{ + canonical::{canonical_digest, canonicalize}, + identifiers::{sortable_id, timestamp_millis}, + ledger::{self, atomic_replace, sync_directory, LedgerConfig, LedgerPaths}, + records::{ + CplEvent, CplRecord, RecordReference, VerificationReport, WriteCommand, WriteResult, + }, + recovery, verifier, CplError, CplResult, DurableBoundary, CPL_SCHEMA_VERSION, +}; +use rusqlite::{params, Connection, OptionalExtension}; +use std::{ + fs::{self, File, OpenOptions}, + io::Write, + path::{Path, PathBuf}, +}; + +#[derive(Debug, Clone, Copy)] +pub struct WriterConfig { + pub ledger: LedgerConfig, +} + +impl Default for WriterConfig { + fn default() -> Self { + Self { + ledger: LedgerConfig::default(), + } + } +} + +pub struct CplService { + root: PathBuf, + project_id: String, + config: WriterConfig, +} + +impl CplService { + pub fn new(root: impl Into, project_id: impl Into) -> Self { + Self { + root: root.into(), + project_id: project_id.into(), + config: WriterConfig::default(), + } + } + + #[cfg(test)] + pub fn with_config( + root: impl Into, + project_id: impl Into, + config: WriterConfig, + ) -> Self { + Self { + root: root.into(), + project_id: project_id.into(), + config, + } + } + + pub fn initialize(&self) -> CplResult<()> { + LedgerPaths::new(&self.root).initialize()?; + fs::create_dir_all(self.root.join("records")) + .and_then(|_| fs::create_dir_all(self.root.join(".app/recovery/orphans"))) + .and_then(|_| fs::create_dir_all(self.root.join(".app/temp/staging"))) + .map_err(|error| CplError::io("Could not initialize native CPL storage", error))?; + Ok(()) + } + + pub fn write(&self, command: WriteCommand) -> CplResult { + self.write_with_boundary(command, &mut |_| Ok(())) + } + + pub fn verify(&self) -> CplResult { + verifier::verify_project(&self.root, &self.project_id) + } + + pub fn recover(&self) -> CplResult { + recovery::recover_project(&self.root, &self.project_id) + } + + fn write_with_boundary( + &self, + command: WriteCommand, + boundary: &mut dyn FnMut(DurableBoundary) -> CplResult<()>, + ) -> CplResult { + let _lock = ProjectWriterLock::acquire(&self.root)?; + self.initialize()?; + recovery::recover_locked(&self.root, &self.project_id)?; + self.write_locked(command, boundary) + } + + pub(crate) fn write_prepared( + &self, + client_action_id: &str, + prepare: impl FnOnce() -> CplResult>, + ) -> CplResult { + let _lock = ProjectWriterLock::acquire(&self.root)?; + self.initialize()?; + recovery::recover_locked(&self.root, &self.project_id)?; + if let Some(command) = prepare()? { + return self.write_locked(command, &mut |_| Ok(())); + } + let database = init_database(&self.root)?; + let result_json = database + .query_row( + "SELECT result_json FROM cpl_action_receipts WHERE client_action_id=?1", + params![client_action_id], + |row| row.get::<_, String>(0), + ) + .optional() + .map_err(database_error)? + .ok_or_else(|| { + CplError::new( + "CPL_RECEIPT_MISSING", + "The committed composition action has no recoverable receipt.", + false, + ) + })?; + let mut result: WriteResult = serde_json::from_str(&result_json) + .map_err(|error| CplError::new("CPL_RECEIPT_INVALID", error.to_string(), false))?; + result.idempotent_replay = true; + Ok(result) + } + + fn write_locked( + &self, + command: WriteCommand, + boundary: &mut dyn FnMut(DurableBoundary) -> CplResult<()>, + ) -> CplResult { + validate_command(&command, &self.project_id)?; + let command_sha256 = command.digest()?; + let mut database = init_database(&self.root)?; + + if let Some((stored_digest, stored_result)) = database + .query_row( + "SELECT command_sha256, result_json FROM cpl_action_receipts WHERE client_action_id=?1", + params![command.client_action_id], + |row| Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?)), + ) + .optional() + .map_err(database_error)? + { + if stored_digest != command_sha256 { + return Err(CplError::new( + "CPL_IDEMPOTENCY_CONFLICT", + "The client_action_id was already committed with a different canonical command.", + false, + )); + } + let mut result: WriteResult = serde_json::from_str(&stored_result).map_err(|error| { + CplError::new("CPL_RECEIPT_INVALID", error.to_string(), false) + })?; + result.idempotent_replay = true; + return Ok(result); + } + + let intent_id = sortable_id("intent")?; + let event_id = sortable_id("event")?; + let created_at = timestamp_millis(); + let (records, references) = prepare_records(&command, &intent_id, &created_at)?; + let paths_json = serde_json::to_string(&references) + .map_err(|error| CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false))?; + database + .execute( + "INSERT INTO write_intents(intent_id,client_action_id,command_sha256,phase,record_paths_json,event_id,updated_at) VALUES(?1,?2,?3,'PREPARED',?4,?5,?6)", + params![intent_id, command.client_action_id, command_sha256, paths_json, event_id, created_at], + ) + .map_err(database_error)?; + boundary(DurableBoundary::IntentPrepared)?; + + persist_records(&self.root, &intent_id, &records, &references, boundary)?; + set_intent_phase(&database, &intent_id, "RECORDS_DURABLE")?; + + let event = CplEvent { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + event_id, + project_id: command.project_id.clone(), + event_sequence: 0, + timestamp: created_at, + event_type: command.event_type.clone(), + actor: command.actor.clone(), + client_action_id: command.client_action_id.clone(), + command_sha256: command_sha256.clone(), + record_references: references.clone(), + metadata: command.metadata.clone(), + previous_event_sha256: None, + event_sha256: String::new(), + }; + let (event, _) = ledger::append_event( + &LedgerPaths::new(&self.root), + self.config.ledger, + event, + boundary, + )?; + set_intent_phase(&database, &intent_id, "LEDGER_APPENDED")?; + set_intent_phase(&database, &intent_id, "CHAIN_HEAD_ADVANCED")?; + + let result = WriteResult { + idempotent_replay: false, + intent_id: intent_id.clone(), + event: event.clone(), + records: references.clone(), + }; + apply_sqlite_state( + &mut database, + &command, + &command_sha256, + &intent_id, + &event, + &result, + )?; + boundary(DurableBoundary::SqliteApplied)?; + set_intent_phase(&database, &intent_id, "COMPLETE")?; + boundary(DurableBoundary::Complete)?; + let staging = self.root.join(".app/temp/staging").join(&intent_id); + if staging.exists() { + let _ = fs::remove_dir(&staging); + } + Ok(result) + } + + #[cfg(test)] + pub fn write_with_failure( + &self, + command: WriteCommand, + failure: DurableBoundary, + ) -> CplResult { + let mut fired = false; + self.write_with_boundary(command, &mut |boundary| { + if !fired && boundary == failure { + fired = true; + Err(super::injected_failure(boundary)) + } else { + Ok(()) + } + }) + } +} + +fn validate_command(command: &WriteCommand, project_id: &str) -> CplResult<()> { + if command.project_id != project_id { + return Err(CplError::new( + "CPL_PROJECT_MISMATCH", + "The command targets another project.", + false, + )); + } + for (label, value) in [ + ("client_action_id", command.client_action_id.as_str()), + ("event_type", command.event_type.as_str()), + ("actor", command.actor.as_str()), + ] { + if value.trim().is_empty() || value.chars().any(char::is_control) { + return Err(CplError::new( + "CPL_COMMAND_INVALID", + format!("{label} is empty or contains control characters."), + false, + )); + } + } + if command.records.is_empty() { + return Err(CplError::new( + "CPL_RECORD_REQUIRED", + "Every provenance mutation requires at least one immutable authoritative record.", + false, + )); + } + for record in &command.records { + if !safe_component(&record.record_type) { + return Err(CplError::new( + "CPL_RECORD_TYPE_INVALID", + format!("Unsafe record type '{}'.", record.record_type), + false, + )); + } + } + Ok(()) +} + +fn safe_component(value: &str) -> bool { + !value.is_empty() + && value.len() <= 80 + && value.bytes().all(|byte| { + byte.is_ascii_lowercase() || byte.is_ascii_digit() || matches!(byte, b'-' | b'_') + }) +} + +fn prepare_records( + command: &WriteCommand, + intent_id: &str, + created_at: &str, +) -> CplResult<(Vec, Vec)> { + let mut records = Vec::with_capacity(command.records.len()); + let mut references = Vec::with_capacity(command.records.len()); + for input in &command.records { + let record_id = sortable_id("record")?; + let mut record = CplRecord { + schema_version: CPL_SCHEMA_VERSION.to_owned(), + record_id: record_id.clone(), + record_type: input.record_type.clone(), + project_id: command.project_id.clone(), + intent_id: intent_id.to_owned(), + client_action_id: command.client_action_id.clone(), + created_at: created_at.to_owned(), + payload: input.payload.clone(), + record_sha256: String::new(), + }; + record.record_sha256 = canonical_digest(&record.identity())?; + references.push(RecordReference { + record_id, + record_type: input.record_type.clone(), + path: format!("records/{}/{}.json", input.record_type, record.record_id), + record_sha256: record.record_sha256.clone(), + }); + records.push(record); + } + Ok((records, references)) +} + +fn persist_records( + root: &Path, + intent_id: &str, + records: &[CplRecord], + references: &[RecordReference], + boundary: &mut dyn FnMut(DurableBoundary) -> CplResult<()>, +) -> CplResult<()> { + let staging = root.join(".app/temp/staging").join(intent_id); + fs::create_dir_all(&staging) + .map_err(|error| CplError::io("Could not create same-filesystem CPL staging", error))?; + for (index, (record, reference)) in records.iter().zip(references).enumerate() { + let stage = staging.join(format!("{}.json", record.record_id)); + let bytes = canonicalize(&serde_json::to_value(record).map_err(|error| { + CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false) + })?)?; + let mut file = File::create(&stage) + .map_err(|error| CplError::io("Could not stage an immutable CPL record", error))?; + file.write_all(&bytes) + .map_err(|error| CplError::io("Could not write a staged CPL record", error))?; + if index == 0 { + boundary(DurableBoundary::FirstRecordStaged)?; + } + file.sync_all() + .map_err(|error| CplError::io("Could not flush a staged CPL record", error))?; + boundary(DurableBoundary::RecordFlushed)?; + drop(file); + let final_path = root.join(reference.path.replace('/', std::path::MAIN_SEPARATOR_STR)); + let parent = final_path.parent().ok_or_else(|| { + CplError::new("CPL_PATH_INVALID", "Record path has no parent.", false) + })?; + fs::create_dir_all(parent).map_err(|error| { + CplError::io("Could not create the immutable record directory", error) + })?; + if final_path.exists() { + return Err(CplError::new( + "CPL_RECORD_COLLISION", + format!("{} already exists.", final_path.display()), + false, + )); + } + atomic_replace(&stage, &final_path)?; + boundary(DurableBoundary::RecordMoved)?; + sync_directory(parent)?; + boundary(DurableBoundary::RecordDirectorySynced)?; + } + Ok(()) +} + +fn apply_sqlite_state( + database: &mut Connection, + command: &WriteCommand, + command_sha256: &str, + intent_id: &str, + event: &CplEvent, + result: &WriteResult, +) -> CplResult<()> { + let transaction = database.transaction().map_err(database_error)?; + if let Some(state) = &command.operational_state { + let state = serde_json::to_string(state) + .map_err(|error| CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false))?; + transaction.execute( + "INSERT INTO project_state(id,json,updated_at) VALUES(1,?1,?2) ON CONFLICT(id) DO UPDATE SET json=excluded.json,updated_at=excluded.updated_at", + params![state, event.timestamp], + ).map_err(database_error)?; + } + index_event(&transaction, event)?; + let result_json = serde_json::to_string(result) + .map_err(|error| CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false))?; + transaction.execute( + "INSERT OR REPLACE INTO cpl_action_receipts(client_action_id,command_sha256,event_id,result_json,committed_at) VALUES(?1,?2,?3,?4,?5)", + params![command.client_action_id, command_sha256, event.event_id, result_json, event.timestamp], + ).map_err(database_error)?; + transaction.execute("UPDATE write_intents SET phase='SQLITE_APPLIED',result_json=?2,updated_at=?3 WHERE intent_id=?1", params![intent_id, result_json, event.timestamp]).map_err(database_error)?; + transaction.commit().map_err(database_error) +} + +pub(crate) fn init_database(root: &Path) -> CplResult { + let state = root.join(".app"); + fs::create_dir_all(&state) + .map_err(|error| CplError::io("Could not create CPL SQLite storage", error))?; + let database = Connection::open(state.join("state.sqlite")).map_err(database_error)?; + database.execute_batch( + "PRAGMA journal_mode=WAL; + PRAGMA synchronous=FULL; + PRAGMA foreign_keys=ON; + CREATE TABLE IF NOT EXISTS project_state (id INTEGER PRIMARY KEY CHECK(id=1), json TEXT NOT NULL, updated_at TEXT NOT NULL); + CREATE TABLE IF NOT EXISTS write_intents (intent_id TEXT PRIMARY KEY, client_action_id TEXT NOT NULL, command_sha256 TEXT NOT NULL, phase TEXT NOT NULL CHECK(phase IN ('PREPARED','RECORDS_DURABLE','LEDGER_APPENDED','CHAIN_HEAD_ADVANCED','SQLITE_APPLIED','COMPLETE','QUARANTINED','FAILED')), record_paths_json TEXT NOT NULL, event_id TEXT NOT NULL, result_json TEXT, updated_at TEXT NOT NULL); + CREATE TABLE IF NOT EXISTS cpl_events (event_sequence INTEGER PRIMARY KEY, event_id TEXT NOT NULL UNIQUE, client_action_id TEXT NOT NULL UNIQUE, event_type TEXT NOT NULL, event_sha256 TEXT NOT NULL, previous_event_sha256 TEXT, timestamp TEXT NOT NULL); + CREATE TABLE IF NOT EXISTS cpl_records (record_id TEXT PRIMARY KEY, record_type TEXT NOT NULL, path TEXT NOT NULL UNIQUE, record_sha256 TEXT NOT NULL, event_id TEXT NOT NULL); + CREATE TABLE IF NOT EXISTS cpl_action_receipts (client_action_id TEXT PRIMARY KEY, command_sha256 TEXT NOT NULL, event_id TEXT NOT NULL, result_json TEXT NOT NULL, committed_at TEXT NOT NULL);", + ).map_err(database_error)?; + Ok(database) +} + +pub(crate) fn index_event(database: &Connection, event: &CplEvent) -> CplResult<()> { + database.execute( + "INSERT OR REPLACE INTO cpl_events(event_sequence,event_id,client_action_id,event_type,event_sha256,previous_event_sha256,timestamp) VALUES(?1,?2,?3,?4,?5,?6,?7)", + params![event.event_sequence, event.event_id, event.client_action_id, event.event_type, event.event_sha256, event.previous_event_sha256, event.timestamp], + ).map_err(database_error)?; + for record in &event.record_references { + database.execute( + "INSERT OR REPLACE INTO cpl_records(record_id,record_type,path,record_sha256,event_id) VALUES(?1,?2,?3,?4,?5)", + params![record.record_id, record.record_type, record.path, record.record_sha256, event.event_id], + ).map_err(database_error)?; + } + Ok(()) +} + +pub(crate) fn rebuild_indexes(root: &Path, events: &[CplEvent]) -> CplResult<()> { + let phase1_project_id = events.iter().find_map(|event| { + event + .record_references + .iter() + .any(|record| record.record_type == "phase1-operation") + .then(|| event.project_id.clone()) + }); + let composition_project_id = events.iter().find_map(|event| { + event + .record_references + .iter() + .any(|record| record.record_type == "composition-command") + .then(|| event.project_id.clone()) + }); + let mut database = init_database(root)?; + let transaction = database.transaction().map_err(database_error)?; + transaction + .execute("DELETE FROM cpl_records", []) + .map_err(database_error)?; + transaction + .execute("DELETE FROM cpl_events", []) + .map_err(database_error)?; + transaction + .execute("DELETE FROM cpl_action_receipts", []) + .map_err(database_error)?; + let mut latest_operational_state = None; + for event in events { + index_event(&transaction, event)?; + for reference in &event.record_references { + if reference.record_type == "application-state-snapshot" { + let path = root.join(reference.path.replace('/', std::path::MAIN_SEPARATOR_STR)); + let record: CplRecord = + serde_json::from_slice(&fs::read(&path).map_err(|error| { + CplError::io( + "Could not rebuild operational state from its canonical record", + error, + ) + })?) + .map_err(|error| { + CplError::new("CPL_RECORD_INVALID", error.to_string(), false) + })?; + latest_operational_state = Some((record.payload, event.timestamp.clone())); + } + } + let first_record = event.record_references.first().ok_or_else(|| { + CplError::new( + "CPL_RECORD_REQUIRED", + "Committed event has no authoritative record reference.", + false, + ) + })?; + let first_path = root.join( + first_record + .path + .replace('/', std::path::MAIN_SEPARATOR_STR), + ); + let first_record: CplRecord = + serde_json::from_slice(&fs::read(&first_path).map_err(|error| { + CplError::io("Could not reconstruct the committed intent identity", error) + })?) + .map_err(|error| CplError::new("CPL_RECORD_INVALID", error.to_string(), false))?; + let result = WriteResult { + idempotent_replay: false, + intent_id: first_record.intent_id, + event: event.clone(), + records: event.record_references.clone(), + }; + let result_json = serde_json::to_string(&result) + .map_err(|error| CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false))?; + transaction.execute( + "INSERT INTO cpl_action_receipts(client_action_id,command_sha256,event_id,result_json,committed_at) VALUES(?1,?2,?3,?4,?5)", + params![event.client_action_id, event.command_sha256, event.event_id, result_json, event.timestamp], + ).map_err(database_error)?; + } + if let Some((state, updated_at)) = latest_operational_state { + let state = serde_json::to_string(&state) + .map_err(|error| CplError::new("CPL_SERIALIZATION_FAILED", error.to_string(), false))?; + transaction.execute( + "INSERT INTO project_state(id,json,updated_at) VALUES(1,?1,?2) ON CONFLICT(id) DO UPDATE SET json=excluded.json,updated_at=excluded.updated_at", + params![state, updated_at], + ).map_err(database_error)?; + } + transaction.commit().map_err(database_error)?; + if let Some(project_id) = phase1_project_id { + super::phase1::rebuild_projection_cache(root, &project_id, events)?; + } + if let Some(project_id) = composition_project_id { + super::composition::rebuild_projection_cache(root, &project_id, events)?; + } + Ok(()) +} + +pub(crate) fn set_intent_phase( + database: &Connection, + intent_id: &str, + phase: &str, +) -> CplResult<()> { + database + .execute( + "UPDATE write_intents SET phase=?2,updated_at=?3 WHERE intent_id=?1", + params![intent_id, phase, timestamp_millis()], + ) + .map_err(database_error)?; + Ok(()) +} + +pub(crate) fn database_error(error: rusqlite::Error) -> CplError { + CplError::new("CPL_DATABASE_ERROR", error.to_string(), true) +} + +pub(crate) struct ProjectWriterLock { + file: File, +} + +impl ProjectWriterLock { + pub(crate) fn acquire(root: &Path) -> CplResult { + let app = root.join(".app/locks"); + fs::create_dir_all(&app) + .map_err(|error| CplError::io("Could not create the CPL lock directory", error))?; + let file = OpenOptions::new() + .create(true) + .read(true) + .write(true) + .open(app.join("cpl.writer.lock")) + .map_err(|error| CplError::io("Could not open the CPL writer lock", error))?; + lock_file(&file)?; + Ok(Self { file }) + } +} + +impl Drop for ProjectWriterLock { + fn drop(&mut self) { + let _ = unlock_file(&self.file); + } +} + +#[cfg(target_os = "windows")] +fn lock_file(file: &File) -> CplResult<()> { + use std::os::windows::io::AsRawHandle; + #[repr(C)] + struct Overlapped { + internal: usize, + internal_high: usize, + offset: u32, + offset_high: u32, + event: *mut std::ffi::c_void, + } + #[link(name = "Kernel32")] + extern "system" { + fn LockFileEx( + file: *mut std::ffi::c_void, + flags: u32, + reserved: u32, + low: u32, + high: u32, + overlapped: *mut Overlapped, + ) -> i32; + } + let mut overlapped = Overlapped { + internal: 0, + internal_high: 0, + offset: 0, + offset_high: 0, + event: std::ptr::null_mut(), + }; + let result = unsafe { + LockFileEx( + file.as_raw_handle(), + 0x2, + 0, + u32::MAX, + u32::MAX, + &mut overlapped, + ) + }; + if result == 0 { + return Err(CplError::io( + "Could not acquire the exclusive OS CPL writer lock", + std::io::Error::last_os_error(), + )); + } + Ok(()) +} + +#[cfg(target_os = "windows")] +fn unlock_file(file: &File) -> CplResult<()> { + use std::os::windows::io::AsRawHandle; + #[repr(C)] + struct Overlapped { + internal: usize, + internal_high: usize, + offset: u32, + offset_high: u32, + event: *mut std::ffi::c_void, + } + #[link(name = "Kernel32")] + extern "system" { + fn UnlockFileEx( + file: *mut std::ffi::c_void, + reserved: u32, + low: u32, + high: u32, + overlapped: *mut Overlapped, + ) -> i32; + } + let mut overlapped = Overlapped { + internal: 0, + internal_high: 0, + offset: 0, + offset_high: 0, + event: std::ptr::null_mut(), + }; + let result = + unsafe { UnlockFileEx(file.as_raw_handle(), 0, u32::MAX, u32::MAX, &mut overlapped) }; + if result == 0 { + return Err(CplError::io( + "Could not release the CPL writer lock", + std::io::Error::last_os_error(), + )); + } + Ok(()) +} + +#[cfg(unix)] +fn lock_file(file: &File) -> CplResult<()> { + use std::os::fd::AsRawFd; + extern "C" { + fn flock(fd: i32, operation: i32) -> i32; + } + if unsafe { flock(file.as_raw_fd(), 2) } != 0 { + return Err(CplError::io( + "Could not acquire the exclusive OS CPL writer lock", + std::io::Error::last_os_error(), + )); + } + Ok(()) +} + +#[cfg(unix)] +fn unlock_file(file: &File) -> CplResult<()> { + use std::os::fd::AsRawFd; + extern "C" { + fn flock(fd: i32, operation: i32) -> i32; + } + if unsafe { flock(file.as_raw_fd(), 8) } != 0 { + return Err(CplError::io( + "Could not release the CPL writer lock", + std::io::Error::last_os_error(), + )); + } + Ok(()) +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 6c6b9d4..37b5df4 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Thinkloom", - "version": "0.5.0", + "version": "0.5.11", "identifier": "com.thinkloom.desktop", "build": { "beforeDevCommand": "npm run dev", diff --git a/src/HarpExportPanel.tsx b/src/HarpExportPanel.tsx new file mode 100644 index 0000000..843fa45 --- /dev/null +++ b/src/HarpExportPanel.tsx @@ -0,0 +1,123 @@ +import { useMemo, useState } from "react"; +import "./export.css"; + +interface ExportArtifact { + role: string; + path: string; + sha256: string; + byteLength: number; + privacyClassification: string; +} + +interface ArchiveVerification { + status: string; + archiveSha256: string; + retainedFileCount: number; + omissionDisclosureCount: number; + completenessClaim: string; + verificationScopeStatement: string; + findings: string[]; +} + +interface HarpExportResult { + exportDirectory: string; + artifacts: ExportArtifact[]; + sanitizedManifest: { + omission_rules?: Array<{ category: string; action: string; count: number; retained_binding_sha256: string; disclosure_sha256: string }>; + }; + sanitizedVerification: ArchiveVerification; +} + +async function invokeNative(command: string, args: Record = {}): Promise { + const host = window as unknown as { __TAURI_INTERNALS__?: { invoke: (name: string, payload: Record) => Promise } }; + return host.__TAURI_INTERNALS__ ? host.__TAURI_INTERNALS__.invoke(command, args) : null; +} + +function message(error: unknown): string { + if (typeof error === "object" && error && "message" in error) return String((error as { message: unknown }).message); + return error instanceof Error ? error.message : String(error); +} + +function label(value: string): string { + return value.replaceAll("_", " ").replace(/\b\w/g, (letter) => letter.toUpperCase()); +} + +function short(value: string, length = 28): string { + return value.length > length ? `${value.slice(0, length)}…` : value; +} + +export default function HarpExportPanel({ onNotice }: { onNotice: (notice: string) => void }) { + const [redactIdentifiers, setRedactIdentifiers] = useState(true); + const [busy, setBusy] = useState(false); + const [result, setResult] = useState(null); + const [verification, setVerification] = useState(null); + const sanitizedArchive = useMemo(() => result?.artifacts.find((artifact) => artifact.role === "sanitized_supporting_archive") ?? null, [result]); + + const create = async () => { + setBusy(true); + try { + const next = await invokeNative("export_harp_artifacts", { request: { redactPersonalIdentifiers: redactIdentifiers } }); + if (!next) { + onNotice("HARP registration exports are available in the installed Thinkloom desktop app."); + return; + } + setResult(next); + setVerification(next.sanitizedVerification); + onNotice(`Created six HARP export artifacts in ${next.exportDirectory}.`); + } catch (error) { + onNotice(`HARP export could not be created: ${message(error)}`); + } finally { + setBusy(false); + } + }; + + const verify = async () => { + if (!sanitizedArchive) return; + setBusy(true); + try { + const next = await invokeNative("verify_harp_sanitized_archive", { archivePath: sanitizedArchive.path }); + if (next) { + setVerification(next); + onNotice(next.status === "verified_selective" ? "Sanitized archive retained evidence and omission disclosures verified." : "Sanitized archive verification failed."); + } + } catch (error) { + onNotice(`Sanitized archive could not be verified: ${message(error)}`); + } finally { + setBusy(false); + } + }; + + return
+
+
Registration + provenance

HARP artifact set

Create separate registration, deposit, sanitized, and private artifacts from the current exact HARP.

+ Native export boundary +
+
+ {[ + ["Registration worksheet", "Suggested, editable application fields"], + ["Human-readable HARP", "Evidence narrative and legal limits"], + ["Machine-readable HARP", "Canonical HARP JSON"], + ["Deposit copy", "Exact digest-bound manuscript"], + ["Sanitized archive", "Selective disclosed evidence"], + ["Full private archive", "Private CPL records and source bodies"], + ].map(([title, detail], index) =>
{index + 1}{title}{detail}
)} +
+
+ +

Private archive warning: the full archive contains private CPL records, ledger metadata, source bodies, and the exact deposit. Review it before sharing.

+
+ + + {result &&
+
{result.artifacts.map((artifact) =>
{label(artifact.role)}{label(artifact.privacyClassification)} · {artifact.byteLength.toLocaleString()} bytes{short(artifact.sha256)}{artifact.path}
)}
+
+
Sanitized omission manifest

Every category is disclosed and hash-bound

The archive is a selective evidence subset. Verification does not claim the omitted private history is present.

+
{result.sanitizedManifest.omission_rules?.map((rule) =>
{label(rule.category)}{label(rule.action)} · {rule.count} affected record{rule.count === 1 ? "" : "s"}{short(rule.disclosure_sha256, 24)}
)}
+
+ {verification &&
+
Retained-evidence verification

{label(verification.status)}

{verification.verificationScopeStatement}

{verification.retainedFileCount} retained files · {verification.omissionDisclosureCount} omission disclosures{verification.archiveSha256}{verification.findings.map((finding) =>

{finding}

)}
+ +
} +
} +
; +} diff --git a/src/ProvenanceWorkspace.tsx b/src/ProvenanceWorkspace.tsx new file mode 100644 index 0000000..b681916 --- /dev/null +++ b/src/ProvenanceWorkspace.tsx @@ -0,0 +1,345 @@ +import { useCallback, useEffect, useMemo, useState } from "react"; +import "./provenance.css"; + +type Classification = "exact" | "degraded" | "stale" | "unverified"; +type EvidenceCategory = "evidence_fact" | "user_declaration" | "derived_classification" | "suggested_application_language" | "legal_determination_not_made"; + +interface NativeFinding { code: string; severity: string; scope: string; message: string } +interface NativeVerification { status: string; event_count: number; record_count: number; findings: NativeFinding[]; chain_head?: { event_id: string; event_sequence: number; event_sha256: string } } +interface ExplorerRecord { record_id: string; record_type: string; path: string; record_sha256: string; subject_ids: string[]; accessible: boolean } +interface ExplorerEvent { event_id: string; event_sequence: number; timestamp: string; event_type: string; actor: string; event_sha256: string; previous_event_sha256: string | null; records: ExplorerRecord[] } +interface MapSegment { + segment_id: string; + segment_sequence: number; + range: { start: number; end: number }; + recorded_origin_kind: string; + actor_identity_status: string; + generation_status: string; + lineage_status: string; + lineage_reference_ids: string[]; + operation_ids: string[]; + transformation_relationships: string[]; + assertion_ids: string[]; + classification_status: Classification; +} +interface MapBoundary { boundary_id: string; status: string; kind: string; start: number; end: number; message: string } +interface ContributionMapProjection { + deposit: { deposit_id: string; deposit_sha256: string; manuscript_revision_id: string; manuscript_revision_sha256: string; cpl_chain_head: string; cpl_event_sequence: number; deposit_path: string }; + contribution_map: { contribution_map_id: string; contribution_map_sha256: string; classification_status: Classification; coverage: { denominator: number; recorded_positions: number; coverage_status: string; denominator_definition: string }; segments: MapSegment[]; structural_locators: Array<{ segment_id: string; chapter: number | null; paragraph: number | null; page: number | null }> }; + assertions: Record[]; + assertion_evaluations: Record[]; + boundaries: MapBoundary[]; +} +interface HarpProjection { harp: Record; report_directory: string; applicability_status: string; stale_reasons: string[]; generated_files: Array<{ role: string; path: string; sha256: string }> } +interface HarpTrace { statement_id: string; harp_path: string; statement: string; category: EvidenceCategory; segment_ids: string[]; assertion_ids: string[]; evaluation_ids: string[]; record_ids: string[]; trace_note: string } +interface ExplorerProjection { verification: NativeVerification; events: ExplorerEvent[]; composition: { revisionId: string; operationCount: number; spans: unknown[] }; contribution_map: ContributionMapProjection | null; harp: HarpProjection | null; harp_statement_traces: HarpTrace[] } +interface AiDisclosure { provider_id: string | null; model_id: string | null; identity_status: "recorded" | "unknown"; included_expression_segment_ids: string[] } +interface LanguageInput { authorCreated: string; materialExcluded: string; newMaterialIncluded: string; noteToCo: string; registrationTreatmentSuggestions: string[] } +interface HarpPreparation { contributionMap: ContributionMapProjection; aiSystemDisclosures: AiDisclosure[]; existingHarp: HarpProjection | null; policyProfile: { policy_profile_id: string; profile_version: string; profile_sha256: string; official_sources: Array<{ retrieved_on: string }> }; suggestedRegistrationLanguage: { author_created: string; material_excluded: string; new_material_included: string; note_to_co: string | null; registration_treatment_suggestions: string[] }; legalScopeStatement: string } + +const wizardSteps = ["Deposit", "Identity", "AI systems", "Classifications", "Boundaries", "Language", "Approve"]; +const categoryLabels: Record = { + evidence_fact: "Evidence fact", + user_declaration: "User declaration", + derived_classification: "Derived classification", + suggested_application_language: "Suggested application language", + legal_determination_not_made: "Legal determination not made", +}; + +async function invokeNative(command: string, args: Record = {}): Promise { + const host = window as unknown as { __TAURI_INTERNALS__?: { invoke: (name: string, payload: Record) => Promise } }; + return host.__TAURI_INTERNALS__ ? host.__TAURI_INTERNALS__.invoke(command, args) : null; +} + +function nativeMessage(error: unknown): string { + if (typeof error === "object" && error && "message" in error) return String((error as { message: unknown }).message); + return error instanceof Error ? error.message : String(error); +} + +function short(value: unknown, length = 22): string { + const text = typeof value === "string" ? value : String(value ?? "unknown"); + return text.length > length ? `${text.slice(0, length)}…` : text; +} + +function displayName(value: string): string { + return value.replaceAll("_", " ").replace(/\b\w/g, (letter) => letter.toUpperCase()); +} + +function StatusBadge({ value }: { value: string }) { + const normalized = value.toLowerCase(); + return {displayName(value)}; +} + +function CategoryBadge({ category }: { category: EvidenceCategory }) { + return {categoryLabels[category]}; +} + +export default function ProvenanceWorkspace({ onNotice }: { onNotice: (message: string) => void }) { + const [mode, setMode] = useState<"explorer" | "wizard">("explorer"); + const [explorer, setExplorer] = useState(null); + const [preparation, setPreparation] = useState(null); + const [loading, setLoading] = useState(true); + const [busy, setBusy] = useState(false); + const [error, setError] = useState(""); + const [selectedEventId, setSelectedEventId] = useState(""); + const [selectedSegmentId, setSelectedSegmentId] = useState(""); + const [selectedTraceId, setSelectedTraceId] = useState(""); + const [step, setStep] = useState(0); + const [declaredName, setDeclaredName] = useState(""); + const [identityStatus, setIdentityStatus] = useState<"self_declared" | "verified" | "unknown">("self_declared"); + const [acceptedBoundaries, setAcceptedBoundaries] = useState>(new Set()); + const [sanitizationProfile, setSanitizationProfile] = useState<"full_private" | "sanitized">("sanitized"); + const [language, setLanguage] = useState({ authorCreated: "", materialExcluded: "", newMaterialIncluded: "", noteToCo: "", registrationTreatmentSuggestions: [] }); + const [approved, setApproved] = useState(false); + + const refresh = useCallback(async () => { + setLoading(true); + setError(""); + try { + const nextExplorer = await invokeNative("load_cpl_explorer"); + if (!nextExplorer) { + setError("The native CPL explorer is available in the installed Thinkloom desktop app."); + return; + } + setExplorer(nextExplorer); + setSelectedEventId((current) => current || nextExplorer.events.at(-1)?.event_id || ""); + setSelectedSegmentId((current) => current || nextExplorer.contribution_map?.contribution_map.segments[0]?.segment_id || ""); + setSelectedTraceId((current) => current || nextExplorer.harp_statement_traces[0]?.statement_id || ""); + if (nextExplorer.contribution_map) { + const nextPreparation = await invokeNative("prepare_harp"); + if (nextPreparation) { + setPreparation(nextPreparation); + setLanguage((current) => current.authorCreated ? current : { + authorCreated: nextPreparation.suggestedRegistrationLanguage.author_created, + materialExcluded: nextPreparation.suggestedRegistrationLanguage.material_excluded, + newMaterialIncluded: nextPreparation.suggestedRegistrationLanguage.new_material_included, + noteToCo: nextPreparation.suggestedRegistrationLanguage.note_to_co ?? "", + registrationTreatmentSuggestions: nextPreparation.suggestedRegistrationLanguage.registration_treatment_suggestions, + }); + } + } else { + setPreparation(null); + } + } catch (cause) { + setError(nativeMessage(cause)); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + const timer = window.setTimeout(() => { void refresh(); }, 0); + return () => window.clearTimeout(timer); + }, [refresh]); + + const selectedEvent = explorer?.events.find((event) => event.event_id === selectedEventId) ?? null; + const map = explorer?.contribution_map ?? preparation?.contributionMap ?? null; + const selectedSegment = map?.contribution_map.segments.find((segment) => segment.segment_id === selectedSegmentId) ?? null; + const selectedAssertions = useMemo(() => map?.assertions.filter((assertion) => selectedSegment?.assertion_ids.includes(String(assertion.assertion_id))) ?? [], [map, selectedSegment]); + const selectedEvaluations = useMemo(() => map?.assertion_evaluations.filter((evaluation) => selectedSegment?.assertion_ids.includes(String(evaluation.assertion_id))) ?? [], [map, selectedSegment]); + const selectedTrace = explorer?.harp_statement_traces.find((trace) => trace.statement_id === selectedTraceId) ?? null; + const blockingBoundaries = map?.boundaries.filter((boundary) => boundary.status !== "exact") ?? []; + const hasStaleBoundary = map?.contribution_map.classification_status === "stale" || blockingBoundaries.some((boundary) => boundary.status === "stale"); + const boundariesAccepted = !hasStaleBoundary && blockingBoundaries.every((boundary) => acceptedBoundaries.has(boundary.boundary_id)); + const identityReady = identityStatus === "unknown" || declaredName.trim().length > 0; + const languageReady = language.authorCreated.length <= 1000 && language.materialExcluded.length <= 1000 && language.newMaterialIncluded.length <= 1000 && language.noteToCo.length <= 2000; + const canAdvance = [Boolean(preparation && !hasStaleBoundary), identityReady, true, true, boundariesAccepted, languageReady, approved][step]; + + const resetApproval = () => setApproved(false); + const updateLanguage = (field: keyof LanguageInput, value: string) => { + setLanguage((current) => ({ ...current, [field]: value })); + resetApproval(); + }; + + const freezeDeposit = async () => { + setBusy(true); + try { + await invokeNative("freeze_contribution_map", { request: { pageScalarCapacity: 1800, selectedByHuman: false, arrangedByHuman: false } }); + setAcceptedBoundaries(new Set()); + setApproved(false); + await refresh(); + onNotice("The current manuscript revision is frozen as the selected HARP deposit."); + } catch (cause) { + onNotice(`Deposit could not be frozen: ${nativeMessage(cause)}`); + } finally { + setBusy(false); + } + }; + + const generateHarp = async () => { + if (!preparation || !approved || !identityReady || !boundariesAccepted || !languageReady) return; + setBusy(true); + try { + const result = await invokeNative("generate_harp", { + request: { + declaredName: identityStatus === "unknown" ? null : declaredName.trim(), + identityStatus, + identityEvidenceReferenceIds: [], + sanitizationProfile, + suggestedRegistrationLanguage: { + authorCreated: language.authorCreated, + materialExcluded: language.materialExcluded, + newMaterialIncluded: language.newMaterialIncluded, + noteToCo: language.noteToCo || null, + registrationTreatmentSuggestions: language.registrationTreatmentSuggestions, + }, + userApproved: true, + }, + }); + if (!result) throw new Error("The native HARP generator did not return a result."); + await refresh(); + setMode("explorer"); + setStep(0); + setApproved(false); + onNotice(`HARP generated in ${result.report_directory}. Open Statement trace to inspect every evidence link.`); + } catch (cause) { + onNotice(`HARP could not be generated: ${nativeMessage(cause)}`); + } finally { + setBusy(false); + } + }; + + if (loading && !explorer) return
Loading native CPL evidence…
; + + return
+
+
HARP + Composition Provenance Ledger

Evidence, declarations, and limits

Inspect the native ledger or prepare an exact-deposit HARP. Thinkloom reports evidence; it does not decide legal authorship or copyrightability.

+
+ + +
+
+ {error &&
{error}
} + {mode === "explorer" ? void refresh()} + /> : { setDeclaredName(value); resetApproval(); }} + identityStatus={identityStatus} + setIdentityStatus={(value) => { setIdentityStatus(value); resetApproval(); }} + acceptedBoundaries={acceptedBoundaries} + setAcceptedBoundaries={setAcceptedBoundaries} + language={language} + updateLanguage={updateLanguage} + sanitizationProfile={sanitizationProfile} + setSanitizationProfile={(value) => { setSanitizationProfile(value); resetApproval(); }} + approved={approved} + setApproved={setApproved} + canAdvance={Boolean(canAdvance)} + hasStaleBoundary={hasStaleBoundary} + busy={busy} + onFreeze={() => void freezeDeposit()} + onGenerate={() => void generateHarp()} + />} +
; +} + +interface ExplorerProps { + explorer: ExplorerProjection | null; + selectedEvent: ExplorerEvent | null; + selectedEventId: string; + setSelectedEventId: (id: string) => void; + selectedSegment: MapSegment | null; + selectedSegmentId: string; + setSelectedSegmentId: (id: string) => void; + selectedAssertions: Record[]; + selectedEvaluations: Record[]; + selectedTrace: HarpTrace | null; + selectedTraceId: string; + setSelectedTraceId: (id: string) => void; + onRefresh: () => void; +} + +function CplExplorer(props: ExplorerProps) { + const { explorer, selectedEvent, selectedEventId, setSelectedEventId, selectedSegment, selectedSegmentId, setSelectedSegmentId, selectedAssertions, selectedEvaluations, selectedTrace, selectedTraceId, setSelectedTraceId, onRefresh } = props; + if (!explorer) return

No native CPL projection

Open a conforming CPL 1.0 project to inspect its evidence.

; + const map = explorer.contribution_map; + const locator = map?.contribution_map.structural_locators.find((item) => item.segment_id === selectedSegmentId); + return
+
+
Native verification status
{explorer.verification.event_count} events · {explorer.verification.record_count} immutable records
{short(explorer.verification.chain_head?.event_sha256, 38)}
+

This status comes from the native CPL verifier. The frontend does not manufacture a “valid” declaration.

{explorer.verification.findings.slice(0, 2).map((finding) => {finding.severity}: {finding.message})}
+ +
+
{(Object.keys(categoryLabels) as EvidenceCategory[]).map((category) => )}
+
+
Composition timeline

Events and underlying records

{explorer.events.length}
{[...explorer.events].reverse().map((event) => )}
+
Expression lineage

Final-text segments

{map && }
{map ?
{map.contribution_map.segments.map((segment) => )}
:

Freeze a deposit to create final-text lineage.

}
+
Selected evidence

{selectedSegment ? `Segment ${selectedSegment.segment_sequence}` : selectedEvent ? `Event ${selectedEvent.event_sequence}` : "Choose an item"}

+ {selectedSegment ? <> +
Recorded origin
{displayName(selectedSegment.recorded_origin_kind)}
Identity status
{displayName(selectedSegment.actor_identity_status)}
Generation
{displayName(selectedSegment.generation_status)}
Lineage
{displayName(selectedSegment.lineage_status)}
Locator
Chapter {locator?.chapter ?? "—"}, paragraph {locator?.paragraph ?? "—"}, page {locator?.page ?? "—"}
Transformations
{selectedSegment.transformation_relationships.map(displayName).join(", ") || "None recorded"}
+ +

Assertions and current evaluations

{selectedAssertions.map((assertion) => { const evaluation = selectedEvaluations.find((item) => item.assertion_id === assertion.assertion_id); return
{displayName(String(assertion.predicate))}{String(assertion.assertion_id)}

Reason: {displayName(String(evaluation?.reason_code ?? assertion.reason_code ?? "unknown"))}

>).map((item) => String(item.dependency_id)) : []} />Evaluation {String(evaluation?.evaluation_id ?? "not recorded")}
})}
+ : selectedEvent ? <>
Event type
{displayName(selectedEvent.event_type)}
Actor
{selectedEvent.actor}
Event digest
{selectedEvent.event_sha256}
Previous digest
{selectedEvent.previous_event_sha256 ?? "Chain root"}

Underlying records

{selectedEvent.records.map((record) =>
{displayName(record.record_type)}
{record.record_id}{record.path}
)}
: null} +
+
+
Evidence boundaries

Exact, degraded, stale, and unverified

{map?.boundaries.length ?? 0}
{map?.boundaries.length ?
{map.boundaries.map((boundary) =>
{displayName(boundary.kind)}

{boundary.message}

Scalar range {boundary.start}–{boundary.end}
)}
:

No non-exact contribution-map boundary is currently recorded.

}
+
HARP statement trace

Statement → assertion → evaluation → record

{explorer.harp && }
{explorer.harp_statement_traces.length ?
{explorer.harp_statement_traces.map((trace) => )}
{selectedTrace &&

{selectedTrace.statement}

{selectedTrace.trace_note}

}
:

No HARP has been generated

Use Prepare HARP to create the first traceable exact-deposit record.

}
+
; +} + +function TraceIds({ title, ids }: { title: string; ids: string[] }) { + return
{title}{ids.length ?
{ids.map((id) => {id})}
: None recorded or not applicable.}
; +} + +interface WizardProps { + preparation: HarpPreparation | null; + map: ContributionMapProjection | null; + step: number; + setStep: (step: number) => void; + declaredName: string; + setDeclaredName: (value: string) => void; + identityStatus: "self_declared" | "verified" | "unknown"; + setIdentityStatus: (value: "self_declared" | "verified" | "unknown") => void; + acceptedBoundaries: Set; + setAcceptedBoundaries: (value: Set) => void; + language: LanguageInput; + updateLanguage: (field: keyof LanguageInput, value: string) => void; + sanitizationProfile: "full_private" | "sanitized"; + setSanitizationProfile: (value: "full_private" | "sanitized") => void; + approved: boolean; + setApproved: (value: boolean) => void; + canAdvance: boolean; + hasStaleBoundary: boolean; + busy: boolean; + onFreeze: () => void; + onGenerate: () => void; +} + +function HarpWizard(props: WizardProps) { + const { preparation, map, step, setStep, declaredName, setDeclaredName, identityStatus, setIdentityStatus, acceptedBoundaries, setAcceptedBoundaries, language, updateLanguage, sanitizationProfile, setSanitizationProfile, approved, setApproved, canAdvance, hasStaleBoundary, busy, onFreeze, onGenerate } = props; + const boundaries = map?.boundaries.filter((boundary) => boundary.status !== "exact") ?? []; + return
+ +
+ {step === 0 && <>
{map ?

Selected frozen deposit

{map.deposit.deposit_id}
Deposit digest
{map.deposit.deposit_sha256}
Manuscript revision
{map.deposit.manuscript_revision_id}
CPL source sequence
{map.deposit.cpl_event_sequence}
Contribution map
{map.contribution_map.contribution_map_id}
{hasStaleBoundary &&
The selected deposit is stale for the active manuscript. Freeze the current revision before continuing.
}
:

No frozen deposit

Freeze the current composition revision to produce its exact deposit and contribution map.

}
} + {step === 1 && <>

The declaration and exact text will be recorded in the HARP approval event.

} + {step === 2 && <>
{preparation?.aiSystemDisclosures.length ?
{preparation.aiSystemDisclosures.map((item, index) =>

{item.provider_id ?? "Unknown provider"}

{item.model_id ?? "Unknown model"}

{item.included_expression_segment_ids.length} included expression segments
)}
:

No accepted AI-output segment in this deposit

The ledger may contain model activity that did not enter the final text; it is not presented as included expression.

}

Provider and model identities come from recorded invocation requests, not frontend inference.

} + {step === 3 && <>
SegmentRecorded originLineageClassification
{map?.contribution_map.segments.map((segment) =>
{segment.segment_sequence}{displayName(segment.recorded_origin_kind)}{displayName(segment.lineage_status)}
)}

{map?.contribution_map.coverage.recorded_positions} of {map?.contribution_map.coverage.denominator} normalized Unicode scalar positions have recorded origin.

Provenance coverage is not a human-authorship score.
} + {step === 4 && <>
{boundaries.length ?
{boundaries.map((boundary) =>
{displayName(boundary.kind)}

{boundary.message}

Scalar range {boundary.start}–{boundary.end}{boundary.status === "stale" ? : }
)}
:

No non-exact boundary requires acceptance

Assertions and evaluations remain available in the CPL explorer.

}
} + {step === 5 && <>