# Arxo normative change dossier 0.1 Verifiable dossier of a normative change for the Arxo Change Protocol. Assembled from producer artifacts named by a change set; nothing is executed by the builder. dossierCore is deterministic and dossierCoreHash is the sha256 of its canonical bytes; receipt sits outside the hash. Sections in order: composition (1), differences (3), goals (4), population (6), transition (7), dependents (8), states (9), open (10), guarantees (11). Intent classification (2) is carried inside differences. A dossier proves only what is formalized: the formalization measure and the world boundary are printed in every dossier, and a draft is never presented as law. ## Versions Accepted `schemaVersion`: `law.change-dossier/0.1`. ## Top-level fields | name | type-or-$ref | required | description | |---|---|---|---| | `schemaVersion` | `"law.change-dossier/0.1"` | yes | — | | `changeSetId` | `string` | yes | — | | `changeSetHash` | [`#/$defs/Digest`](#digest) | yes | sha256 of the canonical bytes of the change-set document. | | `dossierCore` | [`#/$defs/DossierCore`](#dossiercore) | yes | — | | `dossierCoreHash` | [`#/$defs/Digest`](#digest) | yes | — | | `receipt` | [`#/$defs/Receipt`](#receipt) | yes | — | ## Enumerations | location | values | |---|---| | `properties/schemaVersion` | `"law.change-dossier/0.1"` | | `$defs/LegalStatus` | `"draft"`, `"adopted"`, `"in-force"`, `"superseded"` | | `$defs/MeasureSide/properties/status` | `"taken"`, `"not-taken"` | | `$defs/SideSummary/properties/kind` | `"edition"`, `"draft"`, `"case-release"` | | `$defs/Composition/properties/kind` | `"draft-amendment"`, `"edition-change"`, `"case-release"` | | `$defs/Composition/properties/units/items/properties/subject` | `"package"`, `"case"` | | `$defs/SemdiffEntry/properties/kind` | `"added"`, `"changed"`, `"removed"` | | `$defs/Classification` | `"expected"`, `"outside-boundary"`, `"observed"`, `"unverified"` | | `$defs/ResultView/properties/kind` | `"proposition"`, `"position-count"`, `"money"`, `"number"`, `"date"`, `"boolean"`, `"text"`, `"value"`, `"structured"`, `"collection"`, `"status"` | | `$defs/Goals/properties/status` | `"evaluated"`, `"absent"` | | `$defs/Population/properties/status` | `"present"`, `"absent"` | | `$defs/Transition/properties/status` | `"declared"`, `"absent"` | | `$defs/InstitutionalDependency/properties/kind` | `"act"`, `"parameter"`, `"database"`, `"registry"`, `"authority"`, `"form"`, `"methodology"`, `"other"` | | `$defs/InstitutionalDependency/properties/provenance` | `"formal"`, `"reviewed"`, `"inferred"` | | `$defs/Dependents/properties/rerun` | `"performed"`, `"not-performed"`, `"not-applicable"` | | `$defs/States/properties/formalization/properties/differential/properties/status` | `"byte-identical"`, `"diverged"`, `"absent"` | | `$defs/States/properties/operational/properties/status` | `"not-tracked"`, `"tracked"` | | `$defs/ChannelState/properties/status` | `"current"`, `"stale"`, `"unknown"` | | `$defs/ComputationEntry/properties/kind` | `"evaluation"`, `"clir"` | | `$defs/ComputationEntry/properties/status` | `"current"`, `"stale"` | | `$defs/ImplementationTask/properties/kind` | `"republish"`, `"repin"`, `"recompute"`, `"supply-fact"`, `"review"`, `"other"` | | `$defs/ImplementationTask/properties/evidence` | `"none"`, `"attested"`, `"verified"` | | `$defs/ObjectionResult/properties/class` | `"expert"`, `"approved-criterion"`, `"binding-decision"` | | `$defs/ObjectionResult/properties/status` | `"open"`, `"accepted"`, `"rejected"`, `"superseded"` | | `$defs/Guarantee/properties/kind` | `"source-correspondence"`, `"semantics-execution"`, `"proofs"`, `"trials"` | | `$defs/Guarantee/properties/status` | `"covered"`, `"partial"`, `"absent"` | | `$defs/Receipt/properties/reproduction/properties/status` | `"reproduced"`, `"not-attempted"`, `"failed"` | ## Raw schema [`https://law.arxo.io/schema/change-dossier.schema.json`](https://law.arxo.io/schema/change-dossier.schema.json) ## `Digest` Type: `string`. ## `Date` Type: `string`. ## `Count` Type: `integer`. ## `LegalStatus` Values: `"draft"`, `"adopted"`, `"in-force"`, `"superseded"`. ## `Measure` Formalization measure of an act: articles by level. Type: `object`. Required: `articles`, `executable`, `interpreted`, `anchored`, `sourceOnly`, `excluded`. | name | type-or-$ref | description | |---|---|---| | `articles` | [`#/$defs/Count`](#count) | — | | `executable` | [`#/$defs/Count`](#count) | — | | `interpreted` | [`#/$defs/Count`](#count) | — | | `anchored` | [`#/$defs/Count`](#count) | — | | `sourceOnly` | [`#/$defs/Count`](#count) | — | | `excluded` | [`#/$defs/Count`](#count) | — | | `note` | `string` | — | ## `MeasureSide` Measure of one side, or an explicit statement why it was not taken. Type: `object`. Required: `status`. | name | type-or-$ref | description | |---|---|---| | `status` | enum (2) | — | | `measure` | [`#/$defs/Measure`](#measure) | — | | `note` | `string` | — | ## `PackageRef` Type: `object`. Required: `name`, `version`. | name | type-or-$ref | description | |---|---|---| | `name` | `string` | — | | `version` | `string` | — | | `contentHash` | [`#/$defs/Digest`](#digest) | — | ## `SideSummary` Type: `object`. Required: `kind`, `label`. | name | type-or-$ref | description | |---|---|---| | `kind` | enum (3) | — | | `label` | `string` | — | | `edition` | `string` | — | | `programHash` | [`#/$defs/Digest`](#digest) | — | | `artifactHash` | [`#/$defs/Digest`](#digest) | — | | `draftUnits` | [`#/$defs/Count`](#count) | — | | `sources` | [`#/$defs/Count`](#count) | — | ## `Composition` Section 1: what is compared, how deep it is formalized, and where the world ends. Type: `object`. Required: `kind`, `legalStatus`, `units`, `measure`, `world`. | name | type-or-$ref | description | |---|---|---| | `kind` | enum (3) | — | | `legalStatus` | [`#/$defs/LegalStatus`](#legalstatus) | — | | `jurisdiction` | `string` | — | | `units` | `array` | — | | `measure` | `object` | — | | `editions` | `object` | Edition axis of an edition-change: the projection date of each side and the lifecycle state of every edition of the root on that date. | | `world` | `object` | — | ## `EditionSide` Type: `object`. Required: `legalTime`, `states`. | name | type-or-$ref | description | |---|---|---| | `legalTime` | [`#/$defs/Date`](#date) | — | | `states` | `array` | — | | `undatedNodes` | [`#/$defs/Count`](#count) | — | ## `SemdiffEntry` Type: `object`. Required: `id`, `kind`, `classification`. | name | type-or-$ref | description | |---|---|---| | `id` | `string` | — | | `kind` | enum (3) | — | | `hashBefore` | [`#/$defs/Digest`](#digest) | — | | `hashAfter` | [`#/$defs/Digest`](#digest) | — | | `classification` | [`#/$defs/Classification`](#classification) | — | ## `Classification` expected: declared in intent and observed; outside-boundary: observed but not declared while an intent exists, or touching the protected scope; observed: observed by at least one scenario, no intent declared; unverified: touched by the diff and executed by no scenario on either side. Values: `"expected"`, `"outside-boundary"`, `"observed"`, `"unverified"`. ## `ScenarioRow` Type: `object`. Required: `name`, `before`, `after`, `outcomeHashBefore`, `outcomeHashAfter`, `classification`. | name | type-or-$ref | description | |---|---|---| | `name` | `string` | — | | `legalTime` | `string` | — | | `before` | `string` | — | | `after` | `string` | — | | `outcomeHashBefore` | [`#/$defs/Digest`](#digest) | — | | `outcomeHashAfter` | [`#/$defs/Digest`](#digest) | — | | `resultHashBefore` | [`#/$defs/Digest`](#digest) | — | | `resultHashAfter` | [`#/$defs/Digest`](#digest) | — | | `resultDeltas` | `array` | — | | `classification` | [`#/$defs/Classification`](#classification) | — | ## `ResultDelta` Type: `object`. Required: `id`, `before`, `after`. | name | type-or-$ref | description | |---|---|---| | `id` | `string` | — | | `before` | anyOf (2) | — | | `after` | anyOf (2) | — | ## `ResultView` Type: `object`. Required: `kind`, `value`. | name | type-or-$ref | description | |---|---|---| | `kind` | enum (11) | — | | `value` | `string` | — | | `unit` | `string` | — | | `sourceType` | `string` | — | | `resultKind` | `string` | — | | `statusFields` | `object` | — | ## `Differences` Section 3 with the intent classification of section 2. Type: `object`. Required: `verdict`, `semanticChange`, `semdiff`, `scenarios`, `classification`, `unobservedTouched`, `uncovered`. | name | type-or-$ref | description | |---|---|---| | `verdict` | `string` | — | | `semanticChange` | `boolean` | — | | `semdiff` | `object` | — | | `scenarios` | `object` | — | | `classification` | `object` | — | | `unobservedTouched` | `array` | Norms touched by the diff that no scenario executed on either side: for them 'outcome unchanged' is absence of observation, not a finding. | | `uncovered` | `object` | — | ## `GoalRow` Type: `object`. Required: `goal`, `before`, `after`, `basisAfter`, `newlyFailingWorlds`, `repairedWorlds`, `counterexamplesAfter`. | name | type-or-$ref | description | |---|---|---| | `goal` | `string` | — | | `before` | `string` | — | | `after` | `string` | — | | `basisAfter` | `boolean` | — | | `newlyFailingWorlds` | `array` | — | | `repairedWorlds` | `array` | — | | `counterexamplesAfter` | [`#/$defs/Count`](#count) | — | ## `Goals` Section 4. Goals are formal properties over outcomes with a recorded basis; policy criteria and empirical hypotheses are not goals and never appear here. Type: `object`. Required: `status`, `rows`, `broken`, `alreadyFailed`. | name | type-or-$ref | description | |---|---|---| | `status` | enum (2) | — | | `verdict` | `string` | — | | `worlds` | [`#/$defs/Count`](#count) | — | | `rows` | `array` | — | | `broken` | `array` | — | | `alreadyFailed` | `array` | — | | `note` | `string` | — | ## `Population` Section 6. Statistics over a weighted bank is not a legal answer in any case. Type: `object`. Required: `status`, `note`. | name | type-or-$ref | description | |---|---|---| | `status` | enum (2) | — | | `reportCoreHash` | [`#/$defs/Digest`](#digest) | — | | `verdict` | `string` | — | | `note` | `string` | — | ## `Transition` Section 7: the commencement regime as read, with its reading decision and status. Type: `object`. Required: `status`. | name | type-or-$ref | description | |---|---|---| | `status` | enum (2) | — | | `general` | [`#/$defs/Date`](#date) | — | | `exceptions` | `array` | — | | `readingDecision` | `string` | — | | `boundaryScenarios` | `array` | Scenarios whose legal time lies on either side of a commencement date, by name. | ## `ConsumerRerun` Type: `object`. Required: `package`, `from`, `to`, `verdict`, `scenarios`, `changed`, `changedRows`. | name | type-or-$ref | description | |---|---|---| | `package` | `string` | — | | `label` | `string` | — | | `from` | [`#/$defs/Date`](#date) | — | | `to` | [`#/$defs/Date`](#date) | — | | `verdict` | `string` | — | | `scenarios` | [`#/$defs/Count`](#count) | — | | `changed` | [`#/$defs/Count`](#count) | — | | `rootEditions` | `object` | — | | `changedRows` | `array` | — | | `calendarSnapshotInjected` | `string` | — | | `concat` | `array` | Packages added beyond the import closure for this rerun (replay as the family runs). | | `health` | [`#/$defs/BankHealth`](#bankhealth) | — | | `note` | `string` | — | ## `BankHealth` Health of the scenario bank on both sides: healthy — results present and no blocking issue; vacuous — no result; blocked — a blocking issue (AMBIGUOUS_CALENDAR, EDITION_NOT_APPLICABLE, rejected input); error — the run failed. 'No change' is evidence only where both sides are healthy. Type: `object`. Required: `scenarios`, `healthyBothSides`, `vacuousBothSides`, `before`, `after`, `issues`. | name | type-or-$ref | description | |---|---|---| | `scenarios` | [`#/$defs/Count`](#count) | — | | `healthyBothSides` | [`#/$defs/Count`](#count) | — | | `vacuousBothSides` | [`#/$defs/Count`](#count) | — | | `before` | [`#/$defs/HealthTally`](#healthtally) | — | | `after` | [`#/$defs/HealthTally`](#healthtally) | — | | `issues` | `object` | — | ## `HealthTally` Type: `object`. Required: `healthy`, `vacuous`, `blocked`, `error`. | name | type-or-$ref | description | |---|---|---| | `healthy` | [`#/$defs/Count`](#count) | — | | `vacuous` | [`#/$defs/Count`](#count) | — | | `blocked` | [`#/$defs/Count`](#count) | — | | `error` | [`#/$defs/Count`](#count) | — | ## `InstitutionalDependency` Type: `object`. Required: `id`, `kind`, `name`, `provenance`, `inWorld`. | name | type-or-$ref | description | |---|---|---| | `id` | `string` | — | | `kind` | enum (8) | — | | `name` | `string` | — | | `provenance` | enum (3) | formal: an import or bridge in the lock; reviewed: named by the text and confirmed by a reviewer; inferred: found by search, not confirmed. Only formal dependencies enter any verdict. | | `basis` | `string` | — | | `inWorld` | `boolean` | — | ## `Dependents` Section 8: packages of the corpus that import the changed package, whether they were re-run against the AFTER state, and the institutional dependencies wider than import with their provenance class. Type: `object`. Required: `consumers`, `rerun`. | name | type-or-$ref | description | |---|---|---| | `consumers` | `array` | — | | `rerun` | enum (3) | — | | `reruns` | `array` | — | | `institutional` | `array` | — | | `institutionalByProvenance` | `object` | — | | `note` | `string` | — | ## `CompositionLegResult` Type: `object`. Required: `label`, `from`, `to`, `scenarios`, `changed`, `verdict`. | name | type-or-$ref | description | |---|---|---| | `label` | `string` | — | | `from` | [`#/$defs/Date`](#date) | — | | `to` | [`#/$defs/Date`](#date) | — | | `scenarios` | [`#/$defs/Count`](#count) | — | | `changed` | [`#/$defs/Count`](#count) | — | | `verdict` | `string` | — | | `changedScenarios` | `array` | — | ## `CompositionResult` Composition of successive changes: transient — changed in some step but not end-to-end (a change that appears and is reverted, visible only stepwise); onlyEndToEnd — changed end-to-end but in no single step (an interaction of steps); inEveryStep — changed in every step. Type: `object`. Required: `steps`, `endToEnd`, `transient`, `onlyEndToEnd`, `inEveryStep`, `note`. | name | type-or-$ref | description | |---|---|---| | `steps` | `array` | — | | `endToEnd` | [`#/$defs/CompositionLegResult`](#compositionlegresult) | — | | `transient` | `array` | — | | `onlyEndToEnd` | `array` | — | | `inEveryStep` | `array` | — | | `note` | `string` | — | ## `CoverageResult` Coverage of the finite product of declared axes by the scenario bank (profile read from the bank). A statement about the bank, not a legal answer. Type: `object`. Required: `axes`, `cells`, `covered`, `coveredCells`, `note`. | name | type-or-$ref | description | |---|---|---| | `axes` | `array` | — | | `cells` | [`#/$defs/Count`](#count) | — | | `covered` | [`#/$defs/Count`](#count) | — | | `coveredCells` | `array` | — | | `scenariosWithoutAxis` | [`#/$defs/Count`](#count) | — | | `note` | `string` | — | ## `States` Section 9: three independent states and the gap between them. 'The act is in force, the model is incomplete' is a regular row, not an error. Type: `object`. Required: `legal`, `formalization`, `operational`, `gap`. | name | type-or-$ref | description | |---|---|---| | `legal` | `object` | — | | `formalization` | `object` | — | | `operational` | `object` | — | | `gap` | `array` | — | ## `ChannelState` Type: `object`. Required: `channel`, `status`. | name | type-or-$ref | description | |---|---|---| | `channel` | `string` | — | | `artifact` | `string` | — | | `shippedArtifactHash` | [`#/$defs/Digest`](#digest) | — | | `shippedSemanticHash` | [`#/$defs/Digest`](#digest) | — | | `shippedSchemaVersion` | `string` | — | | `status` | enum (3) | — | | `formDrift` | `boolean` | The shipped document has another IR form (schemaVersion) than the current one: hashes differ even when norms do not. | | `observedOn` | [`#/$defs/Date`](#date) | — | | `note` | `string` | — | ## `ComputationEntry` Type: `object`. Required: `path`, `kind`, `status`. | name | type-or-$ref | description | |---|---|---| | `path` | `string` | — | | `kind` | enum (2) | — | | `at` | `string` | — | | `programHash` | [`#/$defs/Digest`](#digest) | — | | `artifactHash` | [`#/$defs/Digest`](#digest) | — | | `status` | enum (2) | — | ## `Computations` Index of stored computations that name the changed package: a list to review when the model changes, never a rewrite of their legal fate. Type: `object`. Required: `scanned`, `entries`, `stale`, `current`, `note`. | name | type-or-$ref | description | |---|---|---| | `roots` | `array` | — | | `scanned` | [`#/$defs/Count`](#count) | — | | `entries` | `array` | — | | `stale` | [`#/$defs/Count`](#count) | — | | `current` | [`#/$defs/Count`](#count) | — | | `note` | `string` | — | ## `ImplementationTask` Type: `object`. Required: `addressee`, `kind`, `what`, `basis`, `evidence`. | name | type-or-$ref | description | |---|---|---| | `addressee` | `string` | — | | `kind` | enum (6) | — | | `what` | `string` | — | | `basis` | `string` | — | | `evidence` | enum (3) | Readiness evidence: none until the addressee attests; the dossier never assumes readiness. | ## `Implementation` Section 12: tasks derived from the dossier for those who must implement the change, with readiness evidence. Type: `object`. Required: `tasks`, `note`. | name | type-or-$ref | description | |---|---|---| | `tasks` | `array` | — | | `note` | `string` | — | ## `ReadingDivergence` Type: `object`. Required: `scenario`, `adopted`, `alternative`. | name | type-or-$ref | description | |---|---|---| | `scenario` | `string` | — | | `legalTime` | `string` | — | | `adopted` | `string` | — | | `alternative` | `string` | — | ## `ObjectionResult` Type: `object`. Required: `id`, `scenario`, `class`, `claim`, `status`, `history`. | name | type-or-$ref | description | |---|---|---| | `id` | `string` | — | | `scenario` | `string` | — | | `class` | enum (3) | — | | `claim` | `string` | — | | `source` | `string` | — | | `filedOn` | [`#/$defs/Date`](#date) | — | | `underAdopted` | `string` | Outcome of the objection scenario under the adopted reading. | | `underAlternative` | `string` | — | | `status` | enum (4) | — | | `history` | `array` | — | ## `Adversarial` Section 5: competing readings compared by scenario classes and objections with a class and a recorded history. Entering the bank gives a scenario no legal force. Type: `object`. Required: `note`. | name | type-or-$ref | description | |---|---|---| | `readings` | `object` | — | | `objections` | `array` | — | | `note` | `string` | — | ## `Open` Section 10: what the dossier leaves open. Type: `object`. Required: `unresolvedFindings`, `openQuestions`, `limitations`, `externalGaps`. | name | type-or-$ref | description | |---|---|---| | `unresolvedFindings` | `array` | — | | `openQuestions` | `array` | — | | `limitations` | `array` | — | | `externalGaps` | `array` | — | ## `Guarantee` Type: `object`. Required: `kind`, `status`, `evidence`, `notCovered`. | name | type-or-$ref | description | |---|---|---| | `kind` | enum (4) | — | | `status` | enum (3) | — | | `evidence` | `array` | — | | `notCovered` | `string` | — | ## `DossierCore` Type: `object`. Required: `title`, `composition`, `differences`, `goals`, `population`, `transition`, `dependents`, `states`, `open`, `guarantees`. | name | type-or-$ref | description | |---|---|---| | `title` | `object` | — | | `composition` | [`#/$defs/Composition`](#composition) | — | | `differences` | [`#/$defs/Differences`](#differences) | — | | `goals` | [`#/$defs/Goals`](#goals) | — | | `population` | [`#/$defs/Population`](#population) | — | | `transition` | [`#/$defs/Transition`](#transition) | — | | `dependents` | [`#/$defs/Dependents`](#dependents) | — | | `chain` | [`#/$defs/CompositionResult`](#compositionresult) | — | | `coverage` | [`#/$defs/CoverageResult`](#coverageresult) | — | | `computations` | [`#/$defs/Computations`](#computations) | — | | `adversarial` | [`#/$defs/Adversarial`](#adversarial) | — | | `implementation` | [`#/$defs/Implementation`](#implementation) | — | | `states` | [`#/$defs/States`](#states) | — | | `open` | [`#/$defs/Open`](#open) | — | | `guarantees` | `array` | Section 11: four guarantees printed separately, each with what it does not cover. | ## `Receipt` Outside the core hash: who assembled the dossier from which bytes, and whether the producers were re-executed. Type: `object`. Required: `generator`, `inputs`, `reproduction`. | name | type-or-$ref | description | |---|---|---| | `generator` | `string` | — | | `generatorVersion` | `string` | — | | `inputs` | `array` | — | | `repository` | `object` | — | | `reproduction` | `object` | — |