|
| 1 | +# Sovereign change planning v0.2 |
| 2 | + |
| 3 | +v0.2 is an offline decision surface. It compares declarations, evaluates the authority already |
| 4 | +accepted by the current world, classifies evidence, and emits a provider-neutral plan. It never |
| 5 | +loads providers, contacts a network, invokes a subprocess, or mutates infrastructure. |
| 6 | + |
| 7 | +## Artifact identities |
| 8 | + |
| 9 | +Every revision exposes separate SHA-256 identities: |
| 10 | + |
| 11 | +- **declaration digest** covers the normalized complete declaration; |
| 12 | +- **canonical-intent digest** excludes revision metadata and replaceable provider bindings; |
| 13 | +- **materialization digest** covers capabilities and provider bindings; |
| 14 | +- **manifest digest** exists only for a semantically valid manifest. |
| 15 | + |
| 16 | +A proposal may provide its expected parent revision and declaration digest. A mismatch is rejected |
| 17 | +as stale lineage. Change and drift identifiers use full content digests, so approvals bind to the |
| 18 | +exact reviewed before/after values. |
| 19 | + |
| 20 | +## Admission states and time |
| 21 | + |
| 22 | +Admission has three outcomes: `rejected`, `pending_approval`, and `admitted`. An approval-gated |
| 23 | +proposal is not admitted until matching approval evidence is supplied. `evaluated_at` is an explicit |
| 24 | +input used for mandate validity; observation timestamps describe evidence and never select the |
| 25 | +admission time. |
| 26 | + |
| 27 | +Mandates are matched against authority, governed action, resource classes, jurisdiction, validity, |
| 28 | +and typed constraints (`operations`, `paths`, and `subject_ids`). Current accepted state is validated |
| 29 | +before it can authorise a proposal. |
| 30 | + |
| 31 | +## Observations and plans |
| 32 | + |
| 33 | +Facts use stable semantic paths such as `resources/root-zone`, and distinguish `present`, `absent`, |
| 34 | +`unknown`, and `unreadable`. Unknown or unreadable evidence does not manufacture drift. Actionable |
| 35 | +drift carries its authority and mandate into a convergence step. |
| 36 | + |
| 37 | +Plan preconditions and expected outcomes are typed JSON objects rather than prose. Dependencies form |
| 38 | +a deterministic semantic DAG: for example, a changed provider binding depends on its changed |
| 39 | +capability, while unrelated changes remain independent. Reversibility is explicitly classified and |
| 40 | +remains `unknown` unless v0.2 can justify a stronger provider-neutral statement. |
| 41 | + |
| 42 | +Schemas are published at: |
| 43 | + |
| 44 | +- `schemas/observed-v0.2.schema.json`; |
| 45 | +- `schemas/admission-v0.2.schema.json`; |
| 46 | +- `schemas/plan-v0.2.schema.json`. |
| 47 | + |
| 48 | +## CLI contract |
| 49 | + |
| 50 | +```console |
| 51 | +netsovereign diff current.yaml proposed.yaml |
| 52 | +netsovereign admit current.yaml proposed.yaml \ |
| 53 | + --evaluated-at 2026-08-02T12:00:00Z \ |
| 54 | + --parent-revision 7 --parent-digest sha256:... \ |
| 55 | + --observed observed.json --approval approval.yaml |
| 56 | +netsovereign plan current.yaml proposed.yaml --format yaml --output plan.yaml |
| 57 | +``` |
| 58 | + |
| 59 | +`admit` and `plan` exit with `0` when admitted, `1` when rejected, `2` for malformed input or CLI |
| 60 | +usage, and `3` while approval is pending. `--format json|yaml`, `--compact`, and `--output` control |
| 61 | +serialization without changing artifact identity. |
0 commit comments