Arxo normative change set 0.1
A normative change as an object for the Arxo Change Protocol: pairs of states of packages or case releases (before/after), the dependency world, the commencement regime, the declared intent, and the producer artifacts a change dossier is assembled from. Host-level composition over existing producer runs (impact, impact-editions, goals, comparison, measure); it carries no semantics and is not executed. The same schema reads a reform over corpus packages and a change package of a case project.
Versions
Section titled “Versions”Accepted schemaVersion: law.change-set/0.1.
Top-level fields
Section titled “Top-level fields”| name | type-or-$ref | required | description |
|---|---|---|---|
schemaVersion | "law.change-set/0.1" | yes | — |
id | string | yes | Stable identifier of the change set (URN). |
kind | enum (3) | yes | draft-amendment: pinned edition against a draft model; edition-change: two dated editions of the same act; case-release: two releases of a case package (change package of a project). |
title | #/$defs/LocalizedText | yes | — |
jurisdiction | string | no | — |
legalStatus | #/$defs/LegalStatus | yes | Legal status of the AFTER state, not of the model: a draft is not law. |
units | array | yes | — |
world | #/$defs/World | yes | — |
commencement | #/$defs/Commencement | no | — |
intent | #/$defs/Intent | no | — |
goalsDeclared | array | no | Goals evaluated on both sides, by StableId. |
producers | array | yes | Artifacts of existing tools the dossier is assembled from. The dossier builder reads them and never re-executes anything. |
composition | #/$defs/Composition | no | — |
coverageProfile | #/$defs/CoverageProfile | no | — |
readings | #/$defs/Readings | no | — |
objections | array | no | — |
notes | array | no | — |
Enumerations
Section titled “Enumerations”| location | values |
|---|---|
properties/schemaVersion | "law.change-set/0.1" |
properties/kind | "draft-amendment", "edition-change", "case-release" |
$defs/LegalStatus | "draft", "adopted", "in-force", "superseded" |
$defs/StateKind | "edition", "draft", "case-release" |
$defs/ChangeUnit/properties/subject | "package", "case" |
$defs/Intent/properties/protectedScope/items/properties/kind | "predicate", "subject", "stage", "article" |
$defs/ObjectionClass | "expert", "approved-criterion", "binding-decision" |
$defs/Objection/properties/status | "open", "accepted", "rejected", "superseded" |
$defs/ProducerTool | "impact", "impact-editions", "goals", "differential", "measure", "population-impact", "sources", "scenarios", "package-info", "lockfile", "institutional-dependencies", "delivery-channels", "computations-index", "bank-health", "other" |
$defs/ProducerRole | "root", "consumer", "step", "end-to-end", "reading", "objections" |
Raw schema
Section titled “Raw schema”Digest
Section titled “Digest”Type: string.
Type: string.
LocalizedText
Section titled “LocalizedText”Language tag → text.
Type: object.
LegalStatus
Section titled “LegalStatus”Values: "draft", "adopted", "in-force", "superseded".
StateKind
Section titled “StateKind”Values: "edition", "draft", "case-release".
SourceRef
Section titled “SourceRef”A pinned publication or document: bytes named by hash.
Type: object.
Required: file, sha256.
| name | type-or-$ref | description |
|---|---|---|
file | string | — |
label | string | — |
url | string | — |
sha256 | string | — |
sizeBytes | integer | — |
One side of a unit: a dated edition of a package, a draft model over it, or a case release.
Type: object.
Required: kind, label.
| name | type-or-$ref | description |
|---|---|---|
kind | #/$defs/StateKind | — |
label | string | — |
edition | string | Edition identifier inside the package (e.g. TAX_CODE_2025). |
editionDate | #/$defs/Date | — |
programHash | #/$defs/Digest | programHash of the executed program, as recorded by the producer. |
artifactHash | #/$defs/Digest | artifactHash of the committed CLIR file, when the state is a corpus package. |
lockfileHash | #/$defs/Digest | — |
sources | array | — |
draftUnits | array | Draft files applied over the base package (kind = draft). |
caseRelease | string | Release label of the case package (kind = case-release). |
ChangeUnit
Section titled “ChangeUnit”Type: object.
Required: subject, before, after.
| name | type-or-$ref | description |
|---|---|---|
subject | enum (2) | — |
package | string | Package name (subject = package) or case package name (subject = case). |
before | #/$defs/State | — |
after | #/$defs/State | — |
PackageRef
Section titled “PackageRef”Type: object.
Required: name, version.
| name | type-or-$ref | description |
|---|---|---|
name | string | — |
version | string | — |
contentHash | #/$defs/Digest | — |
Dependency world of the change: the import closure of the root. Anything outside the closure is outside the dossier by construction.
Type: object.
Required: closure, boundary.
| name | type-or-$ref | description |
|---|---|---|
root | string | — |
closure | array | — |
lockfileHash | #/$defs/Digest | — |
resolutionHash | #/$defs/Digest | — |
boundary | string | Human-readable statement of what the world does not contain. |
Commencement
Section titled “Commencement”Transition regime as read from the act: general date and closed exceptions. Transitional provisions themselves are rules of the package, not host logic.
Type: object.
Required: general.
| name | type-or-$ref | description |
|---|---|---|
general | #/$defs/Date | — |
exceptions | array | — |
readingDecision | string | Decision that fixed the reading of the dates and its status. |
Outcome
Section titled “Outcome”Scenario outcome as printed by impact (NEITHER, TRUE_ONLY, FALSE_ONLY, BOTH, or a calc outcome).
Type: string.
Intent
Section titled “Intent”Declared boundary of the reform: expected outcome changes, goals that must hold, and the area that must not change. Absent in a dossier built without a declaration; then every observed difference is classified observed, never expected.
Type: object.
Required: expectedChanges, protectedGoals, protectedScope.
| name | type-or-$ref | description |
|---|---|---|
declaredBy | string | — |
declaredOn | #/$defs/Date | — |
expectedChanges | array | — |
protectedGoals | array | — |
protectedScope | array | — |
Readings
Section titled “Readings”Two readings of the same source: the adopted one (the AFTER state of the units) and an alternative built from the same draft; the producer is an impact report between the two AFTER worlds, and the dossier names the scenario classes on which they diverge.
Type: object.
Required: adopted, alternative, producer.
| name | type-or-$ref | description |
|---|---|---|
adopted | string | — |
alternative | string | — |
basis | string | — |
producer | string | Path of the impact artifact adopted → alternative, as listed in producers (role reading). |
objectionsProducer | string | Path of the impact artifact adopted → alternative over the objection scenarios only. |
ObjectionClass
Section titled “ObjectionClass”expert: a scenario by an expert or a party, no legal force; approved-criterion: adopted by the owner of the formalization as a check; binding-decision: grounded in a court decision or an official clarification. Entering the bank gives a scenario no legal force.
Values: "expert", "approved-criterion", "binding-decision".
Objection
Section titled “Objection”Type: object.
Required: id, scenario, class, claim, source, filedOn, status, history.
| name | type-or-$ref | description |
|---|---|---|
id | string | — |
scenario | string | Scenario name in the objections bank (file stem—NNN). |
class | #/$defs/ObjectionClass | — |
claim | string | — |
source | string | — |
filedOn | #/$defs/Date | — |
status | enum (4) | — |
history | array | — |
ProducerTool
Section titled “ProducerTool”Values: "impact", "impact-editions", "goals", "differential", "measure", "population-impact", "sources", "scenarios", "package-info", "lockfile", "institutional-dependencies", "delivery-channels", "computations-index", "bank-health", "other".
ProducerRole
Section titled “ProducerRole”root: the report about the changed package itself; consumer: the same pair re-run over a package that imports it (section 8); step / end-to-end: legs of a composition of successive changes (section 3, composition).
Values: "root", "consumer", "step", "end-to-end", "reading", "objections".
CompositionLeg
Section titled “CompositionLeg”Type: object.
Required: label, from, to, producer.
| name | type-or-$ref | description |
|---|---|---|
label | string | — |
from | #/$defs/Date | — |
to | #/$defs/Date | — |
producer | string | Path of the impact-editions artifact of this leg, as listed in producers. |
Composition
Section titled “Composition”A chain of successive changes of the same root: every step and the end-to-end pair are separate producers; the dossier reports transient changes (present in a step, absent end-to-end) and interactions.
Type: object.
Required: steps, endToEnd.
| name | type-or-$ref | description |
|---|---|---|
steps | array | — |
endToEnd | #/$defs/CompositionLeg | — |
CoverageAxis
Section titled “CoverageAxis”Type: object.
Required: name, predicate, argIndex, values.
| name | type-or-$ref | description |
|---|---|---|
name | string | — |
predicate | string | Local name of the case-input predicate that fixes this axis. |
argIndex | integer | — |
values | array | — |
cap | integer | Integer axes: values at or above this bound fold into the last declared value. |
CoverageProfile
Section titled “CoverageProfile”Finite product of axes read from the scenario bank: which cells of the product at least one scenario fixes. A coverage statement about the bank, not a legal answer.
Type: object.
Required: axes.
| name | type-or-$ref | description |
|---|---|---|
axes | array | — |
note | string | — |
Producer
Section titled “Producer”Type: object.
Required: tool, path, sha256.
| name | type-or-$ref | description |
|---|---|---|
tool | #/$defs/ProducerTool | — |
path | string | Path of the artifact relative to the repository root. |
sha256 | #/$defs/Digest | sha256 of the artifact bytes as read by the builder. |
schemaVersion | string | — |
role | #/$defs/ProducerRole | — |
package | string | For role = consumer: the importing package the artifact is about. |
concat | array | Packages added to the world beyond the import closure, as the package’s own test families do (concat in law.toml): a replay, not a dependency world. |
label | string | — |
note | string | — |
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.