diff --git a/.gitattributes b/.gitattributes
index 383dad5e..06f16634 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -20,5 +20,8 @@ internal/policy/prototype/** -text
# Candidate schemas, provenance, examples and vectors also retain exact bytes.
internal/policy/candidate/** -text
+# Official independently released Policy draft resources retain exact bytes.
+internal/policy/official/** -text
+
# The served authoring schema has a byte digest on every platform.
internal/dialect/version2.schema.json -text
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ace94ff5..516d658e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,42 @@
All notable changes to tagged releases are documented here.
+## 0.37.0 - 2026-10-19
+
+- Adopt the immutable official Policy draft `policy-v1.0.0-draft.1`, Spec commit
+ `0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94`, for existing explicit `1.0.0`
+ CLI/MCP operations (#293, ADR-0061). Retain and verify the complete published
+ archive, HTTPS schema identities, per-file provenance and all 124 corpus rows.
+ The shared Go reader compares exact official results; the unchanged reference
+ reader runs against the retained archive. The release gate verifies its
+ independent manifest pin and inventory. Core pins, schema, numeric/URI behavior
+ and all historical prototype/candidate vendor bytes remain unchanged.
+- **Explicit 1.0.0 report migration:** maturity becomes `draft`; source revision,
+ specification URL, capability exclusions and validation/check scope strings now
+ identify the official draft. Existing `candidateCapabilities` and
+ `candidateResult` names remain. The complete full-check valid result is
+ `{"status":"valid","formatVersion":"1.0.0","maturity":"draft"}`; finite
+ refusal objects and narrower-operation scopes remain. Strict consumers must
+ update their immutable Runtime/Spec pins and exact metadata expectations.
+ Derived editing schemas get release-specific Runtime URNs and a `sourceId`
+ identifying the official HTTPS schema. Default discovery and prototype reports
+ remain byte compatible. Historical candidate reports retain their old pin and
+ proposed maturity; no artifact bytes, approval, Job or live authority migrate.
+
+This requires a minor release under the 0.x policy. Existing command/tool names,
+output/contract versions, exit classes, private 24 MiB material JSON and 16 MiB MCP
+ceilings remain. The host surface stays experimental with false full-document-
+conformance and authority capabilities. Draft support establishes no stable
+maturity or independently authored interoperability; Runtime's conformance claim
+remains solely in `CONFORMANCE.md`. No full Core semantics, evaluation, acquisition,
+publication or governing-authority determination is added.
+The existing Linux/macOS/Windows amd64/arm64 platform targets are unchanged.
+
+Release preparation: required repository CI, the final merged source pin, tagged
+platform archives, checksums, attestations, native smoke and publication checks
+remain release gates. This prepared entry does not assert that those gates have
+completed. The held `v0.35.0` tag/draft remains unchanged.
+
## 0.36.0 - 2026-10-19
This release is cumulative from the last published Runtime, `v0.34.0`. It includes
diff --git a/README.md b/README.md
index c8598bd0..f2efacfa 100644
--- a/README.md
+++ b/README.md
@@ -1081,8 +1081,8 @@ are reported in-band. See ADR-0055.
`jpack experimental policy` implements the **nonnormative** RFC 0023 prototype,
exact version `0.0.2`, for `policy` and `governing-adoption` documents
-([ADR-0059](docs/adr/0059-experimental-offline-policy-tools.md)). RFC 0023 remains
-Draft. This is an experimental authoring aid; its results establish no approval,
+([ADR-0059](docs/adr/0059-experimental-offline-policy-tools.md)). This retained
+prototype is an experimental authoring aid; its results establish no approval,
governing-adoption authority or standard conformance. Discover the exact scope,
limits and pinned source revision with `experimental policy contract --format json`.
No stable Policy format is selected by default.
@@ -1137,61 +1137,94 @@ The RFC, prototype schemas and synthetic fixtures are bundled from specification
revision `8a56a95d555c17640d2db4984363b779536b3c2a`, with per-file digests and
licensing provenance. They are never fetched at runtime.
-### Proposed draft Policy contract candidate
-
-The same experimental commands additionally support the **unadopted,
-proposed-draft** candidate `formatVersion: "1.0.0"`
-([ADR-0060](docs/adr/0060-explicit-policy-candidate-format.md)). It is a review
-candidate for RFC 0023, not a stable format, adopted standard or conformance
-class. Its artifacts are pinned separately to Spec commit
-`0852c5fa7726e51b36e574a5b110e7f5e012e03d` in
-[the candidate provenance manifest](internal/policy/candidate/provenance.json).
-
-Default `contract` output and all prototype reports keep their existing shape
-for strict clients. Explicit discovery returns a separate `registryVersion: "1"`
-report; selecting one contract returns that format's provenance and capabilities:
+### Official Policy draft selection
+
+The same experimental commands explicitly support the independently released
+Policy draft `formatVersion: "1.0.0"`
+([ADR-0061](docs/adr/0061-adopt-official-policy-draft-resources.md)). Resources are
+pinned to `policy-v1.0.0-draft.1`, Spec commit
+`0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94`, in
+[the official provenance manifest](internal/policy/official/provenance.json).
+The full published archive is retained with exact source paths and per-file
+hashes, including the public HTTPS schemas, prose, complete 124-row corpus,
+examples, reference reader and its frozen dependencies. Runtime verifies that
+inventory before schema compilation and in the release gate; it fetches nothing.
+This is draft support through the existing experimental surface. Runtime's
+conformance claim remains solely in [CONFORMANCE.md](CONFORMANCE.md).
+
+Default `contract` output and all prototype reports keep their existing bytes
+and shape for strict clients. Explicit discovery returns a separate
+`registryVersion: "1"` report; selecting one contract returns that format's
+provenance and capabilities:
```bash
jpack experimental policy contract --all-formats --format json
jpack experimental policy contract --format-version 1.0.0 --format json
-jpack experimental policy init --kind policy --format-version 1.0.0 --id urn:example:candidate --version 7.3.42
+jpack experimental policy init --kind policy --format-version 1.0.0 --id urn:example:policy --version 7.3.42
jpack experimental policy schema --kind governing-adoption --format-version 1.0.0
-jpack experimental policy check candidate-adoption.json --materials retained-materials.json --format json
+jpack experimental policy check adoption.json --materials retained-materials.json --format json
```
`--all-formats` and contract `--format-version` are mutually exclusive. Documents
-with `formatVersion` select the candidate grammar explicitly; supported prototype
-inputs continue using their exact wrapper. An optional `--format-version 1.0.0`
-on canonicalize/digest/validate/check also selects candidate refusal handling for
-malformed or selector-less input. It does not insert a missing selector, rewrite
-an artifact or migrate bytes. Candidate Policies use `workspace-managed` or
-`externally-managed`; `desk-managed` is refused. Artifact `version` remains
-independent of the format selector. Candidate adoption requires retained
-candidate Policy bytes; prototype Policies cannot satisfy those references.
-
-Candidate reports identify `formatVersion`, `proposed-draft` maturity, their
-exact source pin and `candidateCapabilities`. Only a full candidate `check`
-includes `candidateResult`, whose complete value is one of:
+with `formatVersion` select the draft grammar explicitly; supported prototype
+inputs continue using their exact wrapper. Optional `--format-version 1.0.0` on
+canonicalize/digest/validate/check also selects draft refusal handling for
+malformed or selector-less input. The document must still carry its exact
+selector. No tool inserts it, migrates bytes or changes a Job or approval.
+Draft Policies use `workspace-managed` or `externally-managed`; `desk-managed` is
+refused. Artifact `version` remains independent of the format selector. Draft
+adoptions require retained 1.0.0 Policy bytes; prototype Policies cannot satisfy
+those references.
+
+Explicit 1.0.0 reports identify `profile: "jps-policy-companion"`,
+`profileVersion` and `formatVersion: "1.0.0"`, `maturity: "draft"`, the immutable
+source commit and its `spec/policy.md` URL. The existing `candidateCapabilities`
+member now contains the exact official draft capability artifact. Only a full
+`check` includes `candidateResult`, whose complete value is one of:
```json
-{"status":"valid","formatVersion":"1.0.0","maturity":"proposed-draft"}
+{"status":"valid","formatVersion":"1.0.0","maturity":"draft"}
{"status":"refused","code":"invalid-selector"}
```
The finite refusal codes and phase ordering are defined by the
-[pinned candidate contract](internal/policy/candidate/README.md#5-resource-limits-and-refusal-classifications).
+[pinned draft contract](internal/policy/official/spec/policy.md#5-resource-limits-and-refusal-classifications).
Runtime retains exit 0 for success, 1 for invalid content and 2 for unsupported
-input; the nested result supplies the portable candidate classification.
-Environment failures are operational errors and provide no candidate result.
-Canonicalize/digest establish encoding and identity only; validate checks closed
-document forms and local references, with retained materials unchecked. Their
-reports omit `candidateResult`.
-
-The Go harness compares all 124 exact portable result objects, acquiring vector
-sources lazily and preserving raw Pack numbers and every retained-byte identity.
-It uses the shared registration/checking engine directly: valid distinct-byte
-bundles can exceed the private 24 MiB JSON/base64 carrier or MCP's 16 MiB request
-limit, especially when identical bytes are registered under multiple media
-types. Those transport ceilings are unchanged. Agreement with these vectors
-supplies no independently authored implementation evidence, approval, current
-authority or permission.
+input; the nested result supplies the portable classification. Environment
+failures supply no portable result. Canonicalize/digest establish encoding and
+identity only; validate checks document forms and local references and leaves
+retained materials unchecked. These narrower reports omit `candidateResult`.
+The scopes are `closed-draft-document-and-local-references` for validate and
+`draft-supplied-exact-bytes-anchors-and-scoped-core-references` for check.
+`experimental` stays true and `fullDocumentConformance`, approval, execution,
+live-authority and network-acquisition capabilities stay false. Full Core
+semantics and evaluation remain outside these checks.
+
+**Migration from Runtime v0.36.0:** explicit 1.0.0 report metadata changes from
+`proposed-draft` to `draft`, with a new source pin, URL, capability exclusions and
+scope strings. Strict report consumers must deliberately update their Runtime
+and Spec pins and expected metadata. The report member names, output/contract
+versions, refusal codes and exact Policy/adoption grammar remain unchanged.
+Candidate reports retained from the old Runtime keep their original source and
+maturity; they are historical evidence, never relabeled. The old
+[candidate vendor tree](internal/policy/candidate/provenance.json) and prototype
+bytes remain frozen. Promotion changes no Policy/adoption, Pack, source,
+narrative or review-basis bytes. Prototype migration requires the separate
+[explicit migration](internal/policy/official/conformance/policy/1.0.0/MIGRATION.md),
+new immutable identities and dependent review; nothing migrates implicitly.
+
+Draft schema reports return self-contained Runtime editing copies with a new
+release-specific URN `$id`; `resource.sourceId` names the original immutable
+`https://judgmentpack.org/schema/policy/1.0.0/{kind}.schema.json` resource. The
+editing copy is not served under the upstream ID. Raw upstream resource bytes
+and hashes remain in the official vendor tree.
+
+The Go harness compares all 124 official portable result objects, acquiring
+vector sources lazily and preserving raw Pack numbers and retained-byte
+identities. The unchanged reference reader runs against the same retained
+archive. Portable tests use the shared raw registration/checking engine:
+distinct-byte bundles can exceed the private 24 MiB JSON/base64 carrier or MCP's
+16 MiB request limit, especially with repeated bytes under multiple media types.
+These ceilings remain unchanged. Agreement is same-vendor implementation
+evidence and establishes no stable maturity, independently authored
+interoperability, approval, current authority or permission.
diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES
index 650a00d0..d4ff1a6d 100644
--- a/THIRD_PARTY_NOTICES
+++ b/THIRD_PARTY_NOTICES
@@ -22,6 +22,17 @@ the Apache License, Version 2.0; a copy is in the accompanying LICENSE file, and
the required attribution is in NOTICE. The exact upstream revision and per-file
SHA-256 digests are recorded in the bundled lock.json.
+The same Apache-2.0 attribution covers pinned Policy material under
+internal/policy/prototype/, internal/policy/candidate/ and internal/policy/official/.
+The prototype and historical proposed candidate retain their original source
+bytes and provenance. The official directory embeds the complete immutable
+policy-v1.0.0-draft.1 source archive at Spec commit
+0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94, including schemas, prose, corpus,
+examples, reference Python reader and source dependencies. Its LICENSE and NOTICE
+are retained verbatim; provenance.json records the archive and per-file SHA-256
+digests and lengths. These Python sources are retained artifacts, not additional
+runtime dependencies.
+
Apache License 2.0 components (Go modules)
------------------------------------------
diff --git a/docs/adr/0061-adopt-official-policy-draft-resources.md b/docs/adr/0061-adopt-official-policy-draft-resources.md
new file mode 100644
index 00000000..86fc49b4
--- /dev/null
+++ b/docs/adr/0061-adopt-official-policy-draft-resources.md
@@ -0,0 +1,126 @@
+---
+status: accepted
+date: 2026-10-19
+deciders: maintainer
+---
+
+# Adopt immutable official Policy draft resources in the shared offline reader
+
+## Context and problem statement
+
+The independent Spec release `policy-v1.0.0-draft.1` publishes the bounded Policy
+draft at exact document format `1.0.0`. Runtime v0.36.0 already reads the identical
+proposed grammar, but pins historical candidate schemas and reports proposed
+maturity. New checks need an explicit immutable official source without changing
+retained artifact identities, prototype defaults or host authority.
+
+## Decision drivers
+
+- Pin the actual published archive, HTTPS schemas, prose and complete 124-row corpus.
+- Reuse the existing bounded reader and its original-byte, typed Pack and URI checks.
+- Keep prototype reports byte compatible and historical candidate evidence identifiable.
+- Make observable report/schema metadata changes explicit to strict consumers.
+- Leave migration, approvals, Jobs, providers and current authority to their owners.
+
+## Considered options
+
+- Leave explicit 1.0.0 operations pinned to the unadopted candidate.
+- Add a second engine or host authority/profile selection layer for identical grammar.
+- Repin explicit 1.0.0 operations to the official draft and retain historical resources.
+
+## Decision outcome
+
+Chosen option: repin existing explicit 1.0.0 operations to official draft resources.
+The complete 387-file published archive is retained under `internal/policy/official`
+with original source paths. Its provenance manifest records release/tag
+`policy-v1.0.0-draft.1`, source commit
+`0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94`, archive SHA-256 and per-file hashes and
+lengths. An independent manifest digest and complete inventory verification guard
+schema compilation and the Runtime release check. The original Spec reader and
+dependencies remain unchanged and runnable against that archive. No mutable source
+is fetched. The old candidate and prototype vendor trees and provenance stay frozen.
+
+This partially supersedes ADR-0060's determination of the source/maturity for new
+explicit 1.0.0 operations. Its dispatch, byte-preservation, URI, transport and
+authority boundaries remain in force. Default contract discovery, prototype
+reports and `0.0.2` operations retain their exact prior behavior. The all-formats
+registry still has version `1` and contains prototype and official draft entries;
+there is no separate current candidate selector for the same grammar.
+
+Explicit 1.0.0 reports keep `outputVersion: "2"`, `contractVersion: "1"`,
+`profile: "jps-policy-companion"`, `profileVersion`/`formatVersion: "1.0.0"` and the
+existing `candidateCapabilities` and `candidateResult` names. Source revision and
+URL now identify the immutable official `spec/policy.md`; maturity becomes `draft`.
+`candidateCapabilities` is the exact released capability artifact. Validate's scope
+is `closed-draft-document-and-local-references`; check's scope is
+`draft-supplied-exact-bytes-anchors-and-scoped-core-references`.
+
+Only full retained-material checks emit the complete portable result:
+`{"status":"valid","formatVersion":"1.0.0","maturity":"draft"}` or the existing
+finite refusal object. Narrow encoding/local validation and environmental failures
+emit no full-check result. `experimental` remains true because these are the
+existing experimental host tools; `fullDocumentConformance`, approval, execution,
+live-authority and network-acquisition capabilities stay false. Full Core semantics
+and evaluation are outside these checks. No stable or independently authored
+interoperability claim is made. The Runtime conformance claim remains solely in
+`CONFORMANCE.md`.
+
+The official raw schemas retain their exact HTTPS `$id` values and bytes. Schema
+operations return the existing self-contained editing form under a new derived ID:
+`urn:judgmentpack:runtime:experimental-policy:policy-v1.0.0-draft.1:{kind}:authoring-schema:1`.
+Its `resource.sourceId` names the immutable official schema. The changed copy is
+never labeled with the upstream HTTPS identity or the historical candidate editing
+URN. Prototype derived schema identities and report fields stay unchanged.
+
+The 0.x minor release documents this intentional change to explicit 1.0.0 metadata.
+Strict consumers must update their immutable Runtime/Spec pins and exact report
+expectations. Report member names and finite results retain the existing protocol
+shape, so the global output version does not change. Historical candidate reports
+keep their original pin and proposed maturity; they are never relabeled. Promotion
+changes no Policy/adoption, Pack, source, narrative or review-basis bytes. Prototype
+migration requires separate explicit artifact creation, immutable identities and
+dependent snapshot review under the released migration guide. No approval, Job,
+permission or host lifecycle migrates.
+
+### Consequences
+
+- New explicit draft checks share the complete official corpus and immutable provenance.
+- Strict explicit 1.0.0 consumers must update metadata pins before accepting new reports.
+- The same shared engine preserves raw Core numbers, URI semantics and private wire limits.
+- Revisit when a new exact format or host contract changes the supported boundary.
+
+## Material decision and review
+
+Material-decision impact categories: `public-surface`, `documented-claim`,
+`conformance`, `security`, `dependency`. Official metadata and editing resource
+identity change the public surface; immutable artifact integrity adds a release
+gate. The published draft grammar and finite result ordering are reused, including
+the existing input bounds and original-byte Core checks.
+
+The maintainer's standing temporary different-vendor-review waiver applies to this
+bounded Policy adoption. A separate OpenAI/Codex reviewer, using its actual reused
+`gpt-6.1-sol` selection at `xhigh`, completed an independent bounded review on
+2026-10-19 of commit `7c59c614851c1eb24bb91d316e0129d0e6a7a0c2`, tree
+`b00e7610c1874fc04ac08e9633c77039ea9c06e2`. The reviewer found no actionable P1/P2
+correctness, security, compatibility or false-claim issues and requested no source
+fix. No finding required a maintainer disposition. The complete review record,
+whose SHA-256 is
+`e39bfcada9d0722e7e9d4b7ec18db42f92ab5fa4331e727f29e3751b681e87ea`,
+will be posted on the introducing material pull request before merge, together
+with verification of this procedural completion.
+
+This is independent-agent **same-vendor** review under the authorized waiver;
+it is neither different-vendor review nor independently authored implementation
+evidence. The waiver changes no standing repository rule. This accepted status
+records the maintainer-authorized merge-ready procedural transition. The decision
+takes effect only after required CI passes and the introducing pull request merges;
+this record asserts no completed merge or Runtime release.
+
+## More information
+
+- [Original candidate decision](0060-explicit-policy-candidate-format.md)
+- [Official source provenance](../../internal/policy/official/provenance.json)
+- [Promotion identity map](../../internal/policy/official/conformance/policy/1.0.0/PROMOTION.md)
+- [Explicit prototype migration](../../internal/policy/official/conformance/policy/1.0.0/MIGRATION.md)
+- [CLI documentation](../../README.md#official-policy-draft-selection)
+- [MCP documentation](../mcp-clients.md#explicit-official-draft-selection)
diff --git a/docs/adr/README.md b/docs/adr/README.md
index bb15b928..ce7c8016 100644
--- a/docs/adr/README.md
+++ b/docs/adr/README.md
@@ -155,4 +155,5 @@ authority, and following it confers no conformance status on anything.
| [0056](0056-version-3-dialect-authoring.md) | Check supported version-3 Dialect declarations through shared authoring tools | accepted |
| [0057](0057-named-dialect-artifact-identity.md) | Share offline tools for named Dialect artifacts | accepted |
| [0059](0059-experimental-offline-policy-tools.md) | Prototype Policy document and retained-reference checks offline | accepted |
-| [0060](0060-explicit-policy-candidate-format.md) | Add an explicit Policy contract candidate without changing prototype clients | accepted |
+| [0060](0060-explicit-policy-candidate-format.md) | Add an explicit Policy contract candidate without changing prototype clients | accepted; source/maturity for new explicit 1.0.0 operations superseded by [0061](0061-adopt-official-policy-draft-resources.md) |
+| [0061](0061-adopt-official-policy-draft-resources.md) | Adopt immutable official Policy draft resources in the shared offline reader | accepted; effective upon required CI and introducing PR merge |
diff --git a/docs/architecture.md b/docs/architecture.md
index 3ed6758a..166a78d6 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -48,25 +48,37 @@ number domain. Source/schema/example provenance pins specification revision
resource is fetched at runtime. The shared 16 MiB stdio line bound is unchanged,
so JSON/base64 overhead reduces the maximum retained material a call can carry.
-The proposed-draft, unadopted Policy contract candidate `1.0.0` is an additional
-explicit format ([ADR-0060](adr/0060-explicit-policy-candidate-format.md)). Its
-schemas, prose, examples and 124 portable vectors are pinned separately to Spec
-commit `0852c5fa7726e51b36e574a5b110e7f5e012e03d`. Format selection, schema and
-provenance differ; material identity, UTF-8 anchors and typed Pack coverage use
-the same engine. Candidate adoption cannot consume prototype Policy bytes.
-No-argument contract discovery and prototype reports retain their exact prior
-shape for strict clients. All-format discovery requires explicit CLI
-`--all-formats` or MCP `allFormats:true` and returns registry version 1.
-
-Candidate full checks return a bounded `candidateResult` with exactly the
-portable status/code object, separate from Runtime diagnostics and exit status.
+Explicit format `1.0.0` selects the official draft resources of
+`policy-v1.0.0-draft.1`, pinned to Spec commit
+`0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94`
+([ADR-0061](adr/0061-adopt-official-policy-draft-resources.md)). The complete
+published archive, original source paths and per-file provenance live under
+`internal/policy/official`; the independent manifest pin and every file are
+verified before schema compilation and by the release gate. The HTTPS source
+schema identities stay distinct from derived release-specific Runtime editing
+URNs, exposed alongside `resource.sourceId`. The same offline engine handles the
+unchanged 1.0.0 grammar, material identity, anchors and typed Pack coverage.
+The archived proposed candidate and prototype trees retain their exact bytes and
+original metadata. Prototype defaults and reports remain byte compatible;
+all-format discovery still requires explicit CLI `--all-formats` or MCP
+`allFormats:true` and returns registry version 1.
+
+Explicit 1.0.0 reports now carry official source provenance and `draft` maturity,
+retaining `candidateCapabilities` and `candidateResult` member names. Only full
+checks return the exact portable valid/refusal object. Encoding/local validation
+retain their narrower scopes. The promotion deliberately changes 1.0.0 metadata,
+capability exclusions, scope strings and derived editing schema identity; strict
+clients must update their pins. It rewrites no artifact or historical report and
+migrates no approval, Job or host authority. The experimental surface and false
+full-document-conformance/authority flags remain unchanged.
+
Root physical bounds, strict JSON, selection and canonical numeric domain precede
ordered registration; root schema and semantic checks follow registration.
Portable tests defer source acquisition to its phase and use shared raw
registration directly. Duplicate media registrations count bytes once but may
-repeat base64 on the wire, so candidate agreement never widens the private
-24 MiB material JSON or 16 MiB MCP ceiling. No candidate result establishes
-current authority, permission, publication, review trust or independent agreement.
+repeat base64 on the wire; agreement never widens the private 24 MiB material
+JSON or 16 MiB MCP ceiling. No draft result establishes current authority,
+permission, publication, review trust, stable conformance or independent agreement.
## Artifact version arithmetic
@@ -153,7 +165,7 @@ claim — see [`CONFORMANCE.md`](../CONFORMANCE.md).
- `internal/audit` composes and appends the opt-in evaluation records of ADR-0018: one JSON line per completed non-rehearsal evaluation (ADR-0028) — for a non-rehearsal graph evaluation, one per node and one for the composite (ADR-0041) — carrying the pack's identity and the digest of its exact bytes, the facts and evidence documents as they reached the engine, and the disposition as the canonical bytes the run produced rather than a re-serialization of them. It is reached only from a configuration that declared an audit directory, only after the evaluator has returned a result, and only from the three deciding surfaces — the test verbs run the same evaluator and record nothing, and a declared rehearsal records nothing either (ADR-0028). It evaluates nothing, changes no payload, and cannot influence a disposition; it does read a clock, which nothing on the payload path does. A record may carry `cites` (ADR-0033): the gateway receipts the caller said the decision relied on, in the gateway's own `{sessionId, callIndex, signature}` shape, held to that shape and otherwise recorded as given — the runtime verifies no receipt and reads no store. A record of `experimental evaluate` or the MCP `experimental_evaluate` tool may also carry `binding` (ADR-0050): a caller's `{kind, digest}` commitment to material of its own, held to that shape (`audit.ParseBinding`, which `audit.Verify` applies to a recorded one, reporting `binding-malformed`) and otherwise recorded as given — the runtime never interprets, verifies or recomputes it. The trail is chained unless the configuration says `chain: false` (ADR-0047 §1): each record carries `trail`, `sequence` and `previous`, the SHA-256 of the exact bytes of the line before it, assigned while the writer holds an exclusive lock on the trail file that `internal/fssecure` takes (`Root.AppendLocked`); nothing read from the trail is re-encoded. `audit.Verify` checks a trail by the same rules, over its exact bytes, from a snapshot whose size `fssecure.SizeBetweenWrites` reads under the lock, shared; `Writer.Repair` appends a discontinuity record after a torn last line and rewrites nothing; and the `jpack audit` commands in `internal/cli` drive them. The same reading lists the checkpoint of every chained record after a sequence, for a deliverer to hand to a holder, and holds a trail to the checkpoints a holder kept, reporting the records none covers as unwitnessed (ADR-0047 §2a); no hand-over is recorded or waited for. A writer given a signing key (`Writer.SignWith`, the key the project's `audit.signingKey` or `JPACK_SIGNING_KEY` names, loaded by `audit.LoadSigner`, which walks the key's path a directory at a time with each held open, refuses a symbolic link anywhere in it and the project's directory by identity, holds the key to its owner alone, and, when `audit.signingPublicKey` or `JPACK_SIGNING_PUBLIC_KEY` names the public key it is expected to have, refuses a seed whose public key is another; on a platform without unix ownership and modes, Windows among them, every key is refused) signs each chained record it appends in the `signatures.jsonl` sidecar beside the trail (ADR-0047 §2b): the signing runs in the step `fssecure.Root.AppendLockedThen` takes after the trail's write and syncs and before the lock is released, so the sidecar follows the trail line for line, and a signature that cannot be written leaves the record unsigned, never the decision failed. `Writer.Rotate` hands signing to a next key with a line the current key signs. `audit.Verify` reads the sidecar in step with the trail, a line at a time, when the verifier supplies public keys, from sizes `fssecure.SizesBetweenWrites` reads under the one shared lock. `jpack audit stamp` asks an RFC 3161 authority to stamp the current checkpoint's digest, through `internal/timestamp` (the request, the HTTP transport and the token's parsing and verification, on `encoding/asn1` and `crypto/x509` alone), and keeps the token with `Writer.RecordStamp` in `stamps.jsonl` under that file's own lock; nothing on the decision path reaches it (ADR-0047 §2a). `audit.Verify` checks those tokens against the verifier's roots before the trail is read, matches their checkpoints against it as it is read, and reports the lag between each covered record's `at` and its first stamp. None of them is an MCP tool.
- `internal/lock` implements the reviewed-set lock (ADR-0019): a generated, deterministic sibling of `jpack.json` pinning the digest of the configuration's exact bytes and of every declared pack and graph — not a declared matrix or rows document, which no deciding surface applies. Its presence is the whole of the opt-in — no configVersion moves and the configuration schema does not name it, because a configuration that named its own lock could rename it. `packs lock` writes it, `packs verify` names every difference from it, and the three deciding surfaces hold the law one evaluation applies to it before evaluating — a declared rehearsal excepted (ADR-0028); the rehearsal verbs consult it never. It decides nothing about whether a change was right: an amendment and a tampering are the same act to a runtime, and it is not a wall against an editor that re-locks.
- `internal/compare` evaluates one set of inputs, a matrix admitted under its own rules whose expectations play no part, or a `packs suggest` candidates document, under two versions of a pack through `internal/evaluation` unchanged, and reports the inputs whose §8.3 canonical dispositions, handoff targets or refusals differ (ADR-0045). It opens no project, so it records nothing and consults no lock, and a difference it reports is not an expectation.
-- `internal/policy` owns the experimental offline Policy prototype document and supplied-material checks of ADR-0059; it performs no evaluation or source acquisition.
+- `internal/policy` owns the experimental offline Policy prototype and official draft document and supplied-material checks of ADR-0059 and ADR-0061; it performs no evaluation or source acquisition.
- `internal/cli` owns commands, streams, and human/JSON rendering.
- `internal/mcp` adapts the offline core onto Model Context Protocol tools over stdio.
- `tools/sync-spec-artifacts` is an explicit maintainer-only snapshot importer.
diff --git a/docs/mcp-clients.md b/docs/mcp-clients.md
index 4095a581..68cf43f9 100644
--- a/docs/mcp-clients.md
+++ b/docs/mcp-clients.md
@@ -53,7 +53,7 @@ gitignored in this repository. Copy a snippet, don't commit one.
| `describe_runtime` | Versions and artifact provenance |
| `list_examples` / `get_example` | The embedded valid fixtures, read-only; `spec_version` chooses the bundled version, and the evaluator admits `0.2.0-draft` |
| `list_packs` / `get_pack` | This project's own packs, by decision id, through its `jpack.json` |
-| `experimental_get_policy_contract` / `experimental_policy_init` / `experimental_get_policy_schema` | EXPERIMENTAL: exact nonnormative Policy prototype capabilities, starter templates and schemas; no project reads or writes |
+| `experimental_get_policy_contract` / `experimental_policy_init` / `experimental_get_policy_schema` | EXPERIMENTAL: exact Policy prototype or explicitly selected official draft capabilities, starter templates and schemas; no project reads or writes |
| `experimental_policy_canonicalize` / `experimental_policy_digest` / `experimental_policy_validate` / `experimental_policy_check` | EXPERIMENTAL: supplied Policy document identity, local checks and retained-material reference checks; no evaluation or authority |
| `experimental_evaluate` | EXPERIMENTAL SURFACE (ADR-0007): the §§7–8 resolution model; claim and scope in [`CONFORMANCE.md`](../CONFORMANCE.md) |
| `experimental_get_test_matrix_contract` | EXPERIMENTAL: discover the project matrix version, closed members, types and authoring rules without reading a project |
@@ -446,8 +446,7 @@ caller. Clients discover the capability through `tools/list`. CLI equivalent:
Discover `experimental_get_policy_contract` before using this additive offline
surface ([ADR-0059](adr/0059-experimental-offline-policy-tools.md)). All seven
-tools serve the exact nonnormative RFC 0023 prototype `0.0.2`; the RFC remains
-Draft. No stable Policy format is implied. Schema resources are self-contained
+tools retain the exact nonnormative RFC 0023 prototype `0.0.2`. No stable Policy format is implied. Schema resources are self-contained
Runtime editing copies derived from pinned prototype schemas. Reports carry
experimental status,
pinned provenance, capability scope and diagnostics shared with the CLI.
@@ -463,7 +462,8 @@ pinned provenance, capability scope and diagnostics shared with the CLI.
| `experimental_policy_check` | `document` and `materials`, exact JSON text strings |
`kind` is exactly `policy` or `governing-adoption`; `formatVersion` is exactly
-`0.0.2`. The explicit artifact `id` and `version` are separate from that format.
+`0.0.2` for prototype use, or `1.0.0` for explicit official draft selection below.
+The explicit artifact `id` and `version` are separate from that format.
Unknown members, duplicate members, wrong case, missing required arguments and
null argument values are refused. Malformed or missing arguments are tool errors. Well-typed unsupported selectors,
invalid artifact identities, and invalid document or retained-material content
@@ -500,41 +500,57 @@ RPC framing consume more space. Consequently, not every bundle under the 16 MiB
retained-byte limit fits a single MCP request. A client must bound the complete
encoded request; CLI named-file input supports the larger material JSON envelope.
-### Explicit proposed-draft candidate selection
+### Explicit official draft selection
-The seven existing tools also serve the unadopted Policy contract candidate
-`1.0.0`, at `proposed-draft` maturity, pinned to Spec commit
-`0852c5fa7726e51b36e574a5b110e7f5e012e03d`
-([ADR-0060](adr/0060-explicit-policy-candidate-format.md)). Calling contract
+The seven existing tools also serve official Policy draft format `1.0.0`, pinned
+to `policy-v1.0.0-draft.1` at Spec commit
+`0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94`
+([ADR-0061](adr/0061-adopt-official-policy-draft-resources.md)). Calling contract
without arguments or with `{}` returns the exact existing prototype report.
-`{allFormats:true}` explicitly requests the separate registry version 1;
-`{formatVersion:"1.0.0"}` selects the candidate contract. These two arguments
-are mutually exclusive. `{formatVersion:"0.0.2"}` selects the prototype contract.
-
-Init/schema require the exact selected `formatVersion` as before. Document tools
-accept an optional `formatVersion` string for explicit dispatch, including
-candidate classification of malformed or selector-less bytes. The document
-still must carry its own exact selector; no tool inserts or rewrites it.
-Without an operation selector, a document carrying `formatVersion` dispatches
-to the candidate; existing prototype documents retain their behavior. Candidate
-Policies use `workspace-managed` or `externally-managed`, never an alias of the
-prototype's `desk-managed`. Candidate adoption requires candidate Policy bytes.
-
-Candidate reports include their own `formatVersion`, source provenance, maturity
-and exact `candidateCapabilities` artifact. Only full candidate checks add
-`candidateResult`, exactly the portable valid object
-`{status:"valid",formatVersion:"1.0.0",maturity:"proposed-draft"}` or refusal
-`{status:"refused",code:"…"}`. Their bounded finite codes follow the
-[pinned candidate contract](../internal/policy/candidate/README.md#5-resource-limits-and-refusal-classifications).
-Encoding/local validation omit that field; operational failures supply no
-candidate result. MCP sets `isError:true` on refusals. Neither result format
-asserts current authority, permission, trusted review or standard conformance.
-
-Candidate physical bounds and strict JSON parsing precede selector/canonical
-checks, then ordered registration precedes document schema and reference checks.
-Retained artifact byte pins are checked before parsing and optional canonical
-identity. Pack bytes go unchanged to Core structural validation. The private
-material carrier and the 16 MiB stdio request ceiling remain unchanged; duplicate
-base64 registrations can exceed a transport ceiling even when their distinct
-retained bytes fit the candidate. Passing portable raw-input vectors therefore
-promises no larger encoded envelope or independent interoperability evidence.
+`{allFormats:true}` explicitly requests registry version 1;
+`{formatVersion:"1.0.0"}` selects the official draft contract. The selectors are
+mutually exclusive. `{formatVersion:"0.0.2"}` selects the prototype contract.
+
+Init/schema require the exact selected `formatVersion`. Document tools accept
+an optional `formatVersion` string for explicit dispatch, including draft
+classification of malformed or selector-less bytes. The document must still carry
+its own selector; no tool inserts or rewrites it. Without an operation selector,
+a strict document carrying `formatVersion` dispatches to the draft. Draft Policies
+use `workspace-managed` or `externally-managed`, never the prototype's
+`desk-managed`. Draft adoption requires retained 1.0.0 Policy bytes.
+
+Explicit draft reports carry `profile:"jps-policy-companion"`,
+`profileVersion`/`formatVersion:"1.0.0"`, `maturity:"draft"`, the exact new
+`specRevision` and its immutable `spec/policy.md` URL. The existing
+`candidateCapabilities` member is the exact official artifact. Only full checks
+add `candidateResult`, exactly `{status:"valid",formatVersion:"1.0.0",maturity:"draft"}`
+or `{status:"refused",code:"…"}`. Finite codes follow the
+[pinned draft contract](../internal/policy/official/spec/policy.md#5-resource-limits-and-refusal-classifications).
+Encoding/local validation omit that result; operational failures supply none.
+MCP sets `isError:true` on refusals. Validate's scope is
+`closed-draft-document-and-local-references`; check's scope is
+`draft-supplied-exact-bytes-anchors-and-scoped-core-references`.
+`experimental` remains true, and `fullDocumentConformance`, approval, execution,
+live-authority and network-acquisition capabilities remain false.
+
+Strict v0.36.0 consumers must explicitly update their Runtime/Spec pins and exact
+metadata expectations: maturity, provenance URL/commit, capability exclusions,
+scope strings and the derived editing schema ID change. Existing member names,
+`outputVersion:"2"`, `contractVersion:"1"`, refusal codes and document grammar
+stay unchanged. `resource.sourceId` identifies the immutable official HTTPS schema;
+the self-contained editing copy has a separate Runtime URN containing the release
+tag. The complete published archive and manifest are retained under
+`internal/policy/official`. Historical candidate reports and vendor bytes keep
+their original proposed maturity and provenance. No Policy/adoption/retained bytes,
+approvals, Jobs or host authority migrate automatically.
+
+Draft physical bounds and strict JSON parsing precede selector/canonical checks,
+then ordered registration precedes document schema and reference checks. Retained
+artifact byte pins precede parsing and optional canonical identity. Pack bytes go
+unchanged to Core structural validation. The private material carrier and the
+16 MiB stdio request ceiling remain unchanged; repeated base64 registrations can
+exceed a transport ceiling while their distinct retained bytes fit the draft.
+The Go reader's agreement with all 124 exact official results and the retained
+reference reader supplies same-vendor evidence. It establishes no stable maturity,
+independently authored interoperability, current authority, permission or trusted
+review. Runtime's conformance claim remains solely in [CONFORMANCE.md](../CONFORMANCE.md).
diff --git a/docs/releasing.md b/docs/releasing.md
index 221f5744..64a523a2 100644
--- a/docs/releasing.md
+++ b/docs/releasing.md
@@ -46,6 +46,16 @@ expected bundle digest. Review one lock per bundled version: the release gate ch
only the version a surface selects by default. Update the embedded registry only when adding a new
specification version.
+Policy draft resources are independently pinned under `internal/policy/official/`,
+with the complete `policy-v1.0.0-draft.1` archive's original source paths. Its
+provenance records the immutable release/tag, exact Spec commit, archive digest and
+per-file bytes. `tools/check-release` also verifies the independent Policy manifest
+pin and full embedded inventory. Updating these resources requires an explicit
+reviewed artifact change and appropriate CLI version increment; it never rewrites
+the retained prototype or historical candidate trees or the Core locks. Policy
+source schema IDs stay distinct from derived Runtime editing schema IDs. See
+[ADR-0061](adr/0061-adopt-official-policy-draft-resources.md) for compatibility.
+
## Validate locally
Install the exact GoReleaser version used by the workflow, then run:
diff --git a/internal/cli/policy.go b/internal/cli/policy.go
index 6976763a..f0be5a09 100644
--- a/internal/cli/policy.go
+++ b/internal/cli/policy.go
@@ -13,8 +13,8 @@ import (
func (a *App) policyCommand() *cobra.Command {
group := &cobra.Command{
- Use: "policy", Short: "EXPERIMENTAL: offline Policy prototype and proposed-draft candidate tools",
- Long: "Offline tools for the nonnormative RFC 0023 Policy prototype 0.0.2 and unadopted proposed-draft candidate 1.0.0. Discover candidates explicitly with contract --all-formats; no-argument contract retains the prototype contract. Validate checks document forms and local references. Check also checks the exact supplied retained-material closure and specific Core references; it does not perform full Core semantic validation or evaluate anything. No approval, governing-adoption authority, publication, billing or source access is established. This experimental surface may change without compatibility promise.",
+ Use: "policy", Short: "EXPERIMENTAL: offline Policy prototype and official draft tools",
+ Long: "Offline tools for the nonnormative RFC 0023 Policy prototype 0.0.2 and independently released Policy draft 1.0.0. Discover formats explicitly with contract --all-formats; no-argument contract retains the prototype contract. Validate checks document forms and local references. Check also checks the exact supplied retained-material closure and specific Core references; it does not perform full Core semantic validation or evaluate anything. No approval, governing-adoption authority, publication, billing or source access is established. This experimental surface may change without compatibility promise.",
Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { return cmd.Help() },
}
for _, operation := range []string{"contract", "init", "schema", "canonicalize", "digest", "validate", "check"} {
@@ -32,7 +32,7 @@ func (a *App) policyOperation(operation string) *cobra.Command {
args = cobra.ExactArgs(1)
}
descriptions := map[string]string{
- "contract": "Describe capabilities and pinned provenance; opt into candidate discovery explicitly",
+ "contract": "Describe capabilities and pinned provenance; select the official draft explicitly",
"init": "Print a starter template; missing retained materials remain unchecked",
"schema": "Print the schema for an explicitly selected Policy kind and format",
"canonicalize": "Print canonical document bytes; encoding success is not validation",
@@ -78,7 +78,7 @@ func (a *App) policyOperation(operation string) *cobra.Command {
case "schema":
report, code = policy.Schema(command, kind, profileVersion)
default:
- data, err := a.readInput(operands[0], policy.MaxDocumentBytes, "Policy prototype document")
+ data, err := a.readInput(operands[0], policy.MaxDocumentBytes, "Policy document")
if errors.Is(err, fssecure.ErrTooLarge) {
data = make([]byte, policy.MaxDocumentBytes+1)
} else if err != nil {
@@ -120,9 +120,9 @@ func (a *App) policyOperation(operation string) *cobra.Command {
switch operation {
case "contract":
if registry != nil {
- _, err = fmt.Fprintf(a.out, "Policy format registry 1 · EXPERIMENTAL\n0.0.2 · nonnormative prototype · %s\n1.0.0 · proposed-draft candidate, unadopted · %s\nSelect a format explicitly for init/schema. No authority or conformance is established.\n", policy.SpecURL, policy.CandidateURL)
+ _, err = fmt.Fprintf(a.out, "Policy format registry 1 · EXPERIMENTAL\n0.0.2 · nonnormative prototype · %s\n1.0.0 · official Policy draft · %s\nSelect a format explicitly for init/schema. No authority or conformance is established.\n", policy.SpecURL, policy.DraftURL)
} else if report.FormatVersion == policy.CandidateVersion {
- _, err = fmt.Fprintf(a.out, "Policy candidate %s · EXPERIMENTAL · proposed-draft, unadopted\nSpecification: %s\nKinds: policy, governing-adoption\nNo approval, current authority or standard conformance is established.\n", report.FormatVersion, report.Specification)
+ _, err = fmt.Fprintf(a.out, "Policy draft %s · EXPERIMENTAL · draft maturity\nSpecification: %s\nKinds: policy, governing-adoption\nNo approval, current authority or standard conformance is established.\n", report.FormatVersion, report.Specification)
} else {
_, err = fmt.Fprintf(a.out, "Policy tools · EXPERIMENTAL · nonnormative prototype %s\nSpecification: %s\nKinds: policy, governing-adoption\nOperations: contract, init, schema, canonicalize, digest, validate, check\nValidate checks document forms and local references. Check checks exact supplied retained materials and specific Core references, without full Core semantic validation or evaluation.\nNo approval, governing-adoption authority or standard conformance is established.\n", policy.PrototypeVersion, policy.SpecURL)
}
@@ -132,13 +132,13 @@ func (a *App) policyOperation(operation string) *cobra.Command {
_, err = fmt.Fprintln(a.out, report.CanonicalDigest)
case "validate":
if report.FormatVersion == policy.CandidateVersion {
- _, err = fmt.Fprintln(a.out, "Proposed-draft candidate document and local-reference checks passed. Retained materials were not checked; no authority is established.")
+ _, err = fmt.Fprintln(a.out, "Policy draft document and local-reference checks passed. Retained materials were not checked; no authority is established.")
} else {
_, err = fmt.Fprintln(a.out, "Prototype document and local-reference checks passed. Retained materials were not checked; no authority is established.")
}
case "check":
if report.FormatVersion == policy.CandidateVersion {
- _, err = fmt.Fprintln(a.out, "Proposed-draft candidate retained-material and reference checks passed. Full Core semantics and evaluation were not checked; no authority is established.")
+ _, err = fmt.Fprintln(a.out, "Policy draft retained-material and reference checks passed. Full Core semantics and evaluation were not checked; no authority is established.")
} else {
_, err = fmt.Fprintln(a.out, "Prototype retained-material and reference checks passed. Full Core semantics and evaluation were not checked; no authority is established.")
}
@@ -163,7 +163,7 @@ func (a *App) policyOperation(operation string) *cobra.Command {
if operation == "init" || operation == "schema" {
c.Flags().StringVar(&kind, "kind", "", "required exact kind: policy or governing-adoption")
}
- c.Flags().StringVar(&profileVersion, "format-version", "", "exact format: prototype 0.0.2 or proposed-draft candidate 1.0.0; required for init/schema, optional explicit dispatch otherwise")
+ c.Flags().StringVar(&profileVersion, "format-version", "", "exact format: prototype 0.0.2 or official draft 1.0.0; required for init/schema, optional explicit dispatch otherwise")
if operation == "contract" {
c.Flags().BoolVar(&allFormats, "all-formats", false, "explicitly discover all formats in registry version 1")
}
diff --git a/internal/cli/policy_candidate_test.go b/internal/cli/policy_candidate_test.go
index 2319e9be..c3710cd8 100644
--- a/internal/cli/policy_candidate_test.go
+++ b/internal/cli/policy_candidate_test.go
@@ -18,7 +18,7 @@ import (
func candidateCLIBytes(t *testing.T, name string) string {
t.Helper()
- raw, err := os.ReadFile(filepath.Join("..", "policy", "candidate", "examples", "refunds", name))
+ raw, err := os.ReadFile(filepath.Join("..", "policy", "official", "conformance", "policy", "1.0.0", "examples", "refunds", name))
if err != nil {
t.Fatal(err)
}
@@ -115,7 +115,7 @@ func TestPolicyCandidateCLIAndMCPParity(t *testing.T) {
if !reflect.DeepEqual(actual, other) {
t.Fatalf("candidate CLI/MCP mismatch\n%v\n%v", actual, other)
}
- if actual["specRevision"] != policy.CandidateRevision || actual["maturity"] != "proposed-draft" {
+ if actual["specRevision"] != policy.DraftRevision || actual["maturity"] != "draft" {
t.Fatal("candidate provenance")
}
if tc.operation == "check" {
@@ -134,7 +134,7 @@ func TestPolicyCandidateCLIAndMCPParity(t *testing.T) {
args = append(args, "--materials", materialPath)
}
exit, stdout, stderr := runTest(t, args, candidateCLIBytes(t, "policy.json"))
- if exit != 0 || stderr != "" || !strings.Contains(stdout, "Proposed-draft candidate") {
+ if exit != 0 || stderr != "" || !strings.Contains(stdout, "Policy draft") {
t.Fatalf("candidate human output %d %s %s", exit, stdout, stderr)
}
}
@@ -186,3 +186,37 @@ func TestPolicyExplicitContractDiscoveryParity(t *testing.T) {
}
}
}
+
+func TestPolicyOfficialDraftInitSchemaParity(t *testing.T) {
+ for _, operation := range []string{"init", "schema"} {
+ for _, kind := range []string{"policy", "governing-adoption"} {
+ t.Run(operation+"/"+kind, func(t *testing.T) {
+ args := []string{"experimental", "policy", operation, "--kind", kind, "--format-version", "1.0.0", "--format", "json"}
+ input := map[string]any{"kind": kind, "formatVersion": "1.0.0"}
+ name := "experimental_get_policy_schema"
+ if operation == "init" {
+ args = append(args, "--id", "urn:test:draft", "--version", "7.3.42")
+ input["id"], input["version"] = "urn:test:draft", "7.3.42"
+ name = "experimental_policy_init"
+ }
+ exit, stdout, stderr := runTest(t, args, "")
+ if exit != 0 || stderr != "" {
+ t.Fatal(exit, stdout, stderr)
+ }
+ var actual map[string]any
+ if err := json.Unmarshal([]byte(stdout), &actual); err != nil {
+ t.Fatal(err)
+ }
+ other, isError := candidateMCPReply(t, name, input)
+ delete(actual, "command")
+ delete(other, "command")
+ if isError || !reflect.DeepEqual(actual, other) || actual["specRevision"] != policy.DraftRevision || actual["specification"] != policy.DraftURL || actual["maturity"] != "draft" || actual["candidateResult"] != nil {
+ t.Fatal("official init/schema CLI/MCP mismatch", actual, other)
+ }
+ if operation == "schema" && actual["resource"].(map[string]any)["sourceId"] != "https://judgmentpack.org/schema/policy/1.0.0/"+kind+".schema.json" {
+ t.Fatal("missing official schema identity")
+ }
+ })
+ }
+ }
+}
diff --git a/internal/mcp/policy.go b/internal/mcp/policy.go
index d2f5a993..b4d0c07a 100644
--- a/internal/mcp/policy.go
+++ b/internal/mcp/policy.go
@@ -17,9 +17,9 @@ func policyToolName(operation string) string {
func policyDefinition(operation string) map[string]any {
descriptions := map[string]string{
- "contract": "With no selectors, discover the unchanged pinned RFC 0023 prototype 0.0.2. Explicit allFormats:true discovers registry version 1; formatVersion selects one contract, mutually exclusive. Candidate 1.0.0 is proposed-draft and unadopted. Reports exact kinds, capabilities and limits. Experimental; no project reads, persistence, evaluation or authority.",
- "init": "Return a nonnormative Policy companion starter template for an explicitly selected kind, format and identity. Retained materials are missing and unchecked. The client saves it; no publication, approval or governing-adoption authority is established.",
- "schema": "Return a self-contained Runtime editing schema derived from pinned nonnormative prototype resources for an explicit kind and explicit prototype 0.0.2 or proposed-draft candidate 1.0.0. Use validate for strict document and local-reference checks. Offline; no project reads or writes.",
+ "contract": "With no selectors, discover the unchanged pinned RFC 0023 prototype 0.0.2. Explicit allFormats:true discovers registry version 1; formatVersion selects one contract, mutually exclusive. Explicit 1.0.0 selects the immutable official Policy draft release; this experimental host surface establishes no stable conformance. Reports exact kinds, capabilities and limits. Experimental; no project reads, persistence, evaluation or authority.",
+ "init": "Return a Policy companion starter template for an explicitly selected kind, format and identity. Retained materials are missing and unchecked. The client saves it; no publication, approval or governing-adoption authority is established.",
+ "schema": "Return a self-contained Runtime editing schema derived from pinned prototype or official draft resources for an explicit kind and explicit prototype 0.0.2 or official draft 1.0.0. Use validate for strict document and local-reference checks. Offline; no project reads or writes.",
"canonicalize": "Return canonical Policy companion document bytes and separate canonical/raw byte digests. Encoding success is not document validation, retained-material verification or authority. Experimental; no files read or written.",
"digest": "Return the canonical Policy companion digest and separate raw-byte identity. Encoding success is not validation or authority. Experimental; no files read or written.",
"validate": "Check exact Policy companion document JSON for strict forms, schema and local references. Does not check retained materials, full Core semantics, evaluation, approval or governing-adoption authority. Experimental; no files read or written.",
@@ -29,7 +29,7 @@ func policyDefinition(operation string) map[string]any {
schema := map[string]any{"type": "object", "additionalProperties": false, "properties": properties}
if operation == "init" || operation == "schema" {
properties["kind"] = map[string]any{"type": "string", "enum": []string{"policy", "governing-adoption"}}
- properties["formatVersion"] = map[string]any{"type": "string", "enum": []string{policy.PrototypeVersion, policy.CandidateVersion}, "description": "Exact prototype 0.0.2 or unadopted proposed-draft candidate 1.0.0; no format is selected by default."}
+ properties["formatVersion"] = map[string]any{"type": "string", "enum": []string{policy.PrototypeVersion, policy.CandidateVersion}, "description": "Exact prototype 0.0.2 or official draft 1.0.0; no format is selected by default."}
schema["required"] = []string{"kind", "formatVersion"}
if operation == "init" {
properties["id"] = map[string]any{"type": "string", "description": "Explicit absolute artifact URI identifier."}
@@ -45,7 +45,7 @@ func policyDefinition(operation string) map[string]any {
properties["allFormats"] = map[string]any{"type": "boolean", "description": "Explicit opt-in to registry version 1; mutually exclusive with formatVersion."}
}
if operation != "init" && operation != "schema" {
- properties["formatVersion"] = map[string]any{"type": "string", "description": "Optional exact format selection: 0.0.2 prototype or 1.0.0 proposed-draft candidate. Candidate selection also classifies malformed/missing document selectors. No automatic migration."}
+ properties["formatVersion"] = map[string]any{"type": "string", "description": "Optional exact format selection: 0.0.2 prototype or 1.0.0 official draft. Explicit draft selection also classifies malformed/missing document selectors. No automatic migration."}
}
if operation == "check" {
properties["materials"] = map[string]any{"type": "string", "maxLength": policy.MaxMaterialsWireBytes, "description": fmt.Sprintf("Exact retained-material JSON text: {materials:[{content:{bytesDigest,byteLength,mediaType},dataBase64}]}. No paths/URLs. Maximum decoded JSON text %d bytes; stdio's %d-byte line limit can be reached first after JSON/base64 overhead.", policy.MaxMaterialsWireBytes, maxMessageBytes)}
diff --git a/internal/mcp/policy_test.go b/internal/mcp/policy_test.go
index ce2d1615..e9f3bda4 100644
--- a/internal/mcp/policy_test.go
+++ b/internal/mcp/policy_test.go
@@ -102,13 +102,14 @@ func TestPolicyCandidateDiscoveryStrictArguments(t *testing.T) {
for _, args := range []string{
`{"allFormats":true,"formatVersion":"1.0.0"}`, `{"allFormats":null}`, `{"allFormats":"true"}`,
`{"AllFormats":true}`, `{"allFormats":true,"allFormats":true}`, `{"formatVersion":null}`,
+ `{"formatVersion":false}`, `{"formatVersion":0}`,
} {
reply := runServer(t, rawToolCall(t, 1, "experimental_get_policy_contract", args))[0]["result"].(map[string]any)
if reply["isError"] != true || reply["structuredContent"] != nil {
t.Fatal(args, reply)
}
}
- for _, args := range []string{`{"document":"{}","formatVersion":null}`, `{"document":"{}","FormatVersion":"1.0.0"}`} {
+ for _, args := range []string{`{"document":"{}","formatVersion":null}`, `{"document":"{}","formatVersion":false}`, `{"document":"{}","formatVersion":0}`, `{"document":"{}","FormatVersion":"1.0.0"}`} {
reply := runServer(t, rawToolCall(t, 1, "experimental_policy_validate", args))[0]["result"].(map[string]any)
if reply["isError"] != true || reply["structuredContent"] != nil {
t.Fatal(args, reply)
diff --git a/internal/policy/candidate_schema.go b/internal/policy/candidate_schema.go
index 1927d4ae..5a0586f7 100644
--- a/internal/policy/candidate_schema.go
+++ b/internal/policy/candidate_schema.go
@@ -13,6 +13,8 @@ import (
var candidate embed.FS
const candidateCommonID = "urn:jps:proposal:policy-companion:1.0.0:common"
+const draftSchemaPrefix = "https://judgmentpack.org/schema/policy/1.0.0/"
+const draftCommonID = draftSchemaPrefix + "common.schema.json"
var candidateSchemasOnce sync.Once
var candidateSchemas map[string]*jsonschema.Schema
@@ -20,24 +22,28 @@ var candidateSchemasError error
func schemaSource(version string) (embed.FS, string, string, string) {
if version == CandidateVersion {
- return candidate, candidateFormat.directory, candidateFormat.commonURI, candidateFormat.revision
+ return official, candidateFormat.directory, candidateFormat.commonURI, candidateFormat.revision
}
return prototype, prototypeFormat.directory, prototypeFormat.commonURI, prototypeFormat.revision
}
func loadCandidateSchemas() (map[string]*jsonschema.Schema, error) {
candidateSchemasOnce.Do(func() {
+ if err := VerifyOfficialArtifacts(); err != nil {
+ candidateSchemasError = err
+ return
+ }
resources := map[string][]byte{}
for _, name := range []string{"common", "policy", "governing-adoption"} {
- raw, err := candidate.ReadFile("candidate/" + name + ".schema.json")
+ raw, err := official.ReadFile(candidateFormat.directory + "/" + name + ".schema.json")
if err != nil {
candidateSchemasError = err
return
}
- resources["urn:jps:proposal:policy-companion:1.0.0:"+name] = raw
+ resources[draftSchemaPrefix+name+".schema.json"] = raw
}
candidateSchemas = map[string]*jsonschema.Schema{}
- for name, id := range map[string]string{"common": candidateCommonID, "uri": candidateCommonID + "#/$defs/uri", "policy": "urn:jps:proposal:policy-companion:1.0.0:policy", "governing-adoption": "urn:jps:proposal:policy-companion:1.0.0:governing-adoption"} {
+ for name, id := range map[string]string{"common": draftCommonID, "uri": draftCommonID + "#/$defs/uri", "policy": draftSchemaPrefix + "policy.schema.json", "governing-adoption": draftSchemaPrefix + "governing-adoption.schema.json"} {
s, err := compileCandidateSchemas(resources, id)
if err != nil {
candidateSchemasError = err
@@ -71,7 +77,7 @@ func candidateSchema(name string, value any) (*issue, int) {
}
schemas, err := loadCandidateSchemas()
if err != nil {
- return problem("JPS-POLICY-ARTIFACT", "", "Pinned candidate schemas could not be compiled."), result.ExitIO
+ return problem("JPS-POLICY-ARTIFACT", "", "Pinned official draft schemas could not be verified or compiled."), result.ExitIO
}
if err := schemas[name].Validate(value); err != nil {
if schemaBound(err) {
diff --git a/internal/policy/candidate_test.go b/internal/policy/candidate_test.go
index 0bfdca38..b7a00e7f 100644
--- a/internal/policy/candidate_test.go
+++ b/internal/policy/candidate_test.go
@@ -47,7 +47,7 @@ func vectorBytes(source map[string]any) ([]byte, *issue, int) {
if strings.ContainsRune(name, 0) || path.IsAbs(name) || path.Clean(name) != name || strings.HasPrefix(name, "../") {
return nil, candidateIssue("invalid-carrier"), result.ExitInvalid
}
- raw, err := candidate.ReadFile("candidate/" + name)
+ raw, err := official.ReadFile("official/conformance/policy/1.0.0/" + name)
if err != nil {
return nil, candidateIssue("missing-material"), result.ExitInvalid
}
@@ -56,8 +56,8 @@ func vectorBytes(source map[string]any) ([]byte, *issue, int) {
return bytes.Repeat([]byte{byte(number(source["repeatByte"]))}, number(source["byteLength"])), nil, 0
}
-func TestCandidatePortableVectors(t *testing.T) {
- value, failure := carrier.Decode(candidateRead(t, "vectors/manifest.json"), limits())
+func TestOfficialDraftPortableVectors(t *testing.T) {
+ value, failure := carrier.Decode(officialRead(t, "conformance/policy/1.0.0/vectors/manifest.json"), limits())
if failure != nil {
t.Fatal(failure)
}
@@ -99,6 +99,9 @@ func TestCandidatePortableVectors(t *testing.T) {
}
actual := mustMap(t, mustJSON(t, r.CandidateResult))
+ if r.SpecRevision != DraftRevision || r.Specification != DraftURL || r.Maturity != "draft" || r.Capabilities.FullDocumentConformance || r.Capabilities.LiveAuthority || r.Capabilities.ExecutionAuthority || r.Capabilities.ApprovalVerification {
+ t.Fatal("official draft metadata or authority boundary changed")
+ }
if !reflect.DeepEqual(actual, object(entry["expected"])) {
t.Fatalf("result %v want %v; exit %d diagnostics %v", actual, entry["expected"], exit, r.Diagnostics)
}
@@ -146,7 +149,7 @@ func TestCandidateRawIdentityAndFormatIsolation(t *testing.T) {
f := candidateFixture(t, "refunds")
raw := f.raw["policy.json"]
r, exit := Canonicalize("canon", raw)
- if exit != 0 || r.BytesDigest != digest(raw) || r.CanonicalDigest == r.BytesDigest || r.FormatVersion != CandidateVersion || r.SpecRevision != CandidateRevision || r.CandidateResult != nil {
+ if exit != 0 || r.BytesDigest != digest(raw) || r.CanonicalDigest == r.BytesDigest || r.FormatVersion != CandidateVersion || r.SpecRevision != DraftRevision || r.CandidateResult != nil {
t.Fatalf("candidate identity %+v exit %d", r, exit)
}
if r.Document == "" {
@@ -199,7 +202,7 @@ func TestCandidateInitSchemaAndExplicitDiscovery(t *testing.T) {
}
}
var capabilities map[string]any
- if json.Unmarshal(registry.Formats[1].CandidateCapabilities, &capabilities) != nil || capabilities["maturity"] != "proposed-draft" {
+ if json.Unmarshal(registry.Formats[1].CandidateCapabilities, &capabilities) != nil || capabilities["maturity"] != "draft" {
t.Fatal("candidate discovery")
}
}
diff --git a/internal/policy/document.go b/internal/policy/document.go
index 298a39a8..fedb92b4 100644
--- a/internal/policy/document.go
+++ b/internal/policy/document.go
@@ -1,5 +1,6 @@
// Package policy supplies bounded offline tools for the explicitly non-normative
-// RFC 0023 prototype and proposed-draft candidate. It is not a policy authority or an evaluator.
+// RFC 0023 prototype and the independently released Policy draft. It is not a
+// policy authority or an evaluator.
package policy
import (
@@ -69,6 +70,7 @@ type Resource struct {
Name string `json:"name"`
MediaType string `json:"mediaType"`
Text string `json:"text"`
+ SourceID string `json:"sourceId,omitempty"`
}
type MaterialRequirement struct {
diff --git a/internal/policy/format.go b/internal/policy/format.go
index bdb3fa11..bbda81e9 100644
--- a/internal/policy/format.go
+++ b/internal/policy/format.go
@@ -13,15 +13,19 @@ import (
const CandidateVersion = "1.0.0"
const CandidateRevision = "0852c5fa7726e51b36e574a5b110e7f5e012e03d"
const CandidateURL = "https://github.com/Judgment-Pack/judgment-pack-spec/blob/" + CandidateRevision + "/rfcs/policy-companion-contract/README.md"
+const DraftRelease = "policy-v1.0.0-draft.1"
+const DraftRevision = "0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94"
+const DraftURL = "https://github.com/Judgment-Pack/judgment-pack-spec/blob/" + DraftRevision + "/spec/policy.md"
type formatDescriptor struct {
version, profile, maturity, revision, url, directory, commonURI string
}
var prototypeFormat = formatDescriptor{ProfileVersion, Profile, "non-normative", SpecRevision, SpecURL, "prototype", commonID}
-var candidateFormat = formatDescriptor{CandidateVersion, "jps-policy-companion", "proposed-draft", CandidateRevision, CandidateURL, "candidate", candidateCommonID}
+var candidateFormat = formatDescriptor{CandidateVersion, "jps-policy-companion", "draft", DraftRevision, DraftURL, "official/schema/policy/1.0.0", draftCommonID}
-// CandidateResult is the complete portable full-check result. It is absent from
+// CandidateResult retains the existing report member name for the complete
+// portable draft full-check result. It is absent from
// legacy reports and from encoding/local validation, which have narrower scopes.
type CandidateResult struct {
Status string `json:"status"`
@@ -71,9 +75,9 @@ func candidateReport(command string) Report {
r.FormatVersion = f.version
r.Capabilities.ProfileVersions = []string{f.version}
r.Capabilities.Maturity = f.maturity
- r.Capabilities.ValidationScope = "closed-candidate-document-and-local-references"
- r.Capabilities.CheckScope = "candidate-supplied-exact-bytes-anchors-and-scoped-core-references"
- r.CandidateCapabilities, _ = candidate.ReadFile("candidate/capabilities.json")
+ r.Capabilities.ValidationScope = "closed-draft-document-and-local-references"
+ r.Capabilities.CheckScope = "draft-supplied-exact-bytes-anchors-and-scoped-core-references"
+ r.CandidateCapabilities, _ = official.ReadFile("official/conformance/policy/1.0.0/capabilities.json")
return r
}
@@ -83,7 +87,7 @@ func candidateRefused(r Report, code string) (Report, int) {
if code == "input-over-bound" || code == "unsupported-format" || code == "unsupported-canonical-identity" {
exit = result.ExitUnsupported
}
- return refused(r, "JPS-POLICY-CANDIDATE-"+strings.ToUpper(code), "", "Proposed-draft candidate check refused: "+code+".", exit)
+ return refused(r, "JPS-POLICY-CANDIDATE-"+strings.ToUpper(code), "", "Policy draft check refused: "+code+".", exit)
}
// Only a strict object carrying the new selector opts into automatic candidate
@@ -244,7 +248,7 @@ func DigestFormat(command string, data []byte, format string) (Report, int) {
}
func candidateIssue(code string) *issue {
- return &issue{code: "JPS-POLICY-CANDIDATE-" + strings.ToUpper(code), message: "Proposed-draft candidate check refused: " + code + ".", candidateCode: code}
+ return &issue{code: "JPS-POLICY-CANDIDATE-" + strings.ToUpper(code), message: "Policy draft check refused: " + code + ".", candidateCode: code}
}
func candidateCode(err *issue, exit int) string {
@@ -277,7 +281,7 @@ func finishCandidateCheck(r Report, code int) (Report, int) {
return r, code
}
if code == 0 {
- r.CandidateResult = &CandidateResult{Status: "valid", FormatVersion: CandidateVersion, Maturity: "proposed-draft"}
+ r.CandidateResult = &CandidateResult{Status: "valid", FormatVersion: CandidateVersion, Maturity: "draft"}
} else if r.refusalCode != "" {
r.CandidateResult = &CandidateResult{Status: "refused", Code: r.refusalCode}
}
diff --git a/internal/policy/official.go b/internal/policy/official.go
new file mode 100644
index 00000000..3e00c3f1
--- /dev/null
+++ b/internal/policy/official.go
@@ -0,0 +1,73 @@
+package policy
+
+import (
+ "embed"
+ "encoding/json"
+ "fmt"
+ "io/fs"
+ "strings"
+ "sync"
+)
+
+// official retains published source paths so the unchanged reference reader can
+// run against its frozen schemas, complete corpus and shared canonicalizer.
+//
+//go:embed official
+var official embed.FS
+
+const officialProvenanceDigest = "sha256:398735dc63478806ff77d75af61ef3dd76459ffbef454cb4bdb1b25bc54f3e25"
+
+var officialOnce sync.Once
+var officialError error
+
+// VerifyOfficialArtifacts verifies the independently pinned manifest and every
+// retained release file. The same check guards schema compilation and releases;
+// no network resolution or publication/authority assertion is involved.
+func VerifyOfficialArtifacts() error {
+ officialOnce.Do(func() { officialError = verifyOfficialArtifacts(official) })
+ return officialError
+}
+
+func verifyOfficialArtifacts(source fs.FS) error {
+ raw, err := fs.ReadFile(source, "official/provenance.json")
+ if err != nil || digest(raw) != officialProvenanceDigest {
+ return fmt.Errorf("official Policy draft provenance does not match its independent pin")
+ }
+ var manifest struct {
+ SourceRepository string `json:"sourceRepository"`
+ SourceRevision string `json:"sourceRevision"`
+ SourceRelease string `json:"sourceRelease"`
+ FormatVersion string `json:"formatVersion"`
+ Maturity string `json:"maturity"`
+ Files []struct {
+ SourcePath string `json:"sourcePath"`
+ Path string `json:"path"`
+ SHA256 string `json:"sha256"`
+ ByteLength int `json:"byteLength"`
+ } `json:"files"`
+ }
+ if json.Unmarshal(raw, &manifest) != nil || manifest.SourceRepository != "https://github.com/Judgment-Pack/judgment-pack-spec" || manifest.SourceRevision != DraftRevision || manifest.SourceRelease != DraftRelease || manifest.FormatVersion != CandidateVersion || manifest.Maturity != "draft" || len(manifest.Files) == 0 {
+ return fmt.Errorf("official Policy draft provenance identity is invalid")
+ }
+ expected := map[string]bool{"official/provenance.json": true}
+ for _, file := range manifest.Files {
+ if !fs.ValidPath(file.Path) || file.Path != file.SourcePath || expected["official/"+file.Path] {
+ return fmt.Errorf("official Policy draft manifest inventory is invalid")
+ }
+ name := "official/" + file.Path
+ raw, err := fs.ReadFile(source, name)
+ if err != nil || len(raw) != file.ByteLength || digest(raw) != "sha256:"+file.SHA256 {
+ return fmt.Errorf("official Policy draft file differs from its pin: %s", file.Path)
+ }
+ expected[name] = true
+ }
+ return fs.WalkDir(source, "official", func(name string, entry fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if !entry.IsDir() && !expected[name] {
+ return fmt.Errorf("unmanifested official Policy draft file: %s", strings.TrimPrefix(name, "official/"))
+ }
+ return nil
+ })
+}
diff --git a/internal/policy/official/CONTRIBUTING.md b/internal/policy/official/CONTRIBUTING.md
new file mode 100644
index 00000000..7c948c2f
--- /dev/null
+++ b/internal/policy/official/CONTRIBUTING.md
@@ -0,0 +1,91 @@
+# Contributing
+
+Thank you for helping test whether organizational judgment can have a useful portable format.
+
+This is a research preview. Critical feedback, counterexamples, and removal proposals are as
+valuable as additive features.
+
+## Good first contributions
+
+- a pack example from a domain unlike the existing examples;
+- an ambiguity or contradiction in the draft prose;
+- a case accepted by the schema that should be rejected;
+- a case rejected by the schema that should be portable;
+- an interoperability, privacy, security, or authoring-cost concern;
+- evidence that a concept belongs in a profile rather than Core.
+
+## Working on an issue
+
+You're welcome to comment that you'd like to take an issue, and a maintainer may assign it to you.
+Only that assignment reserves it. Without one, the first pull request that meets the issue's
+acceptance criteria is the one that gets merged, and until then the issue stays open to anyone.
+
+Work on one issue at a time. Finish the pull request you have open, or say you're withdrawing it,
+before you take another. We assign at most one issue to each contributor at once.
+
+If an assigned issue goes quiet for a couple of weeks with no pull request, a maintainer will
+check in. If there's no reply within a week after that, the issue is unassigned so someone else
+can pick it up. You're welcome to take it back while it's still open.
+
+## Before proposing a feature
+
+Open a design issue describing:
+
+1. the user or interoperability problem;
+2. at least two realistic examples;
+3. why an extension or external product behavior is insufficient;
+4. compatibility and migration consequences;
+5. security and privacy consequences; and
+6. how two independent implementations could test agreement.
+
+Material changes should become a Request for Comments (RFC). Copy the structure in
+[`rfcs/0000-rfc-process.md`](rfcs/0000-rfc-process.md).
+
+## Pull requests
+
+A pull request should:
+
+- remain focused on one problem;
+- link the relevant issue or RFC;
+- update prose, schema, examples, and conformance cases together when applicable;
+- include at least one negative or adversarial case for normative behavior;
+- identify breaking changes explicitly; and
+- avoid claiming that conformance proves truth, authorization, or safety.
+
+Normative changes are not accepted solely because the reference implementation supports them.
+
+## Local checks
+
+CI runs the repository checks on Python 3.12. That is what the workflow currently uses rather
+than a declared minimum version for the project.
+
+Install the test dependencies:
+
+```bash
+python -m pip install -r requirements-dev.txt
+```
+
+Run the same checks CI runs:
+
+```bash
+python -m unittest discover -s tests -v
+```
+
+**Install the dependencies even if the suite appears to run without them.** `requirements-dev.txt`
+pins `jsonschema[format-nongpl]`, and the `format` keyword is only checked when those extras are
+present. Without them, `jsonschema` silently ignores `format`, so conformance cases that exist to
+prove a malformed URI or timestamp is rejected come back **valid** and the suite passes while
+checking less than it says it does. Two current corpus cases behave exactly that way.
+
+## Developer Certificate of Origin
+
+Contributions must be signed off using Git's `--signoff` option. The sign-off certifies the
+Developer Certificate of Origin 1.1: .
+
+## License
+
+By contributing, you agree that your contribution is licensed under Apache License 2.0.
+
+## Conduct
+
+Participation is governed by [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md).
diff --git a/internal/policy/official/GOVERNANCE.md b/internal/policy/official/GOVERNANCE.md
new file mode 100644
index 00000000..12763b08
--- /dev/null
+++ b/internal/policy/official/GOVERNANCE.md
@@ -0,0 +1,284 @@
+# Governance
+
+## Status: early research preview
+
+Judgment Pack is an open, vendor-neutral specification developed in public. Today it has a single
+maintainer and no independent contributors (see [Interim review regime](#interim-review-regime)).
+It is not controlled by any required commercial runtime, though the reference runtime is written by
+the same maintainer and is not independent evidence of interoperability. Conforming
+implementations may be open-source or proprietary; conformance is defined by the specification and
+its conformance cases, not by any single vendor's product.
+
+The current status is an early research preview (`0.2.0-draft`). There is no compatibility guarantee
+for `0.x` drafts. Concepts may be revised or removed as the specification is exercised against real
+implementations.
+
+Technical discussion, proposals, decisions, and compatibility analysis are expected to occur
+publicly in this repository. Payment, employment, or commercial membership does not by itself
+establish the technical merit of a proposal.
+
+## Decision principles
+
+Maintainers evaluate changes in this order:
+
+1. demonstrated interoperability need;
+2. safety and semantic clarity;
+3. independent implementability;
+4. compatibility and migration cost;
+5. author and operator usability;
+6. implementation complexity; and
+7. ecosystem adoption potential.
+
+The convenience of any single implementation is not sufficient reason to add a Core feature.
+
+## Decision process
+
+- Minor editorial changes may use ordinary pull requests.
+- Material or normative changes require a Request for Comments (RFC) and a public review
+ period. See [Interim review regime](#interim-review-regime) for what that period currently
+ produces and what stands in for the outside review it does not yet draw.
+- Stable features should have two independent implementations and conformance cases.
+- Maintainers publish the disposition and rationale for an RFC.
+- Material objections and minority positions should be recorded rather than silently discarded.
+
+During the research preview, maintainers may reject or remove concepts aggressively. There is no
+compatibility promise for `0.x` drafts.
+
+## Interim review regime
+
+The project has one maintainer, Brian Jin ([@kikashy](https://github.com/kikashy)), and no
+independent contributors. Elsewhere this document says "maintainers" and speaks of public review
+periods, as do [`README.md`](./README.md),
+[`docs/origin-and-boundary.md`](./docs/origin-and-boundary.md), and Q40 of [`FAQ.md`](./FAQ.md).
+Those describe the intended end state, not today. Today a public review period means a change sits
+in public and no one comments, and one maintainer merges their own RFCs with model assistance on the
+drafting — a real concentration of judgment.
+
+This section adds an adversarial reading where there is currently none. It is not review breadth.
+Breadth means readers with different exposure — users, implementers, operators — and no model has
+any.
+
+This section is the operative text proposed by [RFC 0009](./rfcs/0009-interim-review-regime.md),
+which is its design record, adopted 2026-07-27. The regime was introduced through the RFC process it
+amends; two adversarial reviews of the proposal, with a written disposition for every finding, are
+recorded on that RFC's pull request, and the maintainer's merge of that pull request is the
+acceptance.
+
+### Practice
+
+The precedent is partial. RFC 0006
+([pull request 9](https://github.com/Judgment-Pack/judgment-pack-spec/pull/9)) records the review
+prompt verbatim, the unedited findings of an OpenAI Codex review of a Claude-drafted RFC, the
+response, and a maintainer disposition; the bar stated at the time was a different model family, not
+a different vendor. RFC 0007 and the reference runtime's architecture decision records carry no such
+record and were merged without one.
+
+- **Scope.** The pull request adopting [RFC 0009](./rfcs/0009-interim-review-regime.md) and every
+ pull request merged after it, where that pull request creates, materially amends, or dispositions
+ an RFC in this repository. The test is commit-relative, not date-relative: the adopting pull
+ request is inside its own scope rather than the last one exempt from it, and no merge falls into a
+ same-day gap. Predating the requirement is not an exemption: RFCs 0001–0007 acquire it the next
+ time such a pull request touches them, and an RFC opened early and completed later is covered by
+ the merge, not by the opening date. Editorial pull requests — typography, links, formatting — are
+ not covered.
+- **Runtime.** The maintainer applies the same rule to material decisions in the reference runtime,
+ with or without an architecture decision record. A decision is *material* when it changes a public
+ surface, a documented claim, conformance-relevant behavior, the security posture, or a dependency
+ boundary. Not writing an ADR does not make a decision immaterial. This document binds only this
+ repository; the runtime's adopting text is its
+ [`docs/adr/README.md`](https://github.com/Judgment-Pack/judgment-pack-runtime/blob/main/docs/adr/README.md),
+ and the obligation exists there because that text is merged — so this bullet now describes a rule
+ the runtime is under rather than an intention. That text also requires every runtime pull request to
+ declare its material-decision impact, so a change treated as immaterial is classified out loud and
+ can be disputed rather than passing in silence. Runtime ADRs are written after the decision and
+ are immutable once accepted, so the review attaches to the pull request that makes the decision,
+ not to the ADR text.
+- **Cross-vendor review.** At least one adversarial review by a model from a **different vendor**
+ than any model that assisted the drafting. *Vendor* means the organization that controls the
+ model's weights and training — the developer, not the API host and not a reseller. Two hosted
+ copies of the same model share lineage and are the same vendor here, whatever the invoice says.
+ *Assisted the drafting* means generated or revised text that survives in the merged artifact, or
+ planning, analysis, structure, or design choices supplied by a model and relied on to produce it.
+ Paraphrase does not launder assistance: a model that shaped the outline, chose the arguments, or
+ settled a design question assisted the drafting even when none of its sentences survive. Applying
+ an accepted finding in the maintainer's own words does not make the reviewer a drafter; adopting
+ reviewer-generated text verbatim does not invalidate the review that produced it, but the record
+ says where that happened. A case the maintainer cannot call is declared in the record, and the
+ declaration is an attestation like the others below.
+- **Record.** The review is recorded in the pull request, in a comment beginning with the heading
+ `## Cross-vendor adversarial review`. The record names the drafting model or models and the
+ reviewing model, each with vendor, model identifier, and date; states the commit SHA that was
+ reviewed and what repository context the reviewer was given — files, diff range, tools, whether it
+ could read the working tree; quotes the review prompt verbatim; and includes the reviewing model's
+ complete unedited output, including findings the maintainer rejects. If more than one review was
+ run, every run is linked and the record states that no run was discarded.
+- **Change after review.** A material change to the artifact after the reviewed SHA requires a fresh
+ review of the later SHA. One class of change is excepted: a change that implements a dispositioned
+ finding of a review already recorded on the same pull request, which is covered by that finding's
+ disposition and by the commit the disposition links. Without the exception the requirement never
+ terminates — every review provokes changes and every change provokes a review — and the exception
+ opens no general escape, because it is pinned to specific recorded findings: a material change no
+ recorded finding asked for is not covered by one. A note in place of a review is available only
+ for non-material changes — typography, links, formatting — and the note says what changed.
+- **Disposition.** Every finding receives a written maintainer disposition: accept, accept in part,
+ reject with reason, or defer with the condition that would reopen it. Every accepted finding links
+ to the commit that implements it or to the tracked follow-up that will.
+- **Redaction.** The unedited-output requirement yields to disclosure risk and to nothing else. If
+ the raw output contains an exploitable vulnerability, personal data, or credentials, the published
+ record may redact exactly that portion. The redaction is marked in place, its reason class stated
+ — vulnerability, personal data, or credential — the unredacted original preserved privately, and
+ the full text published after remediation when it is safe to publish, handled under
+ [`SECURITY.md`](./SECURITY.md). A finding the maintainer finds unwelcome is not a
+ disclosure risk.
+- **Pull requests only.** No RFC, and no material runtime decision, is merged except through a pull
+ request carrying the review and the dispositions. Direct pushes to the default branch are not used
+ for either.
+
+### What the record cannot show
+
+The heading convention above makes records *findable*. It does not make compliance *provable*. The
+record makes the maintainer's claims discoverable; it cannot verify them. These stay attestations by
+the reviewed party:
+
+- which models actually assisted the drafting, including assistance that left no surviving text;
+- that the quoted prompt is the complete input, including system instructions, attached context, and
+ tool output;
+- that the quoted output is complete and unedited apart from a marked redaction;
+- that no run was discarded.
+
+Pull-request comments are editable and deletable by their author, so the comment is not the anchor.
+The reviewed commit SHA is: the artifact under review is fixed in Git history even when the text
+describing it is not. A reader who wants more than an attestation would need provider-side logs,
+which this project does not publish and does not claim to.
+
+### Limits
+
+Model review is not decision authority. It is not authoritative; the disposition of the maintainer
+named above is, and they are accountable for it. Known weaknesses:
+
+- The reviewing model is selected, prompted, transcribed, and dispositioned by the party being
+ reviewed. Nothing here prevents re-running a review until it is agreeable. The recorded prompt, the
+ complete output, and the link to every run are what would make that visible — and every one of them
+ is supplied by the same party, per
+ [What the record cannot show](#what-the-record-cannot-show).
+ Only a reader who checks makes any of it cost anything.
+- Cross-vendor review is intended to decorrelate some vendor-specific blind spots. The effect is
+ unmeasured, and models from different vendors still share training data, tuning conventions, and
+ benchmark culture, so the blind spots they share are not vendor-shaped.
+- A reviewing model reading a model-assisted draft may find it unusually agreeable.
+- No model review represents a user, an implementer, or an operator, or reports a cost borne by one.
+- No model is accountable for the finding it failed to make.
+- The maintainer also authors the reference runtime, `judgment-pack-runtime`. No runtime is required
+ to interpret a pack, but that runtime is not independent of this specification: RFC 0006 names it
+ as one of the two independent implementations its evidence bar requires, and two implementations
+ by one author are not independent evidence.
+
+Model reviews are not external design reviews. They do not count toward any exit evidence in
+[`ROADMAP.md`](./ROADMAP.md).
+
+Outside review is not made unnecessary by this regime. It is what the regime is waiting for.
+
+### When a second maintainer arrives
+
+*Arrival* is the grant of merge rights to a second distinct legal person, whether or not that person
+is independent of the first under the exit criteria below. The bullets here trigger on the grant.
+Two maintainers do not by themselves end this regime: the exit criteria still require independence,
+and ending the regime still takes the removal RFC. On arrival:
+
+- an RFC is no longer merged by its own author, and the other maintainer records the disposition;
+- recusal under [Maintainer conflicts](#maintainer-conflicts) becomes available, and
+ the single-maintainer substitute recorded there lapses;
+- with exactly two maintainers, the non-author can block everything by being absent. If the
+ non-author is conflicted, or does not respond within 14 days of a review request, the author
+ merges, and the disposition states that no second maintainer reviewed it and why;
+- the cross-vendor review requirement continues until this section is removed.
+
+### Exit criteria
+
+Recorded in advance. They are prerequisites for opening the RFC that removes this section, not a
+self-executing end: this regime is in force until that RFC merges, whether or not the conditions
+hold on any given day.
+
+1. The project has at least two maintainers with merge rights who are independent of each other:
+ distinct legal persons, not employed by or contracting with the same entity and not funded by it
+ for this work. A maintainer added after this section is adopted must have at least five merged
+ non-trivial commits authored before their first grant of merge rights. The founding maintainer
+ named above is exempt from that count: they held merge rights before there was anything to merge,
+ and a rule they could satisfy by revoking and re-granting their own rights would measure nothing.
+2. Substantive comment on RFCs has come from at least two distinct third-party GitHub accounts,
+ belonging to neither maintainer, across at least two separate RFCs. Comment is *substantive* when
+ it engages the technical substance and receives a written disposition; a typo report, an
+ endorsement, or an aside nobody answered is not. The two commenters are identified natural
+ persons, not accounts created for the purpose.
+
+What those conditions measure is independent participation: that merge rights are held by more than
+one person, and that someone who is neither maintainer has engaged the substance and been answered
+in public. They do not measure breadth. Nothing here counts users, implementers, or operators, or
+asks what exposure a commenter argues from, so on the day this regime exits the project still has no
+measure of the breadth that the second paragraph above says model review is not. Multi-party
+governance is what that is for; this regime ends where that work starts.
+
+Part of this is recorded publicly as it happens, and part is not. Nomination and every grant of merge
+rights are recorded in this repository on the day they occur, so the number of maintainers, the date
+of each grant, and the commits preceding it are checkable by anyone. Independence is not checkable:
+employment, contracting, funding, and whether two accounts are two people cannot be established from
+repository history, and Git authorship metadata is not identity. Whether a comment is substantive is
+a judgment, and whether a commenter was solicited is invisible from outside. Those are
+**attestations**. The maintainer states each one, with the evidence relied on, in the removal RFC,
+and an outside reader can dispute any of them there.
+
+A maintainer removes this section by a governance RFC citing the evidence for each condition,
+disposed under the process in this document. The RFC may be short. It is not opened before both
+conditions hold, and until it merges every requirement above applies unchanged. Deleting the
+project's only standing accountability regime is a governance change, so it takes the route
+this document requires for one. This regime was introduced by that route — through
+[RFC 0009](./rfcs/0009-interim-review-regime.md), under the process it amends, with its adversarial
+reviews and a disposition for every finding recorded on that RFC's pull request — and its removal
+takes the same route.
+
+**Reactivation.** After removal, this regime reactivates on the day fewer than two independent
+maintainers hold merge rights — by resignation, by revocation of rights, by loss of independence, or
+by inactivity — automatically, whether or not anyone announces it. A maintainer with no authored
+commit, recorded review, or recorded disposition in the preceding 90 days does not count toward the
+two. Counting accounts is not the test: two accounts held by one legal person, or held by two people
+no longer independent of each other, were never two maintainers for this purpose. The section is
+restored to this document by ordinary pull request citing this clause, and it binds from the day the
+condition returned, not from the day that pull request merges. Restoring an accountability regime
+whose precondition has returned needs no RFC; removing one does.
+
+Dropping the `-draft` suffix is governed by [`ROADMAP.md`](./ROADMAP.md) Stage 3 and
+[`VERSIONING.md`](./VERSIONING.md). This section neither restates that bar nor supplies a second,
+weaker one.
+
+## Maintainer conflicts
+
+A maintainer with a direct commercial or personal conflict should disclose it. Another maintainer
+should lead disposition when practical. With one maintainer that is not available: the conflict is
+disclosed in the pull request and named in the disposition. This substitute lapses when a second
+maintainer arrives (see [Interim review regime](#interim-review-regime)).
+
+## Evolving the governance model
+
+The specification intends to evolve through real implementations and interoperability feedback. As
+independent conforming implementations, production adopters, and sustained outside contribution
+accumulate, the maintainer intends to formalize multi-party governance. The near-term trigger is the
+exit criteria in [Interim review regime](#interim-review-regime).
+
+That transition should be proposed through a public governance RFC covering technical steering,
+release authority, trademarks, intellectual property, and the project's long-term home. Until the
+supporting implementation and contribution base exists, adding heavier governance ceremony would
+create process without creating independent technical power. The recorded model review required by
+[Interim review regime](#interim-review-regime) is the deliberate exception: it creates a record
+rather than a body, confers authority on no one, and costs third parties nothing.
+
+## Participate
+
+Participation is open. No membership or commercial relationship is required to propose changes,
+report problems, or contribute implementations.
+
+- Source and specification:
+- Issue tracker:
+- Discussion: [join the Judgment Pack Slack](https://join.slack.com/t/judgment-pack/shared_invite/zt-44qrd47ok-o_~Vk3BFDzsN~EGAPkeQBw)
+- Contributing guide: [./CONTRIBUTING.md](./CONTRIBUTING.md)
+- Code of conduct: [./CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)
+- Roadmap: [./ROADMAP.md](./ROADMAP.md)
diff --git a/internal/policy/official/LICENSE b/internal/policy/official/LICENSE
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/internal/policy/official/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/internal/policy/official/NOTICE b/internal/policy/official/NOTICE
new file mode 100644
index 00000000..da28de4b
--- /dev/null
+++ b/internal/policy/official/NOTICE
@@ -0,0 +1,5 @@
+Judgment Pack Specification
+Copyright 2026 Brian Jin
+
+This product includes specification artifacts developed by the Judgment Pack
+project (https://github.com/Judgment-Pack/judgment-pack-spec).
diff --git a/internal/policy/official/VERSIONING.md b/internal/policy/official/VERSIONING.md
new file mode 100644
index 00000000..498b8b6d
--- /dev/null
+++ b/internal/policy/official/VERSIONING.md
@@ -0,0 +1,105 @@
+# Versioning and release policy
+
+Core Judgment Pack Specification releases use Semantic Versioning identifiers with a leading `v` on
+Git tags. Specification `0.2.0-draft` is identified by the exact tag `v0.2.0-draft`, and `0.1.0-draft`
+by `v0.1.0-draft`. Only a tag and GitHub release published by the maintainers establish an immutable
+release; similarly named files on the mutable `main` branch do not.
+
+## Specification versions
+
+`specVersion` identifies the specification release a Judgment Pack targets. Readers MUST compare
+the complete value; they must not infer compatibility from a shared major or minor number during
+the `0.x` research period.
+
+A conformance claim is made against one exact `specVersion`. That applies to every class, and it
+binds hardest on evaluator conformance (Core §3.4): such a claim names the exact version and the
+evaluation corpus published with it, and is not inherited by a later or an earlier version. The corpus
+version is the `suiteVersion` member of the evaluation manifest, and the corpus is frozen when a
+`specVersion` is released — rows are added only on the way to the next one (Core §3.4.1) — so two
+identically worded claims require the same rows, and such a claim must state that every one of those rows
+passed. A failing row blocks the claim unless a project-issued erratum
+(`conformance/evaluation/errata.md`) marks it defective for that corpus version; a claimant cannot make
+that call for itself. A superseded schema stays published so documents that keep the older `specVersion`
+remain checkable, and a previously published versioned URL stays resolvable; neither confers anything on a
+claim. A preserved schema is served at the `$id` it was published under, and where that identifier was
+re-pointed to this project's own domain it differs from the tagged artifact in that one member and nothing
+else — the release notes of the version that preserved it publish the digest of both forms.
+
+Any `0.x` release may change reader, writer, or semantic behavior incompatibly. Release notes must
+identify those effects and include migration guidance when an earlier pack can be transformed.
+
+The `main` branch describes work in progress. It is not an immutable specification release and
+must not be used as a reproducibility anchor.
+
+## Pack versions
+
+The root `version` member identifies a revision of one pack series. It is independent of
+`specVersion` and follows the three-component grammar defined by the Core schema.
+
+A published `(id, version)` pair SHOULD be immutable. Changed pack content should receive a new
+pack version, even when `specVersion` does not change.
+
+## Compatibility dimensions
+
+Release notes describe compatibility separately for:
+
+- **reader compatibility** — whether an older reader can parse and preserve a newer document;
+- **writer compatibility** — whether a newer writer can emit documents accepted by older readers;
+- **semantic compatibility** — whether conforming consumers assign the same portable meaning; and
+- **migration compatibility** — whether a deterministic document transformation is available.
+
+No compatibility dimension is implied merely because two releases share a version prefix.
+
+## Release artifacts
+
+An immutable Core preview release contains, at minimum:
+
+- the tagged Core prose specification;
+- the tagged JSON Schema with a versioned `$id`, plus any superseded schema still published;
+- examples, document-conformance cases, and the evaluation corpus from the same commit; and
+- release notes identifying maturity, compatibility, and known limitations;
+- `.tar.gz` and `.zip` artifact bundles from that commit; and
+- SHA-256 checksums and GitHub build-provenance attestations for those bundles.
+
+If prose, schema, or conformance artifacts disagree, the conflict is a specification defect. The
+artifact roles and conformance boundaries in the tagged Core specification determine which claim
+each artifact is permitted to make.
+
+## Deprecation and support
+
+Research-preview releases have no compatibility or security service-level guarantee. Maintainers
+may deprecate or remove behavior in a later `0.x` release, but must record the change in release
+notes. A stable release will require a separate support and deprecation policy before publication.
+
+## Independently versioned Policy draft companion
+
+Policy uses the scoped tag `policy-v`, where `releaseVersion` is
+strict three-component SemVer followed by `-draft.N` (unsigned ASCII decimal N,
+no leading zero except `0`). This route is draft-only; it creates no stable
+maturity or support guarantee. Only the tag and maintainer-published GitHub
+release together establish an immutable Policy release. The prepared first
+identifier is `policy-v1.0.0-draft.1`; preparation does not publish it.
+
+A Policy release names the exact document `formatVersion`, supported Core consumer
+`specVersion`, closed schema identities and complete corpus/digest in its own
+versioned JSON release manifest beside the release notes. Those values and an
+artifact's x.y.z `version` are independent of the companion release identifier.
+The existing builder/workflow shares archive, checksums and build provenance with
+Core, but validates a Policy tag against its own manifest and explicit draft RFC
+acceptance. Core tags still require exact Core schema/document/evaluation pins;
+Core bundles exclude independently versioned Policy schema/corpus directories.
+
+First publication freezes the normative meaning, schema resource bytes/URLs and
+complete corpus inputs/results for an exact Policy format. A later draft release
+for that same format retains those pins and can change packaging or non-normative
+explanation only. Changed acceptance, interpretation, bounds, refusal semantics
+or grammar requires a new exact format selector, new versioned schema resources
+and reviewed compatibility/migration guidance. Published resource URLs, release
+manifests and tagged artifacts are preserved; they are never repointed.
+
+A Policy offline-reader conformance claim names the exact independent Policy
+release, format, supported Core consumer version and complete published corpus
+manifest/digest; every row must pass. No claim is available before publication.
+It establishes supplied-document agreement only, with the scope/exclusions of
+[the companion](spec/policy.md). Stable maturity still requires the independent
+implementation evidence in the existing governance and RFC process.
diff --git a/internal/policy/official/conformance/policy/1.0.0/ADOPTION.md b/internal/policy/official/conformance/policy/1.0.0/ADOPTION.md
new file mode 100644
index 00000000..afb285d8
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/ADOPTION.md
@@ -0,0 +1,92 @@
+# RFC 0023 conditional draft disposition
+
+On 2026-10-19 the maintainer directed: “Accept the bounded draft after CI; record
+the limited public review”. This authorizes acceptance of the immutable
+supplied-document surface in [spec/policy.md](../../../spec/policy.md), its
+Policy offline-reader class and the independent draft release route, effective
+only when [PR 218](https://github.com/Judgment-Pack/judgment-pack-spec/pull/218)
+merges after required CI passes. The PR carries the proposed Accepted status;
+the default-branch RFC remains Review until merge. This record claims no completed
+merge, publication, stable maturity, product admission or consumer adoption.
+
+## Actual limited public review and maintainer decision
+
+The initial bounded assessment read [issue 211](https://github.com/Judgment-Pack/judgment-pack-spec/issues/211)
+and its one comment, [PR 212](https://github.com/Judgment-Pack/judgment-pack-spec/pull/212),
+its six comments, zero submitted reviews and zero inline review comments. The
+issue opened 2026-10-18 at 03:01:59 UTC; PR 212 opened at 03:15:52 UTC and merged
+at 17:50:10 UTC as `8a56a95d555c17640d2db4984363b779536b3c2a`. That merge adopted
+only a Draft RFC/non-normative prototype, expressly withholding companion adoption.
+The issue update at 20:55:02 UTC reports corrected candidate work in PRs 216/217,
+124 matching vectors and two Codex-assisted readers, while keeping the RFC in
+Review and independent evidence outstanding.
+
+All substantive comments in that original history were by the maintainer; one
+other comment was a contribution bot. No independent technical objection,
+endorsement or implementation review was recorded there. The proposal and
+corrected candidate were public from 2026-10-18 to this 2026-10-19 decision, a
+limited period with no demonstrated outside stakeholder participation. Silence
+is not acceptance or evidence of interoperability.
+
+RFC 0000 sets a reasonable public period according to complexity, with no fixed
+minimum. The maintainer explicitly elects to proceed after this limited period
+for the **bounded draft**, conditional on required green CI and PR 218 merge,
+rather than treating the earlier non-normative merge or absent comments as
+acceptance. The exact selector/bounds/coverage surface and deferred items below
+limit that disposition. Subsequent technical objections remain grounds for
+review through the existing RFC process; the stable independent-evidence bar
+is unchanged. This is a disclosed maintainer judgment, not outside review.
+
+The PR 212 same-vendor readiness review and response preserve findings F1–F6.
+F1's exact-byte/multiple-media-type defect was fixed; F6's typed references,
+original bounds and requirements deferral were addressed. F2 release registration,
+F3 current authority, F4 external lifecycle and F5 private-to-portable migration
+remain product-owned boundaries, not solved by this offline companion.
+
+## Exact review record and standing exception
+
+The separate reviewer, OpenAI `gpt-6.1-sol` at `xhigh` on 2026-10-19, inspected
+frozen tree `60b04d452efa49032a0cc7d3ac1e55a3900410a8`, subsequently committed
+unchanged as `7f118278e480d88e53e6a6be2fe084610a2bebf9`. The drafting worker also
+used OpenAI `gpt-6.1-sol` at `xhigh`. The reviewer reported **no material findings**
+in that bounded artifact; no finding was silently discarded. The complete
+report, context and supplied brief are in
+[the PR review record](https://github.com/Judgment-Pack/judgment-pack-spec/pull/218#issuecomment-6273316525).
+The report SHA-256 is
+`6506927d179cfe165122c45e6fafc856e6dd975e1c51d63abda984aacfd711e0`.
+
+This is separate-agent **same-vendor** review. The maintainer applies the standing
+temporary different-vendor-review exception, originally recorded for PR 212 in
+[this explicit instruction](https://github.com/Judgment-Pack/judgment-pack-spec/pull/212#issuecomment-6253085953),
+to this bounded promotion. It does not amend the general governance rule or turn
+Codex review into cross-vendor review, outside stakeholder review or independently
+authored implementation evidence. Historical review records remain unchanged.
+
+Required CI on the initial promotion found the Core fixture audit incorrectly
+counting Policy-owned JSON as Core fixtures. The explicit namespace fix and its
+ownership regressions change tests only. The final CI-fix/acceptance delta is
+subject to the PR's final bounded review and required CI before merge; the earlier
+report is not claimed to cover an unidentified later commit.
+
+## Exact draft dispositions effective upon merge
+
+| RFC question | Draft disposition and condition to reopen |
+| --- | --- |
+| 1. Selector, bounds and closed grammar | Accept exact `formatVersion: "1.0.0"`, strict independent x.y.z artifact versions, 262,144 parsed bytes, depth 32, 128-character number literals/exponent magnitude 308, 1,048,576 narrative/review/informational bytes, 4,194,304 original bytes, 16,777,216 distinct retained bytes, 16 registrations, and the declared closed field/count maxima; retained bytes and optional `jps-canon`, UTF-8 anchors, pack-only typed references and scoped total coverage. Refuse aliases/unknown members/structured requirements. No evaluator or live authority changes. A grammar/bound change requires explicit selector and compatibility review. |
+| 2. Review trust, signatures and cross-workspace adoption | Defer. Interpretation bytes prove no reviewer identity or authorized sign-off. Reopen with a concrete cross-workspace export need, authentication/trust profile, exact reviewed candidate/workflow binding and adversarial verification vectors. |
+| 3. RFC 0011 currency registry | Defer; do not adopt or supersede the Draft registry. Reopen with an RFC 0011 disposition and explicit distinction between offline membership and current authenticated admission. |
+| 4. Provider lifecycle/freshness | Defer to owning hosts. Read support, byte identity, opaque revision or missing file cannot establish publication/withdrawal. Reopen with a real provider's demonstrated revision/lifecycle/freshness evidence and reviewed mapping/reconciliation/enforcement tests. |
+| 5. Teams, quorums, roles and approval | Defer. No universal separation-of-duties rule or imported roles; honest local self-review remains a host workflow choice. Reopen with a team host contract covering quorum/workflow revision, role revocation, expiry and transactional candidate/publication binding. |
+| 6. Graph/composition closure | Defer and refuse graph consumers. Reopen with an adopted owning graph/execution contract, complete trusted closure registration and missing-dependency/cycle vectors; caller-supplied lists prove no complete closure. |
+| 7. Independent readers / adapters | Genuinely independent authorship evidence remains absent and is required before stable maturity under the existing rules. Reopen with independently authored readers reproducing the same immutable corpus, provenance and disagreements; adapter work needs a concrete interchange demand. |
+
+
+The independent companion release route was selected by the maintainer. The
+first release identifier is `policy-v1.0.0-draft.1`; this source record alone
+establishes no publication. The exact tag and a maintainer-published GitHub
+release must both exist. This draft
+disposition includes the Policy-scoped VERSIONING.md amendment and shared release
+builder/workflow routing, without changing Core versions or evaluator semantics.
+After the final bounded review/dispositions and required CI, PR merge makes this
+draft disposition effective. A later tag and maintainer-published release must
+pass the separate exact-source/pin/publication gates.
diff --git a/internal/policy/official/conformance/policy/1.0.0/MIGRATION.md b/internal/policy/official/conformance/policy/1.0.0/MIGRATION.md
new file mode 100644
index 00000000..da69ed31
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/MIGRATION.md
@@ -0,0 +1,61 @@
+# Explicit migration from prototype 0.0.2
+
+This is the breaking migration to the **Policy draft** `formatVersion: "1.0.0"`,
+whose acceptance takes effect only upon required green CI and PR 218 merge.
+The default-branch RFC remains Review until then; publication is a separate step. Neither semver arithmetic nor opening a document consents
+to migration. The draft reader refuses prototype documents; it never upgrades
+or reinterprets them. Prototype 0.0.1 needs its own explicit path to 0.0.2 and is
+not silently accepted by this guide.
+
+1. Keep the original 0.0.2 Policy, adoption, fixture and all retained bytes. Record
+ their exact digests and the original prototype pin. Migration creates new
+ reviewable artifacts; it does not overwrite history.
+2. Obtain explicit author/operator intent to migrate, including which exact Policy
+ versions, consuming Pack and adoption scope are intended. Explicitly choose
+ `workspace-managed` for former `desk-managed` content, or retain
+ `externally-managed` intent. Do not infer intent from an imported source's owner,
+ publisher, folder, citation, access response or approval history.
+3. Preserve the source, narrative, interpretation/review-basis and consumer bytes
+ **exactly**, with their existing raw digest, length and declared media types.
+ Preserve anchors, local section/source IDs, opaque provider revisions and Pack
+ `specVersion`/identity. Do not extract, normalize, reserialize or rewrite those
+ files just to satisfy migration. Re-extraction or changed meaning is separate
+ authoring and requires a fresh review.
+4. Construct a new Policy by removing the complete `prototype` wrapper and adding
+ the exact string `formatVersion: "1.0.0"`. Replace `desk-managed` with the
+ explicitly selected `workspace-managed`. Preserve the rest of the supported
+ content/provenance/sections. Choose the Policy's new immutable identity/version
+ explicitly: preserve its stable series ID only with a new artifact version, or
+ fork to a new ID. Never reuse an existing immutable `(id, version)` with changed
+ bytes. This offline checker cannot detect historical reuse on its own.
+5. Serialize and retain those new Policy bytes. Regenerate the raw content digest
+ and length and, when requested, the `jps-canon` canonical identity. Update every
+ dependent adoption's exact Policy reference (ID, artifact version, bytes and
+ optional canonical digest); a stale old hash must refuse. Keep the exact Pack
+ bytes/reference; a different Pack is a separate new interpretation.
+6. Construct a new adoption with `formatVersion: "1.0.0"` and no prototype wrapper.
+ Choose its immutable identity/version explicitly. Preserve or deliberately
+ re-review its exact scope and total coverage; do not fill omissions or upgrade
+ manual/pending/out-of-scope clauses automatically. Retain new adoption bytes,
+ regenerate their identities wherever referenced, and validate the full supplied
+ material under the draft checker and vectors.
+7. Re-review dependent release/registration/export snapshots that pin changed Policy
+ or adoption bytes. Keep historical snapshots and runs on their original pins.
+ A new snapshot is an explicit host operation, never a side effect of parsing or
+ importing a document. Host authority and current admission remain separate.
+
+No approval, signature, authenticated review assertion, role, permission, lifecycle
+state, publication receipt or dispatch grant migrates automatically. Existing
+review-basis bytes remain historical explanations only. Even if every narrative
+byte and clause ID is unchanged, a host must obtain fresh applicable authorization
+for its new candidate and workflow, under its own contract. Informational sources
+stay informational; making one governing requires a reviewed new adoption.
+
+The three retained examples intentionally use new Policy/adoption IDs and retain
+the old consumer/source/narrative/interpretation files unchanged. Their new hashes
+are reproducible examples, not migrated organizational approvals. There is no
+migration helper or implicit parser fallback in this slice.
+
+Promotion from the proposed 1.0.0 grammar changes no Policy/adoption artifact
+bytes. See [PROMOTION.md](PROMOTION.md) for schema URNs and result-envelope
+maturity changes; do not rewrite retained documents to change their maturity.
diff --git a/internal/policy/official/conformance/policy/1.0.0/PROMOTION.md b/internal/policy/official/conformance/policy/1.0.0/PROMOTION.md
new file mode 100644
index 00000000..1af20d07
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/PROMOTION.md
@@ -0,0 +1,42 @@
+# Promotion and identity map
+
+This promotes the exact corrected candidate at Spec commit
+`a74a440cfc31d0e135cdc8035f3474b17f27f320` into the bounded draft approved by the
+maintainer conditional on required green CI and PR 218 merge. The default branch
+remains Review until merge; no completed adoption or publication is asserted here.
+The [candidate pin](candidate-1.0.0-pin.json) records every historical candidate
+file; [prototype-0.0.2-pin.json](prototype-0.0.2-pin.json) retains the original
+prototype baseline `8a56a95d555c17640d2db4984363b779536b3c2a`. Neither old tree is
+edited, redirected, reclassified or imported by the new checker.
+
+| Surface | Proposed candidate → draft promotion |
+| --- | --- |
+| Policy and adoption document grammar | Same exact `formatVersion: "1.0.0"`; every supported field, bound, URI rule, anchor, reference and coverage meaning is unchanged |
+| Policy/adoption and all retained example/vector inputs | Byte-for-byte identical, including content digests, Pack pins, narrative, source, interpretation, optional canonical identity and invalid counterexamples |
+| Schema resources | `urn:jps:proposal:policy-companion:1.0.0:{common,policy,governing-adoption,fixture,vectors}` becomes `https://judgmentpack.org/schema/policy/1.0.0/{...}.schema.json`; references change with the resource identity |
+| Public document schemas | Versioned under `schema/policy/1.0.0/`; closed grammar preserved; schema URLs identify exact format resources, not evidence of publication |
+| Reader valid result / capability maturity | `proposed-draft` becomes `draft`; valid result is exactly `{"status":"valid","formatVersion":"1.0.0","maturity":"draft"}` |
+| Reader refusal objects | Unchanged finite code-only objects and phase ordering |
+| Vector carrier | New schema identity; suite version remains exact `"1"`; manifest and valid expected results use `draft`; all 124 input cases and refusal answers stay unchanged |
+| Capability exclusions | `adopted-or-stable-format` becomes `stable-format`; all operational/trust/evidence exclusions remain |
+| Supported consumer schema | Byte-identical retained Core `0.2.0-draft` schema copy; the new reader uses that frozen copy instead of a future mutable current-Core path |
+| Existing Core / Dialect / prototype | No schema, corpus, evaluator, content or canonicalizer changes |
+
+Schema resource identities and result-envelope maturity are observable changes. A
+consumer pinning old schema URNs or comparing whole old results must explicitly
+select the new schema/checker/result profile. An existing software reader pinned
+to historical Spec bytes remains experimental for that exact candidate; a
+software version number or successful existing run cannot advance its Spec pin
+or conformance claim. Implementers must record the new immutable Spec commit and
+released corpus when available, update schema resolution and expected metadata,
+and verify the exact retained input vectors.
+
+Do not reserialize existing Policy/adoption documents merely to promote maturity:
+there is no maturity field in those artifacts and their content identity remains
+unchanged. A prototype 0.0.2 document has a different grammar and requires the
+separate [explicit migration](MIGRATION.md), new immutable identities and dependent
+snapshot review. No approval, role, permission or host lifecycle migrates.
+
+The reference checker reuses this author's existing strict reader/canonicalizer.
+This promotion and a second language port do not establish independent authorship
+or cross-vendor review.
diff --git a/internal/policy/official/conformance/policy/1.0.0/PUBLICATION.md b/internal/policy/official/conformance/policy/1.0.0/PUBLICATION.md
new file mode 100644
index 00000000..7805e5df
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/PUBLICATION.md
@@ -0,0 +1,83 @@
+# Independent Policy draft publication
+
+The maintainer selected independent companion draft releases with Core unchanged.
+The first release identifier is **`policy-v1.0.0-draft.1`**: first draft
+publication of exact document grammar `formatVersion: "1.0.0"`. Naming it in a
+source branch establishes neither publication nor stable maturity; publication
+requires the exact tag and a maintainer-published GitHub release. The maintainer approved the bounded draft conditional
+on required green CI and PR 218 merge; the default-branch RFC remains Review
+until that merge. The acceptance decision is limited to draft maturity.
+
+## Exact identities and existing release machinery
+
+`policy-v` is the Policy-only namespace; `releaseVersion` must be
+strict three-component SemVer followed by `-draft.N`, with an unsigned decimal
+`N` and no leading zero except `0`. No stable Policy tag is supported. The first
+release identifier is `1.0.0-draft.1`; its base deliberately matches grammar
+1.0.0, but equality or a shared prefix never implies compatibility. The release
+identifier, document `formatVersion`, immutable artifact x.y.z `version`, Core
+consumer `specVersion` and local vector-carrier version `"1"` are separate values.
+
+The same `tools/build_release.py` and GitHub release workflow route this scoped
+namespace to a closed [release manifest](../../../releases/policy-v1.0.0-draft.1.json).
+The builder checks exact metadata/schema/corpus/format pins, RFC draft acceptance,
+release notes, tag/commit/HEAD equality and a clean tracked worktree. The existing
+archive, SHA-256 checksum, draft-prerelease and GitHub build-attestation steps are
+shared with Core. No alternate publisher or bypass of Core checks is introduced.
+
+The Policy bundle prefix is `judgment-pack-policy-1.0.0-draft.1/`; archive names
+are `judgment-pack-policy_1.0.0-draft.1_artifacts.tar.gz` and `.zip`, accompanied by
+`checksums.txt` and build provenance. It contains only the selected Policy prose,
+versioned schemas, complete 124-row input corpus/examples/checker, exact release
+manifest/notes, pinned dependencies and shared strict-reader/canonicalizer helper,
+the required frozen Core `0.2.0-draft` consumer schema, referenced companion prose and archived RFC
+candidate/prototype provenance. Historical material stays explicitly unadopted.
+Core bundles continue on `v` with their existing exact schema and
+corpus checks; independently released Policy schemas/corpus are excluded from
+Core bundle selection. No Core `specVersion` or evaluator semantics change.
+
+## Frozen format meaning and discovery
+
+The public document schema identities are exactly
+`https://judgmentpack.org/schema/policy/1.0.0/{common,policy,governing-adoption}.schema.json`.
+The local fixture/vector carrier schemas use `fixture` and `vectors` at that
+same versioned prefix. The site serves those exact resource bytes. Before the
+first immutable release they are candidate resources; resolving a URL proves no
+adoption. On first publication those resource URLs and all normative format
+bytes/corpus inputs are frozen. The release manifest pins their digests.
+
+Another draft release for the same exact format MUST retain those format/schema/
+corpus pins. It may revise packaging or non-normative explanation, with explicit
+release notes. It MUST NOT change existing validity, interpretation, refusal
+meaning/order, schema bytes or expected corpus answers while continuing to call
+that input grammar `1.0.0`. A semantic change requires an explicit new format
+selector, new schema resource URLs and reviewed migration/compatibility guidance.
+No URL already published by a prior release is repointed. Each tag's JSON manifest
+and notes remain available; schema identity/compatibility is never inferred from
+release or artifact version arithmetic.
+
+The class's claim names the independent Policy tag/release and exact corpus
+manifest/digest, plus format and supported Core consumer version. Until the tag
+and maintainer-published GitHub release both exist, no immutable publication or
+Policy offline-reader conformance claim is available. Draft RFC acceptance alone,
+an experimental software release and two same-author ports do not establish it.
+
+## Gates before any publication
+
+The maintainer authorized bounded draft acceptance after CI and recorded the
+limited public review in [ADOPTION.md](ADOPTION.md). It takes effect only upon
+PR 218 merge after required green CI and the final bounded review/disposition.
+The earlier separate same-vendor review and standing temporary different-vendor
+waiver are identified there; neither supplies outside stakeholder review or
+independent implementation evidence, and the general governance rule is unchanged.
+
+The PR carries the proposed Accepted status and refreshed exact pins; the default
+branch remains Review until merge. A later production tag must point to the
+accepted merged source and pass the shared builder's exact manifest/tag/commit/
+HEAD/clean-tree gates. The builder still refuses a source whose RFC status is
+Review. Tag creation, the workflow's draft prerelease and maintainer publication
+are separate actions; this source document does not establish their occurrence.
+
+The [prepared release notes](../../../releases/policy-v1.0.0-draft.1.md) identify
+reader, writer, semantic and migration effects. Stable maturity remains blocked
+on genuinely independently authored readers/evidence under the existing rules.
diff --git a/internal/policy/official/conformance/policy/1.0.0/README.md b/internal/policy/official/conformance/policy/1.0.0/README.md
new file mode 100644
index 00000000..bb97cd66
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/README.md
@@ -0,0 +1,34 @@
+# Policy offline reader — draft format 1.0.0
+
+This is the supporting material for the [Policy draft companion](../../../spec/policy.md)
+and [RFC 0023](../../../rfcs/0023-policy-companion.md). The maintainer approved the
+bounded draft conditional on required green CI and PR 218 merge; until then the
+default-branch RFC remains Review. Immutable release publication remains separate.
+The 124 vectors become a released corpus only when their exact Policy tag and a
+maintainer-published GitHub release both exist. Passing them alone creates no
+conformance, approval or authority claim.
+
+- [Draft contract](../../../spec/policy.md), [versioned closed schemas](../../../schema/policy/1.0.0/).
+- [Portable vector input grammar](vectors/README.md), [exact manifest](vectors/manifest.json).
+- [Capability record](capabilities.json), [promotion and identity map](PROMOTION.md).
+- [Explicit prototype migration](MIGRATION.md), [publication plan](PUBLICATION.md).
+- [Public-process record and conditional draft disposition](ADOPTION.md).
+
+The examples retain the proposed candidate's exact Policy, adoption, Pack, source,
+narrative and interpretation bytes. The checker continues to use the repository's
+existing `tools/dialect_verify.py` strict reader/canonicalizer; this reuse does not
+provide independently authored implementation evidence.
+
+With the repository's pinned Python 3.12 dependencies:
+
+```sh
+python conformance/policy/1.0.0/verify.py --capabilities
+python conformance/policy/1.0.0/check_vectors.py
+python -m unittest discover -s conformance/policy/1.0.0 -p 'test_*.py' -v
+```
+
+The independent Policy draft bundle selects these artifacts; Core bundles exclude
+the independently versioned schema/corpus directories. The site exposes versioned
+schema resources and conditionally approved draft prose. Its raw artifact
+directory is separate from the independent release bundle; obtain released
+corpus bytes from the exact immutable Policy release. No Core corpus changes.
diff --git a/internal/policy/official/conformance/policy/1.0.0/candidate-1.0.0-pin.json b/internal/policy/official/conformance/policy/1.0.0/candidate-1.0.0-pin.json
new file mode 100644
index 00000000..aafcc5de
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/candidate-1.0.0-pin.json
@@ -0,0 +1,178 @@
+{
+ "repository": "https://github.com/Judgment-Pack/judgment-pack-spec",
+ "commit": "a74a440cfc31d0e135cdc8035f3474b17f27f320",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft",
+ "files": {
+ "MIGRATION.md": "sha256:0602a092ae1c6f670e0b440f3df33de1eb4d825bf714af50143151882e674e34",
+ "README.md": "sha256:21364149bbd76cc7bc2b917b898d0fa79739bd454f94d4af3510e0e1a6ea88f7",
+ "capabilities.json": "sha256:57977501550cb90de46d9eb88016725949f1eda83be470ff467804e8f393a287",
+ "check_vectors.py": "sha256:4a7f5842a685c0085908aeabe05fdd29df8ebcbc8dd986112fa947989d056230",
+ "common.schema.json": "sha256:a26362280ac4cf0ba7a15a6c382ee8c61df97c78be4ef291f1107db24f28dd06",
+ "examples/data-access/adoption.json": "sha256:98294b5df0876cc793f236fa5184380aa37f2e459e1f630a5e613237404c2ec0",
+ "examples/data-access/consumer-pack.json": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "examples/data-access/fixture.json": "sha256:95575efc4fc7571089f17b7684c9ea66c7f16d52cb5b7032c0c494f3f73c25db",
+ "examples/data-access/interpretation.txt": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "examples/data-access/narrative.txt": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "examples/data-access/policy.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "examples/data-access/source.txt": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "examples/procurement/adoption.json": "sha256:e9c871b2e7dc7448e46b2d4d347beb504bbe0a691be11df4283a95a693208703",
+ "examples/procurement/consumer-pack.json": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "examples/procurement/fixture.json": "sha256:bd05d532515eff20322a88c8cbb34899849479f4f4fef8a1f2e3d577a2b96205",
+ "examples/procurement/interpretation.txt": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "examples/procurement/narrative.txt": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "examples/procurement/policy.json": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "examples/procurement/source.txt": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "examples/refunds/adoption.json": "sha256:7c7cd121fc4510fff19b8bcaf120ce1a9cb3f7e60b8e811ce9be917799367bc8",
+ "examples/refunds/consumer-pack.json": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "examples/refunds/fixture.json": "sha256:48b47e5ca483e53ee4c943409f9892b518108cd0f94ead4f2715852d25a74d60",
+ "examples/refunds/interpretation.txt": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "examples/refunds/narrative.txt": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "examples/refunds/policy.json": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "examples/refunds/source.txt": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "fixture.schema.json": "sha256:70f72c813ecbf988087de1de41d0871b24dec340e79af5bfe8e488a51ce9cd1b",
+ "governing-adoption.schema.json": "sha256:2a6a55c0efdb5fc25a52bc645eda33ca67247e7db83a0de21204ef6a28432dcb",
+ "policy.schema.json": "sha256:21c2a3a3f9763cecfb9348938e078384a9abbf3e55fb8126704cf8a55555fcd7",
+ "prototype-0.0.2-pin.json": "sha256:48a264397902303c0373c4ae11e2bde9b55474f7ff76b33e1fdc3f919c70bacb",
+ "test_contract.py": "sha256:0a1ad1f90efa0a257851e7f4c420d494d2e38d59405b0139337986f077b070e9",
+ "vectors/README.md": "sha256:d27b79c1932261d3bf64abb07d5c95ccab0a9016e83412c40a129747fdb8eaec",
+ "vectors/documents/aggregate-max.json": "sha256:356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "vectors/documents/aggregate-over.json": "sha256:356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "vectors/documents/aggregate-shared-media-counted-once.json": "sha256:356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "vectors/documents/anchor-empty-range.json": "sha256:f57abd537598b6f2d4f21f5531cc8b287cb8a408174b1699afe23ab862bba431",
+ "vectors/documents/anchor-outside-narrative.json": "sha256:aa0fed3939d88597f5a2eab96e1a9305f5671c9d9ffc1140c3a79a0a985d24e9",
+ "vectors/documents/anchor-over-bound.json": "sha256:0f10c69c68a792e43de7b56978bce3073f2baba2ef026607d5c21104e113916f",
+ "vectors/documents/anchor-stale-digest.json": "sha256:f15662d3349adebe3f37358da15f6c1cbea7a531ead7be55b13a83e6fea865f0",
+ "vectors/documents/anchor-utf8-split.json": "sha256:dbb8e91eeaaec4ca6afa0b60ed9ab7621fc46b464052181fc15a7207880d8485",
+ "vectors/documents/approval-field.json": "sha256:b6d55b494d997d827ceda4f0c7b0ff4c644171928f22b2c64bff7ba049cdaae6",
+ "vectors/documents/artifact-build.json": "sha256:d8e6a2f1de1400d0f93deb768709a79dd2608581a59f3d91c48c0fe46b53da3e",
+ "vectors/documents/artifact-independent.json": "sha256:b29b0d41f9c53df4ccf45b304e4307848a5aca82f9669ce6a6f532ba9eca7efa",
+ "vectors/documents/artifact-leading-zero.json": "sha256:9bac870cd83f3ce25b4d02c820d962d084de92ea0ccdefb1b4a86e194ece3be0",
+ "vectors/documents/artifact-max-256.json": "sha256:79b1ac4516f3be2234b1a333a09679474c8f0f9d4c8743cf0b552eaaa97ff06c",
+ "vectors/documents/artifact-newline.json": "sha256:7b398d8f7062dc484dd919271c3cb4d090389604a1504b356892cedf06e29431",
+ "vectors/documents/artifact-number.json": "sha256:4d81f8abe5de7580d5896bc2538dc7c7bb6eca300a7fb3a8dab7bf8ad9525cb1",
+ "vectors/documents/artifact-over-256.json": "sha256:eb73ca4e4a698530f0dee89fefdd9a0914ca0af55202c4da478797a9de491278",
+ "vectors/documents/artifact-two-components.json": "sha256:9d2d77db996adea115097fd4ef3c4a3ffbe4a08799aaea256d00cf3e94d5969e",
+ "vectors/documents/bom.json": "sha256:aa25e978046d680ef8740d837e6de5bc1e2a2dc6089dbda1012544b538d53f65",
+ "vectors/documents/companion-float.json": "sha256:eb454acf3392a959782b8b7e53332d65ebd0c6607d77a1f17561f91534987cee",
+ "vectors/documents/companion-unsafe-integer.json": "sha256:98f3e87d38e17bce0a5e1b2076ae16f78bdf45001dfd192f39be0fe94a50116d",
+ "vectors/documents/consumer-fallback-unknown-pack.json": "sha256:8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "vectors/documents/consumer-fallback-unknown.json": "sha256:39fb7ccbef49a24c8f0f2241eb8413c56521df4c4aacd9b75206301718a8aaf4",
+ "vectors/documents/consumer-graph.json": "sha256:f380c38339a85ab4ef31c23640b319f85bc7783e8e75c41d11ae741196b604d1",
+ "vectors/documents/consumer-rule-id-duplicate-pack.json": "sha256:93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "vectors/documents/consumer-rule-id-duplicate.json": "sha256:4a1285549c9649cbdd756fe836010d1e4e159f36a0bc9cf7a0ad704c38a38b4a",
+ "vectors/documents/core-decimal-raw-pack.json": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "vectors/documents/core-decimal-raw.json": "sha256:93a8d631bd4244f3b309451071488b35e064ab3618934a76b0d9ebf46cb5e442",
+ "vectors/documents/core-decimal-requested-canon-pack.json": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "vectors/documents/core-decimal-requested-canon.json": "sha256:d4f9c354aaaf6093d5034cf6adcd8c01bb1aa9cbcf32f9ccafdd9aa2790bb737",
+ "vectors/documents/core-exponent-308-pack.json": "sha256:52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "vectors/documents/core-exponent-308.json": "sha256:c9275574c422b7520ae07d85bf6491d895b7fc62689308d6338df55180c3cfc0",
+ "vectors/documents/core-exponent-over-pack.json": "sha256:7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "vectors/documents/core-exponent-over.json": "sha256:0cdf2672ddded5c222e3b18c7a9b7041f0175591be323a39b5bddff6672e5763",
+ "vectors/documents/core-number-128-pack.json": "sha256:0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "vectors/documents/core-number-128.json": "sha256:5e97a1562791b398a9d7e70533c595a568b889c7966c43ea43eeadf751de6417",
+ "vectors/documents/core-number-over-128-pack.json": "sha256:bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "vectors/documents/core-number-over-128.json": "sha256:4372c8016d83883bc944428d5d09510abac11dc10501cc74cbb7d577913a3eec",
+ "vectors/documents/core-unsafe-int-raw-pack.json": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "vectors/documents/core-unsafe-int-raw.json": "sha256:880c2b146822bd4ca14b5bb79953f706aa770f0b61afc7c76312ed4a23a1d715",
+ "vectors/documents/core-unsafe-int-requested-canon-pack.json": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "vectors/documents/core-unsafe-int-requested-canon.json": "sha256:f0dbc21fab5b69614e11c9948a897a1ec9f7e3dc3d8bb23e41bbd2521220ff9f",
+ "vectors/documents/coverage-duplicate.json": "sha256:5c804382923831378fd72aa6a4a115cefc5c59357c7fd5ff7fb3b57cec158a0d",
+ "vectors/documents/coverage-omitted.json": "sha256:4fad299227c43ff3d3fda7cadd881398f7b908bfa6177abb475e50fe2f3e7c65",
+ "vectors/documents/coverage-outside.json": "sha256:f53966ceab71d7d1577684d064c52d3515f266da03e811e1444408875757cb5d",
+ "vectors/documents/depth-32.json": "sha256:4e04cac422d9ecd4a5f6221653eeb4eaf29077cf3f588cd36bf6dc8ead76971f",
+ "vectors/documents/depth-33.json": "sha256:eac9bf029c22e177c74309fb891e3351dccfb04f055127ea82dc2dc3136cd899",
+ "vectors/documents/desk-managed-alias-refused.json": "sha256:5234fd95d7550559cd2c2147bed06f9ff6f905b2e4607e8eeebfef03a778698c",
+ "vectors/documents/document-max-bytes.json": "sha256:515b22dea881243654a2c04aacd1fae4079e914bb63c9fd028a21821c0add188",
+ "vectors/documents/duplicate-json.json": "sha256:e36957f702ac6bd47232355cad2b9a15a1bc3d6a23f0cbd5bb2d7bf4d33e8288",
+ "vectors/documents/duplicate-policy-identity.json": "sha256:07f804bccb31243a806fa8bf820089bf5b2328cd68a0a267f00056f0f161b2ed",
+ "vectors/documents/format-0.json": "sha256:90e517db584be09a68876e0e12e1fdcfa6bca002cfc249e884f76c009e2646b3",
+ "vectors/documents/format-2.json": "sha256:8c2a26c5f677e592d86b2e216439d45ce1846fd409c66e0b8bc1e827de18e41d",
+ "vectors/documents/format-before-canon.json": "sha256:d945aff06cc556a99fee0d475f16fd5f0fabb96965e74427cb822b465c8b1bf2",
+ "vectors/documents/format-before-shape.json": "sha256:179cd26a351c7bf45c2fca5bc06ba835aa6eaa1a546cec4aa900706a697598f5",
+ "vectors/documents/format-bool.json": "sha256:5dc2e06bd54f5207ecdb5ba27ec2b80f772193a971f06106067aed2ec594bbbd",
+ "vectors/documents/format-int.json": "sha256:aff42b4b0a8e641cc5c92c661cdde3537745a2c2466d2b79c7d01e1a6493708b",
+ "vectors/documents/format-leading-zero.json": "sha256:c6a980c290cd29ee4c15883a88e4c80de0f99e4605a5f3e094067bd4a221d3b2",
+ "vectors/documents/format-missing.json": "sha256:4ea51f8934e58095eee944853cc5541124ea94f0b24c09078ac27f465f32d3bc",
+ "vectors/documents/format-newline.json": "sha256:dc41a327f8e1c762c6d2326badcfc829814c970f7afbbbbc54f87d585eea74da",
+ "vectors/documents/format-patch.json": "sha256:dcbac865d354a2865bf1d17a0197c603f5a120326958bb7e8cbd95ca8dc20355",
+ "vectors/documents/format-short.json": "sha256:93f0b639cbb98ad9ec64d16c09d58010f951c5664962e8cf1838da5b030a5769",
+ "vectors/documents/format-suffix.json": "sha256:debe48d95d872019bc1bdfadff03f645e14dfed66dd034d0d77d95520ca10f5c",
+ "vectors/documents/format-unicode.json": "sha256:e0ba64d6e3ac4e5f72cbcbea04b9dfe5052747d56244950835feaf08c9db041a",
+ "vectors/documents/format-v-prefix.json": "sha256:d18d8d65f5126fde63083e1594ef93f0944e092d98e29d54ee3dfe1cc0d8a66a",
+ "vectors/documents/informational-max.json": "sha256:569a5b0680eafb6308c2984912e4a702054e6839a6c484bec7eb68ae0fc8aad8",
+ "vectors/documents/informational-over.json": "sha256:361db3f18d7640ac7ecaebfe28e45436ca10bc8ebc806fd23f1ac5145ca3c472",
+ "vectors/documents/invalid-utf8.json": "sha256:36781faac995a68b69aab7d540747e0c70efed427e66a608cdf64fc4feaaff12",
+ "vectors/documents/kind-id-confusion.json": "sha256:d7f690d0ca4b7962916984ee5ee92b70c3b7464016c0e003b0a3bbf4560127c8",
+ "vectors/documents/limited-scope-missing-basis.json": "sha256:9d9a9b30e6bfa07ca3aa059f14f1011bf2b1dcee92e218d8ea6656b8bad65584",
+ "vectors/documents/limited-scope-unknown.json": "sha256:670a45f40a0ff1b21a12481f962f50ae63618d79fa30932882e45ed645a64bdd",
+ "vectors/documents/malformed-over-depth.json": "sha256:fdc562409aec5a2549f9a1b1f21155ec3b49c71ce76b3ad080c56ba1d0543a76",
+ "vectors/documents/missing-governing-policy.json": "sha256:27f20c087c208144a234684ca1719ab9e0013dad914be4ddf507a546e1d216f8",
+ "vectors/documents/missing-narrative.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "vectors/documents/multiple-json.json": "sha256:b51f08b698d88d8027a935d9db649774949f5fb41a0c559bfee6a9a13225c72d",
+ "vectors/documents/multiple-policy-identities.json": "sha256:fedf62df6fd02f041a2ea418305804ab5ace22bc0946cd1c876c0063937ce2c5",
+ "vectors/documents/narrative-max.json": "sha256:c1592868007ae1365c18c55e7325d641f82cb4dfcf7ad71ab5cda2fb9a984504",
+ "vectors/documents/narrative-over.json": "sha256:5ec2805842ca8c97450c468d2b78c6063d48c00287a1195da476e23e36c0008f",
+ "vectors/documents/nonfinite.json": "sha256:d5b592c05dc25b5032553f1b27f4139be95e881f73db33b02b05ab20c3f9981e",
+ "vectors/documents/number-literal-over-128.json": "sha256:e2eb26c79686e936e6603fbcd49b32881635021917d175c4df147b5e21b44f5c",
+ "vectors/documents/opaque-original.json": "sha256:feb70c8c8e2a8f80e634980de161fa1bb092460969707696b5a3b5059ad71df3",
+ "vectors/documents/opaque-original.pdf": "sha256:af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "vectors/documents/original-max.json": "sha256:78948872a9e1ff6eddff492224fe06858b0f4c0e0f8439553e49d58043abc541",
+ "vectors/documents/original-over.json": "sha256:990e5847fc18a19f13a1cf7df4dd55b943e6be3c65ba87c25189405ac896c1a0",
+ "vectors/documents/permission-field.json": "sha256:87516d167771479d3b14674ddfc747e03e6a3b12175af1a6cbf91daa7ad34069",
+ "vectors/documents/policy-canon-stale.json": "sha256:45fa4fb5f254eeed1037d1374524b49ed6b94bf484a6f7b7af77a28c725c271a",
+ "vectors/documents/policy-identity-stale.json": "sha256:77f758365f4c4b772cde630b45f2045e8434511dc5d5e261c67e41de9db7a78c",
+ "vectors/documents/policy-version-ref-stale.json": "sha256:f048ab96431c7a97f44a4339b72dc03a164c0c7747a8d2aa9b95fafa099e4457",
+ "vectors/documents/prototype-selector-refused.json": "sha256:b537c0a1efb5ebc6e06e8a8e60dca2d0ad3d2c4f5e4eeab091b23c3dff4fa408",
+ "vectors/documents/registration-count-16.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "vectors/documents/registration-count-17.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "vectors/documents/requirements-field.json": "sha256:397484bcb95f136afcc4b2201a6137ef100d9cdc3c8a0b2326dbc1653d2db62c",
+ "vectors/documents/review-max.json": "sha256:729e84b3a8c8826638b7cf5f9703429658aee12eb9aafa0a5dde82f50f450718",
+ "vectors/documents/review-over.json": "sha256:9ca0faef44ae60d277c1744c358a55c219400b15a6365f519ba20059d14d153b",
+ "vectors/documents/second-policy.json": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "vectors/documents/section-id-duplicate.json": "sha256:c63007da9f867e07f68f8a91758f2054436e91263ddb7c50b8bd5dee21cf80be",
+ "vectors/documents/shared-bytes-multiple-media-types.json": "sha256:f4d2bc2c621771b30f3ae984ab3fd05a00891827c047d5a746fc44a3ad23ad1a",
+ "vectors/documents/signature-field.json": "sha256:fc4064630a3ef93cbfb46969a22600796a2954256ca42876325673e5d2ef49d1",
+ "vectors/documents/singleton-with-id.json": "sha256:232d4bbb79ff949aaf6c9e17292c5c70426595d8e761c6fefecb6d225e7d677a",
+ "vectors/documents/source-id-unknown.json": "sha256:e93860ee23385cee86b3bca725e14c3fa4f45aadd3c5cb4fa422ee3d008cd3f1",
+ "vectors/documents/stale-material-hash.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "vectors/documents/stale-material-length.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "vectors/documents/standalone-policy.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "vectors/documents/surrogate.json": "sha256:8c0c59dd0d275aadcd462a5fe12eb352cbdfeaf961eae4f85a4660521df7d2f5",
+ "vectors/documents/unknown-kind-registration-over.json": "sha256:1e2f99280db3d76fbb608f1c13a53be498d2b4bfc46836b2893383895cf076ab",
+ "vectors/documents/unknown-rule.json": "sha256:b4d8bc7e5745d897cda79f121721b388b4da9e1fe125d782dbe161cddd03aa87",
+ "vectors/documents/unregistered-media-type.json": "sha256:1c816a89de90ad710cfeb4b17bad6f0720515395e0af0b35e0394d539e605b30",
+ "vectors/documents/unsupported-element.json": "sha256:356114c27d81685231f3e6b7aa32305ae890319cf392e652e69d8ce908f5ca90",
+ "vectors/documents/uri-final-lf-pack.json": "sha256:c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "vectors/documents/uri-final-lf.json": "sha256:2f801fd7b06bf34f5c3a42973249a71bf84c421755a1ef372b1bbd4ccd3710c4",
+ "vectors/documents/uri-fragment-raw-brackets.json": "sha256:0ef6ed9f582d15475ec9b5358be05194b372f1fbc1935cc3a175e31e6c526736",
+ "vectors/documents/uri-invalid.json": "sha256:2c8f6c238143c7dfa4381ab81b78365bfd43902a7eea09b872f1ee37ca0789ba",
+ "vectors/documents/uri-ipv6-compressed.json": "sha256:6c59778a6d517c252840226d8a3056280777b04e76bf6759c731343f7d01080b",
+ "vectors/documents/uri-ipv6-double-compression.json": "sha256:b1be77321cd95c07b4ecf8baaba8751028b831e2787ba8ab6ee2a9c5e884193e",
+ "vectors/documents/uri-ipv6-ipv4-tail.json": "sha256:2c26026d56fe5564dad671c20ad55b0237d5137a291edf56c455bd217f6340c2",
+ "vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json": "sha256:0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json": "sha256:88efbe036d7386812662a46c154cf1521caf9864a9e676d35036038af754a81f",
+ "vectors/documents/uri-ipvfuture-invalid-version.json": "sha256:399ba24e5ffb43360654f3c641fc002f61d8cb2f920eed0480808912bbccc2ed",
+ "vectors/documents/uri-ipvfuture-lowercase-pack.json": "sha256:ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "vectors/documents/uri-ipvfuture-lowercase.json": "sha256:13c1a9fff73cddc63b779e619a622cc05e6ffeb4d5eb2d544a43acfe80973bbd",
+ "vectors/documents/uri-ipvfuture-uppercase-pack.json": "sha256:6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "vectors/documents/uri-ipvfuture-uppercase.json": "sha256:0ce1badc441db3a4290400dab23f2d8e5afee8fc0bf799abdb7cb01140e9ff10",
+ "vectors/documents/uri-numeric-regname-leading-zeros.json": "sha256:2ab9c70bc4c613fabe5bcbacd27ca79b73b08803e918f1755b3735ebcd96ca6f",
+ "vectors/documents/uri-path-raw-brackets-pack.json": "sha256:c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "vectors/documents/uri-path-raw-brackets.json": "sha256:b70d9a76a3b38f58a0f2b075c9ecfe6803b6e0a404c2b526000f85a86b244f67",
+ "vectors/documents/uri-percent-brackets.json": "sha256:52ed06084ad97c026b15ece99674e6d638d26509506b62ce3d5195da7acd5a63",
+ "vectors/documents/uri-percent-incomplete.json": "sha256:f8db4efe5972393c15cd0c8ad8cbe88262ac02845d8863781cad83f970fa212b",
+ "vectors/documents/uri-percent-nonhex.json": "sha256:4a239d1009d314a9a0e285848fb1eba211a5574e17907253936aa6820f98534b",
+ "vectors/documents/uri-percent-regname-pack.json": "sha256:50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "vectors/documents/uri-percent-regname.json": "sha256:86ea9309a59ba683a85c73442c2638d56aa21f2e9e4f020d3954b043ab7c5f06",
+ "vectors/documents/uri-percent-unicode.json": "sha256:5f062c610d9c546cba55951e3f9921b0de142ac382dac7d4a00e69ba65cf890f",
+ "vectors/documents/uri-query-raw-brackets.json": "sha256:8d24bd52b12805ba9c602f113ca47c0a1dd141fc35577c09e0581c033ee46e24",
+ "vectors/documents/uri-raw-unicode.json": "sha256:15bf301598d90e8a1e001973df95a1cb04021e1cb7a4385bf3ca0ef8eecebf7a",
+ "vectors/documents/uri-rootless-raw-brackets-pack.json": "sha256:a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "vectors/documents/uri-rootless-raw-brackets.json": "sha256:4143f4d8d6e9df42e8a8ab8e011b9404b719f4e400dcb25d360d2ac80ff2b39d",
+ "vectors/documents/uri-userinfo-percent-brackets.json": "sha256:85c63cc716e50e0020cd419f636caf824afbe22826df6abc135cc7433cf4253f",
+ "vectors/manifest.json": "sha256:953177df0e844ad78ebe145d21c9f1e760336eda4ed20247331493c44be8eedd",
+ "vectors.schema.json": "sha256:4843941ad1884306a896f5ced516dede695cb4a3fb8512973f3a54860d4a1a88",
+ "verify.py": "sha256:d8bface7de0c795ac04c6d2a307fb3d881b5a496514c04818d35ca2ef7ea68c3"
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/capabilities.json b/internal/policy/official/conformance/policy/1.0.0/capabilities.json
new file mode 100644
index 00000000..fc21f6d3
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/capabilities.json
@@ -0,0 +1,74 @@
+{
+ "capability": "jps-policy-companion-offline",
+ "maturity": "draft",
+ "formatVersions": [
+ "1.0.0"
+ ],
+ "consumerSpecVersions": [
+ "0.2.0-draft"
+ ],
+ "kinds": [
+ "policy",
+ "governing-adoption"
+ ],
+ "features": [
+ "exact-byte-sha256",
+ "utf8-section-anchors",
+ "scoped-total-coverage",
+ "typed-core-pack-references",
+ "optional-jps-canon-identity",
+ "multiple-media-types"
+ ],
+ "limits": {
+ "documentBytes": 262144,
+ "documentDepth": 32,
+ "numberLiteralCharacters": 128,
+ "exponentMagnitude": 308,
+ "materialBytes": 1048576,
+ "originalBytes": 4194304,
+ "distinctRetainedBytes": 16777216,
+ "materialRegistrations": 16,
+ "versionCharacters": 256,
+ "sections": 64,
+ "sources": 16,
+ "governingPolicies": 16,
+ "consumerElementsPerSection": 64,
+ "textCharacters": 4096,
+ "uriCharacters": 2048,
+ "localIdCharacters": 128,
+ "mediaTypeCharacters": 128,
+ "sourceRefsPerSection": 16,
+ "scopeSectionIds": 64,
+ "coverageRecordsPerPolicy": 64,
+ "informationalSources": 16,
+ "canonicalIntegerMagnitude": 9007199254740991
+ },
+ "excludes": [
+ "stable-format",
+ "graph-consumers",
+ "evaluation",
+ "full-core-semantics",
+ "signatures",
+ "review-assertion-trust",
+ "live-authority",
+ "permissions",
+ "currency",
+ "source-fetch",
+ "automatic-migration",
+ "independent-interoperability-evidence"
+ ],
+ "refusalCodes": [
+ "input-over-bound",
+ "invalid-json",
+ "invalid-selector",
+ "unsupported-format",
+ "invalid-document",
+ "missing-material",
+ "reference-mismatch",
+ "invalid-anchor",
+ "invalid-coverage",
+ "invalid-consumer",
+ "unsupported-canonical-identity",
+ "invalid-carrier"
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/check_vectors.py b/internal/policy/official/conformance/policy/1.0.0/check_vectors.py
new file mode 100644
index 00000000..3dc5f45f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/check_vectors.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+"""Run the static draft agreement vectors; not a JPS conformance claim."""
+
+import argparse
+import json
+from pathlib import Path
+
+import verify as v
+
+
+def source_bytes(source, root):
+ if "repeatByte" in source:
+ return bytes([source["repeatByte"]]) * source["byteLength"]
+ path = v.local_path(root, source["path"], allow_nested=True)
+ # Vectors deliberately include one byte over the registration bound.
+ return v.read_local(path, v.MAX_ORIGINAL_BYTES + 1)
+
+
+def case_result(case):
+ try:
+ raw = source_bytes(case["document"], v.HERE)
+ except v.ContractError as error:
+ return {"status": "refused", "code": error.code}
+ registrations = [(item["content"], item["source"]) for item in case["materials"]]
+ return v.verify_input(raw, registrations, load_material=lambda source: source_bytes(source, v.HERE))
+
+
+def run_vectors(manifest_path=None):
+ manifest_path = Path(manifest_path) if manifest_path else v.HERE / "vectors/manifest.json"
+ manifest = v.read_json(v.read_local(manifest_path, v.MAX_DOCUMENT_BYTES))
+ v.check_schema("vectors", manifest)
+ ids, answers = set(), []
+ for case in manifest["cases"]:
+ v.require(case["id"] not in ids, "invalid-carrier")
+ ids.add(case["id"])
+ actual = case_result(case)
+ answers.append((case["id"], actual, case["expected"]))
+ return answers
+
+
+def main(argv=None):
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("manifest", type=Path, nargs="?")
+ args = parser.parse_args(argv)
+ try:
+ answers = run_vectors(args.manifest)
+ failed = [name for name, actual, expected in answers if actual != expected]
+ answer = {"status": "mismatch" if failed else "matched", "cases": len(answers), "maturity": "draft"}
+ if failed:
+ answer["caseIds"] = failed
+ except v.ContractError as error:
+ answer = {"status": "refused", "code": error.code}
+ print(json.dumps(answer, separators=(",", ":")))
+ return 0 if answer["status"] == "matched" else 1
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/data-access/adoption.json b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/adoption.json
new file mode 100644
index 00000000..e6e67e2c
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/adoption.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/data-access/consumer-pack.json b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/consumer-pack.json
new file mode 100644
index 00000000..a292cbe5
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/consumer-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/data-access/fixture.json b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/fixture.json
new file mode 100644
index 00000000..4d9d3a3f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/fixture.json
@@ -0,0 +1,58 @@
+{
+ "fixtureVersion": "1",
+ "synthetic": true,
+ "scenario": "data-access",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:98294b5df0876cc793f236fa5184380aa37f2e459e1f630a5e613237404c2ec0",
+ "byteLength": 2352,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/data-access/interpretation.txt b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/interpretation.txt
new file mode 100644
index 00000000..4aa6c667
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/interpretation.txt
@@ -0,0 +1,4 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the automated eligibility clause.
+The fallbackOutcome routes an unmatched classification to review; unknown facts escalate.
+Other coverage is stated explicitly.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/data-access/narrative.txt b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/narrative.txt
new file mode 100644
index 00000000..bd5e6867
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/narrative.txt
@@ -0,0 +1,10 @@
+SYNTHETIC RFC PROTOTYPE — Data access
+
+Automated release
+Only de-identified datasets may be released through this automated path. Identifiable datasets are refused; missing classification goes to a data steward.
+
+Restricted requests
+A data steward reviews restricted requests through the manual access process. This pack cannot grant an exception.
+
+Quarterly audit
+Review the access log quarterly. A separate audit implementation is still needed.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/data-access/policy.json b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/policy.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/policy.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/data-access/source.txt b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/source.txt
new file mode 100644
index 00000000..794f4622
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/data-access/source.txt
@@ -0,0 +1,5 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: Only de-identified datasets may be released through this automated path. Identifiable datasets are refused; missing classification goes to a data steward.
+Clause 2: A data steward reviews restricted requests through the manual access process. This pack cannot grant an exception.
+Clause 3: Review the access log quarterly. A separate audit implementation is still needed.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/procurement/adoption.json b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/adoption.json
new file mode 100644
index 00000000..9c55f540
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/adoption.json
@@ -0,0 +1,97 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/procurement/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:205a2afdc68ebd46d5b022256fadec6bd071bc8e34faff481f288c20df008f60"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:f0ef6fe0bb4703eaf6b2c1edf2f12712dffc139e887317c46fc82d83dba71275"
+ }
+ },
+ "scope": {
+ "kind": "sections",
+ "sectionIds": [
+ "eligibility",
+ "conflict-review",
+ "invoice-payment",
+ "purchase-scope"
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "conflict-review",
+ "status": "awaiting-interpretation",
+ "explanation": "Synthetic open work item: agree the conflict threshold before implementation."
+ },
+ {
+ "sectionId": "invoice-payment",
+ "status": "out-of-scope",
+ "rationale": "This pack assesses eligibility only; treasury payment reconciliation is a separate process."
+ },
+ {
+ "sectionId": "purchase-scope",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "applicability"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/procurement/consumer-pack.json b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/consumer-pack.json
new file mode 100644
index 00000000..0745b386
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/consumer-pack.json
@@ -0,0 +1,68 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "title": "Procurement — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/procurement/competitiveProcedureDocumented",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/procurement/competitiveProcedureDocumented",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "applicability": {
+ "op": "fact",
+ "path": "/request/kind",
+ "operator": "equals",
+ "value": "purchase"
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/procurement/fixture.json b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/fixture.json
new file mode 100644
index 00000000..2bb9dd50
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/fixture.json
@@ -0,0 +1,58 @@
+{
+ "fixtureVersion": "1",
+ "synthetic": true,
+ "scenario": "procurement",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:e9c871b2e7dc7448e46b2d4d347beb504bbe0a691be11df4283a95a693208703",
+ "byteLength": 3055,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/procurement/interpretation.txt b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/interpretation.txt
new file mode 100644
index 00000000..cc2bd1f5
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/interpretation.txt
@@ -0,0 +1,5 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the competitive-procedure clause.
+The applicability condition alone implements purchase scope; it is not a rule ID.
+Missing facts need review. Other coverage is stated explicitly.
+The selected scope includes eligibility, conflict review, invoice payment and purchase scope; public notice is excluded.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/procurement/narrative.txt b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/narrative.txt
new file mode 100644
index 00000000..646937a8
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/narrative.txt
@@ -0,0 +1,16 @@
+SYNTHETIC RFC PROTOTYPE — Procurement
+
+Competitive procedure
+Automated eligibility requires a documented competitive procedure. A missing record requires a procurement reviewer.
+
+Supplier conflicts
+Supplier relationships require a conflict review. The threshold for a material relationship needs clarification.
+
+Invoice payment
+Treasury performs payment reconciliation outside this eligibility interpretation.
+
+Public notice
+Publish the award notice through the separate communications process.
+
+Purchase scope
+This eligibility pack applies only to purchase requests; other requests remain outside this automated path.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/procurement/policy.json b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/policy.json
new file mode 100644
index 00000000..00b19b27
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/policy.json
@@ -0,0 +1,106 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "title": "Procurement — synthetic policy content",
+ "managementMode": "externally-managed",
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Competitive procedure",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 181,
+ "bytesDigest": "sha256:a8d58fa560d792bbc0848b517b47a04d01fa928a4315de4be423d9756745714f"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "conflict-review",
+ "title": "Supplier conflicts",
+ "anchor": {
+ "startByte": 181,
+ "endByte": 314,
+ "bytesDigest": "sha256:ed53cc9edccb33c00c4692bcc84593e249117f9dbc4045d57e5e8f85458c7c94"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "invoice-payment",
+ "title": "Invoice payment",
+ "anchor": {
+ "startByte": 314,
+ "endByte": 413,
+ "bytesDigest": "sha256:f6803f2ffa7356a3aad889d20987a00614d8145193c521107845092745db9d1d"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ },
+ {
+ "id": "public-notice",
+ "title": "Public notice",
+ "anchor": {
+ "startByte": 413,
+ "endByte": 497,
+ "bytesDigest": "sha256:b6d68243578efb748244d55bcfe5f7bb730faa1c939c6a910f4e6e26b79b34f9"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 4"
+ }
+ ]
+ },
+ {
+ "id": "purchase-scope",
+ "title": "Purchase scope",
+ "anchor": {
+ "startByte": 498,
+ "endByte": 621,
+ "bytesDigest": "sha256:13498f448247cfd988d4d59046ae766abb0559cf902093cdf8f650543f37ed26"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 5"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "procurement-original"
+ },
+ "sourceRevision": "fictional-revision-a",
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/procurement/source.txt b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/source.txt
new file mode 100644
index 00000000..c5913acb
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/procurement/source.txt
@@ -0,0 +1,7 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: Automated eligibility requires a documented competitive procedure. A missing record requires a procurement reviewer.
+Clause 2: Supplier relationships require a conflict review. The threshold for a material relationship needs clarification.
+Clause 3: Treasury performs payment reconciliation outside this eligibility interpretation.
+Clause 4: Publish the award notice through the separate communications process.
+Clause 5: This eligibility pack applies only to purchase requests; other requests remain outside this automated path.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/refunds/adoption.json b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/adoption.json
new file mode 100644
index 00000000..6af1ea97
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/adoption.json
@@ -0,0 +1,87 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/refunds/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20723faedbed6ee066dd3330e4b72848702e92dfbeb68b757f6ed0a95e4a2c5"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/refunds/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:e287b7208c0e870d1ee04188bc57f614096210f740d0f95fbf11d1324dc93704"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "damaged-goods",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "fraud-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ },
+ {
+ "sectionId": "damaged-routing",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "exception",
+ "id": "damaged-routing"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/refunds/consumer-pack.json b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/consumer-pack.json
new file mode 100644
index 00000000..07323779
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/consumer-pack.json
@@ -0,0 +1,76 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/pack",
+ "version": "1.0.0",
+ "title": "Refunds — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/withinReturnWindow",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/withinReturnWindow",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "exceptions": [
+ {
+ "id": "damaged-routing",
+ "description": "Route damaged goods to review; this does not perform the manual inspection.",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/damaged",
+ "operator": "equals",
+ "value": true
+ },
+ "effect": "escalate",
+ "onUnknown": "escalate"
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/refunds/fixture.json b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/fixture.json
new file mode 100644
index 00000000..e1a86a90
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/fixture.json
@@ -0,0 +1,58 @@
+{
+ "fixtureVersion": "1",
+ "synthetic": true,
+ "scenario": "refunds",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:7c7cd121fc4510fff19b8bcaf120ce1a9cb3f7e60b8e811ce9be917799367bc8",
+ "byteLength": 2729,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/refunds/interpretation.txt b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/interpretation.txt
new file mode 100644
index 00000000..61258de1
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/interpretation.txt
@@ -0,0 +1,4 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the return-window clause.
+The damaged-routing exception alone routes damaged goods to a specialist; physical inspection remains manual.
+Missing facts need review. Other coverage is stated explicitly.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/refunds/narrative.txt b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/narrative.txt
new file mode 100644
index 00000000..1cf4b905
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/narrative.txt
@@ -0,0 +1,13 @@
+SYNTHETIC RFC PROTOTYPE — Refunds
+
+Return window
+The automated path accepts only purchases within the published return window. Missing purchase dates require a returns specialist.
+
+Damaged goods
+A returns specialist handles damaged goods through the manual inspection process.
+
+Fraud review
+Potential repeated-claim abuse needs a separate reviewed implementation.
+
+Damaged goods routing
+Damaged goods bypass automated eligibility and go to a returns specialist for manual inspection.
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/refunds/policy.json b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/policy.json
new file mode 100644
index 00000000..b3531a29
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/policy.json
@@ -0,0 +1,91 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/refunds/policy",
+ "version": "1.0.0",
+ "title": "Refunds — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Return window",
+ "anchor": {
+ "startByte": 37,
+ "endByte": 183,
+ "bytesDigest": "sha256:838ea4e242523a398e18a4006aa1488cc2032eb23f503f2c2dc2539339cc757a"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "damaged-goods",
+ "title": "Damaged goods",
+ "anchor": {
+ "startByte": 183,
+ "endByte": 280,
+ "bytesDigest": "sha256:ac0263d8b10debc2e8fb9090bb1b55c80a5766a4d192f23f0f640062ba5c82d4"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "fraud-review",
+ "title": "Fraud review",
+ "anchor": {
+ "startByte": 280,
+ "endByte": 366,
+ "bytesDigest": "sha256:9117339f1340e981a232894965d79f3f2a9f8116ffc347142c7dc7d9bc2631c3"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ },
+ {
+ "id": "damaged-routing",
+ "title": "Damaged goods routing",
+ "anchor": {
+ "startByte": 367,
+ "endByte": 486,
+ "bytesDigest": "sha256:a47d45dfa15bb16514328ff9e1de346be10d045a194597e6c44e1f598ab17ab1"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 4"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "refunds-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/examples/refunds/source.txt b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/source.txt
new file mode 100644
index 00000000..614029ef
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/examples/refunds/source.txt
@@ -0,0 +1,6 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: The automated path accepts only purchases within the published return window. Missing purchase dates require a returns specialist.
+Clause 2: A returns specialist handles damaged goods through the manual inspection process.
+Clause 3: Potential repeated-claim abuse needs a separate reviewed implementation.
+Clause 4: Damaged goods bypass automated eligibility and go to a returns specialist for manual inspection.
diff --git a/internal/policy/official/conformance/policy/1.0.0/fixture.schema.json b/internal/policy/official/conformance/policy/1.0.0/fixture.schema.json
new file mode 100644
index 00000000..a9edb55d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/fixture.schema.json
@@ -0,0 +1,67 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://judgmentpack.org/schema/policy/1.0.0/fixture.schema.json",
+ "title": "Local synthetic draft fixture carrier; not a release envelope",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "fixtureVersion",
+ "synthetic",
+ "scenario",
+ "materials",
+ "policy",
+ "consumer",
+ "adoption"
+ ],
+ "properties": {
+ "fixtureVersion": {
+ "const": "1"
+ },
+ "synthetic": {
+ "const": true
+ },
+ "scenario": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "materials": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 16,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path",
+ "content"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "content": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/retainedContent"
+ }
+ }
+ }
+ },
+ "policy": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "consumer": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "adoption": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/prototype-0.0.2-pin.json b/internal/policy/official/conformance/policy/1.0.0/prototype-0.0.2-pin.json
new file mode 100644
index 00000000..24a7b0e9
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/prototype-0.0.2-pin.json
@@ -0,0 +1,33 @@
+{
+ "commit": "8a56a95d555c17640d2db4984363b779536b3c2a",
+ "proposalVersion": "0.0.2",
+ "files": {
+ "README.md": "sha256:031cc9fa743c7d3af5cc482a514cfba106d510e16364febe0e58ce8bf9830e16",
+ "common.schema.json": "sha256:97d25d9c7778c68bdd94506227a0061923a5ef5fc9bc5f0a101f1ac2449d0d33",
+ "examples/data-access/adoption.json": "sha256:f6cf887488c12b0ba5331a048f5a9661a557021f5abfc5662a95524915ec1529",
+ "examples/data-access/consumer-pack.json": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "examples/data-access/fixture.json": "sha256:575edeed43ceb0b72a3a204caacbc51ba10e52075b7cbeea134b02876e550ec8",
+ "examples/data-access/interpretation.txt": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "examples/data-access/narrative.txt": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "examples/data-access/policy.json": "sha256:75a7659ed5086c7728af95db0b56b15fdc914a51982b16627fc884cfc9dca50d",
+ "examples/data-access/source.txt": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "examples/procurement/adoption.json": "sha256:b5b94a06dba7d12748fe3f854bdb5e5da9c14736aeff8d7416e94946891fd063",
+ "examples/procurement/consumer-pack.json": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "examples/procurement/fixture.json": "sha256:241d3fd3f06c0cc0572d5237bcbbae9c88bd688fdfe7b41809bd90497ebfbf4b",
+ "examples/procurement/interpretation.txt": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "examples/procurement/narrative.txt": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "examples/procurement/policy.json": "sha256:e9bbe247d5aa7537aef08c951b88c0881e381046e357abaa05ea255e208ee852",
+ "examples/procurement/source.txt": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "examples/refunds/adoption.json": "sha256:fd474eed584ae6305ea535bf1d044734f8d754fcc907b0d28b65a318b5ea4b5d",
+ "examples/refunds/consumer-pack.json": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "examples/refunds/fixture.json": "sha256:2029192a538db356e9beb137e35377d00db61dda52cb7ba622d3d5e4343b6f22",
+ "examples/refunds/interpretation.txt": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "examples/refunds/narrative.txt": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "examples/refunds/policy.json": "sha256:5391763b2d9a72533e7566cce910a43cb5ab740dd0587d7383f3adf153ba9970",
+ "examples/refunds/source.txt": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "governing-adoption.schema.json": "sha256:4108f3ac476b989483affbf0ddfa2e933f7be5c579c472f7b7b3aa976299f779",
+ "policy.schema.json": "sha256:d653ce7e855dce678aeadebac18de2afbc5bdcb23412fcf52f3d30b5be3d4dbd",
+ "test_prototype.py": "sha256:bdb05fe954cb75ddc859e58e81ed29c22e7181fb224068dcc55dfb59106858ef",
+ "verify.py": "sha256:ad6774c7eed831e1a586b9a313c33cb35b471db5cb41ee2212f1643135e27ea0"
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/test_contract.py b/internal/policy/official/conformance/policy/1.0.0/test_contract.py
new file mode 100644
index 00000000..1ca13650
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/test_contract.py
@@ -0,0 +1,250 @@
+"""Focused draft agreement/carrier checks, outside the adopted corpus."""
+
+import copy
+import json
+import subprocess
+import sys
+import unittest
+from pathlib import Path
+from tempfile import TemporaryDirectory
+
+from jsonschema import FormatChecker
+
+import check_vectors
+import verify as v
+
+
+class ContractTests(unittest.TestCase):
+ def test_archived_candidate_and_all_promoted_input_bytes_are_frozen(self):
+ pin = json.loads((v.HERE / "candidate-1.0.0-pin.json").read_bytes())
+ old = v.ROOT / "rfcs/policy-companion-contract"
+ for name, digest in pin["files"].items():
+ with self.subTest(candidate=name):
+ self.assertEqual(v.spec_canon.digest_of((old / name).read_bytes()), digest)
+ actual = {str(path.relative_to(old)) for path in old.rglob("*")
+ if path.is_file() and "__pycache__" not in str(path)}
+ self.assertEqual(actual, set(pin["files"]))
+ for directory in ("examples", "vectors/documents"):
+ for path in (v.HERE / directory).rglob("*"):
+ if path.is_file():
+ self.assertEqual(path.read_bytes(), (old / path.relative_to(v.HERE)).read_bytes())
+ previous = json.loads((old / "vectors/manifest.json").read_bytes())
+ promoted = json.loads((v.HERE / "vectors/manifest.json").read_bytes())
+ self.assertEqual(promoted, json.loads(json.dumps(previous).replace("proposed-draft", "draft")))
+
+ def test_official_schema_identity_changes_preserve_closed_input_grammar(self):
+ def grammar(value):
+ if isinstance(value, dict):
+ return {key: grammar(child) for key, child in value.items()
+ if key not in ("$id", "title", "description")}
+ if isinstance(value, list):
+ return [grammar(child) for child in value]
+ if isinstance(value, str):
+ for name in ("common", "policy", "governing-adoption"):
+ value = value.replace(f"https://judgmentpack.org/schema/policy/1.0.0/{name}.schema.json",
+ f"urn:jps:proposal:policy-companion:1.0.0:{name}")
+ return value
+ for name in ("common", "policy", "governing-adoption"):
+ old = json.loads((v.ROOT / "rfcs/policy-companion-contract" / f"{name}.schema.json").read_bytes())
+ new = json.loads((v.SCHEMAS / f"{name}.schema.json").read_bytes())
+ self.assertEqual(grammar(old), grammar(new))
+ self.assertEqual(new["$id"], f"https://judgmentpack.org/schema/policy/1.0.0/{name}.schema.json")
+
+ def test_consumer_schema_is_frozen_to_its_named_core_release(self):
+ retained = (v.SCHEMAS / "consumer-core-0.2.0-draft.schema.json").read_bytes()
+ schema = json.loads(retained)
+ self.assertEqual(schema["$id"], "https://judgmentpack.org/schema/0.2.0-draft/judgment-pack-core.schema.json")
+ self.assertEqual(schema["properties"]["specVersion"]["const"], "0.2.0-draft")
+ previous = v.VALIDATORS
+ try:
+ v.VALIDATORS = v.validators()
+ self.assertEqual(v.VALIDATORS["core"].schema, schema)
+ finally:
+ v.VALIDATORS = previous
+
+ def test_static_manifest_exact_results(self):
+ answers = check_vectors.run_vectors()
+ self.assertEqual(len(answers), 124)
+ for name, actual, expected in answers:
+ with self.subTest(vector=name):
+ self.assertEqual(actual, expected)
+ self.assertLess(len(json.dumps(actual)), 128)
+ codes = {actual.get("code") for _, actual, _ in answers}
+ self.assertTrue(set(v.CODES) <= codes)
+
+ def test_three_domain_bundles_and_declared_coverage(self):
+ states, kinds = set(), set()
+ for directory in sorted((v.HERE / "examples").iterdir()):
+ with self.subTest(domain=directory.name):
+ self.assertEqual(v.verify_bundle(directory), v.VALID)
+ manifest, material, by_path = v.load_bundle(directory)
+ adoption = v.read_companion(by_path[manifest["adoption"]])
+ for governing in adoption["governingPolicies"]:
+ for coverage in governing["coverage"]:
+ states.add(coverage["status"])
+ kinds.update(item["kind"] for item in coverage.get("consumerElements", []))
+ self.assertEqual(states, {"implemented", "manual", "awaiting-interpretation", "awaiting-implementation", "out-of-scope"})
+ self.assertEqual(kinds, {"rule", "exception", "applicability", "fallback"})
+
+ def test_historical_prototype_is_byte_frozen(self):
+ pin = json.loads((v.HERE / "prototype-0.0.2-pin.json").read_bytes())
+ old = v.ROOT / "rfcs/policy-companion-prototype"
+ self.assertEqual(pin["commit"], "8a56a95d555c17640d2db4984363b779536b3c2a")
+ self.assertEqual(pin["proposalVersion"], "0.0.2")
+ for name, digest in pin["files"].items():
+ with self.subTest(path=name):
+ self.assertEqual(v.spec_canon.digest_of((old / name).read_bytes()), digest)
+ actual = {str(path.relative_to(old)) for path in old.rglob("*") if path.is_file() and "__pycache__" not in str(path)}
+ self.assertEqual(actual, set(pin["files"]))
+
+ def test_source_consumer_narrative_and_review_bytes_preserved(self):
+ old = v.ROOT / "rfcs/policy-companion-prototype/examples"
+ for directory in sorted((v.HERE / "examples").iterdir()):
+ for name in ("source.txt", "consumer-pack.json", "narrative.txt", "interpretation.txt"):
+ with self.subTest(domain=directory.name, role=name):
+ self.assertEqual((directory / name).read_bytes(), (old / directory.name / name).read_bytes())
+
+ def test_discovery_matches_retained_record_and_cli(self):
+ retained = json.loads((v.HERE / "capabilities.json").read_bytes())
+ self.assertEqual(retained, v.CAPABILITY)
+ self.assertEqual(retained["formatVersions"], ["1.0.0"])
+ self.assertEqual(retained["maturity"], "draft")
+ self.assertIn("live-authority", retained["excludes"])
+ self.assertIn("independent-interoperability-evidence", retained["excludes"])
+ completed = subprocess.run([sys.executable, str(v.HERE / "verify.py"), "--capabilities"], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 0)
+ self.assertEqual(completed.stderr, b"")
+ self.assertEqual(json.loads(completed.stdout), retained)
+
+ def test_cli_refusal_does_not_echo_retained_input_or_paths(self):
+ manifest = json.loads((v.HERE / "examples/data-access/fixture.json").read_bytes())
+ secret = b"fictional-private-title-must-not-be-echoed"
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ for entry in manifest["materials"]:
+ raw = (v.HERE / "examples/data-access" / entry["path"]).read_bytes()
+ if entry["path"] == "narrative.txt":
+ raw += secret # Intentionally stale declared exact hash/length.
+ (directory / entry["path"]).write_bytes(raw)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ completed = subprocess.run([sys.executable, str(v.HERE / "verify.py"), str(directory)], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 1)
+ self.assertEqual(completed.stdout, b'{"status":"refused","code":"reference-mismatch"}\n')
+ self.assertEqual(completed.stderr, b"")
+ self.assertNotIn(secret, completed.stdout)
+ self.assertNotIn(temporary.encode(), completed.stdout)
+
+ def test_local_fixture_carrier_refuses_paths_unknown_fields_and_missing_files(self):
+ original = json.loads((v.HERE / "examples/data-access/fixture.json").read_bytes())
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ for mutation, code in ((lambda d: d["materials"][0].update(path="../outside.txt"), "invalid-carrier"),
+ (lambda d: d.update(approved=True), "invalid-carrier"),
+ (lambda d: None, "missing-material")):
+ manifest = copy.deepcopy(original)
+ mutation(manifest)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ self.assertEqual(v.verify_bundle(directory), {"status": "refused", "code": code})
+ symlink = directory / "narrative.txt"
+ symlink.symlink_to(v.HERE / "examples/data-access/narrative.txt")
+ (directory / "fixture.json").write_text(json.dumps(original))
+ self.assertEqual(v.verify_bundle(directory), {"status": "refused", "code": "invalid-carrier"})
+
+ def test_cli_refuses_nul_material_path_with_bounded_json(self):
+ manifest = json.loads((v.HERE / "examples/data-access/fixture.json").read_bytes())
+ manifest["materials"][0]["path"] = "fictional-private\x00path.txt"
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ completed = subprocess.run([sys.executable, str(v.HERE / "verify.py"), str(directory)], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 1)
+ self.assertEqual(completed.stdout, b'{"status":"refused","code":"invalid-carrier"}\n')
+ self.assertEqual(completed.stderr, b"")
+
+ def test_vector_carrier_nul_paths_have_safe_results_and_no_cli_traceback(self):
+ expected = {"status": "refused", "code": "invalid-carrier"}
+ source = {"path": "vectors/private\x00transport.bin"}
+ case = {"id": "nul-transport", "document": {"path": "examples/data-access/policy.json"},
+ "materials": [{"source": source, "content": v.identity(b"x", "text/plain")}], "expected": expected}
+ self.assertEqual(check_vectors.case_result(case), expected)
+ root_nul = {**case, "document": source, "materials": []}
+ self.assertEqual(check_vectors.case_result(root_nul), expected)
+ manifest = {"vectorSuiteVersion": "1", "maturity": "draft", "synthetic": True, "cases": [case]}
+ with TemporaryDirectory() as temporary:
+ path = Path(temporary) / "manifest.json"
+ path.write_text(json.dumps(manifest))
+ completed = subprocess.run([sys.executable, str(v.HERE / "check_vectors.py"), str(path)], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 0)
+ self.assertEqual(completed.stdout, b'{"status":"matched","cases":1,"maturity":"draft"}\n')
+ self.assertEqual(completed.stderr, b"")
+
+ def test_failed_registration_is_atomic(self):
+ material = {}
+ first = v.identity(b"x", "text/plain")
+ v.register_material(first, b"x", material)
+ before = copy.deepcopy(material)
+ with self.assertRaises(v.ContractError) as caught:
+ v.register_material(first, b"changed", material)
+ self.assertEqual(caught.exception.code, "reference-mismatch")
+ self.assertEqual(material, before)
+ wrong_type = v.identity(b"x", "text/markdown")
+ self.assertEqual(v.result(lambda: v.resolve(wrong_type, material)), {"status": "refused", "code": "reference-mismatch"})
+
+ def test_schema_version_pattern_is_exact_without_trailing_newline_alias(self):
+ raw = (v.HERE / "examples/data-access/policy.json").read_bytes()
+ manifest, material, _ = v.load_bundle(v.HERE / "examples/data-access")
+ document = v.read_companion(raw)
+ for version in ("0.0.0", "42.7.999", "9" * 252 + ".0.0"):
+ document["version"] = version
+ v.check_schema("policy", document)
+ for version in ("1x0x0", "1.0.0\n", "01.0.0", "1.0.0+build"):
+ document["version"] = version
+ self.assertEqual(v.result(lambda: v.check_schema("policy", document)), {"status": "refused", "code": "invalid-document"})
+
+ def test_uri_matrix_covers_policy_and_consuming_core_without_global_override(self):
+ manifest, material, by_path = v.load_bundle(v.HERE / "examples/data-access")
+ base = v.read_companion(by_path[manifest["policy"]])
+ cases = json.loads((v.HERE / "vectors/manifest.json").read_bytes())["cases"]
+ count = 0
+ for case in cases:
+ if not case["id"].startswith("uri-"):
+ continue
+ count += 1
+ document = v.read_companion(check_vectors.source_bytes(case["document"], v.HERE))
+ policy = copy.deepcopy(base)
+ policy["id"] = document["consumer"]["id"] if document["kind"] == "governing-adoption" else document["id"]
+ with self.subTest(vector=case["id"], root="policy"):
+ self.assertEqual(v.result(lambda: v.check_policy(policy, material)), case["expected"])
+ if document["kind"] == "governing-adoption":
+ reference = document["consumer"]["content"]
+ entry = next(item for item in case["materials"] if item["content"] == reference)
+ pack = v.strict_json(check_vectors.source_bytes(entry["source"], v.HERE))
+ expected = v.VALID if case["expected"]["status"] == "valid" else {"status": "refused", "code": "invalid-consumer"}
+ with self.subTest(vector=case["id"], root="consuming-pack"):
+ self.assertEqual(v.result(lambda: v.check_schema("core", pack)), expected)
+ self.assertEqual(count, 21) # Twenty added cases plus the original relative-ID refusal.
+ self.assertIsNot(FormatChecker().checkers["uri"][0], v.candidate_uri)
+
+ def test_uri_adoption_vectors_preserve_every_pack_byte_except_id_token(self):
+ original = (v.HERE / "examples/data-access/consumer-pack.json").read_bytes()
+ original_id = json.dumps(json.loads(original)["id"]).encode()
+ cases = json.loads((v.HERE / "vectors/manifest.json").read_bytes())["cases"]
+ count = 0
+ for case in cases:
+ if not case["id"].startswith("uri-"):
+ continue
+ document = v.read_companion(check_vectors.source_bytes(case["document"], v.HERE))
+ if document["kind"] != "governing-adoption":
+ continue
+ count += 1
+ entry = next(item for item in case["materials"] if item["content"] == document["consumer"]["content"])
+ retained = check_vectors.source_bytes(entry["source"], v.HERE)
+ new_id = json.dumps(document["consumer"]["id"]).encode()
+ with self.subTest(vector=case["id"]):
+ self.assertEqual(retained.count(new_id), 1)
+ self.assertEqual(retained.replace(new_id, original_id, 1), original)
+ self.assertEqual(count, 7)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors.schema.json b/internal/policy/official/conformance/policy/1.0.0/vectors.schema.json
new file mode 100644
index 00000000..eebdd1ad
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors.schema.json
@@ -0,0 +1,203 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://judgmentpack.org/schema/policy/1.0.0/vectors.schema.json",
+ "title": "Draft agreement-vector carrier; not a release envelope",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "vectorSuiteVersion",
+ "maturity",
+ "synthetic",
+ "cases"
+ ],
+ "properties": {
+ "vectorSuiteVersion": {
+ "const": "1"
+ },
+ "maturity": {
+ "const": "draft"
+ },
+ "synthetic": {
+ "const": true
+ },
+ "cases": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 128,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "document",
+ "materials",
+ "expected"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128,
+ "pattern": "^[a-z][a-z0-9-]*$"
+ },
+ "document": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 256
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "repeatByte",
+ "byteLength"
+ ],
+ "properties": {
+ "repeatByte": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194305
+ }
+ }
+ }
+ ]
+ },
+ "materials": {
+ "type": "array",
+ "maxItems": 17,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "source",
+ "content"
+ ],
+ "properties": {
+ "source": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 256
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "repeatByte",
+ "byteLength"
+ ],
+ "properties": {
+ "repeatByte": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194305
+ }
+ }
+ }
+ ]
+ },
+ "content": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194305
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Generic fixture-carrier reference; consuming roles impose their own bounds."
+ }
+ }
+ }
+ },
+ "expected": {
+ "oneOf": [
+ {
+ "const": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "status",
+ "code"
+ ],
+ "properties": {
+ "status": {
+ "const": "refused"
+ },
+ "code": {
+ "enum": [
+ "input-over-bound",
+ "invalid-json",
+ "invalid-selector",
+ "unsupported-format",
+ "invalid-document",
+ "missing-material",
+ "reference-mismatch",
+ "invalid-anchor",
+ "invalid-coverage",
+ "invalid-consumer",
+ "unsupported-canonical-identity",
+ "invalid-carrier"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/README.md b/internal/policy/official/conformance/policy/1.0.0/vectors/README.md
new file mode 100644
index 00000000..1a6056cb
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/README.md
@@ -0,0 +1,103 @@
+# Policy offline-reader agreement vectors
+
+[manifest.json](manifest.json) supplies exact draft inputs and exact expected
+results for independent readers to execute. These synthetic fixtures alone do
+not establish a released JPS corpus. Publication requires the exact
+`policy-v1.0.0-draft.1` tag and a maintainer-published GitHub release. The fixtures
+supply no independently authored implementation evidence. No case asserts
+approval, live authority, complete organizational coverage or permission.
+
+The manifest is closed under [vectors.schema.json](../vectors.schema.json). It has
+`vectorSuiteVersion: "1"`, `maturity: "draft"`, `synthetic: true` and
+`cases`. This carrier version is local test scaffolding, distinct from the
+companion `formatVersion` and artifact `version`; it is not a release envelope.
+All paths are relative to **conformance/policy/1.0.0/**, the versioned corpus root,
+regardless of the manifest's location. A path must resolve inside that root,
+including after resolving symlinks; absolute paths and escaping paths refuse.
+NUL-containing paths and path-normalization failures are `invalid-carrier`.
+Do not fetch any URI in a document or reference.
+
+Each case is exactly `{id, document, materials, expected}`:
+
+- `id` is a unique readable test identifier.
+- `document` describes exact root companion bytes using the source grammar below.
+- `materials` is an **ordered** array of `{source, content}` registrations. `source`
+ yields exact retained bytes; `content` independently declares the raw digest,
+ byte length and media type. Do not repair a mismatching declaration, normalize
+ bytes, derive a new declaration, or infer an unregistered media type.
+- `expected` is the complete result object to compare with the draft reader result.
+ JSON object member order is irrelevant; names, values and absence of any extra
+ members must agree. Compare both valid and refusal objects, not only exit codes.
+
+The complete closed source grammar has only two alternatives:
+
+```json
+{"path":"examples/data-access/policy.json"}
+{"repeatByte":120,"byteLength":1048576}
+```
+
+For `path`, read the file's bytes exactly; no text conversion or newline changes.
+For `repeatByte`, allocate **exactly** `byteLength` copies of the unsigned byte
+`repeatByte` (integer 0–255), with no prefix, suffix or encoding. `byteLength` is an
+integer 0–4,194,305. A value of zero generates empty bytes. There are no mutations,
+JSON reserialization instructions, interpolation, automatic reference rebinding or
+other generators. One byte above a normal maximum is intentionally representable
+to test refusal. Static document files already carry every altered field and exact
+reference; readers do not need the Python scripts used during authoring.
+
+To run a case, first measure/parse/select/canonical-domain-check its root bytes as
+[contract §5](../../../../spec/policy.md#5-resource-limits-and-refusal-classifications) specifies.
+Then check the input's registration count (maximum 16), register materials in list
+order (acquiring one source immediately before its registration and checking
+declarations and distinct-byte budget), and validate the root
+schema and its semantic references. Root bytes themselves are subject to the
+262,144-byte limit and count toward the distinct-material budget only when
+explicitly registered. A referenced Policy or Pack must be retained in materials;
+the carrier does not implicitly register the root or fetch a missing digest.
+Return the **first** failing phase's bounded result. Carrier preparation errors
+such as an invalid path are `invalid-carrier`; an unavailable file is
+`missing-material`. These are never successful document readings.
+
+The compound transport/ordering vectors intentionally name a missing file
+(`vectors/intentionally-missing-transport.bin`) or a NUL-containing path. These
+are test harness transport inputs, not absent files that a port should create,
+repair or fetch. Some earlier root/registration refusals must prevent acquisition
+of those later sources. The `vector-carrier-nul-path` case actually reaches its
+malformed path and returns `invalid-carrier`. The result for each case includes
+these transport refusals; the harness compares them with `expected` and continues
+to the next case. Carrier-manifest schema/setup failures remain harness failures.
+
+The manifest includes one over-bound registration count and one over-bound
+original reference; its own carrier schema permits those counterexamples. No
+candidate reader must accept them. Aggregate boundary vectors include separately
+registered identical bytes under two media types; both resolve, and the bytes
+spend the aggregate budget only once. Every role independently applies its size
+limit. Raw Core numeric extensions include fractional, exponent and unsafe integer
+literals; expected results distinguish optional canonical identity from raw pins.
+
+The 20 additional URI vectors assert the candidate's scheme-bearing RFC 3986 `URI`
+grammar in Policy IDs and consuming-Pack references. They cover complete-string assertion, percent-encoding,
+IPv6/IPvFuture, registered names, Unicode and component-specific brackets. Their
+expected results describe URI syntax, not URL fetching or a dependency's quirks;
+valid query/fragment content remains supported. Original retained materials are
+unchanged. The earlier 104 vectors retain their exact inputs and expectations.
+Seven cases are complete adoptions whose consuming Pack ID and exact consumer
+reference agree. Their retained Pack files change only the ID string token;
+every other original Pack byte, including number literals and whitespace, remains
+unchanged. Raw digest/length and optional canonical identity are refreshed for
+those synthetic candidate bytes. Valid percent-encoded hosts and IPvFuture `v`/`V`
+must pass the candidate's consuming-Pack structural checker as well as its
+reference grammar; invalid brackets, final LF and leading-zero IPv4 tails refuse.
+
+Run the reference harness with the repository's pinned dependencies:
+
+```sh
+python conformance/policy/1.0.0/check_vectors.py
+```
+
+Successful harness output is exactly
+`{"status":"matched","cases":124,"maturity":"draft"}`; this is harness
+agreement, not the result for an individual document or a conformance claim. Each
+refusal vector's exact output is retained in the manifest. The harness and schema
+are optional conveniences: another language can read these same bytes and the
+source grammar directly, without importing Python or mutable prototype helpers.
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-max.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-max.json
new file mode 100644
index 00000000..9a63cd46
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-max.json
@@ -0,0 +1,25 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": []
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-over.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-over.json
new file mode 100644
index 00000000..9a63cd46
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-over.json
@@ -0,0 +1,25 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": []
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-shared-media-counted-once.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-shared-media-counted-once.json
new file mode 100644
index 00000000..9a63cd46
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/aggregate-shared-media-counted-once.json
@@ -0,0 +1,25 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": []
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-empty-range.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-empty-range.json
new file mode 100644
index 00000000..562186a1
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-empty-range.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 41,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-outside-narrative.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-outside-narrative.json
new file mode 100644
index 00000000..801e4b1a
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-outside-narrative.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 999999,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-over-bound.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-over-bound.json
new file mode 100644
index 00000000..632c1534
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-over-bound.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 1048577,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-stale-digest.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-stale-digest.json
new file mode 100644
index 00000000..6213ac8f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-stale-digest.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-utf8-split.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-utf8-split.json
new file mode 100644
index 00000000..29ccbc02
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/anchor-utf8-split.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 25,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/approval-field.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/approval-field.json
new file mode 100644
index 00000000..c282482b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/approval-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "approved": true
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-build.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-build.json
new file mode 100644
index 00000000..3bdf3da3
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-build.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0+build",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-independent.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-independent.json
new file mode 100644
index 00000000..3ac9ae59
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-independent.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "7.3.42",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-leading-zero.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-leading-zero.json
new file mode 100644
index 00000000..a86fd80b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-leading-zero.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.00.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-max-256.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-max-256.json
new file mode 100644
index 00000000..202c6a3b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-max-256.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-newline.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-newline.json
new file mode 100644
index 00000000..33a0dca7
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-newline.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0\n",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-number.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-number.json
new file mode 100644
index 00000000..3cfddc4e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-number.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": 1,
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-over-256.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-over-256.json
new file mode 100644
index 00000000..bf40bfcc
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-over-256.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-two-components.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-two-components.json
new file mode 100644
index 00000000..4a25db33
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/artifact-two-components.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/bom.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/bom.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/bom.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/companion-float.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/companion-float.json
new file mode 100644
index 00000000..e967560d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/companion-float.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","n":1.0}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/companion-unsafe-integer.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/companion-unsafe-integer.json
new file mode 100644
index 00000000..ea15b97d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/companion-unsafe-integer.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","n":9007199254740992}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown-pack.json
new file mode 100644
index 00000000..a10ed874
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "unknown",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown.json
new file mode 100644
index 00000000..2db44594
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "byteLength": 1559,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-graph.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-graph.json
new file mode 100644
index 00000000..95714df7
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-graph.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "graph",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate-pack.json
new file mode 100644
index 00000000..ef28391b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate-pack.json
@@ -0,0 +1,74 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "different"
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate.json
new file mode 100644
index 00000000..85a16d8a
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "byteLength": 1828,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-raw-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-raw-pack.json
new file mode 100644
index 00000000..cc3aa167
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-raw-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1.5
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-raw.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-raw.json
new file mode 100644
index 00000000..d825392a
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-raw.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon-pack.json
new file mode 100644
index 00000000..cc3aa167
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1.5
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon.json
new file mode 100644
index 00000000..ba4e1229
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-308-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-308-pack.json
new file mode 100644
index 00000000..34312ff1
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-308-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1e308
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-308.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-308.json
new file mode 100644
index 00000000..cf42a308
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-308.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-over-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-over-pack.json
new file mode 100644
index 00000000..12548437
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-over-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1e309
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-over.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-over.json
new file mode 100644
index 00000000..9f9e334a
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-exponent-over.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-128-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-128-pack.json
new file mode 100644
index 00000000..c4d31e6d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-128-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-128.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-128.json
new file mode 100644
index 00000000..8045ac88
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-128.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "byteLength": 1773,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-over-128-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-over-128-pack.json
new file mode 100644
index 00000000..3fc39e1b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-over-128-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-over-128.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-over-128.json
new file mode 100644
index 00000000..be3380c4
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-number-over-128.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "byteLength": 1774,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw-pack.json
new file mode 100644
index 00000000..72575108
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 9007199254740992
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw.json
new file mode 100644
index 00000000..230eb4dc
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon-pack.json
new file mode 100644
index 00000000..72575108
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 9007199254740992
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon.json
new file mode 100644
index 00000000..a11d5f73
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-duplicate.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-duplicate.json
new file mode 100644
index 00000000..c05cf61d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-duplicate.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "eligibility",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-omitted.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-omitted.json
new file mode 100644
index 00000000..b8d4f284
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-omitted.json
@@ -0,0 +1,70 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-outside.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-outside.json
new file mode 100644
index 00000000..fa81751e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/coverage-outside.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "unknown",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/depth-32.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/depth-32.json
new file mode 100644
index 00000000..0d73e241
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/depth-32.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/depth-33.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/depth-33.json
new file mode 100644
index 00000000..b9777e0a
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/depth-33.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/desk-managed-alias-refused.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/desk-managed-alias-refused.json
new file mode 100644
index 00000000..497f3947
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/desk-managed-alias-refused.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "desk-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/document-max-bytes.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/document-max-bytes.json
new file mode 100644
index 00000000..b50b49e7
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/document-max-bytes.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/duplicate-json.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/duplicate-json.json
new file mode 100644
index 00000000..27e3b357
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/duplicate-json.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","formatVersion":"1.0.0"}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/duplicate-policy-identity.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/duplicate-policy-identity.json
new file mode 100644
index 00000000..4aefa2b8
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/duplicate-policy-identity.json
@@ -0,0 +1,128 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ },
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access. Extra synthetic note."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-0.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-0.json
new file mode 100644
index 00000000..a4f77172
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-0.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "0.0.2",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-2.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-2.json
new file mode 100644
index 00000000..f86d98ec
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-2.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "2.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-before-canon.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-before-canon.json
new file mode 100644
index 00000000..a56a64b0
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-before-canon.json
@@ -0,0 +1 @@
+{"formatVersion":"7.0.0","n":1.5}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-before-shape.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-before-shape.json
new file mode 100644
index 00000000..004c1fcc
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-before-shape.json
@@ -0,0 +1,4 @@
+{
+ "formatVersion": "7.0.0",
+ "approved": true
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-bool.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-bool.json
new file mode 100644
index 00000000..d1fe556d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-bool.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": true,
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-int.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-int.json
new file mode 100644
index 00000000..be645a97
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-int.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": 1,
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-leading-zero.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-leading-zero.json
new file mode 100644
index 00000000..4b3ce9a5
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-leading-zero.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "01.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-missing.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-missing.json
new file mode 100644
index 00000000..a8bb3dd5
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-missing.json
@@ -0,0 +1,75 @@
+{
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-newline.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-newline.json
new file mode 100644
index 00000000..caf99a61
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-newline.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0\n",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-patch.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-patch.json
new file mode 100644
index 00000000..c915f2d9
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-patch.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.1",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-short.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-short.json
new file mode 100644
index 00000000..0e07cff7
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-short.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-suffix.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-suffix.json
new file mode 100644
index 00000000..673bade3
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-suffix.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0-rc.1",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-unicode.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-unicode.json
new file mode 100644
index 00000000..2db0c46f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-unicode.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "١.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-v-prefix.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-v-prefix.json
new file mode 100644
index 00000000..1fdc7fa0
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/format-v-prefix.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "v1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/informational-max.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/informational-max.json
new file mode 100644
index 00000000..a51fddb8
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/informational-max.json
@@ -0,0 +1,82 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ],
+ "informationalSources": [
+ {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/informational-over.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/informational-over.json
new file mode 100644
index 00000000..efe294ef
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/informational-over.json
@@ -0,0 +1,82 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ],
+ "informationalSources": [
+ {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/invalid-utf8.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/invalid-utf8.json
new file mode 100644
index 00000000..307ff4b1
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/invalid-utf8.json
@@ -0,0 +1 @@
+{"x":"ÿ"}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/kind-id-confusion.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/kind-id-confusion.json
new file mode 100644
index 00000000..50f4b41e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/kind-id-confusion.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "exception",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/limited-scope-missing-basis.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/limited-scope-missing-basis.json
new file mode 100644
index 00000000..048cb7e1
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/limited-scope-missing-basis.json
@@ -0,0 +1,92 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/procurement/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:205a2afdc68ebd46d5b022256fadec6bd071bc8e34faff481f288c20df008f60"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:f0ef6fe0bb4703eaf6b2c1edf2f12712dffc139e887317c46fc82d83dba71275"
+ }
+ },
+ "scope": {
+ "kind": "sections",
+ "sectionIds": [
+ "eligibility",
+ "conflict-review",
+ "invoice-payment",
+ "purchase-scope"
+ ]
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "conflict-review",
+ "status": "awaiting-interpretation",
+ "explanation": "Synthetic open work item: agree the conflict threshold before implementation."
+ },
+ {
+ "sectionId": "invoice-payment",
+ "status": "out-of-scope",
+ "rationale": "This pack assesses eligibility only; treasury payment reconciliation is a separate process."
+ },
+ {
+ "sectionId": "purchase-scope",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "applicability"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/limited-scope-unknown.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/limited-scope-unknown.json
new file mode 100644
index 00000000..84aac041
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/limited-scope-unknown.json
@@ -0,0 +1,98 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/procurement/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:205a2afdc68ebd46d5b022256fadec6bd071bc8e34faff481f288c20df008f60"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:f0ef6fe0bb4703eaf6b2c1edf2f12712dffc139e887317c46fc82d83dba71275"
+ }
+ },
+ "scope": {
+ "kind": "sections",
+ "sectionIds": [
+ "eligibility",
+ "conflict-review",
+ "invoice-payment",
+ "purchase-scope",
+ "unknown"
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "conflict-review",
+ "status": "awaiting-interpretation",
+ "explanation": "Synthetic open work item: agree the conflict threshold before implementation."
+ },
+ {
+ "sectionId": "invoice-payment",
+ "status": "out-of-scope",
+ "rationale": "This pack assesses eligibility only; treasury payment reconciliation is a separate process."
+ },
+ {
+ "sectionId": "purchase-scope",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "applicability"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/malformed-over-depth.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/malformed-over-depth.json
new file mode 100644
index 00000000..bd942c38
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/malformed-over-depth.json
@@ -0,0 +1 @@
+ÿ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/missing-governing-policy.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/missing-governing-policy.json
new file mode 100644
index 00000000..f9d2742b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/missing-governing-policy.json
@@ -0,0 +1,21 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": []
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/missing-narrative.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/missing-narrative.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/missing-narrative.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/multiple-json.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/multiple-json.json
new file mode 100644
index 00000000..afcb0c48
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/multiple-json.json
@@ -0,0 +1 @@
+{}{}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/multiple-policy-identities.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/multiple-policy-identities.json
new file mode 100644
index 00000000..3c1da034
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/multiple-policy-identities.json
@@ -0,0 +1,128 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ },
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/second-policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:1589cd845a13aa22ceef347d11dcc34d1b7ad27ade2f30c13979a0dc541c0a42"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/narrative-max.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/narrative-max.json
new file mode 100644
index 00000000..1654a29c
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/narrative-max.json
@@ -0,0 +1,40 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All bytes",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/narrative-over.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/narrative-over.json
new file mode 100644
index 00000000..472bee02
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/narrative-over.json
@@ -0,0 +1,40 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All bytes",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/nonfinite.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/nonfinite.json
new file mode 100644
index 00000000..b955cad2
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/nonfinite.json
@@ -0,0 +1 @@
+NaN
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/number-literal-over-128.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/number-literal-over-128.json
new file mode 100644
index 00000000..7f06a63b
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/number-literal-over-128.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","n":999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999}
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/opaque-original.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/opaque-original.json
new file mode 100644
index 00000000..de7caf77
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/opaque-original.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "byteLength": 16,
+ "mediaType": "application/pdf"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/opaque-original.pdf b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/opaque-original.pdf
new file mode 100644
index 00000000..6e5d30d0
Binary files /dev/null and b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/opaque-original.pdf differ
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/original-max.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/original-max.json
new file mode 100644
index 00000000..56fb0104
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/original-max.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:baa7a6d36ffa957552df230235c2d51d735f28d49c58a5f3438a3a973a25a37d",
+ "byteLength": 4194304,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/original-over.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/original-over.json
new file mode 100644
index 00000000..11e3bdb2
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/original-over.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:8d3d3c04baadfd31cbebf771836900097b5f36cc142b74e40747c7b372beab8b",
+ "byteLength": 4194305,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/permission-field.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/permission-field.json
new file mode 100644
index 00000000..40e9fa52
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/permission-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "permissions": true
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-canon-stale.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-canon-stale.json
new file mode 100644
index 00000000..67f7e993
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-canon-stale.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-identity-stale.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-identity-stale.json
new file mode 100644
index 00000000..73a64ea6
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-identity-stale.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/other-policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-version-ref-stale.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-version-ref-stale.json
new file mode 100644
index 00000000..94c71901
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/policy-version-ref-stale.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "2.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/prototype-selector-refused.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/prototype-selector-refused.json
new file mode 100644
index 00000000..f234c1f2
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/prototype-selector-refused.json
@@ -0,0 +1,81 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/registration-count-16.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/registration-count-16.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/registration-count-16.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/registration-count-17.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/registration-count-17.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/registration-count-17.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/requirements-field.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/requirements-field.json
new file mode 100644
index 00000000..f0e9d7d6
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/requirements-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "requirements": true
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/review-max.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/review-max.json
new file mode 100644
index 00000000..3dac3cb7
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/review-max.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/review-over.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/review-over.json
new file mode 100644
index 00000000..0cac4554
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/review-over.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/second-policy.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/second-policy.json
new file mode 100644
index 00000000..8820f848
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/second-policy.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/second-policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/section-id-duplicate.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/section-id-duplicate.json
new file mode 100644
index 00000000..4228ff5f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/section-id-duplicate.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "eligibility",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/shared-bytes-multiple-media-types.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/shared-bytes-multiple-media-types.json
new file mode 100644
index 00000000..9c137a27
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/shared-bytes-multiple-media-types.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/markdown"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/signature-field.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/signature-field.json
new file mode 100644
index 00000000..d59094e5
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/signature-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "signatures": true
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/singleton-with-id.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/singleton-with-id.json
new file mode 100644
index 00000000..e8938e94
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/singleton-with-id.json
@@ -0,0 +1,68 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "fallback",
+ "id": "fabricated"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/source-id-unknown.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/source-id-unknown.json
new file mode 100644
index 00000000..782bc946
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/source-id-unknown.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "unknown",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/stale-material-hash.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/stale-material-hash.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/stale-material-hash.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/stale-material-length.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/stale-material-length.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/stale-material-length.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/standalone-policy.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/standalone-policy.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/standalone-policy.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/surrogate.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/surrogate.json
new file mode 100644
index 00000000..4a1cb1ec
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/surrogate.json
@@ -0,0 +1 @@
+"\ud800"
\ No newline at end of file
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unknown-kind-registration-over.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unknown-kind-registration-over.json
new file mode 100644
index 00000000..4bbf5203
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unknown-kind-registration-over.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","kind":"unknown"}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unknown-rule.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unknown-rule.json
new file mode 100644
index 00000000..7e9abe9f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unknown-rule.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "unknown"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unregistered-media-type.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unregistered-media-type.json
new file mode 100644
index 00000000..e0406bbc
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unregistered-media-type.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/markdown"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unsupported-element.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unsupported-element.json
new file mode 100644
index 00000000..59055b25
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/unsupported-element.json
@@ -0,0 +1,68 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "outcome",
+ "id": "eligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-final-lf-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-final-lf-pack.json
new file mode 100644
index 00000000..a588c5fb
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-final-lf-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "urn:test:x\n",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-final-lf.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-final-lf.json
new file mode 100644
index 00000000..ccc861b7
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-final-lf.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "urn:test:x\n",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:47f2a4f8ac55a8731d5599090cda8396f35520a21414f9af1f91777b3ebaf12f"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-fragment-raw-brackets.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-fragment-raw-brackets.json
new file mode 100644
index 00000000..57b42460
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-fragment-raw-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/#a[b]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-invalid.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-invalid.json
new file mode 100644
index 00000000..43934511
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-invalid.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "relative/path",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-compressed.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-compressed.json
new file mode 100644
index 00000000..68e5dc78
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-compressed.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://[2001:db8::1]:8080/a",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-double-compression.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-double-compression.json
new file mode 100644
index 00000000..610c293d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-double-compression.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://[2001::db8::1]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-ipv4-tail.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-ipv4-tail.json
new file mode 100644
index 00000000..6ed1cc25
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-ipv4-tail.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://[::ffff:192.168.1.1]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json
new file mode 100644
index 00000000..b725cf36
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "http://[::ffff:192.168.001.001]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json
new file mode 100644
index 00000000..81c56210
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "http://[::ffff:192.168.001.001]/",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "byteLength": 1523,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:9128ab46ba265f6e5dff041a4a7f423f803e0c6959879cc570e793609aae1996"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-invalid-version.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-invalid-version.json
new file mode 100644
index 00000000..6ae88b8d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-invalid-version.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "foo://[vG.a]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase-pack.json
new file mode 100644
index 00000000..480c266c
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "foo://[v1.a]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase.json
new file mode 100644
index 00000000..aa46e52f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "foo://[v1.a]/",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:a0cf145d4d18c2e0259968b41186fb6c241be660e07c7fde7dabf7db304fa140"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase-pack.json
new file mode 100644
index 00000000..2f10f621
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "foo://[V1.a]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase.json
new file mode 100644
index 00000000..fafba2b7
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "foo://[V1.a]/",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:c794e18a50ee3b6cc076841ba1f03bbbcbfa7d91f3428aaef9a5b9004967bf21"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-numeric-regname-leading-zeros.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-numeric-regname-leading-zeros.json
new file mode 100644
index 00000000..63428d67
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-numeric-regname-leading-zeros.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://192.168.001.001/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets-pack.json
new file mode 100644
index 00000000..23f8928d
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/[x]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets.json
new file mode 100644
index 00000000..92153d8f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/[x]",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:10c3750e1583b45caa9a57baa8ffaa4dc2c091651aa1f725fc6618f47bc6425f"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-brackets.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-brackets.json
new file mode 100644
index 00000000..718dff40
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "foo://%5Bname%5D/%5Bpath%5D?b=%5Bc%5D#a%5Bb%5D",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-incomplete.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-incomplete.json
new file mode 100644
index 00000000..5df792a4
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-incomplete.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/a%2",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-nonhex.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-nonhex.json
new file mode 100644
index 00000000..b2d545d3
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-nonhex.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/a%GG",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-regname-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-regname-pack.json
new file mode 100644
index 00000000..7f592366
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-regname-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://%65xample.invalid/a",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-regname.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-regname.json
new file mode 100644
index 00000000..a0bca651
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-regname.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://%65xample.invalid/a",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:a638315c0dde2052fb78f3b2282e74f970c1e292221213339817856caadde3ed"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-unicode.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-unicode.json
new file mode 100644
index 00000000..20d60f6c
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-percent-unicode.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/%C3%A9",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-query-raw-brackets.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-query-raw-brackets.json
new file mode 100644
index 00000000..ac7c5b63
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-query-raw-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/?b=[c]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-raw-unicode.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-raw-unicode.json
new file mode 100644
index 00000000..9d4e50da
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-raw-unicode.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/é",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets-pack.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets-pack.json
new file mode 100644
index 00000000..a228f764
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "urn:test:[x]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets.json
new file mode 100644
index 00000000..683f091f
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "urn:test:[x]",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:3b4c17543d6b4fd14d6e28b206387dc989cc3a849626cd9bd84c17dabc1dda65"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-userinfo-percent-brackets.json b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-userinfo-percent-brackets.json
new file mode 100644
index 00000000..33f41f31
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/documents/uri-userinfo-percent-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "foo://u%5Bser%5D:p%40ss@example.invalid/a",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/vectors/manifest.json b/internal/policy/official/conformance/policy/1.0.0/vectors/manifest.json
new file mode 100644
index 00000000..5599acd5
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/vectors/manifest.json
@@ -0,0 +1,7446 @@
+{
+ "vectorSuiteVersion": "1",
+ "maturity": "draft",
+ "synthetic": true,
+ "cases": [
+ {
+ "id": "data-access",
+ "document": {
+ "path": "examples/data-access/adoption.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "procurement",
+ "document": {
+ "path": "examples/procurement/adoption.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/procurement/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "refunds",
+ "document": {
+ "path": "examples/refunds/adoption.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/refunds/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "standalone-policy",
+ "document": {
+ "path": "vectors/documents/standalone-policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "format-2",
+ "document": {
+ "path": "vectors/documents/format-2.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-patch",
+ "document": {
+ "path": "vectors/documents/format-patch.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-0",
+ "document": {
+ "path": "vectors/documents/format-0.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-int",
+ "document": {
+ "path": "vectors/documents/format-int.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-bool",
+ "document": {
+ "path": "vectors/documents/format-bool.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-short",
+ "document": {
+ "path": "vectors/documents/format-short.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-v-prefix",
+ "document": {
+ "path": "vectors/documents/format-v-prefix.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-leading-zero",
+ "document": {
+ "path": "vectors/documents/format-leading-zero.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-newline",
+ "document": {
+ "path": "vectors/documents/format-newline.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-unicode",
+ "document": {
+ "path": "vectors/documents/format-unicode.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-suffix",
+ "document": {
+ "path": "vectors/documents/format-suffix.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-missing",
+ "document": {
+ "path": "vectors/documents/format-missing.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-before-shape",
+ "document": {
+ "path": "vectors/documents/format-before-shape.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-before-canon",
+ "document": {
+ "path": "vectors/documents/format-before-canon.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "prototype-selector-refused",
+ "document": {
+ "path": "vectors/documents/prototype-selector-refused.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "desk-managed-alias-refused",
+ "document": {
+ "path": "vectors/documents/desk-managed-alias-refused.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-independent",
+ "document": {
+ "path": "vectors/documents/artifact-independent.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "artifact-max-256",
+ "document": {
+ "path": "vectors/documents/artifact-max-256.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "artifact-over-256",
+ "document": {
+ "path": "vectors/documents/artifact-over-256.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "artifact-number",
+ "document": {
+ "path": "vectors/documents/artifact-number.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-two-components",
+ "document": {
+ "path": "vectors/documents/artifact-two-components.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-leading-zero",
+ "document": {
+ "path": "vectors/documents/artifact-leading-zero.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-build",
+ "document": {
+ "path": "vectors/documents/artifact-build.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-newline",
+ "document": {
+ "path": "vectors/documents/artifact-newline.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "duplicate-json",
+ "document": {
+ "path": "vectors/documents/duplicate-json.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "bom",
+ "document": {
+ "path": "vectors/documents/bom.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "invalid-utf8",
+ "document": {
+ "path": "vectors/documents/invalid-utf8.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "surrogate",
+ "document": {
+ "path": "vectors/documents/surrogate.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "nonfinite",
+ "document": {
+ "path": "vectors/documents/nonfinite.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "multiple-json",
+ "document": {
+ "path": "vectors/documents/multiple-json.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "depth-33",
+ "document": {
+ "path": "vectors/documents/depth-33.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "depth-32",
+ "document": {
+ "path": "vectors/documents/depth-32.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "number-literal-over-128",
+ "document": {
+ "path": "vectors/documents/number-literal-over-128.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "companion-float",
+ "document": {
+ "path": "vectors/documents/companion-float.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "companion-unsafe-integer",
+ "document": {
+ "path": "vectors/documents/companion-unsafe-integer.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "document-max-bytes",
+ "document": {
+ "path": "vectors/documents/document-max-bytes.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "document-over-bytes",
+ "document": {
+ "repeatByte": 32,
+ "byteLength": 262145
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "approval-field",
+ "document": {
+ "path": "vectors/documents/approval-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "permission-field",
+ "document": {
+ "path": "vectors/documents/permission-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "signature-field",
+ "document": {
+ "path": "vectors/documents/signature-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "requirements-field",
+ "document": {
+ "path": "vectors/documents/requirements-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-invalid",
+ "document": {
+ "path": "vectors/documents/uri-invalid.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "source-id-unknown",
+ "document": {
+ "path": "vectors/documents/source-id-unknown.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "section-id-duplicate",
+ "document": {
+ "path": "vectors/documents/section-id-duplicate.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-stale-digest",
+ "document": {
+ "path": "vectors/documents/anchor-stale-digest.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-empty-range",
+ "document": {
+ "path": "vectors/documents/anchor-empty-range.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-outside-narrative",
+ "document": {
+ "path": "vectors/documents/anchor-outside-narrative.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-over-bound",
+ "document": {
+ "path": "vectors/documents/anchor-over-bound.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "anchor-utf8-split",
+ "document": {
+ "path": "vectors/documents/anchor-utf8-split.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "missing-narrative",
+ "document": {
+ "path": "vectors/documents/missing-narrative.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "missing-material"
+ }
+ },
+ {
+ "id": "stale-material-length",
+ "document": {
+ "path": "vectors/documents/stale-material-length.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 450,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "stale-material-hash",
+ "document": {
+ "path": "vectors/documents/stale-material-hash.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "unregistered-media-type",
+ "document": {
+ "path": "vectors/documents/unregistered-media-type.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "shared-bytes-multiple-media-types",
+ "document": {
+ "path": "vectors/documents/shared-bytes-multiple-media-types.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/markdown"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "opaque-original",
+ "document": {
+ "path": "vectors/documents/opaque-original.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/opaque-original.pdf"
+ },
+ "content": {
+ "bytesDigest": "sha256:af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "byteLength": 16,
+ "mediaType": "application/pdf"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "coverage-omitted",
+ "document": {
+ "path": "vectors/documents/coverage-omitted.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "coverage-outside",
+ "document": {
+ "path": "vectors/documents/coverage-outside.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "coverage-duplicate",
+ "document": {
+ "path": "vectors/documents/coverage-duplicate.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "unknown-rule",
+ "document": {
+ "path": "vectors/documents/unknown-rule.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "kind-id-confusion",
+ "document": {
+ "path": "vectors/documents/kind-id-confusion.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "singleton-with-id",
+ "document": {
+ "path": "vectors/documents/singleton-with-id.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "unsupported-element",
+ "document": {
+ "path": "vectors/documents/unsupported-element.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "consumer-graph",
+ "document": {
+ "path": "vectors/documents/consumer-graph.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "missing-governing-policy",
+ "document": {
+ "path": "vectors/documents/missing-governing-policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "policy-version-ref-stale",
+ "document": {
+ "path": "vectors/documents/policy-version-ref-stale.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "policy-canon-stale",
+ "document": {
+ "path": "vectors/documents/policy-canon-stale.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "policy-identity-stale",
+ "document": {
+ "path": "vectors/documents/policy-identity-stale.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "limited-scope-unknown",
+ "document": {
+ "path": "vectors/documents/limited-scope-unknown.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/procurement/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "limited-scope-missing-basis",
+ "document": {
+ "path": "vectors/documents/limited-scope-missing-basis.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/procurement/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "multiple-policy-identities",
+ "document": {
+ "path": "vectors/documents/multiple-policy-identities.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/second-policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "duplicate-policy-identity",
+ "document": {
+ "path": "vectors/documents/duplicate-policy-identity.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/second-policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "core-decimal-raw",
+ "document": {
+ "path": "vectors/documents/core-decimal-raw.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-decimal-raw-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "core-decimal-requested-canon",
+ "document": {
+ "path": "vectors/documents/core-decimal-requested-canon.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-decimal-requested-canon-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-canonical-identity"
+ }
+ },
+ {
+ "id": "core-unsafe-int-raw",
+ "document": {
+ "path": "vectors/documents/core-unsafe-int-raw.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-unsafe-int-raw-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "core-unsafe-int-requested-canon",
+ "document": {
+ "path": "vectors/documents/core-unsafe-int-requested-canon.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-unsafe-int-requested-canon-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-canonical-identity"
+ }
+ },
+ {
+ "id": "core-exponent-308",
+ "document": {
+ "path": "vectors/documents/core-exponent-308.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-exponent-308-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "core-exponent-over",
+ "document": {
+ "path": "vectors/documents/core-exponent-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-exponent-over-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "core-number-128",
+ "document": {
+ "path": "vectors/documents/core-number-128.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-number-128-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "byteLength": 1773,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "core-number-over-128",
+ "document": {
+ "path": "vectors/documents/core-number-over-128.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-number-over-128-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "byteLength": 1774,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "consumer-fallback-unknown",
+ "document": {
+ "path": "vectors/documents/consumer-fallback-unknown.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/consumer-fallback-unknown-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "byteLength": 1559,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-consumer"
+ }
+ },
+ {
+ "id": "consumer-rule-id-duplicate",
+ "document": {
+ "path": "vectors/documents/consumer-rule-id-duplicate.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/consumer-rule-id-duplicate-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "byteLength": 1828,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-consumer"
+ }
+ },
+ {
+ "id": "narrative-max",
+ "document": {
+ "path": "vectors/documents/narrative-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048576
+ },
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "narrative-over",
+ "document": {
+ "path": "vectors/documents/narrative-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048577
+ },
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "original-max",
+ "document": {
+ "path": "vectors/documents/original-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:baa7a6d36ffa957552df230235c2d51d735f28d49c58a5f3438a3a973a25a37d",
+ "byteLength": 4194304,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "original-over",
+ "document": {
+ "path": "vectors/documents/original-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 4194305
+ },
+ "content": {
+ "bytesDigest": "sha256:8d3d3c04baadfd31cbebf771836900097b5f36cc142b74e40747c7b372beab8b",
+ "byteLength": 4194305,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "review-max",
+ "document": {
+ "path": "vectors/documents/review-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048576
+ },
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "review-over",
+ "document": {
+ "path": "vectors/documents/review-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048577
+ },
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "informational-max",
+ "document": {
+ "path": "vectors/documents/informational-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048576
+ },
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "informational-over",
+ "document": {
+ "path": "vectors/documents/informational-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048577
+ },
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "aggregate-max",
+ "document": {
+ "path": "vectors/documents/aggregate-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 1,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:5d2bafc266e711ed1e303de871e5b281fea2083d96e579dd504798bba5a34b42",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 2,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:e4eb88707af669a2324ae8aad3950ac7b3f7837dec7823c94d4983a99ef13181",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 3,
+ "byteLength": 4194303
+ },
+ "content": {
+ "bytesDigest": "sha256:3b9ba78a58567b74d9420579bdb199d57d92eb434f30ebf6118b2e0ec7f0fb63",
+ "byteLength": 4194303,
+ "mediaType": "application/pdf"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "aggregate-shared-media-counted-once",
+ "document": {
+ "path": "vectors/documents/aggregate-shared-media-counted-once.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 1,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:5d2bafc266e711ed1e303de871e5b281fea2083d96e579dd504798bba5a34b42",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 2,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:e4eb88707af669a2324ae8aad3950ac7b3f7837dec7823c94d4983a99ef13181",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 3,
+ "byteLength": 4194303
+ },
+ "content": {
+ "bytesDigest": "sha256:3b9ba78a58567b74d9420579bdb199d57d92eb434f30ebf6118b2e0ec7f0fb63",
+ "byteLength": 4194303,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "text/markdown"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "aggregate-over",
+ "document": {
+ "path": "vectors/documents/aggregate-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 1,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:5d2bafc266e711ed1e303de871e5b281fea2083d96e579dd504798bba5a34b42",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 2,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:e4eb88707af669a2324ae8aad3950ac7b3f7837dec7823c94d4983a99ef13181",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 3,
+ "byteLength": 4194303
+ },
+ "content": {
+ "bytesDigest": "sha256:3b9ba78a58567b74d9420579bdb199d57d92eb434f30ebf6118b2e0ec7f0fb63",
+ "byteLength": 4194303,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "text/markdown"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 121,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "registration-count-16",
+ "document": {
+ "path": "vectors/documents/registration-count-16.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "registration-count-17",
+ "document": {
+ "path": "vectors/documents/registration-count-17.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "malformed-over-depth",
+ "document": {
+ "path": "vectors/documents/malformed-over-depth.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "unknown-kind-registration-over",
+ "document": {
+ "path": "vectors/documents/unknown-kind-registration-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "unknown-kind-stale-length",
+ "document": {
+ "path": "vectors/documents/unknown-kind-registration-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 2,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "unsupported-format-missing-source",
+ "document": {
+ "path": "vectors/documents/format-2.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "vectors/intentionally-missing-transport.bin"
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "early-hash-failure-later-missing-source",
+ "document": {
+ "path": "examples/data-access/policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/intentionally-missing-transport.bin"
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "vector-carrier-nul-path",
+ "document": {
+ "path": "examples/data-access/policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "vectors/private\u0000transport.bin"
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-carrier"
+ }
+ },
+ {
+ "id": "uri-final-lf",
+ "document": {
+ "path": "vectors/documents/uri-final-lf.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-final-lf-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-ipv6-leading-zero-ipv4-tail",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "byteLength": 1523,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-raw-unicode",
+ "document": {
+ "path": "vectors/documents/uri-raw-unicode.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-percent-unicode",
+ "document": {
+ "path": "vectors/documents/uri-percent-unicode.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-percent-incomplete",
+ "document": {
+ "path": "vectors/documents/uri-percent-incomplete.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-percent-nonhex",
+ "document": {
+ "path": "vectors/documents/uri-percent-nonhex.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-ipv6-compressed",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-compressed.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-ipv6-ipv4-tail",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-ipv4-tail.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-ipv6-double-compression",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-double-compression.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-ipvfuture-lowercase",
+ "document": {
+ "path": "vectors/documents/uri-ipvfuture-lowercase.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-ipvfuture-lowercase-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-ipvfuture-uppercase",
+ "document": {
+ "path": "vectors/documents/uri-ipvfuture-uppercase.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-ipvfuture-uppercase-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-ipvfuture-invalid-version",
+ "document": {
+ "path": "vectors/documents/uri-ipvfuture-invalid-version.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-percent-regname",
+ "document": {
+ "path": "vectors/documents/uri-percent-regname.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-percent-regname-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-userinfo-percent-brackets",
+ "document": {
+ "path": "vectors/documents/uri-userinfo-percent-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-percent-brackets",
+ "document": {
+ "path": "vectors/documents/uri-percent-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ },
+ {
+ "id": "uri-rootless-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-rootless-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-rootless-raw-brackets-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-path-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-path-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-path-raw-brackets-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-query-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-query-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-fragment-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-fragment-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-numeric-regname-leading-zeros",
+ "document": {
+ "path": "vectors/documents/uri-numeric-regname-leading-zeros.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "draft"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/conformance/policy/1.0.0/verify.py b/internal/policy/official/conformance/policy/1.0.0/verify.py
new file mode 100644
index 00000000..0b1b8d93
--- /dev/null
+++ b/internal/policy/official/conformance/policy/1.0.0/verify.py
@@ -0,0 +1,432 @@
+#!/usr/bin/env python3
+"""Offline checker for the DRAFT Policy companion 1.0.0, never authority."""
+
+import argparse
+import ipaddress
+import json
+import re
+import sys
+from pathlib import Path
+
+from jsonschema import Draft202012Validator, FormatChecker
+from referencing import Registry, Resource
+from rfc3986_validator import URI_RE_COMP
+
+HERE = Path(__file__).resolve().parent
+ROOT = HERE.parents[2]
+SCHEMAS = ROOT / "schema/policy/1.0.0"
+sys.dont_write_bytecode = True
+sys.path.insert(0, str(ROOT / "tools"))
+import dialect_verify as spec_canon
+
+MAX_DOCUMENT_BYTES = 262144
+MAX_MATERIAL_BYTES = 1048576
+MAX_ORIGINAL_BYTES = 4194304
+MAX_TOTAL_MATERIAL_BYTES = 16777216
+MAX_MATERIALS = 16
+MAX_DEPTH = 32
+VERSION = re.compile(r"(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)", re.ASCII)
+FORMAT_VERSION = "1.0.0"
+VALID = {"status": "valid", "formatVersion": FORMAT_VERSION, "maturity": "draft"}
+CODES = (
+ "input-over-bound", "invalid-json", "invalid-selector", "unsupported-format",
+ "invalid-document", "missing-material", "reference-mismatch", "invalid-anchor",
+ "invalid-coverage", "invalid-consumer", "unsupported-canonical-identity", "invalid-carrier",
+)
+CAPABILITY = {
+ "capability": "jps-policy-companion-offline",
+ "maturity": "draft",
+ "formatVersions": [FORMAT_VERSION],
+ "consumerSpecVersions": ["0.2.0-draft"],
+ "kinds": ["policy", "governing-adoption"],
+ "features": ["exact-byte-sha256", "utf8-section-anchors", "scoped-total-coverage",
+ "typed-core-pack-references", "optional-jps-canon-identity", "multiple-media-types"],
+ "limits": {"documentBytes": MAX_DOCUMENT_BYTES, "documentDepth": MAX_DEPTH,
+ "numberLiteralCharacters": 128, "exponentMagnitude": 308,
+ "materialBytes": MAX_MATERIAL_BYTES, "originalBytes": MAX_ORIGINAL_BYTES,
+ "distinctRetainedBytes": MAX_TOTAL_MATERIAL_BYTES, "materialRegistrations": MAX_MATERIALS,
+ "versionCharacters": 256, "sections": 64, "sources": 16, "governingPolicies": 16,
+ "consumerElementsPerSection": 64, "textCharacters": 4096, "uriCharacters": 2048,
+ "localIdCharacters": 128, "mediaTypeCharacters": 128, "sourceRefsPerSection": 16,
+ "scopeSectionIds": 64, "coverageRecordsPerPolicy": 64, "informationalSources": 16,
+ "canonicalIntegerMagnitude": 9007199254740991},
+ "excludes": ["stable-format", "graph-consumers", "evaluation", "full-core-semantics",
+ "signatures", "review-assertion-trust", "live-authority", "permissions", "currency",
+ "source-fetch", "automatic-migration", "independent-interoperability-evidence"],
+ "refusalCodes": list(CODES),
+}
+
+
+class ContractError(ValueError):
+ """Finite safe code only: never include retained input in public diagnostics."""
+ def __init__(self, code):
+ assert code in CODES
+ super().__init__(code)
+ self.code = code
+
+
+def require(condition, code):
+ if not condition:
+ raise ContractError(code)
+
+
+def identity(data, media_type):
+ return {"bytesDigest": spec_canon.digest_of(data), "byteLength": len(data), "mediaType": media_type}
+
+
+def strict_json(data):
+ require(len(data) <= MAX_DOCUMENT_BYTES, "input-over-bound")
+ try:
+ return spec_canon.read_document(data, "candidate document", MAX_DEPTH)
+ except spec_canon.Refused as error:
+ raise ContractError("input-over-bound" if error.name == "input-over-bound" else "invalid-json") from error
+
+
+def plain(value):
+ if isinstance(value, spec_canon.Num):
+ return int(value.literal)
+ if isinstance(value, dict):
+ return {key: plain(child) for key, child in value.items()}
+ if isinstance(value, list):
+ return [plain(child) for child in value]
+ return value
+
+
+def canon_document(value):
+ try:
+ spec_canon.canon(value)
+ return plain(value)
+ except spec_canon.OutsideDomain as error:
+ raise ContractError("invalid-document") from error
+
+
+def read_json(data):
+ """For local schemas/carriers; companion reading additionally selects format first."""
+ return canon_document(strict_json(data))
+
+
+def select_format(document):
+ require(isinstance(document, dict), "invalid-selector")
+ selector = document.get("formatVersion")
+ require(isinstance(selector, str) and len(selector) <= 256 and VERSION.fullmatch(selector), "invalid-selector")
+ require(selector == FORMAT_VERSION, "unsupported-format")
+
+
+def read_companion(data):
+ value = strict_json(data)
+ select_format(value) # No schema, identity interpretation, or migration before exact dispatch.
+ return canon_document(value)
+
+
+def canonical_identity(data):
+ try:
+ value = strict_json(data)
+ digest = spec_canon.digest_of(spec_canon.canon(value))
+ except (ContractError, spec_canon.OutsideDomain) as error:
+ if isinstance(error, ContractError) and error.code == "input-over-bound":
+ raise
+ raise ContractError("unsupported-canonical-identity") from error
+ return {"profile": "jps-canon", "canonicalDigest": digest}
+
+
+def core_schema_view(value):
+ if isinstance(value, spec_canon.Num):
+ number = value.value # Exact Decimal, without float rounding or canon restriction.
+ return int(number) if number == number.to_integral_value() else number
+ if isinstance(value, dict):
+ return {key: core_schema_view(child) for key, child in value.items()}
+ if isinstance(value, list):
+ return [core_schema_view(child) for child in value]
+ return value
+
+
+def candidate_uri(value):
+ """RFC 3986 URI production; repair three pinned-validator defects locally."""
+ if not isinstance(value, str):
+ return True # JSON Schema's type keyword handles non-string values.
+ if any(not 0x21 <= ord(char) <= 0x7E for char in value):
+ return False
+ scheme = re.match(r"[A-Za-z][A-Za-z0-9+.-]*:", value)
+ if scheme is None:
+ return False
+ probe = value
+ if value[scheme.end():].startswith("//"):
+ authority_start = scheme.end() + 2
+ authority = re.split(r"[/?#]", value[authority_start:], maxsplit=1)[0]
+ host_port = authority.rsplit("@", 1)[-1]
+ if host_port.startswith("["):
+ end = host_port.find("]")
+ if end < 0:
+ return False
+ literal = host_port[1:end]
+ if literal.startswith(("v", "V")):
+ # ABNF quoted strings are case-insensitive. Change only the
+ # validation probe, never retained bytes or identity comparisons.
+ flag = authority_start + len(authority) - len(host_port) + 1
+ probe = value[:flag] + "v" + value[flag + 1:]
+ else:
+ try:
+ ipaddress.IPv6Address(literal)
+ except ValueError:
+ return False
+ # fullmatch refuses a final LF that the dependency's anchored match accepts.
+ # Its remaining grammar checks percent triplets and each component's alphabet.
+ return URI_RE_COMP.fullmatch(probe) is not None
+
+
+def validators():
+ schemas = {name: read_json(((SCHEMAS if name in ("common", "policy", "governing-adoption") else HERE) / (name + ".schema.json")).read_bytes())
+ for name in ("common", "policy", "governing-adoption", "fixture", "vectors")}
+ registry = Registry().with_resources((schema["$id"], Resource.from_contents(schema)) for schema in schemas.values())
+ schemas["core"] = read_json((SCHEMAS / "consumer-core-0.2.0-draft.schema.json").read_bytes())
+ candidate_checker = FormatChecker()
+ if "uri" not in candidate_checker.checkers or candidate_checker.conforms("not a URI", "uri"):
+ raise RuntimeError("Install pinned requirements-dev.txt URI dependencies")
+ # The consuming Pack is checked within this candidate reader too. Override
+ # this instance only; shared Core/prototype validators keep their own checker.
+ candidate_checker.checks("uri")(candidate_uri)
+ result = {}
+ for name, schema in schemas.items():
+ Draft202012Validator.check_schema(schema)
+ result[name] = Draft202012Validator(schema, registry=registry, format_checker=candidate_checker)
+ return result
+
+
+VALIDATORS = None
+
+
+def check_schema(name, document):
+ global VALIDATORS
+ if VALIDATORS is None:
+ VALIDATORS = validators()
+ errors = list(VALIDATORS[name].iter_errors(core_schema_view(document) if name == "core" else document))
+ # Schema maxima are resource refusals; required/type/enum/minimum failures are semantic.
+ def over(error):
+ return error.validator in ("maxItems", "maxLength", "maximum") or any(over(child) for child in error.context)
+ if any(over(error) for error in errors):
+ raise ContractError("input-over-bound")
+ require(not errors, "invalid-consumer" if name == "core" else "invalid-carrier" if name == "fixture" else "invalid-document")
+
+
+def unique_by_id(items, code):
+ result = {}
+ for item in items:
+ require(item["id"] not in result, code)
+ result[item["id"]] = item
+ return result
+
+
+def register_material(reference, raw, material):
+ check_schema("common", reference)
+ require(len(raw) <= MAX_ORIGINAL_BYTES, "input-over-bound")
+ entry = material.get(reference["bytesDigest"])
+ require(entry is None or entry[0] == raw, "reference-mismatch")
+ require(identity(raw, reference["mediaType"]) == reference, "reference-mismatch")
+ total = sum(len(value[0]) for value in material.values())
+ require(total + (len(raw) if entry is None else 0) <= MAX_TOTAL_MATERIAL_BYTES, "input-over-bound")
+ media_types = {reference["mediaType"]}
+ if entry is not None:
+ media_types.update(entry[1])
+ material[reference["bytesDigest"]] = (entry[0] if entry is not None else raw, media_types)
+
+
+def resolve(reference, material, limit=MAX_MATERIAL_BYTES):
+ check_schema("common", reference)
+ require(reference["byteLength"] <= limit, "input-over-bound")
+ entry = material.get(reference["bytesDigest"])
+ require(entry is not None, "missing-material")
+ require(reference["mediaType"] in entry[1], "reference-mismatch")
+ require(identity(entry[0], reference["mediaType"]) == reference, "reference-mismatch")
+ return entry[0]
+
+
+def check_artifact(reference, kind, material):
+ require(reference["kind"] == kind, "reference-mismatch")
+ require(reference["content"]["mediaType"] == "application/json", "invalid-document")
+ raw = resolve(reference["content"], material, MAX_DOCUMENT_BYTES)
+ document = strict_json(raw) if kind == "pack" else read_companion(raw)
+ require(isinstance(document, dict), "invalid-consumer" if kind == "pack" else "invalid-document")
+ require(reference["id"] == document.get("id") and reference["version"] == document.get("version"), "reference-mismatch")
+ if "canonicalIdentity" in reference:
+ require(reference["canonicalIdentity"] == canonical_identity(raw), "reference-mismatch")
+ return document
+
+
+def check_policy(document, material):
+ select_format(document)
+ check_schema("policy", document)
+ narrative = resolve(document["content"], material)
+ require(document["content"]["mediaType"] == "text/plain", "invalid-document")
+ try:
+ narrative.decode("utf-8")
+ except UnicodeError as error:
+ raise ContractError("invalid-anchor") from error
+ sources = unique_by_id(document["sourceProvenance"], "invalid-document")
+ for source in sources.values():
+ resolve(source["content"], material, MAX_ORIGINAL_BYTES)
+ sections = unique_by_id(document["sections"], "invalid-anchor")
+ for section in sections.values():
+ anchor = section["anchor"]
+ start, end = anchor["startByte"], anchor["endByte"]
+ require(0 <= start < end <= len(narrative), "invalid-anchor")
+ try:
+ narrative[:start].decode("utf-8")
+ narrative[start:end].decode("utf-8")
+ except UnicodeError as error:
+ raise ContractError("invalid-anchor") from error
+ require(spec_canon.digest_of(narrative[start:end]) == anchor["bytesDigest"], "invalid-anchor")
+ for source_ref in section.get("sourceRefs", []):
+ require(source_ref["sourceId"] in sources, "invalid-anchor")
+ return sections
+
+
+def check_adoption(document, material):
+ select_format(document)
+ check_schema("governing-adoption", document)
+ consumer = check_artifact(document["consumer"], "pack", material)
+ check_schema("core", consumer)
+ rules = unique_by_id(consumer["rules"], "invalid-consumer")
+ exceptions = unique_by_id(consumer.get("exceptions", []), "invalid-consumer")
+ outcomes = unique_by_id(consumer["outcomes"], "invalid-consumer")
+ if "fallbackOutcome" in consumer:
+ require(consumer["fallbackOutcome"] in outcomes, "invalid-consumer")
+ for exception in exceptions.values():
+ if "targetRule" in exception:
+ require(exception["targetRule"] in rules, "invalid-consumer")
+ if "outcome" in exception:
+ require(exception["outcome"] in outcomes, "invalid-consumer")
+ policies = set()
+ for governing in document["governingPolicies"]:
+ reference = governing["policy"]
+ policy = check_artifact(reference, "policy", material)
+ sections = check_policy(policy, material)
+ require(reference["id"] not in policies, "invalid-coverage")
+ policies.add(reference["id"])
+ scope = governing["scope"]
+ selected = set(sections) if scope["kind"] == "whole-policy" else set(scope["sectionIds"])
+ require(selected.issubset(sections), "invalid-coverage")
+ if scope["kind"] == "sections":
+ resolve(scope["reviewBasis"], material)
+ seen = set()
+ for coverage in governing["coverage"]:
+ section_id = coverage["sectionId"]
+ require(section_id in selected and section_id not in seen, "invalid-coverage")
+ seen.add(section_id)
+ if coverage["status"] == "implemented":
+ elements_seen = set()
+ for element in coverage["consumerElements"]:
+ kind = element["kind"]
+ key = (kind, element.get("id"))
+ require(key not in elements_seen, "invalid-coverage")
+ elements_seen.add(key)
+ if kind in ("rule", "exception"):
+ require(element["id"] in (rules if kind == "rule" else exceptions), "invalid-coverage")
+ else:
+ require(("applicability" if kind == "applicability" else "fallbackOutcome") in consumer, "invalid-coverage")
+ resolve(coverage["reviewBasis"], material)
+ require(seen == selected, "invalid-coverage")
+ for source in document.get("informationalSources", []):
+ resolve(source, material)
+
+
+def check_document(raw, material):
+ document = read_companion(raw)
+ kind = document.get("kind")
+ require(kind in ("policy", "governing-adoption"), "invalid-document")
+ (check_policy if kind == "policy" else check_adoption)(document, material)
+
+
+def verify_input(raw, registrations, load_material=None):
+ """Check bytes pairs, or acquire each carrier source lazily through a supplied loader."""
+ def check():
+ document = read_companion(raw)
+ require(len(registrations) <= MAX_MATERIALS, "input-over-bound")
+ material = {}
+ for reference, retained in registrations:
+ raw_material = retained if load_material is None else load_material(retained)
+ register_material(reference, raw_material, material)
+ kind = document.get("kind")
+ require(kind in ("policy", "governing-adoption"), "invalid-document")
+ (check_policy if kind == "policy" else check_adoption)(document, material)
+ return result(check)
+
+
+def result(callback):
+ try:
+ callback()
+ except ContractError as error:
+ return {"status": "refused", "code": error.code}
+ return dict(VALID)
+
+
+def read_local(path, limit):
+ try:
+ with path.open("rb") as stream:
+ raw = stream.read(limit + 1)
+ except OSError as error:
+ raise ContractError("missing-material") from error
+ require(len(raw) <= limit, "input-over-bound")
+ return raw
+
+
+def local_path(directory, name, allow_nested=False):
+ require(isinstance(name, str) and "\x00" not in name, "invalid-carrier")
+ try:
+ require(not Path(name).is_absolute(), "invalid-carrier")
+ path = (directory / name).resolve()
+ except (ValueError, OSError, RuntimeError) as error:
+ raise ContractError("invalid-carrier") from error
+ require(path.is_relative_to(directory) if allow_nested else path.parent == directory, "invalid-carrier")
+ return path
+
+
+def load_bundle(directory):
+ """Local synthetic fixture carrier, never a release or dependency-closure protocol."""
+ directory = Path(directory).resolve()
+ manifest = read_json(read_local(directory / "fixture.json", MAX_DOCUMENT_BYTES))
+ check_schema("fixture", manifest)
+ material, by_path = {}, {}
+ for entry in manifest["materials"]:
+ name, reference = entry["path"], entry["content"]
+ require(name not in by_path, "invalid-carrier")
+ path = local_path(directory, name)
+ remaining = MAX_TOTAL_MATERIAL_BYTES - sum(len(value[0]) for value in material.values())
+ limit = MAX_ORIGINAL_BYTES if reference["bytesDigest"] in material else min(MAX_ORIGINAL_BYTES, remaining)
+ raw = read_local(path, limit)
+ register_material(reference, raw, material)
+ by_path[name] = raw
+ for role in ("policy", "consumer", "adoption"):
+ require(manifest[role] in by_path, "missing-material")
+ return manifest, material, by_path
+
+
+def verify_bundle(directory):
+ def check():
+ manifest, material, by_path = load_bundle(directory)
+ policy = read_companion(by_path[manifest["policy"]])
+ check_policy(policy, material)
+ adoption = read_companion(by_path[manifest["adoption"]])
+ check_adoption(adoption, material)
+ policy_content = identity(by_path[manifest["policy"]], "application/json")
+ require(any(item["policy"]["content"] == policy_content for item in adoption["governingPolicies"]), "reference-mismatch")
+ require(adoption["consumer"]["content"] == identity(by_path[manifest["consumer"]], "application/json"), "reference-mismatch")
+ return result(check)
+
+
+def main(argv=None):
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--capabilities", action="store_true")
+ parser.add_argument("directory", type=Path, nargs="?")
+ args = parser.parse_args(argv)
+ if args.capabilities:
+ answer = CAPABILITY
+ elif args.directory is not None:
+ answer = verify_bundle(args.directory)
+ else:
+ parser.error("supply one fixture directory or --capabilities")
+ print(json.dumps(answer, ensure_ascii=True, separators=(",", ":")))
+ return 1 if answer.get("status") == "refused" else 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/internal/policy/official/provenance.json b/internal/policy/official/provenance.json
new file mode 100644
index 00000000..3a81ea20
--- /dev/null
+++ b/internal/policy/official/provenance.json
@@ -0,0 +1,2334 @@
+{
+ "sourceRepository": "https://github.com/Judgment-Pack/judgment-pack-spec",
+ "sourceRevision": "0799b37b74e35c4a86bfbf70f7bee80bdb7bbe94",
+ "sourceRelease": "policy-v1.0.0-draft.1",
+ "sourceArchive": "judgment-pack-policy_1.0.0-draft.1_artifacts.tar.gz",
+ "sourceArchiveSHA256": "ce9bac7fc4a9e2658146a540966aec1e935e7624ba5a7ad70ff074319078b6b9",
+ "formatVersion": "1.0.0",
+ "maturity": "draft",
+ "license": "Apache-2.0",
+ "files": [
+ {
+ "sourcePath": "CONTRIBUTING.md",
+ "path": "CONTRIBUTING.md",
+ "sha256": "9af4117896a9cbad583db78eb9590320a647f262617a510d7038ad15572511fd",
+ "byteLength": 3558
+ },
+ {
+ "sourcePath": "GOVERNANCE.md",
+ "path": "GOVERNANCE.md",
+ "sha256": "980e7426f8e224cbaaa76e1cf0bb6a79996f48c8ddf99667db0eab3368ef9d4f",
+ "byteLength": 19281
+ },
+ {
+ "sourcePath": "LICENSE",
+ "path": "LICENSE",
+ "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
+ "byteLength": 11358
+ },
+ {
+ "sourcePath": "NOTICE",
+ "path": "NOTICE",
+ "sha256": "acdae3bd2771acf3a456db3241e33d514c6cfc4ee9ea9cdb05344b6b7a96836e",
+ "byteLength": 194
+ },
+ {
+ "sourcePath": "VERSIONING.md",
+ "path": "VERSIONING.md",
+ "sha256": "9457c9a3286ed68644993a12630ed12127ab4c9e05b9459d649bfa1c0bad5797",
+ "byteLength": 6444
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/ADOPTION.md",
+ "path": "conformance/policy/1.0.0/ADOPTION.md",
+ "sha256": "186da8312520cfb97ee5cd262d2740fcf8432f140f9e7be314f9f10ca27feb6b",
+ "byteLength": 7645
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/MIGRATION.md",
+ "path": "conformance/policy/1.0.0/MIGRATION.md",
+ "sha256": "574bb613a957e607cbf974b502e897105374f28b0c045891cb1a4c82b7315204",
+ "byteLength": 4354
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/PROMOTION.md",
+ "path": "conformance/policy/1.0.0/PROMOTION.md",
+ "sha256": "2796ed68705a3a1988946793adc0a7ce4d120a36dd61bfedf6736d9d9ebf3ff6",
+ "byteLength": 3535
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/PUBLICATION.md",
+ "path": "conformance/policy/1.0.0/PUBLICATION.md",
+ "sha256": "54fcc113f1566a91de295f39886ecd330995325071373252af414fbbf7f114b1",
+ "byteLength": 5442
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/README.md",
+ "path": "conformance/policy/1.0.0/README.md",
+ "sha256": "38cdb76e0a589711fde00d8f3f54ed5b3f8265cded33f13ec7af87a5a36b42b8",
+ "byteLength": 1974
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/candidate-1.0.0-pin.json",
+ "path": "conformance/policy/1.0.0/candidate-1.0.0-pin.json",
+ "sha256": "dff3acca847d2b9785dd2609426e6b7a8cc6b07025a4fbcb18c53b4f55fba92a",
+ "byteLength": 20977
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/capabilities.json",
+ "path": "conformance/policy/1.0.0/capabilities.json",
+ "sha256": "2c6d87b7b925358c71f0d98a23c599fe024d841178c2458ccfc3c74674555ecf",
+ "byteLength": 1750
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/check_vectors.py",
+ "path": "conformance/policy/1.0.0/check_vectors.py",
+ "sha256": "f7400f8869ae56cd8994079b036d070df05909690c487aaa994fc7119dafa448",
+ "byteLength": 2131
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/data-access/adoption.json",
+ "path": "conformance/policy/1.0.0/examples/data-access/adoption.json",
+ "sha256": "98294b5df0876cc793f236fa5184380aa37f2e459e1f630a5e613237404c2ec0",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/data-access/consumer-pack.json",
+ "path": "conformance/policy/1.0.0/examples/data-access/consumer-pack.json",
+ "sha256": "c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/data-access/fixture.json",
+ "path": "conformance/policy/1.0.0/examples/data-access/fixture.json",
+ "sha256": "95575efc4fc7571089f17b7684c9ea66c7f16d52cb5b7032c0c494f3f73c25db",
+ "byteLength": 1599
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/data-access/interpretation.txt",
+ "path": "conformance/policy/1.0.0/examples/data-access/interpretation.txt",
+ "sha256": "7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/data-access/narrative.txt",
+ "path": "conformance/policy/1.0.0/examples/data-access/narrative.txt",
+ "sha256": "801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/data-access/policy.json",
+ "path": "conformance/policy/1.0.0/examples/data-access/policy.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/data-access/source.txt",
+ "path": "conformance/policy/1.0.0/examples/data-access/source.txt",
+ "sha256": "9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/procurement/adoption.json",
+ "path": "conformance/policy/1.0.0/examples/procurement/adoption.json",
+ "sha256": "e9c871b2e7dc7448e46b2d4d347beb504bbe0a691be11df4283a95a693208703",
+ "byteLength": 3055
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/procurement/consumer-pack.json",
+ "path": "conformance/policy/1.0.0/examples/procurement/consumer-pack.json",
+ "sha256": "d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/procurement/fixture.json",
+ "path": "conformance/policy/1.0.0/examples/procurement/fixture.json",
+ "sha256": "bd05d532515eff20322a88c8cbb34899849479f4f4fef8a1f2e3d577a2b96205",
+ "byteLength": 1599
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/procurement/interpretation.txt",
+ "path": "conformance/policy/1.0.0/examples/procurement/interpretation.txt",
+ "sha256": "14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/procurement/narrative.txt",
+ "path": "conformance/policy/1.0.0/examples/procurement/narrative.txt",
+ "sha256": "993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/procurement/policy.json",
+ "path": "conformance/policy/1.0.0/examples/procurement/policy.json",
+ "sha256": "539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/procurement/source.txt",
+ "path": "conformance/policy/1.0.0/examples/procurement/source.txt",
+ "sha256": "4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/refunds/adoption.json",
+ "path": "conformance/policy/1.0.0/examples/refunds/adoption.json",
+ "sha256": "7c7cd121fc4510fff19b8bcaf120ce1a9cb3f7e60b8e811ce9be917799367bc8",
+ "byteLength": 2729
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/refunds/consumer-pack.json",
+ "path": "conformance/policy/1.0.0/examples/refunds/consumer-pack.json",
+ "sha256": "2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/refunds/fixture.json",
+ "path": "conformance/policy/1.0.0/examples/refunds/fixture.json",
+ "sha256": "48b47e5ca483e53ee4c943409f9892b518108cd0f94ead4f2715852d25a74d60",
+ "byteLength": 1595
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/refunds/interpretation.txt",
+ "path": "conformance/policy/1.0.0/examples/refunds/interpretation.txt",
+ "sha256": "63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/refunds/narrative.txt",
+ "path": "conformance/policy/1.0.0/examples/refunds/narrative.txt",
+ "sha256": "909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/refunds/policy.json",
+ "path": "conformance/policy/1.0.0/examples/refunds/policy.json",
+ "sha256": "8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/examples/refunds/source.txt",
+ "path": "conformance/policy/1.0.0/examples/refunds/source.txt",
+ "sha256": "ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/fixture.schema.json",
+ "path": "conformance/policy/1.0.0/fixture.schema.json",
+ "sha256": "2525f2dc9277ab9321fe66bf8968bbcd421986bb216a8eaa1bb0efdac65f79fc",
+ "byteLength": 1451
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/prototype-0.0.2-pin.json",
+ "path": "conformance/policy/1.0.0/prototype-0.0.2-pin.json",
+ "sha256": "48a264397902303c0373c4ae11e2bde9b55474f7ff76b33e1fdc3f919c70bacb",
+ "byteLength": 3146
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/test_contract.py",
+ "path": "conformance/policy/1.0.0/test_contract.py",
+ "sha256": "04a667ec30eb8e790cc5fbe05aa5406ff0b8f57e3a48fa70a37d52c9e9bbeea3",
+ "byteLength": 14906
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors.schema.json",
+ "path": "conformance/policy/1.0.0/vectors.schema.json",
+ "sha256": "d622622af5abd47b270e5cc970c76870af283ff50299fbfe1d724a3e74a10376",
+ "byteLength": 6002
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/README.md",
+ "path": "conformance/policy/1.0.0/vectors/README.md",
+ "sha256": "eab4e90c6e946b60842ff65f5ed7b769c6059fc03f77fb9351a203eddcadbaa9",
+ "byteLength": 6503
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/aggregate-max.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/aggregate-max.json",
+ "sha256": "356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "byteLength": 683
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/aggregate-over.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/aggregate-over.json",
+ "sha256": "356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "byteLength": 683
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/aggregate-shared-media-counted-once.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/aggregate-shared-media-counted-once.json",
+ "sha256": "356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "byteLength": 683
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/anchor-empty-range.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/anchor-empty-range.json",
+ "sha256": "f57abd537598b6f2d4f21f5531cc8b287cb8a408174b1699afe23ab862bba431",
+ "byteLength": 2018
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/anchor-outside-narrative.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/anchor-outside-narrative.json",
+ "sha256": "aa0fed3939d88597f5a2eab96e1a9305f5671c9d9ffc1140c3a79a0a985d24e9",
+ "byteLength": 2022
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/anchor-over-bound.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/anchor-over-bound.json",
+ "sha256": "0f10c69c68a792e43de7b56978bce3073f2baba2ef026607d5c21104e113916f",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/anchor-stale-digest.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/anchor-stale-digest.json",
+ "sha256": "f15662d3349adebe3f37358da15f6c1cbea7a531ead7be55b13a83e6fea865f0",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/anchor-utf8-split.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/anchor-utf8-split.json",
+ "sha256": "dbb8e91eeaaec4ca6afa0b60ed9ab7621fc46b464052181fc15a7207880d8485",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/approval-field.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/approval-field.json",
+ "sha256": "b6d55b494d997d827ceda4f0c7b0ff4c644171928f22b2c64bff7ba049cdaae6",
+ "byteLength": 2039
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-build.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-build.json",
+ "sha256": "d8e6a2f1de1400d0f93deb768709a79dd2608581a59f3d91c48c0fe46b53da3e",
+ "byteLength": 2025
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-independent.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-independent.json",
+ "sha256": "b29b0d41f9c53df4ccf45b304e4307848a5aca82f9669ce6a6f532ba9eca7efa",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-leading-zero.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-leading-zero.json",
+ "sha256": "9bac870cd83f3ce25b4d02c820d962d084de92ea0ccdefb1b4a86e194ece3be0",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-max-256.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-max-256.json",
+ "sha256": "79b1ac4516f3be2234b1a333a09679474c8f0f9d4c8743cf0b552eaaa97ff06c",
+ "byteLength": 2270
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-newline.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-newline.json",
+ "sha256": "7b398d8f7062dc484dd919271c3cb4d090389604a1504b356892cedf06e29431",
+ "byteLength": 2021
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-number.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-number.json",
+ "sha256": "4d81f8abe5de7580d5896bc2538dc7c7bb6eca300a7fb3a8dab7bf8ad9525cb1",
+ "byteLength": 2013
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-over-256.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-over-256.json",
+ "sha256": "eb73ca4e4a698530f0dee89fefdd9a0914ca0af55202c4da478797a9de491278",
+ "byteLength": 2271
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/artifact-two-components.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/artifact-two-components.json",
+ "sha256": "9d2d77db996adea115097fd4ef3c4a3ffbe4a08799aaea256d00cf3e94d5969e",
+ "byteLength": 2017
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/bom.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/bom.json",
+ "sha256": "aa25e978046d680ef8740d837e6de5bc1e2a2dc6089dbda1012544b538d53f65",
+ "byteLength": 5
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/companion-float.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/companion-float.json",
+ "sha256": "eb454acf3392a959782b8b7e53332d65ebd0c6607d77a1f17561f91534987cee",
+ "byteLength": 33
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/companion-unsafe-integer.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/companion-unsafe-integer.json",
+ "sha256": "98f3e87d38e17bce0a5e1b2076ae16f78bdf45001dfd192f39be0fe94a50116d",
+ "byteLength": 46
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown-pack.json",
+ "sha256": "8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "byteLength": 1559
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown.json",
+ "sha256": "39fb7ccbef49a24c8f0f2241eb8413c56521df4c4aacd9b75206301718a8aaf4",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/consumer-graph.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/consumer-graph.json",
+ "sha256": "f380c38339a85ab4ef31c23640b319f85bc7783e8e75c41d11ae741196b604d1",
+ "byteLength": 2353
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate-pack.json",
+ "sha256": "93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "byteLength": 1828
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate.json",
+ "sha256": "4a1285549c9649cbdd756fe836010d1e4e159f36a0bc9cf7a0ad704c38a38b4a",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-decimal-raw-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-decimal-raw-pack.json",
+ "sha256": "9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-decimal-raw.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-decimal-raw.json",
+ "sha256": "93a8d631bd4244f3b309451071488b35e064ab3618934a76b0d9ebf46cb5e442",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon-pack.json",
+ "sha256": "9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon.json",
+ "sha256": "d4f9c354aaaf6093d5034cf6adcd8c01bb1aa9cbcf32f9ccafdd9aa2790bb737",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-exponent-308-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-exponent-308-pack.json",
+ "sha256": "52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "byteLength": 1650
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-exponent-308.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-exponent-308.json",
+ "sha256": "c9275574c422b7520ae07d85bf6491d895b7fc62689308d6338df55180c3cfc0",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-exponent-over-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-exponent-over-pack.json",
+ "sha256": "7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "byteLength": 1650
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-exponent-over.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-exponent-over.json",
+ "sha256": "0cdf2672ddded5c222e3b18c7a9b7041f0175591be323a39b5bddff6672e5763",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-number-128-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-number-128-pack.json",
+ "sha256": "0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "byteLength": 1773
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-number-128.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-number-128.json",
+ "sha256": "5e97a1562791b398a9d7e70533c595a568b889c7966c43ea43eeadf751de6417",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-number-over-128-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-number-over-128-pack.json",
+ "sha256": "bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "byteLength": 1774
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-number-over-128.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-number-over-128.json",
+ "sha256": "4372c8016d83883bc944428d5d09510abac11dc10501cc74cbb7d577913a3eec",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw-pack.json",
+ "sha256": "2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw.json",
+ "sha256": "880c2b146822bd4ca14b5bb79953f706aa770f0b61afc7c76312ed4a23a1d715",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon-pack.json",
+ "sha256": "2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon.json",
+ "sha256": "f0dbc21fab5b69614e11c9948a897a1ec9f7e3dc3d8bb23e41bbd2521220ff9f",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/coverage-duplicate.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/coverage-duplicate.json",
+ "sha256": "5c804382923831378fd72aa6a4a115cefc5c59357c7fd5ff7fb3b57cec158a0d",
+ "byteLength": 2347
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/coverage-omitted.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/coverage-omitted.json",
+ "sha256": "4fad299227c43ff3d3fda7cadd881398f7b908bfa6177abb475e50fe2f3e7c65",
+ "byteLength": 2146
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/coverage-outside.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/coverage-outside.json",
+ "sha256": "f53966ceab71d7d1577684d064c52d3515f266da03e811e1444408875757cb5d",
+ "byteLength": 2348
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/depth-32.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/depth-32.json",
+ "sha256": "4e04cac422d9ecd4a5f6221653eeb4eaf29077cf3f588cd36bf6dc8ead76971f",
+ "byteLength": 65
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/depth-33.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/depth-33.json",
+ "sha256": "eac9bf029c22e177c74309fb891e3351dccfb04f055127ea82dc2dc3136cd899",
+ "byteLength": 67
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/desk-managed-alias-refused.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/desk-managed-alias-refused.json",
+ "sha256": "5234fd95d7550559cd2c2147bed06f9ff6f905b2e4607e8eeebfef03a778698c",
+ "byteLength": 2014
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/document-max-bytes.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/document-max-bytes.json",
+ "sha256": "515b22dea881243654a2c04aacd1fae4079e914bb63c9fd028a21821c0add188",
+ "byteLength": 262144
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/duplicate-json.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/duplicate-json.json",
+ "sha256": "e36957f702ac6bd47232355cad2b9a15a1bc3d6a23f0cbd5bb2d7bf4d33e8288",
+ "byteLength": 49
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/duplicate-policy-identity.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/duplicate-policy-identity.json",
+ "sha256": "07f804bccb31243a806fa8bf820089bf5b2328cd68a0a267f00056f0f161b2ed",
+ "byteLength": 4038
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-0.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-0.json",
+ "sha256": "90e517db584be09a68876e0e12e1fdcfa6bca002cfc249e884f76c009e2646b3",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-2.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-2.json",
+ "sha256": "8c2a26c5f677e592d86b2e216439d45ce1846fd409c66e0b8bc1e827de18e41d",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-before-canon.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-before-canon.json",
+ "sha256": "d945aff06cc556a99fee0d475f16fd5f0fabb96965e74427cb822b465c8b1bf2",
+ "byteLength": 33
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-before-shape.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-before-shape.json",
+ "sha256": "179cd26a351c7bf45c2fca5bc06ba835aa6eaa1a546cec4aa900706a697598f5",
+ "byteLength": 51
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-bool.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-bool.json",
+ "sha256": "5dc2e06bd54f5207ecdb5ba27ec2b80f772193a971f06106067aed2ec594bbbd",
+ "byteLength": 2016
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-int.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-int.json",
+ "sha256": "aff42b4b0a8e641cc5c92c661cdde3537745a2c2466d2b79c7d01e1a6493708b",
+ "byteLength": 2013
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-leading-zero.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-leading-zero.json",
+ "sha256": "c6a980c290cd29ee4c15883a88e4c80de0f99e4605a5f3e094067bd4a221d3b2",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-missing.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-missing.json",
+ "sha256": "4ea51f8934e58095eee944853cc5541124ea94f0b24c09078ac27f465f32d3bc",
+ "byteLength": 1991
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-newline.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-newline.json",
+ "sha256": "dc41a327f8e1c762c6d2326badcfc829814c970f7afbbbbc54f87d585eea74da",
+ "byteLength": 2021
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-patch.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-patch.json",
+ "sha256": "dcbac865d354a2865bf1d17a0197c603f5a120326958bb7e8cbd95ca8dc20355",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-short.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-short.json",
+ "sha256": "93f0b639cbb98ad9ec64d16c09d58010f951c5664962e8cf1838da5b030a5769",
+ "byteLength": 2015
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-suffix.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-suffix.json",
+ "sha256": "debe48d95d872019bc1bdfadff03f645e14dfed66dd034d0d77d95520ca10f5c",
+ "byteLength": 2024
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-unicode.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-unicode.json",
+ "sha256": "e0ba64d6e3ac4e5f72cbcbea04b9dfe5052747d56244950835feaf08c9db041a",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/format-v-prefix.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/format-v-prefix.json",
+ "sha256": "d18d8d65f5126fde63083e1594ef93f0944e092d98e29d54ee3dfe1cc0d8a66a",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/informational-max.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/informational-max.json",
+ "sha256": "569a5b0680eafb6308c2984912e4a702054e6839a6c484bec7eb68ae0fc8aad8",
+ "byteLength": 2554
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/informational-over.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/informational-over.json",
+ "sha256": "361db3f18d7640ac7ecaebfe28e45436ca10bc8ebc806fd23f1ac5145ca3c472",
+ "byteLength": 2554
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/invalid-utf8.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/invalid-utf8.json",
+ "sha256": "36781faac995a68b69aab7d540747e0c70efed427e66a608cdf64fc4feaaff12",
+ "byteLength": 9
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/kind-id-confusion.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/kind-id-confusion.json",
+ "sha256": "d7f690d0ca4b7962916984ee5ee92b70c3b7464016c0e003b0a3bbf4560127c8",
+ "byteLength": 2357
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/limited-scope-missing-basis.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/limited-scope-missing-basis.json",
+ "sha256": "9d9a9b30e6bfa07ca3aa059f14f1011bf2b1dcee92e218d8ea6656b8bad65584",
+ "byteLength": 2854
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/limited-scope-unknown.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/limited-scope-unknown.json",
+ "sha256": "670a45f40a0ff1b21a12481f962f50ae63618d79fa30932882e45ed645a64bdd",
+ "byteLength": 3076
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/malformed-over-depth.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/malformed-over-depth.json",
+ "sha256": "fdc562409aec5a2549f9a1b1f21155ec3b49c71ce76b3ad080c56ba1d0543a76",
+ "byteLength": 68
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/missing-governing-policy.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/missing-governing-policy.json",
+ "sha256": "27f20c087c208144a234684ca1719ab9e0013dad914be4ddf507a546e1d216f8",
+ "byteLength": 686
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/missing-narrative.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/missing-narrative.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/multiple-json.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/multiple-json.json",
+ "sha256": "b51f08b698d88d8027a935d9db649774949f5fb41a0c559bfee6a9a13225c72d",
+ "byteLength": 4
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/multiple-policy-identities.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/multiple-policy-identities.json",
+ "sha256": "fedf62df6fd02f041a2ea418305804ab5ace22bc0946cd1c876c0063937ce2c5",
+ "byteLength": 3985
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/narrative-max.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/narrative-max.json",
+ "sha256": "c1592868007ae1365c18c55e7325d641f82cb4dfcf7ad71ab5cda2fb9a984504",
+ "byteLength": 1119
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/narrative-over.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/narrative-over.json",
+ "sha256": "5ec2805842ca8c97450c468d2b78c6063d48c00287a1195da476e23e36c0008f",
+ "byteLength": 1119
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/nonfinite.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/nonfinite.json",
+ "sha256": "d5b592c05dc25b5032553f1b27f4139be95e881f73db33b02b05ab20c3f9981e",
+ "byteLength": 3
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/number-literal-over-128.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/number-literal-over-128.json",
+ "sha256": "e2eb26c79686e936e6603fbcd49b32881635021917d175c4df147b5e21b44f5c",
+ "byteLength": 159
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/opaque-original.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/opaque-original.json",
+ "sha256": "feb70c8c8e2a8f80e634980de161fa1bb092460969707696b5a3b5059ad71df3",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/opaque-original.pdf",
+ "path": "conformance/policy/1.0.0/vectors/documents/opaque-original.pdf",
+ "sha256": "af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "byteLength": 16
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/original-max.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/original-max.json",
+ "sha256": "78948872a9e1ff6eddff492224fe06858b0f4c0e0f8439553e49d58043abc541",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/original-over.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/original-over.json",
+ "sha256": "990e5847fc18a19f13a1cf7df4dd55b943e6be3c65ba87c25189405ac896c1a0",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/permission-field.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/permission-field.json",
+ "sha256": "87516d167771479d3b14674ddfc747e03e6a3b12175af1a6cbf91daa7ad34069",
+ "byteLength": 2042
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/policy-canon-stale.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/policy-canon-stale.json",
+ "sha256": "45fa4fb5f254eeed1037d1374524b49ed6b94bf484a6f7b7af77a28c725c271a",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/policy-identity-stale.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/policy-identity-stale.json",
+ "sha256": "77f758365f4c4b772cde630b45f2045e8434511dc5d5e261c67e41de9db7a78c",
+ "byteLength": 2320
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/policy-version-ref-stale.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/policy-version-ref-stale.json",
+ "sha256": "f048ab96431c7a97f44a4339b72dc03a164c0c7747a8d2aa9b95fafa099e4457",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/prototype-selector-refused.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/prototype-selector-refused.json",
+ "sha256": "b537c0a1efb5ebc6e06e8a8e60dca2d0ad3d2c4f5e4eeab091b23c3dff4fa408",
+ "byteLength": 2152
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/registration-count-16.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/registration-count-16.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/registration-count-17.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/registration-count-17.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/requirements-field.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/requirements-field.json",
+ "sha256": "397484bcb95f136afcc4b2201a6137ef100d9cdc3c8a0b2326dbc1653d2db62c",
+ "byteLength": 2043
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/review-max.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/review-max.json",
+ "sha256": "729e84b3a8c8826638b7cf5f9703429658aee12eb9aafa0a5dde82f50f450718",
+ "byteLength": 2356
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/review-over.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/review-over.json",
+ "sha256": "9ca0faef44ae60d277c1744c358a55c219400b15a6365f519ba20059d14d153b",
+ "byteLength": 2356
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/second-policy.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/second-policy.json",
+ "sha256": "144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/section-id-duplicate.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/section-id-duplicate.json",
+ "sha256": "c63007da9f867e07f68f8a91758f2054436e91263ddb7c50b8bd5dee21cf80be",
+ "byteLength": 2014
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/shared-bytes-multiple-media-types.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/shared-bytes-multiple-media-types.json",
+ "sha256": "f4d2bc2c621771b30f3ae984ab3fd05a00891827c047d5a746fc44a3ad23ad1a",
+ "byteLength": 2022
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/signature-field.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/signature-field.json",
+ "sha256": "fc4064630a3ef93cbfb46969a22600796a2954256ca42876325673e5d2ef49d1",
+ "byteLength": 2041
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/singleton-with-id.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/singleton-with-id.json",
+ "sha256": "232d4bbb79ff949aaf6c9e17292c5c70426595d8e761c6fefecb6d225e7d677a",
+ "byteLength": 2204
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/source-id-unknown.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/source-id-unknown.json",
+ "sha256": "e93860ee23385cee86b3bca725e14c3fa4f45aadd3c5cb4fa422ee3d008cd3f1",
+ "byteLength": 2009
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/stale-material-hash.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/stale-material-hash.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/stale-material-length.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/stale-material-length.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/standalone-policy.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/standalone-policy.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/surrogate.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/surrogate.json",
+ "sha256": "8c0c59dd0d275aadcd462a5fe12eb352cbdfeaf961eae4f85a4660521df7d2f5",
+ "byteLength": 8
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/unknown-kind-registration-over.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/unknown-kind-registration-over.json",
+ "sha256": "1e2f99280db3d76fbb608f1c13a53be498d2b4bfc46836b2893383895cf076ab",
+ "byteLength": 43
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/unknown-rule.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/unknown-rule.json",
+ "sha256": "b4d8bc7e5745d897cda79f121721b388b4da9e1fe125d782dbe161cddd03aa87",
+ "byteLength": 2351
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/unregistered-media-type.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/unregistered-media-type.json",
+ "sha256": "1c816a89de90ad710cfeb4b17bad6f0720515395e0af0b35e0394d539e605b30",
+ "byteLength": 2022
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/unsupported-element.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/unsupported-element.json",
+ "sha256": "356114c27d81685231f3e6b7aa32305ae890319cf392e652e69d8ce908f5ca90",
+ "byteLength": 2201
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-final-lf-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-final-lf-pack.json",
+ "sha256": "c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "byteLength": 1503
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-final-lf.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-final-lf.json",
+ "sha256": "2f801fd7b06bf34f5c3a42973249a71bf84c421755a1ef372b1bbd4ccd3710c4",
+ "byteLength": 2297
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-fragment-raw-brackets.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-fragment-raw-brackets.json",
+ "sha256": "0ef6ed9f582d15475ec9b5358be05194b372f1fbc1935cc3a175e31e6c526736",
+ "byteLength": 1980
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-invalid.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-invalid.json",
+ "sha256": "2c8f6c238143c7dfa4381ab81b78365bfd43902a7eea09b872f1ee37ca0789ba",
+ "byteLength": 1964
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-compressed.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-compressed.json",
+ "sha256": "6c59778a6d517c252840226d8a3056280777b04e76bf6759c731343f7d01080b",
+ "byteLength": 1978
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-double-compression.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-double-compression.json",
+ "sha256": "b1be77321cd95c07b4ecf8baaba8751028b831e2787ba8ab6ee2a9c5e884193e",
+ "byteLength": 1973
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-ipv4-tail.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-ipv4-tail.json",
+ "sha256": "2c26026d56fe5564dad671c20ad55b0237d5137a291edf56c455bd217f6340c2",
+ "byteLength": 1979
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json",
+ "sha256": "0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "byteLength": 1523
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json",
+ "sha256": "88efbe036d7386812662a46c154cf1521caf9864a9e676d35036038af754a81f",
+ "byteLength": 2317
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-invalid-version.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-invalid-version.json",
+ "sha256": "399ba24e5ffb43360654f3c641fc002f61d8cb2f920eed0480808912bbccc2ed",
+ "byteLength": 1964
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase-pack.json",
+ "sha256": "ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "byteLength": 1504
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase.json",
+ "sha256": "13c1a9fff73cddc63b779e619a622cc05e6ffeb4d5eb2d544a43acfe80973bbd",
+ "byteLength": 2298
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase-pack.json",
+ "sha256": "6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "byteLength": 1504
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase.json",
+ "sha256": "0ce1badc441db3a4290400dab23f2d8e5afee8fc0bf799abdb7cb01140e9ff10",
+ "byteLength": 2298
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-numeric-regname-leading-zeros.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-numeric-regname-leading-zeros.json",
+ "sha256": "2ab9c70bc4c613fabe5bcbacd27ca79b73b08803e918f1755b3735ebcd96ca6f",
+ "byteLength": 1974
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets-pack.json",
+ "sha256": "c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "byteLength": 1518
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets.json",
+ "sha256": "b70d9a76a3b38f58a0f2b075c9ecfe6803b6e0a404c2b526000f85a86b244f67",
+ "byteLength": 2312
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-percent-brackets.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-percent-brackets.json",
+ "sha256": "52ed06084ad97c026b15ece99674e6d638d26509506b62ce3d5195da7acd5a63",
+ "byteLength": 1997
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-percent-incomplete.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-percent-incomplete.json",
+ "sha256": "f8db4efe5972393c15cd0c8ad8cbe88262ac02845d8863781cad83f970fa212b",
+ "byteLength": 1978
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-percent-nonhex.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-percent-nonhex.json",
+ "sha256": "4a239d1009d314a9a0e285848fb1eba211a5574e17907253936aa6820f98534b",
+ "byteLength": 1979
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-percent-regname-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-percent-regname-pack.json",
+ "sha256": "50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "byteLength": 1518
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-percent-regname.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-percent-regname.json",
+ "sha256": "86ea9309a59ba683a85c73442c2638d56aa21f2e9e4f020d3954b043ab7c5f06",
+ "byteLength": 2312
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-percent-unicode.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-percent-unicode.json",
+ "sha256": "5f062c610d9c546cba55951e3f9921b0de142ac382dac7d4a00e69ba65cf890f",
+ "byteLength": 1981
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-query-raw-brackets.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-query-raw-brackets.json",
+ "sha256": "8d24bd52b12805ba9c602f113ca47c0a1dd141fc35577c09e0581c033ee46e24",
+ "byteLength": 1981
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-raw-unicode.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-raw-unicode.json",
+ "sha256": "15bf301598d90e8a1e001973df95a1cb04021e1cb7a4385bf3ca0ef8eecebf7a",
+ "byteLength": 1977
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets-pack.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets-pack.json",
+ "sha256": "a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "byteLength": 1503
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets.json",
+ "sha256": "4143f4d8d6e9df42e8a8ab8e011b9404b719f4e400dcb25d360d2ac80ff2b39d",
+ "byteLength": 2297
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/documents/uri-userinfo-percent-brackets.json",
+ "path": "conformance/policy/1.0.0/vectors/documents/uri-userinfo-percent-brackets.json",
+ "sha256": "85c63cc716e50e0020cd419f636caf824afbe22826df6abc135cc7433cf4253f",
+ "byteLength": 1992
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/vectors/manifest.json",
+ "path": "conformance/policy/1.0.0/vectors/manifest.json",
+ "sha256": "3b28a763b4435a3f4c9f1613fcc435b305a08045569f0473bdaa89551b873b4a",
+ "byteLength": 223138
+ },
+ {
+ "sourcePath": "conformance/policy/1.0.0/verify.py",
+ "path": "conformance/policy/1.0.0/verify.py",
+ "sha256": "3e519734df611b277a9db003183c518c5ae93b3bb2341746c51e4f2ae940f0e1",
+ "byteLength": 19113
+ },
+ {
+ "sourcePath": "releases/policy-v1.0.0-draft.1.json",
+ "path": "releases/policy-v1.0.0-draft.1.json",
+ "sha256": "3830a76bd7ebed4b927bb0dba69beaca0e591a65bf6d87cdc2ed65bbd6472119",
+ "byteLength": 25710
+ },
+ {
+ "sourcePath": "releases/policy-v1.0.0-draft.1.md",
+ "path": "releases/policy-v1.0.0-draft.1.md",
+ "sha256": "b0bb1602104909effcd6370294a656fd4e2410b34458ae66634ac866e9e50fe1",
+ "byteLength": 3944
+ },
+ {
+ "sourcePath": "requirements-dev.txt",
+ "path": "requirements-dev.txt",
+ "sha256": "7d83f19724901af9d3f9e6e07c9164f2f5d6601995945948171006fe25a676fa",
+ "byteLength": 48
+ },
+ {
+ "sourcePath": "rfcs/0000-rfc-process.md",
+ "path": "rfcs/0000-rfc-process.md",
+ "sha256": "58d2f72f830693b3ba2f3f2c98899b3e1b4a79dd5bdb5e27cc0f3c6c43091765",
+ "byteLength": 5068
+ },
+ {
+ "sourcePath": "rfcs/0023-policy-companion.md",
+ "path": "rfcs/0023-policy-companion.md",
+ "sha256": "ee2b39a6f5aa47c88e9ce2fd9a4ac8a984575bf5f14ef7bad783d0b83c012516",
+ "byteLength": 25232
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/MIGRATION.md",
+ "path": "rfcs/policy-companion-contract/MIGRATION.md",
+ "sha256": "0602a092ae1c6f670e0b440f3df33de1eb4d825bf714af50143151882e674e34",
+ "byteLength": 3993
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/README.md",
+ "path": "rfcs/policy-companion-contract/README.md",
+ "sha256": "21364149bbd76cc7bc2b917b898d0fa79739bd454f94d4af3510e0e1a6ea88f7",
+ "byteLength": 22250
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/capabilities.json",
+ "path": "rfcs/policy-companion-contract/capabilities.json",
+ "sha256": "57977501550cb90de46d9eb88016725949f1eda83be470ff467804e8f393a287",
+ "byteLength": 1770
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/check_vectors.py",
+ "path": "rfcs/policy-companion-contract/check_vectors.py",
+ "sha256": "4a7f5842a685c0085908aeabe05fdd29df8ebcbc8dd986112fa947989d056230",
+ "byteLength": 2149
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/common.schema.json",
+ "path": "rfcs/policy-companion-contract/common.schema.json",
+ "sha256": "a26362280ac4cf0ba7a15a6c382ee8c61df97c78be4ef291f1107db24f28dd06",
+ "byteLength": 5262
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/data-access/adoption.json",
+ "path": "rfcs/policy-companion-contract/examples/data-access/adoption.json",
+ "sha256": "98294b5df0876cc793f236fa5184380aa37f2e459e1f630a5e613237404c2ec0",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/data-access/consumer-pack.json",
+ "path": "rfcs/policy-companion-contract/examples/data-access/consumer-pack.json",
+ "sha256": "c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/data-access/fixture.json",
+ "path": "rfcs/policy-companion-contract/examples/data-access/fixture.json",
+ "sha256": "95575efc4fc7571089f17b7684c9ea66c7f16d52cb5b7032c0c494f3f73c25db",
+ "byteLength": 1599
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/data-access/interpretation.txt",
+ "path": "rfcs/policy-companion-contract/examples/data-access/interpretation.txt",
+ "sha256": "7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/data-access/narrative.txt",
+ "path": "rfcs/policy-companion-contract/examples/data-access/narrative.txt",
+ "sha256": "801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/data-access/policy.json",
+ "path": "rfcs/policy-companion-contract/examples/data-access/policy.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/data-access/source.txt",
+ "path": "rfcs/policy-companion-contract/examples/data-access/source.txt",
+ "sha256": "9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/procurement/adoption.json",
+ "path": "rfcs/policy-companion-contract/examples/procurement/adoption.json",
+ "sha256": "e9c871b2e7dc7448e46b2d4d347beb504bbe0a691be11df4283a95a693208703",
+ "byteLength": 3055
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/procurement/consumer-pack.json",
+ "path": "rfcs/policy-companion-contract/examples/procurement/consumer-pack.json",
+ "sha256": "d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/procurement/fixture.json",
+ "path": "rfcs/policy-companion-contract/examples/procurement/fixture.json",
+ "sha256": "bd05d532515eff20322a88c8cbb34899849479f4f4fef8a1f2e3d577a2b96205",
+ "byteLength": 1599
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/procurement/interpretation.txt",
+ "path": "rfcs/policy-companion-contract/examples/procurement/interpretation.txt",
+ "sha256": "14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/procurement/narrative.txt",
+ "path": "rfcs/policy-companion-contract/examples/procurement/narrative.txt",
+ "sha256": "993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/procurement/policy.json",
+ "path": "rfcs/policy-companion-contract/examples/procurement/policy.json",
+ "sha256": "539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/procurement/source.txt",
+ "path": "rfcs/policy-companion-contract/examples/procurement/source.txt",
+ "sha256": "4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/refunds/adoption.json",
+ "path": "rfcs/policy-companion-contract/examples/refunds/adoption.json",
+ "sha256": "7c7cd121fc4510fff19b8bcaf120ce1a9cb3f7e60b8e811ce9be917799367bc8",
+ "byteLength": 2729
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/refunds/consumer-pack.json",
+ "path": "rfcs/policy-companion-contract/examples/refunds/consumer-pack.json",
+ "sha256": "2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/refunds/fixture.json",
+ "path": "rfcs/policy-companion-contract/examples/refunds/fixture.json",
+ "sha256": "48b47e5ca483e53ee4c943409f9892b518108cd0f94ead4f2715852d25a74d60",
+ "byteLength": 1595
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/refunds/interpretation.txt",
+ "path": "rfcs/policy-companion-contract/examples/refunds/interpretation.txt",
+ "sha256": "63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/refunds/narrative.txt",
+ "path": "rfcs/policy-companion-contract/examples/refunds/narrative.txt",
+ "sha256": "909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/refunds/policy.json",
+ "path": "rfcs/policy-companion-contract/examples/refunds/policy.json",
+ "sha256": "8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/examples/refunds/source.txt",
+ "path": "rfcs/policy-companion-contract/examples/refunds/source.txt",
+ "sha256": "ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/fixture.schema.json",
+ "path": "rfcs/policy-companion-contract/fixture.schema.json",
+ "sha256": "70f72c813ecbf988087de1de41d0871b24dec340e79af5bfe8e488a51ce9cd1b",
+ "byteLength": 1421
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/governing-adoption.schema.json",
+ "path": "rfcs/policy-companion-contract/governing-adoption.schema.json",
+ "sha256": "2a6a55c0efdb5fc25a52bc645eda33ca67247e7db83a0de21204ef6a28432dcb",
+ "byteLength": 8325
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/policy.schema.json",
+ "path": "rfcs/policy-companion-contract/policy.schema.json",
+ "sha256": "21c2a3a3f9763cecfb9348938e078384a9abbf3e55fb8126704cf8a55555fcd7",
+ "byteLength": 4261
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/prototype-0.0.2-pin.json",
+ "path": "rfcs/policy-companion-contract/prototype-0.0.2-pin.json",
+ "sha256": "48a264397902303c0373c4ae11e2bde9b55474f7ff76b33e1fdc3f919c70bacb",
+ "byteLength": 3146
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/test_contract.py",
+ "path": "rfcs/policy-companion-contract/test_contract.py",
+ "sha256": "0a1ad1f90efa0a257851e7f4c420d494d2e38d59405b0139337986f077b070e9",
+ "byteLength": 12070
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors.schema.json",
+ "path": "rfcs/policy-companion-contract/vectors.schema.json",
+ "sha256": "4843941ad1884306a896f5ced516dede695cb4a3fb8512973f3a54860d4a1a88",
+ "byteLength": 6012
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/README.md",
+ "path": "rfcs/policy-companion-contract/vectors/README.md",
+ "sha256": "d27b79c1932261d3bf64abb07d5c95ccab0a9016e83412c40a129747fdb8eaec",
+ "byteLength": 6372
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/aggregate-max.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/aggregate-max.json",
+ "sha256": "356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "byteLength": 683
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/aggregate-over.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/aggregate-over.json",
+ "sha256": "356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "byteLength": 683
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/aggregate-shared-media-counted-once.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/aggregate-shared-media-counted-once.json",
+ "sha256": "356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "byteLength": 683
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/anchor-empty-range.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/anchor-empty-range.json",
+ "sha256": "f57abd537598b6f2d4f21f5531cc8b287cb8a408174b1699afe23ab862bba431",
+ "byteLength": 2018
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/anchor-outside-narrative.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/anchor-outside-narrative.json",
+ "sha256": "aa0fed3939d88597f5a2eab96e1a9305f5671c9d9ffc1140c3a79a0a985d24e9",
+ "byteLength": 2022
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/anchor-over-bound.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/anchor-over-bound.json",
+ "sha256": "0f10c69c68a792e43de7b56978bce3073f2baba2ef026607d5c21104e113916f",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/anchor-stale-digest.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/anchor-stale-digest.json",
+ "sha256": "f15662d3349adebe3f37358da15f6c1cbea7a531ead7be55b13a83e6fea865f0",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/anchor-utf8-split.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/anchor-utf8-split.json",
+ "sha256": "dbb8e91eeaaec4ca6afa0b60ed9ab7621fc46b464052181fc15a7207880d8485",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/approval-field.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/approval-field.json",
+ "sha256": "b6d55b494d997d827ceda4f0c7b0ff4c644171928f22b2c64bff7ba049cdaae6",
+ "byteLength": 2039
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-build.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-build.json",
+ "sha256": "d8e6a2f1de1400d0f93deb768709a79dd2608581a59f3d91c48c0fe46b53da3e",
+ "byteLength": 2025
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-independent.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-independent.json",
+ "sha256": "b29b0d41f9c53df4ccf45b304e4307848a5aca82f9669ce6a6f532ba9eca7efa",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-leading-zero.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-leading-zero.json",
+ "sha256": "9bac870cd83f3ce25b4d02c820d962d084de92ea0ccdefb1b4a86e194ece3be0",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-max-256.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-max-256.json",
+ "sha256": "79b1ac4516f3be2234b1a333a09679474c8f0f9d4c8743cf0b552eaaa97ff06c",
+ "byteLength": 2270
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-newline.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-newline.json",
+ "sha256": "7b398d8f7062dc484dd919271c3cb4d090389604a1504b356892cedf06e29431",
+ "byteLength": 2021
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-number.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-number.json",
+ "sha256": "4d81f8abe5de7580d5896bc2538dc7c7bb6eca300a7fb3a8dab7bf8ad9525cb1",
+ "byteLength": 2013
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-over-256.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-over-256.json",
+ "sha256": "eb73ca4e4a698530f0dee89fefdd9a0914ca0af55202c4da478797a9de491278",
+ "byteLength": 2271
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/artifact-two-components.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/artifact-two-components.json",
+ "sha256": "9d2d77db996adea115097fd4ef3c4a3ffbe4a08799aaea256d00cf3e94d5969e",
+ "byteLength": 2017
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/bom.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/bom.json",
+ "sha256": "aa25e978046d680ef8740d837e6de5bc1e2a2dc6089dbda1012544b538d53f65",
+ "byteLength": 5
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/companion-float.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/companion-float.json",
+ "sha256": "eb454acf3392a959782b8b7e53332d65ebd0c6607d77a1f17561f91534987cee",
+ "byteLength": 33
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/companion-unsafe-integer.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/companion-unsafe-integer.json",
+ "sha256": "98f3e87d38e17bce0a5e1b2076ae16f78bdf45001dfd192f39be0fe94a50116d",
+ "byteLength": 46
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown-pack.json",
+ "sha256": "8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "byteLength": 1559
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown.json",
+ "sha256": "39fb7ccbef49a24c8f0f2241eb8413c56521df4c4aacd9b75206301718a8aaf4",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/consumer-graph.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/consumer-graph.json",
+ "sha256": "f380c38339a85ab4ef31c23640b319f85bc7783e8e75c41d11ae741196b604d1",
+ "byteLength": 2353
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate-pack.json",
+ "sha256": "93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "byteLength": 1828
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate.json",
+ "sha256": "4a1285549c9649cbdd756fe836010d1e4e159f36a0bc9cf7a0ad704c38a38b4a",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-decimal-raw-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-decimal-raw-pack.json",
+ "sha256": "9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-decimal-raw.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-decimal-raw.json",
+ "sha256": "93a8d631bd4244f3b309451071488b35e064ab3618934a76b0d9ebf46cb5e442",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon-pack.json",
+ "sha256": "9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon.json",
+ "sha256": "d4f9c354aaaf6093d5034cf6adcd8c01bb1aa9cbcf32f9ccafdd9aa2790bb737",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-exponent-308-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-exponent-308-pack.json",
+ "sha256": "52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "byteLength": 1650
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-exponent-308.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-exponent-308.json",
+ "sha256": "c9275574c422b7520ae07d85bf6491d895b7fc62689308d6338df55180c3cfc0",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-exponent-over-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-exponent-over-pack.json",
+ "sha256": "7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "byteLength": 1650
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-exponent-over.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-exponent-over.json",
+ "sha256": "0cdf2672ddded5c222e3b18c7a9b7041f0175591be323a39b5bddff6672e5763",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-number-128-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-number-128-pack.json",
+ "sha256": "0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "byteLength": 1773
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-number-128.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-number-128.json",
+ "sha256": "5e97a1562791b398a9d7e70533c595a568b889c7966c43ea43eeadf751de6417",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-number-over-128-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-number-over-128-pack.json",
+ "sha256": "bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "byteLength": 1774
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-number-over-128.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-number-over-128.json",
+ "sha256": "4372c8016d83883bc944428d5d09510abac11dc10501cc74cbb7d577913a3eec",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw-pack.json",
+ "sha256": "2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw.json",
+ "sha256": "880c2b146822bd4ca14b5bb79953f706aa770f0b61afc7c76312ed4a23a1d715",
+ "byteLength": 2189
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon-pack.json",
+ "sha256": "2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon.json",
+ "sha256": "f0dbc21fab5b69614e11c9948a897a1ec9f7e3dc3d8bb23e41bbd2521220ff9f",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/coverage-duplicate.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/coverage-duplicate.json",
+ "sha256": "5c804382923831378fd72aa6a4a115cefc5c59357c7fd5ff7fb3b57cec158a0d",
+ "byteLength": 2347
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/coverage-omitted.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/coverage-omitted.json",
+ "sha256": "4fad299227c43ff3d3fda7cadd881398f7b908bfa6177abb475e50fe2f3e7c65",
+ "byteLength": 2146
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/coverage-outside.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/coverage-outside.json",
+ "sha256": "f53966ceab71d7d1577684d064c52d3515f266da03e811e1444408875757cb5d",
+ "byteLength": 2348
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/depth-32.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/depth-32.json",
+ "sha256": "4e04cac422d9ecd4a5f6221653eeb4eaf29077cf3f588cd36bf6dc8ead76971f",
+ "byteLength": 65
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/depth-33.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/depth-33.json",
+ "sha256": "eac9bf029c22e177c74309fb891e3351dccfb04f055127ea82dc2dc3136cd899",
+ "byteLength": 67
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/desk-managed-alias-refused.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/desk-managed-alias-refused.json",
+ "sha256": "5234fd95d7550559cd2c2147bed06f9ff6f905b2e4607e8eeebfef03a778698c",
+ "byteLength": 2014
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/document-max-bytes.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/document-max-bytes.json",
+ "sha256": "515b22dea881243654a2c04aacd1fae4079e914bb63c9fd028a21821c0add188",
+ "byteLength": 262144
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/duplicate-json.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/duplicate-json.json",
+ "sha256": "e36957f702ac6bd47232355cad2b9a15a1bc3d6a23f0cbd5bb2d7bf4d33e8288",
+ "byteLength": 49
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/duplicate-policy-identity.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/duplicate-policy-identity.json",
+ "sha256": "07f804bccb31243a806fa8bf820089bf5b2328cd68a0a267f00056f0f161b2ed",
+ "byteLength": 4038
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-0.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-0.json",
+ "sha256": "90e517db584be09a68876e0e12e1fdcfa6bca002cfc249e884f76c009e2646b3",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-2.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-2.json",
+ "sha256": "8c2a26c5f677e592d86b2e216439d45ce1846fd409c66e0b8bc1e827de18e41d",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-before-canon.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-before-canon.json",
+ "sha256": "d945aff06cc556a99fee0d475f16fd5f0fabb96965e74427cb822b465c8b1bf2",
+ "byteLength": 33
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-before-shape.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-before-shape.json",
+ "sha256": "179cd26a351c7bf45c2fca5bc06ba835aa6eaa1a546cec4aa900706a697598f5",
+ "byteLength": 51
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-bool.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-bool.json",
+ "sha256": "5dc2e06bd54f5207ecdb5ba27ec2b80f772193a971f06106067aed2ec594bbbd",
+ "byteLength": 2016
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-int.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-int.json",
+ "sha256": "aff42b4b0a8e641cc5c92c661cdde3537745a2c2466d2b79c7d01e1a6493708b",
+ "byteLength": 2013
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-leading-zero.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-leading-zero.json",
+ "sha256": "c6a980c290cd29ee4c15883a88e4c80de0f99e4605a5f3e094067bd4a221d3b2",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-missing.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-missing.json",
+ "sha256": "4ea51f8934e58095eee944853cc5541124ea94f0b24c09078ac27f465f32d3bc",
+ "byteLength": 1991
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-newline.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-newline.json",
+ "sha256": "dc41a327f8e1c762c6d2326badcfc829814c970f7afbbbbc54f87d585eea74da",
+ "byteLength": 2021
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-patch.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-patch.json",
+ "sha256": "dcbac865d354a2865bf1d17a0197c603f5a120326958bb7e8cbd95ca8dc20355",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-short.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-short.json",
+ "sha256": "93f0b639cbb98ad9ec64d16c09d58010f951c5664962e8cf1838da5b030a5769",
+ "byteLength": 2015
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-suffix.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-suffix.json",
+ "sha256": "debe48d95d872019bc1bdfadff03f645e14dfed66dd034d0d77d95520ca10f5c",
+ "byteLength": 2024
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-unicode.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-unicode.json",
+ "sha256": "e0ba64d6e3ac4e5f72cbcbea04b9dfe5052747d56244950835feaf08c9db041a",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/format-v-prefix.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/format-v-prefix.json",
+ "sha256": "d18d8d65f5126fde63083e1594ef93f0944e092d98e29d54ee3dfe1cc0d8a66a",
+ "byteLength": 2020
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/informational-max.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/informational-max.json",
+ "sha256": "569a5b0680eafb6308c2984912e4a702054e6839a6c484bec7eb68ae0fc8aad8",
+ "byteLength": 2554
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/informational-over.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/informational-over.json",
+ "sha256": "361db3f18d7640ac7ecaebfe28e45436ca10bc8ebc806fd23f1ac5145ca3c472",
+ "byteLength": 2554
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/invalid-utf8.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/invalid-utf8.json",
+ "sha256": "36781faac995a68b69aab7d540747e0c70efed427e66a608cdf64fc4feaaff12",
+ "byteLength": 9
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/kind-id-confusion.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/kind-id-confusion.json",
+ "sha256": "d7f690d0ca4b7962916984ee5ee92b70c3b7464016c0e003b0a3bbf4560127c8",
+ "byteLength": 2357
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/limited-scope-missing-basis.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/limited-scope-missing-basis.json",
+ "sha256": "9d9a9b30e6bfa07ca3aa059f14f1011bf2b1dcee92e218d8ea6656b8bad65584",
+ "byteLength": 2854
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/limited-scope-unknown.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/limited-scope-unknown.json",
+ "sha256": "670a45f40a0ff1b21a12481f962f50ae63618d79fa30932882e45ed645a64bdd",
+ "byteLength": 3076
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/malformed-over-depth.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/malformed-over-depth.json",
+ "sha256": "fdc562409aec5a2549f9a1b1f21155ec3b49c71ce76b3ad080c56ba1d0543a76",
+ "byteLength": 68
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/missing-governing-policy.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/missing-governing-policy.json",
+ "sha256": "27f20c087c208144a234684ca1719ab9e0013dad914be4ddf507a546e1d216f8",
+ "byteLength": 686
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/missing-narrative.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/missing-narrative.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/multiple-json.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/multiple-json.json",
+ "sha256": "b51f08b698d88d8027a935d9db649774949f5fb41a0c559bfee6a9a13225c72d",
+ "byteLength": 4
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/multiple-policy-identities.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/multiple-policy-identities.json",
+ "sha256": "fedf62df6fd02f041a2ea418305804ab5ace22bc0946cd1c876c0063937ce2c5",
+ "byteLength": 3985
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/narrative-max.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/narrative-max.json",
+ "sha256": "c1592868007ae1365c18c55e7325d641f82cb4dfcf7ad71ab5cda2fb9a984504",
+ "byteLength": 1119
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/narrative-over.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/narrative-over.json",
+ "sha256": "5ec2805842ca8c97450c468d2b78c6063d48c00287a1195da476e23e36c0008f",
+ "byteLength": 1119
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/nonfinite.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/nonfinite.json",
+ "sha256": "d5b592c05dc25b5032553f1b27f4139be95e881f73db33b02b05ab20c3f9981e",
+ "byteLength": 3
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/number-literal-over-128.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/number-literal-over-128.json",
+ "sha256": "e2eb26c79686e936e6603fbcd49b32881635021917d175c4df147b5e21b44f5c",
+ "byteLength": 159
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/opaque-original.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/opaque-original.json",
+ "sha256": "feb70c8c8e2a8f80e634980de161fa1bb092460969707696b5a3b5059ad71df3",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/opaque-original.pdf",
+ "path": "rfcs/policy-companion-contract/vectors/documents/opaque-original.pdf",
+ "sha256": "af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "byteLength": 16
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/original-max.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/original-max.json",
+ "sha256": "78948872a9e1ff6eddff492224fe06858b0f4c0e0f8439553e49d58043abc541",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/original-over.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/original-over.json",
+ "sha256": "990e5847fc18a19f13a1cf7df4dd55b943e6be3c65ba87c25189405ac896c1a0",
+ "byteLength": 2023
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/permission-field.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/permission-field.json",
+ "sha256": "87516d167771479d3b14674ddfc747e03e6a3b12175af1a6cbf91daa7ad34069",
+ "byteLength": 2042
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/policy-canon-stale.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/policy-canon-stale.json",
+ "sha256": "45fa4fb5f254eeed1037d1374524b49ed6b94bf484a6f7b7af77a28c725c271a",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/policy-identity-stale.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/policy-identity-stale.json",
+ "sha256": "77f758365f4c4b772cde630b45f2045e8434511dc5d5e261c67e41de9db7a78c",
+ "byteLength": 2320
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/policy-version-ref-stale.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/policy-version-ref-stale.json",
+ "sha256": "f048ab96431c7a97f44a4339b72dc03a164c0c7747a8d2aa9b95fafa099e4457",
+ "byteLength": 2352
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/prototype-selector-refused.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/prototype-selector-refused.json",
+ "sha256": "b537c0a1efb5ebc6e06e8a8e60dca2d0ad3d2c4f5e4eeab091b23c3dff4fa408",
+ "byteLength": 2152
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/registration-count-16.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/registration-count-16.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/registration-count-17.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/registration-count-17.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/requirements-field.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/requirements-field.json",
+ "sha256": "397484bcb95f136afcc4b2201a6137ef100d9cdc3c8a0b2326dbc1653d2db62c",
+ "byteLength": 2043
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/review-max.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/review-max.json",
+ "sha256": "729e84b3a8c8826638b7cf5f9703429658aee12eb9aafa0a5dde82f50f450718",
+ "byteLength": 2356
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/review-over.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/review-over.json",
+ "sha256": "9ca0faef44ae60d277c1744c358a55c219400b15a6365f519ba20059d14d153b",
+ "byteLength": 2356
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/second-policy.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/second-policy.json",
+ "sha256": "144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/section-id-duplicate.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/section-id-duplicate.json",
+ "sha256": "c63007da9f867e07f68f8a91758f2054436e91263ddb7c50b8bd5dee21cf80be",
+ "byteLength": 2014
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/shared-bytes-multiple-media-types.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/shared-bytes-multiple-media-types.json",
+ "sha256": "f4d2bc2c621771b30f3ae984ab3fd05a00891827c047d5a746fc44a3ad23ad1a",
+ "byteLength": 2022
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/signature-field.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/signature-field.json",
+ "sha256": "fc4064630a3ef93cbfb46969a22600796a2954256ca42876325673e5d2ef49d1",
+ "byteLength": 2041
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/singleton-with-id.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/singleton-with-id.json",
+ "sha256": "232d4bbb79ff949aaf6c9e17292c5c70426595d8e761c6fefecb6d225e7d677a",
+ "byteLength": 2204
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/source-id-unknown.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/source-id-unknown.json",
+ "sha256": "e93860ee23385cee86b3bca725e14c3fa4f45aadd3c5cb4fa422ee3d008cd3f1",
+ "byteLength": 2009
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/stale-material-hash.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/stale-material-hash.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/stale-material-length.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/stale-material-length.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/standalone-policy.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/standalone-policy.json",
+ "sha256": "6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/surrogate.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/surrogate.json",
+ "sha256": "8c0c59dd0d275aadcd462a5fe12eb352cbdfeaf961eae4f85a4660521df7d2f5",
+ "byteLength": 8
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/unknown-kind-registration-over.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/unknown-kind-registration-over.json",
+ "sha256": "1e2f99280db3d76fbb608f1c13a53be498d2b4bfc46836b2893383895cf076ab",
+ "byteLength": 43
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/unknown-rule.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/unknown-rule.json",
+ "sha256": "b4d8bc7e5745d897cda79f121721b388b4da9e1fe125d782dbe161cddd03aa87",
+ "byteLength": 2351
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/unregistered-media-type.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/unregistered-media-type.json",
+ "sha256": "1c816a89de90ad710cfeb4b17bad6f0720515395e0af0b35e0394d539e605b30",
+ "byteLength": 2022
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/unsupported-element.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/unsupported-element.json",
+ "sha256": "356114c27d81685231f3e6b7aa32305ae890319cf392e652e69d8ce908f5ca90",
+ "byteLength": 2201
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-final-lf-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-final-lf-pack.json",
+ "sha256": "c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "byteLength": 1503
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-final-lf.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-final-lf.json",
+ "sha256": "2f801fd7b06bf34f5c3a42973249a71bf84c421755a1ef372b1bbd4ccd3710c4",
+ "byteLength": 2297
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-fragment-raw-brackets.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-fragment-raw-brackets.json",
+ "sha256": "0ef6ed9f582d15475ec9b5358be05194b372f1fbc1935cc3a175e31e6c526736",
+ "byteLength": 1980
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-invalid.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-invalid.json",
+ "sha256": "2c8f6c238143c7dfa4381ab81b78365bfd43902a7eea09b872f1ee37ca0789ba",
+ "byteLength": 1964
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-compressed.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-compressed.json",
+ "sha256": "6c59778a6d517c252840226d8a3056280777b04e76bf6759c731343f7d01080b",
+ "byteLength": 1978
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-double-compression.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-double-compression.json",
+ "sha256": "b1be77321cd95c07b4ecf8baaba8751028b831e2787ba8ab6ee2a9c5e884193e",
+ "byteLength": 1973
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-ipv4-tail.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-ipv4-tail.json",
+ "sha256": "2c26026d56fe5564dad671c20ad55b0237d5137a291edf56c455bd217f6340c2",
+ "byteLength": 1979
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json",
+ "sha256": "0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "byteLength": 1523
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json",
+ "sha256": "88efbe036d7386812662a46c154cf1521caf9864a9e676d35036038af754a81f",
+ "byteLength": 2317
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-invalid-version.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-invalid-version.json",
+ "sha256": "399ba24e5ffb43360654f3c641fc002f61d8cb2f920eed0480808912bbccc2ed",
+ "byteLength": 1964
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase-pack.json",
+ "sha256": "ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "byteLength": 1504
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase.json",
+ "sha256": "13c1a9fff73cddc63b779e619a622cc05e6ffeb4d5eb2d544a43acfe80973bbd",
+ "byteLength": 2298
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase-pack.json",
+ "sha256": "6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "byteLength": 1504
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase.json",
+ "sha256": "0ce1badc441db3a4290400dab23f2d8e5afee8fc0bf799abdb7cb01140e9ff10",
+ "byteLength": 2298
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-numeric-regname-leading-zeros.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-numeric-regname-leading-zeros.json",
+ "sha256": "2ab9c70bc4c613fabe5bcbacd27ca79b73b08803e918f1755b3735ebcd96ca6f",
+ "byteLength": 1974
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets-pack.json",
+ "sha256": "c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "byteLength": 1518
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets.json",
+ "sha256": "b70d9a76a3b38f58a0f2b075c9ecfe6803b6e0a404c2b526000f85a86b244f67",
+ "byteLength": 2312
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-percent-brackets.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-percent-brackets.json",
+ "sha256": "52ed06084ad97c026b15ece99674e6d638d26509506b62ce3d5195da7acd5a63",
+ "byteLength": 1997
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-percent-incomplete.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-percent-incomplete.json",
+ "sha256": "f8db4efe5972393c15cd0c8ad8cbe88262ac02845d8863781cad83f970fa212b",
+ "byteLength": 1978
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-percent-nonhex.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-percent-nonhex.json",
+ "sha256": "4a239d1009d314a9a0e285848fb1eba211a5574e17907253936aa6820f98534b",
+ "byteLength": 1979
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-percent-regname-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-percent-regname-pack.json",
+ "sha256": "50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "byteLength": 1518
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-percent-regname.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-percent-regname.json",
+ "sha256": "86ea9309a59ba683a85c73442c2638d56aa21f2e9e4f020d3954b043ab7c5f06",
+ "byteLength": 2312
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-percent-unicode.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-percent-unicode.json",
+ "sha256": "5f062c610d9c546cba55951e3f9921b0de142ac382dac7d4a00e69ba65cf890f",
+ "byteLength": 1981
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-query-raw-brackets.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-query-raw-brackets.json",
+ "sha256": "8d24bd52b12805ba9c602f113ca47c0a1dd141fc35577c09e0581c033ee46e24",
+ "byteLength": 1981
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-raw-unicode.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-raw-unicode.json",
+ "sha256": "15bf301598d90e8a1e001973df95a1cb04021e1cb7a4385bf3ca0ef8eecebf7a",
+ "byteLength": 1977
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets-pack.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets-pack.json",
+ "sha256": "a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "byteLength": 1503
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets.json",
+ "sha256": "4143f4d8d6e9df42e8a8ab8e011b9404b719f4e400dcb25d360d2ac80ff2b39d",
+ "byteLength": 2297
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/documents/uri-userinfo-percent-brackets.json",
+ "path": "rfcs/policy-companion-contract/vectors/documents/uri-userinfo-percent-brackets.json",
+ "sha256": "85c63cc716e50e0020cd419f636caf824afbe22826df6abc135cc7433cf4253f",
+ "byteLength": 1992
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/vectors/manifest.json",
+ "path": "rfcs/policy-companion-contract/vectors/manifest.json",
+ "sha256": "953177df0e844ad78ebe145d21c9f1e760336eda4ed20247331493c44be8eedd",
+ "byteLength": 223417
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-contract/verify.py",
+ "path": "rfcs/policy-companion-contract/verify.py",
+ "sha256": "d8bface7de0c795ac04c6d2a307fb3d881b5a496514c04818d35ca2ef7ea68c3",
+ "byteLength": 19040
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/README.md",
+ "path": "rfcs/policy-companion-prototype/README.md",
+ "sha256": "031cc9fa743c7d3af5cc482a514cfba106d510e16364febe0e58ce8bf9830e16",
+ "byteLength": 16275
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/common.schema.json",
+ "path": "rfcs/policy-companion-prototype/common.schema.json",
+ "sha256": "97d25d9c7778c68bdd94506227a0061923a5ef5fc9bc5f0a101f1ac2449d0d33",
+ "byteLength": 5384
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/data-access/adoption.json",
+ "path": "rfcs/policy-companion-prototype/examples/data-access/adoption.json",
+ "sha256": "f6cf887488c12b0ba5331a048f5a9661a557021f5abfc5662a95524915ec1529",
+ "byteLength": 2459
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/data-access/consumer-pack.json",
+ "path": "rfcs/policy-companion-prototype/examples/data-access/consumer-pack.json",
+ "sha256": "c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/data-access/fixture.json",
+ "path": "rfcs/policy-companion-prototype/examples/data-access/fixture.json",
+ "sha256": "575edeed43ceb0b72a3a204caacbc51ba10e52075b7cbeea134b02876e550ec8",
+ "byteLength": 1707
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/data-access/interpretation.txt",
+ "path": "rfcs/policy-companion-prototype/examples/data-access/interpretation.txt",
+ "sha256": "7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/data-access/narrative.txt",
+ "path": "rfcs/policy-companion-prototype/examples/data-access/narrative.txt",
+ "sha256": "801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/data-access/policy.json",
+ "path": "rfcs/policy-companion-prototype/examples/data-access/policy.json",
+ "sha256": "75a7659ed5086c7728af95db0b56b15fdc914a51982b16627fc884cfc9dca50d",
+ "byteLength": 2120
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/data-access/source.txt",
+ "path": "rfcs/policy-companion-prototype/examples/data-access/source.txt",
+ "sha256": "9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/procurement/adoption.json",
+ "path": "rfcs/policy-companion-prototype/examples/procurement/adoption.json",
+ "sha256": "b5b94a06dba7d12748fe3f854bdb5e5da9c14736aeff8d7416e94946891fd063",
+ "byteLength": 3162
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/procurement/consumer-pack.json",
+ "path": "rfcs/policy-companion-prototype/examples/procurement/consumer-pack.json",
+ "sha256": "d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/procurement/fixture.json",
+ "path": "rfcs/policy-companion-prototype/examples/procurement/fixture.json",
+ "sha256": "241d3fd3f06c0cc0572d5237bcbbae9c88bd688fdfe7b41809bd90497ebfbf4b",
+ "byteLength": 1707
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/procurement/interpretation.txt",
+ "path": "rfcs/policy-companion-prototype/examples/procurement/interpretation.txt",
+ "sha256": "14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/procurement/narrative.txt",
+ "path": "rfcs/policy-companion-prototype/examples/procurement/narrative.txt",
+ "sha256": "993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/procurement/policy.json",
+ "path": "rfcs/policy-companion-prototype/examples/procurement/policy.json",
+ "sha256": "e9bbe247d5aa7537aef08c951b88c0881e381046e357abaa05ea255e208ee852",
+ "byteLength": 2899
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/procurement/source.txt",
+ "path": "rfcs/policy-companion-prototype/examples/procurement/source.txt",
+ "sha256": "4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/refunds/adoption.json",
+ "path": "rfcs/policy-companion-prototype/examples/refunds/adoption.json",
+ "sha256": "fd474eed584ae6305ea535bf1d044734f8d754fcc907b0d28b65a318b5ea4b5d",
+ "byteLength": 2836
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/refunds/consumer-pack.json",
+ "path": "rfcs/policy-companion-prototype/examples/refunds/consumer-pack.json",
+ "sha256": "2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/refunds/fixture.json",
+ "path": "rfcs/policy-companion-prototype/examples/refunds/fixture.json",
+ "sha256": "2029192a538db356e9beb137e35377d00db61dda52cb7ba622d3d5e4343b6f22",
+ "byteLength": 1703
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/refunds/interpretation.txt",
+ "path": "rfcs/policy-companion-prototype/examples/refunds/interpretation.txt",
+ "sha256": "63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/refunds/narrative.txt",
+ "path": "rfcs/policy-companion-prototype/examples/refunds/narrative.txt",
+ "sha256": "909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/refunds/policy.json",
+ "path": "rfcs/policy-companion-prototype/examples/refunds/policy.json",
+ "sha256": "5391763b2d9a72533e7566cce910a43cb5ab740dd0587d7383f3adf153ba9970",
+ "byteLength": 2476
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/examples/refunds/source.txt",
+ "path": "rfcs/policy-companion-prototype/examples/refunds/source.txt",
+ "sha256": "ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/governing-adoption.schema.json",
+ "path": "rfcs/policy-companion-prototype/governing-adoption.schema.json",
+ "sha256": "4108f3ac476b989483affbf0ddfa2e933f7be5c579c472f7b7b3aa976299f779",
+ "byteLength": 8318
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/policy.schema.json",
+ "path": "rfcs/policy-companion-prototype/policy.schema.json",
+ "sha256": "d653ce7e855dce678aeadebac18de2afbc5bdcb23412fcf52f3d30b5be3d4dbd",
+ "byteLength": 4246
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/test_prototype.py",
+ "path": "rfcs/policy-companion-prototype/test_prototype.py",
+ "sha256": "bdb05fe954cb75ddc859e58e81ed29c22e7181fb224068dcc55dfb59106858ef",
+ "byteLength": 33263
+ },
+ {
+ "sourcePath": "rfcs/policy-companion-prototype/verify.py",
+ "path": "rfcs/policy-companion-prototype/verify.py",
+ "sha256": "ad6774c7eed831e1a586b9a313c33cb35b471db5cb41ee2212f1643135e27ea0",
+ "byteLength": 14996
+ },
+ {
+ "sourcePath": "schema/judgment-pack-core.schema.json",
+ "path": "schema/judgment-pack-core.schema.json",
+ "sha256": "847910902fa202d9fb3a97062071b532f11649031c9dad32490bf191dca5b3b5",
+ "byteLength": 14268
+ },
+ {
+ "sourcePath": "schema/policy/1.0.0/common.schema.json",
+ "path": "schema/policy/1.0.0/common.schema.json",
+ "sha256": "71d4427dc535a924233c9d0ef4dd222c762da7bb1de9b54436e1d4ee53602a28",
+ "byteLength": 5395
+ },
+ {
+ "sourcePath": "schema/policy/1.0.0/consumer-core-0.2.0-draft.schema.json",
+ "path": "schema/policy/1.0.0/consumer-core-0.2.0-draft.schema.json",
+ "sha256": "847910902fa202d9fb3a97062071b532f11649031c9dad32490bf191dca5b3b5",
+ "byteLength": 14268
+ },
+ {
+ "sourcePath": "schema/policy/1.0.0/governing-adoption.schema.json",
+ "path": "schema/policy/1.0.0/governing-adoption.schema.json",
+ "sha256": "c37488754b53c2a2a1bbb0a8eafab05b91ef88198160c5074aa01f921b0df84f",
+ "byteLength": 8656
+ },
+ {
+ "sourcePath": "schema/policy/1.0.0/policy.schema.json",
+ "path": "schema/policy/1.0.0/policy.schema.json",
+ "sha256": "ebc4e425a3dc2bac39da13fc0672d523c7f450e1df8e4df1c393b157e6698e32",
+ "byteLength": 4541
+ },
+ {
+ "sourcePath": "spec/checkpoint-witness.md",
+ "path": "spec/checkpoint-witness.md",
+ "sha256": "4e21f9fff184263138888c5ce388c8d7dabd04a974ede14250b32300924a88d2",
+ "byteLength": 30471
+ },
+ {
+ "sourcePath": "spec/dialect.md",
+ "path": "spec/dialect.md",
+ "sha256": "bb9f095ffcf0ed241f11771a4505a125fb722f45bd888d5f8b3f077183ea64d6",
+ "byteLength": 135145
+ },
+ {
+ "sourcePath": "spec/policy.md",
+ "path": "spec/policy.md",
+ "sha256": "c558d265e5c6aa43046fe40047a041202148d71713e576915d34d906dd65c5fe",
+ "byteLength": 24887
+ },
+ {
+ "sourcePath": "tools/dialect_verify.py",
+ "path": "tools/dialect_verify.py",
+ "sha256": "9fc8fe40f867ef7676615dc4688a59f8ff7ae8a8617d71591c8ccb786abad68e",
+ "byteLength": 151062
+ }
+ ]
+}
diff --git a/internal/policy/official/releases/policy-v1.0.0-draft.1.json b/internal/policy/official/releases/policy-v1.0.0-draft.1.json
new file mode 100644
index 00000000..ca747548
--- /dev/null
+++ b/internal/policy/official/releases/policy-v1.0.0-draft.1.json
@@ -0,0 +1,192 @@
+{
+ "companion": "policy",
+ "releaseVersion": "1.0.0-draft.1",
+ "tag": "policy-v1.0.0-draft.1",
+ "maturity": "draft",
+ "formatVersion": "1.0.0",
+ "consumerSpecVersions": [
+ "0.2.0-draft"
+ ],
+ "schemas": {
+ "common": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json",
+ "policy": "https://judgmentpack.org/schema/policy/1.0.0/policy.schema.json",
+ "governing-adoption": "https://judgmentpack.org/schema/policy/1.0.0/governing-adoption.schema.json",
+ "fixture": "https://judgmentpack.org/schema/policy/1.0.0/fixture.schema.json",
+ "vectors": "https://judgmentpack.org/schema/policy/1.0.0/vectors.schema.json"
+ },
+ "corpus": {
+ "path": "conformance/policy/1.0.0/vectors/manifest.json",
+ "sha256": "sha256:3b28a763b4435a3f4c9f1613fcc435b305a08045569f0473bdaa89551b873b4a",
+ "cases": 124,
+ "files": {
+ "conformance/policy/1.0.0/examples/data-access/adoption.json": "sha256:98294b5df0876cc793f236fa5184380aa37f2e459e1f630a5e613237404c2ec0",
+ "conformance/policy/1.0.0/examples/data-access/consumer-pack.json": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "conformance/policy/1.0.0/examples/data-access/fixture.json": "sha256:95575efc4fc7571089f17b7684c9ea66c7f16d52cb5b7032c0c494f3f73c25db",
+ "conformance/policy/1.0.0/examples/data-access/interpretation.txt": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "conformance/policy/1.0.0/examples/data-access/narrative.txt": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "conformance/policy/1.0.0/examples/data-access/policy.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "conformance/policy/1.0.0/examples/data-access/source.txt": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "conformance/policy/1.0.0/examples/procurement/adoption.json": "sha256:e9c871b2e7dc7448e46b2d4d347beb504bbe0a691be11df4283a95a693208703",
+ "conformance/policy/1.0.0/examples/procurement/consumer-pack.json": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "conformance/policy/1.0.0/examples/procurement/fixture.json": "sha256:bd05d532515eff20322a88c8cbb34899849479f4f4fef8a1f2e3d577a2b96205",
+ "conformance/policy/1.0.0/examples/procurement/interpretation.txt": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "conformance/policy/1.0.0/examples/procurement/narrative.txt": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "conformance/policy/1.0.0/examples/procurement/policy.json": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "conformance/policy/1.0.0/examples/procurement/source.txt": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "conformance/policy/1.0.0/examples/refunds/adoption.json": "sha256:7c7cd121fc4510fff19b8bcaf120ce1a9cb3f7e60b8e811ce9be917799367bc8",
+ "conformance/policy/1.0.0/examples/refunds/consumer-pack.json": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "conformance/policy/1.0.0/examples/refunds/fixture.json": "sha256:48b47e5ca483e53ee4c943409f9892b518108cd0f94ead4f2715852d25a74d60",
+ "conformance/policy/1.0.0/examples/refunds/interpretation.txt": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "conformance/policy/1.0.0/examples/refunds/narrative.txt": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "conformance/policy/1.0.0/examples/refunds/policy.json": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "conformance/policy/1.0.0/examples/refunds/source.txt": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "conformance/policy/1.0.0/vectors/README.md": "sha256:eab4e90c6e946b60842ff65f5ed7b769c6059fc03f77fb9351a203eddcadbaa9",
+ "conformance/policy/1.0.0/vectors/documents/aggregate-max.json": "sha256:356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "conformance/policy/1.0.0/vectors/documents/aggregate-over.json": "sha256:356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "conformance/policy/1.0.0/vectors/documents/aggregate-shared-media-counted-once.json": "sha256:356820def6f85b5a73a1b3520dac185ca3413a17a7d1f269009b3109f789be09",
+ "conformance/policy/1.0.0/vectors/documents/anchor-empty-range.json": "sha256:f57abd537598b6f2d4f21f5531cc8b287cb8a408174b1699afe23ab862bba431",
+ "conformance/policy/1.0.0/vectors/documents/anchor-outside-narrative.json": "sha256:aa0fed3939d88597f5a2eab96e1a9305f5671c9d9ffc1140c3a79a0a985d24e9",
+ "conformance/policy/1.0.0/vectors/documents/anchor-over-bound.json": "sha256:0f10c69c68a792e43de7b56978bce3073f2baba2ef026607d5c21104e113916f",
+ "conformance/policy/1.0.0/vectors/documents/anchor-stale-digest.json": "sha256:f15662d3349adebe3f37358da15f6c1cbea7a531ead7be55b13a83e6fea865f0",
+ "conformance/policy/1.0.0/vectors/documents/anchor-utf8-split.json": "sha256:dbb8e91eeaaec4ca6afa0b60ed9ab7621fc46b464052181fc15a7207880d8485",
+ "conformance/policy/1.0.0/vectors/documents/approval-field.json": "sha256:b6d55b494d997d827ceda4f0c7b0ff4c644171928f22b2c64bff7ba049cdaae6",
+ "conformance/policy/1.0.0/vectors/documents/artifact-build.json": "sha256:d8e6a2f1de1400d0f93deb768709a79dd2608581a59f3d91c48c0fe46b53da3e",
+ "conformance/policy/1.0.0/vectors/documents/artifact-independent.json": "sha256:b29b0d41f9c53df4ccf45b304e4307848a5aca82f9669ce6a6f532ba9eca7efa",
+ "conformance/policy/1.0.0/vectors/documents/artifact-leading-zero.json": "sha256:9bac870cd83f3ce25b4d02c820d962d084de92ea0ccdefb1b4a86e194ece3be0",
+ "conformance/policy/1.0.0/vectors/documents/artifact-max-256.json": "sha256:79b1ac4516f3be2234b1a333a09679474c8f0f9d4c8743cf0b552eaaa97ff06c",
+ "conformance/policy/1.0.0/vectors/documents/artifact-newline.json": "sha256:7b398d8f7062dc484dd919271c3cb4d090389604a1504b356892cedf06e29431",
+ "conformance/policy/1.0.0/vectors/documents/artifact-number.json": "sha256:4d81f8abe5de7580d5896bc2538dc7c7bb6eca300a7fb3a8dab7bf8ad9525cb1",
+ "conformance/policy/1.0.0/vectors/documents/artifact-over-256.json": "sha256:eb73ca4e4a698530f0dee89fefdd9a0914ca0af55202c4da478797a9de491278",
+ "conformance/policy/1.0.0/vectors/documents/artifact-two-components.json": "sha256:9d2d77db996adea115097fd4ef3c4a3ffbe4a08799aaea256d00cf3e94d5969e",
+ "conformance/policy/1.0.0/vectors/documents/bom.json": "sha256:aa25e978046d680ef8740d837e6de5bc1e2a2dc6089dbda1012544b538d53f65",
+ "conformance/policy/1.0.0/vectors/documents/companion-float.json": "sha256:eb454acf3392a959782b8b7e53332d65ebd0c6607d77a1f17561f91534987cee",
+ "conformance/policy/1.0.0/vectors/documents/companion-unsafe-integer.json": "sha256:98f3e87d38e17bce0a5e1b2076ae16f78bdf45001dfd192f39be0fe94a50116d",
+ "conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown-pack.json": "sha256:8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "conformance/policy/1.0.0/vectors/documents/consumer-fallback-unknown.json": "sha256:39fb7ccbef49a24c8f0f2241eb8413c56521df4c4aacd9b75206301718a8aaf4",
+ "conformance/policy/1.0.0/vectors/documents/consumer-graph.json": "sha256:f380c38339a85ab4ef31c23640b319f85bc7783e8e75c41d11ae741196b604d1",
+ "conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate-pack.json": "sha256:93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "conformance/policy/1.0.0/vectors/documents/consumer-rule-id-duplicate.json": "sha256:4a1285549c9649cbdd756fe836010d1e4e159f36a0bc9cf7a0ad704c38a38b4a",
+ "conformance/policy/1.0.0/vectors/documents/core-decimal-raw-pack.json": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "conformance/policy/1.0.0/vectors/documents/core-decimal-raw.json": "sha256:93a8d631bd4244f3b309451071488b35e064ab3618934a76b0d9ebf46cb5e442",
+ "conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon-pack.json": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "conformance/policy/1.0.0/vectors/documents/core-decimal-requested-canon.json": "sha256:d4f9c354aaaf6093d5034cf6adcd8c01bb1aa9cbcf32f9ccafdd9aa2790bb737",
+ "conformance/policy/1.0.0/vectors/documents/core-exponent-308-pack.json": "sha256:52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "conformance/policy/1.0.0/vectors/documents/core-exponent-308.json": "sha256:c9275574c422b7520ae07d85bf6491d895b7fc62689308d6338df55180c3cfc0",
+ "conformance/policy/1.0.0/vectors/documents/core-exponent-over-pack.json": "sha256:7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "conformance/policy/1.0.0/vectors/documents/core-exponent-over.json": "sha256:0cdf2672ddded5c222e3b18c7a9b7041f0175591be323a39b5bddff6672e5763",
+ "conformance/policy/1.0.0/vectors/documents/core-number-128-pack.json": "sha256:0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "conformance/policy/1.0.0/vectors/documents/core-number-128.json": "sha256:5e97a1562791b398a9d7e70533c595a568b889c7966c43ea43eeadf751de6417",
+ "conformance/policy/1.0.0/vectors/documents/core-number-over-128-pack.json": "sha256:bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "conformance/policy/1.0.0/vectors/documents/core-number-over-128.json": "sha256:4372c8016d83883bc944428d5d09510abac11dc10501cc74cbb7d577913a3eec",
+ "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw-pack.json": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-raw.json": "sha256:880c2b146822bd4ca14b5bb79953f706aa770f0b61afc7c76312ed4a23a1d715",
+ "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon-pack.json": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "conformance/policy/1.0.0/vectors/documents/core-unsafe-int-requested-canon.json": "sha256:f0dbc21fab5b69614e11c9948a897a1ec9f7e3dc3d8bb23e41bbd2521220ff9f",
+ "conformance/policy/1.0.0/vectors/documents/coverage-duplicate.json": "sha256:5c804382923831378fd72aa6a4a115cefc5c59357c7fd5ff7fb3b57cec158a0d",
+ "conformance/policy/1.0.0/vectors/documents/coverage-omitted.json": "sha256:4fad299227c43ff3d3fda7cadd881398f7b908bfa6177abb475e50fe2f3e7c65",
+ "conformance/policy/1.0.0/vectors/documents/coverage-outside.json": "sha256:f53966ceab71d7d1577684d064c52d3515f266da03e811e1444408875757cb5d",
+ "conformance/policy/1.0.0/vectors/documents/depth-32.json": "sha256:4e04cac422d9ecd4a5f6221653eeb4eaf29077cf3f588cd36bf6dc8ead76971f",
+ "conformance/policy/1.0.0/vectors/documents/depth-33.json": "sha256:eac9bf029c22e177c74309fb891e3351dccfb04f055127ea82dc2dc3136cd899",
+ "conformance/policy/1.0.0/vectors/documents/desk-managed-alias-refused.json": "sha256:5234fd95d7550559cd2c2147bed06f9ff6f905b2e4607e8eeebfef03a778698c",
+ "conformance/policy/1.0.0/vectors/documents/document-max-bytes.json": "sha256:515b22dea881243654a2c04aacd1fae4079e914bb63c9fd028a21821c0add188",
+ "conformance/policy/1.0.0/vectors/documents/duplicate-json.json": "sha256:e36957f702ac6bd47232355cad2b9a15a1bc3d6a23f0cbd5bb2d7bf4d33e8288",
+ "conformance/policy/1.0.0/vectors/documents/duplicate-policy-identity.json": "sha256:07f804bccb31243a806fa8bf820089bf5b2328cd68a0a267f00056f0f161b2ed",
+ "conformance/policy/1.0.0/vectors/documents/format-0.json": "sha256:90e517db584be09a68876e0e12e1fdcfa6bca002cfc249e884f76c009e2646b3",
+ "conformance/policy/1.0.0/vectors/documents/format-2.json": "sha256:8c2a26c5f677e592d86b2e216439d45ce1846fd409c66e0b8bc1e827de18e41d",
+ "conformance/policy/1.0.0/vectors/documents/format-before-canon.json": "sha256:d945aff06cc556a99fee0d475f16fd5f0fabb96965e74427cb822b465c8b1bf2",
+ "conformance/policy/1.0.0/vectors/documents/format-before-shape.json": "sha256:179cd26a351c7bf45c2fca5bc06ba835aa6eaa1a546cec4aa900706a697598f5",
+ "conformance/policy/1.0.0/vectors/documents/format-bool.json": "sha256:5dc2e06bd54f5207ecdb5ba27ec2b80f772193a971f06106067aed2ec594bbbd",
+ "conformance/policy/1.0.0/vectors/documents/format-int.json": "sha256:aff42b4b0a8e641cc5c92c661cdde3537745a2c2466d2b79c7d01e1a6493708b",
+ "conformance/policy/1.0.0/vectors/documents/format-leading-zero.json": "sha256:c6a980c290cd29ee4c15883a88e4c80de0f99e4605a5f3e094067bd4a221d3b2",
+ "conformance/policy/1.0.0/vectors/documents/format-missing.json": "sha256:4ea51f8934e58095eee944853cc5541124ea94f0b24c09078ac27f465f32d3bc",
+ "conformance/policy/1.0.0/vectors/documents/format-newline.json": "sha256:dc41a327f8e1c762c6d2326badcfc829814c970f7afbbbbc54f87d585eea74da",
+ "conformance/policy/1.0.0/vectors/documents/format-patch.json": "sha256:dcbac865d354a2865bf1d17a0197c603f5a120326958bb7e8cbd95ca8dc20355",
+ "conformance/policy/1.0.0/vectors/documents/format-short.json": "sha256:93f0b639cbb98ad9ec64d16c09d58010f951c5664962e8cf1838da5b030a5769",
+ "conformance/policy/1.0.0/vectors/documents/format-suffix.json": "sha256:debe48d95d872019bc1bdfadff03f645e14dfed66dd034d0d77d95520ca10f5c",
+ "conformance/policy/1.0.0/vectors/documents/format-unicode.json": "sha256:e0ba64d6e3ac4e5f72cbcbea04b9dfe5052747d56244950835feaf08c9db041a",
+ "conformance/policy/1.0.0/vectors/documents/format-v-prefix.json": "sha256:d18d8d65f5126fde63083e1594ef93f0944e092d98e29d54ee3dfe1cc0d8a66a",
+ "conformance/policy/1.0.0/vectors/documents/informational-max.json": "sha256:569a5b0680eafb6308c2984912e4a702054e6839a6c484bec7eb68ae0fc8aad8",
+ "conformance/policy/1.0.0/vectors/documents/informational-over.json": "sha256:361db3f18d7640ac7ecaebfe28e45436ca10bc8ebc806fd23f1ac5145ca3c472",
+ "conformance/policy/1.0.0/vectors/documents/invalid-utf8.json": "sha256:36781faac995a68b69aab7d540747e0c70efed427e66a608cdf64fc4feaaff12",
+ "conformance/policy/1.0.0/vectors/documents/kind-id-confusion.json": "sha256:d7f690d0ca4b7962916984ee5ee92b70c3b7464016c0e003b0a3bbf4560127c8",
+ "conformance/policy/1.0.0/vectors/documents/limited-scope-missing-basis.json": "sha256:9d9a9b30e6bfa07ca3aa059f14f1011bf2b1dcee92e218d8ea6656b8bad65584",
+ "conformance/policy/1.0.0/vectors/documents/limited-scope-unknown.json": "sha256:670a45f40a0ff1b21a12481f962f50ae63618d79fa30932882e45ed645a64bdd",
+ "conformance/policy/1.0.0/vectors/documents/malformed-over-depth.json": "sha256:fdc562409aec5a2549f9a1b1f21155ec3b49c71ce76b3ad080c56ba1d0543a76",
+ "conformance/policy/1.0.0/vectors/documents/missing-governing-policy.json": "sha256:27f20c087c208144a234684ca1719ab9e0013dad914be4ddf507a546e1d216f8",
+ "conformance/policy/1.0.0/vectors/documents/missing-narrative.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "conformance/policy/1.0.0/vectors/documents/multiple-json.json": "sha256:b51f08b698d88d8027a935d9db649774949f5fb41a0c559bfee6a9a13225c72d",
+ "conformance/policy/1.0.0/vectors/documents/multiple-policy-identities.json": "sha256:fedf62df6fd02f041a2ea418305804ab5ace22bc0946cd1c876c0063937ce2c5",
+ "conformance/policy/1.0.0/vectors/documents/narrative-max.json": "sha256:c1592868007ae1365c18c55e7325d641f82cb4dfcf7ad71ab5cda2fb9a984504",
+ "conformance/policy/1.0.0/vectors/documents/narrative-over.json": "sha256:5ec2805842ca8c97450c468d2b78c6063d48c00287a1195da476e23e36c0008f",
+ "conformance/policy/1.0.0/vectors/documents/nonfinite.json": "sha256:d5b592c05dc25b5032553f1b27f4139be95e881f73db33b02b05ab20c3f9981e",
+ "conformance/policy/1.0.0/vectors/documents/number-literal-over-128.json": "sha256:e2eb26c79686e936e6603fbcd49b32881635021917d175c4df147b5e21b44f5c",
+ "conformance/policy/1.0.0/vectors/documents/opaque-original.json": "sha256:feb70c8c8e2a8f80e634980de161fa1bb092460969707696b5a3b5059ad71df3",
+ "conformance/policy/1.0.0/vectors/documents/opaque-original.pdf": "sha256:af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "conformance/policy/1.0.0/vectors/documents/original-max.json": "sha256:78948872a9e1ff6eddff492224fe06858b0f4c0e0f8439553e49d58043abc541",
+ "conformance/policy/1.0.0/vectors/documents/original-over.json": "sha256:990e5847fc18a19f13a1cf7df4dd55b943e6be3c65ba87c25189405ac896c1a0",
+ "conformance/policy/1.0.0/vectors/documents/permission-field.json": "sha256:87516d167771479d3b14674ddfc747e03e6a3b12175af1a6cbf91daa7ad34069",
+ "conformance/policy/1.0.0/vectors/documents/policy-canon-stale.json": "sha256:45fa4fb5f254eeed1037d1374524b49ed6b94bf484a6f7b7af77a28c725c271a",
+ "conformance/policy/1.0.0/vectors/documents/policy-identity-stale.json": "sha256:77f758365f4c4b772cde630b45f2045e8434511dc5d5e261c67e41de9db7a78c",
+ "conformance/policy/1.0.0/vectors/documents/policy-version-ref-stale.json": "sha256:f048ab96431c7a97f44a4339b72dc03a164c0c7747a8d2aa9b95fafa099e4457",
+ "conformance/policy/1.0.0/vectors/documents/prototype-selector-refused.json": "sha256:b537c0a1efb5ebc6e06e8a8e60dca2d0ad3d2c4f5e4eeab091b23c3dff4fa408",
+ "conformance/policy/1.0.0/vectors/documents/registration-count-16.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "conformance/policy/1.0.0/vectors/documents/registration-count-17.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "conformance/policy/1.0.0/vectors/documents/requirements-field.json": "sha256:397484bcb95f136afcc4b2201a6137ef100d9cdc3c8a0b2326dbc1653d2db62c",
+ "conformance/policy/1.0.0/vectors/documents/review-max.json": "sha256:729e84b3a8c8826638b7cf5f9703429658aee12eb9aafa0a5dde82f50f450718",
+ "conformance/policy/1.0.0/vectors/documents/review-over.json": "sha256:9ca0faef44ae60d277c1744c358a55c219400b15a6365f519ba20059d14d153b",
+ "conformance/policy/1.0.0/vectors/documents/second-policy.json": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "conformance/policy/1.0.0/vectors/documents/section-id-duplicate.json": "sha256:c63007da9f867e07f68f8a91758f2054436e91263ddb7c50b8bd5dee21cf80be",
+ "conformance/policy/1.0.0/vectors/documents/shared-bytes-multiple-media-types.json": "sha256:f4d2bc2c621771b30f3ae984ab3fd05a00891827c047d5a746fc44a3ad23ad1a",
+ "conformance/policy/1.0.0/vectors/documents/signature-field.json": "sha256:fc4064630a3ef93cbfb46969a22600796a2954256ca42876325673e5d2ef49d1",
+ "conformance/policy/1.0.0/vectors/documents/singleton-with-id.json": "sha256:232d4bbb79ff949aaf6c9e17292c5c70426595d8e761c6fefecb6d225e7d677a",
+ "conformance/policy/1.0.0/vectors/documents/source-id-unknown.json": "sha256:e93860ee23385cee86b3bca725e14c3fa4f45aadd3c5cb4fa422ee3d008cd3f1",
+ "conformance/policy/1.0.0/vectors/documents/stale-material-hash.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "conformance/policy/1.0.0/vectors/documents/stale-material-length.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "conformance/policy/1.0.0/vectors/documents/standalone-policy.json": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "conformance/policy/1.0.0/vectors/documents/surrogate.json": "sha256:8c0c59dd0d275aadcd462a5fe12eb352cbdfeaf961eae4f85a4660521df7d2f5",
+ "conformance/policy/1.0.0/vectors/documents/unknown-kind-registration-over.json": "sha256:1e2f99280db3d76fbb608f1c13a53be498d2b4bfc46836b2893383895cf076ab",
+ "conformance/policy/1.0.0/vectors/documents/unknown-rule.json": "sha256:b4d8bc7e5745d897cda79f121721b388b4da9e1fe125d782dbe161cddd03aa87",
+ "conformance/policy/1.0.0/vectors/documents/unregistered-media-type.json": "sha256:1c816a89de90ad710cfeb4b17bad6f0720515395e0af0b35e0394d539e605b30",
+ "conformance/policy/1.0.0/vectors/documents/unsupported-element.json": "sha256:356114c27d81685231f3e6b7aa32305ae890319cf392e652e69d8ce908f5ca90",
+ "conformance/policy/1.0.0/vectors/documents/uri-final-lf-pack.json": "sha256:c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "conformance/policy/1.0.0/vectors/documents/uri-final-lf.json": "sha256:2f801fd7b06bf34f5c3a42973249a71bf84c421755a1ef372b1bbd4ccd3710c4",
+ "conformance/policy/1.0.0/vectors/documents/uri-fragment-raw-brackets.json": "sha256:0ef6ed9f582d15475ec9b5358be05194b372f1fbc1935cc3a175e31e6c526736",
+ "conformance/policy/1.0.0/vectors/documents/uri-invalid.json": "sha256:2c8f6c238143c7dfa4381ab81b78365bfd43902a7eea09b872f1ee37ca0789ba",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipv6-compressed.json": "sha256:6c59778a6d517c252840226d8a3056280777b04e76bf6759c731343f7d01080b",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipv6-double-compression.json": "sha256:b1be77321cd95c07b4ecf8baaba8751028b831e2787ba8ab6ee2a9c5e884193e",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipv6-ipv4-tail.json": "sha256:2c26026d56fe5564dad671c20ad55b0237d5137a291edf56c455bd217f6340c2",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json": "sha256:0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json": "sha256:88efbe036d7386812662a46c154cf1521caf9864a9e676d35036038af754a81f",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-invalid-version.json": "sha256:399ba24e5ffb43360654f3c641fc002f61d8cb2f920eed0480808912bbccc2ed",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase-pack.json": "sha256:ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-lowercase.json": "sha256:13c1a9fff73cddc63b779e619a622cc05e6ffeb4d5eb2d544a43acfe80973bbd",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase-pack.json": "sha256:6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "conformance/policy/1.0.0/vectors/documents/uri-ipvfuture-uppercase.json": "sha256:0ce1badc441db3a4290400dab23f2d8e5afee8fc0bf799abdb7cb01140e9ff10",
+ "conformance/policy/1.0.0/vectors/documents/uri-numeric-regname-leading-zeros.json": "sha256:2ab9c70bc4c613fabe5bcbacd27ca79b73b08803e918f1755b3735ebcd96ca6f",
+ "conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets-pack.json": "sha256:c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "conformance/policy/1.0.0/vectors/documents/uri-path-raw-brackets.json": "sha256:b70d9a76a3b38f58a0f2b075c9ecfe6803b6e0a404c2b526000f85a86b244f67",
+ "conformance/policy/1.0.0/vectors/documents/uri-percent-brackets.json": "sha256:52ed06084ad97c026b15ece99674e6d638d26509506b62ce3d5195da7acd5a63",
+ "conformance/policy/1.0.0/vectors/documents/uri-percent-incomplete.json": "sha256:f8db4efe5972393c15cd0c8ad8cbe88262ac02845d8863781cad83f970fa212b",
+ "conformance/policy/1.0.0/vectors/documents/uri-percent-nonhex.json": "sha256:4a239d1009d314a9a0e285848fb1eba211a5574e17907253936aa6820f98534b",
+ "conformance/policy/1.0.0/vectors/documents/uri-percent-regname-pack.json": "sha256:50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "conformance/policy/1.0.0/vectors/documents/uri-percent-regname.json": "sha256:86ea9309a59ba683a85c73442c2638d56aa21f2e9e4f020d3954b043ab7c5f06",
+ "conformance/policy/1.0.0/vectors/documents/uri-percent-unicode.json": "sha256:5f062c610d9c546cba55951e3f9921b0de142ac382dac7d4a00e69ba65cf890f",
+ "conformance/policy/1.0.0/vectors/documents/uri-query-raw-brackets.json": "sha256:8d24bd52b12805ba9c602f113ca47c0a1dd141fc35577c09e0581c033ee46e24",
+ "conformance/policy/1.0.0/vectors/documents/uri-raw-unicode.json": "sha256:15bf301598d90e8a1e001973df95a1cb04021e1cb7a4385bf3ca0ef8eecebf7a",
+ "conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets-pack.json": "sha256:a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "conformance/policy/1.0.0/vectors/documents/uri-rootless-raw-brackets.json": "sha256:4143f4d8d6e9df42e8a8ab8e011b9404b719f4e400dcb25d360d2ac80ff2b39d",
+ "conformance/policy/1.0.0/vectors/documents/uri-userinfo-percent-brackets.json": "sha256:85c63cc716e50e0020cd419f636caf824afbe22826df6abc135cc7433cf4253f",
+ "conformance/policy/1.0.0/vectors/manifest.json": "sha256:3b28a763b4435a3f4c9f1613fcc435b305a08045569f0473bdaa89551b873b4a"
+ }
+ },
+ "formatDigests": {
+ "spec/policy.md": "sha256:c558d265e5c6aa43046fe40047a041202148d71713e576915d34d906dd65c5fe",
+ "schema/policy/1.0.0/common.schema.json": "sha256:71d4427dc535a924233c9d0ef4dd222c762da7bb1de9b54436e1d4ee53602a28",
+ "schema/policy/1.0.0/policy.schema.json": "sha256:ebc4e425a3dc2bac39da13fc0672d523c7f450e1df8e4df1c393b157e6698e32",
+ "schema/policy/1.0.0/governing-adoption.schema.json": "sha256:c37488754b53c2a2a1bbb0a8eafab05b91ef88198160c5074aa01f921b0df84f",
+ "schema/policy/1.0.0/consumer-core-0.2.0-draft.schema.json": "sha256:847910902fa202d9fb3a97062071b532f11649031c9dad32490bf191dca5b3b5",
+ "conformance/policy/1.0.0/fixture.schema.json": "sha256:2525f2dc9277ab9321fe66bf8968bbcd421986bb216a8eaa1bb0efdac65f79fc",
+ "conformance/policy/1.0.0/vectors.schema.json": "sha256:d622622af5abd47b270e5cc970c76870af283ff50299fbfe1d724a3e74a10376",
+ "conformance/policy/1.0.0/vectors/README.md": "sha256:eab4e90c6e946b60842ff65f5ed7b769c6059fc03f77fb9351a203eddcadbaa9"
+ }
+}
diff --git a/internal/policy/official/releases/policy-v1.0.0-draft.1.md b/internal/policy/official/releases/policy-v1.0.0-draft.1.md
new file mode 100644
index 00000000..aea81a37
--- /dev/null
+++ b/internal/policy/official/releases/policy-v1.0.0-draft.1.md
@@ -0,0 +1,56 @@
+# Policy companion 1.0.0-draft.1
+
+This describes the first independently versioned Policy release at **draft
+maturity**, using exact document format `1.0.0`, Core consumers `0.2.0-draft`,
+versioned closed schemas and the complete 124-row Policy offline-reader corpus.
+The maintainer approved the bounded draft after CI, effective only upon required
+green CI and PR 218 merge. The default-branch RFC remains Review until that merge;
+this source document alone establishes no immutable publication or conformance
+claim. Publication requires the exact `policy-v1.0.0-draft.1` tag and a
+maintainer-published GitHub release. Maturity remains draft; a conformance claim
+also requires the complete published corpus and the companion class requirements.
+
+The format retains exact content/narrative/source/interpretation/consumer bytes,
+UTF-8 section anchors, optional existing `jps-canon` identity, independent strict
+artifact versions, role/aggregate bounds and pack-only total scoped coverage.
+The JSON release manifest pins exact schemas, format prose and corpus bytes.
+The shared release builder refuses publication preparation until draft acceptance
+and exact tag/commit/HEAD/clean-tree checks pass. Archive checksums and GitHub
+build-provenance attestations use the existing release workflow.
+
+- Reader compatibility: the prototype 0.0.2 wrapper is refused. The corrected
+ proposed 1.0.0 input grammar is preserved, but official schema resource IDs and
+ valid-result/capability maturity differ. Unsupported formats refuse exactly.
+- Writer compatibility: no existing Policy/adoption bytes require rewriting.
+ Newly written documents must use exact `formatVersion: "1.0.0"`; artifact
+ version arithmetic or a citation cannot select grammar or create adoption.
+- Semantic compatibility: input content/reference/anchor/coverage meaning is
+ unchanged from the corrected proposal. The reader result now reports `draft`
+ instead of `proposed-draft`; clients comparing complete objects must update
+ deliberately. No Core evaluator, schema, corpus, Pack execution pin or Dialect
+ semantics changes. The earlier candidate/prototype remain archived unchanged.
+- Migration compatibility: prototype migration requires explicit intent, new
+ immutable Policy/adoption identities, preserved retained bytes and dependent
+ snapshot re-review. No approval, permission, role, signature or lifecycle state
+ migrates. See the bundled promotion map and migration guide.
+
+Scope excludes Graph consumers/closure, correct natural-language interpretation,
+complete organizational policy discovery, authenticated review/signature trust,
+provider lifecycle/freshness, currency, current authority and dispatch permission.
+No production governance or stable-readiness claim follows. Existing experimental
+software pinned to older Spec bytes retains its exact old capability/meaning;
+this publication does not upgrade its pin or adopt it on its behalf.
+
+The reference Python reader and Runtime port are Codex-assisted work by this
+project, not genuinely independently authored implementations. The maintainer
+accepted the limited public review period for this bounded draft and applied the
+standing temporary different-vendor-review exception without changing the general
+governance rule. The separate OpenAI `gpt-6.1-sol`/`xhigh` review reported no
+material findings on tree `60b04d452efa49032a0cc7d3ac1e55a3900410a8`, committed
+unchanged as `7f118278e480d88e53e6a6be2fe084610a2bebf9`; its complete record is on
+[PR 218](https://github.com/Judgment-Pack/judgment-pack-spec/pull/218#issuecomment-6273316525).
+The final CI-fix/acceptance delta requires its own bounded review and required
+CI before merge. The [conditional disposition](../conformance/policy/1.0.0/ADOPTION.md)
+records scope, public-process limits, deferred questions and reopening conditions.
+No outside stakeholder review, independent interoperability or publication is
+inferred from these records.
diff --git a/internal/policy/official/requirements-dev.txt b/internal/policy/official/requirements-dev.txt
new file mode 100644
index 00000000..96766f77
--- /dev/null
+++ b/internal/policy/official/requirements-dev.txt
@@ -0,0 +1,2 @@
+jsonschema[format-nongpl]==4.23.0
+Markdown==3.7
diff --git a/internal/policy/official/rfcs/0000-rfc-process.md b/internal/policy/official/rfcs/0000-rfc-process.md
new file mode 100644
index 00000000..25c5a948
--- /dev/null
+++ b/internal/policy/official/rfcs/0000-rfc-process.md
@@ -0,0 +1,95 @@
+# RFC 0000: Request for Comments process
+
+- Status: Active
+- Type: Process
+- Created: 2026-07-22
+
+## Summary
+
+A Request for Comments (RFC) is the design record for a material change to the Judgment Pack
+Specification, its profiles, conformance model, or governance. "RFC" is used here in the sense
+adopted by projects such as Rust and React — a proposal opened for public comment and deliberate
+disposition — not the IETF sense of an already-published standard.
+
+This process replaces the earlier Judgment Enhancement Proposal (JEP) process; the required
+sections and evidence bar are unchanged.
+
+## Required sections
+
+Every standards-track RFC should contain:
+
+1. **Summary** — the proposed change in plain language.
+2. **Problem** — the interoperability problem and affected users.
+3. **Evidence** — real examples and known implementation experience.
+4. **Specification** — exact proposed portable semantics.
+5. **Alternatives** — including no change, extension, profile, and product-only behavior.
+6. **Compatibility** — reader, writer, semantic, and migration effects.
+7. **Security and privacy** — abuse, confusion, disclosure, and resource risks.
+8. **Conformance** — positive, negative, boundary, and adversarial cases.
+9. **Implementation** — at least two plausible independent implementations.
+10. **Unresolved questions** — issues that must not be hidden by acceptance.
+
+## Statuses
+
+- `Draft`
+- `Review`
+- `Accepted`
+- `Rejected`
+- `Withdrawn`
+- `Superseded`
+
+Acceptance means the design is approved for the maturity named by the RFC. It does not automatically
+make a feature stable.
+
+## Cross-project exploratory records
+
+An RFC in this directory normally proposes a change to JPS, a profile, the conformance model, or
+governance. A proposal whose every part lands in another repository of the project — the reference
+runtime, the gateway, the research line — may still be recorded here as a **cross-project
+exploratory record** when the design question deserves public visibility before any implementation
+exists. Its `Type` must say so, its text must name where each part would land, and its statuses
+carry adjusted semantics: acceptance endorses the design record as written and confers no authority
+over the owning repository, which makes its own adoption decision by its own process. Nothing
+recorded this way becomes part of JPS by being recorded.
+[RFC 0010](0010-gateway-signing-identity.md) is the first such record.
+
+The provision also covers a **retrospective** record: one filed after its parts were built, when a
+design that spans more than one repository would otherwise have to be reconstructed from each of
+them. Such a record says that it is retrospective, describes what exists rather than proposing it,
+and states the implementation, release and review standing of each part. Its acceptance endorses
+the record as an account of the design and ratifies nothing in the owning repositories, whose
+adoption decisions are their own. [RFC 0014](0014-lineage-record-and-action-binding.md) is the first such record;
+the question was raised by that record and ruled on at its acceptance.
+
+## Review
+
+Research-preview RFCs remain open for public comment for a reasonable period based on complexity.
+Maintainers may request prototypes or conformance cases before disposition. A stable normative
+feature should not be accepted without evidence from two independent implementations.
+
+While the project has a single maintainer, public comment alone has not drawn outside review. The
+pull request adopting [RFC 0009](0009-interim-review-regime.md) and every pull request merged after
+it — where that pull request creates, materially amends, or dispositions an RFC, including RFCs
+0001–0007, which predate the requirement and acquire it the next time such a pull request touches
+them — therefore also carries a recorded adversarial review by a model from a different vendor than
+any model that assisted the drafting, with a written maintainer disposition for each finding. The
+test is commit-relative, not date-relative. What the record must contain, what it cannot prove, what
+the review does not substitute for, and the criteria that end the requirement are in
+[`GOVERNANCE.md`](../GOVERNANCE.md#interim-review-regime); the design record is
+[RFC 0009](0009-interim-review-regime.md).
+
+## Compatibility
+
+During `0.x`, breaking proposals are allowed but must be labeled and accompanied by migration
+guidance. After a stable release, its compatibility policy takes precedence over this draft process.
+
+## Seeded proposals
+
+The following early-stage RFCs are published as `Draft` to make current design questions visible
+rather than settled. They are not part of the specification.
+
+- [RFC 0001 — Pack manifest](0001-pack-manifest.md)
+- [RFC 0002 — Judgment Graph composition](0002-judgment-graph.md)
+- [RFC 0003 — Evidence reference](0003-evidence-reference.md)
+- [RFC 0004 — Planner interface](0004-planner-interface.md) — since dispositioned `Rejected`
+- [RFC 0005 — Pack discovery](0005-pack-discovery.md)
diff --git a/internal/policy/official/rfcs/0023-policy-companion.md b/internal/policy/official/rfcs/0023-policy-companion.md
new file mode 100644
index 00000000..6b751d26
--- /dev/null
+++ b/internal/policy/official/rfcs/0023-policy-companion.md
@@ -0,0 +1,406 @@
+# RFC 0023: Policy content and governing adoption
+
+- Status: Accepted
+- Type: Standards track, companion at draft maturity
+- Created: 2026-10-17
+- Issue: [#211](https://github.com/Judgment-Pack/judgment-pack-spec/issues/211)
+
+This PR proposes acceptance at **draft maturity**, effective only when
+[PR 218](https://github.com/Judgment-Pack/judgment-pack-spec/pull/218) merges after
+required CI passes. Until then the default-branch RFC remains Review; this branch
+records the status proposed for merge, not a completed adoption or publication.
+On merge, [spec/policy.md](../spec/policy.md) defines the bounded Policy offline-reader
+companion and the selected independent draft release route. The original proposal
+and unresolved questions below remain informative design history; their current
+draft dispositions are in [ADOPTION.md](../conformance/policy/1.0.0/ADOPTION.md).
+No stable maturity, immutable release, consumer adoption or execution authority
+follows from draft acceptance. The [candidate contract](policy-companion-contract/README.md)
+remains archived proposed material with its original status and bytes.
+The historical [prototype](policy-companion-prototype/README.md) remains explicitly
+non-normative and byte-for-byte frozen at proposal `0.0.2`, baseline commit
+`8a56a95d555c17640d2db4984363b779536b3c2a`. Host integration guidance below names separate
+product responsibilities; acceptance of this RFC would not adopt those products'
+protocols on their behalf.
+
+## Summary
+
+Propose a small domain-neutral companion for retained policy content and its exact
+governing relationship to a consuming pack. Preserve the pack/graph as executable
+authority. Policy text, review assertions and adoption describe intent, provenance
+and governance; they introduce no condition language and do not change evaluator
+precedence. Optional readable structured requirements are deferred from the first
+candidate, whose closed grammar refuses a `requirements` member.
+
+The proposed candidate supports pack consumers only. Composition with graphs needs
+the relevant adopted graph contract and supporting hosts; this RFC does not
+advertise standard Runner graph-job support. A Framework artifact is not required.
+Collections can organize policies without implying dependency or priority.
+
+## Problem
+
+A policy may start as a document, be authored collaboratively, or be managed by
+another system. It can remain effective while an executable interpretation is
+developed or revised. A citation in a pack does not say whether that policy governs
+execution, what exact policy version was interpreted, or what clauses remain
+manual. A passing test does not establish complete coverage or approval.
+
+Products can store these relationships privately, but then a second consumer cannot
+distinguish a governing dependency from an informational reference or reconstruct
+what exact content a review covered. Putting current permissions or mutable
+publication state into Core would turn a portable evaluator into a governance
+service, and still would not prove that a historical statement remains current.
+
+The proposed boundary is immutable supplied-document meaning plus explicit limits.
+The operational system owns authority and decides whether work may start now.
+
+## Evidence
+
+Three design cases motivate a shared form:
+
+1. **Data access.** A platform team imports a sharing policy, reviews its clauses
+ and implements release eligibility in a pack. Exact source/narrative bytes and
+ interpretation must survive export. Policy withdrawal needs a live host gate;
+ an offline content match cannot enforce it.
+2. **Procurement.** An externally managed procurement policy publishes a new file
+ revision. The consumer retains its existing adoption while reviewing the new
+ revision. A changed file, missing file or access failure must not be inferred
+ to mean approved, published or withdrawn.
+3. **Refunds.** A local Desk admin authors, reviews and publishes a policy alone.
+ The audit can truthfully record the same person performing those roles when
+ the configured workflow permits it. It must not claim independent approval.
+ Some clauses may remain manual; automated eligibility still lives in a pack.
+
+The prototype supplies synthetic retained material for these domains. It is
+design evidence only: no production policy approval, live enforcement, external
+connector run or independent implementation agreement is claimed.
+
+Existing Core sources/review metadata, retained Runtime/Runner artifacts and
+Dialect provenance are prior boundaries to reuse, not proof this companion exists.
+[RFC 0011](0011-judgment-currency-anchor.md) already explores retired pack versions
+and an offline currency snapshot. It explicitly cannot establish real-time
+currency or current authorization. This proposal does not adopt, supersede or move
+that Draft's registry; its relationship to policy lifecycle remains a review item.
+[RFC 0012](0012-witness-contract.md) and the accepted
+[checkpoint witness companion](../spec/checkpoint-witness.md) concern supplied
+history comparisons, not policy approval or a current permission to execute.
+
+## Specification
+
+### Proposed portable surface
+
+The surface consists of **Policy content** and **Governing adoption**. The
+[review candidate](policy-companion-contract/README.md) supplies self-contained
+proposed prose, closed schemas, a bounded offline checker/capability record,
+three retained-byte domain examples and reusable static positive/refusal vectors.
+Both documents require exact `formatVersion: "1.0.0"`, with `kind: "policy"` or
+`kind: "governing-adoption"`. The separate strict `x.y.z` artifact `version` does
+not select grammar. No shared-major inference or integer/legacy alias is allowed.
+This selector is proposed, not adopted, released or stable.
+
+The frozen historical prototype uses its closed `prototype` wrapper with profile
+`jps-policy-companion-prototype`, proposal `0.0.2` and status `non-normative`.
+The candidate refuses that wrapper; no parser migration occurs. The
+[explicit migration guide](policy-companion-contract/MIGRATION.md) preserves
+source, narrative, interpretation and consumer bytes, requires new immutable
+Policy/adoption identities and exact dependent references, retains originals and
+requires dependent snapshot re-review. No approval or permission migrates.
+The candidate's [prototype pin](policy-companion-contract/prototype-0.0.2-pin.json)
+records the unchanged historical bytes.
+
+A Policy contains:
+
+- a stable absolute-URI identity, immutable artifact version and title;
+- declared publication-management intent (`workspace-managed` or `externally-managed`),
+ which does not authenticate a publisher or import its authority;
+- a reference to exact retained UTF-8 narrative bytes;
+- stable section identities anchored by half-open UTF-8 byte ranges in that exact
+ narrative, plus explicit provenance references;
+- retained original source references with provider/account/resource identity,
+ nullable opaque source revision and original content identity.
+
+The unreleased candidate's URI assertion is corrected after commit
+`30b0b30a1b0c851c41bdb271d6ef9534c91bcdec` to the complete scheme-bearing `URI`
+production of [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986#appendix-A), with
+optional fragments, not the narrower `absolute-URI` production. Final LF and
+leading-zero IPv4 tails in IPv6 literals now refuse; uppercase `V` in IPvFuture
+now validates under [RFC 5234 §2.3](https://www.rfc-editor.org/rfc/rfc5234#section-2.3).
+Twenty portable URI vectors also cover percent encodings, Unicode and brackets by
+component, including seven full adoptions with exact consuming-Pack IDs/references.
+The candidate's consuming-Pack structural checks assert the same corrected URI
+grammar; shared Core validators and the prototype remain unchanged.
+This repairs candidate-only validation rather than adopting dependency
+or URL-parser quirks. Core/prototype checks and exact retained-byte semantics remain
+unchanged; proposed format `1.0.0` is still unreleased and not adopted.
+
+The narrative can be authored directly or derived from original documents.
+Original PDF/page/file bytes remain separate. An anchor in the narrative is not
+an original-source offset, and a new extraction does not silently rewrite either.
+No runtime conditions, live ACLs, publication states or approval booleans belong in
+the immutable content. Optional readable structured requirements, including any
+section-reference grammar, are deferred pending a concrete authoring/interchange
+need and reference-check vectors. They are unsupported in the candidate. Any
+future form must remain non-executable and requires an explicit selector change;
+it must not introduce a second decision language.
+
+A Governing adoption contains its own identity/version, the exact consuming pack
+reference and one or more exact policy references. Every governing reference
+declares whole-policy or explicit section scope, and per-section coverage:
+
+| Coverage | Required interpretation |
+| --- | --- |
+| `implemented` | Exact typed consumer element references and retained interpretation/review basis |
+| `manual` | Explicit responsible handoff/process |
+| `awaiting-interpretation` | Unresolved meaning, with explanation |
+| `awaiting-implementation` | Meaning agreed but automation not supplied, with explanation |
+| `out-of-scope` | Explicit rationale; never silent omission |
+
+The candidate resolves `{kind: "rule", id}` to Core `rules[]` and
+`{kind: "exception", id}` to Core `exceptions[]`. The singleton references
+`{kind: "applicability"}` and `{kind: "fallback"}` identify the actual Core
+`applicability` and `fallbackOutcome` members; they have no fabricated ID. Absent
+members, unknown IDs, duplicate references within one coverage record and
+kind/ID confusion refuse. Fallback must name a declared, uniquely identified
+outcome. These references identify supplied elements; they do not prove correct
+interpretation or full Core semantic conformance. Evidence requirements, outcomes,
+condition subelements and escalation are unsupported coverage kinds, as are graph
+consumers. A clause implemented through scope, exception or fallback can reference
+that actual element without inventing a dummy rule or a manual process.
+
+Informational sources are separate and do not create governing dependencies.
+Scope and coverage are declarations to be reviewed, not a language for conditional
+authorization. Validation cannot prove that an organization declared every
+applicable policy or that an interpretation is correct.
+
+### Identity and offline checks
+
+The proposed content reference is exact-byte SHA-256, byte length and media type.
+Optional canonical document identity names its profile separately. Reuse the
+existing [Dialect companion's `canon`](../spec/dialect.md) domain by explicit
+reference: do not substitute JCS or preparation canonicalization. Existing pack
+bytes are retained unchanged; no reserialization changes a pack's execution pin.
+
+Artifact versions use the same lexical discipline as
+[RFC 0021](0021-dialect-artifact-identity.md): exactly three unsigned decimal
+components, no leading zeros except `0`, no suffixes or coercion, and the existing
+256-ASCII-character bound. The candidate adds no bump arithmetic, compatibility
+inference or version-reservation service. Draft CAS revisions, source revisions,
+artifact versions and lifecycle revisions are separate values.
+
+Readers check supported selectors, closed grammar, resource bounds, exact content
+references, unique section identities, anchored UTF-8 boundaries and adoption
+references within their declared scope. They refuse incomplete material rather
+than silently treating it as approved. Identities are opaque references, not URLs
+to fetch. Access and network acquisition require separate authority.
+
+Candidate bounds retain the prototype's role-specific limits: parsed JSON is at
+most 262,144 bytes, retained narrative/review/informational material at most
+1,048,576 bytes each, and retained
+original source material at most 4,194,304 bytes each. The fixture carrier loads at
+most 16,777,216 distinct retained bytes in total; multiple registered media types
+for identical bytes count once. An unsupported original size refuses the complete
+bundle. Truncation, extraction substitution and silently dropping the original do
+not produce a complete bundle. The parsed-document depth limit is 32; number
+literals are at most 128 characters
+with exponent magnitude at most 308. The candidate declares these limits explicitly;
+they are not adopted Core limits or a stable content-size promise. Its refusal
+objects use fixed bounded codes, never raw content. A malformed/missing selector
+is `invalid-selector`; a well-formed unsupported selector is `unsupported-format`.
+Physical/schema resource maxima report `input-over-bound`, separately from
+reference, anchor, coverage and other semantic failures. Capability discovery lists
+exact candidate format, proposed-draft maturity, features, limits and exclusions.
+
+Consumer bytes are identified before adoption. A release can then bind the
+consumer, adoption and supported dependency closure without circular hashes.
+The host derives that closure from its reviewed registration, not from an
+execution caller's possibly shortened list. Unsupported required composition
+refuses. Policy citations alone cannot be upgraded into governing adoption.
+
+### Review assertions and trust boundary
+
+A review assertion needs the exact complete candidate, workflow revision,
+reviewed scope/anchors, authenticated subject, decision time and authority basis.
+Historical assertions cannot transfer silently to changed candidates. A section
+approval does not replace an accountable whole-policy approval. Whether the same
+local admin may author and approve is a workflow rule, not a universal spec ban.
+
+The authentication/signature/export trust profile is unresolved. The candidate
+therefore carries an exact interpretation basis, **not** portable proof of an
+authorized sign-off. A hash, imported document, test report or model statement
+must not be interpreted as that proof. No review-assertion conformance class is
+introduced by this draft.
+
+### Non-normative host integration boundaries
+
+These are required product design considerations, not APIs standardized here:
+
+| Boundary | Owning responsibility |
+| --- | --- |
+| Source observation | Gateway retains content/extraction and raw provider revision/lifecycle evidence; Desk interprets a configured authority mapping |
+| Adoption | Desk records an authorized exact interpretation; Runtime checks supplied documents; Runner retains the registered dependency closure |
+| Run/action admission | Desk's authoritative governance service decides current eligibility; Runner and actual action executors enforce at dispatch |
+| Review/publication | Desk persists exact candidates, scoped sign-offs, immutable publication and idempotent receipts in transactional state |
+
+Source state needs delivery identity, opaque source revision, observation time,
+availability, retained bytes and explicit history completeness. The same bytes
+with a new lifecycle assertion are a new observation. Persist snapshots/effects
+before advancing cursors; duplicate/out-of-order delivery and cursor loss require
+reconciliation. A source update does not overwrite drafts, transfer signatures or
+upgrade pinned jobs. An unresolved update known before publication participates in
+publication CAS; an update observed afterward creates impact review.
+
+Publication, effectiveness, supersession, expiry and withdrawal are distinct.
+Withdrawal defaults to blocking new dependent starts and later external actions.
+The authority serializes withdrawal with start commitment: withdrawal first blocks
+the start; commitment first admits the existing attempt. This is a logical
+authorization boundary, not atomicity with a remote side effect or instantaneous
+knowledge of unobserved upstream changes. Required unavailable/stale authority
+holds new governed work. An already dispatched external action may be irreversible.
+
+An eligibility preview is not a dispatch grant. Executors bind durable attempt,
+resource, payload, release and epoch identities before requesting a start. A
+recovered receipt is history, not a reusable permission to dispatch. Lost responses,
+crashes and restored backups require reconciliation/fencing; uncertain external
+operations must not be replayed. Offline pinned snapshots cannot establish these
+live guarantees, so the Runtime offline reader does not implement that service.
+
+Local Desk can be the authority for one admin's complete policy lifecycle. Team
+identity, invitations and separate reviewers extend that host mode; they do not
+need to be fabricated to enable honest single-person management. Gateway consumes
+admission decisions at its action boundary and does not become policy authority.
+
+## Alternatives
+
+- **No change/product-only metadata:** sufficient for a private editor but leaves
+ cross-product policy identity, coverage and governing/citation distinctions
+ ambiguous. Keep IAM, review routing and live lifecycle product-owned regardless.
+- **Core extension/profile:** would couple governance to evaluation and does not
+ supply a live authority. Existing packs must remain usable without policies.
+- **Adopt a universal control format:** OSCAL and other domain formats can support
+ adapters, but requiring one narrows a domain-neutral product and introduces
+ unnecessary control semantics. No normative mappings are proposed here.
+- **Make readable requirements authoritative:** creates competing execution
+ semantics. Defer optional readable requirements from this candidate; any later
+ form must keep the pack/graph authoritative.
+- **Use only pack-version currency:** RFC 0011's offline membership question is
+ useful but different from policy content, adoption scope and current permissions.
+- **Mandate frameworks:** organizing collections do not need another release type
+ or implicit policy priority. Revisit only for a concrete interoperability need.
+
+## Compatibility
+
+No Core, Dialect, preparation, graph or released conformance bytes change. The
+0.0.2 prototype remains unchanged. Candidate documents are opt-in; unsupported
+readers refuse them, and format compatibility cannot be inferred from artifact
+version arithmetic. Migrating a citation to a governing
+dependency is a reviewed new adoption, never automatic import behavior.
+
+Published policy content and consuming releases remain immutable. Renaming a
+title or moving a folder does not change stored execution pins. A fork has a new
+identity and fresh authority; imported approval history does not grant local roles.
+Upgrading an existing job is explicit and retains historical runs. Supersession
+alone does not declare every older pin ineligible; the adopted host rules decide.
+
+## Security and privacy
+
+Content identity does not establish truth, authority, current access or currency.
+Prevent ambiguous JSON, oversized material, malformed versions, anchor substitution,
+missing governing dependencies, imported approval booleans and cross-tenant
+reference disclosure. Bound originals, narrative and interpretation separately.
+Enforce current access in indexes, counts, exports and AI retrieval as well as pages.
+
+Model output can suggest content but cannot sign as an invited reviewer or change
+test expectations merely to obtain passing outcomes. Restore of an old local store
+cannot prove that no later withdrawal/revocation occurred. An unavailable external
+file or failed sync is not itself withdrawal. Cryptographic signatures, if added,
+will still need trusted identity and freshness rules; they do not resolve these
+questions merely by verifying mathematically.
+
+## Conformance
+
+The candidate reader result is limited to supplied-document validity and reference
+agreement under exact proposed format `1.0.0`. Its reusable manifest supplies
+positive, refusal, boundary and adversarial vectors with exact expected objects,
+including malformed/unsupported selectors, independent artifact versions, aliases,
+missing or stale byte references, optional canonical identities, section anchors,
+UTF-8 boundaries, scope/coverage mismatches and governing-versus-informational
+references. Runtime or other ports can execute retained static bytes directly; the
+only generation grammar repeats one declared byte for a declared length.
+
+The candidate and frozen prototype checks are experimental agreement aids, not
+released corpus entries.
+They must not be scored as proofs of authorization, complete policy coverage,
+live admission or independent interoperability.
+
+Host acceptance tests belong in their owning repositories: source update racing
+publication; same bytes with changed lifecycle; revoked reviewer/access after
+indexing; dependency omission; withdrawal-before-start; start-before-withdrawal
+followed by refused action; lost response recovery; worker fencing; and restore
+from a pre-withdrawal backup. A signed historical snapshot cannot satisfy these
+live tests by itself.
+
+## Implementation
+
+Spec owns the eventual portable companion, exact reference meanings and staged
+vectors. Runtime should expose shared offline validation/canonical/reference
+tooling only for an explicitly adopted or clearly experimental capability. Desk
+owns local/team lifecycle, durable review transactions, sync state, Library and
+shared UI/chat handlers. Gateway owns provider observations and execution-boundary
+enforcement. Runner owns frozen releases, closure and current start admission.
+Exchange can publish reusable definitions only after its entry contract supports
+them; it does not store private tenant approvals. Demo and evaluator studies
+exercise these boundaries without becoming alternate production services.
+
+Two plausible independently authored readers are a Runtime-backed local tool and
+a separate organizational policy service validating exported bundles without Desk.
+They would compare exact retained bytes and declared references and explicitly
+decline live-authorization claims. Two language ports by this project's author
+would not demonstrate independent authorship. That evidence is not available yet.
+
+The first product path is single-admin local policy management. Its explicit
+review can be self-review; later team deployments can require another reviewer.
+Manual and chat actions must share the existing execution/context/approval/CAS
+boundaries. No feature-specific model loop, permission inference or retry service
+is required by this RFC.
+
+## Unresolved questions
+
+1. Adoption/disposition of the exact proposed `1.0.0` selector, declared bounds and
+ closed reference/coverage grammar after public review; no released schema or
+ conformance class is assigned here.
+2. Trust/signature/export profile for review assertions and cross-workspace adoption.
+3. Reconciliation with RFC 0011's proposed pack currency registry without silently
+ adopting it or treating offline membership as live authorization.
+4. First real sync provider and its demonstrable revision/lifecycle/freshness
+ semantics; document-read support alone is insufficient.
+5. Host defaults for self-review versus independent review, quorum changes,
+ role-revocation effects on old signatures, expiry/grace and scheduled publication.
+6. Supported graph/composition closure and its owning execution contract.
+7. Independent implementation evidence and any domain-format adapter demand.
+
+## Conditional draft disposition
+
+On 2026-10-19 the maintainer directed: “Accept the bounded draft after CI; record
+the limited public review”. The decision accepts the exact corrected `1.0.0`
+content/reference/anchor/coverage grammar and bounds, Policy offline-reader scope
+and independent draft release route **upon PR 218 merge after required CI**.
+It explicitly accepts the limited public period for this bounded draft, without
+claiming outside review or independently authored interoperability evidence.
+The standing temporary different-vendor-review exception applies; the general
+governance rule is unchanged.
+
+The separate same-vendor review inspected tree
+`60b04d452efa49032a0cc7d3ac1e55a3900410a8`, committed unchanged as
+`7f118278e480d88e53e6a6be2fe084610a2bebf9`, and reported no material findings in
+[the complete PR record](https://github.com/Judgment-Pack/judgment-pack-spec/pull/218#issuecomment-6273316525).
+The final CI-fix/acceptance delta remains subject to the PR's bounded review and
+required CI gates; that earlier report is not a review of an unidentified later
+commit. [ADOPTION.md](../conformance/policy/1.0.0/ADOPTION.md) records the actual
+public history, exception, scope and deferred questions with reopening conditions.
+
+Draft acceptance adopts only [the companion](../spec/policy.md) and the narrow
+[publication route](../conformance/policy/1.0.0/PUBLICATION.md). The first independent
+release identifier is `policy-v1.0.0-draft.1`; naming it in this source branch
+does not establish publication. Only the exact tag and a maintainer-published
+GitHub release together do. No Policy conformance claim is available before
+immutable companion publication. The
+historical prototype/candidate and their review records remain unchanged.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/MIGRATION.md b/internal/policy/official/rfcs/policy-companion-contract/MIGRATION.md
new file mode 100644
index 00000000..bebc5006
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/MIGRATION.md
@@ -0,0 +1,56 @@
+# Explicit migration from prototype 0.0.2
+
+This is a proposed, breaking migration to the **unadopted draft candidate**
+`formatVersion: "1.0.0"`. Neither semver arithmetic nor opening a document consents
+to migration. The candidate reader refuses prototype documents; it never upgrades
+or reinterprets them. Prototype 0.0.1 needs its own explicit path to 0.0.2 and is
+not silently accepted by this guide.
+
+1. Keep the original 0.0.2 Policy, adoption, fixture and all retained bytes. Record
+ their exact digests and the original prototype pin. Migration creates new
+ reviewable artifacts; it does not overwrite history.
+2. Obtain explicit author/operator intent to migrate, including which exact Policy
+ versions, consuming Pack and adoption scope are intended. Explicitly choose
+ `workspace-managed` for former `desk-managed` content, or retain
+ `externally-managed` intent. Do not infer intent from an imported source's owner,
+ publisher, folder, citation, access response or approval history.
+3. Preserve the source, narrative, interpretation/review-basis and consumer bytes
+ **exactly**, with their existing raw digest, length and declared media types.
+ Preserve anchors, local section/source IDs, opaque provider revisions and Pack
+ `specVersion`/identity. Do not extract, normalize, reserialize or rewrite those
+ files just to satisfy migration. Re-extraction or changed meaning is separate
+ authoring and requires a fresh review.
+4. Construct a new Policy by removing the complete `prototype` wrapper and adding
+ the exact string `formatVersion: "1.0.0"`. Replace `desk-managed` with the
+ explicitly selected `workspace-managed`. Preserve the rest of the supported
+ content/provenance/sections. Choose the Policy's new immutable identity/version
+ explicitly: preserve its stable series ID only with a new artifact version, or
+ fork to a new ID. Never reuse an existing immutable `(id, version)` with changed
+ bytes. This offline checker cannot detect historical reuse on its own.
+5. Serialize and retain those new Policy bytes. Regenerate the raw content digest
+ and length and, when requested, the `jps-canon` canonical identity. Update every
+ dependent adoption's exact Policy reference (ID, artifact version, bytes and
+ optional canonical digest); a stale old hash must refuse. Keep the exact Pack
+ bytes/reference; a different Pack is a separate new interpretation.
+6. Construct a new adoption with `formatVersion: "1.0.0"` and no prototype wrapper.
+ Choose its immutable identity/version explicitly. Preserve or deliberately
+ re-review its exact scope and total coverage; do not fill omissions or upgrade
+ manual/pending/out-of-scope clauses automatically. Retain new adoption bytes,
+ regenerate their identities wherever referenced, and validate the full supplied
+ material under the candidate checker and vectors.
+7. Re-review dependent release/registration/export snapshots that pin changed Policy
+ or adoption bytes. Keep historical snapshots and runs on their original pins.
+ A new snapshot is an explicit host operation, never a side effect of parsing or
+ importing a document. Host authority and current admission remain separate.
+
+No approval, signature, authenticated review assertion, role, permission, lifecycle
+state, publication receipt or dispatch grant migrates automatically. Existing
+review-basis bytes remain historical explanations only. Even if every narrative
+byte and clause ID is unchanged, a host must obtain fresh applicable authorization
+for its new candidate and workflow, under its own contract. Informational sources
+stay informational; making one governing requires a reviewed new adoption.
+
+The three candidate examples intentionally use new Policy/adoption IDs and retain
+the old consumer/source/narrative/interpretation files unchanged. Their new hashes
+are reproducible examples, not migrated organizational approvals. There is no
+migration helper or implicit parser fallback in this slice.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/README.md b/internal/policy/official/rfcs/policy-companion-contract/README.md
new file mode 100644
index 00000000..b5a13b6e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/README.md
@@ -0,0 +1,340 @@
+# Proposed draft Policy companion contract 1.0.0
+
+This is the review candidate for [RFC 0023](../0023-policy-companion.md) and
+[Spec #211](https://github.com/Judgment-Pack/judgment-pack-spec/issues/211).
+**Proposed only, at draft maturity; not adopted, stable, released, or a JPS
+conformance class.** Writing `formatVersion: "1.0.0"` does not adopt a format.
+Nothing here establishes approval, current authority, permission, currency,
+source access, independent implementation agreement, or production fitness.
+The RFC remains open for public comment and disposition under the repository's
+process. No cross-vendor review or independent evidence is claimed here.
+
+The portable candidate consists of this prose, the closed
+[Policy](policy.schema.json), [Governing adoption](governing-adoption.schema.json)
+and [shared](common.schema.json) schemas, and the agreement
+[vectors](vectors/manifest.json). These are deliberately outside the adopted
+`spec/`, `schema/` and `conformance/` trees. Schema acceptance alone is insufficient:
+the byte, anchor, reference and coverage checks below are also required. A conflict
+between prose, schemas or vectors is a candidate defect, never an authorization.
+
+The historical [0.0.2 prototype](../policy-companion-prototype/README.md) remains
+unchanged, including its checker, tests and all retained files. Its exact baseline
+is commit `8a56a95d555c17640d2db4984363b779536b3c2a`, recorded file by file in
+[prototype-0.0.2-pin.json](prototype-0.0.2-pin.json). This candidate derives the
+immutable-content rules from that prototype, with its own schemas and checker.
+It never imports prototype code. The [migration guide](MIGRATION.md) describes the
+explicit, breaking transition; a reader never silently migrates an input.
+
+## 1. Exact selectors and immutable artifact identity
+
+A document has exactly one `formatVersion`, the **string** `"1.0.0"`, and `kind`
+`"policy"` or `"governing-adoption"`. No prototype wrapper, `specVersion`, integer
+selector, alias, suffix, coercion, or extension member is permitted. The schemas'
+URNs identify local candidate schemas, not a network location or an adopted release.
+Readers must dispatch on the whole selector before interpreting this grammar.
+
+The independent `version` names a revision of the immutable artifact, alongside
+its absolute-URI `id`. It is exactly three unsigned ASCII decimal components
+separated by dots: `0` or a nonzero digit followed by digits, with no leading zeros,
+suffix, spaces or final newline, at most 256 characters. `0.0.0` and a 256-character
+version are valid. No component arithmetic, bump policy, compatibility, reservation
+or historical uniqueness is inferred. In particular, artifact `7.3.42` still uses
+format `1.0.0`. Pack artifact references follow the same bounded version grammar;
+the retained Pack keeps its own Core `specVersion` unchanged.
+
+An `id` is an opaque, scheme-bearing identifier matching the complete `URI`
+production of [RFC 3986, Appendix A](https://www.rfc-editor.org/rfc/rfc3986#appendix-A),
+at most 2,048 characters. Optional query and fragment are allowed; a relative
+reference is refused. This means `URI`, not the narrower `absolute-URI` production
+that excludes fragments. Raw Unicode, controls, whitespace (including a final LF)
+and malformed percent triplets refuse. Percent-encoded Unicode and registered
+names remain valid; percent decoding, trimming and identity normalization never
+occur. Raw brackets belong only around an authority's IP literal, so brackets in
+path, query, fragment or rootless content must be percent-encoded. IPv6 dotted
+tails must satisfy the IPv4 decimal-octet grammar without leading zeros. IPvFuture
+accepts both `v` and `V`, under [RFC 5234 §2.3](https://www.rfc-editor.org/rfc/rfc5234#section-2.3).
+An unbracketed numeric host that fails IPv4 can still be a valid registered name.
+Identity is not permission to fetch it. Local IDs match `[a-z][a-z0-9]*(?:-[a-z0-9]+)*`, at most
+128 characters. Required readable text is nonempty and at most 4,096 characters.
+Every defined object is closed: unknown members at any level are refused.
+
+The unreleased candidate URI correction after commit
+`30b0b30a1b0c851c41bdb271d6ef9534c91bcdec` changes three dependency-derived answers:
+final-LF identifiers and IPv6 literals with leading-zero IPv4 tails now refuse;
+uppercase-`V` IPvFuture identifiers now validate. The checker applies a local
+candidate format override, including its consuming-Pack structural checks. Shared
+Core validators elsewhere and the frozen prototype are unchanged. The candidate's
+2,048-character ID bound belongs to its schemas; other Core URI fields retain
+their existing schema bounds.
+The 20 URI vectors also distinguish generic URI grammar from URL-parser behavior.
+Format `1.0.0` remains proposed and unreleased; this correction confers no adoption.
+
+## 2. Exact retained content and optional canonical identity
+
+A content reference is exactly `{bytesDigest, byteLength, mediaType}`. The digest
+is lowercase `sha256:` plus 64 hexadecimal digits over the exact retained bytes,
+including whitespace and final newlines. Length is the exact nonnegative integer
+byte count, never a Boolean. It never hashes a URL or filename. Media type is a
+lowercase token/token string under the shared schema, at most 128 characters,
+without parameters. Artifact bytes require `application/json`; a Policy narrative
+requires `text/plain` and valid UTF-8. Original bytes may be opaque, including PDF.
+
+Media type belongs to a reference and its registration, rather than to the digest
+alone. Identical bytes can be registered as both `text/plain` narrative and
+`text/markdown` original. Each reference must resolve under its declared media
+type, hash and length; registering one type does not register another. Conflicting
+bytes for one digest refuse. Distinct retained bytes count once toward the total
+budget, even with multiple types or roles; each consuming role still applies its
+own byte limit. Media-type declarations do not prove the content's actual type.
+
+An artifact reference is exactly `{kind, id, version, content}` with optional
+`canonicalIdentity: {profile: "jps-canon", canonicalDigest}`. The only artifact
+reference kinds in this candidate are `policy` and consuming `pack`, in their
+specified positions. Exact bytes are always checked, even when canonical identity
+is supplied. A canonical match never substitutes for the exact-byte pin.
+
+`jps-canon` reuses the existing [Dialect canonical form](../../spec/dialect.md),
+which in turn references the checkpoint-witness form. It is not JCS or preparation
+canonicalization. Objects sort names by Unicode code point; arrays retain order;
+strings retain Unicode without normalization, with JSON escaping for quotes,
+backslashes and controls; output is UTF-8 without insignificant whitespace.
+Only integer JSON number literals whose magnitude is at most `9007199254740991`
+are in this domain; `-0` canonically becomes `0`. Fractional or exponent literals
+are outside this domain, even when mathematically integral. Companion documents
+use this domain before schema checking; they retain their original bytes regardless.
+
+Core permits other JSON numbers in optional extensions. The checker reads Pack
+numbers as raw literals and validates numeric values with exact decimal/integer
+values, without binary-float rounding or rewriting execution bytes. A Core-valid
+Pack outside `jps-canon` remains usable with its raw content reference alone. If
+its reference requests canonical identity, it refuses as
+`unsupported-canonical-identity`. Canonical identity is checked only when present.
+Pack and companion strict JSON reading share the existing `tools/dialect_verify.py`
+reader, including number-literal and nesting bounds; no Core limit or pin changes.
+
+## 3. Policy content, original provenance and sections
+
+A Policy requires `formatVersion`, `kind`, `id`, `version`, `title`,
+`managementMode`, `content`, `sections` and `sourceProvenance`.
+`managementMode` is `workspace-managed` or `externally-managed`. It declares
+publication-management intent and authenticates no publisher, approval or role.
+It is retained artifact provenance/ownership intent, not current host governance;
+changing host management or authority does not mutate historical content.
+The old `desk-managed` spelling is refused, not aliased. Importing content as a
+local draft requires explicit intent; it does not import the source's approval.
+
+`content` identifies the exact retained narrative. Each of 1–64 sections has a
+unique local `id`, readable `title`, and `anchor: {startByte, endByte, bytesDigest}`.
+The anchor is a nonempty, zero-based, half-open range of UTF-8 bytes in **that
+narrative**, with SHA-256 of the selected bytes. Both endpoints must be UTF-8
+boundaries and `0 <= startByte < endByte <= narrative length`. Anchors may overlap
+and need not partition the narrative. Their validity does not prove that all
+meaningful clauses were represented, or that stable IDs preserve meaning after a
+revision. These offsets are never original PDF/page/provider-document offsets.
+
+Each of 0–16 unique original-source records requires a local `id`,
+`source: {provider, accountId, resourceId}`, explicit `sourceRevision` and `content`.
+The provider/account/resource values are readable opaque provenance, not
+credentials or authenticated authority. `sourceRevision` is an opaque nonempty
+string or explicit null when unavailable. Original bytes remain separate from
+narrative/extraction bytes. The checker neither extracts nor interprets them.
+Sections optionally carry 0–16 unique `sourceRefs`, each exactly
+`{sourceId, location}`. `sourceId` must resolve to an original-source record;
+`location` is a readable citation such as `Clause 2`, not a verified byte offset.
+
+Newly authored content may have no sources. No executable conditions, lifecycle,
+ACLs, roles, publication states, signatures, review assertions or approval Booleans
+belong in these immutable documents. Optional structured `requirements` are also
+unsupported; even a claimed non-executable form is refused. A later form requires
+review and an explicit selector decision, without adding a second decision language.
+
+## 4. Governing adoption and scoped total coverage
+
+An adoption requires `formatVersion`, `kind`, `id`, `version`, `consumer` and
+`governingPolicies`. The consumer is one exact retained Core `0.2.0-draft` Pack.
+The checker validates its existing structural schema and resolves the elements
+below. This is no evaluation or full Core semantic-conformance claim. Graph
+consumers, graph composition, transitive closure, release envelopes, registration
+and cycle handling remain unsupported, pending their owning contracts.
+
+There are 1–16 governing-policy entries, each exactly `{policy, scope, coverage}`.
+One stable Policy identity can occur only once; two versions of the same identity
+in one adoption refuse rather than imply precedence. List order never establishes
+policy priority. Each Policy reference resolves its exact bytes, ID/version,
+optional canonical identity, selector, closed grammar, sources and sections.
+
+Scope is either `{kind: "whole-policy"}` or
+`{kind: "sections", sectionIds, reviewBasis}`. A section list is nonempty, unique,
+at most 64 IDs and resolves only declared sections. The limited scope's retained
+`reviewBasis` describes that intentional interpretation. Whole scope selects all
+declared sections; it does not prove that the author declared every applicable
+clause or every applicable policy.
+
+Coverage contains **exactly one** record per selected section, at most 64 records,
+with no duplicate section identities, omissions, unknown IDs or outside-scope
+records. The five closed forms are:
+
+| Status | Required members in addition to `sectionId` and `status` |
+| --- | --- |
+| `implemented` | Nonempty `consumerElements` (at most 64) and retained `reviewBasis` |
+| `manual` | Readable `handoff` naming a responsible process |
+| `awaiting-interpretation` | Readable `explanation` of unresolved meaning |
+| `awaiting-implementation` | Readable `explanation` of missing implementation |
+| `out-of-scope` | Readable `rationale` for this selected clause's exclusion |
+
+A clause excluded from limited scope has no coverage record; a selected clause
+marked `out-of-scope` has the explicit rationale above. Partial automation is
+valid and never asserts complete automation or permission to run. Both kinds of
+`reviewBasis` are retained explanatory bytes, not proof of a reviewer's identity,
+whole-policy approval or authorized sign-off. Manual handoff text grants no role.
+
+The typed `consumerElements` forms are exactly:
+
+| Reference | Actual Core target |
+| --- | --- |
+| `{kind: "rule", id}` | A declared `rules[]` entry with that ID |
+| `{kind: "exception", id}` | A declared `exceptions[]` entry with that ID |
+| `{kind: "applicability"}` | The present `applicability` condition |
+| `{kind: "fallback"}` | The present `fallbackOutcome`, resolving to a declared outcome |
+
+Singletons have no fabricated ID. Kind/ID confusion, absent/unknown targets and
+repeated references within one coverage record refuse. Rule and exception IDs
+occupy separate namespaces. The checker also requires unique rule, exception and
+outcome IDs, resolves fallback, and resolves each exception's optional target-rule
+and outcome references. It does not implement all Core semantic checks or prove
+that a condition correctly interprets a clause. Outcomes, evidence requirements,
+condition subelements and escalation are unsupported coverage kinds.
+
+Optional `informationalSources` is at most 16 unique content references. These
+bytes remain citations; they never create governing dependencies, review
+assertions, authority or permissions. The checker cannot upgrade one into an
+adoption, infer natural-language consistency or decide applicability.
+
+## 5. Resource limits and refusal classifications
+
+These are candidate offline-reader bounds, not changes to Core or adopted limits.
+All maxima are inclusive. Strings are counted after decoding in Unicode
+characters unless the table specifies bytes. The closed schemas state all field
+maxima; the capability record exposes them for discovery.
+
+| Resource | Maximum |
+| --- | --- |
+| Any parsed companion/Pack/carrier JSON document | 262,144 exact bytes |
+| JSON nesting, each object/array one level from zero | 32 |
+| JSON number literal | 128 characters; exponent magnitude 308 |
+| Narrative, interpretation/review basis, informational material | 1,048,576 bytes each |
+| Original source material, one carrier registration | 4,194,304 bytes each |
+| Distinct retained material across one supplied carrier | 16,777,216 bytes |
+| Ordered registrations in the local fixture/vector input carrier | 16 |
+| Artifact version | 256 ASCII characters |
+
+An artifact is also subject to the parsed-document byte limit, even though its
+content reference has the general material maximum. Each role is checked
+independently. Unsupported original size refuses the whole supplied input;
+truncating it, silently dropping it, or substituting narrative extraction is not
+a complete input. Registration exceeding a bound changes no material state.
+
+The reader returns exactly one of these bounded JSON objects (object member order
+is irrelevant; no optional messages, paths, content, titles or provider identifiers):
+
+```json
+{"status":"valid","formatVersion":"1.0.0","maturity":"proposed-draft"}
+{"status":"refused","code":"invalid-selector"}
+```
+
+`valid` means supplied-document and reference agreement under this **proposed**
+candidate only. A refusal reports no partial coverage or permission. CLI success
+exits 0 and refusal exits 1. Environment/setup failures are not document results;
+operators must not treat an inability to run as success.
+
+| Code | Meaning |
+| --- | --- |
+| `input-over-bound` | Physical bytes/nesting/number limits, schema maxima, role sizes, registration count or aggregate bytes exceeded |
+| `invalid-json` | Strict UTF-8 JSON failed: duplicate keys, BOM, nonfinite numbers, unpaired surrogates, multiple values, malformed syntax |
+| `invalid-selector` | Root is not an object; selector missing, wrong type, not strict ASCII `x.y.z`, or over 256 characters |
+| `unsupported-format` | Selector is well-formed within that bound but is not exactly `1.0.0`; no shared-major inference |
+| `invalid-document` | Supported companion fails canonical numeric domain or closed schema; wrong kind, malformed artifact version or unsupported members |
+| `missing-material` | A referenced digest, required fixture document or retained local file is absent/unavailable |
+| `reference-mismatch` | Raw bytes/hash/length/registered media type, ID/version, or a supported requested canonical digest differs |
+| `invalid-anchor` | Narrative UTF-8, section-ID uniqueness, byte range/boundary/hash or source reference fails |
+| `invalid-coverage` | Semantic scope, total coverage, policy uniqueness or typed consumer reference fails |
+| `invalid-consumer` | Retained Pack fails existing Core schema or the specific ID/fallback/exception checks in §4 |
+| `unsupported-canonical-identity` | Requested `jps-canon` identity is outside that existing profile's domain |
+| `invalid-carrier` | Synthetic fixture/vector carrier has invalid closed shape or local path usage |
+
+Bounds on physical document bytes, nesting and number literals are checked before
+JSON syntax, including on malformed bytes. Then strict JSON is parsed. Exact
+format dispatch occurs before canonical-domain and schema interpretation:
+`{"formatVersion":"7.0.0","n":1.5}` is `unsupported-format`. Selector lexical
+failures, including the selector's own 256-character limit, are
+`invalid-selector`; other schema maxima are `input-over-bound`. Unsupported kinds
+under supported format are `invalid-document`. Other-field bounds or validity do
+not cause reinterpretation under an unknown format.
+
+For the portable vector input, parse, select and canonical-domain-check the root
+before checking the registration count and registering material in listed order.
+Local carrier sources are acquired only after root dispatch and the count check,
+one source immediately before its registration. An earlier refusal prevents later
+source acquisition. NUL paths and path-normalization failures are `invalid-carrier`.
+Then check the root's schema and semantics as implemented in `verify.py`:
+Policy narrative, sources, sections in declaration order; adoption consumer then
+Policies in declaration order, each reference before its Policy/coverage, then
+informational sources. Canonical-domain conversion occurs immediately after root
+selection; all schema maxima found at one schema check take priority over other
+schema failures. Otherwise a closed-schema failure is `invalid-document` (or
+`invalid-consumer` for Core), including structurally identical duplicates rejected
+by `uniqueItems`. Semantic duplicate coverage/IDs with distinct records uses the
+specific code above. On compound defects the first failing phase wins. Refusals
+never render an input-derived diagnostic or exception string.
+
+## 6. Discovery, examples and independent porting
+
+[capabilities.json](capabilities.json), also returned by
+`verify.py --capabilities`, lists exact candidate selectors, `proposed-draft`
+maturity, kinds, supported Core release, features, bounds and explicit exclusions.
+Capability discovery is an implementation statement, not adoption, trusted review
+or a permission grant. Unsupported format and optional canonical identity are
+separate capabilities; no parser tries an older grammar automatically.
+
+The examples are synthetic retained-byte bundles, derived from 0.0.2 with **source,
+narrative, interpretation and consumer files preserved byte-for-byte**. Policy and
+adoption identities/bytes are explicitly regenerated. The original consumer URI
+is opaque and intentionally retained, even where its spelling mentions prototype.
+
+| Domain | Coverage |
+| --- | --- |
+| [Data access](examples/data-access/fixture.json) | Whole policy; rules, fallback, manual requests and pending audit implementation |
+| [Procurement](examples/procurement/fixture.json) | Externally managed; applicability-only scope, limited sections, unresolved meaning, explicit exclusion |
+| [Refunds](examples/refunds/fixture.json) | Whole policy; rules, exception-only routing, manual inspection, pending implementation |
+
+[fixture.schema.json](fixture.schema.json) describes a local synthetic carrier,
+not a portable release envelope or proof that a dependency closure is complete.
+Its files must resolve in the same directory; no network acquisition occurs.
+The separate [vector carrier specification](vectors/README.md) defines static
+input bytes and expected results for reuse by Go or other implementations.
+Only a two-integer byte-repeat generator compresses boundary payloads; there is
+no mutation language, implicit migration or dependency on Python transformations.
+The current vectors measure agreement by this author's code and reuse its existing
+canonicalizer; they supply no independent authorship or cross-vendor evidence.
+
+Using the repository's pinned `requirements-dev.txt` dependencies on Python 3.12:
+
+```sh
+python rfcs/policy-companion-contract/verify.py --capabilities
+python rfcs/policy-companion-contract/verify.py rfcs/policy-companion-contract/examples/refunds
+python rfcs/policy-companion-contract/check_vectors.py
+python -m unittest discover -s rfcs/policy-companion-contract -p 'test_*.py' -v
+```
+
+The repository workflow runs the candidate separately from the frozen prototype
+and existing Core/Dialect checks. Passing these checks creates no adopted corpus.
+
+## 7. Remaining decisions and host boundary
+
+Review/publication transactions, authentication, review-assertion trust, signatures,
+source observations and synchronization, current eligibility, run/action admission,
+Graph closure and independent implementation evidence remain outside this
+candidate. Review assertions cannot be inferred from explanatory bytes or model
+test output. No citation, content match, imported history or historical approval
+silently becomes local authority or permission. Host publication and admission
+require their own adopted contracts and current authenticated decisions.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/capabilities.json b/internal/policy/official/rfcs/policy-companion-contract/capabilities.json
new file mode 100644
index 00000000..313b4550
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/capabilities.json
@@ -0,0 +1,74 @@
+{
+ "capability": "jps-policy-companion-offline",
+ "maturity": "proposed-draft",
+ "formatVersions": [
+ "1.0.0"
+ ],
+ "consumerSpecVersions": [
+ "0.2.0-draft"
+ ],
+ "kinds": [
+ "policy",
+ "governing-adoption"
+ ],
+ "features": [
+ "exact-byte-sha256",
+ "utf8-section-anchors",
+ "scoped-total-coverage",
+ "typed-core-pack-references",
+ "optional-jps-canon-identity",
+ "multiple-media-types"
+ ],
+ "limits": {
+ "documentBytes": 262144,
+ "documentDepth": 32,
+ "numberLiteralCharacters": 128,
+ "exponentMagnitude": 308,
+ "materialBytes": 1048576,
+ "originalBytes": 4194304,
+ "distinctRetainedBytes": 16777216,
+ "materialRegistrations": 16,
+ "versionCharacters": 256,
+ "sections": 64,
+ "sources": 16,
+ "governingPolicies": 16,
+ "consumerElementsPerSection": 64,
+ "textCharacters": 4096,
+ "uriCharacters": 2048,
+ "localIdCharacters": 128,
+ "mediaTypeCharacters": 128,
+ "sourceRefsPerSection": 16,
+ "scopeSectionIds": 64,
+ "coverageRecordsPerPolicy": 64,
+ "informationalSources": 16,
+ "canonicalIntegerMagnitude": 9007199254740991
+ },
+ "excludes": [
+ "adopted-or-stable-format",
+ "graph-consumers",
+ "evaluation",
+ "full-core-semantics",
+ "signatures",
+ "review-assertion-trust",
+ "live-authority",
+ "permissions",
+ "currency",
+ "source-fetch",
+ "automatic-migration",
+ "independent-interoperability-evidence"
+ ],
+ "refusalCodes": [
+ "input-over-bound",
+ "invalid-json",
+ "invalid-selector",
+ "unsupported-format",
+ "invalid-document",
+ "missing-material",
+ "reference-mismatch",
+ "invalid-anchor",
+ "invalid-coverage",
+ "invalid-consumer",
+ "unsupported-canonical-identity",
+ "invalid-carrier"
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/check_vectors.py b/internal/policy/official/rfcs/policy-companion-contract/check_vectors.py
new file mode 100644
index 00000000..8d9d888c
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/check_vectors.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+"""Run the static proposed-draft agreement vectors; not a JPS conformance claim."""
+
+import argparse
+import json
+from pathlib import Path
+
+import verify as v
+
+
+def source_bytes(source, root):
+ if "repeatByte" in source:
+ return bytes([source["repeatByte"]]) * source["byteLength"]
+ path = v.local_path(root, source["path"], allow_nested=True)
+ # Vectors deliberately include one byte over the registration bound.
+ return v.read_local(path, v.MAX_ORIGINAL_BYTES + 1)
+
+
+def case_result(case):
+ try:
+ raw = source_bytes(case["document"], v.HERE)
+ except v.ContractError as error:
+ return {"status": "refused", "code": error.code}
+ registrations = [(item["content"], item["source"]) for item in case["materials"]]
+ return v.verify_input(raw, registrations, load_material=lambda source: source_bytes(source, v.HERE))
+
+
+def run_vectors(manifest_path=None):
+ manifest_path = Path(manifest_path) if manifest_path else v.HERE / "vectors/manifest.json"
+ manifest = v.read_json(v.read_local(manifest_path, v.MAX_DOCUMENT_BYTES))
+ v.check_schema("vectors", manifest)
+ ids, answers = set(), []
+ for case in manifest["cases"]:
+ v.require(case["id"] not in ids, "invalid-carrier")
+ ids.add(case["id"])
+ actual = case_result(case)
+ answers.append((case["id"], actual, case["expected"]))
+ return answers
+
+
+def main(argv=None):
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("manifest", type=Path, nargs="?")
+ args = parser.parse_args(argv)
+ try:
+ answers = run_vectors(args.manifest)
+ failed = [name for name, actual, expected in answers if actual != expected]
+ answer = {"status": "mismatch" if failed else "matched", "cases": len(answers), "maturity": "proposed-draft"}
+ if failed:
+ answer["caseIds"] = failed
+ except v.ContractError as error:
+ answer = {"status": "refused", "code": error.code}
+ print(json.dumps(answer, separators=(",", ":")))
+ return 0 if answer["status"] == "matched" else 1
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/internal/policy/official/rfcs/policy-companion-contract/common.schema.json b/internal/policy/official/rfcs/policy-companion-contract/common.schema.json
new file mode 100644
index 00000000..581bb42a
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/common.schema.json
@@ -0,0 +1,187 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:proposal:policy-companion:1.0.0:common",
+ "title": "PROPOSED DRAFT Policy companion 1.0.0: common",
+ "description": "Proposed draft shared definitions. jps-canon refers to the existing spec/dialect.md canonical profile; this candidate does not adopt or change it.",
+ "$ref": "#/$defs/retainedContent",
+ "$defs": {
+ "version": {
+ "type": "string",
+ "minLength": 5,
+ "maxLength": 256,
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?![\\s\\S])"
+ },
+ "text": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 4096
+ },
+ "localId": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?![\\s\\S])"
+ },
+ "uri": {
+ "type": "string",
+ "format": "uri",
+ "minLength": 1,
+ "maxLength": 2048,
+ "description": "Scheme-bearing RFC 3986 URI production, including optional fragment. Assert the entire ASCII string; no trimming, Unicode/percent decoding, or identity normalization. See candidate prose for IPv6 and case-insensitive IPvFuture checks."
+ },
+ "content": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1048576
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Narrative, review basis, artifact and informational material: at most 1 MiB."
+ },
+ "canonicalIdentity": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "profile",
+ "canonicalDigest"
+ ],
+ "properties": {
+ "profile": {
+ "const": "jps-canon"
+ },
+ "canonicalDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ }
+ }
+ },
+ "anchor": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "startByte",
+ "endByte",
+ "bytesDigest"
+ ],
+ "properties": {
+ "startByte": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1048576
+ },
+ "endByte": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 1048576
+ },
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ }
+ }
+ },
+ "policyReference": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id",
+ "version",
+ "content"
+ ],
+ "properties": {
+ "kind": {
+ "const": "policy"
+ },
+ "id": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/version"
+ },
+ "content": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/content"
+ },
+ "canonicalIdentity": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/canonicalIdentity"
+ }
+ }
+ },
+ "packReference": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id",
+ "version",
+ "content"
+ ],
+ "properties": {
+ "kind": {
+ "const": "pack"
+ },
+ "id": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/version"
+ },
+ "content": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/content"
+ },
+ "canonicalIdentity": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/canonicalIdentity"
+ }
+ }
+ },
+ "retainedContent": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194304
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Generic fixture-carrier reference; consuming roles impose their own bounds."
+ },
+ "originalContent": {
+ "description": "Exact retained original source bytes: at most 4 MiB; never a replacement for narrative.",
+ "$ref": "#/$defs/retainedContent"
+ },
+ "formatVersion": {
+ "const": "1.0.0"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/adoption.json b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/adoption.json
new file mode 100644
index 00000000..e6e67e2c
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/adoption.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/consumer-pack.json b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/consumer-pack.json
new file mode 100644
index 00000000..a292cbe5
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/consumer-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/fixture.json b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/fixture.json
new file mode 100644
index 00000000..4d9d3a3f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/fixture.json
@@ -0,0 +1,58 @@
+{
+ "fixtureVersion": "1",
+ "synthetic": true,
+ "scenario": "data-access",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:98294b5df0876cc793f236fa5184380aa37f2e459e1f630a5e613237404c2ec0",
+ "byteLength": 2352,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/interpretation.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/interpretation.txt
new file mode 100644
index 00000000..4aa6c667
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/interpretation.txt
@@ -0,0 +1,4 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the automated eligibility clause.
+The fallbackOutcome routes an unmatched classification to review; unknown facts escalate.
+Other coverage is stated explicitly.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/narrative.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/narrative.txt
new file mode 100644
index 00000000..bd5e6867
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/narrative.txt
@@ -0,0 +1,10 @@
+SYNTHETIC RFC PROTOTYPE — Data access
+
+Automated release
+Only de-identified datasets may be released through this automated path. Identifiable datasets are refused; missing classification goes to a data steward.
+
+Restricted requests
+A data steward reviews restricted requests through the manual access process. This pack cannot grant an exception.
+
+Quarterly audit
+Review the access log quarterly. A separate audit implementation is still needed.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/policy.json b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/policy.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/policy.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/source.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/source.txt
new file mode 100644
index 00000000..794f4622
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/data-access/source.txt
@@ -0,0 +1,5 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: Only de-identified datasets may be released through this automated path. Identifiable datasets are refused; missing classification goes to a data steward.
+Clause 2: A data steward reviews restricted requests through the manual access process. This pack cannot grant an exception.
+Clause 3: Review the access log quarterly. A separate audit implementation is still needed.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/adoption.json b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/adoption.json
new file mode 100644
index 00000000..9c55f540
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/adoption.json
@@ -0,0 +1,97 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/procurement/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:205a2afdc68ebd46d5b022256fadec6bd071bc8e34faff481f288c20df008f60"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:f0ef6fe0bb4703eaf6b2c1edf2f12712dffc139e887317c46fc82d83dba71275"
+ }
+ },
+ "scope": {
+ "kind": "sections",
+ "sectionIds": [
+ "eligibility",
+ "conflict-review",
+ "invoice-payment",
+ "purchase-scope"
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "conflict-review",
+ "status": "awaiting-interpretation",
+ "explanation": "Synthetic open work item: agree the conflict threshold before implementation."
+ },
+ {
+ "sectionId": "invoice-payment",
+ "status": "out-of-scope",
+ "rationale": "This pack assesses eligibility only; treasury payment reconciliation is a separate process."
+ },
+ {
+ "sectionId": "purchase-scope",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "applicability"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/consumer-pack.json b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/consumer-pack.json
new file mode 100644
index 00000000..0745b386
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/consumer-pack.json
@@ -0,0 +1,68 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "title": "Procurement — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/procurement/competitiveProcedureDocumented",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/procurement/competitiveProcedureDocumented",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "applicability": {
+ "op": "fact",
+ "path": "/request/kind",
+ "operator": "equals",
+ "value": "purchase"
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/fixture.json b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/fixture.json
new file mode 100644
index 00000000..2bb9dd50
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/fixture.json
@@ -0,0 +1,58 @@
+{
+ "fixtureVersion": "1",
+ "synthetic": true,
+ "scenario": "procurement",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:e9c871b2e7dc7448e46b2d4d347beb504bbe0a691be11df4283a95a693208703",
+ "byteLength": 3055,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/interpretation.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/interpretation.txt
new file mode 100644
index 00000000..cc2bd1f5
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/interpretation.txt
@@ -0,0 +1,5 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the competitive-procedure clause.
+The applicability condition alone implements purchase scope; it is not a rule ID.
+Missing facts need review. Other coverage is stated explicitly.
+The selected scope includes eligibility, conflict review, invoice payment and purchase scope; public notice is excluded.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/narrative.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/narrative.txt
new file mode 100644
index 00000000..646937a8
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/narrative.txt
@@ -0,0 +1,16 @@
+SYNTHETIC RFC PROTOTYPE — Procurement
+
+Competitive procedure
+Automated eligibility requires a documented competitive procedure. A missing record requires a procurement reviewer.
+
+Supplier conflicts
+Supplier relationships require a conflict review. The threshold for a material relationship needs clarification.
+
+Invoice payment
+Treasury performs payment reconciliation outside this eligibility interpretation.
+
+Public notice
+Publish the award notice through the separate communications process.
+
+Purchase scope
+This eligibility pack applies only to purchase requests; other requests remain outside this automated path.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/policy.json b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/policy.json
new file mode 100644
index 00000000..00b19b27
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/policy.json
@@ -0,0 +1,106 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "title": "Procurement — synthetic policy content",
+ "managementMode": "externally-managed",
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Competitive procedure",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 181,
+ "bytesDigest": "sha256:a8d58fa560d792bbc0848b517b47a04d01fa928a4315de4be423d9756745714f"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "conflict-review",
+ "title": "Supplier conflicts",
+ "anchor": {
+ "startByte": 181,
+ "endByte": 314,
+ "bytesDigest": "sha256:ed53cc9edccb33c00c4692bcc84593e249117f9dbc4045d57e5e8f85458c7c94"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "invoice-payment",
+ "title": "Invoice payment",
+ "anchor": {
+ "startByte": 314,
+ "endByte": 413,
+ "bytesDigest": "sha256:f6803f2ffa7356a3aad889d20987a00614d8145193c521107845092745db9d1d"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ },
+ {
+ "id": "public-notice",
+ "title": "Public notice",
+ "anchor": {
+ "startByte": 413,
+ "endByte": 497,
+ "bytesDigest": "sha256:b6d68243578efb748244d55bcfe5f7bb730faa1c939c6a910f4e6e26b79b34f9"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 4"
+ }
+ ]
+ },
+ {
+ "id": "purchase-scope",
+ "title": "Purchase scope",
+ "anchor": {
+ "startByte": 498,
+ "endByte": 621,
+ "bytesDigest": "sha256:13498f448247cfd988d4d59046ae766abb0559cf902093cdf8f650543f37ed26"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 5"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "procurement-original"
+ },
+ "sourceRevision": "fictional-revision-a",
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/source.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/source.txt
new file mode 100644
index 00000000..c5913acb
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/procurement/source.txt
@@ -0,0 +1,7 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: Automated eligibility requires a documented competitive procedure. A missing record requires a procurement reviewer.
+Clause 2: Supplier relationships require a conflict review. The threshold for a material relationship needs clarification.
+Clause 3: Treasury performs payment reconciliation outside this eligibility interpretation.
+Clause 4: Publish the award notice through the separate communications process.
+Clause 5: This eligibility pack applies only to purchase requests; other requests remain outside this automated path.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/adoption.json b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/adoption.json
new file mode 100644
index 00000000..6af1ea97
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/adoption.json
@@ -0,0 +1,87 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/refunds/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20723faedbed6ee066dd3330e4b72848702e92dfbeb68b757f6ed0a95e4a2c5"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/refunds/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:e287b7208c0e870d1ee04188bc57f614096210f740d0f95fbf11d1324dc93704"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "damaged-goods",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "fraud-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ },
+ {
+ "sectionId": "damaged-routing",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "exception",
+ "id": "damaged-routing"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/consumer-pack.json b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/consumer-pack.json
new file mode 100644
index 00000000..07323779
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/consumer-pack.json
@@ -0,0 +1,76 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/pack",
+ "version": "1.0.0",
+ "title": "Refunds — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/withinReturnWindow",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/withinReturnWindow",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "exceptions": [
+ {
+ "id": "damaged-routing",
+ "description": "Route damaged goods to review; this does not perform the manual inspection.",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/damaged",
+ "operator": "equals",
+ "value": true
+ },
+ "effect": "escalate",
+ "onUnknown": "escalate"
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/fixture.json b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/fixture.json
new file mode 100644
index 00000000..e1a86a90
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/fixture.json
@@ -0,0 +1,58 @@
+{
+ "fixtureVersion": "1",
+ "synthetic": true,
+ "scenario": "refunds",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:7c7cd121fc4510fff19b8bcaf120ce1a9cb3f7e60b8e811ce9be917799367bc8",
+ "byteLength": 2729,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/interpretation.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/interpretation.txt
new file mode 100644
index 00000000..61258de1
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/interpretation.txt
@@ -0,0 +1,4 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the return-window clause.
+The damaged-routing exception alone routes damaged goods to a specialist; physical inspection remains manual.
+Missing facts need review. Other coverage is stated explicitly.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/narrative.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/narrative.txt
new file mode 100644
index 00000000..1cf4b905
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/narrative.txt
@@ -0,0 +1,13 @@
+SYNTHETIC RFC PROTOTYPE — Refunds
+
+Return window
+The automated path accepts only purchases within the published return window. Missing purchase dates require a returns specialist.
+
+Damaged goods
+A returns specialist handles damaged goods through the manual inspection process.
+
+Fraud review
+Potential repeated-claim abuse needs a separate reviewed implementation.
+
+Damaged goods routing
+Damaged goods bypass automated eligibility and go to a returns specialist for manual inspection.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/policy.json b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/policy.json
new file mode 100644
index 00000000..b3531a29
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/policy.json
@@ -0,0 +1,91 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/refunds/policy",
+ "version": "1.0.0",
+ "title": "Refunds — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Return window",
+ "anchor": {
+ "startByte": 37,
+ "endByte": 183,
+ "bytesDigest": "sha256:838ea4e242523a398e18a4006aa1488cc2032eb23f503f2c2dc2539339cc757a"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "damaged-goods",
+ "title": "Damaged goods",
+ "anchor": {
+ "startByte": 183,
+ "endByte": 280,
+ "bytesDigest": "sha256:ac0263d8b10debc2e8fb9090bb1b55c80a5766a4d192f23f0f640062ba5c82d4"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "fraud-review",
+ "title": "Fraud review",
+ "anchor": {
+ "startByte": 280,
+ "endByte": 366,
+ "bytesDigest": "sha256:9117339f1340e981a232894965d79f3f2a9f8116ffc347142c7dc7d9bc2631c3"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ },
+ {
+ "id": "damaged-routing",
+ "title": "Damaged goods routing",
+ "anchor": {
+ "startByte": 367,
+ "endByte": 486,
+ "bytesDigest": "sha256:a47d45dfa15bb16514328ff9e1de346be10d045a194597e6c44e1f598ab17ab1"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 4"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "refunds-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/source.txt b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/source.txt
new file mode 100644
index 00000000..614029ef
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/examples/refunds/source.txt
@@ -0,0 +1,6 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: The automated path accepts only purchases within the published return window. Missing purchase dates require a returns specialist.
+Clause 2: A returns specialist handles damaged goods through the manual inspection process.
+Clause 3: Potential repeated-claim abuse needs a separate reviewed implementation.
+Clause 4: Damaged goods bypass automated eligibility and go to a returns specialist for manual inspection.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/fixture.schema.json b/internal/policy/official/rfcs/policy-companion-contract/fixture.schema.json
new file mode 100644
index 00000000..3d2ec3c7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/fixture.schema.json
@@ -0,0 +1,67 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:proposal:policy-companion:1.0.0:fixture",
+ "title": "Local synthetic candidate fixture carrier; not a release envelope",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "fixtureVersion",
+ "synthetic",
+ "scenario",
+ "materials",
+ "policy",
+ "consumer",
+ "adoption"
+ ],
+ "properties": {
+ "fixtureVersion": {
+ "const": "1"
+ },
+ "synthetic": {
+ "const": true
+ },
+ "scenario": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "materials": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 16,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path",
+ "content"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "content": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/retainedContent"
+ }
+ }
+ }
+ },
+ "policy": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "consumer": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ },
+ "adoption": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/governing-adoption.schema.json b/internal/policy/official/rfcs/policy-companion-contract/governing-adoption.schema.json
new file mode 100644
index 00000000..3b8a5204
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/governing-adoption.schema.json
@@ -0,0 +1,265 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:proposal:policy-companion:1.0.0:governing-adoption",
+ "title": "PROPOSED DRAFT Policy companion 1.0.0: governing-adoption",
+ "description": "Immutable interpretation/coverage proposal for one exact pack. No authorization, registration, release envelope, graph support or live eligibility.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "formatVersion",
+ "kind",
+ "id",
+ "version",
+ "consumer",
+ "governingPolicies"
+ ],
+ "properties": {
+ "formatVersion": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/formatVersion"
+ },
+ "kind": {
+ "const": "governing-adoption"
+ },
+ "id": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/version"
+ },
+ "consumer": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/packReference"
+ },
+ "governingPolicies": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "policy",
+ "scope",
+ "coverage"
+ ],
+ "properties": {
+ "policy": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/policyReference"
+ },
+ "scope": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind"
+ ],
+ "properties": {
+ "kind": {
+ "const": "whole-policy"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "sectionIds",
+ "reviewBasis"
+ ],
+ "properties": {
+ "kind": {
+ "const": "sections"
+ },
+ "sectionIds": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ }
+ },
+ "reviewBasis": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/content"
+ }
+ }
+ }
+ ]
+ },
+ "coverage": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "consumerElements",
+ "reviewBasis"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "status": {
+ "const": "implemented"
+ },
+ "consumerElements": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "#/$defs/consumerElement"
+ }
+ },
+ "reviewBasis": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/content"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "handoff"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "status": {
+ "const": "manual"
+ },
+ "handoff": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "explanation"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "status": {
+ "const": "awaiting-interpretation"
+ },
+ "explanation": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "explanation"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "status": {
+ "const": "awaiting-implementation"
+ },
+ "explanation": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "rationale"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "status": {
+ "const": "out-of-scope"
+ },
+ "rationale": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "informationalSources": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/content"
+ }
+ }
+ },
+ "$defs": {
+ "consumerElement": {
+ "description": "Exact declared Core rule/exception by ID, or the present applicability/fallbackOutcome singleton without a fabricated ID. Other element kinds are unsupported.",
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id"
+ ],
+ "properties": {
+ "kind": {
+ "enum": [
+ "rule",
+ "exception"
+ ]
+ },
+ "id": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind"
+ ],
+ "properties": {
+ "kind": {
+ "enum": [
+ "applicability",
+ "fallback"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/policy.schema.json b/internal/policy/official/rfcs/policy-companion-contract/policy.schema.json
new file mode 100644
index 00000000..c89c6477
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/policy.schema.json
@@ -0,0 +1,147 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:proposal:policy-companion:1.0.0:policy",
+ "title": "PROPOSED DRAFT Policy companion 1.0.0: policy",
+ "description": "Immutable content/provenance proposal only. managementMode declares intended publication ownership; no imported approval, lifecycle, ACL or rule semantics. Optional readable structured requirements are deferred; a requirements member is unsupported.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "formatVersion",
+ "kind",
+ "id",
+ "version",
+ "title",
+ "managementMode",
+ "content",
+ "sections",
+ "sourceProvenance"
+ ],
+ "properties": {
+ "formatVersion": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/formatVersion"
+ },
+ "kind": {
+ "const": "policy"
+ },
+ "id": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/version"
+ },
+ "title": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ },
+ "managementMode": {
+ "enum": [
+ "workspace-managed",
+ "externally-managed"
+ ]
+ },
+ "content": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/content"
+ },
+ "sections": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "title",
+ "anchor"
+ ],
+ "properties": {
+ "id": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "title": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ },
+ "anchor": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/anchor"
+ },
+ "sourceRefs": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sourceId",
+ "location"
+ ],
+ "properties": {
+ "sourceId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "location": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "sourceProvenance": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "source",
+ "sourceRevision",
+ "content"
+ ],
+ "properties": {
+ "id": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/localId"
+ },
+ "source": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "provider",
+ "accountId",
+ "resourceId"
+ ],
+ "properties": {
+ "provider": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ },
+ "accountId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ },
+ "resourceId": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ }
+ }
+ },
+ "sourceRevision": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/text"
+ }
+ ]
+ },
+ "content": {
+ "$ref": "urn:jps:proposal:policy-companion:1.0.0:common#/$defs/originalContent"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/prototype-0.0.2-pin.json b/internal/policy/official/rfcs/policy-companion-contract/prototype-0.0.2-pin.json
new file mode 100644
index 00000000..24a7b0e9
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/prototype-0.0.2-pin.json
@@ -0,0 +1,33 @@
+{
+ "commit": "8a56a95d555c17640d2db4984363b779536b3c2a",
+ "proposalVersion": "0.0.2",
+ "files": {
+ "README.md": "sha256:031cc9fa743c7d3af5cc482a514cfba106d510e16364febe0e58ce8bf9830e16",
+ "common.schema.json": "sha256:97d25d9c7778c68bdd94506227a0061923a5ef5fc9bc5f0a101f1ac2449d0d33",
+ "examples/data-access/adoption.json": "sha256:f6cf887488c12b0ba5331a048f5a9661a557021f5abfc5662a95524915ec1529",
+ "examples/data-access/consumer-pack.json": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "examples/data-access/fixture.json": "sha256:575edeed43ceb0b72a3a204caacbc51ba10e52075b7cbeea134b02876e550ec8",
+ "examples/data-access/interpretation.txt": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "examples/data-access/narrative.txt": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "examples/data-access/policy.json": "sha256:75a7659ed5086c7728af95db0b56b15fdc914a51982b16627fc884cfc9dca50d",
+ "examples/data-access/source.txt": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "examples/procurement/adoption.json": "sha256:b5b94a06dba7d12748fe3f854bdb5e5da9c14736aeff8d7416e94946891fd063",
+ "examples/procurement/consumer-pack.json": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "examples/procurement/fixture.json": "sha256:241d3fd3f06c0cc0572d5237bcbbae9c88bd688fdfe7b41809bd90497ebfbf4b",
+ "examples/procurement/interpretation.txt": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "examples/procurement/narrative.txt": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "examples/procurement/policy.json": "sha256:e9bbe247d5aa7537aef08c951b88c0881e381046e357abaa05ea255e208ee852",
+ "examples/procurement/source.txt": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "examples/refunds/adoption.json": "sha256:fd474eed584ae6305ea535bf1d044734f8d754fcc907b0d28b65a318b5ea4b5d",
+ "examples/refunds/consumer-pack.json": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "examples/refunds/fixture.json": "sha256:2029192a538db356e9beb137e35377d00db61dda52cb7ba622d3d5e4343b6f22",
+ "examples/refunds/interpretation.txt": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "examples/refunds/narrative.txt": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "examples/refunds/policy.json": "sha256:5391763b2d9a72533e7566cce910a43cb5ab740dd0587d7383f3adf153ba9970",
+ "examples/refunds/source.txt": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "governing-adoption.schema.json": "sha256:4108f3ac476b989483affbf0ddfa2e933f7be5c579c472f7b7b3aa976299f779",
+ "policy.schema.json": "sha256:d653ce7e855dce678aeadebac18de2afbc5bdcb23412fcf52f3d30b5be3d4dbd",
+ "test_prototype.py": "sha256:bdb05fe954cb75ddc859e58e81ed29c22e7181fb224068dcc55dfb59106858ef",
+ "verify.py": "sha256:ad6774c7eed831e1a586b9a313c33cb35b471db5cb41ee2212f1643135e27ea0"
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/test_contract.py b/internal/policy/official/rfcs/policy-companion-contract/test_contract.py
new file mode 100644
index 00000000..78e8747c
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/test_contract.py
@@ -0,0 +1,203 @@
+"""Focused proposed-draft agreement/carrier checks, outside the adopted corpus."""
+
+import copy
+import json
+import subprocess
+import sys
+import unittest
+from pathlib import Path
+from tempfile import TemporaryDirectory
+
+from jsonschema import FormatChecker
+
+import check_vectors
+import verify as v
+
+
+class ContractTests(unittest.TestCase):
+ def test_static_manifest_exact_results(self):
+ answers = check_vectors.run_vectors()
+ self.assertEqual(len(answers), 124)
+ for name, actual, expected in answers:
+ with self.subTest(vector=name):
+ self.assertEqual(actual, expected)
+ self.assertLess(len(json.dumps(actual)), 128)
+ codes = {actual.get("code") for _, actual, _ in answers}
+ self.assertTrue(set(v.CODES) <= codes)
+
+ def test_three_domain_bundles_and_declared_coverage(self):
+ states, kinds = set(), set()
+ for directory in sorted((v.HERE / "examples").iterdir()):
+ with self.subTest(domain=directory.name):
+ self.assertEqual(v.verify_bundle(directory), v.VALID)
+ manifest, material, by_path = v.load_bundle(directory)
+ adoption = v.read_companion(by_path[manifest["adoption"]])
+ for governing in adoption["governingPolicies"]:
+ for coverage in governing["coverage"]:
+ states.add(coverage["status"])
+ kinds.update(item["kind"] for item in coverage.get("consumerElements", []))
+ self.assertEqual(states, {"implemented", "manual", "awaiting-interpretation", "awaiting-implementation", "out-of-scope"})
+ self.assertEqual(kinds, {"rule", "exception", "applicability", "fallback"})
+
+ def test_historical_prototype_is_byte_frozen(self):
+ pin = json.loads((v.HERE / "prototype-0.0.2-pin.json").read_bytes())
+ old = v.HERE.parent / "policy-companion-prototype"
+ self.assertEqual(pin["commit"], "8a56a95d555c17640d2db4984363b779536b3c2a")
+ self.assertEqual(pin["proposalVersion"], "0.0.2")
+ for name, digest in pin["files"].items():
+ with self.subTest(path=name):
+ self.assertEqual(v.spec_canon.digest_of((old / name).read_bytes()), digest)
+ actual = {str(path.relative_to(old)) for path in old.rglob("*") if path.is_file() and "__pycache__" not in str(path)}
+ self.assertEqual(actual, set(pin["files"]))
+
+ def test_source_consumer_narrative_and_review_bytes_preserved(self):
+ old = v.HERE.parent / "policy-companion-prototype/examples"
+ for directory in sorted((v.HERE / "examples").iterdir()):
+ for name in ("source.txt", "consumer-pack.json", "narrative.txt", "interpretation.txt"):
+ with self.subTest(domain=directory.name, role=name):
+ self.assertEqual((directory / name).read_bytes(), (old / directory.name / name).read_bytes())
+
+ def test_discovery_matches_retained_record_and_cli(self):
+ retained = json.loads((v.HERE / "capabilities.json").read_bytes())
+ self.assertEqual(retained, v.CAPABILITY)
+ self.assertEqual(retained["formatVersions"], ["1.0.0"])
+ self.assertEqual(retained["maturity"], "proposed-draft")
+ self.assertIn("live-authority", retained["excludes"])
+ self.assertIn("independent-interoperability-evidence", retained["excludes"])
+ completed = subprocess.run([sys.executable, str(v.HERE / "verify.py"), "--capabilities"], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 0)
+ self.assertEqual(completed.stderr, b"")
+ self.assertEqual(json.loads(completed.stdout), retained)
+
+ def test_cli_refusal_does_not_echo_retained_input_or_paths(self):
+ manifest = json.loads((v.HERE / "examples/data-access/fixture.json").read_bytes())
+ secret = b"fictional-private-title-must-not-be-echoed"
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ for entry in manifest["materials"]:
+ raw = (v.HERE / "examples/data-access" / entry["path"]).read_bytes()
+ if entry["path"] == "narrative.txt":
+ raw += secret # Intentionally stale declared exact hash/length.
+ (directory / entry["path"]).write_bytes(raw)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ completed = subprocess.run([sys.executable, str(v.HERE / "verify.py"), str(directory)], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 1)
+ self.assertEqual(completed.stdout, b'{"status":"refused","code":"reference-mismatch"}\n')
+ self.assertEqual(completed.stderr, b"")
+ self.assertNotIn(secret, completed.stdout)
+ self.assertNotIn(temporary.encode(), completed.stdout)
+
+ def test_local_fixture_carrier_refuses_paths_unknown_fields_and_missing_files(self):
+ original = json.loads((v.HERE / "examples/data-access/fixture.json").read_bytes())
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ for mutation, code in ((lambda d: d["materials"][0].update(path="../outside.txt"), "invalid-carrier"),
+ (lambda d: d.update(approved=True), "invalid-carrier"),
+ (lambda d: None, "missing-material")):
+ manifest = copy.deepcopy(original)
+ mutation(manifest)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ self.assertEqual(v.verify_bundle(directory), {"status": "refused", "code": code})
+ symlink = directory / "narrative.txt"
+ symlink.symlink_to(v.HERE / "examples/data-access/narrative.txt")
+ (directory / "fixture.json").write_text(json.dumps(original))
+ self.assertEqual(v.verify_bundle(directory), {"status": "refused", "code": "invalid-carrier"})
+
+ def test_cli_refuses_nul_material_path_with_bounded_json(self):
+ manifest = json.loads((v.HERE / "examples/data-access/fixture.json").read_bytes())
+ manifest["materials"][0]["path"] = "fictional-private\x00path.txt"
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ completed = subprocess.run([sys.executable, str(v.HERE / "verify.py"), str(directory)], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 1)
+ self.assertEqual(completed.stdout, b'{"status":"refused","code":"invalid-carrier"}\n')
+ self.assertEqual(completed.stderr, b"")
+
+ def test_vector_carrier_nul_paths_have_safe_results_and_no_cli_traceback(self):
+ expected = {"status": "refused", "code": "invalid-carrier"}
+ source = {"path": "vectors/private\x00transport.bin"}
+ case = {"id": "nul-transport", "document": {"path": "examples/data-access/policy.json"},
+ "materials": [{"source": source, "content": v.identity(b"x", "text/plain")}], "expected": expected}
+ self.assertEqual(check_vectors.case_result(case), expected)
+ root_nul = {**case, "document": source, "materials": []}
+ self.assertEqual(check_vectors.case_result(root_nul), expected)
+ manifest = {"vectorSuiteVersion": "1", "maturity": "proposed-draft", "synthetic": True, "cases": [case]}
+ with TemporaryDirectory() as temporary:
+ path = Path(temporary) / "manifest.json"
+ path.write_text(json.dumps(manifest))
+ completed = subprocess.run([sys.executable, str(v.HERE / "check_vectors.py"), str(path)], capture_output=True, check=False)
+ self.assertEqual(completed.returncode, 0)
+ self.assertEqual(completed.stdout, b'{"status":"matched","cases":1,"maturity":"proposed-draft"}\n')
+ self.assertEqual(completed.stderr, b"")
+
+ def test_failed_registration_is_atomic(self):
+ material = {}
+ first = v.identity(b"x", "text/plain")
+ v.register_material(first, b"x", material)
+ before = copy.deepcopy(material)
+ with self.assertRaises(v.ContractError) as caught:
+ v.register_material(first, b"changed", material)
+ self.assertEqual(caught.exception.code, "reference-mismatch")
+ self.assertEqual(material, before)
+ wrong_type = v.identity(b"x", "text/markdown")
+ self.assertEqual(v.result(lambda: v.resolve(wrong_type, material)), {"status": "refused", "code": "reference-mismatch"})
+
+ def test_schema_version_pattern_is_exact_without_trailing_newline_alias(self):
+ raw = (v.HERE / "examples/data-access/policy.json").read_bytes()
+ manifest, material, _ = v.load_bundle(v.HERE / "examples/data-access")
+ document = v.read_companion(raw)
+ for version in ("0.0.0", "42.7.999", "9" * 252 + ".0.0"):
+ document["version"] = version
+ v.check_schema("policy", document)
+ for version in ("1x0x0", "1.0.0\n", "01.0.0", "1.0.0+build"):
+ document["version"] = version
+ self.assertEqual(v.result(lambda: v.check_schema("policy", document)), {"status": "refused", "code": "invalid-document"})
+
+ def test_uri_matrix_covers_policy_and_consuming_core_without_global_override(self):
+ manifest, material, by_path = v.load_bundle(v.HERE / "examples/data-access")
+ base = v.read_companion(by_path[manifest["policy"]])
+ cases = json.loads((v.HERE / "vectors/manifest.json").read_bytes())["cases"]
+ count = 0
+ for case in cases:
+ if not case["id"].startswith("uri-"):
+ continue
+ count += 1
+ document = v.read_companion(check_vectors.source_bytes(case["document"], v.HERE))
+ policy = copy.deepcopy(base)
+ policy["id"] = document["consumer"]["id"] if document["kind"] == "governing-adoption" else document["id"]
+ with self.subTest(vector=case["id"], root="policy"):
+ self.assertEqual(v.result(lambda: v.check_policy(policy, material)), case["expected"])
+ if document["kind"] == "governing-adoption":
+ reference = document["consumer"]["content"]
+ entry = next(item for item in case["materials"] if item["content"] == reference)
+ pack = v.strict_json(check_vectors.source_bytes(entry["source"], v.HERE))
+ expected = v.VALID if case["expected"]["status"] == "valid" else {"status": "refused", "code": "invalid-consumer"}
+ with self.subTest(vector=case["id"], root="consuming-pack"):
+ self.assertEqual(v.result(lambda: v.check_schema("core", pack)), expected)
+ self.assertEqual(count, 21) # Twenty added cases plus the original relative-ID refusal.
+ self.assertIsNot(FormatChecker().checkers["uri"][0], v.candidate_uri)
+
+ def test_uri_adoption_vectors_preserve_every_pack_byte_except_id_token(self):
+ original = (v.HERE / "examples/data-access/consumer-pack.json").read_bytes()
+ original_id = json.dumps(json.loads(original)["id"]).encode()
+ cases = json.loads((v.HERE / "vectors/manifest.json").read_bytes())["cases"]
+ count = 0
+ for case in cases:
+ if not case["id"].startswith("uri-"):
+ continue
+ document = v.read_companion(check_vectors.source_bytes(case["document"], v.HERE))
+ if document["kind"] != "governing-adoption":
+ continue
+ count += 1
+ entry = next(item for item in case["materials"] if item["content"] == document["consumer"]["content"])
+ retained = check_vectors.source_bytes(entry["source"], v.HERE)
+ new_id = json.dumps(document["consumer"]["id"]).encode()
+ with self.subTest(vector=case["id"]):
+ self.assertEqual(retained.count(new_id), 1)
+ self.assertEqual(retained.replace(new_id, original_id, 1), original)
+ self.assertEqual(count, 7)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors.schema.json b/internal/policy/official/rfcs/policy-companion-contract/vectors.schema.json
new file mode 100644
index 00000000..932b6190
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors.schema.json
@@ -0,0 +1,203 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:proposal:policy-companion:1.0.0:vectors",
+ "title": "Proposed draft agreement-vector carrier; not a release envelope",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "vectorSuiteVersion",
+ "maturity",
+ "synthetic",
+ "cases"
+ ],
+ "properties": {
+ "vectorSuiteVersion": {
+ "const": "1"
+ },
+ "maturity": {
+ "const": "proposed-draft"
+ },
+ "synthetic": {
+ "const": true
+ },
+ "cases": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 128,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "document",
+ "materials",
+ "expected"
+ ],
+ "properties": {
+ "id": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 128,
+ "pattern": "^[a-z][a-z0-9-]*$"
+ },
+ "document": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 256
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "repeatByte",
+ "byteLength"
+ ],
+ "properties": {
+ "repeatByte": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194305
+ }
+ }
+ }
+ ]
+ },
+ "materials": {
+ "type": "array",
+ "maxItems": 17,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "source",
+ "content"
+ ],
+ "properties": {
+ "source": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "path"
+ ],
+ "properties": {
+ "path": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 256
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "repeatByte",
+ "byteLength"
+ ],
+ "properties": {
+ "repeatByte": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 255
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194305
+ }
+ }
+ }
+ ]
+ },
+ "content": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194305
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Generic fixture-carrier reference; consuming roles impose their own bounds."
+ }
+ }
+ }
+ },
+ "expected": {
+ "oneOf": [
+ {
+ "const": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "status",
+ "code"
+ ],
+ "properties": {
+ "status": {
+ "const": "refused"
+ },
+ "code": {
+ "enum": [
+ "input-over-bound",
+ "invalid-json",
+ "invalid-selector",
+ "unsupported-format",
+ "invalid-document",
+ "missing-material",
+ "reference-mismatch",
+ "invalid-anchor",
+ "invalid-coverage",
+ "invalid-consumer",
+ "unsupported-canonical-identity",
+ "invalid-carrier"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/README.md b/internal/policy/official/rfcs/policy-companion-contract/vectors/README.md
new file mode 100644
index 00000000..cc2b7d40
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/README.md
@@ -0,0 +1,101 @@
+# Reusable proposed-draft agreement vectors
+
+[manifest.json](manifest.json) supplies exact candidate inputs and exact expected
+results for independent readers to execute. This is synthetic review material,
+not an adopted JPS corpus or independent implementation evidence. No case asserts
+approval, live authority, complete organizational coverage or permission.
+
+The manifest is closed under [vectors.schema.json](../vectors.schema.json). It has
+`vectorSuiteVersion: "1"`, `maturity: "proposed-draft"`, `synthetic: true` and
+`cases`. This carrier version is local test scaffolding, distinct from the
+companion `formatVersion` and artifact `version`; it is not a release envelope.
+All paths are relative to **rfcs/policy-companion-contract/**, the candidate root,
+regardless of the manifest's location. A path must resolve inside that root,
+including after resolving symlinks; absolute paths and escaping paths refuse.
+NUL-containing paths and path-normalization failures are `invalid-carrier`.
+Do not fetch any URI in a document or reference.
+
+Each case is exactly `{id, document, materials, expected}`:
+
+- `id` is a unique readable test identifier.
+- `document` describes exact root companion bytes using the source grammar below.
+- `materials` is an **ordered** array of `{source, content}` registrations. `source`
+ yields exact retained bytes; `content` independently declares the raw digest,
+ byte length and media type. Do not repair a mismatching declaration, normalize
+ bytes, derive a new declaration, or infer an unregistered media type.
+- `expected` is the complete result object to compare with the candidate result.
+ JSON object member order is irrelevant; names, values and absence of any extra
+ members must agree. Compare both valid and refusal objects, not only exit codes.
+
+The complete closed source grammar has only two alternatives:
+
+```json
+{"path":"examples/data-access/policy.json"}
+{"repeatByte":120,"byteLength":1048576}
+```
+
+For `path`, read the file's bytes exactly; no text conversion or newline changes.
+For `repeatByte`, allocate **exactly** `byteLength` copies of the unsigned byte
+`repeatByte` (integer 0–255), with no prefix, suffix or encoding. `byteLength` is an
+integer 0–4,194,305. A value of zero generates empty bytes. There are no mutations,
+JSON reserialization instructions, interpolation, automatic reference rebinding or
+other generators. One byte above a normal maximum is intentionally representable
+to test refusal. Static document files already carry every altered field and exact
+reference; readers do not need the Python scripts used during authoring.
+
+To run a case, first measure/parse/select/canonical-domain-check its root bytes as
+[contract §5](../README.md#5-resource-limits-and-refusal-classifications) specifies.
+Then check the input's registration count (maximum 16), register materials in list
+order (acquiring one source immediately before its registration and checking
+declarations and distinct-byte budget), and validate the root
+schema and its semantic references. Root bytes themselves are subject to the
+262,144-byte limit and count toward the distinct-material budget only when
+explicitly registered. A referenced Policy or Pack must be retained in materials;
+the carrier does not implicitly register the root or fetch a missing digest.
+Return the **first** failing phase's bounded result. Carrier preparation errors
+such as an invalid path are `invalid-carrier`; an unavailable file is
+`missing-material`. These are never successful document readings.
+
+The compound transport/ordering vectors intentionally name a missing file
+(`vectors/intentionally-missing-transport.bin`) or a NUL-containing path. These
+are test harness transport inputs, not absent files that a port should create,
+repair or fetch. Some earlier root/registration refusals must prevent acquisition
+of those later sources. The `vector-carrier-nul-path` case actually reaches its
+malformed path and returns `invalid-carrier`. The result for each case includes
+these transport refusals; the harness compares them with `expected` and continues
+to the next case. Carrier-manifest schema/setup failures remain harness failures.
+
+The manifest includes one over-bound registration count and one over-bound
+original reference; its own carrier schema permits those counterexamples. No
+candidate reader must accept them. Aggregate boundary vectors include separately
+registered identical bytes under two media types; both resolve, and the bytes
+spend the aggregate budget only once. Every role independently applies its size
+limit. Raw Core numeric extensions include fractional, exponent and unsafe integer
+literals; expected results distinguish optional canonical identity from raw pins.
+
+The 20 additional URI vectors assert the candidate's scheme-bearing RFC 3986 `URI`
+grammar in Policy IDs and consuming-Pack references. They cover complete-string assertion, percent-encoding,
+IPv6/IPvFuture, registered names, Unicode and component-specific brackets. Their
+expected results describe URI syntax, not URL fetching or a dependency's quirks;
+valid query/fragment content remains supported. Original retained materials are
+unchanged. The earlier 104 vectors retain their exact inputs and expectations.
+Seven cases are complete adoptions whose consuming Pack ID and exact consumer
+reference agree. Their retained Pack files change only the ID string token;
+every other original Pack byte, including number literals and whitespace, remains
+unchanged. Raw digest/length and optional canonical identity are refreshed for
+those synthetic candidate bytes. Valid percent-encoded hosts and IPvFuture `v`/`V`
+must pass the candidate's consuming-Pack structural checker as well as its
+reference grammar; invalid brackets, final LF and leading-zero IPv4 tails refuse.
+
+Run the reference harness with the repository's pinned dependencies:
+
+```sh
+python rfcs/policy-companion-contract/check_vectors.py
+```
+
+Successful harness output is exactly
+`{"status":"matched","cases":124,"maturity":"proposed-draft"}`; this is harness
+agreement, not the result for an individual document or a conformance claim. Each
+refusal vector's exact output is retained in the manifest. The harness and schema
+are optional conveniences: another language can read these same bytes and the
+source grammar directly, without importing Python or mutable prototype helpers.
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-max.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-max.json
new file mode 100644
index 00000000..9a63cd46
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-max.json
@@ -0,0 +1,25 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": []
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-over.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-over.json
new file mode 100644
index 00000000..9a63cd46
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-over.json
@@ -0,0 +1,25 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": []
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-shared-media-counted-once.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-shared-media-counted-once.json
new file mode 100644
index 00000000..9a63cd46
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/aggregate-shared-media-counted-once.json
@@ -0,0 +1,25 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": []
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-empty-range.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-empty-range.json
new file mode 100644
index 00000000..562186a1
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-empty-range.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 41,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-outside-narrative.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-outside-narrative.json
new file mode 100644
index 00000000..801e4b1a
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-outside-narrative.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 999999,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-over-bound.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-over-bound.json
new file mode 100644
index 00000000..632c1534
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-over-bound.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 1048577,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-stale-digest.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-stale-digest.json
new file mode 100644
index 00000000..6213ac8f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-stale-digest.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-utf8-split.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-utf8-split.json
new file mode 100644
index 00000000..29ccbc02
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/anchor-utf8-split.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 25,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/approval-field.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/approval-field.json
new file mode 100644
index 00000000..c282482b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/approval-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "approved": true
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-build.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-build.json
new file mode 100644
index 00000000..3bdf3da3
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-build.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0+build",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-independent.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-independent.json
new file mode 100644
index 00000000..3ac9ae59
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-independent.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "7.3.42",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-leading-zero.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-leading-zero.json
new file mode 100644
index 00000000..a86fd80b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-leading-zero.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.00.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-max-256.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-max-256.json
new file mode 100644
index 00000000..202c6a3b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-max-256.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-newline.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-newline.json
new file mode 100644
index 00000000..33a0dca7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-newline.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0\n",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-number.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-number.json
new file mode 100644
index 00000000..3cfddc4e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-number.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": 1,
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-over-256.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-over-256.json
new file mode 100644
index 00000000..bf40bfcc
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-over-256.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-two-components.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-two-components.json
new file mode 100644
index 00000000..4a25db33
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/artifact-two-components.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/bom.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/bom.json
new file mode 100644
index 00000000..22fdca1b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/bom.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/companion-float.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/companion-float.json
new file mode 100644
index 00000000..e967560d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/companion-float.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","n":1.0}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/companion-unsafe-integer.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/companion-unsafe-integer.json
new file mode 100644
index 00000000..ea15b97d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/companion-unsafe-integer.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","n":9007199254740992}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown-pack.json
new file mode 100644
index 00000000..a10ed874
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "unknown",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown.json
new file mode 100644
index 00000000..2db44594
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-fallback-unknown.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "byteLength": 1559,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-graph.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-graph.json
new file mode 100644
index 00000000..95714df7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-graph.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "graph",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate-pack.json
new file mode 100644
index 00000000..ef28391b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate-pack.json
@@ -0,0 +1,74 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "different"
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate.json
new file mode 100644
index 00000000..85a16d8a
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/consumer-rule-id-duplicate.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "byteLength": 1828,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-raw-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-raw-pack.json
new file mode 100644
index 00000000..cc3aa167
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-raw-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1.5
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-raw.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-raw.json
new file mode 100644
index 00000000..d825392a
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-raw.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon-pack.json
new file mode 100644
index 00000000..cc3aa167
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1.5
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon.json
new file mode 100644
index 00000000..ba4e1229
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-decimal-requested-canon.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-308-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-308-pack.json
new file mode 100644
index 00000000..34312ff1
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-308-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1e308
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-308.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-308.json
new file mode 100644
index 00000000..cf42a308
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-308.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-over-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-over-pack.json
new file mode 100644
index 00000000..12548437
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-over-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 1e309
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-over.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-over.json
new file mode 100644
index 00000000..9f9e334a
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-exponent-over.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-128-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-128-pack.json
new file mode 100644
index 00000000..c4d31e6d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-128-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-128.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-128.json
new file mode 100644
index 00000000..8045ac88
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-128.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "byteLength": 1773,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-over-128-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-over-128-pack.json
new file mode 100644
index 00000000..3fc39e1b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-over-128-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-over-128.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-over-128.json
new file mode 100644
index 00000000..be3380c4
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-number-over-128.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "byteLength": 1774,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw-pack.json
new file mode 100644
index 00000000..72575108
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 9007199254740992
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw.json
new file mode 100644
index 00000000..230eb4dc
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-raw.json
@@ -0,0 +1,71 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon-pack.json
new file mode 100644
index 00000000..72575108
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon-pack.json
@@ -0,0 +1,67 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "extensions": {
+ "com.example.candidate": {
+ "candidate-number": 9007199254740992
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon.json
new file mode 100644
index 00000000..a11d5f73
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/core-unsafe-int-requested-canon.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-duplicate.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-duplicate.json
new file mode 100644
index 00000000..c05cf61d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-duplicate.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "eligibility",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-omitted.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-omitted.json
new file mode 100644
index 00000000..b8d4f284
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-omitted.json
@@ -0,0 +1,70 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-outside.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-outside.json
new file mode 100644
index 00000000..fa81751e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/coverage-outside.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "unknown",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/depth-32.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/depth-32.json
new file mode 100644
index 00000000..0d73e241
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/depth-32.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/depth-33.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/depth-33.json
new file mode 100644
index 00000000..b9777e0a
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/depth-33.json
@@ -0,0 +1 @@
+[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/desk-managed-alias-refused.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/desk-managed-alias-refused.json
new file mode 100644
index 00000000..497f3947
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/desk-managed-alias-refused.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "desk-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/document-max-bytes.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/document-max-bytes.json
new file mode 100644
index 00000000..b50b49e7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/document-max-bytes.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/duplicate-json.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/duplicate-json.json
new file mode 100644
index 00000000..27e3b357
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/duplicate-json.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","formatVersion":"1.0.0"}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/duplicate-policy-identity.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/duplicate-policy-identity.json
new file mode 100644
index 00000000..4aefa2b8
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/duplicate-policy-identity.json
@@ -0,0 +1,128 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ },
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access. Extra synthetic note."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-0.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-0.json
new file mode 100644
index 00000000..a4f77172
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-0.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "0.0.2",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-2.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-2.json
new file mode 100644
index 00000000..f86d98ec
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-2.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "2.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-before-canon.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-before-canon.json
new file mode 100644
index 00000000..a56a64b0
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-before-canon.json
@@ -0,0 +1 @@
+{"formatVersion":"7.0.0","n":1.5}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-before-shape.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-before-shape.json
new file mode 100644
index 00000000..004c1fcc
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-before-shape.json
@@ -0,0 +1,4 @@
+{
+ "formatVersion": "7.0.0",
+ "approved": true
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-bool.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-bool.json
new file mode 100644
index 00000000..d1fe556d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-bool.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": true,
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-int.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-int.json
new file mode 100644
index 00000000..be645a97
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-int.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": 1,
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-leading-zero.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-leading-zero.json
new file mode 100644
index 00000000..4b3ce9a5
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-leading-zero.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "01.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-missing.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-missing.json
new file mode 100644
index 00000000..a8bb3dd5
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-missing.json
@@ -0,0 +1,75 @@
+{
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-newline.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-newline.json
new file mode 100644
index 00000000..caf99a61
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-newline.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0\n",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-patch.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-patch.json
new file mode 100644
index 00000000..c915f2d9
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-patch.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.1",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-short.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-short.json
new file mode 100644
index 00000000..0e07cff7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-short.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-suffix.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-suffix.json
new file mode 100644
index 00000000..673bade3
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-suffix.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0-rc.1",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-unicode.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-unicode.json
new file mode 100644
index 00000000..2db0c46f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-unicode.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "١.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-v-prefix.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-v-prefix.json
new file mode 100644
index 00000000..1fdc7fa0
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/format-v-prefix.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "v1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/informational-max.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/informational-max.json
new file mode 100644
index 00000000..a51fddb8
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/informational-max.json
@@ -0,0 +1,82 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ],
+ "informationalSources": [
+ {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/informational-over.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/informational-over.json
new file mode 100644
index 00000000..efe294ef
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/informational-over.json
@@ -0,0 +1,82 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ],
+ "informationalSources": [
+ {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/invalid-utf8.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/invalid-utf8.json
new file mode 100644
index 00000000..307ff4b1
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/invalid-utf8.json
@@ -0,0 +1 @@
+{"x":"ÿ"}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/kind-id-confusion.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/kind-id-confusion.json
new file mode 100644
index 00000000..50f4b41e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/kind-id-confusion.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "exception",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/limited-scope-missing-basis.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/limited-scope-missing-basis.json
new file mode 100644
index 00000000..048cb7e1
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/limited-scope-missing-basis.json
@@ -0,0 +1,92 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/procurement/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:205a2afdc68ebd46d5b022256fadec6bd071bc8e34faff481f288c20df008f60"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:f0ef6fe0bb4703eaf6b2c1edf2f12712dffc139e887317c46fc82d83dba71275"
+ }
+ },
+ "scope": {
+ "kind": "sections",
+ "sectionIds": [
+ "eligibility",
+ "conflict-review",
+ "invoice-payment",
+ "purchase-scope"
+ ]
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "conflict-review",
+ "status": "awaiting-interpretation",
+ "explanation": "Synthetic open work item: agree the conflict threshold before implementation."
+ },
+ {
+ "sectionId": "invoice-payment",
+ "status": "out-of-scope",
+ "rationale": "This pack assesses eligibility only; treasury payment reconciliation is a separate process."
+ },
+ {
+ "sectionId": "purchase-scope",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "applicability"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/limited-scope-unknown.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/limited-scope-unknown.json
new file mode 100644
index 00000000..84aac041
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/limited-scope-unknown.json
@@ -0,0 +1,98 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/procurement/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:205a2afdc68ebd46d5b022256fadec6bd071bc8e34faff481f288c20df008f60"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/procurement/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:f0ef6fe0bb4703eaf6b2c1edf2f12712dffc139e887317c46fc82d83dba71275"
+ }
+ },
+ "scope": {
+ "kind": "sections",
+ "sectionIds": [
+ "eligibility",
+ "conflict-review",
+ "invoice-payment",
+ "purchase-scope",
+ "unknown"
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "conflict-review",
+ "status": "awaiting-interpretation",
+ "explanation": "Synthetic open work item: agree the conflict threshold before implementation."
+ },
+ {
+ "sectionId": "invoice-payment",
+ "status": "out-of-scope",
+ "rationale": "This pack assesses eligibility only; treasury payment reconciliation is a separate process."
+ },
+ {
+ "sectionId": "purchase-scope",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "applicability"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/malformed-over-depth.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/malformed-over-depth.json
new file mode 100644
index 00000000..bd942c38
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/malformed-over-depth.json
@@ -0,0 +1 @@
+ÿ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[0]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/missing-governing-policy.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/missing-governing-policy.json
new file mode 100644
index 00000000..f9d2742b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/missing-governing-policy.json
@@ -0,0 +1,21 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": []
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/missing-narrative.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/missing-narrative.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/missing-narrative.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/multiple-json.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/multiple-json.json
new file mode 100644
index 00000000..afcb0c48
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/multiple-json.json
@@ -0,0 +1 @@
+{}{}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/multiple-policy-identities.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/multiple-policy-identities.json
new file mode 100644
index 00000000..3c1da034
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/multiple-policy-identities.json
@@ -0,0 +1,128 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ },
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/second-policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:1589cd845a13aa22ceef347d11dcc34d1b7ad27ade2f30c13979a0dc541c0a42"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/narrative-max.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/narrative-max.json
new file mode 100644
index 00000000..1654a29c
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/narrative-max.json
@@ -0,0 +1,40 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All bytes",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/narrative-over.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/narrative-over.json
new file mode 100644
index 00000000..472bee02
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/narrative-over.json
@@ -0,0 +1,40 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "all",
+ "title": "All bytes",
+ "anchor": {
+ "startByte": 0,
+ "endByte": 1,
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881"
+ }
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/nonfinite.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/nonfinite.json
new file mode 100644
index 00000000..b955cad2
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/nonfinite.json
@@ -0,0 +1 @@
+NaN
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/number-literal-over-128.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/number-literal-over-128.json
new file mode 100644
index 00000000..7f06a63b
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/number-literal-over-128.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","n":999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999}
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/opaque-original.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/opaque-original.json
new file mode 100644
index 00000000..de7caf77
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/opaque-original.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "byteLength": 16,
+ "mediaType": "application/pdf"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/opaque-original.pdf b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/opaque-original.pdf
new file mode 100644
index 00000000..6e5d30d0
Binary files /dev/null and b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/opaque-original.pdf differ
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/original-max.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/original-max.json
new file mode 100644
index 00000000..56fb0104
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/original-max.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:baa7a6d36ffa957552df230235c2d51d735f28d49c58a5f3438a3a973a25a37d",
+ "byteLength": 4194304,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/original-over.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/original-over.json
new file mode 100644
index 00000000..11e3bdb2
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/original-over.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:8d3d3c04baadfd31cbebf771836900097b5f36cc142b74e40747c7b372beab8b",
+ "byteLength": 4194305,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/permission-field.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/permission-field.json
new file mode 100644
index 00000000..40e9fa52
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/permission-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "permissions": true
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-canon-stale.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-canon-stale.json
new file mode 100644
index 00000000..67f7e993
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-canon-stale.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-identity-stale.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-identity-stale.json
new file mode 100644
index 00000000..73a64ea6
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-identity-stale.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/other-policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-version-ref-stale.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-version-ref-stale.json
new file mode 100644
index 00000000..94c71901
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/policy-version-ref-stale.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "2.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/prototype-selector-refused.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/prototype-selector-refused.json
new file mode 100644
index 00000000..f234c1f2
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/prototype-selector-refused.json
@@ -0,0 +1,81 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/registration-count-16.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/registration-count-16.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/registration-count-16.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/registration-count-17.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/registration-count-17.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/registration-count-17.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/requirements-field.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/requirements-field.json
new file mode 100644
index 00000000..f0e9d7d6
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/requirements-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "requirements": true
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/review-max.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/review-max.json
new file mode 100644
index 00000000..3dac3cb7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/review-max.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/review-over.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/review-over.json
new file mode 100644
index 00000000..0cac4554
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/review-over.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/second-policy.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/second-policy.json
new file mode 100644
index 00000000..8820f848
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/second-policy.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/second-policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/section-id-duplicate.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/section-id-duplicate.json
new file mode 100644
index 00000000..4228ff5f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/section-id-duplicate.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "eligibility",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/shared-bytes-multiple-media-types.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/shared-bytes-multiple-media-types.json
new file mode 100644
index 00000000..9c137a27
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/shared-bytes-multiple-media-types.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/markdown"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/signature-field.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/signature-field.json
new file mode 100644
index 00000000..d59094e5
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/signature-field.json
@@ -0,0 +1,77 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "signatures": true
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/singleton-with-id.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/singleton-with-id.json
new file mode 100644
index 00000000..e8938e94
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/singleton-with-id.json
@@ -0,0 +1,68 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "fallback",
+ "id": "fabricated"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/source-id-unknown.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/source-id-unknown.json
new file mode 100644
index 00000000..782bc946
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/source-id-unknown.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "unknown",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/stale-material-hash.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/stale-material-hash.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/stale-material-hash.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/stale-material-length.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/stale-material-length.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/stale-material-length.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/standalone-policy.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/standalone-policy.json
new file mode 100644
index 00000000..ae2a479e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/standalone-policy.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/surrogate.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/surrogate.json
new file mode 100644
index 00000000..4a1cb1ec
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/surrogate.json
@@ -0,0 +1 @@
+"\ud800"
\ No newline at end of file
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unknown-kind-registration-over.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unknown-kind-registration-over.json
new file mode 100644
index 00000000..4bbf5203
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unknown-kind-registration-over.json
@@ -0,0 +1 @@
+{"formatVersion":"1.0.0","kind":"unknown"}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unknown-rule.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unknown-rule.json
new file mode 100644
index 00000000..7e9abe9f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unknown-rule.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "unknown"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unregistered-media-type.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unregistered-media-type.json
new file mode 100644
index 00000000..e0406bbc
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unregistered-media-type.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/markdown"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unsupported-element.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unsupported-element.json
new file mode 100644
index 00000000..59055b25
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/unsupported-element.json
@@ -0,0 +1,68 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "outcome",
+ "id": "eligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-final-lf-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-final-lf-pack.json
new file mode 100644
index 00000000..a588c5fb
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-final-lf-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "urn:test:x\n",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-final-lf.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-final-lf.json
new file mode 100644
index 00000000..ccc861b7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-final-lf.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "urn:test:x\n",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:47f2a4f8ac55a8731d5599090cda8396f35520a21414f9af1f91777b3ebaf12f"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-fragment-raw-brackets.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-fragment-raw-brackets.json
new file mode 100644
index 00000000..57b42460
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-fragment-raw-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/#a[b]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-invalid.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-invalid.json
new file mode 100644
index 00000000..43934511
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-invalid.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "relative/path",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-compressed.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-compressed.json
new file mode 100644
index 00000000..68e5dc78
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-compressed.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://[2001:db8::1]:8080/a",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-double-compression.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-double-compression.json
new file mode 100644
index 00000000..610c293d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-double-compression.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://[2001::db8::1]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-ipv4-tail.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-ipv4-tail.json
new file mode 100644
index 00000000..6ed1cc25
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-ipv4-tail.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://[::ffff:192.168.1.1]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json
new file mode 100644
index 00000000..b725cf36
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "http://[::ffff:192.168.001.001]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json
new file mode 100644
index 00000000..81c56210
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "http://[::ffff:192.168.001.001]/",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "byteLength": 1523,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:9128ab46ba265f6e5dff041a4a7f423f803e0c6959879cc570e793609aae1996"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-invalid-version.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-invalid-version.json
new file mode 100644
index 00000000..6ae88b8d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-invalid-version.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "foo://[vG.a]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase-pack.json
new file mode 100644
index 00000000..480c266c
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "foo://[v1.a]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase.json
new file mode 100644
index 00000000..aa46e52f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-lowercase.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "foo://[v1.a]/",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:a0cf145d4d18c2e0259968b41186fb6c241be660e07c7fde7dabf7db304fa140"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase-pack.json
new file mode 100644
index 00000000..2f10f621
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "foo://[V1.a]/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase.json
new file mode 100644
index 00000000..fafba2b7
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-ipvfuture-uppercase.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "foo://[V1.a]/",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:c794e18a50ee3b6cc076841ba1f03bbbcbfa7d91f3428aaef9a5b9004967bf21"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-numeric-regname-leading-zeros.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-numeric-regname-leading-zeros.json
new file mode 100644
index 00000000..63428d67
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-numeric-regname-leading-zeros.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "http://192.168.001.001/",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets-pack.json
new file mode 100644
index 00000000..23f8928d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/[x]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets.json
new file mode 100644
index 00000000..92153d8f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-path-raw-brackets.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/[x]",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:10c3750e1583b45caa9a57baa8ffaa4dc2c091651aa1f725fc6618f47bc6425f"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-brackets.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-brackets.json
new file mode 100644
index 00000000..718dff40
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "foo://%5Bname%5D/%5Bpath%5D?b=%5Bc%5D#a%5Bb%5D",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-incomplete.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-incomplete.json
new file mode 100644
index 00000000..5df792a4
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-incomplete.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/a%2",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-nonhex.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-nonhex.json
new file mode 100644
index 00000000..b2d545d3
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-nonhex.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/a%GG",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-regname-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-regname-pack.json
new file mode 100644
index 00000000..7f592366
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-regname-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://%65xample.invalid/a",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-regname.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-regname.json
new file mode 100644
index 00000000..a0bca651
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-regname.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://%65xample.invalid/a",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:a638315c0dde2052fb78f3b2282e74f970c1e292221213339817856caadde3ed"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-unicode.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-unicode.json
new file mode 100644
index 00000000..20d60f6c
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-percent-unicode.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/%C3%A9",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-query-raw-brackets.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-query-raw-brackets.json
new file mode 100644
index 00000000..ac7c5b63
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-query-raw-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/?b=[c]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-raw-unicode.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-raw-unicode.json
new file mode 100644
index 00000000..9d4e50da
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-raw-unicode.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "https://example.invalid/é",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets-pack.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets-pack.json
new file mode 100644
index 00000000..a228f764
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "urn:test:[x]",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets.json
new file mode 100644
index 00000000..683f091f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-rootless-raw-brackets.json
@@ -0,0 +1,75 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-contract/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "urn:test:[x]",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:3b4c17543d6b4fd14d6e28b206387dc989cc3a849626cd9bd84c17dabc1dda65"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-contract/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:8e9de4d2824a3186354e4ab410f4b0c744afa452796ce089bc0461adee63bce5"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-userinfo-percent-brackets.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-userinfo-percent-brackets.json
new file mode 100644
index 00000000..33f41f31
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/documents/uri-userinfo-percent-brackets.json
@@ -0,0 +1,76 @@
+{
+ "formatVersion": "1.0.0",
+ "kind": "policy",
+ "id": "foo://u%5Bser%5D:p%40ss@example.invalid/a",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "workspace-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/vectors/manifest.json b/internal/policy/official/rfcs/policy-companion-contract/vectors/manifest.json
new file mode 100644
index 00000000..a802df4f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/vectors/manifest.json
@@ -0,0 +1,7446 @@
+{
+ "vectorSuiteVersion": "1",
+ "maturity": "proposed-draft",
+ "synthetic": true,
+ "cases": [
+ {
+ "id": "data-access",
+ "document": {
+ "path": "examples/data-access/adoption.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "procurement",
+ "document": {
+ "path": "examples/procurement/adoption.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/procurement/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "refunds",
+ "document": {
+ "path": "examples/refunds/adoption.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/refunds/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/refunds/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:8e3a487de4b15a1bc6c824e6dedd2e1b4fe16f4b3c4430a76b46e943ef2565ff",
+ "byteLength": 2375,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "standalone-policy",
+ "document": {
+ "path": "vectors/documents/standalone-policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "format-2",
+ "document": {
+ "path": "vectors/documents/format-2.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-patch",
+ "document": {
+ "path": "vectors/documents/format-patch.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-0",
+ "document": {
+ "path": "vectors/documents/format-0.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-int",
+ "document": {
+ "path": "vectors/documents/format-int.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-bool",
+ "document": {
+ "path": "vectors/documents/format-bool.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-short",
+ "document": {
+ "path": "vectors/documents/format-short.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-v-prefix",
+ "document": {
+ "path": "vectors/documents/format-v-prefix.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-leading-zero",
+ "document": {
+ "path": "vectors/documents/format-leading-zero.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-newline",
+ "document": {
+ "path": "vectors/documents/format-newline.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-unicode",
+ "document": {
+ "path": "vectors/documents/format-unicode.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-suffix",
+ "document": {
+ "path": "vectors/documents/format-suffix.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-missing",
+ "document": {
+ "path": "vectors/documents/format-missing.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "format-before-shape",
+ "document": {
+ "path": "vectors/documents/format-before-shape.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "format-before-canon",
+ "document": {
+ "path": "vectors/documents/format-before-canon.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "prototype-selector-refused",
+ "document": {
+ "path": "vectors/documents/prototype-selector-refused.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "desk-managed-alias-refused",
+ "document": {
+ "path": "vectors/documents/desk-managed-alias-refused.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-independent",
+ "document": {
+ "path": "vectors/documents/artifact-independent.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "artifact-max-256",
+ "document": {
+ "path": "vectors/documents/artifact-max-256.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "artifact-over-256",
+ "document": {
+ "path": "vectors/documents/artifact-over-256.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "artifact-number",
+ "document": {
+ "path": "vectors/documents/artifact-number.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-two-components",
+ "document": {
+ "path": "vectors/documents/artifact-two-components.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-leading-zero",
+ "document": {
+ "path": "vectors/documents/artifact-leading-zero.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-build",
+ "document": {
+ "path": "vectors/documents/artifact-build.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "artifact-newline",
+ "document": {
+ "path": "vectors/documents/artifact-newline.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "duplicate-json",
+ "document": {
+ "path": "vectors/documents/duplicate-json.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "bom",
+ "document": {
+ "path": "vectors/documents/bom.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "invalid-utf8",
+ "document": {
+ "path": "vectors/documents/invalid-utf8.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "surrogate",
+ "document": {
+ "path": "vectors/documents/surrogate.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "nonfinite",
+ "document": {
+ "path": "vectors/documents/nonfinite.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "multiple-json",
+ "document": {
+ "path": "vectors/documents/multiple-json.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-json"
+ }
+ },
+ {
+ "id": "depth-33",
+ "document": {
+ "path": "vectors/documents/depth-33.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "depth-32",
+ "document": {
+ "path": "vectors/documents/depth-32.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-selector"
+ }
+ },
+ {
+ "id": "number-literal-over-128",
+ "document": {
+ "path": "vectors/documents/number-literal-over-128.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "companion-float",
+ "document": {
+ "path": "vectors/documents/companion-float.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "companion-unsafe-integer",
+ "document": {
+ "path": "vectors/documents/companion-unsafe-integer.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "document-max-bytes",
+ "document": {
+ "path": "vectors/documents/document-max-bytes.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "document-over-bytes",
+ "document": {
+ "repeatByte": 32,
+ "byteLength": 262145
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "approval-field",
+ "document": {
+ "path": "vectors/documents/approval-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "permission-field",
+ "document": {
+ "path": "vectors/documents/permission-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "signature-field",
+ "document": {
+ "path": "vectors/documents/signature-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "requirements-field",
+ "document": {
+ "path": "vectors/documents/requirements-field.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-invalid",
+ "document": {
+ "path": "vectors/documents/uri-invalid.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "source-id-unknown",
+ "document": {
+ "path": "vectors/documents/source-id-unknown.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "section-id-duplicate",
+ "document": {
+ "path": "vectors/documents/section-id-duplicate.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-stale-digest",
+ "document": {
+ "path": "vectors/documents/anchor-stale-digest.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-empty-range",
+ "document": {
+ "path": "vectors/documents/anchor-empty-range.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-outside-narrative",
+ "document": {
+ "path": "vectors/documents/anchor-outside-narrative.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "anchor-over-bound",
+ "document": {
+ "path": "vectors/documents/anchor-over-bound.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "anchor-utf8-split",
+ "document": {
+ "path": "vectors/documents/anchor-utf8-split.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-anchor"
+ }
+ },
+ {
+ "id": "missing-narrative",
+ "document": {
+ "path": "vectors/documents/missing-narrative.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "missing-material"
+ }
+ },
+ {
+ "id": "stale-material-length",
+ "document": {
+ "path": "vectors/documents/stale-material-length.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 450,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "stale-material-hash",
+ "document": {
+ "path": "vectors/documents/stale-material-hash.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "unregistered-media-type",
+ "document": {
+ "path": "vectors/documents/unregistered-media-type.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "shared-bytes-multiple-media-types",
+ "document": {
+ "path": "vectors/documents/shared-bytes-multiple-media-types.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/markdown"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "opaque-original",
+ "document": {
+ "path": "vectors/documents/opaque-original.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/opaque-original.pdf"
+ },
+ "content": {
+ "bytesDigest": "sha256:af7777006b9a8e6b9ffd9dbc25f3d4f3c54331e9f74948ba9d1facdf63b1a8be",
+ "byteLength": 16,
+ "mediaType": "application/pdf"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "coverage-omitted",
+ "document": {
+ "path": "vectors/documents/coverage-omitted.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "coverage-outside",
+ "document": {
+ "path": "vectors/documents/coverage-outside.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "coverage-duplicate",
+ "document": {
+ "path": "vectors/documents/coverage-duplicate.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "unknown-rule",
+ "document": {
+ "path": "vectors/documents/unknown-rule.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "kind-id-confusion",
+ "document": {
+ "path": "vectors/documents/kind-id-confusion.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "singleton-with-id",
+ "document": {
+ "path": "vectors/documents/singleton-with-id.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "unsupported-element",
+ "document": {
+ "path": "vectors/documents/unsupported-element.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "consumer-graph",
+ "document": {
+ "path": "vectors/documents/consumer-graph.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "missing-governing-policy",
+ "document": {
+ "path": "vectors/documents/missing-governing-policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "policy-version-ref-stale",
+ "document": {
+ "path": "vectors/documents/policy-version-ref-stale.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "policy-canon-stale",
+ "document": {
+ "path": "vectors/documents/policy-canon-stale.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "policy-identity-stale",
+ "document": {
+ "path": "vectors/documents/policy-identity-stale.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "limited-scope-unknown",
+ "document": {
+ "path": "vectors/documents/limited-scope-unknown.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/procurement/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "limited-scope-missing-basis",
+ "document": {
+ "path": "vectors/documents/limited-scope-missing-basis.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/procurement/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/procurement/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:539587356d8c0942f6e2c98ec09311e9c55fc4efcc6b9f8845e58db817a8dc58",
+ "byteLength": 2793,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "multiple-policy-identities",
+ "document": {
+ "path": "vectors/documents/multiple-policy-identities.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/second-policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "duplicate-policy-identity",
+ "document": {
+ "path": "vectors/documents/duplicate-policy-identity.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/second-policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:144558275929f298692344329199afd892f5d74f1bc8aa70bea4bda14e98d627",
+ "byteLength": 1988,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-coverage"
+ }
+ },
+ {
+ "id": "core-decimal-raw",
+ "document": {
+ "path": "vectors/documents/core-decimal-raw.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-decimal-raw-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "core-decimal-requested-canon",
+ "document": {
+ "path": "vectors/documents/core-decimal-requested-canon.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-decimal-requested-canon-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a2b3c06074ead90e9b34d3213ad9b5665ad05c548dfa9cc3be57e8e9f23634b",
+ "byteLength": 1648,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-canonical-identity"
+ }
+ },
+ {
+ "id": "core-unsafe-int-raw",
+ "document": {
+ "path": "vectors/documents/core-unsafe-int-raw.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-unsafe-int-raw-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "core-unsafe-int-requested-canon",
+ "document": {
+ "path": "vectors/documents/core-unsafe-int-requested-canon.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-unsafe-int-requested-canon-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:2857116756d73d0babfcd3ede480fd8d462ea95bfcbc234c5e80983b3c4b9910",
+ "byteLength": 1661,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-canonical-identity"
+ }
+ },
+ {
+ "id": "core-exponent-308",
+ "document": {
+ "path": "vectors/documents/core-exponent-308.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-exponent-308-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:52bd1104aedcc81011f2b0aaac2f5a3e082dc96b7a9c490cf441a005d3e3667e",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "core-exponent-over",
+ "document": {
+ "path": "vectors/documents/core-exponent-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-exponent-over-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:7d593e7fac09abf836b599e7719f33850381bd60d5aa8c078a7cf2d43c494843",
+ "byteLength": 1650,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "core-number-128",
+ "document": {
+ "path": "vectors/documents/core-number-128.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-number-128-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:0a694f57fa21a82551738a128022578c837b332848866db302da838c70b8e3c7",
+ "byteLength": 1773,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "core-number-over-128",
+ "document": {
+ "path": "vectors/documents/core-number-over-128.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/core-number-over-128-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:bceb1d327714090d58fb463516779aeb50168299e0ff0d2a9de21a7ff5421114",
+ "byteLength": 1774,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "consumer-fallback-unknown",
+ "document": {
+ "path": "vectors/documents/consumer-fallback-unknown.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/consumer-fallback-unknown-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:8c7a49e4b3b81d1880e64bdee1734c4805a1c4daffc599683ce098d47e0c2011",
+ "byteLength": 1559,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-consumer"
+ }
+ },
+ {
+ "id": "consumer-rule-id-duplicate",
+ "document": {
+ "path": "vectors/documents/consumer-rule-id-duplicate.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/consumer-rule-id-duplicate-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:93560dbc1b0537cf834d02b2607dade6b9a6407c5a37caf36954822762f0c312",
+ "byteLength": 1828,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-consumer"
+ }
+ },
+ {
+ "id": "narrative-max",
+ "document": {
+ "path": "vectors/documents/narrative-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048576
+ },
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "narrative-over",
+ "document": {
+ "path": "vectors/documents/narrative-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048577
+ },
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "original-max",
+ "document": {
+ "path": "vectors/documents/original-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:baa7a6d36ffa957552df230235c2d51d735f28d49c58a5f3438a3a973a25a37d",
+ "byteLength": 4194304,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "original-over",
+ "document": {
+ "path": "vectors/documents/original-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 4194305
+ },
+ "content": {
+ "bytesDigest": "sha256:8d3d3c04baadfd31cbebf771836900097b5f36cc142b74e40747c7b372beab8b",
+ "byteLength": 4194305,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "review-max",
+ "document": {
+ "path": "vectors/documents/review-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048576
+ },
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "review-over",
+ "document": {
+ "path": "vectors/documents/review-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048577
+ },
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "informational-max",
+ "document": {
+ "path": "vectors/documents/informational-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048576
+ },
+ "content": {
+ "bytesDigest": "sha256:8f990ba0b577b51cf009ea049368c16bbda1b21e1b93be07a824758bb253c39b",
+ "byteLength": 1048576,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "informational-over",
+ "document": {
+ "path": "vectors/documents/informational-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1048577
+ },
+ "content": {
+ "bytesDigest": "sha256:154b8ed3c2383ce429058768595935faf7851b5c38db2b1732594be1d88bc05a",
+ "byteLength": 1048577,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "aggregate-max",
+ "document": {
+ "path": "vectors/documents/aggregate-max.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 1,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:5d2bafc266e711ed1e303de871e5b281fea2083d96e579dd504798bba5a34b42",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 2,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:e4eb88707af669a2324ae8aad3950ac7b3f7837dec7823c94d4983a99ef13181",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 3,
+ "byteLength": 4194303
+ },
+ "content": {
+ "bytesDigest": "sha256:3b9ba78a58567b74d9420579bdb199d57d92eb434f30ebf6118b2e0ec7f0fb63",
+ "byteLength": 4194303,
+ "mediaType": "application/pdf"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "aggregate-shared-media-counted-once",
+ "document": {
+ "path": "vectors/documents/aggregate-shared-media-counted-once.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 1,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:5d2bafc266e711ed1e303de871e5b281fea2083d96e579dd504798bba5a34b42",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 2,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:e4eb88707af669a2324ae8aad3950ac7b3f7837dec7823c94d4983a99ef13181",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 3,
+ "byteLength": 4194303
+ },
+ "content": {
+ "bytesDigest": "sha256:3b9ba78a58567b74d9420579bdb199d57d92eb434f30ebf6118b2e0ec7f0fb63",
+ "byteLength": 4194303,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "text/markdown"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "aggregate-over",
+ "document": {
+ "path": "vectors/documents/aggregate-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 1,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:5d2bafc266e711ed1e303de871e5b281fea2083d96e579dd504798bba5a34b42",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 2,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:e4eb88707af669a2324ae8aad3950ac7b3f7837dec7823c94d4983a99ef13181",
+ "byteLength": 4194304,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 3,
+ "byteLength": 4194303
+ },
+ "content": {
+ "bytesDigest": "sha256:3b9ba78a58567b74d9420579bdb199d57d92eb434f30ebf6118b2e0ec7f0fb63",
+ "byteLength": 4194303,
+ "mediaType": "application/pdf"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 0,
+ "byteLength": 4194304
+ },
+ "content": {
+ "bytesDigest": "sha256:bb9f8df61474d25e71fa00722318cd387396ca1736605e1248821cc0de3d3af8",
+ "byteLength": 4194304,
+ "mediaType": "text/markdown"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 121,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:a1fce4363854ff888cff4b8e7875d600c2682390412a8cf79b37d0b11148b0fa",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "registration-count-16",
+ "document": {
+ "path": "vectors/documents/registration-count-16.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "registration-count-17",
+ "document": {
+ "path": "vectors/documents/registration-count-17.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "malformed-over-depth",
+ "document": {
+ "path": "vectors/documents/malformed-over-depth.json"
+ },
+ "materials": [],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "unknown-kind-registration-over",
+ "document": {
+ "path": "vectors/documents/unknown-kind-registration-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "input-over-bound"
+ }
+ },
+ {
+ "id": "unknown-kind-stale-length",
+ "document": {
+ "path": "vectors/documents/unknown-kind-registration-over.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 2,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "unsupported-format-missing-source",
+ "document": {
+ "path": "vectors/documents/format-2.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "vectors/intentionally-missing-transport.bin"
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "unsupported-format"
+ }
+ },
+ {
+ "id": "early-hash-failure-later-missing-source",
+ "document": {
+ "path": "examples/data-access/policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "repeatByte": 120,
+ "byteLength": 1
+ },
+ "content": {
+ "bytesDigest": "sha256:0000000000000000000000000000000000000000000000000000000000000000",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/intentionally-missing-transport.bin"
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "reference-mismatch"
+ }
+ },
+ {
+ "id": "vector-carrier-nul-path",
+ "document": {
+ "path": "examples/data-access/policy.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "vectors/private\u0000transport.bin"
+ },
+ "content": {
+ "bytesDigest": "sha256:2d711642b726b04401627ca9fbac32f5c8530fb1903cc4db02258717921a4881",
+ "byteLength": 1,
+ "mediaType": "text/plain"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-carrier"
+ }
+ },
+ {
+ "id": "uri-final-lf",
+ "document": {
+ "path": "vectors/documents/uri-final-lf.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-final-lf-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c418f413e2b19f32dcc2f46664717ff2eb81e940fca57315275d39e63037f495",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-ipv6-leading-zero-ipv4-tail",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-leading-zero-ipv4-tail.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-ipv6-leading-zero-ipv4-tail-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:0ea4f86f542fcfe5a183050daac17f5d43796995965096773ba7481c5ad93e4e",
+ "byteLength": 1523,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-raw-unicode",
+ "document": {
+ "path": "vectors/documents/uri-raw-unicode.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-percent-unicode",
+ "document": {
+ "path": "vectors/documents/uri-percent-unicode.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-percent-incomplete",
+ "document": {
+ "path": "vectors/documents/uri-percent-incomplete.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-percent-nonhex",
+ "document": {
+ "path": "vectors/documents/uri-percent-nonhex.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-ipv6-compressed",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-compressed.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-ipv6-ipv4-tail",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-ipv4-tail.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-ipv6-double-compression",
+ "document": {
+ "path": "vectors/documents/uri-ipv6-double-compression.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-ipvfuture-lowercase",
+ "document": {
+ "path": "vectors/documents/uri-ipvfuture-lowercase.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-ipvfuture-lowercase-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:ebd7ca932ab1557442af46b391d5e1b980c9398a7213d4682a3308732be4cf5a",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-ipvfuture-uppercase",
+ "document": {
+ "path": "vectors/documents/uri-ipvfuture-uppercase.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-ipvfuture-uppercase-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6992d4add7edc8a3dec0679b28dd58a4838d2cf5f218b4f702081583e9cb8c6b",
+ "byteLength": 1504,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-ipvfuture-invalid-version",
+ "document": {
+ "path": "vectors/documents/uri-ipvfuture-invalid-version.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-percent-regname",
+ "document": {
+ "path": "vectors/documents/uri-percent-regname.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-percent-regname-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:50e9179933d3bab136e4872f25874e556cc9b1508410dd945ad564a2a3e90daa",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-userinfo-percent-brackets",
+ "document": {
+ "path": "vectors/documents/uri-userinfo-percent-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-percent-brackets",
+ "document": {
+ "path": "vectors/documents/uri-percent-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ },
+ {
+ "id": "uri-rootless-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-rootless-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-rootless-raw-brackets-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:a2b8f1d350ac991ebfd9f94ce6e53e40d19485e1f8ec7baaeb91f2ba279418ca",
+ "byteLength": 1503,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-path-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-path-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "vectors/documents/uri-path-raw-brackets-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c0e3ef08c4644024d87d26ed4d77a5c14b1b7f46c8ca0a4b0ce7d8157ade7208",
+ "byteLength": 1518,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-query-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-query-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-fragment-raw-brackets",
+ "document": {
+ "path": "vectors/documents/uri-fragment-raw-brackets.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "refused",
+ "code": "invalid-document"
+ }
+ },
+ {
+ "id": "uri-numeric-regname-leading-zeros",
+ "document": {
+ "path": "vectors/documents/uri-numeric-regname-leading-zeros.json"
+ },
+ "materials": [
+ {
+ "source": {
+ "path": "examples/data-access/narrative.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/source.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/interpretation.txt"
+ },
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/consumer-pack.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "source": {
+ "path": "examples/data-access/policy.json"
+ },
+ "content": {
+ "bytesDigest": "sha256:6abbd1b965ff006e210b8a98c4a8db6eb0bb795c1f8a995d3be343aa1a984f51",
+ "byteLength": 2019,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "expected": {
+ "status": "valid",
+ "formatVersion": "1.0.0",
+ "maturity": "proposed-draft"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-contract/verify.py b/internal/policy/official/rfcs/policy-companion-contract/verify.py
new file mode 100644
index 00000000..27d37360
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-contract/verify.py
@@ -0,0 +1,431 @@
+#!/usr/bin/env python3
+"""Offline checker for the PROPOSED DRAFT Policy companion 1.0.0, never authority."""
+
+import argparse
+import ipaddress
+import json
+import re
+import sys
+from pathlib import Path
+
+from jsonschema import Draft202012Validator, FormatChecker
+from referencing import Registry, Resource
+from rfc3986_validator import URI_RE_COMP
+
+HERE = Path(__file__).resolve().parent
+ROOT = HERE.parents[1]
+sys.dont_write_bytecode = True
+sys.path.insert(0, str(ROOT / "tools"))
+import dialect_verify as spec_canon
+
+MAX_DOCUMENT_BYTES = 262144
+MAX_MATERIAL_BYTES = 1048576
+MAX_ORIGINAL_BYTES = 4194304
+MAX_TOTAL_MATERIAL_BYTES = 16777216
+MAX_MATERIALS = 16
+MAX_DEPTH = 32
+VERSION = re.compile(r"(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)", re.ASCII)
+FORMAT_VERSION = "1.0.0"
+VALID = {"status": "valid", "formatVersion": FORMAT_VERSION, "maturity": "proposed-draft"}
+CODES = (
+ "input-over-bound", "invalid-json", "invalid-selector", "unsupported-format",
+ "invalid-document", "missing-material", "reference-mismatch", "invalid-anchor",
+ "invalid-coverage", "invalid-consumer", "unsupported-canonical-identity", "invalid-carrier",
+)
+CAPABILITY = {
+ "capability": "jps-policy-companion-offline",
+ "maturity": "proposed-draft",
+ "formatVersions": [FORMAT_VERSION],
+ "consumerSpecVersions": ["0.2.0-draft"],
+ "kinds": ["policy", "governing-adoption"],
+ "features": ["exact-byte-sha256", "utf8-section-anchors", "scoped-total-coverage",
+ "typed-core-pack-references", "optional-jps-canon-identity", "multiple-media-types"],
+ "limits": {"documentBytes": MAX_DOCUMENT_BYTES, "documentDepth": MAX_DEPTH,
+ "numberLiteralCharacters": 128, "exponentMagnitude": 308,
+ "materialBytes": MAX_MATERIAL_BYTES, "originalBytes": MAX_ORIGINAL_BYTES,
+ "distinctRetainedBytes": MAX_TOTAL_MATERIAL_BYTES, "materialRegistrations": MAX_MATERIALS,
+ "versionCharacters": 256, "sections": 64, "sources": 16, "governingPolicies": 16,
+ "consumerElementsPerSection": 64, "textCharacters": 4096, "uriCharacters": 2048,
+ "localIdCharacters": 128, "mediaTypeCharacters": 128, "sourceRefsPerSection": 16,
+ "scopeSectionIds": 64, "coverageRecordsPerPolicy": 64, "informationalSources": 16,
+ "canonicalIntegerMagnitude": 9007199254740991},
+ "excludes": ["adopted-or-stable-format", "graph-consumers", "evaluation", "full-core-semantics",
+ "signatures", "review-assertion-trust", "live-authority", "permissions", "currency",
+ "source-fetch", "automatic-migration", "independent-interoperability-evidence"],
+ "refusalCodes": list(CODES),
+}
+
+
+class ContractError(ValueError):
+ """Finite safe code only: never include retained input in public diagnostics."""
+ def __init__(self, code):
+ assert code in CODES
+ super().__init__(code)
+ self.code = code
+
+
+def require(condition, code):
+ if not condition:
+ raise ContractError(code)
+
+
+def identity(data, media_type):
+ return {"bytesDigest": spec_canon.digest_of(data), "byteLength": len(data), "mediaType": media_type}
+
+
+def strict_json(data):
+ require(len(data) <= MAX_DOCUMENT_BYTES, "input-over-bound")
+ try:
+ return spec_canon.read_document(data, "candidate document", MAX_DEPTH)
+ except spec_canon.Refused as error:
+ raise ContractError("input-over-bound" if error.name == "input-over-bound" else "invalid-json") from error
+
+
+def plain(value):
+ if isinstance(value, spec_canon.Num):
+ return int(value.literal)
+ if isinstance(value, dict):
+ return {key: plain(child) for key, child in value.items()}
+ if isinstance(value, list):
+ return [plain(child) for child in value]
+ return value
+
+
+def canon_document(value):
+ try:
+ spec_canon.canon(value)
+ return plain(value)
+ except spec_canon.OutsideDomain as error:
+ raise ContractError("invalid-document") from error
+
+
+def read_json(data):
+ """For local schemas/carriers; companion reading additionally selects format first."""
+ return canon_document(strict_json(data))
+
+
+def select_format(document):
+ require(isinstance(document, dict), "invalid-selector")
+ selector = document.get("formatVersion")
+ require(isinstance(selector, str) and len(selector) <= 256 and VERSION.fullmatch(selector), "invalid-selector")
+ require(selector == FORMAT_VERSION, "unsupported-format")
+
+
+def read_companion(data):
+ value = strict_json(data)
+ select_format(value) # No schema, identity interpretation, or migration before exact dispatch.
+ return canon_document(value)
+
+
+def canonical_identity(data):
+ try:
+ value = strict_json(data)
+ digest = spec_canon.digest_of(spec_canon.canon(value))
+ except (ContractError, spec_canon.OutsideDomain) as error:
+ if isinstance(error, ContractError) and error.code == "input-over-bound":
+ raise
+ raise ContractError("unsupported-canonical-identity") from error
+ return {"profile": "jps-canon", "canonicalDigest": digest}
+
+
+def core_schema_view(value):
+ if isinstance(value, spec_canon.Num):
+ number = value.value # Exact Decimal, without float rounding or canon restriction.
+ return int(number) if number == number.to_integral_value() else number
+ if isinstance(value, dict):
+ return {key: core_schema_view(child) for key, child in value.items()}
+ if isinstance(value, list):
+ return [core_schema_view(child) for child in value]
+ return value
+
+
+def candidate_uri(value):
+ """RFC 3986 URI production; repair three pinned-validator defects locally."""
+ if not isinstance(value, str):
+ return True # JSON Schema's type keyword handles non-string values.
+ if any(not 0x21 <= ord(char) <= 0x7E for char in value):
+ return False
+ scheme = re.match(r"[A-Za-z][A-Za-z0-9+.-]*:", value)
+ if scheme is None:
+ return False
+ probe = value
+ if value[scheme.end():].startswith("//"):
+ authority_start = scheme.end() + 2
+ authority = re.split(r"[/?#]", value[authority_start:], maxsplit=1)[0]
+ host_port = authority.rsplit("@", 1)[-1]
+ if host_port.startswith("["):
+ end = host_port.find("]")
+ if end < 0:
+ return False
+ literal = host_port[1:end]
+ if literal.startswith(("v", "V")):
+ # ABNF quoted strings are case-insensitive. Change only the
+ # validation probe, never retained bytes or identity comparisons.
+ flag = authority_start + len(authority) - len(host_port) + 1
+ probe = value[:flag] + "v" + value[flag + 1:]
+ else:
+ try:
+ ipaddress.IPv6Address(literal)
+ except ValueError:
+ return False
+ # fullmatch refuses a final LF that the dependency's anchored match accepts.
+ # Its remaining grammar checks percent triplets and each component's alphabet.
+ return URI_RE_COMP.fullmatch(probe) is not None
+
+
+def validators():
+ schemas = {name: read_json((HERE / (name + ".schema.json")).read_bytes())
+ for name in ("common", "policy", "governing-adoption", "fixture", "vectors")}
+ registry = Registry().with_resources((schema["$id"], Resource.from_contents(schema)) for schema in schemas.values())
+ schemas["core"] = read_json((ROOT / "schema/judgment-pack-core.schema.json").read_bytes())
+ candidate_checker = FormatChecker()
+ if "uri" not in candidate_checker.checkers or candidate_checker.conforms("not a URI", "uri"):
+ raise RuntimeError("Install pinned requirements-dev.txt URI dependencies")
+ # The consuming Pack is checked within this candidate reader too. Override
+ # this instance only; shared Core/prototype validators keep their own checker.
+ candidate_checker.checks("uri")(candidate_uri)
+ result = {}
+ for name, schema in schemas.items():
+ Draft202012Validator.check_schema(schema)
+ result[name] = Draft202012Validator(schema, registry=registry, format_checker=candidate_checker)
+ return result
+
+
+VALIDATORS = None
+
+
+def check_schema(name, document):
+ global VALIDATORS
+ if VALIDATORS is None:
+ VALIDATORS = validators()
+ errors = list(VALIDATORS[name].iter_errors(core_schema_view(document) if name == "core" else document))
+ # Schema maxima are resource refusals; required/type/enum/minimum failures are semantic.
+ def over(error):
+ return error.validator in ("maxItems", "maxLength", "maximum") or any(over(child) for child in error.context)
+ if any(over(error) for error in errors):
+ raise ContractError("input-over-bound")
+ require(not errors, "invalid-consumer" if name == "core" else "invalid-carrier" if name == "fixture" else "invalid-document")
+
+
+def unique_by_id(items, code):
+ result = {}
+ for item in items:
+ require(item["id"] not in result, code)
+ result[item["id"]] = item
+ return result
+
+
+def register_material(reference, raw, material):
+ check_schema("common", reference)
+ require(len(raw) <= MAX_ORIGINAL_BYTES, "input-over-bound")
+ entry = material.get(reference["bytesDigest"])
+ require(entry is None or entry[0] == raw, "reference-mismatch")
+ require(identity(raw, reference["mediaType"]) == reference, "reference-mismatch")
+ total = sum(len(value[0]) for value in material.values())
+ require(total + (len(raw) if entry is None else 0) <= MAX_TOTAL_MATERIAL_BYTES, "input-over-bound")
+ media_types = {reference["mediaType"]}
+ if entry is not None:
+ media_types.update(entry[1])
+ material[reference["bytesDigest"]] = (entry[0] if entry is not None else raw, media_types)
+
+
+def resolve(reference, material, limit=MAX_MATERIAL_BYTES):
+ check_schema("common", reference)
+ require(reference["byteLength"] <= limit, "input-over-bound")
+ entry = material.get(reference["bytesDigest"])
+ require(entry is not None, "missing-material")
+ require(reference["mediaType"] in entry[1], "reference-mismatch")
+ require(identity(entry[0], reference["mediaType"]) == reference, "reference-mismatch")
+ return entry[0]
+
+
+def check_artifact(reference, kind, material):
+ require(reference["kind"] == kind, "reference-mismatch")
+ require(reference["content"]["mediaType"] == "application/json", "invalid-document")
+ raw = resolve(reference["content"], material, MAX_DOCUMENT_BYTES)
+ document = strict_json(raw) if kind == "pack" else read_companion(raw)
+ require(isinstance(document, dict), "invalid-consumer" if kind == "pack" else "invalid-document")
+ require(reference["id"] == document.get("id") and reference["version"] == document.get("version"), "reference-mismatch")
+ if "canonicalIdentity" in reference:
+ require(reference["canonicalIdentity"] == canonical_identity(raw), "reference-mismatch")
+ return document
+
+
+def check_policy(document, material):
+ select_format(document)
+ check_schema("policy", document)
+ narrative = resolve(document["content"], material)
+ require(document["content"]["mediaType"] == "text/plain", "invalid-document")
+ try:
+ narrative.decode("utf-8")
+ except UnicodeError as error:
+ raise ContractError("invalid-anchor") from error
+ sources = unique_by_id(document["sourceProvenance"], "invalid-document")
+ for source in sources.values():
+ resolve(source["content"], material, MAX_ORIGINAL_BYTES)
+ sections = unique_by_id(document["sections"], "invalid-anchor")
+ for section in sections.values():
+ anchor = section["anchor"]
+ start, end = anchor["startByte"], anchor["endByte"]
+ require(0 <= start < end <= len(narrative), "invalid-anchor")
+ try:
+ narrative[:start].decode("utf-8")
+ narrative[start:end].decode("utf-8")
+ except UnicodeError as error:
+ raise ContractError("invalid-anchor") from error
+ require(spec_canon.digest_of(narrative[start:end]) == anchor["bytesDigest"], "invalid-anchor")
+ for source_ref in section.get("sourceRefs", []):
+ require(source_ref["sourceId"] in sources, "invalid-anchor")
+ return sections
+
+
+def check_adoption(document, material):
+ select_format(document)
+ check_schema("governing-adoption", document)
+ consumer = check_artifact(document["consumer"], "pack", material)
+ check_schema("core", consumer)
+ rules = unique_by_id(consumer["rules"], "invalid-consumer")
+ exceptions = unique_by_id(consumer.get("exceptions", []), "invalid-consumer")
+ outcomes = unique_by_id(consumer["outcomes"], "invalid-consumer")
+ if "fallbackOutcome" in consumer:
+ require(consumer["fallbackOutcome"] in outcomes, "invalid-consumer")
+ for exception in exceptions.values():
+ if "targetRule" in exception:
+ require(exception["targetRule"] in rules, "invalid-consumer")
+ if "outcome" in exception:
+ require(exception["outcome"] in outcomes, "invalid-consumer")
+ policies = set()
+ for governing in document["governingPolicies"]:
+ reference = governing["policy"]
+ policy = check_artifact(reference, "policy", material)
+ sections = check_policy(policy, material)
+ require(reference["id"] not in policies, "invalid-coverage")
+ policies.add(reference["id"])
+ scope = governing["scope"]
+ selected = set(sections) if scope["kind"] == "whole-policy" else set(scope["sectionIds"])
+ require(selected.issubset(sections), "invalid-coverage")
+ if scope["kind"] == "sections":
+ resolve(scope["reviewBasis"], material)
+ seen = set()
+ for coverage in governing["coverage"]:
+ section_id = coverage["sectionId"]
+ require(section_id in selected and section_id not in seen, "invalid-coverage")
+ seen.add(section_id)
+ if coverage["status"] == "implemented":
+ elements_seen = set()
+ for element in coverage["consumerElements"]:
+ kind = element["kind"]
+ key = (kind, element.get("id"))
+ require(key not in elements_seen, "invalid-coverage")
+ elements_seen.add(key)
+ if kind in ("rule", "exception"):
+ require(element["id"] in (rules if kind == "rule" else exceptions), "invalid-coverage")
+ else:
+ require(("applicability" if kind == "applicability" else "fallbackOutcome") in consumer, "invalid-coverage")
+ resolve(coverage["reviewBasis"], material)
+ require(seen == selected, "invalid-coverage")
+ for source in document.get("informationalSources", []):
+ resolve(source, material)
+
+
+def check_document(raw, material):
+ document = read_companion(raw)
+ kind = document.get("kind")
+ require(kind in ("policy", "governing-adoption"), "invalid-document")
+ (check_policy if kind == "policy" else check_adoption)(document, material)
+
+
+def verify_input(raw, registrations, load_material=None):
+ """Check bytes pairs, or acquire each carrier source lazily through a supplied loader."""
+ def check():
+ document = read_companion(raw)
+ require(len(registrations) <= MAX_MATERIALS, "input-over-bound")
+ material = {}
+ for reference, retained in registrations:
+ raw_material = retained if load_material is None else load_material(retained)
+ register_material(reference, raw_material, material)
+ kind = document.get("kind")
+ require(kind in ("policy", "governing-adoption"), "invalid-document")
+ (check_policy if kind == "policy" else check_adoption)(document, material)
+ return result(check)
+
+
+def result(callback):
+ try:
+ callback()
+ except ContractError as error:
+ return {"status": "refused", "code": error.code}
+ return dict(VALID)
+
+
+def read_local(path, limit):
+ try:
+ with path.open("rb") as stream:
+ raw = stream.read(limit + 1)
+ except OSError as error:
+ raise ContractError("missing-material") from error
+ require(len(raw) <= limit, "input-over-bound")
+ return raw
+
+
+def local_path(directory, name, allow_nested=False):
+ require(isinstance(name, str) and "\x00" not in name, "invalid-carrier")
+ try:
+ require(not Path(name).is_absolute(), "invalid-carrier")
+ path = (directory / name).resolve()
+ except (ValueError, OSError, RuntimeError) as error:
+ raise ContractError("invalid-carrier") from error
+ require(path.is_relative_to(directory) if allow_nested else path.parent == directory, "invalid-carrier")
+ return path
+
+
+def load_bundle(directory):
+ """Local synthetic fixture carrier, never a release or dependency-closure protocol."""
+ directory = Path(directory).resolve()
+ manifest = read_json(read_local(directory / "fixture.json", MAX_DOCUMENT_BYTES))
+ check_schema("fixture", manifest)
+ material, by_path = {}, {}
+ for entry in manifest["materials"]:
+ name, reference = entry["path"], entry["content"]
+ require(name not in by_path, "invalid-carrier")
+ path = local_path(directory, name)
+ remaining = MAX_TOTAL_MATERIAL_BYTES - sum(len(value[0]) for value in material.values())
+ limit = MAX_ORIGINAL_BYTES if reference["bytesDigest"] in material else min(MAX_ORIGINAL_BYTES, remaining)
+ raw = read_local(path, limit)
+ register_material(reference, raw, material)
+ by_path[name] = raw
+ for role in ("policy", "consumer", "adoption"):
+ require(manifest[role] in by_path, "missing-material")
+ return manifest, material, by_path
+
+
+def verify_bundle(directory):
+ def check():
+ manifest, material, by_path = load_bundle(directory)
+ policy = read_companion(by_path[manifest["policy"]])
+ check_policy(policy, material)
+ adoption = read_companion(by_path[manifest["adoption"]])
+ check_adoption(adoption, material)
+ policy_content = identity(by_path[manifest["policy"]], "application/json")
+ require(any(item["policy"]["content"] == policy_content for item in adoption["governingPolicies"]), "reference-mismatch")
+ require(adoption["consumer"]["content"] == identity(by_path[manifest["consumer"]], "application/json"), "reference-mismatch")
+ return result(check)
+
+
+def main(argv=None):
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("--capabilities", action="store_true")
+ parser.add_argument("directory", type=Path, nargs="?")
+ args = parser.parse_args(argv)
+ if args.capabilities:
+ answer = CAPABILITY
+ elif args.directory is not None:
+ answer = verify_bundle(args.directory)
+ else:
+ parser.error("supply one fixture directory or --capabilities")
+ print(json.dumps(answer, ensure_ascii=True, separators=(",", ":")))
+ return 1 if answer.get("status") == "refused" else 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/README.md b/internal/policy/official/rfcs/policy-companion-prototype/README.md
new file mode 100644
index 00000000..13f87676
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/README.md
@@ -0,0 +1,259 @@
+# NON-NORMATIVE Policy companion prototype
+
+This directory is review material for [RFC 0023](../0023-policy-companion.md)
+([Spec issue #211](https://github.com/Judgment-Pack/judgment-pack-spec/issues/211)).
+It is **not adopted**, is not a JPS conformance corpus, and creates no supported
+Runtime, Desk, Runner, Gateway or Exchange contract. Its schemas and checks are
+deliberately outside the normative `schema/`, `spec/` and `conformance/` trees.
+Every example is synthetic. No reviewer approved it and no service issued a receipt.
+
+The first slice covers immutable Policy content and a governing adoption for an
+exact Core pack. It makes the portable document part of the four-interface design
+reviewable. Source observation/synchronization, authenticated review/publication
+and run/action admission remain service boundaries; this directory does not model
+those services with fictional permission tokens or purported authorized receipts.
+
+## Proposed selectors and closed schemas
+
+Both proposed documents carry this required wrapper:
+
+```json
+"prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+}
+```
+
+`proposalVersion` selects this review profile, not an adopted format. The proposed
+documents have no `formatVersion` or `specVersion`; unknown selectors and members
+are rejected. Their independent `version` identifies immutable artifact content.
+An adopted selector, migration and capability discovery need a later decision.
+The existing consuming pack keeps its own Core `specVersion` unchanged.
+Revision `0.0.2` changes the closed element-reference grammar and original-source
+bound. The checker refuses `0.0.1`; it does not guess or upgrade an old selector.
+
+| File | Proposed content |
+| --- | --- |
+| [policy.schema.json](policy.schema.json) | Stable URI identity/version/title, declared publication ownership, retained narrative, stable section IDs/anchors and original source provenance |
+| [governing-adoption.schema.json](governing-adoption.schema.json) | Exact consumer pack, one or more exact Policies, explicit scope and per-section coverage |
+| [common.schema.json](common.schema.json) | Closed shared references, profile wrapper, version grammar and narrative anchors |
+
+All defined objects are closed. There is no extension escape hatch, executable
+decision language, workflow language, current lifecycle, ACL, role grant,
+signature, approval assertion, registration or admission permit. Schema `$id`
+URNs identify local prototype schemas; the checker resolves them from disk and
+never fetches an identity or source locator.
+
+## Immutable content and source sections
+
+Policy `content` references the exact retained UTF-8 `text/plain` narrative.
+`sections[].anchor` has `startByte`, `endByte` and `bytesDigest`: a nonempty,
+zero-based, half-open byte range in **that narrative**, with SHA-256 of the range.
+Both endpoints must fall on UTF-8 boundaries. Changing narrative bytes invalidates
+old anchors unless the new bytes and ranges actually match. These offsets are
+never offsets into an original PDF, provider document or unspecified extraction.
+
+`sourceProvenance` separately retains the original content reference,
+provider/account/resource identity and an explicit string-or-null `sourceRevision`.
+That provider revision is opaque; a null means unavailable. Section `sourceRefs`
+name a source's local ID and a human source location, such as `Clause 2`.
+The location is a provenance citation, not a verified PDF offset or executable
+selector. Original bytes can be a PDF or another media type; their byte identity
+is checked, but the prototype neither extracts nor interprets them.
+
+`sourceProvenance` may be empty for newly authored content. The prototype does not
+standardize extraction provenance, optional structured requirements, source
+observations, lifecycle authority mappings or source synchronization. Stable
+section identity across revisions and the fidelity of source-to-narrative
+interpretation still require review; this checker only checks supplied material.
+Anchors need not partition every narrative byte, and may overlap. Checking that
+all meaningful policy clauses are represented is outside these offline checks.
+Optional readable structured requirements and their section references are
+explicitly deferred. A `requirements` member is refused even when presented as
+non-executable text; a later form needs a concrete interchange need, reference
+checks and an explicit selector revision, without a second decision language.
+
+`managementMode` is `desk-managed` or `externally-managed`. It declares intended
+publication ownership and proves no publication, authority or external approval.
+Import as draft creates new Desk-managed content with retained provenance; it is
+not a third approval state or a transfer of source approval.
+
+## Exact adoption and coverage
+
+An artifact reference contains `kind`, `id`, `version` and `content`. The consumer
+kind in this slice is only `pack`; graph composition, transitive dependencies,
+release envelopes, job registration and cycle handling need separate contracts.
+The checker reads the supplied consumer using the existing Core schema, verifies
+its ID/version and exact retained bytes, and resolves implemented coverage to
+declared pack elements. This is neither evaluation nor full Core semantic conformance.
+Core allows arbitrary JSON numbers in optional extensions (§§2.1 and 9), so pack
+reading preserves number literals without imposing the Policy `canon` domain.
+Schema checks use exact decimal/integer values, without binary-float rounding.
+Pack bytes are never reserialized for their execution identity. A requested
+`canonicalIdentity` is checked only when supplied; a Core-valid pack outside
+`jps-canon` can retain its raw identity but cannot supply that canonical identity.
+
+Every governing policy has either `whole-policy` scope or explicit `sections`
+scope. A section scope also retains a `reviewBasis` content reference documenting
+the intended limited interpretation. Coverage includes **exactly one** record
+for every selected section, with no undeclared or out-of-scope section records:
+
+| Coverage status | Required additional content |
+| --- | --- |
+| `implemented` | Nonempty typed pack `consumerElements`, and retained `reviewBasis` |
+| `manual` | Defined `handoff` to a responsible process |
+| `awaiting-interpretation` | `explanation` of unresolved meaning |
+| `awaiting-implementation` | `explanation` of missing implementation |
+| `out-of-scope` | Explicit `rationale` |
+
+`consumerElements` uses this closed discriminated grammar:
+
+| Reference | Exact Core target |
+| --- | --- |
+| `{"kind": "rule", "id": "…"}` | A declared `rules[]` entry with that ID |
+| `{"kind": "exception", "id": "…"}` | A declared `exceptions[]` entry with that ID |
+| `{"kind": "applicability"}` | The present `applicability` condition |
+| `{"kind": "fallback"}` | The present `fallbackOutcome` member, resolving to a declared outcome |
+
+Singleton references have no ID. The checker refuses absent targets, kind/ID
+confusion, unknown IDs and repeated references within a coverage record. Rules
+and exceptions have separate ID namespaces; the same spelling does not select the
+other kind. It checks unique rule/exception/outcome IDs, fallback outcome resolution
+and exception target-rule/outcome references. It does not perform all Core semantic
+checks, evaluate conditions or infer applicability. Evidence requirements, outcomes,
+condition subelements and escalation are unsupported coverage kinds; graphs remain
+unsupported consumers. A clause implemented solely through an exception,
+applicability or fallback can name its actual element without adding dummy rules.
+Core itself still requires a nonempty `rules` array for the consumer's other behavior.
+
+The two uses of `reviewBasis` are retained explanatory bytes, not attestations or
+proof of review. An `out-of-scope` record explains a selected clause's exclusion
+from this implementation; clauses excluded from a limited adoption scope have no
+coverage record. This distinction is proposed for review. Partial automation is
+valid prototype input and never asserts complete automation or permission to run.
+
+Multiple policies are supported from the start, with one entry per stable policy
+identity. The first slice rejects adopting two versions of the same identity in
+one adoption, rather than inventing precedence. Optional `informationalSources`
+retain bytes without becoming governing policies. List order supplies no policy
+precedence or executable dependency. Natural-language consistency, applicability
+and interpretation are not inferred from structurally valid coverage.
+
+## Byte identity and the existing canonical profile
+
+`content` is `{bytesDigest, byteLength, mediaType}`. The digest is lowercase
+`sha256:` plus 64 hexadecimal digits over **exact retained bytes**, including
+whitespace and final newlines. It never hashes a URL or filename.
+
+Media type belongs to the declared content reference, not uniquely to its byte
+digest. An unchanged Markdown original and its plain-text narrative can share
+exact bytes while registering `text/markdown` and `text/plain` references. The
+fixture carrier stores one byte blob per digest with its explicitly registered
+media types. Reusing that digest requires identical bytes; each resolution still
+checks the registered media type, exact digest and byte length. A different media
+type is never accepted merely because the bytes are present. These declarations
+do not authenticate a source or prove its format.
+
+An artifact reference may additionally carry
+`canonicalIdentity: {profile: "jps-canon", canonicalDigest}`. Here `jps-canon` is a
+prototype selector referring directly to the existing Spec
+[Dialect §1 `canon` form](../../spec/dialect.md#1-terms-and-the-canonical-forms),
+defined by [checkpoint witness §1](../../spec/checkpoint-witness.md#1-terms-and-the-canonical-form).
+The review baseline is Spec commit `002ab1908bce`; this selector refers to that
+existing form. This proposal adopts no new canonicalization. The helper imports the repository's
+existing strict reader and `canon` implementation from
+[tools/dialect_verify.py](../../tools/dialect_verify.py).
+
+Raw and canonical identities are separate fields and separate checks. The
+examples retain readable JSON with final newlines, so their artifact byte
+digests **differ** from their canonical digests. Equivalent canonical JSON with
+different whitespace does not satisfy an exact byte reference. `jps-canon` is
+neither a claim of RFC 8785/JCS equivalence nor the preparation canonical form;
+unknown profiles are rejected. There is no self-digest in Policy content or
+adoption, so the references introduce no self-hash cycle.
+
+Digests identify content; they authenticate no author and grant no access.
+Trust roots, signatures, authoritative adoption/publication receipts, revocation,
+cross-installation import authority and live admission remain **unresolved**.
+Nothing in this prototype substitutes for those decisions.
+
+## Proposed bounds and focused checks
+
+Artifact versions use current Spec/Runtime syntax: ASCII `x.y.z`, decimal
+components with no leading zeros except `0`, no suffix/coercion/whitespace, and at
+most **256 total characters**. There is no smaller component integer bound,
+compatibility rule, publication rule or version bump algorithm. The parser's
+integer tuple is only a parsing aid.
+
+For bounded review fixtures, the helper permits at most 262,144 bytes per parsed
+JSON document and nesting depth 32. Narrative, review-basis, artifact-reference and
+informational material remain bounded at 1,048,576 bytes each; parsed artifacts
+also obey the smaller document limit. Retained original source bytes alone may
+reach 4,194,304 bytes. Generic carrier registration permits that original bound;
+each consuming role is separately validated, including direct checker calls.
+An original above the bound refuses the bundle; the checker never truncates it,
+substitutes extraction or drops it while reporting completeness.
+
+The fixture carrier allows at most 16 local material entries and 16,777,216
+distinct retained bytes in total, checked incrementally during loading. Identical
+bytes registered under multiple media types count once; each role still applies
+its own bound. Schemas bound source lists to 16, sections/coverage/scope/element
+references to 64,
+governing policies to 16, local IDs to 128 characters, URIs to 2,048 characters
+and descriptive strings to 4,096 characters. These are **proposed prototype
+bounds**, not new bounds on Core or other adopted companions. Carrier bytes,
+UTF-8 ranges and schema string character counts are distinct measurements.
+
+Strict JSON is checked before schema validation: duplicate members, invalid
+Unicode, a BOM, extra values and non-JSON constants are rejected. Policy/adoption
+and fixture JSON additionally require the existing `canon` numeric domain;
+fractions/exponents and integers outside that domain are rejected there, and `-0`
+follows the profile's existing normalization to `0`. Consumer packs preserve
+Core's numeric domain. Their reader reuses the existing strict reader's limits:
+128 characters per number literal and exponent magnitude at most 308. Exceeding
+those limits reports an unsupported prototype input bound, not invalid Core.
+JSON Schema Draft 2020-12 plus URI format assertion handles
+shape; the helper separately checks exact references, IDs, source/section
+uniqueness, ranges/UTF-8 boundaries, typed element references and exact scope coverage.
+Schema acceptance alone does not establish those reference checks.
+The checker does not reserve an artifact version or detect historical reuse of
+the same ID/version with different content; immutable publication storage is a
+separate contract.
+
+| Synthetic example | Coverage exercised |
+| --- | --- |
+| [Data access](examples/data-access/fixture.json) | Whole policy; eligibility rules and fallback, manual restricted requests, pending audit implementation |
+| [Procurement](examples/procurement/fixture.json) | Declared external ownership; applicability-only purchase scope, limited section scope, unresolved conflict meaning, payment exclusion, public notice outside the selected scope |
+| [Refunds](examples/refunds/fixture.json) | Whole policy; eligibility rules, exception-only damaged-goods routing, manual inspection, pending abuse review implementation |
+
+Each directory contains readable proposed Policy/adoption/pack documents,
+separate narrative/original/review-basis bytes and a `fixture.json` containing
+their reproducible byte identities. That manifest is local test scaffolding,
+**not** a portable release envelope. No domain service transcript is copied here.
+
+From the Spec repository root, use its already pinned dependencies:
+
+```sh
+python3 -m pip install -r requirements-dev.txt
+python3 rfcs/policy-companion-prototype/verify.py
+python3 -m unittest discover -s rfcs/policy-companion-prototype -p 'test_*.py' -v
+```
+
+The [repository workflow](../../.github/workflows/conformance.yml) explicitly runs
+these tests after the full repository check in an exploratory, non-normative step
+on Python 3.12. The existing `discover -s tests` command does not automatically
+discover this RFC directory, so the workflow uses the separate invocation above.
+Passing that step creates no normative corpus or conformance claim. The focused
+tests exercise all three domains,
+multiple policies, exact byte versus canonical identities, unsupported profiles,
+malformed/oversized JSON and versions, unknown/live-authority fields, altered or
+missing material, invalid anchors, source/typed element references and incomplete/conflicting
+coverage, plus Core-valid numeric extensions outside the Policy canonical domain.
+These fixtures reuse this repository's strict reader/canonicalizer. Separate raw
+and canonical vectors, including non-ASCII ordering/escaping, test internal
+agreement only. A second language port by the same author or another Codex review
+does not supply independent evidence. They do not establish independent
+implementation agreement, actual
+approvals, withdrawal ordering, recovery safety or production fitness. Required
+full-repository checks remain the repository CI's responsibility.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/common.schema.json b/internal/policy/official/rfcs/policy-companion-prototype/common.schema.json
new file mode 100644
index 00000000..7109d54e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/common.schema.json
@@ -0,0 +1,203 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:prototype:policy-companion:0.0.2:common",
+ "title": "NON-NORMATIVE common prototype",
+ "description": "Local prototype shared definitions. jps-canon means the existing Spec dialect \u00a71 / checkpoint-witness \u00a71 form, not JCS or preparation canonicalization.",
+ "$ref": "#/$defs/retainedContent",
+ "$defs": {
+ "prototype": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "profile",
+ "proposalVersion",
+ "status"
+ ],
+ "properties": {
+ "profile": {
+ "const": "jps-policy-companion-prototype"
+ },
+ "proposalVersion": {
+ "const": "0.0.2"
+ },
+ "status": {
+ "const": "non-normative"
+ }
+ }
+ },
+ "version": {
+ "type": "string",
+ "minLength": 5,
+ "maxLength": 256,
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?![\\s\\S])"
+ },
+ "text": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 4096
+ },
+ "localId": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?![\\s\\S])"
+ },
+ "uri": {
+ "type": "string",
+ "format": "uri",
+ "minLength": 1,
+ "maxLength": 2048
+ },
+ "content": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1048576
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Narrative, review basis, artifact and informational material: at most 1 MiB."
+ },
+ "canonicalIdentity": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "profile",
+ "canonicalDigest"
+ ],
+ "properties": {
+ "profile": {
+ "const": "jps-canon"
+ },
+ "canonicalDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ }
+ }
+ },
+ "anchor": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "startByte",
+ "endByte",
+ "bytesDigest"
+ ],
+ "properties": {
+ "startByte": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1048576
+ },
+ "endByte": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 1048576
+ },
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ }
+ }
+ },
+ "policyReference": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id",
+ "version",
+ "content"
+ ],
+ "properties": {
+ "kind": {
+ "const": "policy"
+ },
+ "id": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/version"
+ },
+ "content": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/content"
+ },
+ "canonicalIdentity": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/canonicalIdentity"
+ }
+ }
+ },
+ "packReference": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id",
+ "version",
+ "content"
+ ],
+ "properties": {
+ "kind": {
+ "const": "pack"
+ },
+ "id": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/version"
+ },
+ "content": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/content"
+ },
+ "canonicalIdentity": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/canonicalIdentity"
+ }
+ }
+ },
+ "retainedContent": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194304
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Generic fixture-carrier reference; consuming roles impose their own bounds."
+ },
+ "originalContent": {
+ "description": "Exact retained original source bytes: at most 4 MiB; never a replacement for narrative.",
+ "$ref": "#/$defs/retainedContent"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/adoption.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/adoption.json
new file mode 100644
index 00000000..169d8d12
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/adoption.json
@@ -0,0 +1,79 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20e694ca1f99d0b3c8e239fdec3e5d1122dc875986ef5ed3651a52b3fba2473"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:75a7659ed5086c7728af95db0b56b15fdc914a51982b16627fc884cfc9dca50d",
+ "byteLength": 2120,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:c5dd5b9c7455a0404853d9fae748da6ff8d4162d3909f164aebaace78a1c9036"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ },
+ {
+ "kind": "fallback"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "exception-review",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "audit-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/consumer-pack.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/consumer-pack.json
new file mode 100644
index 00000000..a292cbe5
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/consumer-pack.json
@@ -0,0 +1,62 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/pack",
+ "version": "1.0.0",
+ "title": "Data access — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/dataset/deidentified",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/fixture.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/fixture.json
new file mode 100644
index 00000000..420da85e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/fixture.json
@@ -0,0 +1,62 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "synthetic": true,
+ "scenario": "data-access",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:7c649cafae58eb11498332c03a107be64fb7d72fcbedebe2c5da32aa801d55f8",
+ "byteLength": 262,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:c4912216ef58c754473bdda95be7322126ab2970bd75bea9306f342927d974e4",
+ "byteLength": 1558,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:75a7659ed5086c7728af95db0b56b15fdc914a51982b16627fc884cfc9dca50d",
+ "byteLength": 2120,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:f6cf887488c12b0ba5331a048f5a9661a557021f5abfc5662a95524915ec1529",
+ "byteLength": 2459,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/interpretation.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/interpretation.txt
new file mode 100644
index 00000000..4aa6c667
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/interpretation.txt
@@ -0,0 +1,4 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the automated eligibility clause.
+The fallbackOutcome routes an unmatched classification to review; unknown facts escalate.
+Other coverage is stated explicitly.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/narrative.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/narrative.txt
new file mode 100644
index 00000000..bd5e6867
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/narrative.txt
@@ -0,0 +1,10 @@
+SYNTHETIC RFC PROTOTYPE — Data access
+
+Automated release
+Only de-identified datasets may be released through this automated path. Identifiable datasets are refused; missing classification goes to a data steward.
+
+Restricted requests
+A data steward reviews restricted requests through the manual access process. This pack cannot grant an exception.
+
+Quarterly audit
+Review the access log quarterly. A separate audit implementation is still needed.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/policy.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/policy.json
new file mode 100644
index 00000000..1b495166
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/policy.json
@@ -0,0 +1,80 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-prototype/data-access/policy",
+ "version": "1.0.0",
+ "title": "Data access — synthetic policy content",
+ "managementMode": "desk-managed",
+ "content": {
+ "bytesDigest": "sha256:801a0d0969c0ffe5b95d12bbdc593c823a995ea28ccdb894b0beb7de370ba172",
+ "byteLength": 449,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Automated release",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 215,
+ "bytesDigest": "sha256:95eac1de35b93fdd947821f9336f8441a4ae4ffd69473e4ee332951b150c3896"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "exception-review",
+ "title": "Restricted requests",
+ "anchor": {
+ "startByte": 215,
+ "endByte": 351,
+ "bytesDigest": "sha256:d2f664a5c4e515f11a5e05c0a2be36d4de7600b0b2d4f33f81dfafed55b441e8"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "audit-review",
+ "title": "Quarterly audit",
+ "anchor": {
+ "startByte": 351,
+ "endByte": 449,
+ "bytesDigest": "sha256:7f4e8c2f9f2a9ad8f3276c6610f9e9a140833edfd9b46dbf825a1638ab8b6a6e"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "data-access-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:9a4f335306e2a8e4fbcf73f5a5bad14f45369fa22985756181eeb8ea1ee217dd",
+ "byteLength": 433,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/source.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/source.txt
new file mode 100644
index 00000000..794f4622
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/data-access/source.txt
@@ -0,0 +1,5 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: Only de-identified datasets may be released through this automated path. Identifiable datasets are refused; missing classification goes to a data steward.
+Clause 2: A data steward reviews restricted requests through the manual access process. This pack cannot grant an exception.
+Clause 3: Review the access log quarterly. A separate audit implementation is still needed.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/adoption.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/adoption.json
new file mode 100644
index 00000000..0507342f
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/adoption.json
@@ -0,0 +1,101 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:205a2afdc68ebd46d5b022256fadec6bd071bc8e34faff481f288c20df008f60"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:e9bbe247d5aa7537aef08c951b88c0881e381046e357abaa05ea255e208ee852",
+ "byteLength": 2899,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:de729c1b41c1acc8f9d71d54b657fe4396c4447a05b49b6a753a4b99429b73b3"
+ }
+ },
+ "scope": {
+ "kind": "sections",
+ "sectionIds": [
+ "eligibility",
+ "conflict-review",
+ "invoice-payment",
+ "purchase-scope"
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "conflict-review",
+ "status": "awaiting-interpretation",
+ "explanation": "Synthetic open work item: agree the conflict threshold before implementation."
+ },
+ {
+ "sectionId": "invoice-payment",
+ "status": "out-of-scope",
+ "rationale": "This pack assesses eligibility only; treasury payment reconciliation is a separate process."
+ },
+ {
+ "sectionId": "purchase-scope",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "applicability"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/consumer-pack.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/consumer-pack.json
new file mode 100644
index 00000000..0745b386
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/consumer-pack.json
@@ -0,0 +1,68 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/pack",
+ "version": "1.0.0",
+ "title": "Procurement — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/procurement/competitiveProcedureDocumented",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/procurement/competitiveProcedureDocumented",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "applicability": {
+ "op": "fact",
+ "path": "/request/kind",
+ "operator": "equals",
+ "value": "purchase"
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/fixture.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/fixture.json
new file mode 100644
index 00000000..43ecd770
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/fixture.json
@@ -0,0 +1,62 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "synthetic": true,
+ "scenario": "procurement",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:14e401b11a917a3275bc18c2d85f547bfd71cf34a706e160ec54621603b36de2",
+ "byteLength": 402,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:d810d8b3972a4bbc31cd3deb7ada4de965f1ad59bf753cec6748f943213cbcee",
+ "byteLength": 1725,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:e9bbe247d5aa7537aef08c951b88c0881e381046e357abaa05ea255e208ee852",
+ "byteLength": 2899,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:b5b94a06dba7d12748fe3f854bdb5e5da9c14736aeff8d7416e94946891fd063",
+ "byteLength": 3162,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/interpretation.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/interpretation.txt
new file mode 100644
index 00000000..cc2bd1f5
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/interpretation.txt
@@ -0,0 +1,5 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the competitive-procedure clause.
+The applicability condition alone implements purchase scope; it is not a rule ID.
+Missing facts need review. Other coverage is stated explicitly.
+The selected scope includes eligibility, conflict review, invoice payment and purchase scope; public notice is excluded.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/narrative.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/narrative.txt
new file mode 100644
index 00000000..646937a8
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/narrative.txt
@@ -0,0 +1,16 @@
+SYNTHETIC RFC PROTOTYPE — Procurement
+
+Competitive procedure
+Automated eligibility requires a documented competitive procedure. A missing record requires a procurement reviewer.
+
+Supplier conflicts
+Supplier relationships require a conflict review. The threshold for a material relationship needs clarification.
+
+Invoice payment
+Treasury performs payment reconciliation outside this eligibility interpretation.
+
+Public notice
+Publish the award notice through the separate communications process.
+
+Purchase scope
+This eligibility pack applies only to purchase requests; other requests remain outside this automated path.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/policy.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/policy.json
new file mode 100644
index 00000000..d9ae140e
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/policy.json
@@ -0,0 +1,110 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-prototype/procurement/policy",
+ "version": "1.0.0",
+ "title": "Procurement — synthetic policy content",
+ "managementMode": "externally-managed",
+ "content": {
+ "bytesDigest": "sha256:993a73c70afdc16c94368982d1e951c85c90838d1f750a7001c2942dc9834b94",
+ "byteLength": 621,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Competitive procedure",
+ "anchor": {
+ "startByte": 41,
+ "endByte": 181,
+ "bytesDigest": "sha256:a8d58fa560d792bbc0848b517b47a04d01fa928a4315de4be423d9756745714f"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "conflict-review",
+ "title": "Supplier conflicts",
+ "anchor": {
+ "startByte": 181,
+ "endByte": 314,
+ "bytesDigest": "sha256:ed53cc9edccb33c00c4692bcc84593e249117f9dbc4045d57e5e8f85458c7c94"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "invoice-payment",
+ "title": "Invoice payment",
+ "anchor": {
+ "startByte": 314,
+ "endByte": 413,
+ "bytesDigest": "sha256:f6803f2ffa7356a3aad889d20987a00614d8145193c521107845092745db9d1d"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ },
+ {
+ "id": "public-notice",
+ "title": "Public notice",
+ "anchor": {
+ "startByte": 413,
+ "endByte": 497,
+ "bytesDigest": "sha256:b6d68243578efb748244d55bcfe5f7bb730faa1c939c6a910f4e6e26b79b34f9"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 4"
+ }
+ ]
+ },
+ {
+ "id": "purchase-scope",
+ "title": "Purchase scope",
+ "anchor": {
+ "startByte": 498,
+ "endByte": 621,
+ "bytesDigest": "sha256:13498f448247cfd988d4d59046ae766abb0559cf902093cdf8f650543f37ed26"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 5"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "procurement-original"
+ },
+ "sourceRevision": "fictional-revision-a",
+ "content": {
+ "bytesDigest": "sha256:4681b36d52396d3faef09e4a7c551d829920362beb47a1bfb32c2d6c4d82763b",
+ "byteLength": 591,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/source.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/source.txt
new file mode 100644
index 00000000..c5913acb
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/procurement/source.txt
@@ -0,0 +1,7 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: Automated eligibility requires a documented competitive procedure. A missing record requires a procurement reviewer.
+Clause 2: Supplier relationships require a conflict review. The threshold for a material relationship needs clarification.
+Clause 3: Treasury performs payment reconciliation outside this eligibility interpretation.
+Clause 4: Publish the award notice through the separate communications process.
+Clause 5: This eligibility pack applies only to purchase requests; other requests remain outside this automated path.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/adoption.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/adoption.json
new file mode 100644
index 00000000..4f879faf
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/adoption.json
@@ -0,0 +1,91 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "kind": "governing-adoption",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/adoption",
+ "version": "1.0.0",
+ "consumer": {
+ "kind": "pack",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/pack",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:d20723faedbed6ee066dd3330e4b72848702e92dfbeb68b757f6ed0a95e4a2c5"
+ }
+ },
+ "governingPolicies": [
+ {
+ "policy": {
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/policy",
+ "version": "1.0.0",
+ "content": {
+ "bytesDigest": "sha256:5391763b2d9a72533e7566cce910a43cb5ab740dd0587d7383f3adf153ba9970",
+ "byteLength": 2476,
+ "mediaType": "application/json"
+ },
+ "canonicalIdentity": {
+ "profile": "jps-canon",
+ "canonicalDigest": "sha256:7ec48ee560d0b8ff893b04b597076d8db1fe5c5e4874b9bec683d59232d3c005"
+ }
+ },
+ "scope": {
+ "kind": "whole-policy"
+ },
+ "coverage": [
+ {
+ "sectionId": "eligibility",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "rule",
+ "id": "eligible"
+ },
+ {
+ "kind": "rule",
+ "id": "ineligible"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "sectionId": "damaged-goods",
+ "status": "manual",
+ "handoff": "Fictional specialist uses the documented manual review queue; this statement grants no role or access."
+ },
+ {
+ "sectionId": "fraud-review",
+ "status": "awaiting-implementation",
+ "explanation": "Synthetic open work item: develop and review a separate implementation."
+ },
+ {
+ "sectionId": "damaged-routing",
+ "status": "implemented",
+ "consumerElements": [
+ {
+ "kind": "exception",
+ "id": "damaged-routing"
+ }
+ ],
+ "reviewBasis": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/consumer-pack.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/consumer-pack.json
new file mode 100644
index 00000000..07323779
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/consumer-pack.json
@@ -0,0 +1,76 @@
+{
+ "specVersion": "0.2.0-draft",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/pack",
+ "version": "1.0.0",
+ "title": "Refunds — synthetic interpretation",
+ "description": "Synthetic RFC material only. No operational authorization or external action.",
+ "decision": {
+ "intent": "Apply the retained automated eligibility clause.",
+ "question": "Is this request eligible for the automated path?"
+ },
+ "outcomes": [
+ {
+ "id": "eligible",
+ "label": "Eligible for review"
+ },
+ {
+ "id": "ineligible",
+ "label": "Ineligible"
+ },
+ {
+ "id": "review",
+ "label": "Human review needed"
+ }
+ ],
+ "rules": [
+ {
+ "id": "eligible",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/withinReturnWindow",
+ "operator": "equals",
+ "value": true
+ },
+ "outcome": "eligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ },
+ {
+ "id": "ineligible",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/withinReturnWindow",
+ "operator": "equals",
+ "value": false
+ },
+ "outcome": "ineligible",
+ "onUnknown": "escalate",
+ "description": "Synthetic interpretation of the retained automated eligibility clause."
+ }
+ ],
+ "fallbackOutcome": "review",
+ "escalation": {
+ "triggers": [
+ "unknown",
+ "no-match"
+ ],
+ "target": {
+ "kind": "human-role",
+ "name": "Synthetic reviewer"
+ }
+ },
+ "exceptions": [
+ {
+ "id": "damaged-routing",
+ "description": "Route damaged goods to review; this does not perform the manual inspection.",
+ "when": {
+ "op": "fact",
+ "path": "/purchase/damaged",
+ "operator": "equals",
+ "value": true
+ },
+ "effect": "escalate",
+ "onUnknown": "escalate"
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/fixture.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/fixture.json
new file mode 100644
index 00000000..d14c2c71
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/fixture.json
@@ -0,0 +1,62 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "synthetic": true,
+ "scenario": "refunds",
+ "materials": [
+ {
+ "path": "narrative.txt",
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "source.txt",
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "interpretation.txt",
+ "content": {
+ "bytesDigest": "sha256:63f58f37957f808e98c67db11ac9d835286733336e47ae24f28b974d431b9862",
+ "byteLength": 301,
+ "mediaType": "text/plain"
+ }
+ },
+ {
+ "path": "consumer-pack.json",
+ "content": {
+ "bytesDigest": "sha256:2a049f10cd8c5d4fc81200976507a8563d0bc1fca19fa9691fc1601507512e38",
+ "byteLength": 1924,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "policy.json",
+ "content": {
+ "bytesDigest": "sha256:5391763b2d9a72533e7566cce910a43cb5ab740dd0587d7383f3adf153ba9970",
+ "byteLength": 2476,
+ "mediaType": "application/json"
+ }
+ },
+ {
+ "path": "adoption.json",
+ "content": {
+ "bytesDigest": "sha256:fd474eed584ae6305ea535bf1d044734f8d754fcc907b0d28b65a318b5ea4b5d",
+ "byteLength": 2836,
+ "mediaType": "application/json"
+ }
+ }
+ ],
+ "policy": "policy.json",
+ "consumer": "consumer-pack.json",
+ "adoption": "adoption.json"
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/interpretation.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/interpretation.txt
new file mode 100644
index 00000000..61258de1
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/interpretation.txt
@@ -0,0 +1,4 @@
+SYNTHETIC REVIEW BASIS; no person approved this fixture.
+The eligible and ineligible rules interpret the return-window clause.
+The damaged-routing exception alone routes damaged goods to a specialist; physical inspection remains manual.
+Missing facts need review. Other coverage is stated explicitly.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/narrative.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/narrative.txt
new file mode 100644
index 00000000..1cf4b905
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/narrative.txt
@@ -0,0 +1,13 @@
+SYNTHETIC RFC PROTOTYPE — Refunds
+
+Return window
+The automated path accepts only purchases within the published return window. Missing purchase dates require a returns specialist.
+
+Damaged goods
+A returns specialist handles damaged goods through the manual inspection process.
+
+Fraud review
+Potential repeated-claim abuse needs a separate reviewed implementation.
+
+Damaged goods routing
+Damaged goods bypass automated eligibility and go to a returns specialist for manual inspection.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/policy.json b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/policy.json
new file mode 100644
index 00000000..65b8a294
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/policy.json
@@ -0,0 +1,95 @@
+{
+ "prototype": {
+ "profile": "jps-policy-companion-prototype",
+ "proposalVersion": "0.0.2",
+ "status": "non-normative"
+ },
+ "kind": "policy",
+ "id": "https://example.invalid/policy-companion-prototype/refunds/policy",
+ "version": "1.0.0",
+ "title": "Refunds — synthetic policy content",
+ "managementMode": "desk-managed",
+ "content": {
+ "bytesDigest": "sha256:909d57f27b7359c777dfb2ea07d859408a13504bf8dded27807889f7cde52969",
+ "byteLength": 486,
+ "mediaType": "text/plain"
+ },
+ "sections": [
+ {
+ "id": "eligibility",
+ "title": "Return window",
+ "anchor": {
+ "startByte": 37,
+ "endByte": 183,
+ "bytesDigest": "sha256:838ea4e242523a398e18a4006aa1488cc2032eb23f503f2c2dc2539339cc757a"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 1"
+ }
+ ]
+ },
+ {
+ "id": "damaged-goods",
+ "title": "Damaged goods",
+ "anchor": {
+ "startByte": 183,
+ "endByte": 280,
+ "bytesDigest": "sha256:ac0263d8b10debc2e8fb9090bb1b55c80a5766a4d192f23f0f640062ba5c82d4"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 2"
+ }
+ ]
+ },
+ {
+ "id": "fraud-review",
+ "title": "Fraud review",
+ "anchor": {
+ "startByte": 280,
+ "endByte": 366,
+ "bytesDigest": "sha256:9117339f1340e981a232894965d79f3f2a9f8116ffc347142c7dc7d9bc2631c3"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 3"
+ }
+ ]
+ },
+ {
+ "id": "damaged-routing",
+ "title": "Damaged goods routing",
+ "anchor": {
+ "startByte": 367,
+ "endByte": 486,
+ "bytesDigest": "sha256:a47d45dfa15bb16514328ff9e1de346be10d045a194597e6c44e1f598ab17ab1"
+ },
+ "sourceRefs": [
+ {
+ "sourceId": "retained-original",
+ "location": "Clause 4"
+ }
+ ]
+ }
+ ],
+ "sourceProvenance": [
+ {
+ "id": "retained-original",
+ "source": {
+ "provider": "synthetic-fixture",
+ "accountId": "fictional-organization",
+ "resourceId": "refunds-original"
+ },
+ "sourceRevision": null,
+ "content": {
+ "bytesDigest": "sha256:ae72534013fc75083b184765e7a558b71b5e4674720aa56e8960844fd712c6c0",
+ "byteLength": 474,
+ "mediaType": "text/plain"
+ }
+ }
+ ]
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/source.txt b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/source.txt
new file mode 100644
index 00000000..614029ef
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/examples/refunds/source.txt
@@ -0,0 +1,6 @@
+SYNTHETIC ORIGINAL SOURCE; NOT AN APPROVED POLICY
+
+Clause 1: The automated path accepts only purchases within the published return window. Missing purchase dates require a returns specialist.
+Clause 2: A returns specialist handles damaged goods through the manual inspection process.
+Clause 3: Potential repeated-claim abuse needs a separate reviewed implementation.
+Clause 4: Damaged goods bypass automated eligibility and go to a returns specialist for manual inspection.
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/governing-adoption.schema.json b/internal/policy/official/rfcs/policy-companion-prototype/governing-adoption.schema.json
new file mode 100644
index 00000000..c5b1541d
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/governing-adoption.schema.json
@@ -0,0 +1,265 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:prototype:policy-companion:0.0.2:governing-adoption",
+ "title": "NON-NORMATIVE governing-adoption prototype",
+ "description": "Immutable interpretation/coverage proposal for one exact pack. No authorization, registration, release envelope, graph support or live eligibility.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "prototype",
+ "kind",
+ "id",
+ "version",
+ "consumer",
+ "governingPolicies"
+ ],
+ "properties": {
+ "prototype": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/prototype"
+ },
+ "kind": {
+ "const": "governing-adoption"
+ },
+ "id": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/version"
+ },
+ "consumer": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/packReference"
+ },
+ "governingPolicies": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "policy",
+ "scope",
+ "coverage"
+ ],
+ "properties": {
+ "policy": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/policyReference"
+ },
+ "scope": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind"
+ ],
+ "properties": {
+ "kind": {
+ "const": "whole-policy"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "sectionIds",
+ "reviewBasis"
+ ],
+ "properties": {
+ "kind": {
+ "const": "sections"
+ },
+ "sectionIds": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ }
+ },
+ "reviewBasis": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/content"
+ }
+ }
+ }
+ ]
+ },
+ "coverage": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "consumerElements",
+ "reviewBasis"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "status": {
+ "const": "implemented"
+ },
+ "consumerElements": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "#/$defs/consumerElement"
+ }
+ },
+ "reviewBasis": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/content"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "handoff"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "status": {
+ "const": "manual"
+ },
+ "handoff": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "explanation"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "status": {
+ "const": "awaiting-interpretation"
+ },
+ "explanation": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "explanation"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "status": {
+ "const": "awaiting-implementation"
+ },
+ "explanation": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "rationale"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "status": {
+ "const": "out-of-scope"
+ },
+ "rationale": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "informationalSources": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/content"
+ }
+ }
+ },
+ "$defs": {
+ "consumerElement": {
+ "description": "Exact declared Core rule/exception by ID, or the present applicability/fallbackOutcome singleton without a fabricated ID. Other element kinds are unsupported.",
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id"
+ ],
+ "properties": {
+ "kind": {
+ "enum": [
+ "rule",
+ "exception"
+ ]
+ },
+ "id": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind"
+ ],
+ "properties": {
+ "kind": {
+ "enum": [
+ "applicability",
+ "fallback"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/policy.schema.json b/internal/policy/official/rfcs/policy-companion-prototype/policy.schema.json
new file mode 100644
index 00000000..aa045b97
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/policy.schema.json
@@ -0,0 +1,147 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "urn:jps:prototype:policy-companion:0.0.2:policy",
+ "title": "NON-NORMATIVE policy prototype",
+ "description": "Immutable content/provenance proposal only. managementMode declares intended publication ownership; no imported approval, lifecycle, ACL or rule semantics. Optional readable structured requirements are deferred; a requirements member is unsupported.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "prototype",
+ "kind",
+ "id",
+ "version",
+ "title",
+ "managementMode",
+ "content",
+ "sections",
+ "sourceProvenance"
+ ],
+ "properties": {
+ "prototype": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/prototype"
+ },
+ "kind": {
+ "const": "policy"
+ },
+ "id": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/uri"
+ },
+ "version": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/version"
+ },
+ "title": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ },
+ "managementMode": {
+ "enum": [
+ "desk-managed",
+ "externally-managed"
+ ]
+ },
+ "content": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/content"
+ },
+ "sections": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "title",
+ "anchor"
+ ],
+ "properties": {
+ "id": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "title": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ },
+ "anchor": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/anchor"
+ },
+ "sourceRefs": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sourceId",
+ "location"
+ ],
+ "properties": {
+ "sourceId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "location": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "sourceProvenance": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "source",
+ "sourceRevision",
+ "content"
+ ],
+ "properties": {
+ "id": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/localId"
+ },
+ "source": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "provider",
+ "accountId",
+ "resourceId"
+ ],
+ "properties": {
+ "provider": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ },
+ "accountId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ },
+ "resourceId": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ }
+ }
+ },
+ "sourceRevision": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/text"
+ }
+ ]
+ },
+ "content": {
+ "$ref": "urn:jps:prototype:policy-companion:0.0.2:common#/$defs/originalContent"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/test_prototype.py b/internal/policy/official/rfcs/policy-companion-prototype/test_prototype.py
new file mode 100644
index 00000000..1993ee57
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/test_prototype.py
@@ -0,0 +1,511 @@
+"""Targeted proposal checks, intentionally outside the normative test/corpus trees."""
+
+import copy
+import json
+import unittest
+from decimal import Decimal
+from pathlib import Path
+from tempfile import TemporaryDirectory
+
+import verify as v
+
+
+class PrototypeTests(unittest.TestCase):
+ def setUp(self):
+ self.manifest, self.material, self.policy, self.adoption = v.load_bundle(v.HERE / "examples" / "data-access")
+
+ def reject(self, callback, text=None):
+ with self.assertRaises(v.PrototypeError) as caught:
+ callback()
+ if text:
+ self.assertIn(text, str(caught.exception))
+
+ def retain(self, document):
+ raw = (json.dumps(document, ensure_ascii=False, indent=2) + "\n").encode("utf-8")
+ content = v.identity(raw, "application/json")
+ v.register_material(content, raw, self.material)
+ return content
+
+ def consumer(self):
+ return v.read_json(v.resolve(self.adoption["consumer"]["content"], self.material))
+
+ def retain_consumer(self, document):
+ reference = self.adoption["consumer"]
+ reference["content"] = self.retain(document)
+ reference["canonicalIdentity"] = v.canonical_identity(v.resolve(reference["content"], self.material))
+
+ def test_three_synthetic_domains_and_all_coverage_states(self):
+ states, kinds = set(), set()
+ for directory in sorted((v.HERE / "examples").iterdir()):
+ with self.subTest(domain=directory.name):
+ self.assertEqual(v.verify_bundle(directory), directory.name)
+ _, _, _, adoption = v.load_bundle(directory)
+ states.update(item["status"] for item in adoption["governingPolicies"][0]["coverage"])
+ kinds.update(element["kind"] for item in adoption["governingPolicies"][0]["coverage"] for element in item.get("consumerElements", []))
+ self.assertEqual(states, {"implemented", "manual", "awaiting-interpretation", "awaiting-implementation", "out-of-scope"})
+ self.assertEqual(kinds, {"rule", "exception", "applicability", "fallback"})
+
+ def test_version_grammar_and_current_256_character_bound(self):
+ for value in ("0.0.0", "10.2.300", "9" * 252 + ".0.0"):
+ with self.subTest(valid=value):
+ v.parse_version(value)
+ self.policy["version"] = value
+ v.check_schema("policy", self.policy)
+ for value in (True, 1, "", "1.0", "01.0.0", "1.00.0", "1.0.01", "-1.0.0", "1.0.0-rc.1", "1.0.0+build", "1.0.0\n", " 1.0.0", "١.0.0", "9" * 253 + ".0.0"):
+ with self.subTest(invalid=value):
+ self.reject(lambda: v.parse_version(value), "invalid artifact version")
+ self.policy["version"] = value
+ self.reject(lambda: v.check_schema("policy", self.policy), "schema")
+
+ def test_strict_json_and_canon_domain_before_schema(self):
+ for raw in (b'{"a":1,"a":2}', b'"\\ud800"', b'\xef\xbb\xbf{}', b'{}{}', b'1.0', b'1e2', b'9007199254740992', b'NaN', b'"\xff"'):
+ with self.subTest(raw=raw):
+ self.reject(lambda: v.read_json(raw), "invalid JSON/canon domain")
+ self.assertEqual(v.read_json(b'{"zero":-0}'), {"zero": 0})
+ self.reject(lambda: v.read_json(b"[" * 33 + b"0" + b"]" * 33), "invalid JSON/canon domain")
+ self.reject(lambda: v.read_json(b" " * (v.MAX_DOCUMENT_BYTES + 1)), "byte bound")
+
+ def test_profile_is_explicitly_unadopted_and_exact(self):
+ for field, value in (("status", "adopted"), ("proposalVersion", "0.0.1"), ("proposalVersion", "0.0.3"), ("profile", "unknown-profile")):
+ changed = copy.deepcopy(self.policy)
+ changed["prototype"][field] = value
+ self.reject(lambda: v.check_schema("policy", changed), "schema")
+ changed = copy.deepcopy(self.adoption)
+ changed["prototype"][field] = value
+ self.reject(lambda: v.check_adoption(changed, self.material), "schema")
+ for field in ("formatVersion", "specVersion", "proposalVersion"):
+ changed = copy.deepcopy(self.policy)
+ changed[field] = "0.0.2"
+ self.reject(lambda: v.check_schema("policy", changed), "schema")
+
+ def test_closed_objects_refuse_live_authority_and_decision_language(self):
+ for field in ("approved", "published", "effectiveAt", "permissions", "signatures", "rules", "requirements"):
+ changed = copy.deepcopy(self.policy)
+ changed[field] = True
+ self.reject(lambda: v.check_schema("policy", changed), "schema")
+ self.policy["sourceProvenance"][0]["source"]["credential"] = "fictional"
+ self.reject(lambda: v.check_schema("policy", self.policy), "schema")
+ self.adoption["governingPolicies"][0]["coverage"][0]["authorized"] = True
+ self.reject(lambda: v.check_schema("governing-adoption", self.adoption), "schema")
+
+ def test_readable_structured_requirements_are_explicitly_unsupported(self):
+ self.policy["requirements"] = [{"id": "retention", "sectionId": "eligibility", "text": "Keep a record."}]
+ self.reject(lambda: v.check_policy(self.policy, self.material), "schema")
+ del self.policy["requirements"]
+ self.policy["sections"][0]["requirements"] = ["Keep a record."]
+ self.reject(lambda: v.check_policy(self.policy, self.material), "schema")
+
+ def test_uri_digest_and_integer_assertions(self):
+ for field, value in (("id", "not an absolute URI"), ("content", {"bytesDigest": "sha256:" + "A" * 64, "byteLength": 1, "mediaType": "text/plain"}), ("content", {"bytesDigest": "sha256:" + "a" * 64, "byteLength": True, "mediaType": "text/plain"})):
+ changed = copy.deepcopy(self.policy)
+ changed[field] = value
+ self.reject(lambda: v.check_schema("policy", changed), "schema")
+
+ def test_original_bytes_are_separate_from_narrative_offsets(self):
+ original = b"%PDF-synthetic-original-\xff"
+ content = v.identity(original, "application/pdf")
+ v.register_material(content, original, self.material)
+ self.policy["sourceProvenance"][0]["content"] = content
+ v.check_policy(self.policy, self.material)
+ self.assertNotEqual(content, self.policy["content"])
+
+ def test_original_role_accepts_four_mib_and_other_roles_keep_one_mib(self):
+ raw = b"x" * v.MAX_ORIGINAL_BYTES
+ original = v.identity(raw, "text/plain")
+ v.register_material(original, raw, self.material)
+ self.policy["sourceProvenance"][0]["content"] = original
+ v.check_policy(self.policy, self.material)
+ self.assertEqual(v.resolve(original, self.material, v.MAX_ORIGINAL_BYTES), raw)
+ self.reject(lambda: v.resolve(original, self.material), "role byte bound")
+ # The same digest can serve multiple roles only within each role's bound.
+ self.policy["content"] = original
+ self.reject(lambda: v.check_policy(self.policy, self.material), "schema")
+ coverage = self.adoption["governingPolicies"][0]["coverage"][0]
+ basis = coverage["reviewBasis"]
+ coverage["reviewBasis"] = original
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "schema")
+ coverage["reviewBasis"] = basis
+ self.adoption["informationalSources"] = [original]
+ self.reject(lambda: v.check_schema("governing-adoption", self.adoption), "schema")
+ oversized = v.identity(raw + b"x", "application/pdf")
+ self.reject(lambda: v.register_material(oversized, raw + b"x", self.material), "schema")
+ self.policy["sourceProvenance"][0]["content"] = oversized
+ self.reject(lambda: v.check_schema("policy", self.policy), "schema")
+
+ def test_narrative_review_and_informational_role_boundaries(self):
+ narrative = v.resolve(self.policy["content"], self.material)
+ raw = narrative + b" " * (v.MAX_MATERIAL_BYTES - len(narrative))
+ content = v.identity(raw, "text/plain")
+ v.register_material(content, raw, self.material)
+ self.policy["content"] = content
+ v.check_policy(self.policy, self.material)
+ coverage = self.adoption["governingPolicies"][0]["coverage"][0]
+ coverage["reviewBasis"] = content
+ self.adoption["informationalSources"] = [content]
+ v.check_adoption(self.adoption, self.material)
+ overflow = v.identity(raw + b" ", "text/plain")
+ v.register_material(overflow, raw + b" ", self.material)
+ for role in ("narrative", "review", "informational"):
+ with self.subTest(role=role):
+ changed_policy = copy.deepcopy(self.policy)
+ changed_adoption = copy.deepcopy(self.adoption)
+ if role == "narrative":
+ changed_policy["content"] = overflow
+ self.reject(lambda: v.check_policy(changed_policy, self.material), "schema")
+ else:
+ if role == "review":
+ changed_adoption["governingPolicies"][0]["coverage"][0]["reviewBasis"] = overflow
+ else:
+ changed_adoption["informationalSources"] = [overflow]
+ self.reject(lambda: v.check_adoption(changed_adoption, self.material), "schema")
+
+ def test_registration_aggregate_counts_blob_once_and_rejects_overflow_atomically(self):
+ material = {}
+ for index in range(4):
+ raw = bytes([index]) * v.MAX_ORIGINAL_BYTES
+ v.register_material(v.identity(raw, "application/pdf"), raw, material)
+ raw = material[next(iter(material))][0]
+ second_type = v.identity(raw, "text/plain")
+ v.register_material(second_type, raw, material)
+ self.assertEqual(len(material), 4)
+ self.assertEqual(v.resolve(second_type, material, v.MAX_ORIGINAL_BYTES), raw)
+ overflow = v.identity(b"x", "text/plain")
+ self.reject(lambda: v.register_material(overflow, b"x", material), "aggregate retained byte bound")
+ self.assertNotIn(overflow["bytesDigest"], material)
+ malformed = {**second_type, "byteLength": True}
+ self.reject(lambda: v.register_material(malformed, raw, material), "schema")
+ self.reject(lambda: v.resolve(malformed, material), "schema")
+
+ def test_fixture_loader_aggregate_boundary_and_oversized_original_refusal(self):
+ manifest = copy.deepcopy(self.manifest)
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ for entry in manifest["materials"]:
+ (directory / entry["path"]).write_bytes(v.resolve(entry["content"], self.material))
+ remaining = v.MAX_TOTAL_MATERIAL_BYTES - sum(len(value[0]) for value in self.material.values())
+ for index in range(4):
+ length = min(v.MAX_ORIGINAL_BYTES, remaining)
+ raw = bytes([index]) * length
+ name = "retained-%s.pdf" % index
+ (directory / name).write_bytes(raw)
+ manifest["materials"].append({"path": name, "content": v.identity(raw, "application/pdf")})
+ remaining -= length
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ _, material, _, _ = v.load_bundle(directory)
+ self.assertEqual(sum(len(value[0]) for value in material.values()), v.MAX_TOTAL_MATERIAL_BYTES)
+ # A second registered type for the same bytes does not spend more budget.
+ duplicate = copy.deepcopy(manifest["materials"][-1])
+ duplicate["path"] = "same-bytes.txt"
+ duplicate["content"]["mediaType"] = "text/plain"
+ (directory / duplicate["path"]).write_bytes(material[duplicate["content"]["bytesDigest"]][0])
+ manifest["materials"].append(duplicate)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ v.load_bundle(directory)
+ extra = {"path": "overflow.pdf", "content": v.identity(b"x", "application/pdf")}
+ (directory / extra["path"]).write_bytes(b"x")
+ manifest["materials"].append(extra)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ self.reject(lambda: v.load_bundle(directory), "aggregate retained byte bound")
+ manifest["materials"] = [extra]
+ raw = b"x" * (v.MAX_ORIGINAL_BYTES + 1)
+ extra["content"] = v.identity(raw, "application/pdf")
+ (directory / extra["path"]).write_bytes(raw)
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ self.reject(lambda: v.load_bundle(directory), "schema")
+ extra["content"]["byteLength"] = v.MAX_ORIGINAL_BYTES
+ (directory / "fixture.json").write_text(json.dumps(manifest))
+ self.reject(lambda: v.load_bundle(directory), "local file byte bound")
+
+ def test_identical_markdown_original_and_plain_narrative_bundle(self):
+ manifest = copy.deepcopy(self.manifest)
+ payloads = {entry["path"]: v.resolve(entry["content"], self.material) for entry in manifest["materials"]}
+ narrative = v.resolve(self.policy["content"], self.material)
+ original = self.policy["sourceProvenance"][0]["content"]
+ source_entry = next(entry for entry in manifest["materials"] if entry["content"] == original)
+ source_entry["path"] = "original.md"
+ source_entry["content"] = v.identity(narrative, "text/markdown")
+ payloads["original.md"] = narrative
+ policy = copy.deepcopy(self.policy)
+ policy["sourceProvenance"][0]["content"] = source_entry["content"]
+ policy_raw = (json.dumps(policy, ensure_ascii=False, indent=2) + "\n").encode("utf-8")
+ payloads[manifest["policy"]] = policy_raw
+ adoption = copy.deepcopy(self.adoption)
+ reference = adoption["governingPolicies"][0]["policy"]
+ reference["content"] = v.identity(policy_raw, "application/json")
+ reference["canonicalIdentity"] = v.canonical_identity(policy_raw)
+ payloads[manifest["adoption"]] = (json.dumps(adoption, ensure_ascii=False, indent=2) + "\n").encode("utf-8")
+ with TemporaryDirectory() as temporary:
+ directory = Path(temporary)
+ for entry in manifest["materials"]:
+ raw = payloads[entry["path"]]
+ entry["content"] = v.identity(raw, entry["content"]["mediaType"])
+ (directory / entry["path"]).write_bytes(raw)
+ (directory / "fixture.json").write_text(json.dumps(manifest), encoding="utf-8")
+ self.assertEqual(v.verify_bundle(directory), "data-access")
+ _, material, loaded, _ = v.load_bundle(directory)
+ self.assertEqual(v.resolve(loaded["content"], material), narrative)
+ self.assertEqual(v.resolve(loaded["sourceProvenance"][0]["content"], material), narrative)
+
+ def test_material_requires_registered_media_type_and_exact_length(self):
+ content = self.policy["content"]
+ raw = v.resolve(content, self.material)
+ markdown = v.identity(raw, "text/markdown")
+ self.reject(lambda: v.resolve(markdown, self.material), "unregistered retained material media type")
+ v.register_material(markdown, raw, self.material)
+ self.assertEqual(v.resolve(markdown, self.material), raw)
+ self.assertEqual(v.resolve(content, self.material), raw)
+ html = v.identity(raw, "text/html")
+ self.reject(lambda: v.resolve(html, self.material), "unregistered retained material media type")
+ wrong_length = {**markdown, "byteLength": len(raw) + 1}
+ self.reject(lambda: v.resolve(wrong_length, self.material), "byte identity")
+ self.reject(lambda: v.register_material(wrong_length, raw, self.material), "byte identity")
+
+ def test_material_registration_rejects_conflicting_bytes_and_wrong_digest(self):
+ content = self.policy["content"]
+ raw = v.resolve(content, self.material)
+ markdown = v.identity(raw, "text/markdown")
+ self.reject(lambda: v.register_material(markdown, raw + b"changed", self.material), "conflicting retained material bytes")
+ self.reject(lambda: v.resolve(markdown, self.material), "unregistered retained material media type")
+ self.assertEqual(v.resolve(content, self.material), raw)
+ wrong_digest = {**markdown, "bytesDigest": "sha256:" + "0" * 64}
+ self.reject(lambda: v.register_material(wrong_digest, raw, self.material), "byte identity")
+ self.reject(lambda: v.resolve(wrong_digest, self.material), "missing retained material")
+
+ def test_non_utf8_policy_narrative_is_refused(self):
+ raw = b"\xff"
+ content = v.identity(raw, "text/plain")
+ v.register_material(content, raw, self.material)
+ self.policy["content"] = content
+ self.reject(lambda: v.check_policy(self.policy, self.material), "narrative is not UTF-8")
+
+ def test_missing_and_altered_retained_bytes_refused(self):
+ self.policy["content"]["bytesDigest"] = "sha256:" + "0" * 64
+ self.reject(lambda: v.check_policy(self.policy, self.material), "missing retained material")
+ _, material, policy, _ = v.load_bundle(v.HERE / "examples" / "data-access")
+ key = policy["content"]["bytesDigest"]
+ material[key] = (material[key][0] + b"changed", {"text/plain"})
+ self.reject(lambda: v.check_policy(policy, material), "byte identity")
+
+ def test_anchor_range_digest_and_utf8_boundaries(self):
+ raw = v.resolve(self.policy["content"], self.material)
+ unicode_start = raw.index("—".encode("utf-8"))
+ for start, end, expected in ((0, len(raw) + 1, "outside narrative"), (10, 10, "outside narrative"), (unicode_start + 1, unicode_start + 2, "splits a UTF-8 sequence"), (0, 5, "anchor digest mismatch")):
+ changed = copy.deepcopy(self.policy)
+ changed["sections"][0]["anchor"].update({"startByte": start, "endByte": end})
+ self.reject(lambda: v.check_policy(changed, self.material), expected)
+
+ def test_duplicate_section_source_and_unresolved_source_refs(self):
+ changed = copy.deepcopy(self.policy)
+ duplicate = copy.deepcopy(changed["sections"][0]); duplicate["title"] = "Different title"
+ changed["sections"].append(duplicate)
+ self.reject(lambda: v.check_policy(changed, self.material), "duplicate section")
+ changed = copy.deepcopy(self.policy)
+ duplicate = copy.deepcopy(changed["sourceProvenance"][0]); duplicate["sourceRevision"] = "different"
+ changed["sourceProvenance"].append(duplicate)
+ self.reject(lambda: v.check_policy(changed, self.material), "duplicate source")
+ self.policy["sections"][0]["sourceRefs"][0]["sourceId"] = "missing"
+ self.reject(lambda: v.check_policy(self.policy, self.material), "unknown section source")
+
+ def test_exact_consumer_identity_and_rule_refs(self):
+ for field, value in (("id", "urn:example:other-pack"), ("version", "2.0.0")):
+ changed = copy.deepcopy(self.adoption)
+ changed["consumer"][field] = value
+ self.reject(lambda: v.check_adoption(changed, self.material), "artifact identity mismatch")
+ self.adoption["governingPolicies"][0]["coverage"][0]["consumerElements"][0]["id"] = "missing-rule"
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "unknown consumer rule")
+
+ def test_each_typed_element_can_alone_cover_a_section(self):
+ pack = self.consumer()
+ pack["applicability"] = {"op": "literal", "value": True}
+ pack["exceptions"] = [{"id": "route-review", "description": "Synthetic review routing", "when": {"op": "literal", "value": False}, "effect": "escalate", "onUnknown": "escalate"}]
+ self.retain_consumer(pack)
+ coverage = self.adoption["governingPolicies"][0]["coverage"][0]
+ for element in ({"kind": "rule", "id": "eligible"}, {"kind": "exception", "id": "route-review"}, {"kind": "applicability"}, {"kind": "fallback"}):
+ with self.subTest(element=element):
+ coverage["consumerElements"] = [element]
+ v.check_adoption(self.adoption, self.material)
+
+ def test_element_grammar_refuses_kind_id_confusion_and_unsupported_kinds(self):
+ for element in ({"kind": "applicability", "id": "eligible"}, {"kind": "fallback", "id": "review"}, {"kind": "rule"}, {"kind": "exception"}, {"kind": "rule", "id": "eligible", "path": "/rules/0"}, {"kind": "outcome", "id": "review"}, {"kind": "evidenceRequirement", "id": "record"}, {"kind": "condition"}, {"kind": "escalation"}, {"kind": "fallbackOutcome"}):
+ with self.subTest(element=element):
+ self.adoption["governingPolicies"][0]["coverage"][0]["consumerElements"] = [element]
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "schema")
+
+ def test_absent_singletons_and_unknown_exception_references_refuse(self):
+ pack = self.consumer()
+ del pack["fallbackOutcome"]
+ self.retain_consumer(pack)
+ coverage = self.adoption["governingPolicies"][0]["coverage"][0]
+ for element, message in (({"kind": "fallback"}, "missing consumer fallback"), ({"kind": "applicability"}, "missing consumer applicability"), ({"kind": "exception", "id": "eligible"}, "unknown consumer exception")):
+ coverage["consumerElements"] = [element]
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), message)
+
+ def test_rule_and_exception_ids_have_separate_namespaces(self):
+ pack = self.consumer()
+ pack["exceptions"] = [{"id": "eligible", "description": "Different element with a shared local spelling", "when": {"op": "literal", "value": False}, "effect": "suppress-rule", "targetRule": "eligible", "onUnknown": "ignore"}]
+ self.retain_consumer(pack)
+ coverage = self.adoption["governingPolicies"][0]["coverage"][0]
+ coverage["consumerElements"] = [{"kind": "rule", "id": "eligible"}, {"kind": "exception", "id": "eligible"}]
+ v.check_adoption(self.adoption, self.material)
+ pack["exceptions"][0]["id"] = "exception-only"
+ self.retain_consumer(pack)
+ coverage["consumerElements"] = [{"kind": "rule", "id": "exception-only"}]
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "unknown consumer rule")
+
+ def test_duplicate_element_references_refuse_in_one_record(self):
+ pack = self.consumer()
+ pack["applicability"] = {"op": "literal", "value": True}
+ pack["exceptions"] = [{"id": "review-routing", "description": "Synthetic routing", "when": {"op": "literal", "value": False}, "effect": "escalate", "onUnknown": "ignore"}]
+ self.retain_consumer(pack)
+ coverage = self.adoption["governingPolicies"][0]["coverage"][0]
+ for element in ({"kind": "rule", "id": "eligible"}, {"kind": "exception", "id": "review-routing"}, {"kind": "applicability"}, {"kind": "fallback"}):
+ with self.subTest(element=element):
+ coverage["consumerElements"] = [element, copy.deepcopy(element)]
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "schema")
+
+ def test_consumer_duplicate_ids_and_dangling_executable_targets_refuse(self):
+ original = self.consumer()
+ original["exceptions"] = [{"id": "review-routing", "description": "Synthetic routing", "when": {"op": "literal", "value": False}, "effect": "escalate", "onUnknown": "ignore"}]
+ for collection, text in (("rules", "consumer rule"), ("exceptions", "consumer exception"), ("outcomes", "consumer outcome")):
+ with self.subTest(collection=collection):
+ pack = copy.deepcopy(original)
+ duplicate = copy.deepcopy(pack[collection][0])
+ duplicate["description"] = "Distinct object reusing the same ID"
+ pack[collection].append(duplicate)
+ self.retain_consumer(pack)
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "duplicate " + text)
+ for member, effect, text in (("targetRule", "suppress-rule", "exception target rule"), ("outcome", "force-outcome", "exception outcome")):
+ pack = copy.deepcopy(original)
+ pack["exceptions"][0].update({"effect": effect, member: "missing"})
+ self.retain_consumer(pack)
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "unknown consumer " + text)
+ pack = copy.deepcopy(original)
+ pack["fallbackOutcome"] = "missing"
+ self.retain_consumer(pack)
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "unknown consumer fallback outcome")
+ pack = copy.deepcopy(original)
+ pack["exceptions"][0]["outcome"] = "eligible" # Core forbids outcome on escalate.
+ self.retain_consumer(pack)
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "core schema")
+
+ def test_consumer_element_reference_count_boundary(self):
+ pack = self.consumer()
+ rule = pack["rules"][0]
+ pack["rules"] = [{**copy.deepcopy(rule), "id": "rule-%s" % index} for index in range(64)]
+ self.retain_consumer(pack)
+ coverage = self.adoption["governingPolicies"][0]["coverage"][0]
+ coverage["consumerElements"] = [{"kind": "rule", "id": item["id"]} for item in pack["rules"]]
+ v.check_adoption(self.adoption, self.material)
+ coverage["consumerElements"].append({"kind": "fallback"})
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "schema")
+
+ def test_raw_and_canonical_identities_are_not_interchangeable(self):
+ reference = self.adoption["consumer"]
+ raw = v.resolve(reference["content"], self.material)
+ compact = v.spec_canon.canon(v.read_json(raw))
+ self.assertNotEqual(v.spec_canon.digest_of(raw), v.spec_canon.digest_of(compact))
+ self.assertEqual(reference["canonicalIdentity"]["canonicalDigest"], v.spec_canon.digest_of(compact))
+ content = v.identity(compact, "application/json")
+ material = {}
+ v.register_material(content, compact, material)
+ self.reject(lambda: v.check_artifact(reference, "pack", material), "missing retained material")
+ reference["content"] = content
+ v.check_artifact(reference, "pack", material)
+
+ def test_non_ascii_key_order_and_escaping_keep_raw_and_canon_vectors_separate(self):
+ raw = b'{ "\\u00e9": "line\\n", "a": "\\u00e9", "\\ud83d\\ude00": "slash/" }\n'
+ expected = '{"a":"é","é":"line\\n","😀":"slash/"}'.encode("utf-8")
+ canonical = v.spec_canon.canon(v.read_json(raw))
+ self.assertEqual(canonical, expected)
+ self.assertNotEqual(v.identity(raw, "application/json"), v.identity(expected, "application/json"))
+ self.assertEqual(v.canonical_identity(raw), v.canonical_identity(expected))
+
+ def test_canonical_identity_optional_but_checked_when_present(self):
+ for reference in (self.adoption["consumer"], self.adoption["governingPolicies"][0]["policy"]):
+ del reference["canonicalIdentity"]
+ v.check_adoption(self.adoption, self.material)
+ reference = self.adoption["consumer"]
+ reference["canonicalIdentity"] = {"profile": "jps-canon", "canonicalDigest": "sha256:" + "0" * 64}
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "canonical identity mismatch")
+ reference["canonicalIdentity"]["profile"] = "jcs"
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "schema")
+
+ def test_core_valid_optional_numeric_extension_needs_no_canon_identity(self):
+ # Core §§2.1 and 9 permit RFC8259 numbers in optional arbitrary JSON values.
+ reference = self.adoption["consumer"]
+ original = v.resolve(reference["content"], self.material)
+ raw = original.rstrip()[:-1] + b',"extensions":{"com.example.numeric-notes":{"fraction":1.234567890123456789,"exponent":1e2,"large":9007199254740992}}}\n'
+ # Independently assert the unchanged Core schema accepts this extension.
+ core = json.loads(raw, parse_float=Decimal)
+ v.VALIDATORS["core"].validate(core)
+ parsed = v.read_core_json(raw)
+ numbers = parsed["extensions"]["com.example.numeric-notes"]
+ self.assertEqual(numbers["fraction"].literal, "1.234567890123456789")
+ self.assertEqual(numbers["exponent"].literal, "1e2")
+ self.assertEqual(numbers["large"].literal, "9007199254740992")
+ view = v.core_schema_view(parsed)["extensions"]["com.example.numeric-notes"]
+ self.assertEqual(view, {"fraction": Decimal("1.234567890123456789"), "exponent": 100, "large": 9007199254740992})
+ reference["content"] = v.identity(raw, "application/json")
+ v.register_material(reference["content"], raw, self.material)
+ del reference["canonicalIdentity"]
+ v.check_adoption(self.adoption, self.material)
+ self.assertEqual(v.resolve(reference["content"], self.material), raw)
+ reference["canonicalIdentity"] = {"profile": "jps-canon", "canonicalDigest": "sha256:" + "0" * 64}
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "unsupported requested jps-canon identity")
+
+ def test_consumer_numeric_limits_are_explicit_prototype_bounds(self):
+ for raw in (b'{"value":1e309}', b'{"value":' + b"1" * 129 + b"}"):
+ self.reject(lambda: v.read_core_json(raw), "unsupported prototype consumer bound")
+ self.reject(lambda: v.read_core_json(b'{"value":1,"value":2}'), "invalid consumer JSON")
+
+ def test_coverage_must_cover_exact_declared_scope_once(self):
+ governing = self.adoption["governingPolicies"][0]
+ removed = governing["coverage"].pop()
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "omits an in-scope section")
+ governing["coverage"].append(removed)
+ duplicate = {"sectionId": "eligibility", "status": "manual", "handoff": "Fictional manual process"}
+ governing["coverage"].append(duplicate)
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "duplicate section coverage")
+ governing["coverage"].pop()
+ governing["scope"] = {"kind": "sections", "sectionIds": ["eligibility"], "reviewBasis": governing["coverage"][0]["reviewBasis"]}
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "coverage outside declared scope")
+ governing["scope"]["sectionIds"] = ["missing"]
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "unknown section")
+
+ def test_coverage_variant_requires_explanation_and_no_wrong_fields(self):
+ for record in ({"sectionId": "eligibility", "status": "implemented", "consumerElements": []}, {"sectionId": "eligibility", "status": "manual"}, {"sectionId": "eligibility", "status": "out-of-scope"}, {"sectionId": "eligibility", "status": "awaiting-implementation"}, {"sectionId": "eligibility", "status": "awaiting-interpretation"}, {"sectionId": "eligibility", "status": "manual", "handoff": "Fictional queue", "consumerElements": [{"kind": "rule", "id": "eligible"}]}):
+ changed = copy.deepcopy(self.adoption)
+ changed["governingPolicies"][0]["coverage"][0] = record
+ self.reject(lambda: v.check_schema("governing-adoption", changed), "schema")
+
+ def test_review_basis_must_be_retained_not_an_approval_claim(self):
+ self.adoption["governingPolicies"][0]["coverage"][0]["reviewBasis"]["bytesDigest"] = "sha256:" + "0" * 64
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "missing retained material")
+
+ def test_informational_source_cannot_replace_governing_dependency(self):
+ self.adoption["informationalSources"] = [self.policy["content"]]
+ v.check_adoption(self.adoption, self.material)
+ self.adoption["governingPolicies"] = []
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "schema")
+
+ def test_pack_only_first_slice_refuses_graphs(self):
+ self.adoption["consumer"]["kind"] = "graph"
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "schema")
+
+ def test_multiple_policy_references_with_independent_identities(self):
+ other = copy.deepcopy(self.policy)
+ other["id"] = "urn:example:synthetic-second-policy"
+ content = self.retain(other)
+ governing = copy.deepcopy(self.adoption["governingPolicies"][0])
+ governing["policy"] = {"kind": "policy", "id": other["id"], "version": other["version"], "content": content}
+ self.adoption["governingPolicies"].append(governing)
+ v.check_adoption(self.adoption, self.material)
+ duplicate = copy.deepcopy(governing)
+ duplicate["scope"] = {"kind": "sections", "sectionIds": ["eligibility"], "reviewBasis": governing["coverage"][0]["reviewBasis"]}
+ duplicate["coverage"] = duplicate["coverage"][:1]
+ self.adoption["governingPolicies"].append(duplicate)
+ self.reject(lambda: v.check_adoption(self.adoption, self.material), "duplicate governing policy")
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/internal/policy/official/rfcs/policy-companion-prototype/verify.py b/internal/policy/official/rfcs/policy-companion-prototype/verify.py
new file mode 100644
index 00000000..a42c6a80
--- /dev/null
+++ b/internal/policy/official/rfcs/policy-companion-prototype/verify.py
@@ -0,0 +1,308 @@
+#!/usr/bin/env python3
+"""Offline checks for a NON-NORMATIVE RFC prototype; no authority or service calls."""
+
+import argparse
+import json
+import re
+import sys
+from pathlib import Path
+
+from jsonschema import Draft202012Validator, FormatChecker
+from referencing import Registry, Resource
+
+HERE = Path(__file__).resolve().parent
+ROOT = HERE.parents[1]
+sys.dont_write_bytecode = True
+sys.path.insert(0, str(ROOT / "tools"))
+import dialect_verify as spec_canon # Existing Spec strict reader and canon, not a new profile.
+
+MAX_DOCUMENT_BYTES = 262144
+MAX_MATERIAL_BYTES = 1048576
+MAX_ORIGINAL_BYTES = 4194304
+MAX_TOTAL_MATERIAL_BYTES = 16777216
+MAX_DEPTH = 32
+VERSION = re.compile(r"(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)", re.ASCII)
+PROFILE = {"profile": "jps-policy-companion-prototype", "proposalVersion": "0.0.2", "status": "non-normative"}
+
+
+class PrototypeError(ValueError):
+ pass
+
+
+def require(condition, message):
+ if not condition:
+ raise PrototypeError(message)
+
+
+def read_local(path, limit, message="local file byte bound exceeded"):
+ with path.open("rb") as stream:
+ data = stream.read(limit + 1)
+ require(len(data) <= limit, message)
+ return data
+
+
+def parse_version(value):
+ """Current artifact grammar/bound; no component limit or compatibility policy."""
+ require(isinstance(value, str) and len(value) <= 256 and VERSION.fullmatch(value), "invalid artifact version")
+ return tuple(int(component) for component in value.split("."))
+
+
+def plain(value):
+ if isinstance(value, spec_canon.Num):
+ return int(value.literal)
+ if isinstance(value, dict):
+ return {key: plain(child) for key, child in value.items()}
+ if isinstance(value, list):
+ return [plain(child) for child in value]
+ return value
+
+
+def read_json(data):
+ require(len(data) <= MAX_DOCUMENT_BYTES, "document byte bound exceeded")
+ try:
+ value = spec_canon.read_document(data, "prototype document", MAX_DEPTH)
+ spec_canon.canon(value) # Refuse floats/exponents/unsafe integers before conversion.
+ return plain(value)
+ except (spec_canon.Refused, spec_canon.OutsideDomain, UnicodeError) as error:
+ raise PrototypeError("invalid JSON/canon domain: " + str(error)) from error
+
+
+def read_core_json(data):
+ """Read exact Core numbers as literals; Core does not require the canon domain."""
+ require(len(data) <= MAX_DOCUMENT_BYTES, "unsupported prototype consumer byte bound")
+ try:
+ return spec_canon.read_document(data, "consumer pack", MAX_DEPTH)
+ except spec_canon.Refused as error:
+ detail = "unsupported prototype consumer bound" if error.name == "input-over-bound" else "invalid consumer JSON"
+ raise PrototypeError(detail + ": " + str(error)) from error
+
+
+def core_schema_view(value):
+ """Exact numeric values for JSON Schema; retain literals/raw bytes separately."""
+ if isinstance(value, spec_canon.Num):
+ number = value.value # Decimal constructed from the literal, with no float rounding.
+ return int(number) if number == number.to_integral_value() else number
+ if isinstance(value, dict):
+ return {key: core_schema_view(child) for key, child in value.items()}
+ if isinstance(value, list):
+ return [core_schema_view(child) for child in value]
+ return value
+
+
+def identity(data, media_type):
+ return {"bytesDigest": spec_canon.digest_of(data), "byteLength": len(data), "mediaType": media_type}
+
+
+def canonical_identity(data):
+ try:
+ value = read_json(data)
+ except PrototypeError as error:
+ raise PrototypeError("unsupported requested jps-canon identity: " + str(error)) from error
+ return {"profile": "jps-canon", "canonicalDigest": spec_canon.digest_of(spec_canon.canon(value))}
+
+
+def validators():
+ schemas = {name: read_json((HERE / (name + ".schema.json")).read_bytes()) for name in ("common", "policy", "governing-adoption")}
+ registry = Registry().with_resources((schema["$id"], Resource.from_contents(schema)) for schema in schemas.values())
+ schemas["core"] = read_json((ROOT / "schema/judgment-pack-core.schema.json").read_bytes())
+ checker = FormatChecker()
+ require("uri" in checker.checkers, "install requirements-dev.txt URI format dependencies")
+ require(not checker.conforms("not a URI", "uri"), "URI assertion unavailable")
+ result = {}
+ for name, schema in schemas.items():
+ Draft202012Validator.check_schema(schema)
+ result[name] = Draft202012Validator(schema, registry=registry, format_checker=checker)
+ return result
+
+
+VALIDATORS = None
+
+
+def check_schema(name, document):
+ global VALIDATORS
+ if VALIDATORS is None:
+ VALIDATORS = validators()
+ schema_view = core_schema_view(document) if name == "core" else document
+ errors = sorted(VALIDATORS[name].iter_errors(schema_view), key=lambda error: str(list(error.path)))
+ if errors:
+ error = errors[0]
+ raise PrototypeError("%s schema %s: %s" % (name, list(error.path), error.message))
+
+
+def unique_by_id(items, what):
+ result = {}
+ for item in items:
+ require(item["id"] not in result, "duplicate " + what + " id")
+ result[item["id"]] = item
+ return result
+
+
+def register_material(reference, raw, material):
+ """Register a typed reference; a shared byte digest need not have one media type."""
+ check_schema("common", reference)
+ key = reference["bytesDigest"]
+ entry = material.get(key)
+ require(entry is None or entry[0] == raw, "conflicting retained material bytes")
+ require(identity(raw, reference["mediaType"]) == reference, "retained byte identity/media type mismatch")
+ total = sum(len(value[0]) for value in material.values())
+ require(total + (len(raw) if entry is None else 0) <= MAX_TOTAL_MATERIAL_BYTES,
+ "aggregate retained byte bound exceeded")
+ media_types = {reference["mediaType"]}
+ if entry is not None:
+ media_types.update(entry[1])
+ material[key] = (entry[0] if entry is not None else raw, media_types)
+
+
+def resolve(reference, material, limit=MAX_MATERIAL_BYTES):
+ # Carrier registration does not grant permission to exceed a consuming role's bound.
+ check_schema("common", reference)
+ require(reference["byteLength"] <= limit, "retained material role byte bound exceeded")
+ entry = material.get(reference["bytesDigest"])
+ require(entry is not None, "missing retained material")
+ require(reference["mediaType"] in entry[1], "unregistered retained material media type")
+ require(identity(entry[0], reference["mediaType"]) == reference, "retained byte identity/media type mismatch")
+ return entry[0]
+
+
+def check_artifact(reference, kind, material):
+ require(reference["kind"] == kind, "wrong artifact kind")
+ parse_version(reference["version"])
+ require(reference["content"]["mediaType"] == "application/json", "artifact is not JSON")
+ raw = resolve(reference["content"], material)
+ document = read_core_json(raw) if kind == "pack" else read_json(raw)
+ require(isinstance(document, dict), "artifact JSON root is not an object")
+ require(reference["id"] == document.get("id") and reference["version"] == document.get("version"), "artifact identity mismatch")
+ if "canonicalIdentity" in reference:
+ require(reference["canonicalIdentity"] == canonical_identity(raw), "canonical identity mismatch")
+ return document
+
+
+def check_policy(document, material):
+ check_schema("policy", document)
+ parse_version(document["version"])
+ narrative = resolve(document["content"], material)
+ require(document["content"]["mediaType"] == "text/plain", "narrative must be text/plain")
+ try:
+ narrative.decode("utf-8")
+ except UnicodeError as error:
+ raise PrototypeError("narrative is not UTF-8") from error
+ sources = unique_by_id(document["sourceProvenance"], "source")
+ for source in sources.values():
+ resolve(source["content"], material, MAX_ORIGINAL_BYTES) # Never narrative offsets.
+ sections = unique_by_id(document["sections"], "section")
+ for section in sections.values():
+ anchor = section["anchor"]
+ start, end = anchor["startByte"], anchor["endByte"]
+ require(0 <= start < end <= len(narrative), "section range outside narrative")
+ try:
+ narrative[:start].decode("utf-8")
+ narrative[start:end].decode("utf-8")
+ except UnicodeError as error:
+ raise PrototypeError("section range splits a UTF-8 sequence") from error
+ require(spec_canon.digest_of(narrative[start:end]) == anchor["bytesDigest"], "section anchor digest mismatch")
+ for source_ref in section.get("sourceRefs", []):
+ require(source_ref["sourceId"] in sources, "unknown section source")
+ return sections
+
+
+def check_adoption(document, material):
+ check_schema("governing-adoption", document)
+ parse_version(document["version"])
+ consumer = check_artifact(document["consumer"], "pack", material)
+ check_schema("core", consumer) # Existing Core schema unchanged; no evaluator claim.
+ rules = unique_by_id(consumer["rules"], "consumer rule")
+ exceptions = unique_by_id(consumer.get("exceptions", []), "consumer exception")
+ outcomes = unique_by_id(consumer["outcomes"], "consumer outcome")
+ if "fallbackOutcome" in consumer:
+ require(consumer["fallbackOutcome"] in outcomes, "unknown consumer fallback outcome")
+ for exception in exceptions.values():
+ if "targetRule" in exception:
+ require(exception["targetRule"] in rules, "unknown consumer exception target rule")
+ if "outcome" in exception:
+ require(exception["outcome"] in outcomes, "unknown consumer exception outcome")
+ policies = set()
+ for governing in document["governingPolicies"]:
+ reference = governing["policy"]
+ policy = check_artifact(reference, "policy", material)
+ sections = check_policy(policy, material)
+ require(reference["id"] not in policies, "duplicate governing policy identity")
+ policies.add(reference["id"])
+ scope = governing["scope"]
+ selected = set(sections) if scope["kind"] == "whole-policy" else set(scope["sectionIds"])
+ require(selected.issubset(sections), "scope references unknown section")
+ if scope["kind"] == "sections":
+ resolve(scope["reviewBasis"], material)
+ seen = set()
+ for coverage in governing["coverage"]:
+ section_id = coverage["sectionId"]
+ require(section_id in selected, "coverage outside declared scope")
+ require(section_id not in seen, "duplicate section coverage")
+ seen.add(section_id)
+ if coverage["status"] == "implemented":
+ elements_seen = set()
+ for element in coverage["consumerElements"]:
+ kind = element["kind"]
+ key = (kind, element.get("id"))
+ require(key not in elements_seen, "duplicate consumer element reference")
+ elements_seen.add(key)
+ if kind in ("rule", "exception"):
+ collection = rules if kind == "rule" else exceptions
+ require(element["id"] in collection, "unknown consumer " + kind)
+ else:
+ member = "applicability" if kind == "applicability" else "fallbackOutcome"
+ require(member in consumer, "missing consumer " + kind)
+ resolve(coverage["reviewBasis"], material)
+ require(seen == selected, "coverage omits an in-scope section")
+ for source in document.get("informationalSources", []):
+ resolve(source, material)
+
+
+def load_bundle(directory):
+ """Fixture manifest is local test scaffolding, not a portable release envelope."""
+ directory = Path(directory).resolve()
+ manifest = read_json(read_local(directory / "fixture.json", MAX_DOCUMENT_BYTES))
+ require(set(manifest) == {"prototype", "synthetic", "scenario", "materials", "policy", "consumer", "adoption"}, "unknown/missing fixture member")
+ require(manifest["prototype"] == PROFILE and manifest["synthetic"] is True, "fixture must be explicitly synthetic and non-normative")
+ require(isinstance(manifest["materials"], list) and 1 <= len(manifest["materials"]) <= 16, "fixture material count bound")
+ material, by_path = {}, {}
+ for entry in manifest["materials"]:
+ require(set(entry) == {"path", "content"}, "unknown/missing material member")
+ name = entry["path"]
+ require(isinstance(name, str), "material path is not a string")
+ path = (directory / name).resolve()
+ require(path.parent == directory and not Path(name).is_absolute(), "material must be a local fixture file")
+ require(name not in by_path, "duplicate material path")
+ check_schema("common", entry["content"])
+ existing = entry["content"]["bytesDigest"] in material
+ remaining = MAX_TOTAL_MATERIAL_BYTES - sum(len(value[0]) for value in material.values())
+ limit = MAX_ORIGINAL_BYTES if existing else min(MAX_ORIGINAL_BYTES, remaining)
+ message = "aggregate retained byte bound exceeded" if limit < MAX_ORIGINAL_BYTES else "local file byte bound exceeded"
+ raw = read_local(path, limit, message)
+ register_material(entry["content"], raw, material)
+ by_path[name] = material[entry["content"]["bytesDigest"]][0]
+ for name in ("policy", "consumer", "adoption"):
+ require(isinstance(manifest[name], str) and manifest[name] in by_path, "missing fixture document")
+ return manifest, material, read_json(by_path[manifest["policy"]]), read_json(by_path[manifest["adoption"]])
+
+
+def verify_bundle(directory):
+ manifest, material, policy, adoption = load_bundle(directory)
+ check_policy(policy, material)
+ check_adoption(adoption, material)
+ expected_policy = identity(read_local(Path(directory) / manifest["policy"], MAX_DOCUMENT_BYTES), "application/json")
+ require(any(item["policy"]["content"] == expected_policy for item in adoption["governingPolicies"]), "fixture policy is not adopted")
+ expected_consumer = identity(read_local(Path(directory) / manifest["consumer"], MAX_DOCUMENT_BYTES), "application/json")
+ require(adoption["consumer"]["content"] == expected_consumer, "fixture consumer differs from adopted pack")
+ return manifest["scenario"]
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument("directories", type=Path, nargs="*")
+ args = parser.parse_args()
+ directories = args.directories or sorted((HERE / "examples").iterdir())
+ try:
+ names = [verify_bundle(directory) for directory in directories]
+ except (PrototypeError, OSError) as error:
+ parser.exit(1, "Prototype check failed: %s\n" % error)
+ print("Checked %s synthetic prototype bundles; no live authority or conformance claim." % len(names))
diff --git a/internal/policy/official/schema/judgment-pack-core.schema.json b/internal/policy/official/schema/judgment-pack-core.schema.json
new file mode 100644
index 00000000..09672519
--- /dev/null
+++ b/internal/policy/official/schema/judgment-pack-core.schema.json
@@ -0,0 +1,578 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://judgmentpack.org/schema/0.2.0-draft/judgment-pack-core.schema.json",
+ "title": "Judgment Pack Core",
+ "description": "Research-preview structural schema. Conformance does not establish truth, authority, safety, or operational fitness.",
+ "$comment": "JPS structural conformance requires uri, date, and date-time format assertions even when a general-purpose validator treats format as annotation-only.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "specVersion",
+ "id",
+ "version",
+ "title",
+ "decision",
+ "outcomes",
+ "rules"
+ ],
+ "properties": {
+ "specVersion": {
+ "const": "0.2.0-draft"
+ },
+ "id": {
+ "type": "string",
+ "format": "uri",
+ "minLength": 1
+ },
+ "version": {
+ "type": "string",
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
+ },
+ "title": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "decision": {
+ "$ref": "#/$defs/decision"
+ },
+ "applicability": {
+ "$ref": "#/$defs/condition"
+ },
+ "evidenceRequirements": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/evidenceRequirement"
+ },
+ "uniqueItems": true
+ },
+ "sources": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/source"
+ },
+ "uniqueItems": true
+ },
+ "outcomes": {
+ "type": "array",
+ "minItems": 2,
+ "items": {
+ "$ref": "#/$defs/outcome"
+ },
+ "uniqueItems": true
+ },
+ "rules": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/$defs/rule"
+ },
+ "uniqueItems": true
+ },
+ "exceptions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/exception"
+ },
+ "uniqueItems": true
+ },
+ "fallbackOutcome": {
+ "$ref": "#/$defs/localId"
+ },
+ "escalation": {
+ "$ref": "#/$defs/escalation"
+ },
+ "metadata": {
+ "$ref": "#/$defs/metadata"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ },
+ "$defs": {
+ "nonEmptyString": {
+ "type": "string",
+ "minLength": 1
+ },
+ "localId": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
+ },
+ "decimalString": {
+ "type": "string",
+ "pattern": "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$"
+ },
+ "extensions": {
+ "type": "object",
+ "propertyNames": {
+ "pattern": "^(?!org\\.judgmentpack\\.)[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9-]*)+$"
+ },
+ "additionalProperties": true
+ },
+ "decision": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["intent", "question"],
+ "properties": {
+ "intent": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "question": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "evidenceRequirement": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "description", "required"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "required": {
+ "type": "boolean"
+ },
+ "kind": {
+ "enum": ["document", "fact", "measurement", "attestation"]
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "source": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "title", "locator"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "title": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "publisher": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "publishedAt": {
+ "type": "string",
+ "format": "date"
+ },
+ "locator": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["kind", "value"],
+ "properties": {
+ "kind": {
+ "enum": ["uri", "repository", "path", "other"]
+ },
+ "value": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ },
+ "citation": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["location", "excerpt"],
+ "properties": {
+ "location": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "excerpt": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ },
+ "rights": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "outcome": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "label"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "label": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "rule": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "description", "when", "outcome", "onUnknown"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "when": {
+ "$ref": "#/$defs/condition"
+ },
+ "outcome": {
+ "$ref": "#/$defs/localId"
+ },
+ "onUnknown": {
+ "enum": ["ignore", "escalate"]
+ },
+ "evidenceRequirementRefs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/localId"
+ },
+ "uniqueItems": true
+ },
+ "sourceRefs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/localId"
+ },
+ "uniqueItems": true
+ },
+ "rationale": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "exception": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "description", "when", "effect", "onUnknown"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "when": {
+ "$ref": "#/$defs/condition"
+ },
+ "effect": {
+ "enum": ["suppress-rule", "force-outcome", "escalate"]
+ },
+ "targetRule": {
+ "$ref": "#/$defs/localId"
+ },
+ "outcome": {
+ "$ref": "#/$defs/localId"
+ },
+ "onUnknown": {
+ "enum": ["ignore", "escalate"]
+ },
+ "sourceRefs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/localId"
+ },
+ "uniqueItems": true
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "effect": {
+ "const": "suppress-rule"
+ }
+ },
+ "required": ["effect"]
+ },
+ "then": {
+ "required": ["targetRule"],
+ "not": {
+ "required": ["outcome"]
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "effect": {
+ "const": "force-outcome"
+ }
+ },
+ "required": ["effect"]
+ },
+ "then": {
+ "required": ["outcome"],
+ "not": {
+ "required": ["targetRule"]
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "effect": {
+ "const": "escalate"
+ }
+ },
+ "required": ["effect"]
+ },
+ "then": {
+ "not": {
+ "anyOf": [
+ { "required": ["outcome"] },
+ { "required": ["targetRule"] }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "escalation": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["triggers", "target"],
+ "properties": {
+ "triggers": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "not-applicable",
+ "missing-required-evidence",
+ "unknown",
+ "conflict",
+ "no-match"
+ ]
+ }
+ },
+ "target": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["kind", "name"],
+ "properties": {
+ "kind": {
+ "enum": ["human-role", "queue", "system"]
+ },
+ "name": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ },
+ "message": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "authors": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "uniqueItems": true
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "license": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "requiredExtensions": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^(?!org\\.judgmentpack\\.)[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9-]*)+$"
+ },
+ "uniqueItems": true
+ },
+ "reviews": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["reviewer", "reviewedAt", "disposition"],
+ "properties": {
+ "reviewer": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "reviewedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "disposition": {
+ "enum": ["approved", "changes-requested", "rejected"]
+ },
+ "note": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ }
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "condition": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "value"],
+ "properties": {
+ "op": {
+ "const": "literal"
+ },
+ "value": {
+ "type": "boolean"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "conditions"],
+ "properties": {
+ "op": {
+ "enum": ["all", "any"]
+ },
+ "conditions": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/$defs/condition"
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "condition"],
+ "properties": {
+ "op": {
+ "const": "not"
+ },
+ "condition": {
+ "$ref": "#/$defs/condition"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "path", "operator", "value"],
+ "properties": {
+ "op": {
+ "const": "fact"
+ },
+ "path": {
+ "type": "string",
+ "pattern": "^(?:/(?:[^~/]|~0|~1)*)*$"
+ },
+ "operator": {
+ "enum": [
+ "equals",
+ "not-equals",
+ "greater-than",
+ "greater-than-or-equal",
+ "less-than",
+ "less-than-or-equal",
+ "in"
+ ]
+ },
+ "value": true
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "operator": {
+ "enum": [
+ "greater-than",
+ "greater-than-or-equal",
+ "less-than",
+ "less-than-or-equal"
+ ]
+ }
+ },
+ "required": ["operator"]
+ },
+ "then": {
+ "properties": {
+ "value": {
+ "$ref": "#/$defs/decimalString"
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "operator": {
+ "const": "in"
+ }
+ },
+ "required": ["operator"]
+ },
+ "then": {
+ "properties": {
+ "value": {
+ "type": "array",
+ "minItems": 1
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "evidenceRequirement"],
+ "properties": {
+ "op": {
+ "const": "evidence-present"
+ },
+ "evidenceRequirement": {
+ "$ref": "#/$defs/localId"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/internal/policy/official/schema/policy/1.0.0/common.schema.json b/internal/policy/official/schema/policy/1.0.0/common.schema.json
new file mode 100644
index 00000000..84dca85d
--- /dev/null
+++ b/internal/policy/official/schema/policy/1.0.0/common.schema.json
@@ -0,0 +1,187 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json",
+ "title": "DRAFT Policy companion 1.0.0: common",
+ "description": "Draft shared definitions. jps-canon refers to the existing spec/dialect.md canonical profile; this companion does not change it.",
+ "$ref": "#/$defs/retainedContent",
+ "$defs": {
+ "version": {
+ "type": "string",
+ "minLength": 5,
+ "maxLength": 256,
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?![\\s\\S])"
+ },
+ "text": {
+ "type": "string",
+ "minLength": 1,
+ "maxLength": 4096
+ },
+ "localId": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?![\\s\\S])"
+ },
+ "uri": {
+ "type": "string",
+ "format": "uri",
+ "minLength": 1,
+ "maxLength": 2048,
+ "description": "Scheme-bearing RFC 3986 URI production, including optional fragment. Assert the entire ASCII string; no trimming, Unicode/percent decoding, or identity normalization. See Policy companion prose for IPv6 and case-insensitive IPvFuture checks."
+ },
+ "content": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1048576
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Narrative, review basis, artifact and informational material: at most 1 MiB."
+ },
+ "canonicalIdentity": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "profile",
+ "canonicalDigest"
+ ],
+ "properties": {
+ "profile": {
+ "const": "jps-canon"
+ },
+ "canonicalDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ }
+ }
+ },
+ "anchor": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "startByte",
+ "endByte",
+ "bytesDigest"
+ ],
+ "properties": {
+ "startByte": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 1048576
+ },
+ "endByte": {
+ "type": "integer",
+ "minimum": 1,
+ "maximum": 1048576
+ },
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ }
+ }
+ },
+ "policyReference": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id",
+ "version",
+ "content"
+ ],
+ "properties": {
+ "kind": {
+ "const": "policy"
+ },
+ "id": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/uri"
+ },
+ "version": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/version"
+ },
+ "content": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/content"
+ },
+ "canonicalIdentity": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/canonicalIdentity"
+ }
+ }
+ },
+ "packReference": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id",
+ "version",
+ "content"
+ ],
+ "properties": {
+ "kind": {
+ "const": "pack"
+ },
+ "id": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/uri"
+ },
+ "version": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/version"
+ },
+ "content": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/content"
+ },
+ "canonicalIdentity": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/canonicalIdentity"
+ }
+ }
+ },
+ "retainedContent": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "bytesDigest",
+ "byteLength",
+ "mediaType"
+ ],
+ "properties": {
+ "bytesDigest": {
+ "type": "string",
+ "pattern": "^sha256:[0-9a-f]{64}(?![\\s\\S])"
+ },
+ "byteLength": {
+ "type": "integer",
+ "minimum": 0,
+ "maximum": 4194304
+ },
+ "mediaType": {
+ "type": "string",
+ "maxLength": 128,
+ "pattern": "^[a-z0-9!#$&^_.+-]+/[a-z0-9!#$&^_.+-]+(?![\\s\\S])"
+ }
+ },
+ "description": "Generic fixture-carrier reference; consuming roles impose their own bounds."
+ },
+ "originalContent": {
+ "description": "Exact retained original source bytes: at most 4 MiB; never a replacement for narrative.",
+ "$ref": "#/$defs/retainedContent"
+ },
+ "formatVersion": {
+ "const": "1.0.0"
+ }
+ }
+}
diff --git a/internal/policy/official/schema/policy/1.0.0/consumer-core-0.2.0-draft.schema.json b/internal/policy/official/schema/policy/1.0.0/consumer-core-0.2.0-draft.schema.json
new file mode 100644
index 00000000..09672519
--- /dev/null
+++ b/internal/policy/official/schema/policy/1.0.0/consumer-core-0.2.0-draft.schema.json
@@ -0,0 +1,578 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://judgmentpack.org/schema/0.2.0-draft/judgment-pack-core.schema.json",
+ "title": "Judgment Pack Core",
+ "description": "Research-preview structural schema. Conformance does not establish truth, authority, safety, or operational fitness.",
+ "$comment": "JPS structural conformance requires uri, date, and date-time format assertions even when a general-purpose validator treats format as annotation-only.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "specVersion",
+ "id",
+ "version",
+ "title",
+ "decision",
+ "outcomes",
+ "rules"
+ ],
+ "properties": {
+ "specVersion": {
+ "const": "0.2.0-draft"
+ },
+ "id": {
+ "type": "string",
+ "format": "uri",
+ "minLength": 1
+ },
+ "version": {
+ "type": "string",
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
+ },
+ "title": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "decision": {
+ "$ref": "#/$defs/decision"
+ },
+ "applicability": {
+ "$ref": "#/$defs/condition"
+ },
+ "evidenceRequirements": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/evidenceRequirement"
+ },
+ "uniqueItems": true
+ },
+ "sources": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/source"
+ },
+ "uniqueItems": true
+ },
+ "outcomes": {
+ "type": "array",
+ "minItems": 2,
+ "items": {
+ "$ref": "#/$defs/outcome"
+ },
+ "uniqueItems": true
+ },
+ "rules": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/$defs/rule"
+ },
+ "uniqueItems": true
+ },
+ "exceptions": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/exception"
+ },
+ "uniqueItems": true
+ },
+ "fallbackOutcome": {
+ "$ref": "#/$defs/localId"
+ },
+ "escalation": {
+ "$ref": "#/$defs/escalation"
+ },
+ "metadata": {
+ "$ref": "#/$defs/metadata"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ },
+ "$defs": {
+ "nonEmptyString": {
+ "type": "string",
+ "minLength": 1
+ },
+ "localId": {
+ "type": "string",
+ "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$"
+ },
+ "decimalString": {
+ "type": "string",
+ "pattern": "^-?(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?$"
+ },
+ "extensions": {
+ "type": "object",
+ "propertyNames": {
+ "pattern": "^(?!org\\.judgmentpack\\.)[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9-]*)+$"
+ },
+ "additionalProperties": true
+ },
+ "decision": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["intent", "question"],
+ "properties": {
+ "intent": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "question": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "evidenceRequirement": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "description", "required"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "required": {
+ "type": "boolean"
+ },
+ "kind": {
+ "enum": ["document", "fact", "measurement", "attestation"]
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "source": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "title", "locator"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "title": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "publisher": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "publishedAt": {
+ "type": "string",
+ "format": "date"
+ },
+ "locator": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["kind", "value"],
+ "properties": {
+ "kind": {
+ "enum": ["uri", "repository", "path", "other"]
+ },
+ "value": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ },
+ "citation": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["location", "excerpt"],
+ "properties": {
+ "location": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "excerpt": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ },
+ "rights": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "outcome": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "label"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "label": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "rule": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "description", "when", "outcome", "onUnknown"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "when": {
+ "$ref": "#/$defs/condition"
+ },
+ "outcome": {
+ "$ref": "#/$defs/localId"
+ },
+ "onUnknown": {
+ "enum": ["ignore", "escalate"]
+ },
+ "evidenceRequirementRefs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/localId"
+ },
+ "uniqueItems": true
+ },
+ "sourceRefs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/localId"
+ },
+ "uniqueItems": true
+ },
+ "rationale": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "exception": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["id", "description", "when", "effect", "onUnknown"],
+ "properties": {
+ "id": {
+ "$ref": "#/$defs/localId"
+ },
+ "description": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "when": {
+ "$ref": "#/$defs/condition"
+ },
+ "effect": {
+ "enum": ["suppress-rule", "force-outcome", "escalate"]
+ },
+ "targetRule": {
+ "$ref": "#/$defs/localId"
+ },
+ "outcome": {
+ "$ref": "#/$defs/localId"
+ },
+ "onUnknown": {
+ "enum": ["ignore", "escalate"]
+ },
+ "sourceRefs": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/localId"
+ },
+ "uniqueItems": true
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "effect": {
+ "const": "suppress-rule"
+ }
+ },
+ "required": ["effect"]
+ },
+ "then": {
+ "required": ["targetRule"],
+ "not": {
+ "required": ["outcome"]
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "effect": {
+ "const": "force-outcome"
+ }
+ },
+ "required": ["effect"]
+ },
+ "then": {
+ "required": ["outcome"],
+ "not": {
+ "required": ["targetRule"]
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "effect": {
+ "const": "escalate"
+ }
+ },
+ "required": ["effect"]
+ },
+ "then": {
+ "not": {
+ "anyOf": [
+ { "required": ["outcome"] },
+ { "required": ["targetRule"] }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "escalation": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["triggers", "target"],
+ "properties": {
+ "triggers": {
+ "type": "array",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "enum": [
+ "not-applicable",
+ "missing-required-evidence",
+ "unknown",
+ "conflict",
+ "no-match"
+ ]
+ }
+ },
+ "target": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["kind", "name"],
+ "properties": {
+ "kind": {
+ "enum": ["human-role", "queue", "system"]
+ },
+ "name": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ },
+ "message": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "metadata": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "authors": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "uniqueItems": true
+ },
+ "createdAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "license": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "requiredExtensions": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "pattern": "^(?!org\\.judgmentpack\\.)[a-z][a-z0-9]*(?:\\.[a-z][a-z0-9-]*)+$"
+ },
+ "uniqueItems": true
+ },
+ "reviews": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["reviewer", "reviewedAt", "disposition"],
+ "properties": {
+ "reviewer": {
+ "$ref": "#/$defs/nonEmptyString"
+ },
+ "reviewedAt": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "disposition": {
+ "enum": ["approved", "changes-requested", "rejected"]
+ },
+ "note": {
+ "$ref": "#/$defs/nonEmptyString"
+ }
+ }
+ }
+ },
+ "extensions": {
+ "$ref": "#/$defs/extensions"
+ }
+ }
+ },
+ "condition": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "value"],
+ "properties": {
+ "op": {
+ "const": "literal"
+ },
+ "value": {
+ "type": "boolean"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "conditions"],
+ "properties": {
+ "op": {
+ "enum": ["all", "any"]
+ },
+ "conditions": {
+ "type": "array",
+ "minItems": 1,
+ "items": {
+ "$ref": "#/$defs/condition"
+ }
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "condition"],
+ "properties": {
+ "op": {
+ "const": "not"
+ },
+ "condition": {
+ "$ref": "#/$defs/condition"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "path", "operator", "value"],
+ "properties": {
+ "op": {
+ "const": "fact"
+ },
+ "path": {
+ "type": "string",
+ "pattern": "^(?:/(?:[^~/]|~0|~1)*)*$"
+ },
+ "operator": {
+ "enum": [
+ "equals",
+ "not-equals",
+ "greater-than",
+ "greater-than-or-equal",
+ "less-than",
+ "less-than-or-equal",
+ "in"
+ ]
+ },
+ "value": true
+ },
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "operator": {
+ "enum": [
+ "greater-than",
+ "greater-than-or-equal",
+ "less-than",
+ "less-than-or-equal"
+ ]
+ }
+ },
+ "required": ["operator"]
+ },
+ "then": {
+ "properties": {
+ "value": {
+ "$ref": "#/$defs/decimalString"
+ }
+ }
+ }
+ },
+ {
+ "if": {
+ "properties": {
+ "operator": {
+ "const": "in"
+ }
+ },
+ "required": ["operator"]
+ },
+ "then": {
+ "properties": {
+ "value": {
+ "type": "array",
+ "minItems": 1
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": ["op", "evidenceRequirement"],
+ "properties": {
+ "op": {
+ "const": "evidence-present"
+ },
+ "evidenceRequirement": {
+ "$ref": "#/$defs/localId"
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/internal/policy/official/schema/policy/1.0.0/governing-adoption.schema.json b/internal/policy/official/schema/policy/1.0.0/governing-adoption.schema.json
new file mode 100644
index 00000000..7372567e
--- /dev/null
+++ b/internal/policy/official/schema/policy/1.0.0/governing-adoption.schema.json
@@ -0,0 +1,265 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://judgmentpack.org/schema/policy/1.0.0/governing-adoption.schema.json",
+ "title": "DRAFT Policy companion 1.0.0: governing-adoption",
+ "description": "Immutable interpretation/coverage proposal for one exact pack. No authorization, registration, release envelope, graph support or live eligibility.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "formatVersion",
+ "kind",
+ "id",
+ "version",
+ "consumer",
+ "governingPolicies"
+ ],
+ "properties": {
+ "formatVersion": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/formatVersion"
+ },
+ "kind": {
+ "const": "governing-adoption"
+ },
+ "id": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/uri"
+ },
+ "version": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/version"
+ },
+ "consumer": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/packReference"
+ },
+ "governingPolicies": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "policy",
+ "scope",
+ "coverage"
+ ],
+ "properties": {
+ "policy": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/policyReference"
+ },
+ "scope": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind"
+ ],
+ "properties": {
+ "kind": {
+ "const": "whole-policy"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "sectionIds",
+ "reviewBasis"
+ ],
+ "properties": {
+ "kind": {
+ "const": "sections"
+ },
+ "sectionIds": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ }
+ },
+ "reviewBasis": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/content"
+ }
+ }
+ }
+ ]
+ },
+ "coverage": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "consumerElements",
+ "reviewBasis"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "status": {
+ "const": "implemented"
+ },
+ "consumerElements": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "#/$defs/consumerElement"
+ }
+ },
+ "reviewBasis": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/content"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "handoff"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "status": {
+ "const": "manual"
+ },
+ "handoff": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "explanation"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "status": {
+ "const": "awaiting-interpretation"
+ },
+ "explanation": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "explanation"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "status": {
+ "const": "awaiting-implementation"
+ },
+ "explanation": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sectionId",
+ "status",
+ "rationale"
+ ],
+ "properties": {
+ "sectionId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "status": {
+ "const": "out-of-scope"
+ },
+ "rationale": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "informationalSources": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/content"
+ }
+ }
+ },
+ "$defs": {
+ "consumerElement": {
+ "description": "Exact declared Core rule/exception by ID, or the present applicability/fallbackOutcome singleton without a fabricated ID. Other element kinds are unsupported.",
+ "oneOf": [
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind",
+ "id"
+ ],
+ "properties": {
+ "kind": {
+ "enum": [
+ "rule",
+ "exception"
+ ]
+ },
+ "id": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ }
+ }
+ },
+ {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "kind"
+ ],
+ "properties": {
+ "kind": {
+ "enum": [
+ "applicability",
+ "fallback"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+}
diff --git a/internal/policy/official/schema/policy/1.0.0/policy.schema.json b/internal/policy/official/schema/policy/1.0.0/policy.schema.json
new file mode 100644
index 00000000..2faf3290
--- /dev/null
+++ b/internal/policy/official/schema/policy/1.0.0/policy.schema.json
@@ -0,0 +1,147 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://judgmentpack.org/schema/policy/1.0.0/policy.schema.json",
+ "title": "DRAFT Policy companion 1.0.0: policy",
+ "description": "Immutable content/provenance proposal only. managementMode declares intended publication ownership; no imported approval, lifecycle, ACL or rule semantics. Optional readable structured requirements are deferred; a requirements member is unsupported.",
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "formatVersion",
+ "kind",
+ "id",
+ "version",
+ "title",
+ "managementMode",
+ "content",
+ "sections",
+ "sourceProvenance"
+ ],
+ "properties": {
+ "formatVersion": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/formatVersion"
+ },
+ "kind": {
+ "const": "policy"
+ },
+ "id": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/uri"
+ },
+ "version": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/version"
+ },
+ "title": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ },
+ "managementMode": {
+ "enum": [
+ "workspace-managed",
+ "externally-managed"
+ ]
+ },
+ "content": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/content"
+ },
+ "sections": {
+ "type": "array",
+ "minItems": 1,
+ "maxItems": 64,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "title",
+ "anchor"
+ ],
+ "properties": {
+ "id": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "title": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ },
+ "anchor": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/anchor"
+ },
+ "sourceRefs": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "sourceId",
+ "location"
+ ],
+ "properties": {
+ "sourceId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "location": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "sourceProvenance": {
+ "type": "array",
+ "minItems": 0,
+ "maxItems": 16,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "id",
+ "source",
+ "sourceRevision",
+ "content"
+ ],
+ "properties": {
+ "id": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/localId"
+ },
+ "source": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "provider",
+ "accountId",
+ "resourceId"
+ ],
+ "properties": {
+ "provider": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ },
+ "accountId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ },
+ "resourceId": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ }
+ }
+ },
+ "sourceRevision": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/text"
+ }
+ ]
+ },
+ "content": {
+ "$ref": "https://judgmentpack.org/schema/policy/1.0.0/common.schema.json#/$defs/originalContent"
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/internal/policy/official/spec/checkpoint-witness.md b/internal/policy/official/spec/checkpoint-witness.md
new file mode 100644
index 00000000..360470ba
--- /dev/null
+++ b/internal/policy/official/spec/checkpoint-witness.md
@@ -0,0 +1,409 @@
+# The checkpoint witness statement
+
+## Status
+
+This document is a companion document of the Judgment Pack specification. It is normative for one
+conformance class, the *witness-statement reader* (§11), and for nothing else
+([Core §1.1](judgment-pack-core.md#11-normative-artifacts-and-precedence)). It changes nothing in
+Judgment Pack Core `0.2.0-draft`, its schema, its four conformance classes, or either of its
+corpora.
+
+Its 54 vectors, under
+[`conformance/witness/`](https://github.com/Judgment-Pack/judgment-pack-spec/tree/main/conformance/witness),
+are **staged** until the next `specVersion` opens: they are in no corpus, no claim may cite them,
+the site does not serve them, and no release bundle carries them. When that version opens they move
+into a corpus, normative for this class and for nothing else. Until a specification version
+publishes them, no witness-statement reader conformance claim is available: §11 holds a reader to
+the vectors published with the version its claim names, and no version publishes these.
+
+It specifies version `1` of the witness statement (`witnessVersion` `"1"`, §3). It is published
+beside the released Core `0.2.0-draft` and carries no `specVersion` of its own; whether its vectors
+take a `suiteVersion` of their own is open in its design record (Unresolved 1). Like Core, it is a
+research preview, at draft maturity.
+
+Its design record is [RFC 0017](../rfcs/0017-checkpoint-witness-statement.md), accepted on
+2026-10-12, which is informative. Its text, §§1–11 below, is that RFC's Specification section. It
+restates the checkpoint witness statement as the reference gateway released it in `v0.11.0`,
+commit `13349cafe33bb7618567e47ce7f6e1a4224231b0`:
+[`SPEC.md` §8](https://github.com/Judgment-Pack/judgment-pack-gateway/blob/v0.11.0/SPEC.md#8-the-checkpoint-witness),
+its canonical form in §1.1 and its key identifier in §1.2, and
+[ADR-0013](https://github.com/Judgment-Pack/judgment-pack-gateway/blob/v0.11.0/docs/adr/0013-checkpoint-witness.md).
+"Gateway §n" in this document means a section of that `SPEC.md` at that commit.
+
+The key words **MUST**, **MUST NOT**, **REQUIRED**, **SHOULD**, **SHOULD NOT** and **MAY** are to
+be interpreted as described by BCP 14 when, and only when, they appear in all capitals.
+
+## 1. Terms and the canonical form
+
+A **trail** is a decision trail: a sequence of records an operator keeps, each one line of bytes.
+Its format, how its records chain, and how a checkpoint is printed from it are the reference
+runtime's (runtime ADR-0047), not this document's. This document needs three things of a trail: its
+identity, 32 lowercase hexadecimal characters; a record's position in it, its **sequence**, counted
+from 1; and the SHA-256 of a record line's exact bytes, without its newline.
+
+A **witness** is a party, other than a trail's operator, that signs statements (§3) over the
+trail's checkpoints (§2) and serves them. A **reader** reads a set of statements (§7). Hexadecimal
+is lowercase throughout. A **digest** is the string `sha256:` followed by 64 hexadecimal characters.
+A **key** is the 32-byte encoding of an Ed25519 public key (RFC 8032), and its **key identifier** is
+the first 32 hexadecimal characters of the SHA-256 of those 32 bytes.
+
+**The canonical form** of a JSON value — the bytes a signature covers and two statements are
+compared by — is defined as follows.
+
+- **Domain.** Objects, arrays, strings, integers, `true`, `false` and `null`. Numbers are integers
+ only, within ±(2⁵³−1); a number written with a fraction or an exponent is outside the domain even
+ when its value is an integer (`1.0`, `1e2`), and `-0` is inside it, with the canonical form `0`. A
+ string is inside the domain only when it is valid UTF-8, so a lone surrogate is outside it. An
+ object that gives one member name twice is outside the domain.
+- **Output.** Object members are ordered by the Unicode code points of their names; array elements
+ keep their order; there is no whitespace; strings are raw UTF-8, with no character outside ASCII
+ escaped and `<`, `>`, `&` and `/` not escaped. The escapes are `\"`, `\\`, `\b`, `\f`, `\n`, `\r`
+ and `\t`; every other control character below U+0020 is `\u00` followed by two lowercase
+ hexadecimal digits; U+007F, U+2028 and U+2029 are written raw.
+
+This is the gateway's canonical form (gateway §1.1). It orders member names by code point where
+RFC 8785 orders them by UTF-16 code unit; the two differ only on names outside the Basic
+Multilingual Plane, and no name in this document is one. Every value of a statement that has the
+form of §3 is a string of ASCII characters none of which is escaped, an integer below 2⁵³, or
+`null`, so a statement's canonical form is also its RFC 8785 serialization, and a reader MAY build
+it with either.
+
+## 2. The witnessed checkpoint
+
+A **checkpoint** is an object of exactly four members, each given once:
+
+| Member | Form |
+| --- | --- |
+| `checkpointVersion` | the string `"1"` |
+| `trail` | 32 lowercase hexadecimal characters: the trail's identity |
+| `sequence` | an integer from 1 to 2⁵³−2: the record's line number in the trail |
+| `recordDigest` | a digest: the SHA-256 of the record line's exact bytes, without its newline |
+
+Its canonical form (§1) is the checkpoint line the reference runtime prints, without its newline,
+byte for byte: the member names are ASCII and already in code-point order, and the values are
+hexadecimal strings, a fixed string and an integer below 2⁵³. The bytes inside a statement's
+signing input are therefore the bytes a holder's checkpoint file holds, and their SHA-256 is what a
+time stamp of the checkpoint imprints. A witness MUST accept a submitted checkpoint line only in
+that form, and MUST NOT re-encode one.
+
+## 3. The statement
+
+A **witness statement** is an object with exactly the members below. Every member is REQUIRED, and
+the set is closed: a statement with a member not listed here is malformed, because a new member is
+a new `witnessVersion`, and a reader that does not know a version then refuses it rather than
+skipping it.
+
+| Member | Form | Meaning |
+| --- | --- | --- |
+| `witnessVersion` | the string `"1"` | this format |
+| `kind` | `"checkpoint"`, `"conflict"` or `"retirement"` | §6 |
+| `checkpoint` | the object of §2 | for `"checkpoint"`, the checkpoint witnessed; for `"conflict"`, a checkpoint offered and refused; for `"retirement"`, the trail's latest witnessed checkpoint, repeated |
+| `index` | an integer from 0 to 2⁵³−2 | this statement's place in the witness's chain for `checkpoint.trail` |
+| `prevSignature` | `null`, or 128 lowercase hexadecimal characters | the `signature` of the statement at `index` − 1 for the same trail; `null` at index 0 (§6) |
+| `witnessedAt` | `YYYY-MM-DDThh:mm:ssZ`, a digit where each letter but `T` and `Z` stands: UTC, whole seconds | the witness's clock when it signed |
+| `keyId` | a key identifier (§1) | the witness's key |
+| `signature` | 128 lowercase hexadecimal characters, the 64 bytes of an Ed25519 signature | §4 |
+
+A statement is read by its JSON value. Whitespace, the order of members and the escapes in a string
+are its spelling, not the statement. A member name given twice, a string that is not valid UTF-8,
+or a lone surrogate makes it malformed. Each form above is held on the value read: an integer is
+spelled in digits alone, with no sign, fraction or exponent — `-0`, `1.0` and `1e0` are not
+integers here — and a string is held to its form as its escapes decode. Two statements with the
+same canonical bytes are one statement.
+
+`witnessedAt` is held to its form and to nothing else: a reader compares it with no clock and with
+no other statement's. A witness MUST NOT state a time earlier than the previous statement's for the
+trail — it takes the later of its clock and that time — and that is the witness's rule, which a
+reader does not check.
+
+A statement at index 7 and sequence 120, its hexadecimal elided, as a witness serves it:
+
+```
+{"checkpoint":{"checkpointVersion":"1","recordDigest":"sha256:…","sequence":120,"trail":"…"},"index":7,"keyId":"…","kind":"checkpoint","prevSignature":"…","signature":"…","witnessVersion":"1","witnessedAt":"2026-10-04T12:00:00Z"}
+```
+
+With its hexadecimal in full it is 608 bytes. A witness MUST serve every statement as one line, its
+canonical form, ended by a newline (`0x0A`).
+
+## 4. What the signature covers
+
+`signature` is an Ed25519 signature, under the witness's key, over the ASCII bytes
+`judgment-pack-gateway/witness/1:` followed by the canonical form of the statement with **its
+top-level `signature` member removed and every other member retained**, the nested `checkpoint`
+included. Appending anything anywhere therefore invalidates the signature. Built from the values
+read, each integer in decimal digits, the signed bytes are exactly:
+
+```
+judgment-pack-gateway/witness/1:{"checkpoint":{"checkpointVersion":"1","recordDigest":"","sequence":,"trail":""},"index":,"keyId":"","kind":"","prevSignature":">,"witnessVersion":"1","witnessedAt":""}
+```
+
+The prefix is neither the gateway receipt's nor its seal's, so none of the three can be replayed as
+another. It names the gateway because the gateway defined it; every statement that exists was
+signed over it, and this document keeps it unchanged.
+
+`keyId` is the key identifier (§1) of the key that signs. Gateway §8.3 adds a rule on the producer
+that this document does not carry: a gateway witness signs under the gateway's own signing seed,
+the seed that signs its receipts and seals, so a statement's `keyId` is the gateway's own, and a
+party that wants the witness's role apart from its receipts runs a second gateway with a seed of
+its own. That rule binds a gateway as a producer, and stays the gateway's. This document leaves the
+choice of key to the witness because a reader conformance class should not depend on which key a
+producer uses: a reader verifies under the keys it was given (§5), by one equation, and cannot tell
+from a statement what else its key signs. A witness that signs with a key of its own therefore
+conforms to this document and not to gateway §8.3, and every reader reads its statements alike.
+
+## 5. The key rule and the equation
+
+A reader MUST NOT take a witness key from a statement. It is given the keys it trusts, out of band,
+and it MUST hold each to the rule below before it reads anything signed. 32 bytes are a key a reader
+may trust exactly when they are the canonical encoding (RFC 8032 §5.1.2) of a point of the curve
+whose order does not divide 8. The encoding is read as written, before anything reduces it: `y` is
+its low 255 bits, little-endian, and its top bit is the sign of `x`. A key is refused when, taken in
+this order:
+
+1. **it is not canonical** (`key-not-canonical`): `y` is p = 2²⁵⁵ − 19 or more, or `x` is 0 (`y`
+ is 1 or p − 1) and the sign bit is set. A lenient decoder reads such an encoding as another
+ key: `y` = p as `y` = 0, for one;
+2. **it is of small order** (`key-small-order`): it is one of the eight points whose order divides
+ 8, by their canonical encodings — every other encoding of them is refused by 1:
+
+ ```
+ 0100000000000000000000000000000000000000000000000000000000000000
+ ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000080
+ 26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05
+ 26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85
+ c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a
+ c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa
+ ```
+
+ Under such a key a signature can be made without a private key — for most messages, `R` a point
+ of small order and `S` zero verify — and the all-zero key, a plausible placeholder, is one;
+3. **it is no point** (`key-not-on-curve`): (`y`² − 1) / (d·`y`² + 1) has no square root modulo p,
+ so nothing verifies under it.
+
+A key of mixed order — a point of prime order plus one of small order — is not refused, since its
+order does not divide 8, and no key derived from a seed is refused.
+
+A signature is 64 bytes: `R`, the first 32, and `S`, the last 32 read as a little-endian integer.
+It verifies under a key's 32 bytes `A` over the signed bytes `M` (§4) exactly when `S` is below
+L = 2²⁵² + 27742317777372353535851937790883648493 and the canonical encoding of [`S`]B − [h]A is
+`R`, byte for byte, B being the base point and h the SHA-512 of `R` ‖ `A` ‖ `M` read as a
+little-endian integer and reduced modulo L. That is RFC 8032's check without the cofactor and with
+a canonical scalar. A reader MUST NOT use the cofactored check RFC 8032 §5.1.7 also allows,
+[8][`S`]B = [8]`R` + [8][h]A, which accepts more: an `R` with a part of small order, and, under a key
+of mixed order, a signature that holds only up to that part. `R` is not otherwise decoded: an
+encoding of it that is not canonical never verifies, and one of a point of small order verifies
+when the equation holds.
+
+## 6. The chain
+
+A witness keeps one chain of statements per trail, and MUST keep it as follows.
+
+- `index` runs from 0 with no gap, and each statement's `prevSignature` is the `signature` of the
+ statement before it, `null` at index 0. The last statement therefore commits to every one before
+ it, and a witness that drops, reorders or alters a statement it served breaks the chain for
+ anyone who holds a later one.
+- The sequences of its `checkpoint` statements strictly increase. Its **latest witnessed
+ checkpoint** is its last `checkpoint` statement, and coverage is always stated by that one: a
+ `conflict` at sequence 100 after a checkpoint at 200 does not move coverage back to 100.
+- A **`conflict`** statement records that a submitter the witness allowed for the trail offered
+ another `recordDigest` for a sequence at which the witness holds a `checkpoint` statement. The
+ first such offer is the evidence, and there is at most one per sequence. Since a witness holds
+ only sequences it signed, a conflict's sequence is at or below the latest `checkpoint`
+ statement's before it, and that is what a reader checks of it. That the sequence was held, and
+ that no sequence has two conflicts, are the witness's rules, which a reader does not check.
+- A **`retirement`** statement is the last of its chain: the witness accepts nothing more for the
+ trail, and keeps and serves the chain as before. Its `checkpoint` repeats the latest witnessed
+ checkpoint, all four members, so it names the trail and pins where the chain ended; a chain with
+ no `checkpoint` statement has nothing to retire.
+- The witness's **head** for a trail is the chain's last statement, of any kind.
+
+A witness cannot check that a checkpoint extends the one before it: that needs the records, which
+it never sees. A rewrite of a trail from sequence k on is caught by holding the trail to an
+**earlier** statement whose sequence is k or above, which the rewritten trail no longer matches —
+even when a later checkpoint of the rewritten trail was signed. Whoever presents a chain can leave
+that statement out, so a chain is read from its first statement and never late (§7), and the head,
+fetched from the witness, says how far the chain reaches. The witness serves the latest statement
+it holds as the end of the chain, not in place of it.
+
+## 7. Reading a chain
+
+A reading takes: the identity of the trail being verified; the witness keys the reader trusts, in
+an order; the statements supplied, in files of statement lines; and, optionally, a **head** the
+reader fetched from the witness, in a file of its own. A file's lines are its bytes up to each
+`0x0A`, the piece after the last one included. A line that is empty, or holds only spaces, tabs and
+carriage returns, is passed over; every other line is one statement as served (§3), its surrounding
+JSON whitespace allowed. A head file holds exactly one statement line.
+
+Before any statement is read the reading is refused — no reading at all, never a reading of part —
+by the first of these: more keys than §8 allows (`keys-over-bound`); a key the key rule refuses,
+the keys taken in their order, with that key's reason (§5); the files over §8's bound on bytes
+(`bytes-over-bound`); and the files over its bound on statements (`statements-over-bound`).
+Otherwise:
+
+1. **Each statement.** The statements of every file and the head are one set, whatever files they
+ came in and in whatever order. Two with the same canonical bytes are one, and each statement is
+ checked once, against, in this order: its form (§3), or **`witness-malformed`** — a head file of
+ other than one statement line too; its signature, under the key its `keyId` names among those
+ supplied, by §5's equation over §4's bytes, or **`witness-signature-invalid`**, a `keyId` that
+ names no key supplied included; and its trail, which MUST be the trail being verified, or
+ **`witness-trail-mismatch`**. A statement takes the first of these findings and no other. A
+ statement that fails is never passed over, whatever it claims: it fails the reading.
+2. **Equivocation.** Two statements that passed step 1, are of one index and differ are
+ **`witness-equivocation`**: the witness signed two chains.
+3. **The chain.** A set in which steps 1 and 2 found anything is not walked: the findings are those
+ steps', and a hole a failed statement leaves is not reported. Otherwise the **chain** is the
+ set, less a head whose index is more than one past the highest index of the other statements of
+ the set, the highest index of no statement being taken as −1, so that a head alone at index 0 is
+ a chain. Taken in index order, it MUST begin at index 0 with `prevSignature` `null` and hold
+ every index from there to its highest, each `prevSignature` after the first the `signature` of
+ the statement before; each `checkpoint` statement's sequence MUST exceed the latest `checkpoint`
+ statement's before it; each `conflict` statement MUST have a `checkpoint` statement before it
+ and a sequence at or below the latest one's; and a `retirement` statement MUST have a
+ `checkpoint` statement before it, repeat the latest one's checkpoint, all four members, and be
+ the chain's last. Otherwise **`witness-chain-broken`**. A set that begins late is never read
+ from where it begins, and a set of no statement does not begin at index 0.
+4. **The head.** A head left out of the chain in step 3 is **`witness-head-unreached`**: the
+ statements supplied do not reach it. A head at an index the chain holds is the chain's statement
+ at that index, by its signature, since step 2 found no other; a head one index past every other
+ statement was walked in step 3 as the chain's last. The chain may run past the head: statements
+ the witness signed after the reader's fetch, supplied from elsewhere, are checked like the rest.
+
+A reading with any finding is credited nothing. A reading with none is **current** when a head was
+supplied, as of the reader's fetch of it — a signature does not say when it was fetched — and
+**historical** when none was: it ends at the highest statement supplied and says nothing of any
+statement after it. It reports what §9 lists.
+
+## 8. Bounds
+
+One reading takes at most **16** keys; statement files and a head file of at most **67108864
+bytes** (64 MiB) together; and at most **110000** statements, counted as the lines step 1 of §7
+would read — every line of every file, the head file's included, that is not passed over — before
+two copies of one statement are one. Over any of them the reading is refused before any statement
+is checked (§7), and MUST NOT be truncated. The bytes are bounded first, by the files' sizes,
+before any file is read. The statements are then counted as the files are split into lines, the
+statements files in their order and the head file last, and the reading is refused at the first
+line past the bound, keeping and reading none of the lines after it: a file of many short lines
+costs a reader no more than 110000 statements do. Each statement costs one Ed25519 verification,
+under the one key its `keyId` names, so the work of a reading is bounded by its statement count.
+
+## 9. Refusals, findings and the report
+
+Refusals and findings are named as the specification names evaluation error classes (Core §8.4):
+lowercase words joined by hyphens. The names are the ones the vectors use.
+
+| Name | Kind | When (section) |
+| --- | --- | --- |
+| `keys-over-bound` | refusal | more than 16 keys (§8) |
+| `key-not-canonical` | refusal | a key that is not a canonical encoding (§5, 1) |
+| `key-small-order` | refusal | a key of small order (§5, 2) |
+| `key-not-on-curve` | refusal | a key that is no point (§5, 3) |
+| `bytes-over-bound` | refusal | the files over 67108864 bytes together (§8) |
+| `statements-over-bound` | refusal | more than 110000 statement lines (§8) |
+| `witness-malformed` | finding | a statement not of §3's form, or a head file of other than one statement line (§7, 1) |
+| `witness-signature-invalid` | finding | a signature that does not verify under the key its `keyId` names, or a `keyId` that names no key supplied (§7, 1) |
+| `witness-trail-mismatch` | finding | a statement of another trail (§7, 1) |
+| `witness-equivocation` | finding | two statements, each verifying, of one index that differ (§7, 2) |
+| `witness-chain-broken` | finding | a set that breaks the chain rule (§7, 3) |
+| `witness-head-unreached` | finding | a head more than one index past the statements supplied (§7, 4) |
+
+A reader MUST report a refusal by its name, and a reading's findings by their names. Findings are a
+set: how many times, and in what order, a reader reports one is not normative. A reading with no
+finding MUST report: whether it is current or historical; the head's index, when a head was
+supplied; the chain's highest index; the latest witnessed checkpoint's index, sequence and
+`witnessedAt`; the sequence of each `conflict` statement, in index order; and whether the chain is
+retired. The vectors carry these as JSON (see [`conformance/witness/`](https://github.com/Judgment-Pack/judgment-pack-spec/tree/main/conformance/witness)); that form is the vectors' carrier, not
+an output format this document requires.
+
+**The sentences.** A reader that states in words what a reading establishes MUST state no more
+than §10 allows, and SHOULD state it in these sentences, with N, T and K filled in. They are the
+fixed sentences of gateway ADR-0013 §6, which the reference runtime states verbatim. N is the
+highest credited coverage, as ADR-0013 §6 states it: the highest sequence of a `checkpoint`
+statement of a reading with no finding (§7) whose checkpoint the copy of the trail matches, with no
+failed check of the trail at or before that sequence; T is that statement's `witnessedAt`. Any lower
+sequence would make the second sentence below false. The first two sentences apply only when such a
+statement exists; when none does, nothing is credited and neither is stated.
+
+- Establishes, for a reader that holds a copy of the trail: "Lines 1 to N are the lines that
+ existed when a witness under a key supplied signed its statement for checkpoint N, which it
+ states it did at T, if that witness is independent of the trail's operator."
+- Does not establish, for the same reader and the same N: "Lines after N are covered by no
+ statement of a witness under a key supplied."
+- Does not establish, for a current reading whose head is at index K: "That the witness's head for
+ this trail is still index K: the head supplied is as current as the reader's fetch of it, and a
+ signature does not say when it was fetched."
+- Does not establish, for a historical reading whose highest index is K: "That the witness held no
+ statement for this trail after index K: no head fetched from the witness was supplied, so the
+ chain was read only as far as it was supplied."
+- Does not establish, for every reading:
+ - "Anything against a witness that is not independent of the operator: one that colludes can sign
+ what it is asked, at any time it states, and a second history for another audience; a key
+ supplied is trusted because the verifier chose it."
+ - "Who submitted any checkpoint: a statement does not name its submitter, and the witness cannot
+ tell the trail's operator from a holder of the operator's credential."
+ - "When any record was made: the time a witness states is its own clock's, for when it held the
+ checkpoint."
+
+This document does not specify the eighth sentence of ADR-0013 §6, which is for a reading
+continued from one a reader saved (§7 reads a chain whole). Nor does it specify the runtime's
+further findings — `witness-head-behind`, for a head below a saved reading's last statement, and
+`countersigned-coverage-missing`, for a requirement on coverage — or the four with which it holds
+a statement's checkpoint against a trail copy (`checkpoint-beyond-trail`, `checkpoint-not-chained`,
+`checkpoint-trail-mismatch`, `checkpoint-record-mismatch`). They are the runtime's, as are the two
+sentences of its own that it adds: one for a reading that credits nothing, one for its conflict
+statements.
+
+## 10. What a statement establishes, and what it does not
+
+| | Establishes | Does not establish |
+| --- | --- | --- |
+| A `checkpoint` statement, verified under a key the verifier trusts | the key's holder was given this checkpoint and signed it as statement `index` of its chain for the trail, and states that it did so at `witnessedAt` | that the checkpoint names a real record; that it extends the one before; that the submitter was the trail's operator; that `witnessedAt` is true; anything against a witness that colludes, or whose key is stolen |
+| The same, held against a trail copy | lines 1 to its sequence are the lines that existed when the witness signed, if the witness is independent of the operator | anything after that sequence; that this is the project's only trail; that the records are true, or that every decision was recorded |
+| A chain read from index 0, every statement present and linked, up to the signature of a head the reader fetched from the witness | the reader holds every statement of the chain that head commits to, as the witness signed them: none is missing, out of order or altered, and none starts late | that the head is still the witness's head after the fetch; that the witness signed no second chain for the trail, for another audience; that it will serve these tomorrow |
+| The same chain read only as far as it was supplied, with no head | the same, up to the highest statement supplied | anything about statements after it: the reading is historical |
+| A `conflict` statement | a submitter the witness allowed for the trail offered another record for a sequence the witness held | which of the two is the trail's; who that submitter was, beyond the witness's own registration |
+| A `retirement` statement | the witness accepts no more statements for the trail, and the chain ends there | why; whether the trail's operator went on under another trail |
+
+A reading, and a report built on one, MUST NOT be described as establishing anything the
+right-hand column names.
+
+Against the trail's operator, a chain read from its first statement and held against a trail copy
+establishes that no record up to the latest checkpoint statement's sequence was edited, removed,
+inserted or moved since the witness signed the first statement covering it; a copy cut short below
+that sequence fails; and a rewrite from any sequence at or below an earlier statement's fails at
+that statement. It does not establish:
+
+- anything against a witness that colludes, or whose key is stolen: it can sign any checkpoint at
+ any time it states, and a second chain for a trail for another audience. Two statements of one
+ trail and one index that differ, both verifying, prove that it signed two chains; a statement
+ someone kept that the chain served lacks shows a second chain to whoever holds both. One witness
+ gives no protection against collusion;
+- who submitted: the witness cannot tell the trail's operator from a holder of the operator's
+ credential, and a verifier cannot either. A credential stolen can have a checkpoint signed at a
+ sequence no honest checkpoint will exceed, and that statement stays in the chain: the trail is
+ then retired, not repaired;
+- anything about an operator who stops submitting, about records after the latest checkpoint
+ statement, or about a trail rewritten before its first submission;
+- that the trail is the project's only one: a verifier must hold the trail identities it expects;
+- that the witness keeps what it signed: a witness that loses or withholds its latest statements
+ serves an older head that is internally consistent, and for a trail it holds nothing for it
+ answers as for one never submitted. A statement of a higher index than the head served shows that
+ the served view is not the whole one; it does not show whether the witness forgot or withholds;
+- when anything happened: `witnessedAt` is the witness's clock, an upper bound on when it held the
+ checkpoint as it states it, under no certificate policy, and it says nothing of when a record was
+ made.
+
+What makes a party a witness is who holds its key, not its software. A witness whose key the
+trail's operator can use is no witness against that operator, and nothing in a statement can show
+independence: the witness cannot know who runs it. A verifier decides which witness keys it trusts,
+as it decides which time-stamping roots it trusts.
+
+## 11. The witness-statement reader
+
+An implementation is a *conforming witness-statement reader* when, for every reading it admits, it
+gives the refusal, the findings, or the reading §§5–9 define, and when it gives every vector's
+expected answer in the witness vectors published with the specification version it names. The
+class is independent of Core's four classes: none implies it, and it implies none. It says nothing
+about a witness's service, and a conforming witness need not be a conforming reader. A claim of
+this class MUST NOT be described as establishing anything §10 says a statement does not establish.
diff --git a/internal/policy/official/spec/dialect.md b/internal/policy/official/spec/dialect.md
new file mode 100644
index 00000000..8e609642
--- /dev/null
+++ b/internal/policy/official/spec/dialect.md
@@ -0,0 +1,1829 @@
+# The dialect
+
+## Status
+
+This document is a companion document of the Judgment Pack specification. It is normative for one
+conformance class, the *preparation verifier* (§14), and for nothing else
+([Core §1.1](judgment-pack-core.md#11-normative-artifacts-and-precedence)). It changes nothing in
+Judgment Pack Core `0.2.0-draft`, its schema, its four conformance classes, or either of its
+corpora.
+
+Its design record is [RFC 0018](../rfcs/0018-dialect.md), accepted on 2026-10-15 at draft maturity,
+which is informative; its Specification section, §§1–14 below, is that text. The comment period
+RFC 0000 names was waived by the maintainer, as the RFC's adoption record says.
+
+Its forty-seven vectors, under
+[`conformance/dialect/`](https://github.com/Judgment-Pack/judgment-pack-spec/tree/main/conformance/dialect),
+are the reference Runner's `vectors/preparation/`, byte for byte: nine at commit
+`05636eda96a9588279d61a6272625be859a28117` (Runner pull request 77), which reached the Runner's
+`main` as commit `82116bfab7705f74ca3e493c9722dd3831c7418f` with the same files; the tenth,
+`http-shaped-source`, at the Runner's `main` commit `c84e8e64e5d30c835f8d8e6370cd48e2bfd35ee9`
+(Runner pull request 80), which holds the nine unchanged; and the eleventh and twelfth,
+`version-3-bound` and `unbound-bound-at-import`, the first of dialect version 3, at the Runner's
+`main` commit `89cf44109ad3a9862ab0386811bef63d8a9a1657` (Runner pull request 83, released in
+`v0.12.0`), which holds the ten unchanged; and the twenty-six research vectors, the first of the
+kind `research`, the runs of §11's two examples, at the Runner's `main` commit
+`4352763e22489ca80ffbf5df338b7e7cb61319e2` (Runner pull request 97, not yet released), which holds
+the twelve unchanged; and the thirty-ninth, `skipped-source-dependency-unavailable`, at the Runner's
+`main` commit `ed1bc2a7a02b7475e96178915c36df412e536314` (Runner pull request 105), which holds
+the thirty-eight unchanged; and the fortieth and forty-first, `acquired-dependent-source` and
+`acquired-dependent-source-unknown`, at the Runner's `main` commit
+`694fe691fd8d325cad92ef56e215ee9a3cdaafaf` (Runner pull request 109), which holds the thirty-nine
+unchanged; and the forty-second to forty-seventh, the six `endpoint-scope-` vectors, at the Runner's
+`main` commit `10c073c83ce898ec1a284203b9fd76b269722326` (Runner pull request 142), which holds the
+forty-one unchanged.
+They are **staged** until the next `specVersion` opens: they are in no corpus, no claim may cite
+them, the site does not serve them,
+and no release bundle carries them. When that version opens they move into a corpus, normative for
+this class and for nothing else. Until a specification version publishes them, no
+preparation-verifier conformance claim is available: §14 holds a verifier to the vectors published
+with the version its claim names, and no version publishes these.
+
+It specifies version 2 of the dialect document and of the preparation, which are the Runner's
+mapping v2 and its preparation, restated. Since the amendment of 2026-10-15 (RFC 0018, its
+Amendment), version 2's `operation` reads a gateway source of shape `airbyte`, `mcp` or `http`, as
+the Runner's mapping v2 does since its pull request 80: the vectors of version 2 hold `mcp`, in
+nine and the thirty-ninth to forty-first, and `http`, in the tenth; `airbyte` is defined and not
+claimable (§4.1). That amendment is a compatible extension of the record kind to every adapter
+shape, and one restriction: a receipt that
+attests a page (`pageItems`) is refused, whatever the shape (§5.2). The restriction changes one
+answer the accepted text gave: a signed acquisition of shape `mcp` whose receipt carried
+`pageItems` was read, and is `acquisition-invalid` now. The Runner has never prepared a paged
+acquisition, and no preparation over one exists. It specifies version 3 of the dialect document
+too, which adds four source kinds (§4.3) and the unbound source form (§4.4): the reference Runner
+reads version 3 since its pull request 83 (`v0.12.0`), and twenty-eight of the vectors hold it,
+while the four kinds are proposed: the Runner prepares `research` since its pull request 97, and
+twenty-six of the vectors hold it; no preparer writes the other three, and no vector holds them
+(§4.3). It proposes
+version 1 of the output side (§10). It is published beside the released Core `0.2.0-draft` and
+carries no `specVersion` of its own. Like Core, it is a research preview, at draft maturity.
+
+The research-contract amendment of 2026-10-15 (issue #171, RFC 0018 round 8) adds typed result
+fields, portable AI and web profile binding, explicit reconciliation and two fixture lists.
+Verification still replays retained bytes without calling a model or the web. The amendment
+names the three changed answers to accepted research inputs; `evidence` remains an array of
+non-empty strings. The reference Runner prepares these members since its pull request 97, and
+its twenty-six research vectors hold them. Both repository readers read them since issue #176:
+each recomputes a preparation with a `research` source, and the two agree on every hand-written
+document of the contract's forms and refusals, and on the twenty-six vectors, which the Runner
+recorded after both readers were written, neither reader changed to read them. The two readers'
+agreement is one author's, and no claim rests on it.
+
+The skipped-source amendment of 2026-10-16 (issue #189, option A, RFC 0018 round 12) takes the
+Runner's form in §§9.2–9.3: a skipped outcome keeps its claim and status `unknown`, and each of
+its lineage entries has status `unknown` and names every declared source parameter in
+`dependencies`. Both readers follow; the thirty-ninth vector holds the form. A reader of the
+accepted text answered `preparation-differs` on the Runner's skipped-source bytes and now gives
+a reading, and the old form now gives `preparation-differs`.
+
+The named-artifact amendment (RFC 0021, §2.1) adds exact format selectors `2.0.0` and `3.0.0`
+with independent artifact identities. It preserves both integer formats and all historical vectors.
+
+**Its sources.** Where the Runner's words define the format, this document keeps them; where they
+describe the Runner rather than the format, it says what the format is.
+
+- The Runner's
+ [`docs/MAPPING-V2.md`](https://github.com/Judgment-Pack/judgment-pack-runner/blob/05636eda96a9588279d61a6272625be859a28117/docs/MAPPING-V2.md)
+ at that commit, its subsection "The canonical form of a preparation" above all, and its design
+ record
+ [`docs/design/calculated-values.md`](https://github.com/Judgment-Pack/judgment-pack-runner/blob/05636eda96a9588279d61a6272625be859a28117/docs/design/calculated-values.md).
+ "Runner, *name*" below means the section of `MAPPING-V2.md` of that name, at that commit. For
+ the shapes of an `operation` (§4.1), the same document at the Runner's commit
+ `c84e8e64e5d30c835f8d8e6370cd48e2bfd35ee9`, whose section on the source kinds the Runner's pull
+ request 80 changed. For version 3 as the Runner reads it (§2, §4.3, §4.4), the same document's
+ section "Dialect version 3" at the Runner's commit `89cf44109ad3a9862ab0386811bef63d8a9a1657`.
+- The portable derivation rule the Runner vendors,
+ [`derivation-rule/SPEC.md`](https://github.com/Judgment-Pack/judgment-pack-evaluator-experiments/blob/96fa95874bfaa4d5a01c0c111fd8b5b6613c881c/derivation-rule/SPEC.md)
+ at commit `96fa95874bfaa4d5a01c0c111fd8b5b6613c881c`, restated in §6.3.
+- The reference gateway's
+ [`SPEC.md`](https://github.com/Judgment-Pack/judgment-pack-gateway/blob/v0.15.0/SPEC.md) at
+ `v0.15.0`: its canonical form (§1.1), its version-3 receipt (§1.2a) and its acquire answer (§6).
+ "Gateway §n" below means a section of that document at that release. At the same release, the
+ request forms its adapters read (`adapters/README.md`, "adapter-http" and "adapter-airbyte") and
+ the names its catalog's bindings give (`catalog/README.md`).
+- The reference runtime's ADR-0050, under which an evaluation record carries a caller's binding as
+ given and never interpreted.
+- The checkpoint witness statement, [`spec/checkpoint-witness.md`](checkpoint-witness.md), whose
+ canonical form (its §1) and key rule and equation (its §5) this document adopts by reference.
+
+Where neither the Runner's documentation nor its vectors decide a rule, this document takes a
+position and marks it: "(No vector decides this.)" RFC 0018 lists every such position as its first
+unresolved question. Six more rules, which two readers recorded as choices the text had left them,
+are decided here by the maintainer (RFC 0018, Evidence): the report's form and the exit statuses,
+the extraction of a version-2 record and "but for case" (§11), the byte-bound scans and the nesting
+convention (§12), and a `freshWithin` of another declared type and a requirement id's form (§6.3).
+No vector decides them either, and that question names them too.
+
+The key words **MUST**, **MUST NOT**, **REQUIRED**, **SHOULD**, **SHOULD NOT** and **MAY** are to
+be interpreted as described by BCP 14 when, and only when, they appear in all capitals.
+
+## 1. Terms and the canonical forms
+
+A **dialect** is a pack's terms spoken in a system's: the declared, reusable translation between a
+system and a pack. Its **input side** says how the facts and the evidence availability an
+evaluation takes (Core §8.2) are obtained and derived; its **output side**, which is optional, says
+how a disposition becomes the arguments of a write (§10). A dialect is declarative — pointers,
+types, templates, derivation rules and bindings — and is never code.
+
+The input side is one JSON document, the **dialect document** (§2). A **preparer** applies it, at
+one instant, to a **case** — one JSON document, what an operator typed or a caller sent for one
+evaluation — and to the **acquisitions** its sources name, and writes a **preparation** (§9): how
+each fact and each evidence availability was derived, from which acquisition, under which receipt,
+at which instant. The reference preparer is the Runner. A **preparation verifier** (§14) reads a
+preparation by recomputing it from the same inputs (§11).
+
+A **source** is one declared acquisition, of one **kind** (§4). An **acquisition** is what one call
+for a source returned: for an acquired kind, a gateway's answer and the receipt it signed (§5); for
+the case, and for a file the operator selected, bytes the operator supplied. A `research` source's
+acquisition is instead the research record the caller assembles from retained responses (§4.3).
+Every source has a **class** (§8.2): `asserted`, `record` or `generated`. A **target** is a fact
+pointer or an evidence requirement that a source writes.
+
+A **pointer** is an RFC 6901 JSON Pointer. A pointer **resolves** in a value when each of its
+tokens names a member or an index that exists; otherwise it yields **absent**, which is not `null`.
+A token names an array's element when it is `0`, or a digit other than `0` followed by any digits,
+and its value is below the array's length; a token of any other form, or of any length beyond the
+array's, names none, and no limit of an implementation's numbers applies to it.
+
+A **timestamp** is a string of the form `YYYY-MM-DDThh:mm:ssZ`, a digit where each letter but `T`
+and `Z` stands: UTC, whole seconds. Its **instant** is its count of seconds since
+`1970-01-01T00:00:00Z` in the proleptic Gregorian calendar, when the date and time it writes exist:
+month `01` to `12`, a day the month has, hour `00` to `23`, minute and second `00` to `59`. A string
+of the form that names no time, such as `2026-02-30T00:00:00Z`, has no instant, nor has any other
+string.
+
+Hexadecimal is lowercase throughout. A **digest** is the string `sha256:` followed by 64
+hexadecimal characters; the **digest of** some bytes is that string for their SHA-256. A **key** is
+the 32-byte encoding of an Ed25519 public key, written as 64 hexadecimal characters; its **key
+identifier** is the first 32 hexadecimal characters of the SHA-256 of the 32 bytes. A key is held to
+the key rule of the checkpoint witness statement, its §5, before anything signed under it is read,
+and a signature to the equation of that section: RFC 8032's check without the cofactor, with a
+canonical scalar.
+
+**Reading a document.** Every JSON document this document names — a dialect, a case, the
+acquisitions, the profiles, a preparation, a record — is read strictly: exactly one JSON value
+(RFC 8259), with only whitespace around it; no member name given twice in one object; every string
+well-formed Unicode, a lone surrogate written as an escape included. A document that is not so
+read is refused (§11). A number is read as its literal, its characters kept: a reader that reads a
+number as a binary floating-point value and writes it again does not read it as this document
+does. Every object this document defines is closed: a member it does not list is refused, and so
+is a member it lists that is of another type or form. Member names are matched exactly, so a name
+that differs from a listed one only by case is an unknown member.
+
+**Integers.** An **integer** is a number whose literal is an optional `-` followed by `0`, or by a
+digit other than `0` and any further digits, with no fraction and no exponent, and whose value is
+from −(2⁵³−1) to 2⁵³−1. `-0` is an integer, and wherever a preparation carries one it keeps its
+literal (§9.5). `1.0`, `1e2` and `9007199254740992` are not integers.
+
+**The gateway canonical form**, `canon`, of a value is the canonical form of the checkpoint witness
+statement, its §1, which is the gateway's (gateway §1.1). Its domain is objects with no member name
+given twice, arrays, well-formed strings, integers, `true`, `false` and `null`. Its output orders
+an object's members by the code points of their names, keeps an array's order, has no whitespace,
+writes a string as raw UTF-8 with only `"` and `\` and the characters below U+0020 escaped (`\"`,
+`\\`, `\b`, `\f`, `\n`, `\r`, `\t`, and `\u00` with two hexadecimal digits for every other one),
+and writes an integer in decimal digits, `-0` as `0`. A value outside the domain, a number that is
+not an integer above all, has no `canon` form and no digest. Every digest of §§2–8 is the digest of
+a value's `canon` bytes: a dialect's, a profile's, a read's, an acquisition's result's, and the
+commitment to a request.
+
+**The preparation's canonical form** (§9.5) is another form, the one a preparation is digested in:
+it escapes `&`, `<`, `>`, U+2028 and U+2029, and keeps each number's literal. The two forms are
+never interchanged.
+
+## 2. The dialect document
+
+The dialect document is one JSON object. Its version 2 is the Runner's mapping v2 document: a
+mapping v2 document the Runner accepts is a version-2 dialect document, with the same bytes and the
+same digest. The one exception is a request's `query` under a profile whose adapter is the gateway's
+`adapter-http`, which the Runner holds to the rules of a template alone and this document to string
+templates as well (§4.1). Version 3 (§4.3, §4.4) is read by the reference Runner since its pull
+request 83, released in `v0.12.0`: it prepares an `operation`, bound or unbound and bound at import,
+and a `selected-file`, and refuses each of the other four kinds by name.
+
+| Member | Form | Meaning |
+| --- | --- | --- |
+| `version` | the integer `2`, or `3` (§4.3, §4.4) | the dialect version, per which the source kinds (§4) and every form of this document are closed |
+| `case` | an object (§3), REQUIRED | the case's parameters, and the facts and evidence copied from the case |
+| `sources` | an array of at most 16 sources (§4), optional | absent is the empty array |
+| `admits` | an object (§8.2), optional | the classes a target admits, where they are not the default |
+| `unmapped` | an array of distinct pointers, optional | fact pointers a pack reads that the author acknowledges are not mapped |
+| `unmappedEvidence` | an array of distinct non-empty strings, optional | evidence requirements a pack declares that the author acknowledges are not mapped |
+| `provider` | the string `""`, optional, of version 2 only | a member of the Runner's version-1 mapping, which its encoding of a version-2 document carries empty |
+| `facts`, `evidence` | `null`, optional, of version 2 only | the same |
+
+`unmapped` and `unmappedEvidence` are for review of a dialect against a pack's inventory (Runner,
+"Release checks, runtime and offline verification"): no preparation reads them, and a verifier
+holds them to their form and to nothing else.
+
+The **dialect digest** is the digest of the document's `canon` bytes, every member it holds
+included. The same document with an optional member written out, as the Runner's encoding writes
+`provider`, `facts` and `evidence`, or left out, has another digest: a verifier takes the document
+as it was given and adds or removes nothing. A document outside the `canon` domain is refused.
+
+**Version 3 is written one way.** `provider`, `facts` and `evidence` are members of version 2 alone:
+a document of version 3 carries none of them, and one that names one is refused. And version 3 is
+held to the reference Runner's encoding rule: the Runner keeps a document of version 3 only as its
+encoding writes it, and its encoding leaves out a member it holds empty where the member is optional
+and of an array or object type that it omits when empty. So, in version 3, `sources`, `unmapped` and
+`unmappedEvidence` written as the empty array, and the case's `parameters`, a source's `parameters`,
+and the `facts` and `evidence` of `admits` written as the empty object, are refused, since a document
+so written would be kept under another digest than its own. Every other member written empty is kept
+as written and read: `admits` itself, a copy's `facts` and `evidence` (§6.2), and the members of the
+kinds of §4.3, `query`, `body` and `headers` among them. (No vector decides either refusal.)
+
+Version 1 is no dialect: the Runner's version-1 file mapping has no preparation. The numbering is
+the Runner's, kept so that every mapping v2 document is a version-2 dialect document byte for byte.
+
+## 2.1. Named artifact formats
+
+The amendment recorded in RFC 0021 adds two explicitly selected formats, `2.0.0` and `3.0.0`.
+Neither is an alias for an integer format. Historical documents and their digests stay unchanged.
+A document in either named format has these REQUIRED root members, instead of the integer
+`version` of §2:
+
+| Member | Form | Meaning |
+| --- | --- | --- |
+| `formatVersion` | exactly `"2.0.0"` or `"3.0.0"` | selects the translation forms of integer version 2 or 3 respectively, with the identity and encoding rules here |
+| `id` | a non-empty string of at most 1024 UTF-8 bytes, with no ASCII control character, space or DEL | stable, opaque artifact-series identifier; compared as written, without URI, Unicode or case normalization |
+| `version` | a string matching `(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)` in its entirety | independent artifact version, using Core's three-component grammar |
+
+A URN is RECOMMENDED for globally published ids, for example
+`urn:judgmentpack:dialect:company-qualification`. The id is not resolved or fetched. The format
+selector and artifact version are independent: `formatVersion: "3.0.0"` with `version: "0.1.0"`
+is valid. Decimal components are compared by their mathematical integer values, without rounding.
+No prerelease/build suffix, leading zero, number/string coercion or assumed major-version
+compatibility is allowed. An unknown selector is refused; a reader MUST NOT guess a legacy format.
+An integer-format document MUST NOT carry `formatVersion` or `id`.
+
+The remaining members have the forms of the selected family. In **both** named formats, the
+version-3 encoding rule in §2 applies: no root `provider`, `facts` or `evidence`, and none of the
+optional empty arrays/objects listed there. The family-2 source restrictions remain in force in
+`2.0.0`; it does not gain unbound or research sources. Identity does not make an unsupported source
+executable. No output-side document or pack-free preset is admitted by these input-side formats;
+those artifacts need their own format contract and cannot silently share this identity.
+
+The canonical document includes all three identity members. Its digest is over those exact
+canonical bytes, never a projection into a legacy format. Changing id, artifact version, format,
+source binding or translation content changes that digest. A preparation's integer `version`
+remains **2 or 3**, selected by the translation family; it identifies the preparation format,
+not the artifact version. Its `mappingDigest` commits the complete named document. Historical
+preparation bytes and vectors are not rewritten.
+
+Binding (§4.4) keeps the identity members and transforms only the permitted source assignments.
+The published document, binding document and derived bound document have separate digests. A
+bound derivative is an installation product, not a replacement publication under the same
+`(id, version)`. A portable reference to a published artifact carries its `id`, `version` and
+published document `digest`; a consumer MUST check all three against the supplied document.
+An installation additionally retains the binding and bound-document digest. It MUST NOT resolve
+an unpinned latest version or substitute the bound digest for the published digest.
+
+A publication authority MUST keep `(id, version)` immutable within its catalog: different canonical
+content under an existing pair is refused. Identical canonical content under the same pair may
+return the completed receipt. These requirements govern publication, not document-only validation
+or installation binding. An authoring tool MUST NOT claim that document validity proves a fresh
+version, publication permission, binding readiness or truth of source data.
+
+Version arithmetic is shared tooling; compatibility classification is an author/reviewer decision.
+A compatible correction suggests patch, a compatible addition minor, and a breaking declared
+contract major. Passing tests alone do not establish compatibility. No-op saves, draft autosaves,
+research, import of records and execution do not create an artifact release. Jobs pin an exact
+reviewed release; upgrades are separate operations. Promotion of a pre-1.0 artifact at first job use
+is a product publication policy, not a preparation-verifier rule. A product using that policy MUST
+publish and pin the promoted content before the job starts, rather than relabeling an existing job.
+
+## 3. The case and parameters
+
+`case` is an object of exactly `parameters`, an object, optional, absent being the empty object;
+`facts`, an array of fact copies; and `evidence`, an array of evidence copies (§6.2). The case is
+the source named `case`, of class `asserted`: what `facts` and `evidence` copy from the case
+document is what the operator supplied.
+
+A **parameter** has a name, a type and a value. The types are `string`, a JSON string; `integer`,
+an integer (§1); and `timestamp`, a string that has an instant (§1). A name is a non-empty string,
+and `runAt` is reserved.
+
+- A **case parameter** is declared in `case.parameters` as `"name": {"pointer": P, "type": T}`,
+ exactly those two members. Its value is the case document's value at `P`, which MUST resolve and
+ MUST be of type `T`; otherwise the preparation fails, `parameter-invalid`.
+- A **source parameter** is declared in a source's `parameters` (§4) as
+ `"name": {"from": S, "pointer": P, "type": T}`, exactly those three members. `S` names a source
+ earlier in `sources`, and `P` is a fact target of `S` (§8). Its value is the value at `P` in the
+ facts of `S`'s claim (§6), taken only when that claim's `acquisitionStatus` is `resolved` and it
+ gives a value at `P`. When it does not — `S` was skipped, its claim is not `resolved`, or it gives
+ no value at `P` — the source that declares the parameter is **skipped** (§9.2). A value that is
+ there and is not of type `T` fails the preparation, `parameter-invalid`. A source parameter
+ cannot have the name of a case parameter, and `S` cannot name the source that declares it or a
+ later one.
+- **`runAt`** is in every scope, of type `timestamp`. Its value is the preparation's `verifiedAt`
+ (§9.1). A derivation rule may read it (§6.3); a request template that names it is refused (§4.1).
+
+A source's **scope** is the case parameters, its own source parameters, and `runAt`, at most 64
+parameters. The case's scope is the case parameters and `runAt`.
+
+## 4. Sources and their kinds
+
+A source is an object with these members, and those its kind adds:
+
+| Member | Form | Meaning |
+| --- | --- | --- |
+| `name` | a non-empty string, not `case`, distinct among the sources | the source's name, which its outcome, its lineage entries and its acquisition carry |
+| `kind` | a kind of the document's version | what is declared, and how it is acquired |
+| `parameters` | an object of source parameters (§3), optional | |
+| `read` | a read (§6), REQUIRED | how the value acquired becomes a claim |
+
+The kinds (the class a binding takes follows §5.1):
+
+| Kind | Version | Class | What is declared | Vectors |
+| --- | --- | --- | --- | --- |
+| `operation` | 2 | the profile's | a read of a gateway source of shape `airbyte`, `mcp` or `http` that an input profile pins, and a template of its request (§4.1); in version 3, also unbound (§4.4) | of shapes `mcp` and `http`; in version 3, of shape `mcp` bound and of shape `http` unbound |
+| `selected-file` | 2 | `asserted` for `local-file`, `record` for `google-drive` (§5.1) | a document the operator selected (§4.2) | none |
+| `http` | 3, proposed | the profile's | a request to a gateway HTTP source: method, path, query and body templates, header names (§4.3) | none |
+| `sql` | 3, proposed | the profile's | a statement on a connection, with its bound parameters (§4.3) | none |
+| `web` | 3, proposed | `record` (§5.1) | a public page by URL through the gateway (§4.3) | none |
+| `research` | 3, proposed | `generated` | a recipe (§4.3), also unbound (§4.4) | none |
+
+A version-2 document that names a kind of version 3, or has an unbound source (§4.4), is refused.
+**A kind without vectors is defined, and not claimable**: a verifier's claim names the kinds it
+reads (§14), and may name only kinds that the vectors published with its specification version
+exercise; and so with the shapes of an `operation`, and with a version. Today the staged vectors
+exercise the case and `operation` of shapes `mcp` and `http` in version 2, and in version 3 the case
+and `operation` of shape `mcp`, bound, and of shape `http`, unbound and bound at import (§4.4); none
+is published.
+
+### 4.1 `operation`
+
+An `operation` source has, besides the members of §4, exactly:
+
+| Member | Form |
+| --- | --- |
+| `profile` | a non-empty string: the `id` of an input profile (§5.1) |
+| `profileDigest` | a digest: that profile's digest |
+| `maxAge` | an integer from 1 to 86400: seconds |
+| `arguments` | the template of its request: an object, and not a template form (below) |
+| `calculation` | an object (§7), present exactly when the profile is a calculator's |
+
+An `operation` reads a gateway source of an adapter's shape, `airbyte`, `mcp` or `http`, which its
+profile's `shape` names; a profile of shape `command` serves none. Its `arguments` are an object,
+and not a template form, held to the rules of a template (below); what more its request must be
+follows the shape:
+
+- **`mcp`**, a tool call: exactly `tool`, a non-empty string, and `arguments`, a template. `tool`
+ MUST be among the profile's `tools`.
+- **`http`** and **`airbyte`**: the request the gateway source of that shape takes, as its adapter
+ or its connection defines it. The gateway's `adapter-http` takes `{method, path, query, body}`,
+ `query` and `body` optional and `query`, when present, an object of string values; a connection
+ takes the form its provider documents in the gateway's `adapters/README.md`, such as
+ `{connection, revision, read, …}`; and `adapter-airbyte` takes a stream read, `{stream, namespace,
+ limit, state}`. These are examples of the forms the gateway defines, and not a closed list: this
+ document holds such a request to being an object, to the rules of a template every request has,
+ and to the receipt's commitment to it (§5.2, check 4), and not to a set of members. One rule more
+ holds `adapter-http`'s `query`: under a profile whose adapter is `adapter-http`, by its
+ `adapter.name`, a request's `query`, when it has one, MUST be an object, not a template form,
+ each of whose members is a string template. The gateway's `adapter-airbyte` answers every read
+ with a page, and an acquisition of a page is not read (§5.2), so no acquisition of shape
+ `airbyte` is read today and no vector holds one: the shape is defined, and not claimable.
+
+A **string template** is a string, a `$text`, or a `$param` naming a parameter of type `string` or
+`timestamp`. An `arguments` that is not an object, or is a template form, is refused with the
+dialect (§11). A request that does not fit its profile — under a profile of shape `command`, any;
+under one of shape `mcp`, one that is not a tool call or names a tool the profile does not allow;
+under one whose adapter is `adapter-http`, a `query` of another form — is `profile-mismatch`
+(§5.1). (No vector decides the shape `airbyte`, a connection's request, `POST`, a `body`, a
+template form in `path`, or a request with no `query`.)
+
+**Templates.** A template is a JSON value in which an object one of whose member names begins with
+`$` is a **template form**, which MUST be exactly one of:
+
+- `{"$param": N}`, `N` a string: replaced, as a whole value, by the value of the parameter `N`, of
+ any type, its literal kept;
+- `{"$text": T}`, `T` a string: replaced by the string `T` with each **placeholder** in it replaced.
+ A placeholder is `{{`, a parameter name, and the next `}}`; it MUST name an `integer` parameter,
+ and is replaced by that integer's decimal digits as `canon` writes it, `-0` as `0`. A `{{` with no
+ `}}` after it is refused, and a `}}` outside a placeholder is taken as it is. (No vector decides
+ the last two rules.)
+
+Every other value of a template is literal, taken as it is, an object or an array member by member.
+A name a template form gives MUST be in the source's scope, and MUST NOT be `runAt`, which no request
+can carry. A literal object whose only member's name begins with `$` cannot be written. The
+**request** of an `operation` source is its `arguments` instantiated as a template — of shape `mcp`,
+`{"tool": tool, "arguments": A}`, `A` its instantiated template — and MUST be in the `canon`
+domain.
+
+A request **commits** a parameter when it carries it unambiguously: as a whole value, `$param`,
+anywhere in it, or in a `$text` whose placeholders name it and no other parameter. A `$text` whose
+placeholders name two or more parameters commits none of them: `{{a}}{{b}}` renders `1` and `23` as
+it renders `12` and `3`.
+
+### 4.2 `selected-file`
+
+A `selected-file` source names a document the operator selected, by its member `provider`:
+`local-file`, a file on the operator's machine, of class `asserted`, with no profile, no `maxAge` and
+no request; or `google-drive`, a Drive file read through a gateway source that a `drive` input
+profile of class `record` (§5.1) pins, with `profile`, `profileDigest`, `maxAge` and `arguments` as
+in §4.1, its `fileId` and the consumed selection `grant` resolved from typed case parameters. Its
+acquisition is the Runner's selected snapshot (Runner, "Supported input and trust configuration"),
+whose form this document does not restate. The kind is defined, and not claimable: no vector holds
+one, and a version that admits it to a claim states the snapshot's form first.
+
+### 4.3 Kinds proposed for version 3
+
+Version 3 is version 2 with four kinds more, and with the unbound source form (§4.4); a document
+of version 3 has `version` `3`, and so has its preparation (§9.1). The reference Runner reads
+version 3 since its pull request 83 (`v0.12.0`), and prepares its `operation` and `selected-file` as
+it prepares version 2's. Those four are proposed. The reference Runner prepares `research` since
+its pull request 97, and twenty-six staged vectors hold it (§11); no preparer writes the other
+three, and no vector holds one. Both repository readers read `research`
+since judgment-pack-spec#181; neither repository reader reads `http`, `sql` or `web`: each holds
+one to its form and refuses it as `kind-unread`; the reference Runner refuses those three by name.
+The forms below are what a writer, such as the Desk's inputs or an entry of the Exchange, needs
+to declare one; the first implementation's vectors will fix each request's exact bytes, and may
+change them. Since version
+2's `operation` reads a source of each adapter shape (§4.1), the `http` and `sql` kinds describe how
+a request is formed — a body and headers, a statement and its bindings — and not how a configured
+source is read. A source of each of these kinds is an object of exactly the members of §4 —
+`name`, `kind`, `parameters` (its source parameters, as every source's) and `read` — with `profile`,
+`profileDigest` and `maxAge` as in §4.1, and the members its kind names below. A `research` source
+instead has §4.4's bound or unbound profile assignments, and keeps `maxAge`. Except for `research`,
+each is acquired through the gateway source its profile pins, so §5's checks apply with the shape
+the profile names. A `research` source retains responses acquired through the gateway sources
+their own profiles pin, as below. The value acquired is read as every value is (§6).
+
+- **`http`**, a request to a gateway source of shape `http` (the gateway's `adapter-http`):
+ `method`, `GET` or `POST`; `path`, a template that yields a path under the profile's endpoint;
+ `query`, optional, an object of string templates; `body`, optional, a template, refused beside
+ `GET`; and `headers`, optional, the names of the headers the profile's source is configured to
+ send, for review. A dialect names a header and never its value: values and credentials are the
+ gateway's configuration and never a dialect's. The request is `{"method", "path", "query",
+ "body"}`, as `adapter-http` reads one.
+- **`sql`**, a statement on a connection the profile names, such as the gateway's Databricks
+ connection: `statement`, a fixed string and never a template, so that the statement's structure
+ and identifiers are fixed; and `bindings`, an array of `{"name", "type", "value"}`, each `value` a
+ `$param` form, which the connection binds as the provider's named parameters. `bindings` is not
+ `parameters`, which declares the source's parameters as every source's does, so a `sql` source
+ can take a value from an earlier source and bind it. No text is substituted into a statement.
+- **`web`**, one public page by URL through the gateway's web source (`adapter-web`, shape
+ `http`): `url`, a string, or a `$param` form naming a `string` parameter. The request is
+ `{"url": url}`, and the value acquired is the attachment record the web source returns.
+ Its first reader must hold §5.1's class check, including its refusal; a vector of that refusal
+ waits for a Runner that prepares this kind. (No vector decides this.)
+- **`research`**, an AI-assisted research recipe, of class `generated`. Besides §4's members,
+ `maxAge` and its profile assignments (§4.4), it has exactly `question`, a string template;
+ `constraints`, an object in the `canon` domain; `model`, a non-empty string of at most 256 UTF-8
+ bytes; `evidence`, an array of non-empty strings, each at most 4096 UTF-8 bytes, describing
+ the evidence to retain; `fields`, the requested fields below; and `capabilities`, an array of
+ distinct names from the closed set `answer`, `search`, `page`. `answer` is REQUIRED; the others
+ name the web capabilities needed. The array follows that order and has one to three entries.
+ A published source is unbound (§4.4), carrying no installation identifier.
+
+ The source's request is exactly `{"question", "constraints", "model", "evidence", "fields",
+ "capabilities"}`, with `question` instantiated as a template. These members, the fields' order
+ and every field declaration, the read and its source order (§6.4), and all supplied profile
+ assignments enter the dialect digest (§2). No defaults are inserted. The recipe is recorded,
+ never re-executed by verification. Its model and capabilities are checked against the profiles
+ then bound (§5.1); this checks declarations, not the actual model or its answer. Each retained
+ response's own `request`, below, is what its receipt commits. No model output is produced or
+ compared. `evidence` cannot weaken the citation requirements below.
+
+ The source's acquisition is the **research record**, `R`, an object the caller assembles, with
+ exactly two members: `fields`, the answers below, and `responses`, an array of at most 64
+ retained responses, the AI connection's answers and the web reads retained with it, in the order
+ the run made them. Each response is an object of exactly `profile`, `request`, `result`,
+ `receipt` and `salts`. `profile` is an object of
+ exactly `id`, a non-empty string, and `digest`, a digest, naming the trusted input profile the
+ response came through (§5.1). `request` is the request made, an object in the `canon` domain;
+ `result` is the returned JSON value; `receipt` and `salts` have §5.2's forms. The receipt's
+ `resultDigest` names the result by its digest. The acquisitions carry exactly the responses `R`
+ names, by form; a response `R` names whose result bytes the acquisitions lack is
+ `acquisition-missing` (§5.2).
+
+ `R` is carried as the source's `response.result` (§5.2), and the source's read (§6) starts from
+ `R`, not from each response's result separately. The record's own `receipt` and `salts` are
+ present beside `result` in that `response` when `R` came back through a gateway source, and
+ absent otherwise. Membership and order in `responses` are the caller's assertion: verification
+ uses `R`'s order and does not establish that assertion (§13). A page cited by URL alone is no
+ retained response; the claim it supports is the answer's say. Section 5.1 gives the class check
+ and its finding. The kind is defined, and not claimable: its vectors are staged (§11,
+ §14).
+
+**Requested fields.** A research source's `fields` is an ordered array of 1 to 64 closed objects,
+each exactly `{"name", "type", "required", "description"}`. `name` has §4's source-name form: a
+non-empty string other than `case`, here bounded to 64 UTF-8 bytes and distinct within this array.
+It is a stable identifier, not a display label; changing it changes the contract. `description`
+is a non-empty string of at most 2048 UTF-8 bytes. `required` is a boolean: it requires an answer
+entry, never a value. `type` is exactly one of the following strings, with these JSON encodings:
+
+- `integer`: an integer in §1's domain, including `0` and `-0`; no fraction or exponent.
+- `decimal`: a string of at most 128 ASCII characters in Core §2.2's decimal grammar,
+ `-?(0|[1-9][0-9]*)(\.[0-9]+)?`, matching the whole string. A JSON number, exponent, leading
+ plus, leading zero or empty string is not a decimal. Signs, scale and trailing zeroes are
+ retained: `"1.0"` and `"1.00"` remain distinct strings under §6.3's equality. This adopts Core's
+ lexical form only and adds no coercion, units or decimal operators to a rule.
+- `boolean`: JSON `true` or `false`, never a string or a number.
+- `text`: a well-formed JSON string of 0 to 8192 UTF-8 bytes; the empty string is a value.
+- `text-list`: an array of 0 to 64 well-formed strings, each of 0 to 1024 UTF-8 bytes. Order,
+ duplicates and empty strings are kept; an empty list is a value, not an absent answer.
+- `range`: a closed object of exactly `min` and `max`, both integers as above or both decimal
+ strings as above, never mixed; `min` is at most `max` by exact mathematical comparison.
+ Comparison uses the decimal digits, never binary floating point, and changes no spelling.
+ An equal-endpoint range is allowed. No open endpoint, `null` endpoint or extra unit is allowed.
+
+**Answers.** `R.fields` is an object of at most 64 members, keyed by declared field name. An
+undeclared name is refused. Every required field has an entry; an optional field may be absent.
+An entry is a closed object with `status` and `cites`, and the conditional `value` or `values`:
+
+- `found`: `value` is present, of the declared type; `values` is absent. `cites` has 1 to 64
+ distinct indices into this record's `responses`.
+- `not-found`: neither `value` nor `values` is present. `cites` has 0 to 64 distinct indices,
+ naming retained responses about the unsuccessful search when any are given.
+- `stale`: neither `value` nor `values` is present. `cites` has 0 to 64 distinct indices. The
+ caller asserts that an observation was made; it is cited when `cites` names it. No observation
+ is a resolved value here.
+- `conflicting`: `value` is absent; `values` is an array of 2 to 64 closed objects, each exactly
+ `{"value", "cites"}`. Each `value` has the declared type and each `cites` has 1 to 64 distinct
+ response indices. At least two values differ under §6.3's JSON equality. Observations remain
+ in their recorded order, without choosing one or coercing them. The entry's outer `cites` is
+ `[]`; citations belong to each observation and are not replaced by a common list.
+
+An index is an integer from `0` below `responses`' length, written without `-0`; indices in
+each citation array are distinct by value. Any other index, a repeated value or a URL in place
+of an index is `input-malformed`. This range is a form, not a §12 maximum. An index names the
+whole retained response, not a URL, an excerpt id or the preparation's `cites`. Array order is
+kept. A cited response with missing bytes still gives `acquisition-missing` (§5.2).
+A receipt holds the cited bytes; it does not establish that they support the value. An answer's
+status is the caller's assertion. In particular, `stale` describes an observation's currency,
+not an exception to receipt freshness: an expired retained
+receipt still fails as `acquisition-stale` (§5.2).
+
+Absence is permitted only for an optional entry and for the conditional members just stated.
+`null` is never an entry or a value, including a conflicting value, list item or range endpoint.
+It may occur in a retained response's arbitrary result, where it remains evidence, not a typed
+answer. Zero, `false` and `""` are present values only of their declared types; none means
+`not-found`. A required entry may have any of the four statuses. A missing required entry, wrong
+type, unknown member or status, misplaced `value` or `values`, reversed range, repeated field
+name or invalid citation is `input-malformed`; exceeding a maximum is `input-over-bound` (§11).
+The same rules hold every entry, whether or not the read uses it. (No vector decides this.)
+
+**Reading fields.** In a plain research read, the pointers a copy or rule may read form a closed
+list: `/fields`, `/fields/`, `/fields//value` and its descendants,
+`/fields//status`,
+`/fields//values//value`, and `/fields//cites`. The name is escaped as one
+RFC 6901 token. A range's endpoints append `/min` and `/max` to `value`; a text-list item appends
+its index. These are pointers into `R`, not pack targets. Any other read pointer is
+`input-malformed`; `/responses/...` is not readable by a read. Retained responses are for replay.
+A copy of a missing `value` writes nothing (§6.2); a rule guards a value with its status and
+follows §6.3. A read may retain the whole field entry for review. A plain research read MUST NOT
+take a `from` under `values`; that `from` is `input-malformed`, as in §6.4. That section defines
+reconciliation's combined value and pointers.
+Deterministic sources keep their target declarations and gain no `fields` member.
+
+`R.fields`, every status, value, observation and citation index, and `R.responses` in its order
+are all in `R`'s `canon` bytes. The record's receipt commits all of them when present; without
+one, fields as well as response membership and order are the caller's assertion. The preparation
+commits the bound dialect, derived claims and receipt citations in §9's existing form; it gains
+no whole-record digest. A change to an unread, unreceipted field need not change that preparation.
+
+### 4.4 The unbound source form (version 3)
+
+An `operation` that names its profile by its digest pins the installation it was written under: the
+gateway's key, its source and authority, its adapter and its endpoint (§5.1). Version 3 gives an
+`operation` an **unbound** form, which names instead what an installation binds it to: the catalog
+binding and operation it is read through, the shape that serves it, and the record it is written
+against. A dialect is published unbound, as an entry of the Exchange holds one, and bound by the
+installation that adopts it.
+
+An unbound `operation` source has, besides the members of §4, exactly:
+
+| Member | Form |
+| --- | --- |
+| `platform` | a non-empty string: a platform of the gateway's catalog, as its binding names it (`platform`) |
+| `operation` | a non-empty string: an operation of that binding, as its `operations` name it |
+| `shape` | `airbyte`, `mcp` or `http`: the shape that serves the operation |
+| `record` | a non-empty string: the program whose answer the read is written against, as a profile's `adapter.name` names it (§5.1) |
+| `maxAge` | as in §4.1 |
+| `arguments` | as in §4.1 |
+| `calculation` | as in §4.1, optional |
+
+It has no `profile` and no `profileDigest`. The catalog's names are the gateway's
+(`catalog/README.md`), and a verifier holds them to their form and to nothing else.
+
+**Research binding.** A published `research` source has §4.3's members, including `model` and
+`capabilities`, and none of `profile`, `profileDigest` and `webProfiles`: it is unbound. It names
+requirements, with no connection id, endpoint, credential or other installation identifier.
+Its bound form adds all three members. `profile` and `profileDigest`, as in §4.1, name the AI
+profile for `answer`. `webProfiles` is a closed object with exactly the `search` and `page`
+capabilities the source requests as keys; each value is exactly `{"profile", "profileDigest"}`,
+of those same forms. It has zero to two members and is REQUIRED even when empty. One profile may
+serve more than one capability, subject to §5.1's class rule. A source with
+only some of the three binding members, or any operation catalog member, is `input-malformed`.
+The new required members stay written when empty; §2's one-spelling rule is unchanged.
+
+**The binding document.** An installation binds an unbound dialect with a **binding document**: one
+JSON object of exactly `dialect`, the unbound dialect's digest (§2), and `sources`, an object
+mapping the name of each unbound source of that dialect, and no other name, to its assignment.
+For an `operation` that assignment is exactly `profile`, a non-empty string, and `profileDigest`,
+a digest: an input profile of the installation's gateway, by its `id` and its digest. For
+`research` it is exactly `profile`, `profileDigest` and `webProfiles`, of the forms above, with
+exactly the requested web capabilities. Its digest is the digest of all its `canon` bytes.
+It is neither the record's `binding` (§9.5) nor a binding of the gateway's catalog.
+
+**The name `record` carries.** `record` names the program, as a profile's `adapter.name` names it
+(§5.1) and as the receipt the gateway writes carries it, and never the name of a result contract in
+a gateway's catalog, such as `web-search-v1`. A gateway's catalog that names the program of each
+source contract does so beside the contract, under a member of its own, `adapter` (from the
+gateway's catalog version 4), for every source of a shape this section admits. An authoring tool
+copies that `adapter` into the unbound source's `record`, and never the contract's own `record`. A
+source of shape `command` names no program this way and serves no operation (§4.1).
+
+**The bound dialect** is the unbound dialect with the binding applied. For each unbound
+`operation`, `platform`, `operation`, `shape` and `record` are removed, and the binding document's
+`profile` and `profileDigest` are added; every other member is kept as written. For
+`research`, the three assignment members are added, and every other member is kept as written:
+there are no operation catalog names to remove, and `model`, `capabilities` and `fields` remain.
+It is a document of version 3 with no unbound source, and its digest (§2) is the one a
+preparation of it carries as `mappingDigest`. The unbound dialect's digest is the one its
+publisher names, as an entry of the
+Exchange names `dialect.digest` (RFC 0019 §3); the bound dialect's is the installation's, and one
+dialect bound under two installations' profiles has two.
+
+**Verifying it.** A verifier given a dialect with an unbound source is given its binding document
+too, and reads the bound dialect as this document reads every dialect, with these added checks. A
+binding document whose `dialect` is not the given dialect's digest, or whose `sources` do not name
+exactly its unbound sources, is refused with the dialect, as is a dialect with an unbound source
+and no binding document, and a binding document beside a dialect with none (§11). For an
+`operation`, a profile the binding document names whose `shape` is not the unbound source's
+`shape`, or whose `adapter.name` is not its `record`, is `profile-mismatch` (§5.1). A fixture of
+an unbound dialect carries the binding document it was recorded under, and verifies against the
+bound dialect.
+
+The binding checks of §5.1 hold research too, including a bound dialect given directly. Its AI
+profile MUST declare the exact `model` and capability `answer`; each assigned web profile MUST
+declare the capability it serves. A profile that declares a model MUST name the source's model.
+A missing profile, digest mismatch, missing research declaration, wrong model or missing capability
+is `profile-mismatch`; §5.1 gives the class check and its finding.
+Extra or missing assignment members, a capability assigned twice, or an assignment for an
+unrequested capability is `input-malformed`. No substitution of another model is implicit.
+
+**What it establishes.** Nothing beyond what an `operation` that names its profile establishes
+(§13). The binding document is the installation's statement of which profile each source was bound
+to. A preparation commits the bound dialect, by its digest, and with it the profile each source was
+bound to; it commits neither the binding document's digest, nor the published dialect's digest, nor
+the catalog names the binding removes (`platform`, `operation`, `shape` and `record`). Two published
+dialects that differ only in those names, bound to the same profiles, have one bound dialect and one
+digest. A record that binds the preparation commits what the preparation commits, under the
+record's signature, the installation's own key. The reference Runner
+writes version 3 since its pull request 83 (`v0.12.0`): it binds an unbound dialect at import, with a
+binding document the operator supplies, and records the bound dialect's digest. The staged vector
+`unbound-bound-at-import` holds the form, with its binding document; no specification version
+publishes it, so the form is not claimable yet (§14). (That vector decides the bound dialect and its
+digest; no vector decides the refusals of this section.)
+
+For research, the same commitment holds: the preparation commits only the bound dialect's
+digest, including all AI and web profile ids and digests, the model, capabilities, fields and
+read. Neither the published digest nor the binding-document digest is added to §9.1. Rebinding
+one assignment changes the bound digest. Replay uses the profiles then bound and the retained
+bytes, never a live connection or a new model answer; it establishes no answer's correctness
+(§13). The reference Runner prepares `research` since its pull request 97; twenty-six research
+vectors are staged.
+
+## 5. Input profiles and acquisitions
+
+### 5.1 Input profiles
+
+An **input profile** is an installation's public configuration for one gateway source: an object of
+exactly
+
+| Member | Form |
+| --- | --- |
+| `id` | a non-empty string, distinct among the profiles |
+| `publicKey` | a key (§1): the gateway's |
+| `class` | `record` or `generated` |
+| `source`, `authority` | strings: the gateway's source name and authority label |
+| `shape` | `airbyte`, `mcp`, `http` or `command` |
+| `adapter` | an object of exactly `name` and `version`, strings, and `digest`, a digest |
+| `endpoint` | a string, or `null` |
+| `endpointScope` | an optional array of endpoint prefixes (§5.1 below) |
+| `tools` | an array of distinct non-empty strings, optional, which a profile of shape `mcp` MUST give and MUST NOT give empty |
+| `calculator` | an object of exactly `name` and `version`, strings, optional: the profile is a calculator's (§7) |
+| `research` | an optional closed object of `capabilities` and conditional `model`, as below |
+
+Its **digest** is the digest of its `canon` bytes. A calculator's profile MUST be of class `record`
+and shape `mcp`. A profile whose key the key rule refuses is refused.
+
+A profile may additionally declare `research`, a closed object of `capabilities` and, exactly
+when they include `answer`, `model`. `capabilities` is a non-empty array of distinct names from
+`answer`, `search`, `page`, in that order, at most three; `model` has §4.3's form. Web-only
+profiles name no model. This whole declaration enters the profile digest. Malformed members
+are `input-malformed`; a well-formed profile without the declaration or with unsuitable
+capabilities or model is `profile-mismatch` when bound to research (§4.4). This extension
+changes no operation binding check and makes no claim about model weights or execution.
+
+**An endpoint constraint.** `endpointScope` is an array of 1 to 32 distinct strings, each at
+most 2048 UTF-8 bytes, in the forms below. Distinct means unequal as JSON strings. Order is kept;
+no entry is added, removed or rewritten. Its whole value enters the profile digest, so a change
+changes every binding that pins that digest. `endpoint` remains REQUIRED and MUST be `null`
+when `endpointScope` is present: exactly one endpoint rule applies. Without `endpointScope`, the
+profile's form, digest and exact endpoint check are unchanged. A reader written before this
+amendment refuses the unknown member as `input-malformed` under the closed profile form. No
+profile version member or dialect format selector is added. (The vector
+`endpoint-scope-changed-constraint` decides that a changed scope fails the binding's digest,
+`profile-mismatch`; no vector decides the other rules here.)
+
+The member is admitted only on shape `http` with `adapter.name` exactly `adapter-web`. If
+`research` is present, its `capabilities` MUST be exactly `["page"]`; a `generated` profile
+carrying the constraint MUST have that declaration. A `record` profile may omit it. A profile
+carrying the member outside these conditions, with a non-null `endpoint`, or with a malformed
+scope is `input-malformed`. The member is admitted on a `research` source's `page` assignment
+and on a `web`-kind source, subject to the class rules below. Binding such a profile to any
+other kind or capability is `profile-mismatch`. `search` and `answer` retain exact provider
+endpoints. The same checks hold a retained response's assigned profile. (The vectors
+`endpoint-scope-two-paths-one-origin` and `endpoint-scope-wildcard-two-origins` decide that a
+`research` source's `page` assignment admits the member; no vector decides the other rules here.)
+
+**The endpoint form for a constrained page.** This restricts the Gateway's remote-server URL
+form (`SPEC.md` §1.2a at `v0.17.0`) to HTTPS names, admitting the empty port as below. It is a
+string of at most 2048 ASCII characters, each from U+0021 to U+007E: exactly `https://`, then a
+host, then either nothing, `:443`, or `:` followed by nothing, then either nothing or a path,
+which begins with `/`. There is no user, query or fragment. The host consists of two or more
+dot-separated labels, each of 1 to 63 characters. Each label starts and ends
+with an ASCII letter or digit; its other characters are ASCII letters, digits or `-`. The last
+label starts with an ASCII letter. There is no trailing dot, underscore, IPv4 or IPv6
+literal, wildcard or other port. The path has no `?`, `#` or backslash. Each `%` is followed by
+two hexadecimal digits, of either case. The path has no escaped slash or backslash: no `%2f`,
+`%2F`, `%5c` or `%5C` anywhere in it. Split the path at each literal `/`. A dot segment is one or
+two tokens each of which is `.`, `%2e` or `%2E`. No segment is a dot segment, and no segment's
+part before its first `;`, `%3b`, `%3B`, `%3f`, `%3F`, `%23` or `%00`, whichever comes first, is
+a dot segment. Thus literal and percent-spelled dot segments are refused, alone or before a path
+parameter or an escaped delimiter (`..;x`, `.;`, `%2e%2e;`, `..%3bx` and `.%00` among them),
+without decoding any path. Every escape but the four refused above, `%2e` and `%2E` outside a
+dot segment included, remains literal bytes and never supplies a segment boundary. This form
+holds the receipt's endpoint only when its profile carries `endpointScope`; it changes no
+historical receipt rule.
+(No vector decides this.)
+
+Each scope entry is either a prefix in that endpoint form, or exactly `https://*`. The wildcard
+is admitted only on a profile of class `generated`, which only a research `page` assignment
+takes. A `record` profile's scope holds prefix entries only; a `record` profile carrying the
+wildcard is `input-malformed`. The wildcard admits every endpoint in that form, including an
+origin discovered during a case. It admits neither another scheme nor another port, nor an IP
+literal. It asserts no public reachability:
+a verifier does not resolve names, check addresses or establish that a host is public. The
+Gateway's connection and redirect policy still applies. Neither a source nor a binding document
+can narrow the scope per case in this round; `constraints` adds no endpoint rule. A portable
+recipe cannot require reads to stay on a case's company origin under a wider installation
+profile. Such narrowing needs a later contract. (The vector
+`endpoint-scope-wildcard-two-origins` decides the wildcard's admission of two origins; no vector
+decides the other rules here.)
+
+**Matching.** Validate the endpoint's form first. An endpoint matches the scope when at least
+one entry admits it. For a prefix entry, the hosts are equal, ASCII `A` to `Z` compared as `a`
+to `z`; an absent port, `:443` and `:` followed by nothing denote port 443. Compare paths byte
+for byte, case and percent spelling included, with no decoding, slash collapse or other
+normalization. An absent
+prefix path or `/` admits every path, the absent endpoint path included. Otherwise the endpoint
+path must equal the prefix path, or start with that path followed by `/`; when the prefix
+already ends in `/`, starting with that prefix suffices. Thus `/docs` admits `/docs` and
+`/docs/x`, never `/docsx`; `/docs/` admits `/docs/` and `/docs/x`, never `/docs`. No subdomain
+match is implied. These comparisons rewrite neither the profile nor the receipt, and require
+no URL library. They admit host case and all three spellings of port 443 as the Gateway writes
+them today; no new Gateway normal form is required. (The vectors
+`endpoint-scope-two-paths-one-origin` and `endpoint-scope-endpoint-outside` decide a path prefix at
+a segment boundary, and `endpoint-scope-wildcard-two-origins` decides the wildcard; no vector
+decides the other rules here.)
+
+**Admission before acquisition.** A preparer MUST check every requested page URL against the
+assigned scope before sending that request. For this check, the URL is of the endpoint form
+above, optionally followed by `?` and a query of zero or more U+0021 to U+007E characters other
+than `#`, each `%` followed by two hexadecimal digits. The whole URL is at most 2048 bytes.
+Remove only the first `?` and everything after it for matching; keep the full request unchanged
+for its commitment. An invalid or out-of-scope request fails as `acquisition-invalid`, before
+any acquisition for that request. This applies to every discovered URL, not just the first.
+Admission holds the requested URL, so a read reached through the Gateway's grounding redirect
+(`https://vertexaisearch.cloud.google.com/grounding-api-redirect/…`) needs that endpoint in the
+scope, or the wildcard. It is an admission duty, not an offline verifier's reconstruction of
+the request URL.
+(No vector decides this.)
+
+At binding, a `web` source's literal `url` that cannot meet that request check is
+`profile-mismatch`. A `$param` URL is checked when resolved, before acquisition; no case value
+is read during profile matching. Research declares no fixed page URL, so a discovered URL
+outside the scope is an acquisition failure, not `profile-mismatch`. No model is run to predict
+which URLs a recipe could request. These duties add no support for an unread kind: §11 still
+refuses it before findings. (The vector `endpoint-scope-endpoint-outside` decides that a discovered
+URL outside the scope is an acquisition failure, `acquisition-invalid`, not `profile-mismatch`; no
+vector decides the other rules here.)
+
+A profile's `class` is the profile's own; a binding takes it only where the source's kind admits
+that class. An `operation`, of any shape §4.1 admits, takes its profile's class, `record` or
+`generated`, as do the `http` and `sql` kinds (§4). `local-file` is `asserted` and has no profile
+(§4.2). A `selected-file` of provider `google-drive` requires a `drive` input profile of class
+`record`; the binding is `record`, and a profile of class `generated` bound to it is
+`profile-mismatch` (Runner, "Supported input and trust configuration"). (No vector decides this.)
+§4.2 gives each provider's members. The Vectors column of §4's table says which bindings the
+staged vectors hold.
+
+For a `research` source, the profile assigned to `answer` serves the model's answer; a profile
+assigned to `search` or `page` serves the web reads retained with the answer — the links found,
+the pages read — which the record retains as its retained responses (§§4.3, 5.2). Every capability
+binding takes `generated`; assigning a profile of class `record` to `answer`, `search` or `page`
+is `profile-mismatch`. (No vector decides the refusal: the research vectors bind only
+`generated` profiles.)
+
+A `web`-kind source (§4.3) requires a profile of class `record`; the binding is `record`, and a
+profile of class `generated` bound to it is `profile-mismatch`. (No vector decides this.)
+
+A profile is the installation's, never the dialect's: a dialect names a profile by its `id` and its
+digest, and only an installation supplies one. A verifier is given the profiles it trusts, out of
+band, as one JSON array, and MUST NOT take a profile or a key from a preparation, an acquisition or
+an export. A source's **profile** is the trusted profile of its `profile` id, whose digest MUST be the
+source's `profileDigest`; otherwise, and when a source does not fit its profile — an `operation`
+whose request does not fit its profile's shape and adapter (§4.1), under a profile of shape
+`command` among them, a tool the profile does not allow, a calculator's profile without
+`calculation`, `calculation` without a calculator's profile, a profile bound to an unbound
+`operation` of another shape or another record (§4.4) — the finding is `profile-mismatch`.
+
+Each retained response of a `research` source names its own trusted profile by `profile.id` and
+`profile.digest` (§4.3). That id MUST be among the profiles given out of band, and its digest MUST
+match. The pair MUST be the source's AI assignment or one of its web assignments, with the class
+required above; otherwise `profile-mismatch`. The reference in the response supplies neither a
+profile nor a key. The source's profile does not substitute for a retained response's profile.
+
+A profile is the installation's classification of a channel. It pins the gateway's key, source,
+authority, adapter, shape, endpoint or endpoint scope, class, tools and any research declaration;
+it does not pin a credential, a tenant's configuration or a model's weights, and an installation
+replaces a profile when a change of those makes its classification wrong (Runner, "Decisions and
+ownership").
+
+### 5.2 Acquisitions
+
+The **acquisitions** are one JSON object with a member for each source acquired, named by the
+source's name, of the form `{"response": {"result": R, "receipt": E, "salts": S}}`, exactly, except
+for `research` as below: the gateway's acquire answer (gateway §6) as the preparer kept it.
+`R` is any JSON value; `E` is an object, a version-3 receipt (gateway §1.2a);
+`S` is an object of `args` and, optionally, `statement`,
+each 64 hexadecimal characters. A source to be acquired that has no member is
+`acquisition-missing`; a member for a source that is skipped (§9.2), for a `local-file` source, or
+for no source is `acquisition-unexpected`.
+
+A `research` source is the one source whose `response` may lack `receipt` and `salts`: its member
+is exactly `{"response": {"result": R}}` when the caller's research record did not come back through
+a gateway source, and has the ordinary form above when it did. Both `receipt` and `salts` are
+present or both are absent. `R` has §4.3's form. The acquisitions carry exactly the responses `R`
+names, by form; a response named in `R.responses` whose `result` is missing gives
+`acquisition-missing`, rather than a refusal of the acquisition's form. The order is `R.responses`'s
+own; a different order is a different caller assertion, not a finding for disagreement with an
+external order. When the record has its own receipt, that receipt also commits `R`'s bytes,
+including the array's order, by check 5.
+
+An acquisition is held to its source and its profile, and any of these checks that fails is
+`acquisition-invalid`:
+
+1. `E.receiptVersion` is `"3"` and `E.kind` is `"acquisition"`, and each member checks 1–5 or the
+ time and session rules below read, except `E.sessionId`, is of the form gateway §1.2a gives it,
+ and, beyond gateway §1.2a's forms, `E.servedAt` and `E.acquisition.observedAt` have instants
+ (§1).
+ `E.callIndex` is an integer (§1) at least zero. `E.sessionId` is a string; this document does
+ not hold it to gateway §3a's token form. A member of another type or form makes the receipt
+ malformed, `acquisition-invalid`; these form checks precede the time and session rules.
+ `E.acquisition` has no member `pageItems`. A receipt with
+ `pageItems` attests a page, which no preparation reads, whatever the source's shape, as the
+ Runner reads none (Runner, "Deferred scope"). (No vector decides this.)
+2. `E.keyId` is the key identifier of the profile's `publicKey`, and `E.signature`, 128 hexadecimal
+ characters, verifies under that key by the equation (§1), over the ASCII bytes
+ `judgment-pack-gateway/receipt/3:` followed by the `canon` bytes of `E` with its top-level
+ `signature` member removed and every other member retained.
+3. `E.source` and `E.authority` are the profile's `source` and `authority`; and
+ `E.acquisition.adapter`, `E.acquisition.shape` and `E.acquisition.endpoint` are, as JSON values,
+ the profile's `adapter`, `shape` and `endpoint`.
+ With `endpointScope` only the endpoint comparison changes: `E.acquisition.endpoint` MUST
+ have §5.1's constrained page form and match the scope. The adapter and shape comparisons
+ stay exact. Failure, including an endpoint outside that form, is `acquisition-invalid`.
+ (The vectors `endpoint-scope-endpoint-outside` and `endpoint-scope-redirect-outside` decide an
+ endpoint of that form that the scope does not admit; no vector decides an endpoint outside that
+ form or the adapter and shape comparisons.)
+4. `E.argumentsCommitment` is `sha256:` followed by the hexadecimal SHA-256 of the 32 bytes `S.args`
+ encodes, then the ASCII bytes `args:`, then the `canon` bytes of the source's request (§4.1).
+5. `E.resultDigest` is the digest of `R`'s `canon` bytes; an `R` outside the `canon` domain fails.
+
+For each retained response of a `research` source, checks 1–5 apply under that response's trusted
+profile, with `E` its `receipt`, `S` its `salts` and `R` its `result`. Check 4 opens the commitment
+over that response's own `request`, not the research source's recipe. A failed check is
+`acquisition-invalid`. When the research record has its own receipt, checks 1–5 apply to it too,
+under the research source's profile and over the source's request and the whole research record.
+After the retained responses' checks and before the source's read, the whole record MUST be in
+the `canon` domain even when it has no receipt of its own; otherwise `acquisition-invalid`.
+
+**Which URL is held.** For a constrained page, check 3 holds the final URL after followed
+redirects, with its query removed, which the Gateway's web adapter writes as
+`acquisition.endpoint`. A final redirect target outside the scope fails that check. This does
+not check intermediate hops or the requested URL against the scope during replay. The adapter's
+retained provenance carries both URLs, but this document does not interpret that result form;
+`statement` is a commitment, not a clear URL. Check 4 still commits the full retained `request`,
+so changing it without a matching receipt fails. It does not prove the preparer made §5.1's
+admission check. No receipt, request, result or salt is relabelled or rewritten for a scope.
+(The vector `endpoint-scope-redirect-outside` decides that check 3 holds the final endpoint, and
+`endpoint-scope-changed-request` that check 4 commits the retained request; no vector decides the
+other rules here.)
+
+Then its times, against the preparation's instant, `verifiedAt`: the instants of
+`E.acquisition.observedAt` and `E.servedAt` MUST each be no more than the source's `maxAge`
+seconds before `verifiedAt` and no more than 30 seconds after it; otherwise `acquisition-stale`.
+That finding names a present instant outside this window only; a time with no instant is
+`acquisition-invalid`. (No vector decides this.)
+For research, this applies to every retained response and to the record's own receipt when
+present, each using the research source's `maxAge`.
+
+Then the sessions. The receipted calls of one preparation are in one of two forms: **they share a
+session**, one `sessionId` at `callIndex` values that differ; or **each is alone in a session of its
+own and is its session's first call**, each `sessionId` distinct, each `callIndex` 0. One call
+alone is in both. Taken in the order of `sources`, the first receipt with which the receipts so far
+are in neither form is `acquisition-sessions`. Within a `research` source, every retained
+response's receipt participates, in `R.responses` order, followed by the record's own receipt when
+present. A record with no receipt adds none of its own. `acquisition-sessions` names only a
+well-formed session set that fails this rule; a malformed `callIndex` or `sessionId` is
+`acquisition-invalid`. (No vector decides this.)
+The form is read from the receipts and from nothing else.
+
+An acquisition's **citation** is `{"callIndex", "sessionId", "signature"}`, those three members of
+its receipt.
+
+These checks are receipt-only. They do not establish that a session is sealed or complete, that no
+attempt was left out, or that a caller did not choose among valid answers, in one session or in two
+(Runner, "Time, sessions, errors and retries"). The receipt's `caller`, its `statement`, its chain
+(`prevSignature`) and its `witness` are the gateway's verifier's to read (gateway §1.4, §4), and are
+not read here.
+
+## 6. Reads
+
+A **read** turns the **value read** into a **claim**, an object of exactly `facts`,
+`evidenceAvailability`, `acquisitionStatus`, `reason` and `basis`. A source's `read` is an object of
+`unwrap`, optional, and exactly one of `copy` and `rule`. The case's read is
+`{"copy": {"facts": F, "evidence": V}}`, `F` and `V` the case's `facts` and `evidence`.
+For research only, §6.4 also admits the form `{"sources": [S, ...], "rule": R}`.
+
+The **read digest** of a source is the digest of its `read`'s `canon` bytes, as the dialect writes
+it; the case's is the digest of the case's read, so built.
+
+### 6.1 The value read
+
+The value read starts as the acquisition's result, `R`, and for the case as the case document.
+`unwrap` is an array of one to four pointers, applied in order: each MUST resolve, in the current
+value, to a string that holds exactly one JSON value, read as §1 reads a document, which becomes the
+current value; otherwise `read-failed`. An unwrap is not a count of records: a read that needs one
+record guards it. An unwrapped value may hold numbers that are not integers, which a rule may
+compare (§6.3) and no claim may carry.
+
+For a source whose profile is a calculator's, the value read is held to §7 before the read applies.
+
+### 6.2 Copy
+
+`copy` is an object of exactly `facts`, an array of `{"target": P, "source": Q}`, and `evidence`, an
+array of `{"requirement": I, "source": Q}`, each entry exactly those members; both arrays are
+REQUIRED, as the Runner requires them, and either may be empty. `P` is a fact target (§8.1), `I` a
+non-empty string, `Q` a pointer. A copy names each requirement at most once, and one that names a
+requirement twice is refused with the dialect. (No vector decides this.) The claim:
+
+- `facts` starts as `{}`; for each entry whose `Q` resolves in the value read, that value is written
+ at `P` (§8.1). An entry whose `Q` does not resolve writes nothing. (No vector decides this.)
+- `evidenceAvailability` gives, for each entry whose `Q` resolves, `I` the value there, which MUST be
+ `present`, `absent` or `unknown`, or the read fails, `read-failed`. An entry whose `Q` does not
+ resolve gives `I` nothing. (No vector decides this.)
+- `acquisitionStatus` is `resolved`, and `reason` is `copied`.
+- `basis` is every entry's `Q`, of `facts` and of `evidence`, distinct, ordered by code point.
+
+A value a copy writes MUST be in the `canon` domain, its numbers integers; otherwise `read-failed`.
+
+### 6.3 Rule
+
+`rule` is a **derivation rule**, version 1: the portable derivation rule the Runner vendors, cited in
+the Status, restated here whole.
+
+A rule is an object of exactly `ruleVersion`, the string `"1"`; `parameters`, an object mapping each
+parameter the rule reads to its type; and `clauses`, an array of one to 64 clauses, the last of
+which has the `when` `{"op": "always"}`. Each parameter a rule declares MUST be in the source's scope
+with the type declared, and its value is the scope's. A clause is an object of exactly `when`, a
+condition; `claim`, a claim form; and `reason`, a string.
+
+A condition is one of the objects below, each of exactly the members shown; `P` is a pointer into
+the value read, and `N` and `M` name parameters the rule declares.
+
+| Condition | True when |
+| --- | --- |
+| `{"op": "always"}` | always |
+| `{"op": "exists", "field": P}` | `P` resolves |
+| `{"op": "equals", "field": P, "to": X}` | `P` resolves to a value JSON-equal to the literal `X` |
+| `{"op": "equalsParam", "field": P, "param": N}` | `P` resolves to a value JSON-equal to `N`'s value |
+| `{"op": "isTrue", "field": P}` | `P` resolves to `true` |
+| `{"op": "isDecimalString", "field": P}` | `P` resolves to a string that is `0`, or a digit other than `0` followed by any digits |
+| `{"op": "freshWithin", "field": P, "asOf": N, "maxAge": M}` | `P` resolves to a string with an instant, `N`, of type `timestamp`, has an instant, and `0 ≤ instant(N) − instant(P) ≤` the value of `M`, of type `integer`, in seconds |
+| `{"op": "all", "of": [C, …]}` | every condition listed is true, which the empty list is; evaluated in order, stopping at the first that is false |
+| `{"op": "any", "of": [C, …]}` | some condition listed is true, which the empty list is not; evaluated in order, stopping at the first that is true |
+| `{"op": "not", "of": C}` | `C` is false |
+
+`all` and `any` list at most 64 conditions. **JSON-equal** compares type and value: numbers by their
+mathematical value, so that `1` and `1.0` are equal; strings, booleans and `null` by value; arrays
+element by element, in order; objects as sets of members. A number and a string are never equal.
+
+That `N` and `M` name parameters the rule declares is a `freshWithin`'s form; their types are part of
+its truth. A `freshWithin` whose `asOf` names a declared parameter of a type other than `timestamp`,
+or whose `maxAge` names one of a type other than `integer`, is false, and the dialect is not
+malformed.
+
+A claim form is an object of exactly `facts`, an array of `{"pointer": P, "from": Q}`, each exactly
+those members, `P` a fact target and `Q` a pointer into the value read; `evidence`, an object mapping
+requirement ids to `present`, `absent` or `unknown`; and `acquisitionStatus`, one of `resolved`,
+`absent` and `unknown`. A **requirement id**, in a claim form as in a copy (§6.2), is a non-empty
+string, and that unqualified form is its only form.
+
+**Deriving the claim.** The **match** is the first clause whose `when` is true; the last clause
+ensures there is one. A **leaf** is a condition other than `always`, `all`, `any` and `not`, and
+each leaf that is evaluated looks up its `field`. The claim is:
+
+- `facts`: `{}`, and for each entry of the match's `facts`, in order, the value at `Q` in the value
+ read written at `P` (§8.1); a `Q` that does not resolve fails the read, `read-failed`, and so does
+ a value outside the `canon` domain;
+- `evidenceAvailability`: the match's `evidence`;
+- `acquisitionStatus`: the match's `acquisitionStatus`;
+- `reason`: the match's `reason`;
+- `basis`: the `field` of every leaf evaluated while the `when` of each clause up to and including
+ the match was evaluated, distinct, ordered by code point. A leaf after a stop in `all` or `any` is
+ not evaluated, and adds nothing.
+
+A rule not of this form — a member, a condition or a claim form outside it, an unknown `op`, a type
+other than the three, a literal outside the `canon` domain, a last clause that is not `always` — is
+refused with the dialect (§11).
+
+### 6.4 Reconciliation of research sources
+
+Section 8.1 still says: "No fact target of one source may equal another, or be a prefix of another
+by whole tokens, of the same source or another, the case included". Overlapping fact targets are
+`input-malformed`; last-writer-wins is not a reading of that text. A field name within a research
+record is not a fact target: several sources may observe the same logical field, while only one
+read writes the pack's target for it.
+
+The one additional read form is `{"sources": [S, ...], "rule": R}`, exactly those two members,
+on a version-3 `research` source. `sources` is an ordered array of 1 to 15 distinct names of
+earlier `research` sources in the dialect; `R` is exactly the version-1 rule of §6.3. No `copy`
+or `unwrap` is present. A missing, repeated, current, later or non-research source name, use on
+another kind or version, or an extra member is `input-malformed`; a count over 15 is
+`input-over-bound`. This dependency reads results, not source parameters, and adds no parameter
+type or implicit fact target. Unavailable parameter values still skip their own source (§3).
+
+The value read is the closed object `{"current": C, "sources": U}`. `C` is this source's `R`;
+`U` is an object whose keys are the declared earlier names, each holding that source's retained
+`R` after its acquisition checks. A skipped source's key is absent; no `null` or invented
+`not-found` entry fills it. No other source is visible. A needed acquisition that is missing or
+fails §5.2 ends preparation with that finding; fallback never catches invalid receipts or
+`acquisition-stale`. Both acquired and skipped inputs count toward the declared source bound.
+The derived value is held to §12's nesting bound before the rule applies, `input-over-bound`
+otherwise; references do not duplicate input bytes in the combined document-size bound.
+
+In a condition, the pointer list is closed: `/sources//fields/` or
+`/current/fields/`, and either pointer followed by `/status`, `/value` or `/values`,
+or a descendant of either pointer's `/value` or `/values`, each name escaped as one token.
+Here `` is a name the read's `sources` lists and `` a field that source declares;
+for `/current`, it is a field this source declares. An unlisted source, an undeclared field or
+any other pointer in a condition is `input-malformed`.
+Conditions and claim forms keep §6.3's semantics; the first matching clause is the declared
+precedence.
+The rule MUST explicitly test a `found` status before selecting a value and name in its clauses
+what absence, `not-found`, `stale` and `conflicting` do: advance to another source, or produce
+an `absent` or `unknown` claim with no value for that target. The admissible fact `from` set is
+closed: `/sources//fields//value`, `/current/fields//value`, or a descendant
+of either. Any other `from`, including one under `values`, is `input-malformed`. Each selected
+field MUST be declared by the source it names; otherwise `input-malformed`.
+
+Let `` be that field entry's pointer, `/sources//fields/` or
+`/current/fields/`. Its status guard is exactly
+`{"op":"equals","field":"/status","to":S}`. The selecting clause's condition is that
+guard with `S` equal to `"found"`, or an `all` with that guard as a direct member. Every selected
+field also has that exact guard for each of `"not-found"`, `"stale"` and `"conflicting"`, and
+the exact absence guard `{"op":"not","of":{"op":"exists","field":""}}`.
+These other-status and absence guards count anywhere in any clause's condition, at any depth
+and polarity, whether or not evaluation reaches them. Missing guards are `input-malformed`.
+In this version a reconciliation claim writes fact targets only: every claim form's `evidence`
+MUST be `{}`, otherwise `input-malformed`. The last `always` clause has no facts and status
+`unknown` or `absent`.
+`all`, `any` and `not` combine the guards using §6.3; no new rule operator is added.
+
+For example, a rule on `secondary`, with `sources: ["primary"]`, first guards primary's field
+as `found` and copies its `value`. A second clause guards primary as absent, `not-found` or
+`stale`, and secondary as `found`, then copies secondary's value. A third guards either as
+`conflicting` and yields `unknown` with no fact. A fourth guards secondary as absent,
+`not-found` or `stale` and yields `unknown` with no fact. The final `always` clause yields
+`unknown` with no fact. The missing-entry guards are `not` of `exists` on each field entry.
+The first clause therefore wins even if secondary conflicts; that order is part of this
+example's declared policy. Authors may choose another order, but must write it in the rule.
+Each clause's `reason` states its choice. A missing `from` pointer in a matched claim remains
+`read-failed`, not permission to try the next clause. Non-found answers do not invent defaults.
+
+The source list and whole rule enter the read digest and the dialect digest, in their written
+order. The rule's `basis` and lineage's `candidateFrom` use the pointers into the combined value.
+The target belongs to this source alone, of class `generated`, with generated influence; it
+must admit `generated` (§8.2). The earlier sources retain their own outcomes and receipt lists;
+§9.1's citations and §9.3's `receipts` are unchanged, and are not duplicated into the later
+source's list. A rule reading several results establishes only the declared derivation from
+those checked bytes (§13). (No vector decides this.)
+
+## 7. Calculated values
+
+An installation declares a calculator on an input profile, as `calculator` (§5.1). Declaring it,
+the installation asserts that each tool the profile allows computes a deterministic function of the
+inputs it echoes and the tables it reports, and calls no model. Nothing here can check that. A
+calculator that calls a model is not a calculator: its profile is `generated`.
+
+A source whose profile is a calculator's declares `calculation`, an object of exactly `inputs`, an
+object mapping each input name to the name of a parameter in the source's scope, never `runAt`; and
+`tables`, an object mapping each table name to an integer from 1 to 315360000, the most seconds its
+contents may be old.
+
+The value read MUST be an object whose member `calculation` is an object of exactly `calculator`, an
+object of exactly `name` and `version`; `status`, one of `computed`, `input-missing` and
+`cannot-compute`; `inputs`, an object giving each input the calculator used, by name, with its
+value; and `asOf`, an object giving each table it read, by name, with a timestamp. That answer is
+held to the source, and any of these checks that fails is `calculation-invalid`:
+
+- `calculator` is the profile's `calculator`;
+- every input it echoes is bound in `calculation.inputs`, and its value has the same `canon` bytes
+ as the value of the parameter it is bound to: `"7"` is not `7`;
+- every table it reports is named in `calculation.tables`, with a timestamp that has an instant;
+- when `status` is `computed`, every input bound is echoed, and every table named is reported, as of
+ no more than its limit before `verifiedAt` and no more than 30 seconds after it.
+
+When `status` is `computed`, the source's read applies to the value read. Otherwise it does not
+apply, and the claim is: `facts` `{}`; `evidenceAvailability` giving `unknown` to each evidence
+target of the source (§8); `acquisitionStatus` `unknown`; `reason` `calculation-input-missing` or
+`calculation-cannot-compute`; and `basis` `["/calculation/status"]`. A calculator that could not
+compute has answered about the case; a stale table, or an answer about other inputs, is a fault of
+the source, and fails the preparation.
+
+Each lineage entry of a calculated source that was acquired carries `calculation` (§9.3), an object
+of: `calculator`, `status` and `asOf`, as answered; and `inputs`, an array with one object for each
+input echoed, ordered by the input's name, of exactly `name`, the input; `parameter`, the parameter
+it is bound to; and `source` and `pointer`, where that parameter's value came from: `"case"` and its
+case pointer, or the earlier source's name and its fact pointer. The values echoed are not repeated:
+the acquisition holds them.
+
+## 8. Targets, classes and admission
+
+The **targets** of a source are its fact targets and its evidence targets, fixed by the dialect and
+not by what an acquisition returns: for a copy, its entries' `target` pointers and `requirement`
+ids; for a rule, every pointer of every claim form's `facts`, and every requirement of every claim
+form's `evidence`, over all clauses. Every target is recorded in the lineage (§9.3), with a value or
+without.
+
+### 8.1 Facts and evidence
+
+A **fact target** is a pointer other than the empty string. Writing a value at it in a document
+creates each object on the way, every token naming an object member. No fact target of one source
+may equal another, or be a prefix of another by whole tokens, of the same source or another, the
+case included; no requirement may be an evidence target of two sources; and there are at most 256
+fact targets and 128 evidence targets in all. A dialect that breaks one of these is refused.
+
+A preparation's **facts document** is `{}` with, for each outcome in order (§9.2) and each fact
+target its claim gives a value, that value written at the target. Its **evidence-availability
+document** is an object giving, for each outcome in order, each requirement its claim's
+`evidenceAvailability` names, that value, `unknown` included. (No vector decides that `unknown` is
+written rather than left out.) They are the facts document and the evidence-availability document
+an evaluation takes (Core §8.2), and those its record carries (§11).
+
+### 8.2 Classes and admission
+
+A target's **class** is its source's: `asserted` for the case and a local file; for every other
+source, the binding's class under §5.1's rule for its kind. `record` names the acquisition channel,
+a signed read of a system, and not the authorship or truth of every byte the system holds;
+`generated` names a model's answer.
+
+A source's **generated influence** is true when its class is `generated`, or when a source parameter
+it declares comes from a source whose generated influence is true; each of its targets carries it.
+A dependency so cannot erase a model's influence. (The research vectors hold generated sources and
+no source parameter, so no vector decides this.)
+
+Each target **admits** `asserted` and `record` by default. `admits`, an object of `facts`, mapping
+fact targets to arrays of classes, and `evidence`, mapping requirements to arrays of classes, both
+optional, replaces the list of each target it names. A target is admitted when its class is in its
+list and, when its generated influence is true, so is `generated`. Every target is held to it, one no
+acquisition reached included; a target not admitted is `admission-refused`. A target named in
+`admits` that no source writes is refused with the dialect.
+
+## 9. The preparation
+
+### 9.1 Members
+
+A preparation is a JSON object of exactly:
+
+| Member | Form | Meaning |
+| --- | --- | --- |
+| `version` | the integer `2`, or `3` | the preparation format: the legacy dialect's integer `version`, or the family selected by a named dialect's `formatVersion` (§2.1); never its artifact `version` |
+| `verifiedAt` | a timestamp | the instant: the one every freshness check is held to, and the value of `runAt` |
+| `mappingDigest` | a digest | the dialect digest (§2) |
+| `verification` | the string `verified acquisitions; session sealing and input truth are not established` | the preparer's account of its checks, the same in every preparation of this version |
+| `cites` | an array | every acquisition's citations (§5.2), in the order below |
+| `lineage` | an array | §9.3 |
+| `outcomes` | an array | §9.2 |
+
+In versions 2 and 3 alike, `cites` is ordered by `callIndex`, those of one index in the order of
+`sources`, as the reference Runner writes it: each acquired source adds its one citation, and the
+case, a local file and a skipped source contribute none. A `research` source has a rule of its own,
+which no vector tells apart from that one: in a preparation with one, `cites` is in the order of
+`sources` instead, the `research` source adding every retained response's citation in
+`R.responses` order, followed by the record's own citation when it has one, and every other
+acquired source its one citation. The research list is also its lineage entries' `receipts`
+(§9.3). (No vector decides the rule of `research`.)
+
+### 9.2 Outcomes
+
+There is one outcome for the case, first, and one for each source, in the order of `sources`. A
+source is **skipped** when a source parameter it declares has no value (§3): it is not acquired and
+its read does not apply. An outcome is an object of:
+
+- `name`: `case`, or the source's name;
+- `parameters`: an object giving each parameter of the scope (§3), `runAt` included, its value, with
+ the literal the case or the earlier source wrote; for a skipped source, those that have a value;
+- `arguments`: the source's request (§4.1), for a source acquired, and absent otherwise;
+- `claim`: the claim (§§6–7); for a skipped source, the object of exactly `acquisitionStatus`
+ `"unknown"`, `basis` `[]`, `evidenceAvailability` `{}`, `facts` `{}` and `reason`
+ `"dependency-unavailable"`, giving no fact and no availability;
+- `status`: the claim's `acquisitionStatus`, so `unknown` for a skipped source;
+- `reason`: the claim's `reason`, so `dependency-unavailable` for a skipped source.
+
+The vector `skipped-source-dependency-unavailable` holds this form.
+
+### 9.3 Lineage
+
+There is one lineage entry for each target of the case and of each source, in the order of the
+outcomes; within one outcome, its fact targets ordered by code point, then its evidence targets
+ordered by code point. (No vector decides facts before evidence.) An entry is an object of:
+
+| Member | Value |
+| --- | --- |
+| `source` | the outcome's `name` |
+| `kind` | `fact` or `evidence` |
+| `target` | the fact target or the requirement |
+| `class` | the target's class (§8.2) |
+| `generatedInfluence` | its generated influence |
+| `present` | `true` when the claim gives the target a value — a value at the pointer, or any availability for the requirement — and `false` otherwise |
+| `status`, `reason` | the outcome's |
+| `basis` | the claim's `basis`, or `[]` for a skipped source |
+| `dependencies` | the source's declared source parameters, as below, for every source that declares one, acquired or skipped; absent for the case and a source that declares none |
+| `candidateFrom` | the pointers of the value read that the dialect could copy to the target, distinct, ordered by code point: a copy entry's `source`, or each `from` of a claim form that writes the target; absent when there is none, as for a rule's evidence target |
+| `readDigest` | the read digest (§6) |
+| `receipt` | the acquisition's citation; for `research`, the record's own citation when it has one; absent for the case, a local file, a skipped source and a research record with no receipt of its own |
+| `receipts` | added in version 3: for an acquired `research` source, the same ordered list of citations it adds to `cites` (§9.1), including the record's own when present; absent otherwise |
+| `calculation` | §7, for a calculated source that was acquired; absent otherwise |
+
+`candidateFrom` lists what the dialect could read into a target, and not what was read; `basis`
+lists what was read to decide.
+
+`dependencies` is present on every target entry of a source that declares a source parameter,
+acquired or skipped. It is an array of every source parameter the source declares (§3),
+including those that have a value, ordered by `parameter` by code point. Each element is an
+object of exactly `parameter`, the parameter's name; `source`, the earlier source's name; and
+`pointer`, the fact target read. In
+`skipped-source-dependency-unavailable`, both `approver` from `sponsor` and `requestType` from
+`intake` appear, in that order, though `requestType` has a value and `intake` is the first source.
+An acquired source whose parameters all have values carries them too, including one whose
+claim is `unknown`.
+
+### 9.4 What derives a preparation
+
+A preparation holds the instant, the dialect's digest, each scope's values, each request, each
+claim and each acquisition's citation. It does not hold the case, the results or the receipts, which
+a verifier is given (§11). What derives a preparation is the dialect, the case, the acquisitions,
+the profiles and the instant, and nothing else.
+
+### 9.5 The canonical form of a preparation
+
+A preparation's digest is taken of all of it in this form, the form the Runner digests a
+preparation in (Runner, "The canonical form of a preparation"):
+
+- **Members**: each object's members ordered by name, comparing the names' UTF-8 bytes, which orders
+ them by code point; an array keeps its order.
+- **Whitespace**: none between tokens.
+- **Numbers**: the literal, its characters kept. Every number of a preparation is an integer (§1):
+ `-0` stays `-0`, and `9007199254740991` and `-9007199254740991` are written whole, without an
+ exponent.
+- **Strings**: `"` and `\` are written `\"` and `\\`; U+0008, U+0009, U+000A, U+000C and U+000D are
+ written `\b`, `\t`, `\n`, `\f` and `\r`; every other code point below U+0020 is written `\u00`
+ and two hexadecimal digits; `&`, `<` and `>` are written `\u0026`, `\u003c` and `\u003e`, and
+ U+2028 and U+2029 are written `\u2028` and `\u2029`; every other code point is written as its
+ UTF-8 bytes, `/`, U+007F and every character outside ASCII included. `A&B café ☃` is written
+ `A\u0026B \u003cx\u003e café ☃`.
+- **`true`, `false` and `null`** as they are.
+- **`verifiedAt`** is 20 characters, and each outcome's `parameters` gives `runAt` the same string.
+ A preparation recomputed at another instant is another preparation, with another digest.
+
+This is not `canon`, which writes `&`, `<` and `>` as they are and `-0` as `0`. A dialect's, a
+profile's, a read's and a result's digests, and the bytes a receipt's signature covers, are
+`canon`'s.
+
+The preparation's **digest** is the digest of those bytes, and its **binding** is these bytes
+exactly, the digest in place of `D`:
+
+```text
+{"kind":"judgment-pack-runner/preparation/1","digest":"D"}
+```
+
+`kind` then `digest`, with no whitespace: the member a runtime's evaluation record carries as its
+caller gave it (runtime ADR-0050). The scheme names the Runner because the Runner defined it; every
+binding recorded names it, and this document keeps it unchanged.
+
+## 10. The output side
+
+A dialect's output side says how a disposition becomes the arguments of a write. An **output
+dialect**, version 1, is a JSON object of exactly `outputVersion`, the string `"1"`; `platform`, a
+non-empty string naming the catalog platform whose write tools it holds, as the gateway's engine
+configuration names one; and `policies`, an object mapping each write tool's name to a **decision
+policy** in the form the gateway's engine configuration gives an entry of a platform's
+`decisionPolicy` (the gateway's `docs/design/engine-config.md` at `v0.15.0`, the release the Status
+names, and gateway §1.2a, `policy`): `outcomes`, the outcome ids a record must have decided; optionally `packs`,
+`reviewed` and `requireSignedRecord`; `bind`, pairs of a pointer into the write's arguments and a
+pointer into the record's `inputs.facts`, whose values must be equal; `fix`, pairs of a pointer into
+the arguments and the value the argument there must be; and `closed`, whether every argument must be
+reached by `bind` or `fix`. This document restates none of it: the gateway's form is the output
+side's.
+
+A policy's digest is the digest of its `canon` bytes, which is the `policy` an action receipt
+carries for a write held to it (gateway §1.2a); an output dialect is digested so too. The input
+side and the output side are two documents, each with its own digest, so that a version-2 dialect
+document stays the Runner's mapping v2 document byte for byte.
+
+A policy holds a write to its decision record at the moment of the gateway's check: by `bind`, an
+argument to a fact the record evaluated; by `fix`, an argument to a value the policy fixes; and, by
+`closed`, the arguments to exactly those named. What that establishes is the gateway's (gateway
+§1.2a, "What `decision` establishes"): not that the target read the arguments as intended, not that
+the target was unchanged since the record, and not that a person approved the write.
+
+No preparation reads the output side, and no conformance class of this document reads it. Its
+vectors are deferred to a later RFC.
+
+## 11. Verifying a preparation
+
+A preparation verifier is given:
+
+- the dialect document; the case document; the acquisitions (§5.2), `{}` when there are none; the
+ input profiles it trusts (§5.1); and, for a dialect with an unbound source, its binding document
+ (§4.4);
+- the **preparation** to verify;
+- optionally, the **record**: the line of bytes, without its newline, of the runtime evaluation
+ record whose binding it holds to the preparation. A Runner export of version 2 carries the record
+ as the member `run.audit` of its `run.json`, and not its bytes: the line taken from such an export
+ is that member's value exactly as `run.json` writes it, with no re-encoding; and
+- whether it **requires a binding**.
+
+**Replaying research.** For a `research` source (§4.3), the verifier replays the source's read over
+the caller-assembled research record `R`, carried as `response.result`, at the given preparation's
+`verifiedAt`. `R.responses` retains the AI connection's answers and the web reads retained with it.
+Before the read applies to `R`, each retained response is checked under its own trusted profile,
+over its own request and result, with §5.2's checks 1–5, times and sessions; the record's own
+receipt, when present, is checked too. The findings below run per source and, within it, per
+response in `R.responses` order, then for the record's own receipt when present. The recipe's
+`question`, `constraints`, `model`, `evidence`, `fields` and `capabilities` are recorded in the
+dialect and under its digest. The model and required capabilities are held to the trusted
+profiles then bound (§4.4, §5.1), not to the model's actual execution. The recipe is never
+re-executed: verification calls neither the model nor the web. No model output is produced
+or compared. For §6.4's read, the same checked record and the declared earlier results form the
+combined value; those earlier acquisitions have already passed their own checks. A replay
+establishes only what §13 says a derivation and an acquisition establish. (No vector decides this.)
+
+**A research fixture.** In the terms of the staging README
+([`conformance/dialect/README.md`](https://github.com/Judgment-Pack/judgment-pack-spec/blob/main/conformance/dialect/README.md)),
+one fixture is a directory holding:
+
+| File | Given to the verifier as |
+| --- | --- |
+| `mapping.json` | the bound dialect, with the research recipe and its read (§4.4) |
+| `unbound.json` | beside it, the published dialect with unbound research sources |
+| `binding.json` | beside it, the binding document used to make `mapping.json` |
+| `case.json` | the case document, including the recipe's case parameters |
+| `sources.json` | the acquisitions: each `R`, including `R.fields` and `R.responses` (§4.3, §5.2) |
+| `profiles.json` | every assigned AI and web profile, including assignments no response uses |
+| `run.json` | the preparation, `run.input.preparation`, and the evaluation record: the bytes `run.auditBytes` holds in standard base64, or, in an export of version 2, `run.audit` exactly as `run.json` writes it, with no re-encoding |
+
+In `sources.json`, each `R` is carried as `response.result`. Its `responses` array retains every
+response's `profile`, `request`, `result`, `receipt` and `salts`; the record's own `receipt` and
+`salts` sit beside `result` when present. Every retained response names an assigned profile.
+The verifier trusts profiles out of band (§5.1), never by their presence in a fixture.
+
+`preparation.json` and `preparation.sha256` hold what the verifier must compute: the preparation's
+canonical bytes and their digest, recomputed from the retained inputs at the fixture's instant, the
+`verifiedAt` of the preparation `preparation.json` holds, which the Runner's manifest gives as the
+fixture's `verifiedAt`; an export that retains another preparation in its place, as item 6's old
+preparation, may name another instant, one second earlier in the two staged
+`changed-binding-old-preparation` vectors. A fixture whose inputs were changed after the run, so
+that no preparation can be computed from them, as in item 7's `acquisition-invalid` variants, holds
+instead the preparation the run recorded, fixed, and expects the finding the change gives; the
+Runner's manifest marks it `retained` `recorded`. The record is the runtime evaluation record,
+distinct from the research record in `sources.json`.
+The staging manifest gives `requiresBinding` and the expected answer, `expectedResult` with
+`expectedBinding` for a reading or `expectedFinding` for a finding, as for every staged vector.
+The fixture layout is fixed. The reference Runner prepares the `research` kind since its pull
+request 97, and twenty-six fixtures it recorded in this layout are staged; the kind is defined,
+and not claimable until a specification version publishes them (§14).
+
+The thirty-ninth vector, `skipped-source-dependency-unavailable`, recorded in Runner pull request
+105 at commit `ed1bc2a`, holds §§9.2–9.3's skipped-source form. Its three sources are operations:
+`intake` resolves, `sponsor` is acquired but unknown, and `endorsement` is skipped because its
+`approver` parameter has no value. It gives a reading with binding `matches`; its preparation
+recomputes byte for byte. This holds the common skipped-source form; item 5's recording of a
+skipped earlier research source in a reconciliation remains to be recorded.
+
+**The two fixture lists to record.** Each reading or finding variant below calls for a separate
+fixture directory in that layout for each of two examples, named `-- -`.
+`` and `
- ` are the names below; `` identifies the individual case, such
+as `work-item-triage-presence-optional-omitted`. Refusal variants are reader tests, not fixtures,
+until the staging README defines a refusal row form. A fixture is a recording: neither a
+synthetic expected digest nor a hand-written receipt stands in for one. The reference Runner
+recorded twenty-six, thirteen of each example, in its pull request 97; they are staged, the rest
+are not recorded, and no conformance claim is made. The examples are:
+
+- `gtm-company-person`: a company's `company-id` (`text`), `employee-count` (`integer`),
+ `revenue` (`decimal`), `active` (`boolean`), `roles` (`text-list`) and `employee-range`
+ (`range`); a person's corresponding record has `person-id`, `experience-years`, `allocation`,
+ `contactable`, `roles` and `experience-range`, of those same six types. All identifiers and
+ observations are synthetic. A copy can write the whole `R.fields` object to a facts target;
+ a rule can instead write a found value to a qualification target. The declarations and reads
+ are distinct: fields describe research, while the pack still defines qualification policy.
+- `work-item-triage`: a work item's `item-id` (`text`), `points` (`integer`), `estimate`
+ (`decimal`), `blocked` (`boolean`), `labels` (`text-list`) and `effort-range` (`range`);
+ a selected item leads to a child follow-up record of the same types, with its own id. No
+ company-domain or person-specific identity rule is built into these fields.
+
+For both examples the item names and expected checks are:
+
+1. `valid-types`: all six types, both integer and decimal ranges, empty and non-empty lists,
+ decimal signs and scales, with retained citations and generated admissions; a reading with
+ `expectedBinding: "matches"`. Test a source asking for `answer` alone, and one also asking
+ for `search` and `page`; both use their assigned profiles and §9's citation order.
+2. `presence`: separate valid readings for an omitted optional entry, required `not-found`,
+ integer zero, decimal `"0"`, boolean `false` and text `""`. Separate refusals for an omitted
+ required entry, `null` entry or value, `null` list item or range endpoint, a numeric decimal,
+ mixed or reversed range endpoints, an unknown field and a value on a non-found entry:
+ `input-malformed`. No absent, null or false value is replaced by a default.
+3. `bounds-and-cites`: recordings at every new maximum and refusal inputs one over each:
+ `input-over-bound`. Include an empty declaration list, empty found citation list, duplicate
+ field, invalid index (including `-0` or one at or above `responses`' length), duplicate index
+ and URL-only citation, all `input-malformed`; the index range is no §12 maximum. Missing
+ cited response bytes give `acquisition-missing`. Keep document and nesting bounds in force.
+4. `stale-and-conflicting`: fresh receipts carrying an explicitly stale observation, and two
+ conflicting typed values with separate citations, yield the declared unknown or fallback
+ claim and a reading. A stale entry may have no cited observation. An actually expired receipt
+ gives `acquisition-stale`; a plain research rule with a fact `from` of
+ `/fields//values/0/value` gives `input-malformed` (§4.3). This does not test the truth
+ of a claimed `found` status.
+5. `failed-fallback`: primary `not-found`, secondary `stale`, and a third source's `conflicting`
+ entry. The third source's rule names the earlier two, tests their statuses in declared order,
+ and derives `unknown` with no resolved target. Include success from secondary, all candidates
+ unavailable, and a skipped earlier source with no acquisition, each handled by explicit
+ clauses. A needed response absent gives `acquisition-missing`, a bad receipt
+ `acquisition-invalid`, a later-source reference or overlapping target `input-malformed`, and
+ a matched rule's missing value pointer `read-failed`; none silently tries another source.
+6. `changed-binding`: retain `unbound.json` and `binding.json` beside `mapping.json`, the bound
+ dialect, as the staging README requires. A second installation changes one generated AI or
+ web assignment and its matching trusted profile. Every retained response's profile reference
+ names its new assignment, and its receipt verifies under that profile; all earlier checks
+ pass. With the old preparation fixed, the valid new bound dialect gives `preparation-differs`;
+ an old profile digest, wrong model, missing capability or non-generated profile gives
+ `profile-mismatch`. A binding for another published
+ digest, a partial assignment or an extra capability gives `input-malformed`. A separately
+ recorded preparation under the second binding may read; the first is not relabelled.
+7. `changed-response`: change a retained result with its receipt and the independent expected
+ preparation fixed: `acquisition-invalid`. Change `R.fields` under its own fixed receipt:
+ the same finding. Without that receipt, a field change affecting a derived claim gives
+ `preparation-differs`; a well-formed change to an unread field need not give a finding.
+ With no record receipt, reorder responses, updating indices to cite the same responses,
+ with the preparation fixed: the changed citation order gives `preparation-differs`. Replay
+ makes no model or web call.
+8. `selected-parent-child`: retain the selected parent and the resulting child using
+ [RFC 0020](../rfcs/0020-workflow.md) §§3–5 and §11's output, selection and execution records.
+ A stage's output pointer resolves in prepared facts, never directly in `R`; `cardinality`
+ `one` can project the copied fields object. The selected payload's `/company-id/value` or
+ `/item-id/value` projects to the next case under that workflow's typed bindings. Presence,
+ generated influence, closed offered sets and parentage use its rules. Its §11 acceptance
+ construction remains the two-stage `operation` run; this research plan neither replaces
+ that demonstration nor changes the workflow's version or refusal codes. The analogous
+ research recordings wait for research support. Workflow version 1 admits a research stage
+ under RFC 0020 §4 once a Runner pins the stage's release form and encoding
+ ([judgment-pack-runner#88][research-preparer]), as RFC 0020's round 2
+ ([judgment-pack-spec#177][workflow-round-2]) decides; until then no research stage can be
+ frozen or verified. The research recording is beside the operation demonstration, not in
+ place of it.
+
+[research-preparer]: https://github.com/Judgment-Pack/judgment-pack-runner/issues/88
+[workflow-round-2]: https://github.com/Judgment-Pack/judgment-pack-spec/pull/177
+
+The staging manifest's existing `reading` and `finding` rows keep their meanings. Malformed
+and over-bound variants are reader tests under §11, with the exact refusal report as expected
+output, not fixtures, until the staging README defines a refusal row form.
+No manifest or file under `conformance/` is added by this plan. (No vector decides this.)
+
+**Refusals.** Before it recomputes anything, it refuses the reading, which then reports nothing but
+the refusal, at the first of these phases that fails, in this order:
+
+1. the bounds of §12 that are measured on bytes — a document's size, its nesting (the case
+ document's at 32 levels), and each number literal's characters and exponent — taken on every
+ document before any is read: `input-over-bound`;
+2. every document read as §1 reads one, and the record as one line: `input-malformed`;
+3. the bounds of §12 that are counts — the sources, the parameters in a scope, the clauses of a
+ rule, the conditions one `all` or `any` lists, the `unwrap` pointers, the fact and evidence
+ targets, the retained responses per `research` source (at most 64), and every research field,
+ text, list, observation, citation, capability and read-source maximum in §12; also the
+ endpoint-scope entry count and bytes per entry (§5.1); and the nesting of each acquisition's
+ result, taken wherever measurable before any form: `input-over-bound`.
+ Type-dependent maxima measure each value by its field's declared `type` when that `type`
+ is one of §4.3's six types, and not otherwise;
+4. a dialect document that is an object whose `version` is an integer of a version this document
+ defines, `2` or `3`, that the verifier does not read: `version-unread`;
+5. every document's form — the dialect against §§2–8, every rule they give it included, and each of
+ its sources against §4's members and its kind's, whichever its kind, and each reconciliation
+ read against §6.4; the binding document against §4.4; a profile against §5.1 and the key rule;
+ the acquisitions against §5.2, including every research field entry against its declaration
+ (§4.3), with receipt members checked under finding 3 below; the preparation's `verifiedAt`
+ against the timestamp form with an instant; the record against its reading below:
+ `input-malformed`;
+6. a dialect that names a kind the verifier does not read: `kind-unread`.
+
+The scope maxima are measured in phase 3 wherever measurable, even on a profile of the wrong
+shape; an unknown or misplaced `endpointScope`, a malformed entry, or the wildcard on a
+`record` profile is `input-malformed` in phase 5, where a profile's form is checked.
+The scope's binding restrictions, including an impossible literal `web` URL, are finding 1.
+A receipt's scope match is check 3 within finding 3, in retained-response order. A preparer's
+request admission runs after parameters resolve and before that request is sent; it does not
+add an offline check of the requested URL. (The vectors `endpoint-scope-endpoint-outside` and
+`endpoint-scope-redirect-outside` decide a receipt's scope match as check 3; no vector decides the
+other rules here.)
+
+Some bounds are measured later, because they cannot be measured sooner: an unwrapped string's
+bytes, and the nesting and number literals of the value it holds, are measured when it is
+unwrapped (§6.1), during recomputation. Over them the reading is refused, `input-over-bound`, with
+nothing reported but the refusal. The nesting of §6.4's combined value is likewise measured
+when it is formed, before its rule runs, with the same refusal.
+
+**Findings.** Otherwise it recomputes the preparation at the given preparation's `verifiedAt`, by
+§§3–9, and ends the reading at the first of these findings, in this order, reporting that one:
+
+1. `profile-mismatch` (§5.1, §4.1, §4.4), the sources taken in their order, and within a `research`
+ source its AI profile first, its web profiles in `search`, `page` order when assigned, then
+ each retained response's profile in `R.responses` order;
+2. for the case: `parameter-invalid` (§3), its parameters in their order, then `read-failed` for its
+ read (§6.2);
+3. for each source in its order: `parameter-invalid` for a source parameter it declares, in their
+ order (§3); then, for its acquisition and its read, `acquisition-missing`,
+ `acquisition-unexpected`, `acquisition-invalid`, `acquisition-stale`, `acquisition-sessions`
+ (§5.2), `calculation-invalid` (§7) and `read-failed` (§6), in that order. For a `research` source,
+ check for a missing or unexpected source member first, then apply the acquisition findings to
+ each retained response in `R.responses` order, completing one response's checks before the next;
+ then check the record's own receipt when present, and apply the source's read to `R`. Each
+ receipt is first held to §5.2's form rules: `servedAt` and `acquisition.observedAt` are strings
+ with instants, `callIndex` is an integer at least zero, and `sessionId` is a string, not held
+ to gateway §3a's token form; otherwise `acquisition-invalid`, before the time and session rules.
+ `acquisition-stale` names only a present instant outside the window. (No vector decides this.)
+ `acquisition-sessions` names only a well-formed session set that fails §5.2's session rule.
+ (No vector decides this.) After the last source, `acquisition-unexpected` for a member of the
+ acquisitions that names no source;
+4. `admission-refused` (§8.2);
+5. **`preparation-differs`**: the recomputed preparation's canonical bytes (§9.5) are not the given
+ preparation's, written in that form; a given preparation that cannot be written in that form
+ differs;
+6. with a record, **`record-inputs-differ`**: the record's `inputs.facts` is not the facts document
+ (§8.1), its `inputs.evidence` is not the evidence-availability document, or its `cites`, absent
+ being the empty array, is not the preparation's `cites` as a set, each compared as JSON values.
+ The citations are compared as sets: a citation either side gives twice is one member of its set,
+ and how many times one is given is not compared;
+7. with a record that carries a `binding`, **`binding-foreign-kind`**: the record's `binding` is not
+ an object whose `kind` is the string `judgment-pack-runner/preparation/1`; no digest is compared;
+8. with a record that carries a `binding`, **`binding-mismatch`**: the bytes of the record's
+ `binding` are not the preparation's binding (§9.5), byte for byte: another digest, or the same
+ members written otherwise, in another order or with whitespace;
+9. **`unbound`**: a binding is required, and no record is given or the record carries no
+ `binding`.
+
+**Reading the record.** The record is one line, holding neither a line feed nor a carriage return,
+that is one JSON object read as §1 reads a document, with an object `inputs`. Its member `binding`
+is read by that exact name: a record that names a member `binding` but for case is refused, not read
+as one with no binding. Two member names differ **but for case** when they are not equal, and are
+equal once each of `A` to `Z` in them is mapped to `a` to `z` and nothing else is: ASCII case only,
+with no other folding. A record **carries** a binding when it has a member of that name, whatever
+its value: a `binding` that is `null` is carried, and is not of the binding's form (finding 7); a
+record with no member of that name carries none, which is no finding unless a binding is required
+(finding 9). The member's bytes are those of its value as the line writes them, from its
+first character to its last; nothing is canonicalised again. This document reads nothing else of the
+record. It does not check the record's signature, its chain or its witness, which the runtime's
+reader and the checkpoint witness statement's reader check; a binding commits a preparation only
+under a record signature that verifies (§13).
+
+**The reading.** A reading with no finding reports:
+
+- the preparation's **digest**;
+- the **binding**: `matches` with a record whose binding matches, `absent` with a record that
+ carries none, and `not-checked` with no record;
+- the **facts document** and the **evidence-availability document** (§8.1);
+- **`targetsByClass`**, an object giving `asserted`, `record` and `generated` each the number of
+ lineage entries of that class: every target counted, with a value or without;
+- **`unsignedParameters`**, when it is not empty; and
+- **`unsignedFreshness`**, when it is not empty.
+
+**`unsignedParameters`** names the parameters a derivation read that no receipt commits. It has an
+entry for each source that was acquired, whose read is a rule that was applied (not a skipped
+source, not a calculator that did not compute), that has a target, and whose rule's conditions name
+a parameter that its own acquisition does not commit. The parameters a rule's conditions name are,
+at any depth, `equalsParam`'s `param` and `freshWithin`'s `asOf` and `maxAge`, and not those it only
+declares. A source's own acquisition commits a parameter its request commits (§4.1), and an input
+its calculator echoed that is bound to the parameter (§7); another source's receipt commits nothing
+for it. An entry is `{"source", "parameters", "targets"}`: the source's name; each such parameter as
+`{"name", "kind"}`, ordered by name; and the number of the source's targets. The kinds:
+
+- `runAt`: the parameter `runAt`;
+- `ambiguous-text`: a parameter that would be of kind `case`, `local-file` or `upstream`, which the
+ source's request carries only in a `$text` that names another parameter too;
+- `case`: a case parameter;
+- `local-file`: a source parameter from a local-file source;
+- `upstream`: a source parameter from an earlier source that has an entry here with a parameter of
+ kind `case`, `local-file`, `upstream` or `ambiguous-text`;
+- `upstream-runAt`: a source parameter from an earlier source that has an entry here whose
+ parameters are all of kinds `runAt` and `upstream-runAt`.
+
+A source parameter from an earlier acquired source that has no entry — whose value its rule derived
+from signed values alone, or which it copied from its result — is not named. The entries are in the
+order of `sources`.
+
+**`unsignedFreshness`** is `{"against": "preparation.verifiedAt", "verifiedAt": V, "sources": L}`,
+`V` the instant and `L` an entry, in the order of `sources`, for each source acquired:
+`{"source", "checks", "targets"}`, `checks` being `["acquisition"]`, or
+`["acquisition", "calculation"]` for a calculator that computed, and `targets` the number of the
+source's targets. Each such freshness was judged against `verifiedAt`, which no receipt covers: a
+matching binding in a record whose signature verifies is what commits it (§13).
+
+**The report.** A verifier reports a reading, a refusal or a finding as one JSON object, written in
+the preparation's canonical form (§9.5), whose member `result` is `reading`, `refusal` or `finding`.
+A refusal is exactly `{"result": "refusal", "refusal": C}` and a finding exactly
+`{"result": "finding", "finding": C}`, `C` its code. A reading is `result` and the members listed
+above, exactly: `digest`; `binding`; `facts`, the facts document; `evidence`, the
+evidence-availability document; `targetsByClass`; and `unsignedParameters` and `unsignedFreshness`
+when they are not empty. A verifier that is a program writes the report on its standard output, as
+one line, and exits with status 0 for a reading, 1 for a refusal and 2 for a finding, and with
+status 3, writing no report, when it could not run at all, as on an argument it does not take or a
+file it cannot open. A verifier that is a library states the same three outcomes in its own idiom.
+
+## 12. Bounds
+
+A verifier holds its inputs to the Runner's bounds (Runner, "Numeric and resource profile"), with
+version 3's research bounds added:
+
+- the dialect at most 131072 bytes; the dialect, the case and the acquisitions together at most
+ 2097152 bytes; the profiles, and a binding document, each at most 65536 bytes; and the preparation
+ and the record each at most 8388608 bytes;
+- at most 16 sources; 64 retained responses per `research` source; 64 parameters in one scope;
+ 64 clauses in one rule; 64 conditions listed by one `all` or `any`; four `unwrap` pointers;
+ 200000 bytes in one unwrapped string; and 256 fact targets and 128 evidence targets;
+- at most 32 levels of nesting in a value a read applies to — the case document, a result, an
+ unwrapped value — and at most 64 in any document; and
+- number literals of at most 128 characters, whose exponent, when they have one, has a magnitude of
+ at most 308.
+
+For research, §4.3's maxima also hold: 64 declared fields and 64 answer entries per source;
+64 UTF-8 bytes per field name; 2048 per description; 256 per model name; 4096 per evidence
+instruction; 8192 per text value; 64 items per text-list, each at most 1024 UTF-8 bytes;
+128 ASCII characters per decimal string, a range endpoint included; 64 conflicting observations
+per entry; 64 indices per citation array; three capabilities per source or profile; two web
+assignments per source; and 15 earlier sources per reconciliation read (§6.4). Count strings
+after JSON decoding. Wrong forms and unmet minima are `input-malformed`; exceeding these maxima
+is `input-over-bound`. The document-size and nesting bounds still hold arbitrary retained
+results, requests, constraints and the combined value of §6.4. Nothing is truncated to fit.
+
+For endpoint scopes, at most 32 entries per profile and 2048 UTF-8 bytes per entry, counted
+after JSON decoding (§5.1). Exceeding either maximum is `input-over-bound` before forms;
+wrong forms, duplicate entries and an empty array are `input-malformed`. (No vector decides this.)
+
+Nesting is counted from the document's root at zero, and every object and every array is one level
+of it: `{}` is at one level, `{"a": []}` at two, and a document that is a string, a number, `true`,
+`false` or `null` at none. On the bytes, a **number literal** is a maximal run, outside strings, of
+the characters `0` to `9`, `+`, `-`, `.`, `e` and `E`, and its **exponent** is the digits after its
+first `e` or `E`: the run of digits that follows it, or that follows the `+` or `-` after it; a
+literal with no such run has no exponent. An unwrapped string's bound is counted on the UTF-8 bytes
+of its decoded value.
+
+Over any bound it refuses the reading, `input-over-bound`, and MUST NOT read part of it. The bytes are
+bounded first, by the documents' sizes, before any is read; §11 gives the order of the rest. A
+preparer refuses the same inputs before it writes a preparation.
+
+## 13. What a preparation establishes, and what it does not
+
+A preparation has parts of three natures, and what it establishes differs by part. A
+**derivation** — a copy, a rule, a calculated value's lineage, the facts and evidence-availability
+documents, the preparation's form and its digest — is recomputable: a verifier that recomputes it
+establishes it itself, from the inputs, trusting no one for it. An **acquisition**'s bytes are not
+recomputable: they are held by their digest, under a receipt, and what they establish is the
+receipt's business, which is byte lineage and not truth, the stance Core §6.3 takes of a source.
+For research, each retained response is held this way, and the record itself only when it has its
+own receipt. The caller assembles the research record: fields, membership and order are the
+caller's assertion, even when a receipt commits the assembled record's bytes. An **asserted**
+input is the operator's say, and recomputation shows only that it was carried faithfully. A page
+cited by URL alone is no retained response; the claim it supports is the answer's say.
+
+- **The facts and the evidence availability a copy or a rule derived.** Establishes: that these
+ facts and this evidence availability were derived from those bytes by these rules, at that
+ instant.
+
+ Does not establish: that the rule is right for the pack, or reads what its author meant; that a
+ target with no value has none in the system.
+
+- **A calculated value's lineage.** Establishes: that the calculator's answer, in the bytes
+ acquired, echoed the inputs bound to this case, and reported its tables as of instants within
+ the dialect's limits before `verifiedAt`.
+
+ Does not establish: that the calculator is deterministic or calls no model; that its arithmetic
+ or its tables are right; that it used only what it echoes; that an `asOf` is true.
+
+- **An acquisition of class `record`, verified under a trusted profile.** Establishes: byte
+ lineage: the holder of the gateway key the profile pins signed a receipt that names these bytes
+ by their digest, this request by its commitment, this adapter, shape and endpoint, at these
+ times; what more the receipt says is the gateway's (gateway §1.2a, §5).
+
+ Does not establish: that the system's record is true, current or complete; that the adapter
+ reported its acquisition truly; that the session is sealed or complete, or that the caller did
+ not choose among answers; anything once the gateway's key is copied.
+
+- **An acquisition of class `generated`, a research record above all.** Establishes: the least:
+ that each receipt holds its request and returned bytes under its trusted profile; for research,
+ this applies to every retained response, and to the record itself when it has its own receipt;
+ the declared model and capabilities match the profiles then bound, without establishing actual
+ model use.
+
+ Does not establish: that the answer is right, complete or current, or the model's own; that a
+ candidate it names exists; that a page it cites says what it quotes, beyond a receipt for that
+ page; that the retained set is every answer and every read the run made; that the caller did not
+ choose among runs or responses; that the model made a read retained with the answer; that the
+ caller's asserted membership and order describe the run; that a field's status, value or
+ citation indices are the model's rather than the caller's say; that a cited response supports
+ the value it is cited for; that a `stale` or `not-found` status is right; which model answered.
+
+- **An acquisition under a constrained page profile.** Establishes: that each receipt's final
+ endpoint lay in the installation's reviewed scope, as the Gateway's adapter testified under
+ its signature. The profile digest holds the whole scope. (The vector
+ `endpoint-scope-changed-constraint` decides that the digest holds the scope, and the vectors
+ `endpoint-scope-endpoint-outside` and `endpoint-scope-redirect-outside` that the final endpoint
+ lies in it; no vector decides the other rules here.)
+
+ Does not establish: the page's content or relevance; that the host is public; anything about
+ the requested URL's scope or intermediate redirects; that the preparer checked admission. The
+ scope holds the URL as written, not what a server serves for it. §5.1's form refuses an
+ escaped slash or backslash and a dot segment before a path parameter or an escaped delimiter,
+ but no finite list of spellings covers every server's normalization. Spellings that escape
+ remain: double encoding such as `%252e`, an overlong UTF-8 dot such as `%c0%ae`, a full-width
+ dot or solidus (`%ef%bc%8e`, `%ef%bc%8f`), and a server's own rewriting. That residual stays
+ the operator's, as the Gateway's redirect policy already is. A server that folds path case
+ causes a false refusal, not an escape: it serves an in-scope page under a spelling the byte
+ comparison refuses. Request commitments and result digests still hold their bytes as above.
+
+- **An asserted input: the case, a local file, a parameter no receipt commits.** Establishes: that
+ the preparation carried what the operator supplied, faithfully.
+
+ Does not establish: anything about it: an asserted input rewritten with its preparation
+ recomputed verifies as the original did; `unsignedParameters` names the parameters a rule read
+ on the operator's say.
+
+- **A binding document (§4.4), and the bound dialect it yields.** Establishes: that the bound
+ dialect is the published one with each unbound source bound to the profile the binding document
+ names.
+
+ Does not establish: that that profile is the one the publisher meant, or reads the system the
+ publisher's fixtures were recorded from: the binding document is the installation's statement; a
+ record commits the bound dialect, its profile assignments included, and neither the binding
+ document's digest, nor the published dialect's, nor the catalog names the binding removes.
+
+- **`verifiedAt`.** Establishes: that every freshness check holds against it.
+
+ Does not establish: that it was the instant of admission: without a binding no signature covers
+ it, and a preparation recomputed at another instant verifies as the original does.
+
+- **A binding that matches, in a record whose signature verifies (a check this document does not
+ make).** Establishes: that the preparation, its instant included, is the one committed in the
+ record when its key's holder signed it.
+
+ Does not establish: anything against the operator, who holds the key and the clock and can
+ recompute, write and sign again, which only a checkpoint held independently from before the
+ change shows; when anything was prepared: a binding carries no time.
+
+- **A binding that matches, with no signature checked.** Establishes nothing by itself.
+
+Nothing establishes an operator's intent, a source's truth, a model's correctness, or anything the
+dialect does not name: a target the dialect does not map is unknown to the evaluation, which its
+omission does not guarantee (Runner, "Release checks, runtime and offline verification"). A reading,
+and a report built on one, MUST NOT be described as establishing anything listed above as not
+established.
+
+## 14. The preparation verifier
+
+An implementation is a *conforming preparation verifier* when, for every reading it admits, it gives
+the refusal, the finding or the reading §11 defines, and when it gives every vector's expected answer
+in the dialect vectors published with the specification version it names. Its claim takes the form
+"a preparation verifier conforming to `spec/dialect.md` of specVersion *X*, reading dialect version
+2, or versions 2 and 3, and the kinds *K*, and `operation` of the shapes *S*", and names only
+versions, kinds and shapes that the vectors published with that version exercise (§4). The class is
+independent of Core's four classes and of the witness-statement reader: none implies it, and it
+implies none. It says nothing about a preparer, which this document does not define as a class: a
+verifier's agreement with a preparer shows that the two read the format alike, and no more. A claim
+of this class MUST NOT be described as establishing anything §13 says a preparation does not
+establish.
+
+Until a specification version publishes the dialect vectors, no claim of this class is available.
diff --git a/internal/policy/official/spec/policy.md b/internal/policy/official/spec/policy.md
new file mode 100644
index 00000000..2bc95a7c
--- /dev/null
+++ b/internal/policy/official/spec/policy.md
@@ -0,0 +1,379 @@
+# Policy content and governing adoption
+
+## Status and artifact scope
+
+This is the Policy companion text proposed for acceptance at **draft maturity**
+under [RFC 0023](../rfcs/0023-policy-companion.md). The maintainer authorized that
+acceptance conditional on required CI passing and
+[PR 218](https://github.com/Judgment-Pack/judgment-pack-spec/pull/218) merging.
+Until merge the default-branch RFC remains Review; this branch's acceptance
+wording describes the approved draft that takes effect upon that merge. It does
+not claim a completed merge, immutable publication, stable maturity or consumer
+adoption.
+
+Upon that merge, §§1–8 define the *Policy offline reader* companion class. They do not change Core `0.2.0-draft`, its schema, evaluator
+semantics, document corpus or evaluation corpus. The exact document selector is
+`formatVersion: "1.0.0"`; that identifies grammar, not stable maturity or a Spec
+release. Unsupported readers refuse it without legacy aliases.
+
+The draft normative artifacts are this prose and the closed versioned
+[Policy](../schema/policy/1.0.0/policy.schema.json),
+[Governing adoption](../schema/policy/1.0.0/governing-adoption.schema.json) and
+[shared](../schema/policy/1.0.0/common.schema.json) schemas. Schema acceptance alone
+is insufficient: exact retained bytes, anchors, references, coverage, bounds and
+refusal order are also required. A disagreement is a specification defect, never
+authority to execute. The [124 agreement vectors](../conformance/policy/1.0.0/vectors/manifest.json)
+are staged in no released corpus until an exact independent Policy draft release names them.
+No Policy offline-reader conformance claim is available before that release.
+
+The [publication plan](../conformance/policy/1.0.0/PUBLICATION.md) follows the
+selected independent companion release route and records its conditional-merge
+and separate publication gates.
+The first independent release identifier is `policy-v1.0.0-draft.1`. Its
+presence in a source branch does not establish publication: the exact tag and
+a maintainer-published GitHub release must both exist. Core `specVersion`
+remains unchanged.
+The historical [prototype 0.0.2](../rfcs/policy-companion-prototype/README.md) and
+[proposed 1.0.0 candidate](../rfcs/policy-companion-contract/README.md) remain
+byte-for-byte unchanged. Their pins, the [promotion map](../conformance/policy/1.0.0/PROMOTION.md),
+and the [migration guide](../conformance/policy/1.0.0/MIGRATION.md) preserve their
+meaning and distinguish schema/result identity changes from artifact bytes.
+
+## 1. Exact selectors and immutable artifact identity
+
+A document has exactly one `formatVersion`, the **string** `"1.0.0"`, and `kind`
+`"policy"` or `"governing-adoption"`. No prototype wrapper, `specVersion`, integer
+selector, alias, suffix, coercion, or extension member is permitted. The schemas' format-versioned
+URLs identify exact draft schema resources, not a release tag or proof of publication.
+Readers must dispatch on the whole selector before interpreting this grammar.
+
+The independent `version` names a revision of the immutable artifact, alongside
+its scheme-bearing URI `id`. It is exactly three unsigned ASCII decimal components
+separated by dots: `0` or a nonzero digit followed by digits, with no leading zeros,
+suffix, spaces or final newline, at most 256 characters. `0.0.0` and a 256-character
+version are valid. No component arithmetic, bump policy, compatibility, reservation
+or historical uniqueness is inferred. In particular, artifact `7.3.42` still uses
+format `1.0.0`. Pack artifact references follow the same bounded version grammar;
+the retained Pack keeps its own Core `specVersion` unchanged.
+
+An `id` is an opaque, scheme-bearing identifier matching the complete `URI`
+production of [RFC 3986, Appendix A](https://www.rfc-editor.org/rfc/rfc3986#appendix-A),
+at most 2,048 characters. Optional query and fragment are allowed; a relative
+reference is refused. This means `URI`, not the narrower `absolute-URI` production
+that excludes fragments. Raw Unicode, controls, whitespace (including a final LF)
+and malformed percent triplets refuse. Percent-encoded Unicode and registered
+names remain valid; percent decoding, trimming and identity normalization never
+occur. Raw brackets belong only around an authority's IP literal, so brackets in
+path, query, fragment or rootless content must be percent-encoded. IPv6 dotted
+tails must satisfy the IPv4 decimal-octet grammar without leading zeros. IPvFuture
+accepts both `v` and `V`, under [RFC 5234 §2.3](https://www.rfc-editor.org/rfc/rfc5234#section-2.3).
+An unbracketed numeric host that fails IPv4 can still be a valid registered name.
+Identity is not permission to fetch it. Local IDs match `[a-z][a-z0-9]*(?:-[a-z0-9]+)*`, at most
+128 characters. Required readable text is nonempty and at most 4,096 characters.
+Every defined object is closed: unknown members at any level are refused.
+
+The unreleased candidate URI correction after commit
+`30b0b30a1b0c851c41bdb271d6ef9534c91bcdec` changes three dependency-derived answers:
+final-LF identifiers and IPv6 literals with leading-zero IPv4 tails now refuse;
+uppercase-`V` IPvFuture identifiers now validate. The checker applies a local
+reader-local URI assertion, including its consuming-Pack structural checks. Shared
+Core validators elsewhere and the frozen prototype are unchanged. The companion's
+2,048-character ID bound belongs to its schemas; other Core URI fields retain
+their existing schema bounds.
+The 20 URI vectors also distinguish generic URI grammar from URL-parser behavior.
+This correction was made before promotion; it does not change shared Core or prototype behavior.
+
+## 2. Exact retained content and optional canonical identity
+
+A content reference is exactly `{bytesDigest, byteLength, mediaType}`. The digest
+is lowercase `sha256:` plus 64 hexadecimal digits over the exact retained bytes,
+including whitespace and final newlines. Length is the exact nonnegative integer
+byte count, never a Boolean. It never hashes a URL or filename. Media type is a
+lowercase token/token string under the shared schema, at most 128 characters,
+without parameters. Artifact bytes require `application/json`; a Policy narrative
+requires `text/plain` and valid UTF-8. Original bytes may be opaque, including PDF.
+
+Media type belongs to a reference and its registration, rather than to the digest
+alone. Identical bytes can be registered as both `text/plain` narrative and
+`text/markdown` original. Each reference must resolve under its declared media
+type, hash and length; registering one type does not register another. Conflicting
+bytes for one digest refuse. Distinct retained bytes count once toward the total
+budget, even with multiple types or roles; each consuming role still applies its
+own byte limit. Media-type declarations do not prove the content's actual type.
+
+An artifact reference is exactly `{kind, id, version, content}` with optional
+`canonicalIdentity: {profile: "jps-canon", canonicalDigest}`. The only artifact
+reference kinds in this draft are `policy` and consuming `pack`, in their
+specified positions. Exact bytes are always checked, even when canonical identity
+is supplied. A canonical match never substitutes for the exact-byte pin.
+
+`jps-canon` reuses the existing [Dialect canonical form](dialect.md),
+which in turn references the checkpoint-witness form. It is not JCS or preparation
+canonicalization. Objects sort names by Unicode code point; arrays retain order;
+strings retain Unicode without normalization, with JSON escaping for quotes,
+backslashes and controls; output is UTF-8 without insignificant whitespace.
+Only integer JSON number literals whose magnitude is at most `9007199254740991`
+are in this domain; `-0` canonically becomes `0`. Fractional or exponent literals
+are outside this domain, even when mathematically integral. Companion documents
+use this domain before schema checking; they retain their original bytes regardless.
+
+Core permits other JSON numbers in optional extensions. The checker reads Pack
+numbers as raw literals and validates numeric values with exact decimal/integer
+values, without binary-float rounding or rewriting execution bytes. A Core-valid
+Pack outside `jps-canon` remains usable with its raw content reference alone. If
+its reference requests canonical identity, it refuses as
+`unsupported-canonical-identity`. Canonical identity is checked only when present.
+Pack and companion strict JSON reading share the existing `tools/dialect_verify.py`
+reader, including number-literal and nesting bounds; no Core limit or pin changes.
+
+## 3. Policy content, original provenance and sections
+
+A Policy requires `formatVersion`, `kind`, `id`, `version`, `title`,
+`managementMode`, `content`, `sections` and `sourceProvenance`.
+`managementMode` is `workspace-managed` or `externally-managed`. It declares
+publication-management intent and authenticates no publisher, approval or role.
+It is retained artifact provenance/ownership intent, not current host governance;
+changing host management or authority does not mutate historical content.
+The old `desk-managed` spelling is refused, not aliased. Importing content as a
+local draft requires explicit intent; it does not import the source's approval.
+
+`content` identifies the exact retained narrative. Each of 1–64 sections has a
+unique local `id`, readable `title`, and `anchor: {startByte, endByte, bytesDigest}`.
+The anchor is a nonempty, zero-based, half-open range of UTF-8 bytes in **that
+narrative**, with SHA-256 of the selected bytes. Both endpoints must be UTF-8
+boundaries and `0 <= startByte < endByte <= narrative length`. Anchors may overlap
+and need not partition the narrative. Their validity does not prove that all
+meaningful clauses were represented, or that stable IDs preserve meaning after a
+revision. These offsets are never original PDF/page/provider-document offsets.
+
+Each of 0–16 unique original-source records requires a local `id`,
+`source: {provider, accountId, resourceId}`, explicit `sourceRevision` and `content`.
+The provider/account/resource values are readable opaque provenance, not
+credentials or authenticated authority. `sourceRevision` is an opaque nonempty
+string or explicit null when unavailable. Original bytes remain separate from
+narrative/extraction bytes. The checker neither extracts nor interprets them.
+Sections optionally carry 0–16 unique `sourceRefs`, each exactly
+`{sourceId, location}`. `sourceId` must resolve to an original-source record;
+`location` is a readable citation such as `Clause 2`, not a verified byte offset.
+
+Newly authored content may have no sources. No executable conditions, lifecycle,
+ACLs, roles, publication states, signatures, review assertions or approval Booleans
+belong in these immutable documents. Optional structured `requirements` are also
+unsupported; even a claimed non-executable form is refused. A later form requires
+review and an explicit selector decision, without adding a second decision language.
+
+## 4. Governing adoption and scoped total coverage
+
+An adoption requires `formatVersion`, `kind`, `id`, `version`, `consumer` and
+`governingPolicies`. The consumer is one exact retained Core `0.2.0-draft` Pack.
+The checker validates its existing structural schema and resolves the elements
+below. This is no evaluation or full Core semantic-conformance claim. Graph
+consumers, graph composition, transitive closure, release envelopes, registration
+and cycle handling remain unsupported, pending their owning contracts.
+
+There are 1–16 governing-policy entries, each exactly `{policy, scope, coverage}`.
+One stable Policy identity can occur only once; two versions of the same identity
+in one adoption refuse rather than imply precedence. List order never establishes
+policy priority. Each Policy reference resolves its exact bytes, ID/version,
+optional canonical identity, selector, closed grammar, sources and sections.
+
+Scope is either `{kind: "whole-policy"}` or
+`{kind: "sections", sectionIds, reviewBasis}`. A section list is nonempty, unique,
+at most 64 IDs and resolves only declared sections. The limited scope's retained
+`reviewBasis` describes that intentional interpretation. Whole scope selects all
+declared sections; it does not prove that the author declared every applicable
+clause or every applicable policy.
+
+Coverage contains **exactly one** record per selected section, at most 64 records,
+with no duplicate section identities, omissions, unknown IDs or outside-scope
+records. The five closed forms are:
+
+| Status | Required members in addition to `sectionId` and `status` |
+| --- | --- |
+| `implemented` | Nonempty `consumerElements` (at most 64) and retained `reviewBasis` |
+| `manual` | Readable `handoff` naming a responsible process |
+| `awaiting-interpretation` | Readable `explanation` of unresolved meaning |
+| `awaiting-implementation` | Readable `explanation` of missing implementation |
+| `out-of-scope` | Readable `rationale` for this selected clause's exclusion |
+
+A clause excluded from limited scope has no coverage record; a selected clause
+marked `out-of-scope` has the explicit rationale above. Partial automation is
+valid and never asserts complete automation or permission to run. Both kinds of
+`reviewBasis` are retained explanatory bytes, not proof of a reviewer's identity,
+whole-policy approval or authorized sign-off. Manual handoff text grants no role.
+
+The typed `consumerElements` forms are exactly:
+
+| Reference | Actual Core target |
+| --- | --- |
+| `{kind: "rule", id}` | A declared `rules[]` entry with that ID |
+| `{kind: "exception", id}` | A declared `exceptions[]` entry with that ID |
+| `{kind: "applicability"}` | The present `applicability` condition |
+| `{kind: "fallback"}` | The present `fallbackOutcome`, resolving to a declared outcome |
+
+Singletons have no fabricated ID. Kind/ID confusion, absent/unknown targets and
+repeated references within one coverage record refuse. Rule and exception IDs
+occupy separate namespaces. The checker also requires unique rule, exception and
+outcome IDs, resolves fallback, and resolves each exception's optional target-rule
+and outcome references. It does not implement all Core semantic checks or prove
+that a condition correctly interprets a clause. Outcomes, evidence requirements,
+condition subelements and escalation are unsupported coverage kinds.
+
+Optional `informationalSources` is at most 16 unique content references. These
+bytes remain citations; they never create governing dependencies, review
+assertions, authority or permissions. The checker cannot upgrade one into an
+adoption, infer natural-language consistency or decide applicability.
+
+## 5. Resource limits and refusal classifications
+
+These are Policy offline-reader bounds, not changes to Core limits.
+All maxima are inclusive. Strings are counted after decoding in Unicode
+characters unless the table specifies bytes. The closed schemas state all field
+maxima; the capability record exposes them for discovery.
+
+| Resource | Maximum |
+| --- | --- |
+| Any parsed companion/Pack/carrier JSON document | 262,144 exact bytes |
+| JSON nesting, each object/array one level from zero | 32 |
+| JSON number literal | 128 characters; exponent magnitude 308 |
+| Narrative, interpretation/review basis, informational material | 1,048,576 bytes each |
+| Original source material, one carrier registration | 4,194,304 bytes each |
+| Distinct retained material across one supplied carrier | 16,777,216 bytes |
+| Ordered registrations in the local fixture/vector input carrier | 16 |
+| Artifact version | 256 ASCII characters |
+
+An artifact is also subject to the parsed-document byte limit, even though its
+content reference has the general material maximum. Each role is checked
+independently. Unsupported original size refuses the whole supplied input;
+truncating it, silently dropping it, or substituting narrative extraction is not
+a complete input. Registration exceeding a bound changes no material state.
+
+The reader returns exactly one of these bounded JSON objects (object member order
+is irrelevant; no optional messages, paths, content, titles or provider identifiers):
+
+```json
+{"status":"valid","formatVersion":"1.0.0","maturity":"draft"}
+{"status":"refused","code":"invalid-selector"}
+```
+
+`valid` means supplied-document and reference agreement under this draft only. A refusal reports no partial coverage or permission. CLI success
+exits 0 and refusal exits 1. Environment/setup failures are not document results;
+operators must not treat an inability to run as success.
+
+| Code | Meaning |
+| --- | --- |
+| `input-over-bound` | Physical bytes/nesting/number limits, schema maxima, role sizes, registration count or aggregate bytes exceeded |
+| `invalid-json` | Strict UTF-8 JSON failed: duplicate keys, BOM, nonfinite numbers, unpaired surrogates, multiple values, malformed syntax |
+| `invalid-selector` | Root is not an object; selector missing, wrong type, not strict ASCII `x.y.z`, or over 256 characters |
+| `unsupported-format` | Selector is well-formed within that bound but is not exactly `1.0.0`; no shared-major inference |
+| `invalid-document` | Supported companion fails canonical numeric domain or closed schema; wrong kind, malformed artifact version or unsupported members |
+| `missing-material` | A referenced digest, required fixture document or retained local file is absent/unavailable |
+| `reference-mismatch` | Raw bytes/hash/length/registered media type, ID/version, or a supported requested canonical digest differs |
+| `invalid-anchor` | Narrative UTF-8, section-ID uniqueness, byte range/boundary/hash or source reference fails |
+| `invalid-coverage` | Semantic scope, total coverage, policy uniqueness or typed consumer reference fails |
+| `invalid-consumer` | Retained Pack fails existing Core schema or the specific ID/fallback/exception checks in §4 |
+| `unsupported-canonical-identity` | Requested `jps-canon` identity is outside that existing profile's domain |
+| `invalid-carrier` | Synthetic fixture/vector carrier has invalid closed shape or local path usage |
+
+Bounds on physical document bytes, nesting and number literals are checked before
+JSON syntax, including on malformed bytes. Then strict JSON is parsed. Exact
+format dispatch occurs before canonical-domain and schema interpretation:
+`{"formatVersion":"7.0.0","n":1.5}` is `unsupported-format`. Selector lexical
+failures, including the selector's own 256-character limit, are
+`invalid-selector`; other schema maxima are `input-over-bound`. Unsupported kinds
+under supported format are `invalid-document`. Other-field bounds or validity do
+not cause reinterpretation under an unknown format.
+
+For the portable vector input, parse, select and canonical-domain-check the root
+before checking the registration count and registering material in listed order.
+Local carrier sources are acquired only after root dispatch and the count check,
+one source immediately before its registration. An earlier refusal prevents later
+source acquisition. NUL paths and path-normalization failures are `invalid-carrier`.
+Then check the root's schema and semantics in the following order:
+Policy narrative, sources, sections in declaration order; adoption consumer then
+Policies in declaration order, each reference before its Policy/coverage, then
+informational sources. Canonical-domain conversion occurs immediately after root
+selection; all schema maxima found at one schema check take priority over other
+schema failures. Otherwise a closed-schema failure is `invalid-document` (or
+`invalid-consumer` for Core), including structurally identical duplicates rejected
+by `uniqueItems`. Semantic duplicate coverage/IDs with distinct records uses the
+specific code above. On compound defects the first failing phase wins. Refusals
+never render an input-derived diagnostic or exception string.
+
+## 6. Discovery, examples and independent porting
+
+[capabilities.json](../conformance/policy/1.0.0/capabilities.json), also returned by
+`conformance/policy/1.0.0/verify.py --capabilities`, lists exact draft selectors, `draft`
+maturity, kinds, supported Core release, features, bounds and explicit exclusions.
+Capability discovery is an implementation statement, not adoption, trusted review
+or a permission grant. Unsupported format and optional canonical identity are
+separate capabilities; no parser tries an older grammar automatically.
+
+The examples are synthetic retained-byte bundles, derived from 0.0.2 with **source,
+narrative, interpretation and consumer files preserved byte-for-byte**. Policy and
+adoption identities/bytes are explicitly regenerated. The original consumer URI
+is opaque and intentionally retained, even where its spelling mentions prototype.
+
+| Domain | Coverage |
+| --- | --- |
+| [Data access](../conformance/policy/1.0.0/examples/data-access/fixture.json) | Whole policy; rules, fallback, manual requests and pending audit implementation |
+| [Procurement](../conformance/policy/1.0.0/examples/procurement/fixture.json) | Externally managed; applicability-only scope, limited sections, unresolved meaning, explicit exclusion |
+| [Refunds](../conformance/policy/1.0.0/examples/refunds/fixture.json) | Whole policy; rules, exception-only routing, manual inspection, pending implementation |
+
+[fixture.schema.json](../conformance/policy/1.0.0/fixture.schema.json) describes a local synthetic carrier,
+not a portable release envelope or proof that a dependency closure is complete.
+Its files must resolve in the same directory; no network acquisition occurs.
+The separate [vector carrier specification](../conformance/policy/1.0.0/vectors/README.md) defines static
+input bytes and expected results for reuse by Go or other implementations.
+Only a two-integer byte-repeat generator compresses boundary payloads; there is
+no mutation language, implicit migration or dependency on Python transformations.
+The current vectors measure agreement by this author's code and reuse its existing
+canonicalizer; they supply no independent authorship or cross-vendor evidence.
+
+Using the repository's pinned `requirements-dev.txt` dependencies on Python 3.12:
+
+```sh
+python conformance/policy/1.0.0/verify.py --capabilities
+python conformance/policy/1.0.0/verify.py conformance/policy/1.0.0/examples/refunds
+python conformance/policy/1.0.0/check_vectors.py
+python -m unittest discover -s conformance/policy/1.0.0 -p 'test_*.py' -v
+```
+
+The repository workflow runs the staged draft separately from the frozen prototype
+and existing Core/Dialect checks. Passing these checks creates no released corpus or conformance claim.
+
+## 7. Remaining decisions and host boundary
+
+Review/publication transactions, authentication, review-assertion trust, signatures,
+source observations and synchronization, current eligibility, run/action admission,
+Graph closure and independent implementation evidence remain outside this
+companion. Review assertions cannot be inferred from explanatory bytes or model
+test output. No citation, content match, imported history or historical approval
+silently becomes local authority or permission. Host publication and admission
+require their own adopted contracts and current authenticated decisions.
+
+## 8. Policy offline-reader class
+
+A claim MUST name the exact immutable independent Policy release, document format `1.0.0`,
+Policy corpus manifest and its digest, supported Core consumer release, and all
+124 rows published for that class. Every row MUST pass with the complete expected
+result object; a claimant cannot omit refusal/boundary rows or self-exempt a row.
+Until an independent Policy release publishes this corpus, no such claim is available. Draft
+acceptance alone and an experimental software release supply no claim.
+
+The class checks supplied immutable documents and declared material only. It
+MUST implement §§1–5, including the exact selector, closed schemas, required
+references and refusal order, for both Policy and governing-adoption inputs.
+The local fixture/vector carriers support reproducible testing; they are not
+portable release envelopes or trusted registration. A larger host MAY support
+other formats through separately named capabilities; it MUST NOT coerce those
+inputs into format `1.0.0` or claim them as this class's accepted documents.
+
+This class is separate from Core document/evaluator, Dialect preparation-verifier
+and witness-statement reader conformance. It does not establish correct policy
+interpretation, complete organizational dependency discovery, authorized sign-off,
+current lifecycle/currency, source access, or permission to run/dispatch. It
+provides no Graph, provider lifecycle, signature trust or team authorization
+conformance. Stable maturity requires genuinely independently authored readers
+and evidence under the repository's existing rules; two ports by the same author
+or same-vendor model reviews do not provide it.
diff --git a/internal/policy/official/tools/dialect_verify.py b/internal/policy/official/tools/dialect_verify.py
new file mode 100644
index 00000000..4e8c6065
--- /dev/null
+++ b/internal/policy/official/tools/dialect_verify.py
@@ -0,0 +1,3219 @@
+#!/usr/bin/env python3
+"""A preparation verifier written from the words of spec/dialect.md.
+
+This is the first of the two readers RFC 0018 records (its Evidence): it recomputes a preparation
+from a dialect document, a case, the acquisitions and the trusted input profiles, at the
+preparation's own instant, writes it in the preparation's canonical form, takes its digest, and
+holds a runtime record's binding to it (spec/dialect.md §§3-11). It was written from that
+document's text, and from the two sections of the checkpoint witness statement it adopts (§1, the
+canonical form; §5, the key rule and the equation), and from nothing else: not the Runner's code,
+whose `verify-run` is a third reader of the same bytes.
+
+It reads the kind `operation` and the kind `research`, the two kinds the staged vectors exercise,
+and refuses every other kind as `kind-unread` (spec/dialect.md §4: a kind without vectors is defined
+and not claimable; reading one claims nothing). Since the amendment of 2026-10-15 it reads `operation`
+of the shapes `airbyte`, `mcp` and `http` (§4.1): a tool call for `mcp`, and for the others the request
+the gateway source takes, held to being an object, the template rules and its commitment, and not to a
+set of members. Since the Runner's version-3 vectors were staged it reads dialect versions 2 and 3. A
+document of version 3 is read as one of version 2, written one way (§2: no `provider`, `facts` or
+`evidence`, and no member written empty that the Runner's encoding leaves out when empty), its
+preparation of version 3 (§9.1); a source of `http`, `sql` or `web` is held to the form its kind names
+and then refused as `kind-unread`; and an unbound source (§4.4) is read with the binding document it is
+given, by making the bound dialect of the two and reading that as every dialect is read. Since the
+research-contract amendment (RFC 0018, round 8) it reads `research` as §§4.3, 4.4, 5.1, 5.2, 6.4, 9 and
+11 define it: the requested fields and capabilities, the research record's typed answers and their
+citations, the profiles a source is bound to, each retained response replayed under its own profile,
+and the reconciliation read; the Runner's twenty-six research vectors hold the kind. It uses the
+Python standard library alone.
+
+ python tools/dialect_verify.py --dialect mapping.json --case case.json \\
+ --acquisitions sources.json --profiles profiles.json --preparation preparation.json \\
+ [--binding binding.json] [--record record.jsonl] [--require-binding]
+
+It prints the report §11 gives, one JSON object in the preparation's canonical form, and exits 0
+for a reading, 1 for a refusal and 2 for a finding; it exits 3, printing no report, when it could
+not run at all. The reason for a refusal or a finding goes to standard error.
+"""
+
+from __future__ import annotations
+
+import argparse
+import base64
+import hashlib
+import json
+import re
+import sys
+from dataclasses import dataclass, field
+from decimal import Decimal
+from pathlib import Path
+from typing import Any, NoReturn
+
+# ---------------------------------------------------------------------------------------------
+# Outcomes of a reading (§11)
+
+
+class Refused(Exception):
+ """A refusal: the reading reports nothing but its name."""
+
+ def __init__(self, name: str, detail: str = "") -> None:
+ super().__init__(f"{name}: {detail}" if detail else name)
+ self.name = name
+
+
+class Finding(Exception):
+ """A finding: the reading ends at it and reports it."""
+
+ def __init__(self, name: str, detail: str = "") -> None:
+ super().__init__(f"{name}: {detail}" if detail else name)
+ self.name = name
+
+
+def malformed(detail: str) -> Refused:
+ return Refused("input-malformed", detail)
+
+
+# ---------------------------------------------------------------------------------------------
+# Bounds (§12)
+
+DIALECT_BYTES = 131072
+ENVELOPE_BYTES = 2097152
+PROFILES_BYTES = 65536
+BINDING_BYTES = 65536
+PREPARATION_BYTES = 8388608
+RECORD_BYTES = 8388608
+MAX_SOURCES = 16
+MAX_RETAINED_RESPONSES = 64
+MAX_SCOPE = 64
+MAX_CLAUSES = 64
+MAX_LISTED = 64
+MAX_UNWRAP = 4
+MAX_UNWRAPPED_BYTES = 200000
+MAX_FACT_TARGETS = 256
+MAX_EVIDENCE_TARGETS = 128
+MAX_VALUE_DEPTH = 32
+MAX_DOCUMENT_DEPTH = 64
+MAX_NUMBER_CHARACTERS = 128
+MAX_EXPONENT = 308
+# §12, the research maxima of §4.3 and §6.4: strings counted after JSON decoding, in UTF-8 bytes but a
+# decimal string's, which is counted in characters.
+MAX_FIELDS = 64 # declared fields per source, and answer entries per record
+MAX_FIELD_NAME_BYTES = 64
+MAX_DESCRIPTION_BYTES = 2048
+MAX_MODEL_BYTES = 256
+MAX_EVIDENCE_BYTES = 4096
+MAX_TEXT_BYTES = 8192
+MAX_LIST_ITEMS = 64
+MAX_ITEM_BYTES = 1024
+MAX_DECIMAL_CHARACTERS = 128
+MAX_OBSERVATIONS = 64
+MAX_CITES = 64
+MAX_CAPABILITIES = 3
+MAX_WEB_ASSIGNMENTS = 2
+MAX_READ_SOURCES = 15
+
+# ---------------------------------------------------------------------------------------------
+# Reading a document (§1): strict, numbers kept as their literals
+
+INTEGER_LITERAL = re.compile(r"-?(?:0|[1-9][0-9]*)")
+LARGEST = 2**53 - 1
+
+
+@dataclass(frozen=True)
+class Num:
+ """A JSON number, read as its literal, its characters kept."""
+
+ literal: str
+
+ @property
+ def value(self) -> Decimal:
+ return Decimal(self.literal)
+
+ def is_integer(self) -> bool:
+ return (
+ INTEGER_LITERAL.fullmatch(self.literal) is not None
+ and abs(int(self.literal)) <= LARGEST
+ )
+
+
+# §12: a literal's exponent is the run of digits after its first `e` or `E`, past a sign there; a
+# literal with no such run has none.
+EXPONENT = re.compile(r"[^eE]*[eE][+-]?([0-9]+)")
+LITERAL_CHARACTERS = b"0123456789+-.eE"
+
+
+def _number_bounds(literal: str) -> None:
+ if len(literal) > MAX_NUMBER_CHARACTERS:
+ raise Refused("input-over-bound", "a number literal of more than 128 characters")
+ exponent = EXPONENT.match(literal)
+ if exponent and int(exponent.group(1)) > MAX_EXPONENT:
+ raise Refused("input-over-bound", "an exponent of magnitude over 308")
+
+
+def _number(literal: str) -> Num:
+ _number_bounds(literal)
+ return Num(literal)
+
+
+def measure(data: bytes, what: str, max_depth: int) -> None:
+ """§12: the bounds measured on a document's bytes before it is read (§11, the first phase):
+ its nesting, every object and every array one level from zero at the root, and each number
+ literal's characters and exponent, a literal being a maximal run of the characters 0-9, +, -, .,
+ e and E outside strings. It reads bytes, so it measures a document that is not JSON, or not
+ UTF-8, as well as one that is."""
+ depth = 0
+ in_string = escaped = False
+ position, length = 0, len(data)
+ while position < length:
+ byte = data[position]
+ if in_string:
+ if escaped:
+ escaped = False
+ elif byte == 0x5C:
+ escaped = True
+ elif byte == 0x22:
+ in_string = False
+ elif byte == 0x22:
+ in_string = True
+ elif byte in b"[{":
+ depth += 1
+ if depth > max_depth:
+ raise Refused("input-over-bound", f"{what} nests more than {max_depth} levels")
+ elif byte in b"]}":
+ depth -= 1
+ elif byte in LITERAL_CHARACTERS:
+ end = position
+ while end < length and data[end] in LITERAL_CHARACTERS:
+ end += 1
+ _number_bounds(data[position:end].decode("ascii"))
+ position = end
+ continue
+ position += 1
+
+
+def _no_constants(name: str) -> Any:
+ raise malformed(f"{name} is not JSON")
+
+
+def _pairs(pairs: list[tuple[str, Any]]) -> dict[str, Any]:
+ result: dict[str, Any] = {}
+ for name, value in pairs:
+ if name in result:
+ raise malformed("a member name given twice")
+ result[name] = value
+ return result
+
+
+def _well_formed(value: Any) -> None:
+ if isinstance(value, str):
+ try:
+ value.encode("utf-8")
+ except UnicodeEncodeError as error:
+ raise malformed("a string that is not well-formed Unicode") from error
+ elif isinstance(value, dict):
+ for name, member in value.items():
+ _well_formed(name)
+ _well_formed(member)
+ elif isinstance(value, list):
+ for item in value:
+ _well_formed(item)
+
+
+def value_depth(value: Any) -> int:
+ if isinstance(value, dict):
+ return 1 + max((value_depth(member) for member in value.values()), default=0)
+ if isinstance(value, list):
+ return 1 + max((value_depth(item) for item in value), default=0)
+ return 0
+
+
+def read_document(data: bytes, what: str, max_depth: int = MAX_DOCUMENT_DEPTH) -> Any:
+ """One JSON value, read strictly (§1), its bounds measured first."""
+ measure(data, what, max_depth)
+ try:
+ text = data.decode("utf-8")
+ except UnicodeDecodeError as error:
+ raise malformed(f"{what} is not UTF-8") from error
+ if text.startswith("\ufeff"):
+ raise malformed(f"{what} begins with a byte order mark")
+ try:
+ value = json.loads(
+ text,
+ object_pairs_hook=_pairs,
+ parse_int=_number,
+ parse_float=_number,
+ parse_constant=_no_constants,
+ )
+ except (Refused, Finding):
+ raise
+ except (ValueError, RecursionError) as error:
+ raise malformed(f"{what} is not one JSON value") from error
+ _well_formed(value)
+ return value
+
+
+# ---------------------------------------------------------------------------------------------
+# Values: forms, equality, pointers
+
+HEX = re.compile(r"[0-9a-f]*")
+DIGEST = re.compile(r"sha256:[0-9a-f]{64}")
+TIMESTAMP = re.compile(r"([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z")
+CLASSES = ("asserted", "record", "generated")
+TYPES = ("string", "integer", "timestamp")
+AVAILABILITY = ("present", "absent", "unknown")
+STATUSES = ("resolved", "absent", "unknown")
+BINDING_KIND = "judgment-pack-runner/preparation/1"
+# §2: the dialect versions this document defines; this reader reads each (§11, `version-unread`).
+DEFINED_VERSIONS = (2, 3)
+READ_VERSIONS = (2, 3)
+# §4.3: the kinds version 3 adds but `research`, each defined and not read here; and the members each
+# names beside §4's, `profile`, `profileDigest` and `maxAge`: those it requires, and those it may give.
+VERSION_3_KINDS = {
+ "http": ({"method", "path"}, {"query", "body", "headers"}),
+ "sql": ({"statement", "bindings"}, set()),
+ "web": ({"url"}, set()),
+}
+# §4.3: a `research` source's members beside §4's, and its binding members (§4.4), all three or none.
+RESEARCH_MEMBERS = {"maxAge", "question", "constraints", "model", "evidence", "fields", "capabilities"}
+RESEARCH_BINDING = ("profile", "profileDigest", "webProfiles")
+RESEARCH_TYPES = ("integer", "decimal", "boolean", "text", "text-list", "range")
+CAPABILITIES = ("answer", "search", "page")
+WEB_CAPABILITIES = ("search", "page")
+ANSWER_STATUSES = ("found", "not-found", "stale", "conflicting")
+# Core §2.2's decimal grammar, which a `decimal` answer matches whole (§4.3).
+DECIMAL = re.compile(r"-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?")
+ARRAY_INDEX = re.compile(r"0|[1-9][0-9]*")
+# §2: the members of version 2 alone, which a document of version 3 carries none of.
+VERSION_2_MEMBERS = ("provider", "facts", "evidence")
+# §4.4: an unbound `operation`'s catalog names, and the shapes that serve an operation (§4.1).
+UNBOUND_MEMBERS = ("platform", "operation", "shape", "record")
+OPERATION_SHAPES = ("airbyte", "mcp", "http")
+VERIFICATION = "verified acquisitions; session sealing and input truth are not established"
+
+
+def is_hex(value: Any, length: int) -> bool:
+ return isinstance(value, str) and len(value) == length and HEX.fullmatch(value) is not None
+
+
+def is_digest(value: Any) -> bool:
+ return isinstance(value, str) and DIGEST.fullmatch(value) is not None
+
+
+def is_integer(value: Any) -> bool:
+ return isinstance(value, Num) and value.is_integer()
+
+
+def integer_of(value: Num) -> int:
+ return int(value.literal)
+
+
+def _days_from_civil(year: int, month: int, day: int) -> int:
+ year -= month <= 2
+ era = (year if year >= 0 else year - 399) // 400
+ year_of_era = year - era * 400
+ day_of_year = (153 * (month + (-3 if month > 2 else 9)) + 2) // 5 + day - 1
+ day_of_era = year_of_era * 365 + year_of_era // 4 - year_of_era // 100 + day_of_year
+ return era * 146097 + day_of_era - 719468
+
+
+def instant(value: Any) -> int | None:
+ """§1: the seconds since 1970-01-01T00:00:00Z a timestamp names, or None."""
+ if not isinstance(value, str):
+ return None
+ match = TIMESTAMP.fullmatch(value)
+ if match is None:
+ return None
+ year, month, day, hour, minute, second = (int(part) for part in match.groups())
+ if not 1 <= month <= 12 or hour > 23 or minute > 59 or second > 59:
+ return None
+ leap = year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
+ days_in_month = [31, 29 if leap else 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1]
+ if not 1 <= day <= days_in_month:
+ return None
+ return _days_from_civil(year, month, day) * 86400 + hour * 3600 + minute * 60 + second
+
+
+def of_type(value: Any, kind: str) -> bool:
+ if kind == "string":
+ return isinstance(value, str)
+ if kind == "integer":
+ return is_integer(value)
+ return instant(value) is not None
+
+
+def json_equal(left: Any, right: Any) -> bool:
+ """JSON-equal (§6.3): type and value, numbers by their mathematical value."""
+ if isinstance(left, Num) or isinstance(right, Num):
+ return isinstance(left, Num) and isinstance(right, Num) and left.value == right.value
+ if isinstance(left, bool) or isinstance(right, bool):
+ return isinstance(left, bool) and isinstance(right, bool) and left == right
+ if left is None or right is None:
+ return left is None and right is None
+ if isinstance(left, str) or isinstance(right, str):
+ return isinstance(left, str) and isinstance(right, str) and left == right
+ if isinstance(left, list) and isinstance(right, list):
+ return len(left) == len(right) and all(json_equal(a, b) for a, b in zip(left, right))
+ if isinstance(left, dict) and isinstance(right, dict):
+ return left.keys() == right.keys() and all(json_equal(left[k], right[k]) for k in left)
+ return False
+
+
+ABSENT = object()
+
+
+def pointer_tokens(pointer: Any) -> list[str] | None:
+ """RFC 6901: the tokens of a pointer, or None when it is not one."""
+ if not isinstance(pointer, str):
+ return None
+ if pointer == "":
+ return []
+ if not pointer.startswith("/"):
+ return None
+ tokens = []
+ for raw in pointer[1:].split("/"):
+ if re.search(r"~(?![01])", raw):
+ return None
+ tokens.append(raw.replace("~1", "/").replace("~0", "~"))
+ return tokens
+
+
+def is_pointer(value: Any) -> bool:
+ return pointer_tokens(value) is not None
+
+
+def names_an_element(token: str, length: int) -> bool:
+ """§1: a token of decimal digits, with no leading zero but `0`, whose value is below the
+ array's length. The token is compared by its length first, so a token of any length is read
+ without converting it to a number: one longer than the length's own digits names no element."""
+ if re.fullmatch(r"0|[1-9][0-9]*", token) is None:
+ return False
+ bound = str(length)
+ if len(token) != len(bound):
+ return len(token) < len(bound)
+ return token < bound
+
+
+def resolve(document: Any, pointer: str) -> Any:
+ """The value a pointer resolves to, or ABSENT (§1)."""
+ tokens = pointer_tokens(pointer)
+ assert tokens is not None
+ current = document
+ for token in tokens:
+ if isinstance(current, dict):
+ if token not in current:
+ return ABSENT
+ current = current[token]
+ elif isinstance(current, list):
+ if not names_an_element(token, len(current)):
+ return ABSENT
+ current = current[int(token)]
+ else:
+ return ABSENT
+ return current
+
+
+def write_at(document: dict[str, Any], pointer: str, value: Any) -> None:
+ """§8.1: write a value at a fact target, creating each object on the way."""
+ tokens = pointer_tokens(pointer)
+ assert tokens
+ current = document
+ for token in tokens[:-1]:
+ nxt = current.get(token)
+ if not isinstance(nxt, dict):
+ nxt = {}
+ current[token] = nxt
+ current = nxt
+ current[tokens[-1]] = value
+
+
+def is_prefix(shorter: list[str], longer: list[str]) -> bool:
+ return len(shorter) <= len(longer) and longer[: len(shorter)] == shorter
+
+
+# ---------------------------------------------------------------------------------------------
+# The two canonical forms (§1, §9.5)
+
+
+class OutsideDomain(Exception):
+ """A value with no `canon` form."""
+
+
+def _canon_string(text: str) -> str:
+ out = ['"']
+ for character in text:
+ code = ord(character)
+ if character == '"':
+ out.append('\\"')
+ elif character == "\\":
+ out.append("\\\\")
+ elif character == "\b":
+ out.append("\\b")
+ elif character == "\f":
+ out.append("\\f")
+ elif character == "\n":
+ out.append("\\n")
+ elif character == "\r":
+ out.append("\\r")
+ elif character == "\t":
+ out.append("\\t")
+ elif code < 0x20:
+ out.append("\\u%04x" % code)
+ else:
+ out.append(character)
+ out.append('"')
+ return "".join(out)
+
+
+def _canon(value: Any) -> str:
+ if isinstance(value, dict):
+ names = sorted(value) # Python orders str by code point
+ return "{" + ",".join(_canon_string(n) + ":" + _canon(value[n]) for n in names) + "}"
+ if isinstance(value, list):
+ return "[" + ",".join(_canon(item) for item in value) + "]"
+ if isinstance(value, str):
+ return _canon_string(value)
+ if value is True:
+ return "true"
+ if value is False:
+ return "false"
+ if value is None:
+ return "null"
+ if isinstance(value, Num):
+ if not value.is_integer():
+ raise OutsideDomain(value.literal)
+ return str(int(value.literal))
+ if isinstance(value, int):
+ if abs(value) > LARGEST:
+ raise OutsideDomain(str(value))
+ return str(value)
+ raise OutsideDomain(repr(value))
+
+
+def canon(value: Any) -> bytes:
+ """The gateway canonical form (§1)."""
+ return _canon(value).encode("utf-8")
+
+
+def in_canon_domain(value: Any) -> bool:
+ try:
+ canon(value)
+ except OutsideDomain:
+ return False
+ return True
+
+
+def digest_of(data: bytes) -> str:
+ return "sha256:" + hashlib.sha256(data).hexdigest()
+
+
+_PREPARATION_ESCAPES = {
+ '"': '\\"',
+ "\\": "\\\\",
+ "\b": "\\b",
+ "\t": "\\t",
+ "\n": "\\n",
+ "\f": "\\f",
+ "\r": "\\r",
+ "&": "\\u0026",
+ "<": "\\u003c",
+ ">": "\\u003e",
+ "\u2028": "\\u2028",
+ "\u2029": "\\u2029",
+}
+
+
+def _preparation_string(text: str) -> str:
+ out = ['"']
+ for character in text:
+ escape = _PREPARATION_ESCAPES.get(character)
+ if escape is not None:
+ out.append(escape)
+ elif ord(character) < 0x20:
+ out.append("\\u%04x" % ord(character))
+ else:
+ out.append(character)
+ out.append('"')
+ return "".join(out)
+
+
+def write_number(value: Num | int) -> str:
+ """§9.5: the literal, its characters kept; every number of a preparation is an integer."""
+ if isinstance(value, Num):
+ if not value.is_integer():
+ raise OutsideDomain(value.literal)
+ return value.literal
+ return str(value)
+
+
+def _preparation_form(value: Any) -> str:
+ if isinstance(value, dict):
+ names = sorted(value, key=lambda name: name.encode("utf-8"))
+ return (
+ "{"
+ + ",".join(_preparation_string(n) + ":" + _preparation_form(value[n]) for n in names)
+ + "}"
+ )
+ if isinstance(value, list):
+ return "[" + ",".join(_preparation_form(item) for item in value) + "]"
+ if isinstance(value, str):
+ return _preparation_string(value)
+ if value is True:
+ return "true"
+ if value is False:
+ return "false"
+ if value is None:
+ return "null"
+ if isinstance(value, (Num, int)) and not isinstance(value, bool):
+ return write_number(value)
+ raise OutsideDomain(repr(value))
+
+
+def preparation_bytes(value: Any) -> bytes:
+ """The canonical form of a preparation (§9.5)."""
+ return _preparation_form(value).encode("utf-8")
+
+
+def binding_of(digest: str) -> bytes:
+ """§9.5: the binding, these bytes exactly."""
+ return ('{"kind":"' + BINDING_KIND + '","digest":"' + digest + '"}').encode("ascii")
+
+
+# ---------------------------------------------------------------------------------------------
+# Ed25519: the key rule and the equation (checkpoint witness statement §5)
+
+P = 2**255 - 19
+L = 2**252 + 27742317777372353535851937790883648493
+D = (-121665 * pow(121666, P - 2, P)) % P
+SQRT_MINUS_ONE = pow(2, (P - 1) // 4, P)
+SMALL_ORDER = {
+ bytes.fromhex(h)
+ for h in (
+ "0100000000000000000000000000000000000000000000000000000000000000",
+ "ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f",
+ "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000000000000000000000000000000000000000000000000080",
+ "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05",
+ "26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85",
+ "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a",
+ "c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa",
+ )
+}
+
+
+def _x_from_y(y: int, sign: int) -> int | None:
+ numerator = (y * y - 1) % P
+ denominator = (D * y * y + 1) % P
+ x2 = numerator * pow(denominator, P - 2, P) % P
+ if x2 == 0:
+ return 0
+ x = pow(x2, (P + 3) // 8, P)
+ if (x * x - x2) % P != 0:
+ x = x * SQRT_MINUS_ONE % P
+ if (x * x - x2) % P != 0:
+ return None
+ if x & 1 != sign:
+ x = P - x
+ return x
+
+
+def key_refusal(key: bytes) -> str | None:
+ """The key rule, in its order; None for a key a reader may trust."""
+ encoded = int.from_bytes(key, "little")
+ y = encoded & ((1 << 255) - 1)
+ sign = encoded >> 255
+ if y >= P or (y in (1, P - 1) and sign == 1):
+ return "key-not-canonical"
+ if key in SMALL_ORDER:
+ return "key-small-order"
+ if _x_from_y(y, sign) is None:
+ return "key-not-on-curve"
+ return None
+
+
+def _add(a: tuple[int, int, int, int], b: tuple[int, int, int, int]) -> tuple[int, int, int, int]:
+ x1, y1, z1, t1 = a
+ x2, y2, z2, t2 = b
+ pa = (y1 - x1) * (y2 - x2) % P
+ pb = (y1 + x1) * (y2 + x2) % P
+ pc = 2 * t1 * t2 * D % P
+ pd = 2 * z1 * z2 % P
+ e, f, g, h = pb - pa, pd - pc, pd + pc, pb + pa
+ return (e * f % P, g * h % P, f * g % P, e * h % P)
+
+
+def _multiply(scalar: int, point: tuple[int, int, int, int]) -> tuple[int, int, int, int]:
+ result = (0, 1, 1, 0)
+ while scalar:
+ if scalar & 1:
+ result = _add(result, point)
+ point = _add(point, point)
+ scalar >>= 1
+ return result
+
+
+def _encode(point: tuple[int, int, int, int]) -> bytes:
+ x, y, z, _ = point
+ inverse = pow(z, P - 2, P)
+ x, y = x * inverse % P, y * inverse % P
+ return (y | ((x & 1) << 255)).to_bytes(32, "little")
+
+
+_BASE_Y = 4 * pow(5, P - 2, P) % P
+_BASE_X = _x_from_y(_BASE_Y, 0)
+BASE = (_BASE_X, _BASE_Y, 1, _BASE_X * _BASE_Y % P)
+
+
+def signature_verifies(key: bytes, message: bytes, signature: bytes) -> bool:
+ """[S]B - [h]A encodes to R, S below L: RFC 8032 without the cofactor."""
+ if len(signature) != 64 or key_refusal(key) is not None:
+ return False
+ r_bytes, s = signature[:32], int.from_bytes(signature[32:], "little")
+ if s >= L:
+ return False
+ encoded = int.from_bytes(key, "little")
+ y = encoded & ((1 << 255) - 1)
+ x = _x_from_y(y, encoded >> 255)
+ assert x is not None
+ a = (x, y, 1, x * y % P)
+ h = int.from_bytes(hashlib.sha512(r_bytes + key + message).digest(), "little") % L
+ ha = _multiply(h, a)
+ negative = ((P - ha[0]) % P, ha[1], ha[2], (P - ha[3]) % P)
+ return _encode(_add(_multiply(s, BASE), negative)) == r_bytes
+
+
+# ---------------------------------------------------------------------------------------------
+# The dialect document (§§2-8)
+
+
+def closed(value: Any, required: set[str], optional: set[str], what: str) -> dict[str, Any]:
+ if not isinstance(value, dict):
+ raise malformed(f"{what} is not an object")
+ missing = required - set(value)
+ unknown = set(value) - required - optional
+ if missing or unknown:
+ raise malformed(f"{what}: members missing {sorted(missing)} or unknown {sorted(unknown)}")
+ return value
+
+
+@dataclass
+class Parameter:
+ name: str
+ type: str
+ pointer: str
+ origin: str # "case", or the name of the source it is taken from
+
+
+@dataclass
+class Read:
+ unwrap: list[str]
+ copy: dict[str, Any] | None
+ rule: dict[str, Any] | None
+ as_written: dict[str, Any]
+ fact_targets: list[str] = field(default_factory=list)
+ evidence_targets: list[str] = field(default_factory=list)
+ # target -> the pointers of the value read the dialect could copy to it (§9.3)
+ candidates: dict[tuple[str, str], list[str]] = field(default_factory=dict)
+ # a reconciliation read's earlier research sources, in their order (§6.4); None for any other read
+ sources: list[str] | None = None
+
+
+@dataclass
+class Research:
+ """A `research` source's recipe (§4.3) and, bound, its web assignments (§4.4)."""
+
+ question: Any
+ fields: list[dict[str, Any]]
+ types: dict[str, str] # each declared field's type, by its name
+ capabilities: list[str]
+ model: str
+ request: dict[str, Any] # the source's request but its `question`, which is instantiated
+ web: dict[str, tuple[str, str]] = field(default_factory=dict) # capability -> (profile, digest)
+
+
+@dataclass
+class Source:
+ name: str
+ kind: str
+ parameters: dict[str, Parameter]
+ read: Read
+ profile_id: str = ""
+ profile_digest: str = ""
+ max_age: int = 0
+ template: Any = None # `arguments`, the request's template, whole
+ scope: dict[str, str] = field(default_factory=dict) # each parameter of its scope, by its type
+ calculation: dict[str, Any] | None = None
+ research: Research | None = None
+
+
+@dataclass
+class Dialect:
+ document: dict[str, Any]
+ case_parameters: dict[str, Parameter]
+ case_read: Read
+ sources: list[Source]
+ admits: dict[tuple[str, str], list[str]]
+ version: int = 2
+ # the kinds of its sources this reader does not read, in their order (§11, `kind-unread`)
+ unread: list[str] = field(default_factory=list)
+ # each unbound source (§4.4) by its name: the `shape` and `record` it names
+ unbound: dict[str, tuple[str, str]] = field(default_factory=dict)
+ # each unbound `research` source by its name: the web capabilities it requests (§4.4)
+ unbound_research: dict[str, tuple[str, ...]] = field(default_factory=dict)
+ # of a bound dialect, each source bound by the binding document: the unbound source's `shape` and
+ # `record`, which the profile it is bound to must serve (§4.4, §5.1)
+ bound_from: dict[str, tuple[str, str]] = field(default_factory=dict)
+
+
+def check_template(value: Any, scope: dict[str, str], what: str) -> None:
+ """§4.1: every template form is $param or $text, naming parameters in scope, never runAt."""
+ if isinstance(value, dict):
+ if any(name.startswith("$") for name in value):
+ if len(value) != 1:
+ raise malformed(f"{what}: a template form of more than one member")
+ (form, argument), = value.items()
+ if form == "$param":
+ if not isinstance(argument, str) or argument == "runAt" or argument not in scope:
+ raise malformed(f"{what}: $param names no parameter in scope")
+ elif form == "$text":
+ if not isinstance(argument, str):
+ raise malformed(f"{what}: $text is not a string")
+ for name in placeholders(argument, what):
+ if name == "runAt" or scope.get(name) != "integer":
+ raise malformed(f"{what}: a placeholder names no integer parameter")
+ else:
+ raise malformed(f"{what}: an unknown template form {form}")
+ return
+ for name, member in value.items():
+ check_template(member, scope, what)
+ elif isinstance(value, list):
+ for item in value:
+ check_template(item, scope, what)
+
+
+def is_string_template(value: Any, scope: dict[str, str]) -> bool:
+ """§4.1: a string, a $text, or a $param naming a parameter of type string or timestamp."""
+ if isinstance(value, str):
+ return True
+ if isinstance(value, dict) and len(value) == 1:
+ (form, argument), = value.items()
+ if form == "$text":
+ return True
+ if form == "$param":
+ return scope.get(argument) in ("string", "timestamp")
+ return False
+
+
+def check_request(value: Any, scope: dict[str, str], what: str) -> None:
+ """§4.1: `arguments`, the template of a request: an object, not a template form, held to the rules
+ of a template. What more it must be depends on the profile's shape and adapter, a finding
+ (`request_misfit`)."""
+ if not isinstance(value, dict) or any(name.startswith("$") for name in value):
+ raise malformed(f"{what}: arguments are not an object, or are a template form")
+ check_template(value, scope, what)
+
+
+def request_misfit(source: Source, profile: dict[str, Any]) -> str | None:
+ """§4.1: why a source's request does not fit its profile, `profile-mismatch`; None when it fits. A
+ tool call for `mcp`; for `http` and `airbyte`, any object, but that under `adapter-http` a `query`
+ is an object of string templates. A profile of shape `command` serves no operation."""
+ request = source.template
+ if profile["shape"] == "command":
+ return "a profile of shape command serves no operation"
+ if profile["shape"] == "mcp":
+ tool = request.get("tool")
+ if set(request) != {"tool", "arguments"} or not isinstance(tool, str) or not tool:
+ return "a request that is not a tool call, under a profile of shape mcp"
+ if tool not in profile.get("tools", []):
+ return "a tool the profile does not allow"
+ elif profile["adapter"]["name"] == "adapter-http" and "query" in request:
+ query = request["query"]
+ if (
+ not isinstance(query, dict)
+ or any(name.startswith("$") for name in query)
+ or not all(is_string_template(member, source.scope) for member in query.values())
+ ):
+ return "a query that is not an object of string templates, under adapter-http"
+ return None
+
+
+def placeholders(text: str, what: str = "a $text") -> list[str]:
+ """§4.1: `{{`, a parameter name, and the next `}}`."""
+ names = []
+ position = 0
+ while True:
+ start = text.find("{{", position)
+ if start < 0:
+ return names
+ end = text.find("}}", start + 2)
+ if end < 0:
+ raise malformed(f"{what}: a {{{{ with no }}}} after it")
+ names.append(text[start + 2 : end])
+ position = end + 2
+
+
+def check_condition(condition: Any, declared: dict[str, str], what: str, depth: int = 0) -> None:
+ if not isinstance(condition, dict) or not isinstance(condition.get("op"), str):
+ raise malformed(f"{what}: a condition is not an object with an op that is a string")
+ op = condition["op"]
+ shapes = {
+ "always": set(),
+ "exists": {"field"},
+ "equals": {"field", "to"},
+ "equalsParam": {"field", "param"},
+ "isTrue": {"field"},
+ "isDecimalString": {"field"},
+ "freshWithin": {"field", "asOf", "maxAge"},
+ "all": {"of"},
+ "any": {"of"},
+ "not": {"of"},
+ }
+ if op not in shapes:
+ raise malformed(f"{what}: an unknown op")
+ closed(condition, {"op"} | shapes[op], set(), what)
+ if "field" in condition and not is_pointer(condition["field"]):
+ raise malformed(f"{what}: a field that is not a pointer")
+ if op == "equals" and not in_canon_domain(condition["to"]):
+ raise malformed(f"{what}: a literal outside the canon domain")
+ for member in ("param", "asOf", "maxAge"):
+ if member in condition and not isinstance(condition[member], str):
+ raise malformed(f"{what}: {member} is not a string naming a parameter")
+ if op == "equalsParam" and condition["param"] not in declared:
+ raise malformed(f"{what}: equalsParam names a parameter the rule does not declare")
+ if op == "freshWithin":
+ # §6.3: `asOf` and `maxAge` name parameters the rule declares, which is the condition's
+ # form; that the one is a `timestamp` and the other an `integer` is part of its truth, so a
+ # declared parameter of another type makes it false, not the dialect malformed.
+ for member in ("asOf", "maxAge"):
+ if condition[member] not in declared:
+ raise malformed(f"{what}: {member} names a parameter the rule does not declare")
+ if op in ("all", "any"):
+ if not isinstance(condition["of"], list) or len(condition["of"]) > MAX_LISTED:
+ if isinstance(condition["of"], list):
+ raise Refused("input-over-bound", f"{what}: more than 64 conditions listed")
+ raise malformed(f"{what}: `of` is not a list")
+ for item in condition["of"]:
+ check_condition(item, declared, what, depth + 1)
+ if op == "not":
+ check_condition(condition["of"], declared, what, depth + 1)
+
+
+def fact_target(pointer: Any, what: str) -> str:
+ if not is_pointer(pointer) or pointer == "":
+ raise malformed(f"{what}: a fact target that is not a pointer other than the root")
+ return pointer
+
+
+def check_read(value: Any, scope: dict[str, str], what: str) -> Read:
+ read = closed(value, set(), {"unwrap", "copy", "rule"}, what)
+ if ("copy" in read) == ("rule" in read):
+ raise malformed(f"{what}: a read has exactly one of copy and rule")
+ unwrap = read.get("unwrap", [])
+ if "unwrap" in read:
+ if not isinstance(unwrap, list) or not unwrap:
+ raise malformed(f"{what}: unwrap is not a list of one to four pointers")
+ if len(unwrap) > MAX_UNWRAP:
+ raise Refused("input-over-bound", f"{what}: more than four unwrap pointers")
+ if not all(is_pointer(p) for p in unwrap):
+ raise malformed(f"{what}: an unwrap entry that is not a pointer")
+ result = Read(unwrap=list(unwrap), copy=None, rule=None, as_written=read)
+ if "copy" in read:
+ # §6.2: both arrays are required, as the Runner requires them, and either may be empty.
+ copy = closed(read["copy"], {"facts", "evidence"}, set(), what + " copy")
+ facts = copy["facts"]
+ evidence = copy["evidence"]
+ if not isinstance(facts, list) or not isinstance(evidence, list):
+ raise malformed(f"{what}: copy facts and evidence are arrays")
+ for entry in facts:
+ closed(entry, {"target", "source"}, set(), what + " copy fact")
+ target = fact_target(entry["target"], what)
+ if not is_pointer(entry["source"]):
+ raise malformed(f"{what}: a copy source that is not a pointer")
+ result.fact_targets.append(target)
+ result.candidates.setdefault(("fact", target), []).append(entry["source"])
+ seen_requirements: set[str] = set()
+ for entry in evidence:
+ closed(entry, {"requirement", "source"}, set(), what + " copy evidence")
+ requirement = entry["requirement"]
+ if not isinstance(requirement, str) or not requirement:
+ raise malformed(f"{what}: a requirement that is not a non-empty string")
+ if requirement in seen_requirements:
+ raise malformed(f"{what}: a copy names a requirement twice")
+ seen_requirements.add(requirement)
+ if not is_pointer(entry["source"]):
+ raise malformed(f"{what}: a copy source that is not a pointer")
+ result.evidence_targets.append(requirement)
+ result.candidates.setdefault(("evidence", requirement), []).append(entry["source"])
+ result.copy = {"facts": facts, "evidence": evidence}
+ else:
+ rule = closed(read["rule"], {"ruleVersion", "parameters", "clauses"}, set(), what + " rule")
+ if rule["ruleVersion"] != "1":
+ raise malformed(f"{what}: ruleVersion is not \"1\"")
+ declared = rule["parameters"]
+ if not isinstance(declared, dict):
+ raise malformed(f"{what}: rule parameters are not an object")
+ for name, kind in declared.items():
+ if kind not in TYPES:
+ raise malformed(f"{what}: a rule parameter of another type")
+ if scope.get(name) != kind:
+ raise malformed(f"{what}: a rule parameter not in scope with its type")
+ clauses = rule["clauses"]
+ if not isinstance(clauses, list) or not clauses:
+ raise malformed(f"{what}: clauses are not a non-empty array")
+ if len(clauses) > MAX_CLAUSES:
+ raise Refused("input-over-bound", f"{what}: more than 64 clauses")
+ fact_seen: list[str] = []
+ evidence_seen: list[str] = []
+ for clause in clauses:
+ closed(clause, {"when", "claim", "reason"}, set(), what + " clause")
+ check_condition(clause["when"], declared, what)
+ if not isinstance(clause["reason"], str):
+ raise malformed(f"{what}: a reason that is not a string")
+ claim = closed(
+ clause["claim"], {"facts", "evidence", "acquisitionStatus"}, set(), what + " claim"
+ )
+ if not isinstance(claim["facts"], list):
+ raise malformed(f"{what}: claim facts are not an array")
+ for entry in claim["facts"]:
+ closed(entry, {"pointer", "from"}, set(), what + " claim fact")
+ target = fact_target(entry["pointer"], what)
+ if not is_pointer(entry["from"]):
+ raise malformed(f"{what}: a from that is not a pointer")
+ if target not in fact_seen:
+ fact_seen.append(target)
+ candidates = result.candidates.setdefault(("fact", target), [])
+ candidates.append(entry["from"])
+ if not isinstance(claim["evidence"], dict):
+ raise malformed(f"{what}: claim evidence is not an object")
+ for requirement, availability in claim["evidence"].items():
+ if not requirement or availability not in AVAILABILITY:
+ raise malformed(f"{what}: claim evidence of another form")
+ if requirement not in evidence_seen:
+ evidence_seen.append(requirement)
+ if claim["acquisitionStatus"] not in STATUSES:
+ raise malformed(f"{what}: an acquisitionStatus of another value")
+ if clauses[-1]["when"] != {"op": "always"}:
+ raise malformed(f"{what}: the last clause's when is not always")
+ result.fact_targets = fact_seen
+ result.evidence_targets = evidence_seen
+ result.rule = rule
+ if not in_canon_domain(read):
+ raise malformed(f"{what}: a read outside the canon domain")
+ return result
+
+
+def not_written_empty(value: Any, members: tuple[str, ...], what: str) -> None:
+ """§2, version 3 written one way, by the Runner's encoding rule: of the members its encoding leaves
+ out when empty, one written as the empty array or the empty object is refused. They are `sources`,
+ `unmapped` and `unmappedEvidence`, the case's and a source's `parameters`, and the `facts` and
+ `evidence` of `admits`; every other member written empty is read."""
+ if isinstance(value, dict):
+ for member in members:
+ if member in value and isinstance(value[member], (list, dict)) and not value[member]:
+ raise malformed(f"{what}: {member} is written empty, which version 3 leaves out")
+
+
+def check_parameter_name(name: Any, what: str) -> None:
+ if not isinstance(name, str) or not name or name == "runAt":
+ raise malformed(f"{what}: a parameter name that is empty or runAt")
+
+
+def parse_dialect(document: Any) -> Dialect:
+ named = isinstance(document, dict) and "formatVersion" in document
+ required = {"formatVersion", "id", "version", "case"} if named else {"version", "case"}
+ top = closed(document, required,
+ {"sources", "admits", "unmapped", "unmappedEvidence", "provider", "facts", "evidence"},
+ "the dialect")
+ if named:
+ if top["formatVersion"] not in ("2.0.0", "3.0.0"):
+ raise malformed("an unknown dialect formatVersion")
+ identity = top["id"]
+ if not isinstance(identity, str) or not identity or len(identity.encode("utf-8")) > 1024 or any(ord(c) <= 32 or ord(c) == 127 for c in identity):
+ raise malformed("the dialect id is not a bounded opaque identifier")
+ if not isinstance(top["version"], str) or re.fullmatch(r"(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)", top["version"]) is None:
+ raise malformed("the dialect artifact version is not a three-component version")
+ version = 2 if top["formatVersion"] == "2.0.0" else 3
+ else:
+ if not (isinstance(top["version"], Num) and top["version"].is_integer()):
+ raise malformed("the dialect's version is not an integer")
+ version = integer_of(top["version"])
+ if version not in DEFINED_VERSIONS:
+ raise malformed("a dialect version this document does not define")
+ if version == 3 or named:
+ # §2: version 3 is written one way.
+ for name in VERSION_2_MEMBERS:
+ if name in top:
+ raise malformed(f"{name} is a member of version 2 alone")
+ not_written_empty(top, ("sources", "unmapped", "unmappedEvidence"), "the dialect")
+ not_written_empty(top["case"], ("parameters",), "the case")
+ if "provider" in top and top["provider"] != "":
+ raise malformed("provider is not the empty string")
+ for name in ("facts", "evidence"):
+ if name in top and top[name] is not None:
+ raise malformed(f"{name} is not null")
+ if not in_canon_domain(top):
+ raise malformed("the dialect is outside the canon domain")
+ for name, check in (("unmapped", is_pointer), ("unmappedEvidence", lambda v: isinstance(v, str) and v)):
+ if name in top:
+ items = top[name]
+ if not isinstance(items, list) or not all(check(i) for i in items):
+ raise malformed(f"{name} is not an array of its form")
+ if len(set(items)) != len(items):
+ raise malformed(f"{name} names one twice")
+
+ case = closed(top["case"], {"facts", "evidence"}, {"parameters"}, "case")
+ case_parameters: dict[str, Parameter] = {}
+ declared = case.get("parameters", {})
+ if not isinstance(declared, dict):
+ raise malformed("case parameters are not an object")
+ for name, declaration in declared.items():
+ check_parameter_name(name, "case")
+ closed(declaration, {"pointer", "type"}, set(), f"case parameter {name}")
+ if not is_pointer(declaration["pointer"]) or declaration["type"] not in TYPES:
+ raise malformed(f"case parameter {name} is not of its form")
+ case_parameters[name] = Parameter(name, declaration["type"], declaration["pointer"], "case")
+ if len(case_parameters) + 1 > MAX_SCOPE:
+ raise Refused("input-over-bound", "more than 64 parameters in the case's scope")
+ case_scope = {name: p.type for name, p in case_parameters.items()}
+ case_scope["runAt"] = "timestamp"
+ case_read = check_read(
+ {"copy": {"facts": case["facts"], "evidence": case["evidence"]}}, case_scope, "the case's read"
+ )
+
+ sources: list[Source] = []
+ raw_sources = top.get("sources", [])
+ if not isinstance(raw_sources, list):
+ raise malformed("sources is not an array")
+ if len(raw_sources) > MAX_SOURCES:
+ raise Refused("input-over-bound", "more than 16 sources")
+ unread: list[str] = []
+ unbound: dict[str, tuple[str, str]] = {}
+ unbound_research: dict[str, tuple[str, ...]] = {}
+ for index, raw in enumerate(raw_sources):
+ what = f"source {index}"
+ if not isinstance(raw, dict) or not isinstance(raw.get("name"), str):
+ raise malformed(f"{what} has no name")
+ name = raw["name"]
+ if not name or name == "case" or any(s.name == name for s in sources):
+ raise malformed(f"{what}: a name that is empty, case, or given twice")
+ kind = raw.get("kind")
+ if not isinstance(kind, str):
+ raise malformed(f"{what}: a kind that is not a string")
+ if (kind in VERSION_3_KINDS or kind == "research") and version == 2:
+ raise malformed(f"{what}: a kind of version 3 in a version-2 document")
+ # Every kind's form is checked, its common members (§4) and its own, before a kind this
+ # reader does not read is refused (§11): `kind-unread` comes after every form.
+ catalog: tuple[str, str] | None = None
+ if kind == "operation" and version == 3 and any(member in raw for member in UNBOUND_MEMBERS):
+ # §4.4: the unbound form, of version 3 alone. A version-2 source that names one of its
+ # members is refused below, as one that names a member its kind does not list (§4).
+ closed(
+ raw,
+ {"name", "kind", "read", "platform", "operation", "shape", "record", "maxAge", "arguments"},
+ {"parameters", "calculation"},
+ what,
+ )
+ for member in ("platform", "operation", "record"):
+ if not isinstance(raw[member], str) or not raw[member]:
+ raise malformed(f"{what}: {member} is not a non-empty string")
+ if raw["shape"] not in OPERATION_SHAPES:
+ raise malformed(f"{what}: a shape other than airbyte, mcp and http")
+ catalog = (raw["shape"], raw["record"])
+ acquired = True
+ elif kind == "operation":
+ closed(
+ raw,
+ {"name", "kind", "read", "profile", "profileDigest", "maxAge", "arguments"},
+ {"parameters", "calculation"},
+ what,
+ )
+ acquired = True
+ elif kind == "selected-file":
+ closed(
+ raw,
+ {"name", "kind", "read", "provider"},
+ {"parameters", "profile", "profileDigest", "maxAge", "arguments"},
+ what,
+ )
+ drive = {"profile", "profileDigest", "maxAge", "arguments"}
+ if raw["provider"] == "local-file":
+ if drive & set(raw):
+ raise malformed(f"{what}: a local file has no profile, maxAge or request")
+ acquired = False
+ elif raw["provider"] == "google-drive":
+ if not drive <= set(raw):
+ raise malformed(f"{what}: a Drive file has a profile, maxAge and a request")
+ acquired = True
+ else:
+ raise malformed(f"{what}: a provider of another value")
+ unread.append(kind)
+ elif kind in VERSION_3_KINDS:
+ required, optional = VERSION_3_KINDS[kind]
+ closed(
+ raw,
+ {"name", "kind", "read", "profile", "profileDigest", "maxAge"} | required,
+ {"parameters"} | optional,
+ what,
+ )
+ acquired = True
+ unread.append(kind)
+ elif kind == "research":
+ # §4.3, §4.4: published unbound, with none of the three binding members, or bound, with all
+ # three; a source with only some of them, or an operation's catalog member, is malformed.
+ closed(raw, {"name", "kind", "read"} | RESEARCH_MEMBERS, {"parameters", *RESEARCH_BINDING}, what)
+ given = [member for member in RESEARCH_BINDING if member in raw]
+ if given and len(given) != len(RESEARCH_BINDING):
+ raise malformed(f"{what}: some but not all of profile, profileDigest and webProfiles")
+ acquired = True
+ else:
+ raise malformed(f"{what}: a kind this version does not list")
+ parameters: dict[str, Parameter] = {}
+ declared = raw.get("parameters", {})
+ if not isinstance(declared, dict):
+ raise malformed(f"{what}: parameters are not an object")
+ if version == 3 or named:
+ not_written_empty(raw, ("parameters",), what)
+ for pname, declaration in declared.items():
+ check_parameter_name(pname, what)
+ if pname in case_parameters:
+ raise malformed(f"{what}: a source parameter shadows a case parameter")
+ closed(declaration, {"from", "pointer", "type"}, set(), f"{what} parameter {pname}")
+ origin = declaration["from"]
+ if not any(s.name == origin for s in sources):
+ raise malformed(f"{what}: a source parameter from no earlier source")
+ if not is_pointer(declaration["pointer"]) or declaration["type"] not in TYPES:
+ raise malformed(f"{what}: a source parameter not of its form")
+ parameters[pname] = Parameter(pname, declaration["type"], declaration["pointer"], origin)
+ scope = dict(case_scope)
+ scope.update({pname: p.type for pname, p in parameters.items()})
+ if len(scope) > MAX_SCOPE:
+ raise Refused("input-over-bound", f"{what}: more than 64 parameters in scope")
+ source = Source(name=name, kind=kind, parameters=parameters, read=Read([], None, None, {}))
+ if acquired:
+ # Every acquired source names its profile but an unbound one, which the binding document
+ # binds to one (§4.4).
+ if catalog is None and "profile" in raw:
+ if not isinstance(raw["profile"], str) or not raw["profile"]:
+ raise malformed(f"{what}: profile is not a non-empty string")
+ if not is_digest(raw["profileDigest"]):
+ raise malformed(f"{what}: profileDigest is not a digest")
+ source.profile_id = raw["profile"]
+ source.profile_digest = raw["profileDigest"]
+ if not is_integer(raw["maxAge"]) or not 1 <= integer_of(raw["maxAge"]) <= 86400:
+ raise malformed(f"{what}: maxAge is not an integer from 1 to 86400")
+ source.max_age = integer_of(raw["maxAge"])
+ source.scope = scope
+ if kind == "research":
+ source.research = check_research(raw, scope, what)
+ elif kind in VERSION_3_KINDS:
+ check_version_3_kind(raw, kind, scope, what)
+ else:
+ check_request(raw["arguments"], scope, f"{what} arguments")
+ source.template = raw["arguments"]
+ if catalog is not None:
+ unbound[name] = catalog
+ if source.research is not None and "profile" not in raw:
+ unbound_research[name] = tuple(c for c in source.research.capabilities if c in WEB_CAPABILITIES)
+ if "calculation" in raw:
+ calculation = closed(raw["calculation"], {"inputs", "tables"}, set(), f"{what} calculation")
+ inputs, tables = calculation["inputs"], calculation["tables"]
+ if not isinstance(inputs, dict) or not isinstance(tables, dict):
+ raise malformed(f"{what}: calculation inputs and tables are objects")
+ for bound in inputs.values():
+ if not isinstance(bound, str) or bound == "runAt" or bound not in scope:
+ raise malformed(f"{what}: an input bound to no parameter in scope, or runAt")
+ for limit in tables.values():
+ if not is_integer(limit) or not 1 <= integer_of(limit) <= 315360000:
+ raise malformed(f"{what}: a table limit of another form")
+ source.calculation = calculation
+ if source.research is not None:
+ source.read = check_research_read(raw["read"], scope, what + " read", source, sources)
+ else:
+ source.read = check_read(raw["read"], scope, what + " read")
+ sources.append(source)
+ # A source parameter's pointer is a fact target of the source it comes from (§3).
+ for source in sources:
+ for parameter in source.parameters.values():
+ origin = next(s for s in sources if s.name == parameter.origin)
+ if parameter.pointer not in origin.read.fact_targets:
+ raise malformed(f"{source.name}: a source parameter reads no fact target of {origin.name}")
+
+ # §8.1: targets never overlap; a requirement has one source; bounds.
+ every_fact: list[list[str]] = []
+ evidence_sources: dict[str, str] = {}
+ for owner, read in [("case", case_read)] + [(s.name, s.read) for s in sources]:
+ for target in read.fact_targets:
+ tokens = pointer_tokens(target)
+ assert tokens is not None
+ for other in every_fact:
+ if is_prefix(other, tokens) or is_prefix(tokens, other):
+ raise malformed("two fact targets overlap")
+ every_fact.append(tokens)
+ for requirement in read.evidence_targets:
+ if requirement in evidence_sources:
+ raise malformed("a requirement is the evidence target of two sources")
+ evidence_sources[requirement] = owner
+ if len(every_fact) > MAX_FACT_TARGETS or len(evidence_sources) > MAX_EVIDENCE_TARGETS:
+ raise Refused("input-over-bound", "more fact or evidence targets than the bounds")
+
+ admits: dict[tuple[str, str], list[str]] = {}
+ if "admits" in top:
+ raw_admits = closed(top["admits"], set(), {"facts", "evidence"}, "admits")
+ if version == 3 or named:
+ not_written_empty(raw_admits, ("facts", "evidence"), "admits")
+ written_facts = {t for r in [case_read] + [s.read for s in sources] for t in r.fact_targets}
+ for member, kind, written in (("facts", "fact", written_facts), ("evidence", "evidence", set(evidence_sources))):
+ entries = raw_admits.get(member, {})
+ if not isinstance(entries, dict):
+ raise malformed(f"admits.{member} is not an object")
+ for target, classes in entries.items():
+ if target not in written:
+ raise malformed(f"admits names a target no source writes")
+ if not isinstance(classes, list) or not all(c in CLASSES for c in classes):
+ raise malformed("admits gives a list of another form")
+ admits[(kind, target)] = list(classes)
+
+ # A kind this reader does not read is refused by the caller once every form is checked, the binding
+ # document's among them (§11, the fifth and sixth phases).
+ return Dialect(top, case_parameters, case_read, sources, admits, version, unread, unbound, unbound_research=unbound_research)
+
+
+def check_version_3_kind(raw: dict[str, Any], kind: str, scope: dict[str, str], what: str) -> None:
+ """§4.3: the members `http`, `sql` and `web` name, held to the forms the text gives them. A source of
+ such a kind is held to its form, as every source is, and then not read (`kind-unread`). Where the
+ text names a member without a form — `http`'s `path` "a template that yields a path" and its
+ `headers` "the names of the headers", and a `sql` binding's `name` and `type` — this reader takes
+ the form a name or a path has: a string template for a path, and non-empty strings for names. (No
+ vector decides this.) A `research` source is read (`check_research`)."""
+
+ def string_template(value: Any, member: str) -> None:
+ check_template(value, scope, f"{what} {member}")
+ if not is_string_template(value, scope):
+ raise malformed(f"{what}: {member} is not a string template")
+
+ def names(value: Any, member: str) -> None:
+ if not isinstance(value, list) or not all(isinstance(item, str) and item for item in value):
+ raise malformed(f"{what}: {member} is not an array of non-empty strings")
+
+ if kind == "http":
+ if raw["method"] not in ("GET", "POST"):
+ raise malformed(f"{what}: a method other than GET and POST")
+ string_template(raw["path"], "path")
+ if "query" in raw:
+ query = raw["query"]
+ if not isinstance(query, dict) or any(name.startswith("$") for name in query):
+ raise malformed(f"{what}: query is not an object of string templates")
+ for name, member in query.items():
+ string_template(member, f"query {name}")
+ if "body" in raw:
+ if raw["method"] == "GET":
+ raise malformed(f"{what}: a body beside GET")
+ check_template(raw["body"], scope, f"{what} body")
+ if "headers" in raw:
+ names(raw["headers"], "headers")
+ elif kind == "sql":
+ if not isinstance(raw["statement"], str):
+ raise malformed(f"{what}: statement is not a string, and is never a template")
+ if not isinstance(raw["bindings"], list):
+ raise malformed(f"{what}: bindings is not an array")
+ for binding in raw["bindings"]:
+ closed(binding, {"name", "type", "value"}, set(), f"{what} binding")
+ names([binding["name"], binding["type"]], "a binding's name and type")
+ value = binding["value"]
+ if not isinstance(value, dict) or set(value) != {"$param"}:
+ raise malformed(f"{what}: a binding's value is not a $param form")
+ check_template(value, scope, f"{what} binding")
+ elif kind == "web":
+ url = raw["url"]
+ if not isinstance(url, str):
+ if not isinstance(url, dict) or set(url) != {"$param"}:
+ raise malformed(f"{what}: url is not a string or a $param form")
+ check_template(url, scope, f"{what} url")
+ if scope.get(url["$param"]) != "string":
+ raise malformed(f"{what}: url names a parameter that is not a string")
+
+
+# ---------------------------------------------------------------------------------------------
+# The research recipe (§4.3), its bound form (§4.4), and its reads (§4.3, §6.4)
+
+
+def utf8_length(text: str) -> int:
+ return len(text.encode("utf-8"))
+
+
+def check_capabilities(value: Any, what: str) -> list[str]:
+ """§4.3, §5.1: an array of distinct names from `answer`, `search` and `page`, in that order, of one
+ entry at least. More than three is over a maximum (§12), counted before any form."""
+ if not isinstance(value, list) or not value:
+ raise malformed(f"{what}: capabilities are not an array of one name at least")
+ if not all(isinstance(name, str) and name in CAPABILITIES for name in value):
+ raise malformed(f"{what}: a capability other than answer, search and page")
+ order = [CAPABILITIES.index(name) for name in value]
+ if any(earlier >= later for earlier, later in zip(order, order[1:])):
+ raise malformed(f"{what}: capabilities not distinct, or not in the order answer, search, page")
+ return list(value)
+
+
+def check_model(value: Any, what: str) -> str:
+ """§4.3: a non-empty string; more than 256 UTF-8 bytes is over a maximum (§12)."""
+ if not isinstance(value, str) or not value:
+ raise malformed(f"{what}: model is not a non-empty string")
+ return value
+
+
+def check_assignment(value: Any, what: str) -> tuple[str, str]:
+ """§4.4: exactly `profile`, a non-empty string, and `profileDigest`, a digest."""
+ entry = closed(value, {"profile", "profileDigest"}, set(), what)
+ if not isinstance(entry["profile"], str) or not entry["profile"]:
+ raise malformed(f"{what}: profile is not a non-empty string")
+ if not is_digest(entry["profileDigest"]):
+ raise malformed(f"{what}: profileDigest is not a digest")
+ return entry["profile"], entry["profileDigest"]
+
+
+def check_web_profiles(value: Any, capabilities: list[str], what: str) -> dict[str, tuple[str, str]]:
+ """§4.4: `webProfiles`, a closed object with exactly the `search` and `page` capabilities the source
+ requests as keys, each value an assignment; written even when empty."""
+ if not isinstance(value, dict):
+ raise malformed(f"{what}: webProfiles is not an object")
+ requested = {name for name in capabilities if name in WEB_CAPABILITIES}
+ if set(value) != requested:
+ raise malformed(f"{what}: webProfiles does not assign exactly the web capabilities requested")
+ return {name: check_assignment(value[name], f"{what} webProfiles {name}") for name in WEB_CAPABILITIES if name in value}
+
+
+def check_research(raw: dict[str, Any], scope: dict[str, str], what: str) -> Research:
+ """§4.3: a research recipe's members, each of its form. The maxima of §12 are counted before any form
+ (`count_bounds`); what is checked here is each member's form and minimum."""
+ question = raw["question"]
+ check_template(question, scope, f"{what} question")
+ if not is_string_template(question, scope):
+ raise malformed(f"{what}: question is not a string template")
+ if not isinstance(raw["constraints"], dict):
+ raise malformed(f"{what}: constraints is not an object")
+ model = check_model(raw["model"], what)
+ evidence = raw["evidence"]
+ if not isinstance(evidence, list) or not all(isinstance(item, str) and item for item in evidence):
+ raise malformed(f"{what}: evidence is not an array of non-empty strings")
+ fields = raw["fields"]
+ if not isinstance(fields, list) or not fields:
+ raise malformed(f"{what}: fields is not an array of one declaration at least")
+ types: dict[str, str] = {}
+ for index, declaration in enumerate(fields):
+ where = f"{what} field {index}"
+ closed(declaration, {"name", "type", "required", "description"}, set(), where)
+ name = declaration["name"]
+ if not isinstance(name, str) or not name or name == "case":
+ raise malformed(f"{where}: a name that is not a non-empty string other than case")
+ if name in types:
+ raise malformed(f"{where}: a field name given twice")
+ if not isinstance(declaration["type"], str) or declaration["type"] not in RESEARCH_TYPES:
+ raise malformed(f"{where}: a type other than the six")
+ if not isinstance(declaration["required"], bool):
+ raise malformed(f"{where}: required is not a boolean")
+ if not isinstance(declaration["description"], str) or not declaration["description"]:
+ raise malformed(f"{where}: description is not a non-empty string")
+ types[name] = declaration["type"]
+ capabilities = check_capabilities(raw["capabilities"], what)
+ if capabilities[0] != "answer":
+ raise malformed(f"{what}: capabilities without answer, which is required")
+ request = {name: raw[name] for name in ("constraints", "model", "evidence", "fields", "capabilities")}
+ research = Research(question, fields, types, capabilities, model, request)
+ if "webProfiles" in raw:
+ research.web = check_web_profiles(raw["webProfiles"], capabilities, what)
+ return research
+
+
+def conditions_of(condition: dict[str, Any]) -> list[dict[str, Any]]:
+ """A condition and every condition within it, at any depth."""
+ found = [condition]
+ if condition["op"] in ("all", "any"):
+ for item in condition["of"]:
+ found.extend(conditions_of(item))
+ elif condition["op"] == "not":
+ found.extend(conditions_of(condition["of"]))
+ return found
+
+
+def leaves_of(rule: dict[str, Any]) -> list[dict[str, Any]]:
+ return [
+ condition
+ for clause in rule["clauses"]
+ for condition in conditions_of(clause["when"])
+ if condition["op"] not in ("always", "all", "any", "not")
+ ]
+
+
+def check_research_read(
+ value: Any, scope: dict[str, str], what: str, source: Source, earlier: list[Source]
+) -> Read:
+ """§4.3, "Reading fields": a plain research read reads `R` through a closed list of pointers, and never
+ takes a value from under `values`; §6.4: or the read is a reconciliation."""
+ assert source.research is not None
+ if isinstance(value, dict) and "sources" in value:
+ return check_reconciliation(value, scope, what, source, earlier)
+ read = check_read(value, scope, what)
+ declared = source.research.types
+
+ def readable(pointer: str, taken: bool) -> None:
+ tokens = pointer_tokens(pointer)
+ assert tokens is not None
+ if tokens == ["fields"]:
+ return
+ if len(tokens) >= 2 and tokens[0] == "fields" and tokens[1] in declared:
+ rest = tokens[2:]
+ if not rest or rest[0] == "value" or rest in (["status"], ["cites"]):
+ return
+ if len(rest) == 3 and rest[0] == "values" and ARRAY_INDEX.fullmatch(rest[1]) and rest[2] == "value":
+ if taken:
+ raise malformed(f"{what}: a value taken from under values, which a plain research read never takes")
+ return
+ raise malformed(f"{what}: a read pointer outside a research read's closed list")
+
+ # This reader takes an unwrap pointer, which takes the value read from where it points, as a from.
+ for pointer in read.unwrap:
+ readable(pointer, True)
+ if read.copy is not None:
+ for entry in read.copy["facts"] + read.copy["evidence"]:
+ readable(entry["source"], True)
+ else:
+ assert read.rule is not None
+ for condition in leaves_of(read.rule):
+ readable(condition["field"], False)
+ for clause in read.rule["clauses"]:
+ for entry in clause["claim"]["facts"]:
+ readable(entry["from"], True)
+ return read
+
+
+def status_guard(condition: Any, entry: list[str], status: str) -> bool:
+ """§6.4: exactly `{"op":"equals","field":"/status","to":S}`."""
+ return (
+ isinstance(condition, dict)
+ and set(condition) == {"op", "field", "to"}
+ and condition["op"] == "equals"
+ and isinstance(condition["to"], str)
+ and condition["to"] == status
+ and pointer_tokens(condition["field"]) == entry + ["status"]
+ )
+
+
+def absence_guard(condition: Any, entry: list[str]) -> bool:
+ """§6.4: exactly `{"op":"not","of":{"op":"exists","field":""}}`."""
+ return (
+ isinstance(condition, dict)
+ and set(condition) == {"op", "of"}
+ and condition["op"] == "not"
+ and isinstance(condition["of"], dict)
+ and set(condition["of"]) == {"op", "field"}
+ and condition["of"]["op"] == "exists"
+ and pointer_tokens(condition["of"]["field"]) == entry
+ )
+
+
+def check_reconciliation(
+ value: Any, scope: dict[str, str], what: str, source: Source, earlier: list[Source]
+) -> Read:
+ """§6.4: `{"sources": [S, ...], "rule": R}`, on a version-3 `research` source: the earlier research
+ sources it reads, by name, and a version-1 rule over `{"current": C, "sources": U}`, whose pointers,
+ froms, guards, evidence and last clause are held to the section's forms."""
+ assert source.research is not None
+ raw = closed(value, {"sources", "rule"}, set(), what)
+ names = raw["sources"]
+ if not isinstance(names, list) or not names:
+ raise malformed(f"{what}: sources is not an array of one name at least")
+ research = {s.name: s for s in earlier if s.research is not None}
+ if not all(isinstance(name, str) and name in research for name in names):
+ raise malformed(f"{what}: a name that is not of an earlier research source")
+ if len(set(names)) != len(names):
+ raise malformed(f"{what}: a source named twice")
+ read = check_read({"rule": raw["rule"]}, scope, what)
+ read.as_written = raw
+ read.sources = list(names)
+ rule = read.rule
+ assert rule is not None
+ declared = {name: research[name].research.types for name in names} # type: ignore[union-attr]
+
+ def entry_of(pointer: str) -> tuple[list[str], list[str]] | None:
+ tokens = pointer_tokens(pointer)
+ assert tokens is not None
+ if len(tokens) >= 3 and tokens[:2] == ["current", "fields"] and tokens[2] in source.research.types:
+ return tokens[:3], tokens[3:]
+ if (
+ len(tokens) >= 4
+ and tokens[0] == "sources"
+ and tokens[1] in declared
+ and tokens[2] == "fields"
+ and tokens[3] in declared[tokens[1]]
+ ):
+ return tokens[:4], tokens[4:]
+ return None
+
+ # The pointers a condition reads: a declared field's entry, its status, and its value or values.
+ for condition in leaves_of(rule):
+ found = entry_of(condition["field"])
+ if found is None or not (not found[1] or found[1] == ["status"] or found[1][0] in ("value", "values")):
+ raise malformed(f"{what}: a condition reads a pointer outside the reconciliation's")
+ selected: list[list[str]] = []
+ for clause in rule["clauses"]:
+ if clause["claim"]["evidence"]:
+ raise malformed(f"{what}: a reconciliation claim writes evidence")
+ for entry in clause["claim"]["facts"]:
+ found = entry_of(entry["from"])
+ if found is None or not found[1] or found[1][0] != "value":
+ raise malformed(f"{what}: a from outside the admissible set")
+ when = clause["when"]
+ guarded = status_guard(when, found[0], "found") or (
+ when["op"] == "all" and any(status_guard(item, found[0], "found") for item in when["of"])
+ )
+ if not guarded:
+ raise malformed(f"{what}: a value selected by a clause that does not guard it as found")
+ if found[0] not in selected:
+ selected.append(found[0])
+ every = [condition for clause in rule["clauses"] for condition in conditions_of(clause["when"])]
+ for entry in selected:
+ for status in ("not-found", "stale", "conflicting"):
+ if not any(status_guard(condition, entry, status) for condition in every):
+ raise malformed(f"{what}: a selected field with no {status} guard")
+ if not any(absence_guard(condition, entry) for condition in every):
+ raise malformed(f"{what}: a selected field with no absence guard")
+ last = rule["clauses"][-1]["claim"]
+ if last["facts"] or last["acquisitionStatus"] not in ("unknown", "absent"):
+ raise malformed(f"{what}: the last clause writes a fact, or is neither unknown nor absent")
+ return read
+
+
+def parse_binding(document: Any) -> dict[str, Any]:
+ """§4.4: the binding document, one object of exactly `dialect`, a digest, and `sources`, an object
+ mapping names to assignments: for an `operation` exactly `profile`, a non-empty string, and
+ `profileDigest`, a digest, and for `research` those and `webProfiles`. Which form an entry has is the
+ kind of the source it binds (`read_bound`)."""
+ binding = closed(document, {"dialect", "sources"}, set(), "the binding document")
+ if not is_digest(binding["dialect"]):
+ raise malformed("the binding document's dialect is not a digest")
+ if not isinstance(binding["sources"], dict):
+ raise malformed("the binding document's sources are not an object")
+ for name, entry in binding["sources"].items():
+ what = f"the binding document's entry {name}"
+ closed(entry, {"profile", "profileDigest"}, {"webProfiles"}, what)
+ check_assignment({"profile": entry["profile"], "profileDigest": entry["profileDigest"]}, what)
+ return binding
+
+
+def bind(document: dict[str, Any], binding: dict[str, Any]) -> dict[str, Any]:
+ """§4.4: the bound dialect, the unbound dialect with the binding applied: each `operation` the binding
+ document names with its `platform`, `operation`, `shape` and `record` removed and the `profile` and
+ `profileDigest` the binding gives it added; each `research` source with the three assignment members
+ added; every other member kept as written."""
+ sources = []
+ for source in document.get("sources", []):
+ entry = binding["sources"].get(source["name"])
+ if entry is not None:
+ source = {name: member for name, member in source.items() if name not in UNBOUND_MEMBERS}
+ source["profile"] = entry["profile"]
+ source["profileDigest"] = entry["profileDigest"]
+ if "webProfiles" in entry:
+ source["webProfiles"] = entry["webProfiles"]
+ sources.append(source)
+ return {**document, "sources": sources}
+
+
+def read_bound(dialect: Dialect, binding_document: Any, given: bool) -> Dialect:
+ """§4.4, verifying it: a dialect with an unbound source is read with its binding document, as the
+ bound dialect, with two checks more; the first here, the second a finding (`profile-mismatch`).
+ `given` says whether a binding document was supplied, whatever it holds: a document of `null` is
+ one, and not of the binding document's form."""
+ binding = parse_binding(binding_document) if given else None
+ if not dialect.unbound and not dialect.unbound_research:
+ if binding is not None:
+ raise malformed("a binding document beside a dialect with no unbound source")
+ return dialect
+ if binding is None:
+ raise malformed("a dialect with an unbound source and no binding document")
+ if binding["dialect"] != digest_of(canon(dialect.document)):
+ raise malformed("the binding document's dialect is not the given dialect's digest")
+ if set(binding["sources"]) != set(dialect.unbound) | set(dialect.unbound_research):
+ raise malformed("the binding document does not name exactly the dialect's unbound sources")
+ for name, entry in binding["sources"].items():
+ what = f"the binding document's entry {name}"
+ if name in dialect.unbound:
+ closed(entry, {"profile", "profileDigest"}, set(), what)
+ else:
+ # §4.4: for research, exactly `profile`, `profileDigest` and `webProfiles`, with exactly the
+ # web capabilities the source requests.
+ closed(entry, {"profile", "profileDigest", "webProfiles"}, set(), what)
+ check_web_profiles(entry["webProfiles"], list(dialect.unbound_research[name]), what)
+ bound = parse_dialect(bind(dialect.document, binding))
+ bound.bound_from = dict(dialect.unbound)
+ return bound
+
+
+def research_sources(dialect: Any) -> set[str]:
+ """The names of the dialect's sources of kind `research`, read wherever they can be, before any form
+ is checked: their acquisitions have a form of their own (§4.3, §5.2)."""
+ if not isinstance(dialect, dict) or not isinstance(dialect.get("sources"), list):
+ return set()
+ return {
+ source["name"]
+ for source in dialect["sources"]
+ if isinstance(source, dict) and source.get("kind") == "research" and isinstance(source.get("name"), str)
+ }
+
+
+def check_salts(value: Any, what: str) -> None:
+ salts = closed(value, {"args"}, {"statement"}, f"{what} salts")
+ if not all(is_hex(salt, 64) for salt in salts.values()):
+ raise malformed(f"{what}: a salt of another form")
+
+
+def check_typed(value: Any, kind: str, what: str) -> None:
+ """§4.3: a value of a field's declared type, in its exact encoding; `null` is never one. The maxima of
+ §12 are counted before any form (`count_bounds`)."""
+ if kind == "integer":
+ ok = is_integer(value)
+ elif kind == "decimal":
+ ok = isinstance(value, str) and DECIMAL.fullmatch(value) is not None
+ elif kind == "boolean":
+ ok = isinstance(value, bool)
+ elif kind == "text":
+ ok = isinstance(value, str)
+ elif kind == "text-list":
+ ok = isinstance(value, list) and all(isinstance(item, str) for item in value)
+ else:
+ ok = isinstance(value, dict) and set(value) == {"min", "max"}
+ if ok:
+ low, high = value["min"], value["max"]
+ if is_integer(low) and is_integer(high):
+ ok = low.value <= high.value
+ elif all(isinstance(e, str) and DECIMAL.fullmatch(e) is not None for e in (low, high)):
+ # compared by exact decimal arithmetic, never binary floating point
+ ok = Decimal(low) <= Decimal(high)
+ else:
+ ok = False
+ if not ok:
+ raise malformed(f"{what}: a value that is not of the declared type {kind}")
+
+
+def check_cites(value: Any, responses: int, least: int, what: str) -> None:
+ """§4.3: distinct indices into the record's `responses`, each an integer from 0 below their number,
+ written without `-0`; more than 64 is over a maximum (§12), counted before any form."""
+ if not isinstance(value, list) or len(value) < least:
+ raise malformed(f"{what}: cites is not an array of {least} index at least")
+ seen: set[int] = set()
+ for index in value:
+ if not is_integer(index) or index.literal == "-0" or not 0 <= integer_of(index) < responses:
+ raise malformed(f"{what}: a citation that is not an index into the record's responses")
+ if integer_of(index) in seen:
+ raise malformed(f"{what}: an index cited twice")
+ seen.add(integer_of(index))
+
+
+def check_answers(answers: Any, research: Research, responses: int, what: str) -> None:
+ """§4.3, "Answers": `R.fields`, an entry for each declared field it answers, every required one among
+ them, each entry of its status's form."""
+ if not isinstance(answers, dict):
+ raise malformed(f"{what}: fields is not an object")
+ for name in answers:
+ if name not in research.types:
+ raise malformed(f"{what}: an answer for a field that is not declared")
+ for declaration in research.fields:
+ if declaration["required"] and declaration["name"] not in answers:
+ raise malformed(f"{what}: no entry for the required field {declaration['name']}")
+ for name, entry in answers.items():
+ where = f"{what} field {name}"
+ kind = research.types[name]
+ status = entry.get("status") if isinstance(entry, dict) else None
+ if status == "found":
+ closed(entry, {"status", "cites", "value"}, set(), where)
+ check_cites(entry["cites"], responses, 1, where)
+ check_typed(entry["value"], kind, where)
+ elif status == "conflicting":
+ closed(entry, {"status", "cites", "values"}, set(), where)
+ if entry["cites"] != []:
+ raise malformed(f"{where}: a conflicting entry's own cites is not []")
+ observations = entry["values"]
+ if not isinstance(observations, list) or len(observations) < 2:
+ raise malformed(f"{where}: values is not an array of two observations at least")
+ for index, observation in enumerate(observations):
+ closed(observation, {"value", "cites"}, set(), f"{where} observation {index}")
+ check_typed(observation["value"], kind, f"{where} observation {index}")
+ check_cites(observation["cites"], responses, 1, f"{where} observation {index}")
+ first = observations[0]["value"]
+ if all(json_equal(first, observation["value"]) for observation in observations):
+ raise malformed(f"{where}: no two conflicting values differ")
+ elif isinstance(status, str) and status in ("not-found", "stale"):
+ closed(entry, {"status", "cites"}, set(), where)
+ check_cites(entry["cites"], responses, 0, where)
+ else:
+ raise malformed(f"{where}: an entry that is not an object of a known status")
+
+
+def check_acquisition_form(name: str, member: Any, research: Research | None) -> None:
+ """§5.2: an acquisition's form. A `research` source's response may lack `receipt` and `salts`, both
+ or neither; its result is the research record, of §4.3's form, its answers held to the source's
+ declarations and each retained response to its form here, where a missing `result` is no refusal
+ of form but `acquisition-missing` (§5.2)."""
+ what = f"acquisition {name}"
+ closed(member, {"response"}, set(), what)
+ if research is None:
+ response = closed(member["response"], {"result", "receipt", "salts"}, set(), what)
+ else:
+ response = closed(member["response"], {"result"}, {"receipt", "salts"}, what)
+ if ("receipt" in response) != ("salts" in response):
+ raise malformed(f"{what}: a research record's receipt and salts are both present or both absent")
+ record = closed(response["result"], {"fields", "responses"}, set(), f"{what}: the research record")
+ if not isinstance(record["responses"], list):
+ raise malformed(f"{what}: the research record's responses are not an array")
+ for index, entry in enumerate(record["responses"]):
+ where = f"{what} retained response {index}"
+ retained = closed(entry, {"profile", "request", "receipt", "salts"}, {"result"}, where)
+ profile = closed(retained["profile"], {"id", "digest"}, set(), f"{where} profile")
+ if not isinstance(profile["id"], str) or not profile["id"] or not is_digest(profile["digest"]):
+ raise malformed(f"{where}: a profile reference of another form")
+ if not isinstance(retained["request"], dict) or not in_canon_domain(retained["request"]):
+ raise malformed(f"{where}: a request that is not an object in the canon domain")
+ if not isinstance(retained["receipt"], dict):
+ raise malformed(f"{where}: the receipt is not an object")
+ check_salts(retained["salts"], where)
+ check_answers(record["fields"], research, len(record["responses"]), f"{what}: the research record")
+ if "receipt" in response:
+ if not isinstance(response["receipt"], dict):
+ raise malformed(f"{what}: the receipt is not an object")
+ check_salts(response["salts"], what)
+
+
+def over_by_type(value: Any, kind: Any) -> bool:
+ """§11's third phase: a value measured by its field's declared type, when that type is one of §4.3's
+ six, against the maxima of §12; a value of another form is measured by nothing here."""
+ if kind == "text":
+ return isinstance(value, str) and utf8_length(value) > MAX_TEXT_BYTES
+ if kind == "text-list":
+ return isinstance(value, list) and (
+ len(value) > MAX_LIST_ITEMS
+ or any(isinstance(item, str) and utf8_length(item) > MAX_ITEM_BYTES for item in value)
+ )
+ if kind == "decimal":
+ return isinstance(value, str) and len(value) > MAX_DECIMAL_CHARACTERS
+ if kind == "range":
+ return isinstance(value, dict) and any(
+ isinstance(value.get(end), str) and len(value[end]) > MAX_DECIMAL_CHARACTERS for end in ("min", "max")
+ )
+ return False
+
+
+def research_bounds(dialect: Any, acquisitions: Any, profiles: Any, binding: Any) -> None:
+ """§12's research maxima (§4.3, §4.4, §5.1, §6.4), counted wherever they can be measured before any
+ form (§11, the third phase): on the dialect's `research` sources, the profiles' research
+ declarations, the binding document's research assignments and each research record."""
+
+ def over(detail: str) -> Refused:
+ return Refused("input-over-bound", detail)
+
+ def too_long(value: Any, limit: int) -> bool:
+ return isinstance(value, str) and utf8_length(value) > limit
+
+ def capabilities_over(value: Any) -> bool:
+ return isinstance(value, list) and len(value) > MAX_CAPABILITIES
+
+ def cites_over(value: Any) -> bool:
+ return isinstance(value, list) and len(value) > MAX_CITES
+
+ # each research source's declared types, by its name: a name declared twice is input-malformed once forms are
+ # checked; before that, its answers are measured by the first declaration whose `type` is one of the six
+ declared: dict[str, dict[str, Any]] = {}
+ sources = dialect.get("sources") if isinstance(dialect, dict) else None
+ for source in sources if isinstance(sources, list) else []:
+ if not isinstance(source, dict) or source.get("kind") != "research":
+ continue
+ types: dict[str, Any] = {}
+ fields = source.get("fields")
+ if isinstance(fields, list):
+ if len(fields) > MAX_FIELDS:
+ raise over("more than 64 fields declared")
+ for declaration in fields:
+ if not isinstance(declaration, dict):
+ continue
+ name = declaration.get("name")
+ if too_long(name, MAX_FIELD_NAME_BYTES):
+ raise over("a field name of more than 64 bytes")
+ if too_long(declaration.get("description"), MAX_DESCRIPTION_BYTES):
+ raise over("a field description of more than 2048 bytes")
+ if isinstance(name, str) and name not in types and declaration.get("type") in RESEARCH_TYPES:
+ types[name] = declaration["type"]
+ if too_long(source.get("model"), MAX_MODEL_BYTES):
+ raise over("a model name of more than 256 bytes")
+ evidence = source.get("evidence")
+ if isinstance(evidence, list) and any(too_long(item, MAX_EVIDENCE_BYTES) for item in evidence):
+ raise over("an evidence instruction of more than 4096 bytes")
+ if capabilities_over(source.get("capabilities")):
+ raise over("more than three capabilities")
+ web = source.get("webProfiles")
+ if isinstance(web, dict) and len(web) > MAX_WEB_ASSIGNMENTS:
+ raise over("more than two web assignments")
+ read = source.get("read")
+ names = read.get("sources") if isinstance(read, dict) else None
+ if isinstance(names, list) and len(names) > MAX_READ_SOURCES:
+ raise over("more than 15 earlier sources read")
+ if isinstance(source.get("name"), str) and source["name"] not in declared:
+ declared[source["name"]] = types
+ for profile in profiles if isinstance(profiles, list) else []:
+ research = profile.get("research") if isinstance(profile, dict) else None
+ if isinstance(research, dict):
+ if capabilities_over(research.get("capabilities")):
+ raise over("a profile of more than three capabilities")
+ if too_long(research.get("model"), MAX_MODEL_BYTES):
+ raise over("a profile's model name of more than 256 bytes")
+ assigned = binding.get("sources") if isinstance(binding, dict) else None
+ if isinstance(assigned, dict):
+ for name, entry in assigned.items():
+ web = entry.get("webProfiles") if name in declared and isinstance(entry, dict) else None
+ if isinstance(web, dict) and len(web) > MAX_WEB_ASSIGNMENTS:
+ raise over("more than two web assignments")
+ for name, member in acquisitions.items() if isinstance(acquisitions, dict) else []:
+ response = member.get("response") if isinstance(member, dict) and name in declared else None
+ record = response.get("result") if isinstance(response, dict) else None
+ answers = record.get("fields") if isinstance(record, dict) else None
+ if not isinstance(answers, dict):
+ continue
+ if len(answers) > MAX_FIELDS:
+ raise over("more than 64 answer entries")
+ # every answer's name, declared or not, before any entry is inspected or its declaration looked up
+ if any(utf8_length(field_name) > MAX_FIELD_NAME_BYTES for field_name in answers):
+ raise over("an answer's field name of more than 64 bytes")
+ for field_name, entry in answers.items():
+ if not isinstance(entry, dict):
+ continue
+ kind = declared[name].get(field_name)
+ if cites_over(entry.get("cites")) or over_by_type(entry.get("value"), kind):
+ raise over(f"an answer over a maximum: {field_name}")
+ observations = entry.get("values")
+ if not isinstance(observations, list):
+ continue
+ if len(observations) > MAX_OBSERVATIONS:
+ raise over("more than 64 conflicting observations")
+ for observation in observations:
+ if isinstance(observation, dict) and (
+ cites_over(observation.get("cites")) or over_by_type(observation.get("value"), kind)
+ ):
+ raise over(f"an observation over a maximum: {field_name}")
+
+
+def count_bounds(dialect: Any, acquisitions: Any, profiles: Any = None, binding: Any = None) -> None:
+ """§12's counted bounds, and a result's nesting, taken on the documents read wherever the count
+ can be taken, before any form is checked (§11, the third phase)."""
+
+ def over(detail: str) -> Refused:
+ return Refused("input-over-bound", detail)
+
+ research_bounds(dialect, acquisitions, profiles, binding)
+ for profile in profiles if isinstance(profiles, list) else []:
+ scope = profile.get("endpointScope") if isinstance(profile, dict) else None
+ if isinstance(scope, list):
+ if len(scope) > 32 or any(isinstance(e, str) and utf8_length(e) > 2048 for e in scope):
+ raise over("an endpoint scope exceeds 32 entries or 2048 bytes per entry")
+ if isinstance(acquisitions, dict):
+ research = research_sources(dialect)
+ for name, member in acquisitions.items():
+ response = member.get("response") if isinstance(member, dict) else None
+ if isinstance(response, dict) and "result" in response:
+ if value_depth(response["result"]) > MAX_VALUE_DEPTH:
+ raise over(f"acquisition {name}: a result nested more than 32 levels")
+ # the retained responses of a `research` source, at most 64 (§12)
+ record = response["result"]
+ if name in research and isinstance(record, dict) and isinstance(record.get("responses"), list):
+ if len(record["responses"]) > MAX_RETAINED_RESPONSES:
+ raise over(f"acquisition {name}: more than 64 retained responses")
+ if not isinstance(dialect, dict):
+ return
+ facts: set[str] = set()
+ evidence: set[str] = set()
+
+ def entries(value: Any) -> list[Any]:
+ return value if isinstance(value, list) else []
+
+ def copy_targets(copy: Any) -> None:
+ if isinstance(copy, dict):
+ for entry in entries(copy.get("facts")):
+ if isinstance(entry, dict) and isinstance(entry.get("target"), str):
+ facts.add(entry["target"])
+ for entry in entries(copy.get("evidence")):
+ if isinstance(entry, dict) and isinstance(entry.get("requirement"), str):
+ evidence.add(entry["requirement"])
+
+ def listed(condition: Any) -> None:
+ if not isinstance(condition, dict):
+ return
+ if condition.get("op") in ("all", "any") and isinstance(condition.get("of"), list):
+ if len(condition["of"]) > MAX_LISTED:
+ raise over("more than 64 conditions listed")
+ for item in condition["of"]:
+ listed(item)
+ elif condition.get("op") == "not":
+ listed(condition.get("of"))
+
+ case = dialect.get("case")
+ case_parameters = case.get("parameters") if isinstance(case, dict) else None
+ in_case = len(case_parameters) if isinstance(case_parameters, dict) else 0
+ if in_case + 1 > MAX_SCOPE:
+ raise over("more than 64 parameters in the case's scope")
+ if isinstance(case, dict):
+ copy_targets({"facts": case.get("facts"), "evidence": case.get("evidence")})
+ sources = dialect.get("sources")
+ if isinstance(sources, list):
+ if len(sources) > MAX_SOURCES:
+ raise over("more than 16 sources")
+ for source in sources:
+ if not isinstance(source, dict):
+ continue
+ own = source.get("parameters")
+ if isinstance(own, dict) and in_case + len(own) + 1 > MAX_SCOPE:
+ raise over("more than 64 parameters in a scope")
+ read = source.get("read")
+ if not isinstance(read, dict):
+ continue
+ if isinstance(read.get("unwrap"), list) and len(read["unwrap"]) > MAX_UNWRAP:
+ raise over("more than four unwrap pointers")
+ copy_targets(read.get("copy"))
+ rule = read.get("rule")
+ clauses = rule.get("clauses") if isinstance(rule, dict) else None
+ if isinstance(clauses, list):
+ if len(clauses) > MAX_CLAUSES:
+ raise over("more than 64 clauses")
+ for clause in clauses:
+ if not isinstance(clause, dict):
+ continue
+ listed(clause.get("when"))
+ claim = clause.get("claim")
+ if isinstance(claim, dict):
+ for entry in entries(claim.get("facts")):
+ if isinstance(entry, dict) and isinstance(entry.get("pointer"), str):
+ facts.add(entry["pointer"])
+ if isinstance(claim.get("evidence"), dict):
+ evidence.update(claim["evidence"])
+ if len(facts) > MAX_FACT_TARGETS or len(evidence) > MAX_EVIDENCE_TARGETS:
+ raise over("more fact or evidence targets than the bounds")
+
+
+# ---------------------------------------------------------------------------------------------
+# Input profiles (§5.1)
+
+
+def page_endpoint(value: Any) -> tuple[str, str] | None:
+ """The constrained page form, parsed as text; no URL parser or path decoding (§5.1)."""
+ if not isinstance(value, str) or len(value) > 2048 or not re.fullmatch(r"[\x21-\x7e]+", value):
+ return None
+ match = re.fullmatch(r"https://([A-Za-z0-9.-]+)(?::(?:443)?)?(/[^?#\\]*)?", value)
+ if match is None:
+ return None
+ host, path = match[1], match[2] or ""
+ labels = host.split(".")
+ if len(labels) < 2 or not re.match(r"[A-Za-z]", labels[-1]):
+ return None
+ if any(not re.fullmatch(r"[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?", label)
+ for label in labels):
+ return None
+ if re.search(r"%(?![0-9A-Fa-f]{2})", path):
+ return None
+ if re.search(r"%(?:2[fF]|5[cC])", path): # Round 16: an escaped slash or backslash.
+ return None
+ # A dot segment, alone or before the first `;` or escaped delimiter of its segment (round 16).
+ heads = (re.split(r";|%3[bBfF]|%23|%00", segment, maxsplit=1)[0]
+ for segment in path.split("/"))
+ if any(re.fullmatch(r"(?:\.|%2[eE]){1,2}", head) for head in heads):
+ return None
+ return host.lower(), path # ASCII host comparison only; signed bytes are never rewritten.
+
+
+def endpoint_in_scope(endpoint: Any, scope: list[str]) -> bool:
+ parsed = page_endpoint(endpoint)
+ if parsed is None:
+ return False
+ host, path = parsed
+ for entry in scope:
+ if entry == "https://*":
+ return True
+ prefix = page_endpoint(entry)
+ assert prefix is not None # The profile's form was checked before any finding.
+ other_host, prefix_path = prefix
+ if host == other_host and (
+ prefix_path in ("", "/") or path == prefix_path
+ or path.startswith(prefix_path if prefix_path.endswith("/") else prefix_path + "/")
+ ):
+ return True
+ return False
+
+
+def parse_profiles(document: Any) -> dict[str, dict[str, Any]]:
+ if not isinstance(document, list):
+ raise malformed("the profiles are not an array")
+ profiles: dict[str, dict[str, Any]] = {}
+ for index, profile in enumerate(document):
+ what = f"profile {index}"
+ closed(
+ profile,
+ {"id", "publicKey", "class", "source", "authority", "shape", "adapter", "endpoint"},
+ {"tools", "calculator", "research", "endpointScope"},
+ what,
+ )
+ if not isinstance(profile["id"], str) or not profile["id"] or profile["id"] in profiles:
+ raise malformed(f"{what}: an id that is empty or given twice")
+ if not is_hex(profile["publicKey"], 64) or key_refusal(bytes.fromhex(profile["publicKey"])):
+ raise malformed(f"{what}: a key the key rule refuses")
+ if profile["class"] not in ("record", "generated"):
+ raise malformed(f"{what}: a class of another value")
+ if not isinstance(profile["source"], str) or not isinstance(profile["authority"], str):
+ raise malformed(f"{what}: source and authority are strings")
+ if profile["shape"] not in ("airbyte", "mcp", "http", "command"):
+ raise malformed(f"{what}: a shape of another value")
+ adapter = closed(profile["adapter"], {"name", "version", "digest"}, set(), what + " adapter")
+ if not isinstance(adapter["name"], str) or not isinstance(adapter["version"], str):
+ raise malformed(f"{what}: adapter name and version are strings")
+ if not is_digest(adapter["digest"]):
+ raise malformed(f"{what}: adapter digest is not a digest")
+ if profile["endpoint"] is not None and not isinstance(profile["endpoint"], str):
+ raise malformed(f"{what}: endpoint is a string or null")
+ if "tools" in profile:
+ tools = profile["tools"]
+ if (
+ not isinstance(tools, list)
+ or not all(isinstance(t, str) and t for t in tools)
+ or len(set(tools)) != len(tools)
+ ):
+ raise malformed(f"{what}: tools are distinct non-empty strings")
+ if profile["shape"] == "mcp" and not profile.get("tools"):
+ raise malformed(f"{what}: a profile of shape mcp gives tools, not empty")
+ if "calculator" in profile:
+ calculator = closed(profile["calculator"], {"name", "version"}, set(), what + " calculator")
+ if not isinstance(calculator["name"], str) or not isinstance(calculator["version"], str):
+ raise malformed(f"{what}: calculator name and version are strings")
+ if profile["class"] != "record" or profile["shape"] != "mcp":
+ raise malformed(f"{what}: a calculator's profile is record and mcp")
+ if "research" in profile:
+ # §5.1: a closed object of `capabilities` and, exactly when they include `answer`, `model`.
+ declaration = closed(profile["research"], {"capabilities"}, {"model"}, what + " research")
+ capabilities = check_capabilities(declaration["capabilities"], what + " research")
+ if ("answer" in capabilities) != ("model" in declaration):
+ raise malformed(f"{what}: a research declaration names a model exactly when it serves answer")
+ if "model" in declaration:
+ check_model(declaration["model"], what + " research")
+ if "endpointScope" in profile:
+ scope = profile["endpointScope"]
+ if (profile["endpoint"] is not None or profile["shape"] != "http"
+ or adapter["name"] != "adapter-web"
+ or ("research" in profile
+ and profile["research"]["capabilities"] != ["page"])
+ or (profile["class"] == "generated" and "research" not in profile)):
+ raise malformed(f"{what}: endpointScope is admitted only on page profiles")
+ if (not isinstance(scope, list) or not scope
+ or not all(isinstance(e, str) and (e == "https://*" or page_endpoint(e))
+ for e in scope)
+ or len(set(scope)) != len(scope)):
+ raise malformed(f"{what}: endpointScope is not distinct endpoint prefixes")
+ if profile["class"] == "record" and "https://*" in scope:
+ raise malformed(f"{what}: a record profile cannot carry the endpoint wildcard")
+ if not in_canon_domain(profile):
+ raise malformed(f"{what}: outside the canon domain")
+ profiles[profile["id"]] = profile
+ return profiles
+
+
+# ---------------------------------------------------------------------------------------------
+# Templates and requests (§4.1)
+
+
+def instantiate(template: Any, values: dict[str, Any]) -> Any:
+ if isinstance(template, dict):
+ if len(template) == 1:
+ (form, argument), = template.items()
+ if form == "$param":
+ return values[argument]
+ if form == "$text":
+ text = argument
+ out = []
+ position = 0
+ while True:
+ start = text.find("{{", position)
+ if start < 0:
+ out.append(text[position:])
+ break
+ end = text.find("}}", start + 2)
+ out.append(text[position:start])
+ out.append(str(integer_of(values[text[start + 2 : end]])))
+ position = end + 2
+ return "".join(out)
+ return {name: instantiate(member, values) for name, member in template.items()}
+ if isinstance(template, list):
+ return [instantiate(item, values) for item in template]
+ return template
+
+
+def commits(template: Any) -> tuple[set[str], set[str]]:
+ """§4.1: the parameters a request commits, and those it carries only in ambiguous text."""
+ committed: set[str] = set()
+ ambiguous: set[str] = set()
+
+ def walk(value: Any) -> None:
+ if isinstance(value, dict):
+ if len(value) == 1 and next(iter(value)) in ("$param", "$text"):
+ (form, argument), = value.items()
+ if form == "$param":
+ committed.add(argument)
+ else:
+ names = set(placeholders(argument))
+ if len(names) == 1:
+ committed.update(names)
+ else:
+ ambiguous.update(names)
+ return
+ for member in value.values():
+ walk(member)
+ elif isinstance(value, list):
+ for item in value:
+ walk(item)
+
+ walk(template)
+ return committed, ambiguous - committed
+
+
+# ---------------------------------------------------------------------------------------------
+# Reads (§6)
+
+
+def apply_unwrap(value: Any, unwrap: list[str]) -> Any:
+ for pointer in unwrap:
+ text = resolve(value, pointer)
+ if not isinstance(text, str):
+ raise Finding("read-failed", "an unwrap pointer does not resolve to a string")
+ data = text.encode("utf-8")
+ if len(data) > MAX_UNWRAPPED_BYTES:
+ raise Refused("input-over-bound", "an unwrapped string of more than 200000 bytes")
+ try:
+ value = read_document(data, "an unwrapped string", MAX_VALUE_DEPTH)
+ except Refused as refusal:
+ if refusal.name == "input-over-bound":
+ raise
+ raise Finding("read-failed", "an unwrapped string that is not one JSON value") from refusal
+ return value
+
+
+def copy_claim(copy: dict[str, Any], value: Any) -> dict[str, Any]:
+ facts: dict[str, Any] = {}
+ availability: dict[str, Any] = {}
+ basis: set[str] = set()
+ for entry in copy["facts"]:
+ basis.add(entry["source"])
+ found = resolve(value, entry["source"])
+ if found is ABSENT:
+ continue
+ if not in_canon_domain(found):
+ raise Finding("read-failed", "a copied value outside the canon domain")
+ write_at(facts, entry["target"], found)
+ for entry in copy["evidence"]:
+ basis.add(entry["source"])
+ found = resolve(value, entry["source"])
+ if found is ABSENT:
+ continue
+ if found not in AVAILABILITY:
+ raise Finding("read-failed", "a copied availability of another value")
+ availability[entry["requirement"]] = found
+ return {
+ "facts": facts,
+ "evidenceAvailability": availability,
+ "acquisitionStatus": "resolved",
+ "reason": "copied",
+ "basis": sorted(basis),
+ }
+
+
+def evaluate(
+ condition: dict[str, Any],
+ value: Any,
+ params: dict[str, Any],
+ basis: set[str],
+ declared: dict[str, str],
+) -> bool:
+ op = condition["op"]
+ if op == "always":
+ return True
+ if op == "all":
+ return all(evaluate(c, value, params, basis, declared) for c in condition["of"])
+ if op == "any":
+ return any(evaluate(c, value, params, basis, declared) for c in condition["of"])
+ if op == "not":
+ return not evaluate(condition["of"], value, params, basis, declared)
+ basis.add(condition["field"])
+ found = resolve(value, condition["field"])
+ if found is ABSENT:
+ return False
+ if op == "exists":
+ return True
+ if op == "equals":
+ return json_equal(found, condition["to"])
+ if op == "equalsParam":
+ return json_equal(found, params[condition["param"]])
+ if op == "isTrue":
+ return found is True
+ if op == "isDecimalString":
+ return isinstance(found, str) and re.fullmatch(r"0|[1-9][0-9]*", found) is not None
+ if op == "freshWithin":
+ # True only for `N` of type `timestamp` and `M` of type `integer` (§6.3), as declared.
+ if declared[condition["asOf"]] != "timestamp" or declared[condition["maxAge"]] != "integer":
+ return False
+ field_instant = instant(found)
+ as_of = instant(params[condition["asOf"]])
+ if field_instant is None or as_of is None:
+ return False
+ return 0 <= as_of - field_instant <= integer_of(params[condition["maxAge"]])
+ raise AssertionError(op)
+
+
+def rule_claim(rule: dict[str, Any], value: Any, scope_values: dict[str, Any]) -> dict[str, Any]:
+ params = {name: scope_values[name] for name in rule["parameters"]}
+ basis: set[str] = set()
+ match = None
+ for clause in rule["clauses"]:
+ if evaluate(clause["when"], value, params, basis, rule["parameters"]):
+ match = clause
+ break
+ assert match is not None
+ facts: dict[str, Any] = {}
+ for entry in match["claim"]["facts"]:
+ found = resolve(value, entry["from"])
+ if found is ABSENT:
+ raise Finding("read-failed", "a from that does not resolve")
+ if not in_canon_domain(found):
+ raise Finding("read-failed", "a value outside the canon domain")
+ write_at(facts, entry["pointer"], found)
+ return {
+ "facts": facts,
+ "evidenceAvailability": dict(match["claim"]["evidence"]),
+ "acquisitionStatus": match["claim"]["acquisitionStatus"],
+ "reason": match["reason"],
+ "basis": sorted(basis),
+ }
+
+
+# ---------------------------------------------------------------------------------------------
+# Acquisitions (§5.2) and calculated values (§7)
+
+
+def check_acquisition(
+ source: Source, profile: dict[str, Any], response: dict[str, Any], request: Any, at: int
+) -> None:
+ result, receipt, salts = response["result"], response["receipt"], response["salts"]
+
+ def invalid(detail: str) -> Finding:
+ return Finding("acquisition-invalid", f"{source.name}: {detail}")
+
+ # Check 1, the members the time and session rules read among them (round 9, issue #182 item 4):
+ # each time a string with an instant (§1), `callIndex` an integer at least zero, and `sessionId` a
+ # string, not held to the gateway's token form. A member of another type or form makes the
+ # receipt malformed, before the time and session rules.
+ acquisition = receipt.get("acquisition")
+ served = instant(receipt.get("servedAt"))
+ forms = (
+ receipt.get("receiptVersion") == "3",
+ receipt.get("kind") == "acquisition",
+ is_hex(receipt.get("keyId"), 32),
+ is_hex(receipt.get("signature"), 128),
+ isinstance(receipt.get("source"), str),
+ isinstance(receipt.get("authority"), str),
+ isinstance(receipt.get("sessionId"), str),
+ is_integer(receipt.get("callIndex")) and integer_of(receipt["callIndex"]) >= 0,
+ is_digest(receipt.get("argumentsCommitment")),
+ is_digest(receipt.get("resultDigest")),
+ served is not None,
+ isinstance(acquisition, dict),
+ )
+ if not all(forms):
+ raise invalid("a receipt member not of its form")
+ observed = instant(acquisition.get("observedAt"))
+ if not (
+ isinstance(acquisition.get("adapter"), dict)
+ and isinstance(acquisition.get("shape"), str)
+ and (acquisition.get("endpoint") is None or isinstance(acquisition.get("endpoint"), str))
+ and observed is not None
+ ):
+ raise invalid("an acquisition member not of its form")
+ if "pageItems" in acquisition:
+ raise invalid("the receipt attests a page, which no preparation reads")
+ key = bytes.fromhex(profile["publicKey"])
+ if receipt["keyId"] != hashlib.sha256(key).hexdigest()[:32]:
+ raise invalid("keyId is not the profile key's")
+ unsigned = {name: member for name, member in receipt.items() if name != "signature"}
+ try:
+ message = b"judgment-pack-gateway/receipt/3:" + canon(unsigned)
+ except OutsideDomain as error:
+ raise invalid("a receipt outside the canon domain") from error
+ if not signature_verifies(key, message, bytes.fromhex(receipt["signature"])):
+ raise invalid("the signature does not verify")
+ if receipt["source"] != profile["source"] or receipt["authority"] != profile["authority"]:
+ raise invalid("source or authority is not the profile's")
+ for name in ("adapter", "shape", "endpoint"):
+ if name == "endpoint" and "endpointScope" in profile:
+ if not endpoint_in_scope(acquisition.get(name), profile["endpointScope"]):
+ raise invalid("acquisition.endpoint is outside the profile's scope")
+ continue
+ if not json_equal(acquisition.get(name), profile[name]):
+ raise invalid(f"acquisition.{name} is not the profile's")
+ commitment = hashlib.sha256(bytes.fromhex(salts["args"]) + b"args:" + canon(request)).hexdigest()
+ if receipt["argumentsCommitment"] != "sha256:" + commitment:
+ raise invalid("argumentsCommitment is not the request's")
+ try:
+ result_digest = digest_of(canon(result))
+ except OutsideDomain as error:
+ raise invalid("a result outside the canon domain") from error
+ if receipt["resultDigest"] != result_digest:
+ raise invalid("resultDigest is not the result's")
+ # The time rule: check 1 left a present instant in each, so `acquisition-stale` names only one
+ # outside the window.
+ assert served is not None and observed is not None
+ for seconds in (observed, served):
+ if not at - source.max_age <= seconds <= at + 30:
+ raise Finding("acquisition-stale", source.name)
+
+
+def sessions_in_a_form(receipts: list[dict[str, Any]]) -> bool:
+ """§5.2's session rule, over receipts check 1 held to their forms: `acquisition-sessions` names only
+ a well-formed session set that fails it."""
+ sessions = [r["sessionId"] for r in receipts]
+ indexes = [integer_of(r["callIndex"]) for r in receipts]
+ shared = len(set(sessions)) == 1 and len(set(indexes)) == len(indexes)
+ apart = len(set(sessions)) == len(sessions) and all(i == 0 for i in indexes)
+ return shared or apart
+
+
+def check_calculation(
+ source: Source, profile: dict[str, Any], value: Any, scope_values: dict[str, Any], at: int
+) -> dict[str, Any]:
+ def invalid(detail: str) -> Finding:
+ return Finding("calculation-invalid", f"{source.name}: {detail}")
+
+ answer = value.get("calculation") if isinstance(value, dict) else None
+ if not isinstance(answer, dict) or set(answer) != {"calculator", "status", "inputs", "asOf"}:
+ raise invalid("the value read has no calculation of its form")
+ if not isinstance(answer["calculator"], dict) or set(answer["calculator"]) != {"name", "version"}:
+ raise invalid("calculator is not of its form")
+ if answer["status"] not in ("computed", "input-missing", "cannot-compute"):
+ raise invalid("status of another value")
+ if not isinstance(answer["inputs"], dict) or not isinstance(answer["asOf"], dict):
+ raise invalid("inputs and asOf are objects")
+ if not json_equal(answer["calculator"], profile["calculator"]):
+ raise invalid("the calculator is not the profile's")
+ assert source.calculation is not None
+ bound, tables = source.calculation["inputs"], source.calculation["tables"]
+ for name, echoed in answer["inputs"].items():
+ if name not in bound:
+ raise invalid("an input echoed that is not bound")
+ try:
+ same = canon(echoed) == canon(scope_values[bound[name]])
+ except OutsideDomain:
+ same = False
+ if not same:
+ raise invalid("an input echoed that is not its parameter's value")
+ for name, as_of in answer["asOf"].items():
+ if name not in tables or instant(as_of) is None:
+ raise invalid("a table reported that is not named, or with no instant")
+ if answer["status"] == "computed":
+ if set(bound) - set(answer["inputs"]):
+ raise invalid("a bound input not echoed")
+ for name, limit in tables.items():
+ if name not in answer["asOf"]:
+ raise invalid("a named table not reported")
+ seconds = instant(answer["asOf"][name])
+ assert seconds is not None
+ if not at - integer_of(limit) <= seconds <= at + 30:
+ raise invalid("a table older than its limit, or in the future")
+ return answer
+
+
+# ---------------------------------------------------------------------------------------------
+# Recomputing a preparation (§§3-9)
+
+
+@dataclass
+class Outcome:
+ name: str
+ source: Source | None # None for the case
+ read: Read
+ klass: str
+ generated: bool
+ parameters: dict[str, Any]
+ skipped: bool = False
+ request: Any = None
+ receipt: dict[str, Any] | None = None
+ claim: dict[str, Any] | None = None
+ answer: dict[str, Any] | None = None # a calculator's calculation, as answered
+ # of an acquired `research` source: its citations, each retained response's in order and then the
+ # record's own when it has one (§9.1, §9.3); and the research record itself, for a later
+ # reconciliation (§6.4)
+ citations: list[dict[str, Any]] | None = None
+ record: Any = None
+
+
+@dataclass
+class Computation:
+ preparation: dict[str, Any]
+ outcomes: list[Outcome]
+ facts: dict[str, Any]
+ evidence: dict[str, Any]
+
+
+def recompute(
+ dialect: Dialect,
+ case: Any,
+ acquisitions: dict[str, Any],
+ profiles: dict[str, dict[str, Any]],
+ verified_at: str,
+) -> Computation:
+ at = instant(verified_at)
+ assert at is not None
+ # 1. profile-mismatch
+ for source in dialect.sources:
+ if source.research is not None:
+ research_mismatch(source, profiles, acquisitions.get(source.name))
+ continue
+ profile = profiles.get(source.profile_id)
+ if profile is None or digest_of(canon(profile)) != source.profile_digest:
+ raise Finding("profile-mismatch", f"{source.name}: no trusted profile of that id and digest")
+ # This reader refuses web in §11's kind phase; every other non-research kind is ineligible.
+ if "endpointScope" in profile:
+ raise Finding("profile-mismatch", f"{source.name}: endpointScope needs a page binding")
+ # §4.4: a profile the binding document names serves the unbound source's shape and record.
+ catalog = dialect.bound_from.get(source.name)
+ if catalog is not None and (profile["shape"], profile["adapter"]["name"]) != catalog:
+ raise Finding("profile-mismatch", f"{source.name}: bound to a profile of another shape or record")
+ misfit = request_misfit(source, profile)
+ if misfit is not None:
+ raise Finding("profile-mismatch", f"{source.name}: {misfit}")
+ if ("calculator" in profile) != (source.calculation is not None):
+ raise Finding("profile-mismatch", f"{source.name}: calculation and calculator disagree")
+ # 2. parameter-invalid, the case's first
+ case_values: dict[str, Any] = {}
+ for name, parameter in dialect.case_parameters.items():
+ found = resolve(case, parameter.pointer)
+ if found is ABSENT or not of_type(found, parameter.type):
+ raise Finding("parameter-invalid", f"case parameter {name}")
+ case_values[name] = found
+
+ outcomes: list[Outcome] = []
+ case_scope = dict(case_values)
+ case_scope["runAt"] = verified_at
+ case_outcome = Outcome("case", None, dialect.case_read, "asserted", False, case_scope)
+ case_outcome.claim = copy_claim(dialect.case_read.copy or {}, case)
+ outcomes.append(case_outcome)
+
+ receipts: list[dict[str, Any]] = []
+ for source in dialect.sources:
+ profile = profiles[source.profile_id]
+ values = dict(case_values)
+ skipped = False
+ generated = profile["class"] == "generated"
+ for name, parameter in source.parameters.items():
+ origin = next(o for o in outcomes if o.name == parameter.origin)
+ generated = generated or origin.generated
+ if origin.skipped or origin.claim is None or origin.claim["acquisitionStatus"] != "resolved":
+ skipped = True
+ continue
+ found = resolve(origin.claim["facts"], parameter.pointer)
+ if found is ABSENT:
+ skipped = True
+ continue
+ if not of_type(found, parameter.type):
+ raise Finding("parameter-invalid", f"{source.name} parameter {name}")
+ values[name] = found
+ values["runAt"] = verified_at
+ outcome = Outcome(source.name, source, source.read, profile["class"], generated, values)
+ outcomes.append(outcome)
+ if skipped:
+ outcome.skipped = True
+ if source.name in acquisitions:
+ raise Finding("acquisition-unexpected", source.name)
+ outcome.claim = {
+ "acquisitionStatus": "unknown",
+ "basis": [],
+ "evidenceAvailability": {},
+ "facts": {},
+ "reason": "dependency-unavailable",
+ }
+ continue
+ if source.name not in acquisitions:
+ raise Finding("acquisition-missing", source.name)
+ response = acquisitions[source.name]["response"]
+ if source.research is not None:
+ acquire_research(source, outcome, response, profiles, receipts, at)
+ outcome.claim = research_claim(source, outcome, outcomes)
+ continue
+ outcome.request = instantiate(source.template, values)
+ check_acquisition(source, profile, response, outcome.request, at)
+ outcome.receipt = response["receipt"]
+ receipts.append(response["receipt"])
+ if not sessions_in_a_form(receipts):
+ raise Finding("acquisition-sessions", source.name)
+ value = apply_unwrap(response["result"], source.read.unwrap)
+ if source.calculation is not None:
+ outcome.answer = check_calculation(source, profile, value, values, at)
+ if outcome.answer["status"] != "computed":
+ outcome.claim = {
+ "facts": {},
+ "evidenceAvailability": {r: "unknown" for r in source.read.evidence_targets},
+ "acquisitionStatus": "unknown",
+ "reason": "calculation-" + outcome.answer["status"],
+ "basis": ["/calculation/status"],
+ }
+ continue
+ if source.read.copy is not None:
+ outcome.claim = copy_claim(source.read.copy, value)
+ else:
+ assert source.read.rule is not None
+ outcome.claim = rule_claim(source.read.rule, value, values)
+ named = {s.name for s in dialect.sources}
+ for name in acquisitions:
+ if name not in named:
+ raise Finding("acquisition-unexpected", f"{name} names no source")
+
+ # 4. admission-refused
+ for outcome in outcomes:
+ for kind, targets in (("fact", outcome.read.fact_targets), ("evidence", outcome.read.evidence_targets)):
+ for target in targets:
+ admitted = dialect.admits.get((kind, target), ["asserted", "record"])
+ if outcome.klass not in admitted or (outcome.generated and "generated" not in admitted):
+ raise Finding("admission-refused", f"{outcome.name} {target}")
+
+ return build(dialect, outcomes, verified_at)
+
+
+def research_mismatch(source: Source, profiles: dict[str, dict[str, Any]], member: Any) -> None:
+ """§4.4, §5.1, finding 1: a research source's AI profile, then its web profiles in `search`, `page`
+ order, then each retained response's profile in `R.responses` order. Each assigned profile is the
+ trusted one of its id and digest, of class `generated`, declaring the capability it serves and, when
+ it declares a model, the source's; the AI profile declares the model. A retained response names one
+ of the source's assignments."""
+ research = source.research
+ assert research is not None
+
+ def assigned(pid: str, digest: str, capability: str) -> None:
+ profile = profiles.get(pid)
+ if profile is None or digest_of(canon(profile)) != digest:
+ raise Finding("profile-mismatch", f"{source.name}: no trusted profile {pid} of that digest")
+ if profile["class"] != "generated":
+ raise Finding("profile-mismatch", f"{source.name}: {pid} is not of class generated")
+ declaration = profile.get("research")
+ if declaration is None or capability not in declaration["capabilities"]:
+ raise Finding("profile-mismatch", f"{source.name}: {pid} does not declare {capability}")
+ if declaration.get("model", research.model) != research.model:
+ raise Finding("profile-mismatch", f"{source.name}: {pid} declares another model")
+
+ assigned(source.profile_id, source.profile_digest, "answer")
+ for capability in WEB_CAPABILITIES:
+ if capability in research.web:
+ assigned(*research.web[capability], capability)
+ pairs = {(source.profile_id, source.profile_digest), *research.web.values()}
+ if member is None:
+ return
+ for index, retained in enumerate(member["response"]["result"]["responses"]):
+ reference = retained["profile"]
+ profile = profiles.get(reference["id"])
+ if profile is None or digest_of(canon(profile)) != reference["digest"]:
+ raise Finding("profile-mismatch", f"{source.name}: retained response {index} names no trusted profile")
+ if (reference["id"], reference["digest"]) not in pairs or profile["class"] != "generated":
+ raise Finding("profile-mismatch", f"{source.name}: retained response {index} names no assignment")
+
+
+def research_request(source: Source, values: dict[str, Any]) -> dict[str, Any]:
+ """§4.3: the source's request, exactly its recipe's members, `question` instantiated."""
+ assert source.research is not None
+ return {"question": instantiate(source.research.question, values), **source.research.request}
+
+
+def acquire_research(
+ source: Source,
+ outcome: Outcome,
+ response: dict[str, Any],
+ profiles: dict[str, dict[str, Any]],
+ receipts: list[dict[str, Any]],
+ at: int,
+) -> None:
+ """§5.2, §11, finding 3 for a `research` source: each retained response in `R.responses` order, its
+ checks completed before the next's, under its own trusted profile and over its own request; the
+ record in the canon domain; then the record's own receipt, when it has one, under the source's
+ profile and over the source's request. Every receipt joins the preparation's sessions in that order."""
+ outcome.request = research_request(source, outcome.parameters)
+ record = response["result"]
+ citations: list[dict[str, Any]] = []
+ for index, retained in enumerate(record["responses"]):
+ if "result" not in retained:
+ raise Finding("acquisition-missing", f"{source.name}: retained response {index} has no result")
+ check_acquisition(source, profiles[retained["profile"]["id"]], retained, retained["request"], at)
+ receipts.append(retained["receipt"])
+ if not sessions_in_a_form(receipts):
+ raise Finding("acquisition-sessions", f"{source.name}: retained response {index}")
+ citations.append(citation(retained["receipt"]))
+ if not in_canon_domain(record):
+ raise Finding("acquisition-invalid", f"{source.name}: the research record is outside the canon domain")
+ if "receipt" in response:
+ check_acquisition(source, profiles[source.profile_id], response, outcome.request, at)
+ receipts.append(response["receipt"])
+ if not sessions_in_a_form(receipts):
+ raise Finding("acquisition-sessions", f"{source.name}: the research record's own receipt")
+ outcome.receipt = response["receipt"]
+ citations.append(citation(response["receipt"]))
+ outcome.citations = citations
+ outcome.record = record
+
+
+def research_claim(source: Source, outcome: Outcome, outcomes: list[Outcome]) -> dict[str, Any]:
+ """§4.3, §6.4: a plain research read applies to `R`; a reconciliation to `{"current": C, "sources":
+ U}`, each earlier source it names that was acquired holding its record, a skipped one absent, the
+ whole held to the nesting bound before the rule applies."""
+ read = source.read
+ if read.sources is None:
+ value = apply_unwrap(outcome.record, read.unwrap)
+ else:
+ earlier = {o.name: o for o in outcomes}
+ value = {
+ "current": outcome.record,
+ "sources": {name: earlier[name].record for name in read.sources if not earlier[name].skipped},
+ }
+ if value_depth(value) > MAX_VALUE_DEPTH:
+ raise Refused("input-over-bound", f"{source.name}: the combined value nests more than 32 levels")
+ if read.copy is not None:
+ return copy_claim(read.copy, value)
+ assert read.rule is not None
+ return rule_claim(read.rule, value, outcome.parameters)
+
+
+def citation(receipt: dict[str, Any]) -> dict[str, Any]:
+ return {name: receipt[name] for name in ("callIndex", "sessionId", "signature")}
+
+
+def read_digest(read: Read) -> str:
+ return digest_of(canon(read.as_written))
+
+
+def calculation_lineage(dialect: Dialect, outcome: Outcome) -> dict[str, Any]:
+ """§7: the calculation member of a calculated source's entries."""
+ assert outcome.source is not None and outcome.source.calculation is not None
+ assert outcome.answer is not None
+ bound = outcome.source.calculation["inputs"]
+ inputs = []
+ for name in sorted(outcome.answer["inputs"]):
+ parameter_name = bound[name]
+ parameter = outcome.source.parameters.get(parameter_name)
+ if parameter is None:
+ parameter = dialect.case_parameters[parameter_name]
+ inputs.append(
+ {"name": name, "parameter": parameter_name, "source": parameter.origin, "pointer": parameter.pointer}
+ )
+ return {
+ "calculator": outcome.answer["calculator"],
+ "status": outcome.answer["status"],
+ "asOf": outcome.answer["asOf"],
+ "inputs": inputs,
+ }
+
+
+def build(dialect: Dialect, outcomes: list[Outcome], verified_at: str) -> Computation:
+ # §9.1: in versions 2 and 3 alike, `cites` is ordered by `callIndex`, those of one index in the order
+ # of `sources`, as the Runner writes it; in a preparation with a `research` source, in the order of
+ # `sources` instead, a research source adding its every citation in order, each other acquired source
+ # its one.
+ if any(source.research is not None for source in dialect.sources):
+ cites = []
+ for outcome in outcomes:
+ if outcome.citations is not None:
+ cites.extend(outcome.citations)
+ elif outcome.receipt is not None:
+ cites.append(citation(outcome.receipt))
+ else:
+ cites_order = []
+ for position, outcome in enumerate(outcomes):
+ if outcome.receipt is not None:
+ cites_order.append((integer_of(outcome.receipt["callIndex"]), position, citation(outcome.receipt)))
+ cites_order.sort(key=lambda item: (item[0], item[1]))
+ cites = [entry for _, _, entry in cites_order]
+
+ lineage = []
+ out_outcomes = []
+ facts_document: dict[str, Any] = {}
+ evidence_document: dict[str, Any] = {}
+ for outcome in outcomes:
+ assert outcome.claim is not None
+ claim = outcome.claim
+ status = claim["acquisitionStatus"]
+ reason = claim["reason"]
+ entry_outcome: dict[str, Any] = {
+ "name": outcome.name,
+ "parameters": dict(outcome.parameters),
+ "claim": claim,
+ "status": status,
+ "reason": reason,
+ }
+ if outcome.request is not None:
+ entry_outcome["arguments"] = outcome.request
+ out_outcomes.append(entry_outcome)
+ for kind, targets in (
+ ("fact", sorted(outcome.read.fact_targets)),
+ ("evidence", sorted(outcome.read.evidence_targets)),
+ ):
+ for target in targets:
+ if kind == "fact":
+ present = resolve(claim["facts"], target) is not ABSENT
+ else:
+ present = target in claim["evidenceAvailability"]
+ entry: dict[str, Any] = {
+ "source": outcome.name,
+ "kind": kind,
+ "target": target,
+ "class": outcome.klass,
+ "generatedInfluence": outcome.generated,
+ "present": present,
+ "status": status,
+ "reason": reason,
+ "basis": list(claim["basis"]),
+ "readDigest": read_digest(outcome.read),
+ }
+ if outcome.source is not None and outcome.source.parameters:
+ entry["dependencies"] = [
+ {"parameter": name, "source": parameter.origin,
+ "pointer": parameter.pointer}
+ for name, parameter in sorted(outcome.source.parameters.items())
+ ]
+ candidates = sorted(set(outcome.read.candidates.get((kind, target), [])))
+ if candidates:
+ entry["candidateFrom"] = candidates
+ if outcome.receipt is not None:
+ entry["receipt"] = citation(outcome.receipt)
+ # §9.3, version 3: an acquired research source's citations, in the order `cites` has them
+ if outcome.citations is not None:
+ entry["receipts"] = list(outcome.citations)
+ if outcome.answer is not None:
+ entry["calculation"] = calculation_lineage(dialect, outcome)
+ lineage.append(entry)
+ if kind == "fact" and present:
+ write_at(facts_document, target, resolve(claim["facts"], target))
+ if kind == "evidence" and present:
+ evidence_document[target] = claim["evidenceAvailability"][target]
+ preparation = {
+ "version": dialect.version,
+ "verifiedAt": verified_at,
+ # the dialect digest (§2); of a dialect with an unbound source, the bound dialect's (§4.4)
+ "mappingDigest": digest_of(canon(dialect.document)),
+ "verification": VERIFICATION,
+ "cites": cites,
+ "lineage": lineage,
+ "outcomes": out_outcomes,
+ }
+ return Computation(preparation, outcomes, facts_document, evidence_document)
+
+
+# ---------------------------------------------------------------------------------------------
+# The record (§11)
+
+
+def _skip_string(text: str, i: int) -> int:
+ assert text[i] == '"'
+ i += 1
+ while text[i] != '"':
+ i += 2 if text[i] == "\\" else 1
+ return i + 1
+
+
+def _skip_value(text: str, i: int) -> int:
+ if text[i] == '"':
+ return _skip_string(text, i)
+ if text[i] in "{[":
+ depth = 0
+ while True:
+ c = text[i]
+ if c == '"':
+ i = _skip_string(text, i)
+ continue
+ if c in "{[":
+ depth += 1
+ elif c in "}]":
+ depth -= 1
+ if depth == 0:
+ return i + 1
+ i += 1
+ while i < len(text) and text[i] not in ",}] \t\r\n":
+ i += 1
+ return i
+
+
+def top_level_members(text: str) -> list[tuple[str, str]]:
+ """Each top-level member's name and its value as the line writes it."""
+ members = []
+ i = 0
+ whitespace = " \t\r\n"
+ while text[i] in whitespace:
+ i += 1
+ assert text[i] == "{"
+ i += 1
+ while True:
+ while text[i] in whitespace:
+ i += 1
+ if text[i] == "}":
+ return members
+ end = _skip_string(text, i)
+ name = json.loads(text[i:end])
+ i = end
+ while text[i] in whitespace:
+ i += 1
+ assert text[i] == ":"
+ i += 1
+ while text[i] in whitespace:
+ i += 1
+ end = _skip_value(text, i)
+ members.append((name, text[i:end]))
+ i = end
+ while text[i] in whitespace:
+ i += 1
+ if text[i] == ",":
+ i += 1
+
+
+@dataclass
+class Record:
+ value: dict[str, Any]
+ binding: bytes | None
+
+
+def read_record(data: bytes) -> Any:
+ """The record read as one line holding one JSON value (§11, the second phase)."""
+ if b"\n" in data or b"\r" in data:
+ raise malformed("the record is not one line")
+ return read_document(data, "the record")
+
+
+# §11: two names differ "but for case" when they are equal once A-Z are mapped to a-z, and nothing
+# else is: ASCII case only, no other folding.
+ASCII_LOWER = str.maketrans("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")
+
+
+def parse_record(data: bytes, value: Any) -> Record:
+ """The record's form (§11, the fourth phase), and its binding as the line writes it."""
+ if not isinstance(value, dict) or not isinstance(value.get("inputs"), dict):
+ raise malformed("the record is not an evaluation record with inputs")
+ binding = None
+ for name, raw in top_level_members(data.decode("utf-8")):
+ if name.translate(ASCII_LOWER) == "binding" and name != "binding":
+ raise malformed("a member named binding but for case")
+ if name == "binding":
+ binding = raw.encode("utf-8")
+ return Record(value, binding)
+
+
+def record_of_export(run: bytes) -> bytes | None:
+ """The record line a Runner export's run.json holds (conformance/dialect/README.md): the bytes
+ `run.auditBytes` holds in standard base64; or, in an export of version 2, which carries no bytes,
+ the member `run.audit`'s value exactly as run.json writes it, with no re-encoding (§11). None when
+ it holds neither."""
+ document = read_document(run, "run.json")
+ if not isinstance(document, dict) or not isinstance(document.get("run"), dict):
+ return None
+ held = dict(top_level_members(dict(top_level_members(run.decode("utf-8")))["run"]))
+ if "auditBytes" in held:
+ return base64.b64decode(json.loads(held["auditBytes"]), validate=True)
+ if "audit" in held:
+ return held["audit"].encode("utf-8")
+ return None
+
+
+# ---------------------------------------------------------------------------------------------
+# The reading (§11)
+
+
+def unsigned_parameters(dialect: Dialect, computation: Computation) -> list[dict[str, Any]]:
+ entries: dict[str, dict[str, Any]] = {}
+ ordered = []
+ for outcome in computation.outcomes[1:]:
+ source = outcome.source
+ assert source is not None
+ if outcome.skipped or source.read.rule is None:
+ continue
+ if outcome.answer is not None and outcome.answer["status"] != "computed":
+ continue
+ targets = len(source.read.fact_targets) + len(source.read.evidence_targets)
+ if not targets:
+ continue
+ named: set[str] = set()
+
+ def walk(condition: dict[str, Any]) -> None:
+ op = condition["op"]
+ if op == "equalsParam":
+ named.add(condition["param"])
+ elif op == "freshWithin":
+ named.update((condition["asOf"], condition["maxAge"]))
+ elif op in ("all", "any"):
+ for c in condition["of"]:
+ walk(c)
+ elif op == "not":
+ walk(condition["of"])
+
+ for clause in source.read.rule["clauses"]:
+ walk(clause["when"])
+ if source.research is not None:
+ # §11: a research source's own acquisition commits what its request commits only under the
+ # record's own receipt, the one receipt over the source's request (§5.2).
+ committed, ambiguous = commits(source.research.question)
+ if outcome.receipt is None:
+ committed = set()
+ else:
+ committed, ambiguous = commits(source.template)
+ if outcome.answer is not None and source.calculation is not None:
+ for name in outcome.answer["inputs"]:
+ committed.add(source.calculation["inputs"][name])
+ listed = []
+ for name in sorted(named - committed):
+ if name == "runAt":
+ listed.append({"name": name, "kind": "runAt"})
+ continue
+ parameter = source.parameters.get(name)
+ if parameter is None:
+ kind = "case"
+ else:
+ upstream = entries.get(parameter.origin)
+ if upstream is None:
+ continue
+ kinds = {p["kind"] for p in upstream["parameters"]}
+ if kinds & {"case", "local-file", "upstream", "ambiguous-text"}:
+ kind = "upstream"
+ else:
+ kind = "upstream-runAt"
+ if kind in ("case", "local-file", "upstream") and name in ambiguous:
+ kind = "ambiguous-text"
+ listed.append({"name": name, "kind": kind})
+ if listed:
+ entry = {"source": source.name, "parameters": listed, "targets": targets}
+ entries[source.name] = entry
+ ordered.append(entry)
+ return ordered
+
+
+def unsigned_freshness(computation: Computation, verified_at: str) -> dict[str, Any] | None:
+ sources = []
+ for outcome in computation.outcomes[1:]:
+ # each source acquired: a research source too, whether or not its record has a receipt of its own
+ if outcome.skipped or (outcome.receipt is None and outcome.citations is None):
+ continue
+ checks = ["acquisition"]
+ if outcome.answer is not None and outcome.answer["status"] == "computed":
+ checks.append("calculation")
+ targets = len(outcome.read.fact_targets) + len(outcome.read.evidence_targets)
+ sources.append({"source": outcome.name, "checks": checks, "targets": targets})
+ if not sources:
+ return None
+ return {"against": "preparation.verifiedAt", "verifiedAt": verified_at, "sources": sources}
+
+
+def as_plain(value: Any) -> Any:
+ """A value with each number as Python reads it, for comparison and printing."""
+ if isinstance(value, Num):
+ return int(value.literal) if value.is_integer() else float(value.value)
+ if isinstance(value, dict):
+ return {name: as_plain(member) for name, member in value.items()}
+ if isinstance(value, list):
+ return [as_plain(item) for item in value]
+ return value
+
+
+@dataclass
+class Verification:
+ answer: dict[str, Any]
+ preparation: bytes | None = None
+ digest: str | None = None
+ facts: Any = None
+ evidence: Any = None
+
+
+def verify(
+ dialect: bytes,
+ case: bytes,
+ acquisitions: bytes,
+ profiles: bytes,
+ preparation: bytes,
+ record: bytes | None = None,
+ require_binding: bool = False,
+ binding: bytes | None = None,
+) -> Verification:
+ """§11: a refusal, a finding, or a reading. `binding` is the binding document of a dialect with an
+ unbound source (§4.4), and None when none is given."""
+ result = Verification(answer={})
+ try:
+ if len(dialect) > DIALECT_BYTES or len(dialect) + len(case) + len(acquisitions) > ENVELOPE_BYTES:
+ raise Refused("input-over-bound", "the dialect, case and acquisitions")
+ if len(profiles) > PROFILES_BYTES:
+ raise Refused("input-over-bound", "the profiles")
+ if binding is not None and len(binding) > BINDING_BYTES:
+ raise Refused("input-over-bound", "the binding document")
+ if len(preparation) > PREPARATION_BYTES or (record is not None and len(record) > RECORD_BYTES):
+ raise Refused("input-over-bound", "the preparation or the record")
+ # §11's phases, in order: the bounds measured on bytes, on every document before any is
+ # read; every document read; the counted bounds; every form; the kinds; and only then the
+ # recomputation.
+ documents = [
+ (dialect, "the dialect", MAX_DOCUMENT_DEPTH),
+ (case, "the case", MAX_VALUE_DEPTH),
+ (acquisitions, "the acquisitions", MAX_DOCUMENT_DEPTH),
+ (profiles, "the profiles", MAX_DOCUMENT_DEPTH),
+ (preparation, "the preparation", MAX_DOCUMENT_DEPTH),
+ ]
+ if record is not None:
+ documents.append((record, "the record", MAX_DOCUMENT_DEPTH))
+ if binding is not None:
+ documents.append((binding, "the binding document", MAX_DOCUMENT_DEPTH))
+ for data, what, depth in documents:
+ measure(data, what, depth)
+ dialect_document = read_document(dialect, "the dialect")
+ case_document = read_document(case, "the case", MAX_VALUE_DEPTH)
+ acquisitions_document = read_document(acquisitions, "the acquisitions")
+ profiles_document = read_document(profiles, "the profiles")
+ given = read_document(preparation, "the preparation")
+ record_document = read_record(record) if record is not None else None
+ binding_document = read_document(binding, "the binding document") if binding is not None else None
+ count_bounds(dialect_document, acquisitions_document, profiles_document, binding_document)
+ # §11, the fourth phase: a dialect of a version this reader does not read is refused before any
+ # form is checked. It reads both versions the text defines, 2 and 3.
+ if isinstance(dialect_document, dict) and is_integer(dialect_document.get("version")):
+ version = integer_of(dialect_document["version"])
+ if version in DEFINED_VERSIONS and version not in READ_VERSIONS:
+ raise Refused("version-unread", f"dialect version {version} is not read by this reader")
+ parsed_record = parse_record(record, record_document) if record is not None else None
+ if not isinstance(acquisitions_document, dict):
+ raise malformed("the acquisitions are not an object")
+ if not isinstance(given, dict) or instant(given.get("verifiedAt")) is None:
+ raise malformed("the preparation's verifiedAt is not a timestamp with an instant")
+ trusted = parse_profiles(profiles_document)
+ parsed_dialect = read_bound(parse_dialect(dialect_document), binding_document, binding is not None)
+ # Each acquisition's form is its source's kind's: a research record's answers are held to the
+ # source's declarations (§4.3, §5.2).
+ research = {s.name: s.research for s in parsed_dialect.sources if s.research is not None}
+ for name, member in acquisitions_document.items():
+ check_acquisition_form(name, member, research.get(name))
+ # §11, the sixth phase, once every form is checked: a kind this reader does not read.
+ if parsed_dialect.unread:
+ raise Refused("kind-unread", f"{parsed_dialect.unread[0]} is defined and not read by this reader")
+ verified_at = given["verifiedAt"]
+
+ computation = recompute(parsed_dialect, case_document, acquisitions_document, trusted, verified_at)
+ result.preparation = preparation_bytes(computation.preparation)
+ result.digest = digest_of(result.preparation)
+ result.facts = as_plain(computation.facts)
+ result.evidence = as_plain(computation.evidence)
+ try:
+ given_bytes = preparation_bytes(given)
+ except OutsideDomain:
+ given_bytes = None
+ if given_bytes != result.preparation:
+ raise Finding("preparation-differs")
+ binding = "not-checked"
+ if parsed_record is not None:
+ inputs = parsed_record.value["inputs"]
+ record_cites = parsed_record.value.get("cites", [])
+ cites = computation.preparation["cites"]
+ # As sets: a citation either side gives twice is one member, and how many times one is
+ # given is not compared (§11, finding 6).
+ same_cites = (
+ isinstance(record_cites, list)
+ and all(any(json_equal(a, b) for b in cites) for a in record_cites)
+ and all(any(json_equal(a, b) for b in record_cites) for a in cites)
+ )
+ if (
+ not json_equal(inputs.get("facts", ABSENT), computation.facts)
+ or not json_equal(inputs.get("evidence", ABSENT), computation.evidence)
+ or not same_cites
+ ):
+ raise Finding("record-inputs-differ")
+ if parsed_record.binding is None:
+ binding = "absent"
+ else:
+ member = parsed_record.value["binding"]
+ if not (isinstance(member, dict) and member.get("kind") == BINDING_KIND):
+ raise Finding("binding-foreign-kind")
+ if parsed_record.binding != binding_of(result.digest):
+ raise Finding("binding-mismatch")
+ binding = "matches"
+ if require_binding and binding != "matches":
+ raise Finding("unbound")
+ counts = {"asserted": 0, "record": 0, "generated": 0}
+ for entry in computation.preparation["lineage"]:
+ counts[entry["class"]] += 1
+ reading: dict[str, Any] = {
+ "digest": result.digest,
+ "binding": binding,
+ "facts": computation.facts,
+ "evidence": computation.evidence,
+ "targetsByClass": counts,
+ }
+ parameters = unsigned_parameters(parsed_dialect, computation)
+ if parameters:
+ reading["unsignedParameters"] = parameters
+ freshness = unsigned_freshness(computation, verified_at)
+ if freshness:
+ reading["unsignedFreshness"] = freshness
+ result.answer = {"reading": reading}
+ except Refused as refusal:
+ result.answer = {"refused": refusal.name, "detail": str(refusal)}
+ except Finding as finding:
+ result.answer = {"finding": finding.name, "detail": str(finding)}
+ return result
+
+
+def report(answer: dict[str, Any]) -> dict[str, Any]:
+ """§11, the report: one object whose `result` is `reading`, `refusal` or `finding`, with exactly
+ the members that form carries."""
+ if "reading" in answer:
+ return {"result": "reading", **answer["reading"]}
+ if "finding" in answer:
+ return {"result": "finding", "finding": answer["finding"]}
+ return {"result": "refusal", "refusal": answer["refused"]}
+
+
+# §11: a program exits 0 for a reading, 1 for a refusal, 2 for a finding, and 3 when it could not run.
+EXIT_STATUS = {"reading": 0, "refusal": 1, "finding": 2}
+COULD_NOT_RUN = 3
+
+
+class _Arguments(argparse.ArgumentParser):
+ def exit(self, status: int = 0, message: str | None = None) -> NoReturn:
+ # argparse leaves by this door when no reading was run, for its help or for an argument it
+ # does not take; §11 gives that one status, not argparse's 0 or 2, which are a reading's and
+ # a finding's.
+ super().exit(COULD_NOT_RUN, message)
+
+
+def main(argv: list[str] | None = None) -> int:
+ parser = _Arguments(description=__doc__.splitlines()[0])
+ parser.add_argument("--dialect", required=True, type=Path)
+ parser.add_argument("--case", required=True, type=Path)
+ parser.add_argument("--acquisitions", type=Path, help="absent: no acquisitions, {}")
+ parser.add_argument("--profiles", required=True, type=Path)
+ parser.add_argument("--preparation", required=True, type=Path)
+ parser.add_argument("--binding", type=Path, help="the binding document of a dialect with an unbound source")
+ parser.add_argument("--record", type=Path, help="one record line, without its newline")
+ parser.add_argument("--require-binding", action="store_true")
+ arguments = parser.parse_args(argv)
+ try:
+ documents = (
+ arguments.dialect.read_bytes(),
+ arguments.case.read_bytes(),
+ arguments.acquisitions.read_bytes() if arguments.acquisitions else b"{}",
+ arguments.profiles.read_bytes(),
+ arguments.preparation.read_bytes(),
+ arguments.record.read_bytes() if arguments.record else None,
+ )
+ binding = arguments.binding.read_bytes() if arguments.binding else None
+ outcome = verify(*documents, arguments.require_binding, binding)
+ answer = report(outcome.answer)
+ line = preparation_bytes(answer) + b"\n"
+ except Exception as error: # a file it cannot open, or a fault of its own: never 1 or 2
+ print(f"dialect_verify: could not run: {error!r}", file=sys.stderr)
+ return COULD_NOT_RUN
+ sys.stdout.buffer.write(line)
+ sys.stdout.flush()
+ if "detail" in outcome.answer:
+ print(f"dialect_verify: {outcome.answer['detail']}", file=sys.stderr)
+ return EXIT_STATUS[answer["result"]]
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/internal/policy/official_test.go b/internal/policy/official_test.go
new file mode 100644
index 00000000..c7c055df
--- /dev/null
+++ b/internal/policy/official_test.go
@@ -0,0 +1,133 @@
+package policy
+
+import (
+ "bytes"
+ "io/fs"
+ "reflect"
+ "strings"
+ "testing"
+ "testing/fstest"
+
+ "github.com/Judgment-Pack/judgment-pack-runtime/internal/artifacts"
+)
+
+func officialRead(t *testing.T, name string) []byte {
+ t.Helper()
+ raw, err := official.ReadFile("official/" + name)
+ if err != nil {
+ t.Fatal(err)
+ }
+ return raw
+}
+
+func TestOfficialDraftProvenanceAndTampering(t *testing.T) {
+ if err := VerifyOfficialArtifacts(); err != nil {
+ t.Fatal(err)
+ }
+ manifest := mustMap(t, officialRead(t, "provenance.json"))
+ if manifest["sourceRelease"] != DraftRelease || manifest["sourceRevision"] != DraftRevision || manifest["sourceArchiveSHA256"] != "ce9bac7fc4a9e2658146a540966aec1e935e7624ba5a7ad70ff074319078b6b9" || len(array(manifest["files"])) != 387 {
+ t.Fatal("official archive provenance changed")
+ }
+ files := fstest.MapFS{}
+ if err := fs.WalkDir(official, "official", func(name string, d fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if !d.IsDir() {
+ raw, err := official.ReadFile(name)
+ if err != nil {
+ return err
+ }
+ files[name] = &fstest.MapFile{Data: raw}
+ }
+ return nil
+ }); err != nil {
+ t.Fatal(err)
+ }
+ for _, name := range []string{"provenance.json", "schema/policy/1.0.0/policy.schema.json", "conformance/policy/1.0.0/vectors/manifest.json", "conformance/policy/1.0.0/examples/refunds/narrative.txt"} {
+ t.Run(name, func(t *testing.T) {
+ path := "official/" + name
+ original := files[path]
+ files[path] = &fstest.MapFile{Data: append(bytes.Clone(original.Data), '\n')}
+ if err := verifyOfficialArtifacts(files); err == nil {
+ t.Fatal("changed published bytes accepted")
+ }
+ delete(files, path)
+ if err := verifyOfficialArtifacts(files); err == nil {
+ t.Fatal("missing published bytes accepted")
+ }
+ files[path] = original
+ })
+ }
+ files["official/unpublished.json"] = &fstest.MapFile{Data: []byte("{}")}
+ if err := verifyOfficialArtifacts(files); err == nil {
+ t.Fatal("unmanifested source accepted")
+ }
+}
+
+func TestOfficialDraftPromotionPreservesRetainedInputs(t *testing.T) {
+ for _, directory := range []string{"examples", "vectors/documents"} {
+ if err := fs.WalkDir(candidate, "candidate/"+directory, func(name string, d fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+ if d.IsDir() {
+ return nil
+ }
+ relative := strings.TrimPrefix(name, "candidate/")
+ if !bytes.Equal(candidateRead(t, relative), officialRead(t, "conformance/policy/1.0.0/"+relative)) {
+ t.Errorf("promotion rewrote retained input %s", relative)
+ }
+ return nil
+ }); err != nil {
+ t.Fatal(err)
+ }
+ }
+ core, err := artifacts.Load(artifacts.EvaluatorDraftVersion)
+ if err != nil {
+ t.Fatal(err)
+ }
+ raw, err := core.Schema()
+ if err != nil || !bytes.Equal(raw, officialRead(t, "schema/policy/1.0.0/consumer-core-0.2.0-draft.schema.json")) {
+ t.Fatal("official frozen consumer schema differs from unchanged bundled Core")
+ }
+}
+
+func TestOfficialDraftContractAndSchemaIdentities(t *testing.T) {
+ r, exit := ContractFormat("contract", CandidateVersion)
+ if exit != 0 || r.SpecRevision != DraftRevision || r.Specification != DraftURL || r.Profile != "jps-policy-companion" || r.Maturity != "draft" || !r.Experimental || r.Capabilities.FullDocumentConformance || r.Capabilities.ApprovalVerification || r.Capabilities.ExecutionAuthority || r.Capabilities.LiveAuthority || r.Capabilities.NetworkAcquisition {
+ t.Fatal("incorrect official draft contract", r, exit)
+ }
+ if !bytes.Equal(r.CandidateCapabilities, officialRead(t, "conformance/policy/1.0.0/capabilities.json")) || r.CandidateResult != nil || r.Capabilities.ValidationScope != "closed-draft-document-and-local-references" || r.Capabilities.CheckScope != "draft-supplied-exact-bytes-anchors-and-scoped-core-references" {
+ t.Fatal("incorrect capabilities or full-check scope")
+ }
+ for _, kind := range []string{"policy", "governing-adoption"} {
+ schema, exit := Schema("schema", kind, CandidateVersion)
+ if exit != 0 || schema.Resource == nil {
+ t.Fatal(schema, exit)
+ }
+ upstreamID := draftSchemaPrefix + kind + ".schema.json"
+ upstream := mustMap(t, officialRead(t, "schema/policy/1.0.0/"+kind+".schema.json"))
+ derived := mustMap(t, []byte(schema.Resource.Text))
+ if upstream["$id"] != upstreamID || schema.Resource.SourceID != upstreamID || derived["$id"] != "urn:judgmentpack:runtime:experimental-policy:"+DraftRelease+":"+kind+":authoring-schema:1" || strings.Contains(schema.Resource.Text, "urn:jps:proposal:") {
+ t.Fatal("official and derived schema identities confused")
+ }
+ }
+ // Historical reports and source pins stay distinct from the new release.
+ legacy := mustMap(t, mustJSON(t, Contract("contract")))
+ for _, key := range []string{"formatVersion", "candidateCapabilities", "candidateResult", "specRelease"} {
+ if _, present := legacy[key]; present {
+ t.Fatal("prototype report extended", key)
+ }
+ }
+ for _, version := range []string{"1.0", "1.0.0-draft.1", "policy-v1.0.0-draft.1", "2.0.0"} {
+ if _, exit := ContractFormat("contract", version); exit == 0 {
+ t.Fatal("unsupported selector accepted", version)
+ }
+ }
+ old := mustMap(t, candidateRead(t, "capabilities.json"))
+ current := mustMap(t, r.CandidateCapabilities)
+ if old["maturity"] != "proposed-draft" || current["maturity"] != "draft" || reflect.DeepEqual(old, current) {
+ t.Fatal("historical candidate metadata was reclassified")
+ }
+}
diff --git a/internal/policy/schema.go b/internal/policy/schema.go
index e0a15a2d..e0cc1c78 100644
--- a/internal/policy/schema.go
+++ b/internal/policy/schema.go
@@ -61,6 +61,9 @@ func Schema(command, kindName, version string) (Report, int) {
r := report(command)
if version == CandidateVersion {
r = candidateReport(command)
+ if err := VerifyOfficialArtifacts(); err != nil {
+ return refused(r, "JPS-POLICY-ARTIFACT", "", "The pinned official draft resources failed verification.", result.ExitIO)
+ }
}
if code, path, message := selector(kindName, version); code != 0 {
return refused(r, "JPS-POLICY-SELECTOR", path, message, code)
@@ -90,7 +93,8 @@ func Schema(command, kindName, version string) (Report, int) {
doc["$id"] = "urn:judgmentpack:runtime:experimental-policy:" + version + ":" + kindName + ":authoring-schema:1"
doc["$comment"] = "Runtime self-contained editing copy of non-normative RFC 0023 prototype at Spec commit " + revision + ". Use experimental policy validate/check; schema acceptance grants no approval, execution authority or conformance."
if version == CandidateVersion {
- doc["$comment"] = "Runtime self-contained editing copy of proposed-draft, unadopted Policy contract candidate at Spec commit " + revision + ". Schema acceptance establishes no authority or conformance."
+ doc["$id"] = "urn:judgmentpack:runtime:experimental-policy:" + DraftRelease + ":" + kindName + ":authoring-schema:1"
+ doc["$comment"] = "Runtime self-contained editing copy of " + draftSchemaPrefix + kindName + ".schema.json from " + DraftRelease + " at Spec commit " + revision + ". The source resource retains its immutable HTTPS identity; this derived copy has a Runtime URN. Schema acceptance establishes no authority or conformance."
}
text, err := json.MarshalIndent(doc, "", " ")
if err != nil {
@@ -99,6 +103,9 @@ func Schema(command, kindName, version string) (Report, int) {
r.Status = "available"
r.Kind = kindName
r.Resource = &Resource{Name: kindName + ".schema.json", MediaType: "application/schema+json", Text: string(text) + "\n"}
+ if version == CandidateVersion {
+ r.Resource.SourceID = draftSchemaPrefix + kindName + ".schema.json"
+ }
return r, result.ExitSuccess
}
func rewriteRefs(value any, from, to string) {
diff --git a/internal/releasecheck/check.go b/internal/releasecheck/check.go
index 3254d56c..58dfea80 100644
--- a/internal/releasecheck/check.go
+++ b/internal/releasecheck/check.go
@@ -7,6 +7,7 @@ import (
"strings"
"github.com/Judgment-Pack/judgment-pack-runtime/internal/artifacts"
+ "github.com/Judgment-Pack/judgment-pack-runtime/internal/policy"
)
const specificationRepository = "https://github.com/Judgment-Pack/judgment-pack-spec"
@@ -30,6 +31,9 @@ func CheckEmbedded(tag string) error {
return fmt.Errorf("embedded JPS %s: %w", version, err)
}
}
+ if err := policy.VerifyOfficialArtifacts(); err != nil {
+ return fmt.Errorf("embedded official Policy draft: %w", err)
+ }
return nil
}