ssot-contracts 0.2.17.dev1__tar.gz → 0.2.17.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/PKG-INFO +1 -1
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/pyproject.toml +1 -1
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0616-out-of-bounds-implementation-disposition.yaml +1 -1
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0617-feature-implementation-claim-ceilings.yaml +13 -13
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/adr/ADR-0618-local-release-assurance-remains-ssot-native.yaml +35 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/adr/ADR-0619-content-addressed-governed-source-snapshots.yaml +35 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/adr/ADR-0620-local-evidence-bundles-are-derived-release-artifacts.yaml +35 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/adr/ADR-0621-general-rules-of-interpretation.yaml +44 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/adr/ADR-0622-definitions-govern-ssot-vocabulary.yaml +41 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/manifest.json +110 -2
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0601-cli.yaml +32 -16
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0614-profile-evaluation-and-boundary-resolution.yaml +2 -1
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0616-out-of-bounds-implementation-disposition.yaml +1 -1
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0617-feature-implementation-claim-ceilings.yaml +15 -15
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/specs/SPEC-0618-local-release-assurance-candidate-scope.yaml +38 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/specs/SPEC-0619-governed-source-snapshot-contract.yaml +39 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/specs/SPEC-0620-local-evidence-bundle-contract.yaml +39 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/specs/SPEC-0621-output-artifact-manifest-contract.yaml +39 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/specs/SPEC-0622-local-release-verification-and-gate-contract.yaml +40 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/specs/SPEC-0623-general-rules-of-interpretation.yaml +82 -0
- ssot_contracts-0.2.17.dev2/src/ssot_contracts/templates/specs/SPEC-0624-ssot-definitions.yaml +132 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/manifest.json +193 -4
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts.egg-info/PKG-INFO +1 -1
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts.egg-info/SOURCES.txt +12 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/README.md +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/setup.cfg +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/__init__.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/contract_data.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/generated/__init__.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/generated/python/__init__.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/generated/python/cli_metadata.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/generated/python/enums.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/generated/python/ids.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/generated/python/tui_metadata.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/__init__.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/adr.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/boundary.snapshot.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/certification.report.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/graph.export.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/published.snapshot.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/registry.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/release.snapshot.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/spec.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/schema/validation.report.schema.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/__init__.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0600-canonical-json-registry.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0601-features-are-targetable-units.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0602-issues-are-plannable-work-items.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0603-entity-centric-registry-derived-graph.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0604-normalized-prefixed-ids.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0605-claim-status-vs-tier.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0606-feature-implementation-vs-lifecycle.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0607-immutable-boundary-and-release-snapshots.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0608-fail-closed-guards.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0609-generated-projections-are-non-canonical.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0610-explicit-schema-versioning.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0611-portable-core-repo-specific-evidence-adapters.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0612-ssot-path-and-filename-length-limits.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0613-profiles-as-reusable-feature-bundles.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0614-specs-own-typed-adr-links.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/ADR-0615-downstream-assurance-language-ceilings.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/adr/__init__.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/registry.full.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/registry.minimal.json +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0600-registry-core.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0602-graph-model.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0603-feature-lifecycle.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0604-claim-statuses.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0605-claim-tiers.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0606-snapshots-and-reports.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0607-repo-policy.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0608-gates-and-fences.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0609-id-normalization.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0610-file-tree.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0611-planning-horizons.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0612-python-api.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0613-ssot-path-length-policy.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/SPEC-0615-typed-spec-to-adr-linking.yaml +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts/templates/specs/__init__.py +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts.egg-info/dependency_links.txt +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts.egg-info/requires.txt +0 -0
- {ssot_contracts-0.2.17.dev1 → ssot_contracts-0.2.17.dev2}/src/ssot_contracts.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ssot-contracts
|
|
3
|
-
Version: 0.2.17.
|
|
3
|
+
Version: 0.2.17.dev2
|
|
4
4
|
Summary: Canonical schemas, templates, manifests, and generated Python contract artifacts for SSOT.
|
|
5
5
|
Author-email: Jacob Stewart <jacob@swarmauri.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ssot-contracts"
|
|
7
|
-
version = "0.2.17.
|
|
7
|
+
version = "0.2.17.dev2"
|
|
8
8
|
description = "Canonical schemas, templates, manifests, and generated Python contract artifacts for SSOT."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10,<3.14"
|
|
@@ -40,7 +40,7 @@ schema_version: "0.2.0"
|
|
|
40
40
|
slug: "out-of-bounds-implementation-disposition"
|
|
41
41
|
status: "accepted"
|
|
42
42
|
status_notes: []
|
|
43
|
-
summary: "
|
|
43
|
+
summary: "Feature implementation state, planning horizon, and lifecycle state are separate axes. That separation is useful, but it leaves an ambiguous case: a feature can be `out_of_bounds` while still being `partial` or `implemented` in the codebase."
|
|
44
44
|
superseded_by: []
|
|
45
45
|
supersedes: []
|
|
46
46
|
tags: []
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
body: |-
|
|
2
2
|
## Context
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
Feature implementation status, claim lifecycle status, and claim assurance tier are separate fields. That separation is useful, but it can overstate implementation when a feature has multiple active linked claims and only one of them satisfies the target tier.
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
`T0` is inventory-level assurance. A `T0` claim records declared intent, scope, or placeholder support; it does not prove working behavior. Therefore a feature with an active required `T0` claim must not be marked `implemented`.
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
## Decision
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
Feature implementation promotion is capped by active required linked claims.
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
All active linked claims on a feature are required for feature implementation closure. Retired claims are ignored. A stronger linked claim cannot override a weaker active required claim.
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
A feature may be marked `implemented` only when:
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
- linked tests pass,
|
|
17
17
|
- required features are implemented,
|
|
18
18
|
- every active required linked claim satisfies the feature's effective target tier,
|
|
19
19
|
- no active required linked claim is `T0`.
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
If an active required `T0` claim is linked to a feature, the highest allowed feature `implementation_status` is `partial`. If all linked support is planned or placeholder-only, the highest allowed feature `implementation_status` is `absent`.
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
## Consequences
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
Automated status synchronization must use all-pass claim precedence for feature implementation promotion.
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
Validation must reject manually edited registries that mark a feature `implemented` while an active required linked claim is `T0` or below the feature target tier.
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
Registries that need non-blocking explanatory claims must model that as a later governed schema capability. Until that exists, active linked claims are required closure inputs.
|
|
30
30
|
decision_date: null
|
|
31
31
|
id: "adr:0617"
|
|
@@ -37,7 +37,7 @@ schema_version: "0.2.0"
|
|
|
37
37
|
slug: "feature-implementation-claim-ceilings"
|
|
38
38
|
status: "accepted"
|
|
39
39
|
status_notes: []
|
|
40
|
-
summary: "Feature implementation
|
|
40
|
+
summary: "Feature implementation status, claim lifecycle status, and claim assurance tier are separate fields. That separation is useful, but it can overstate implementation when a feature has multiple active linked claims and only one of them satisfies the target tier."
|
|
41
41
|
superseded_by: []
|
|
42
42
|
supersedes: []
|
|
43
43
|
tags: []
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0618"
|
|
4
|
+
number: 618
|
|
5
|
+
slug: "local-release-assurance-remains-ssot-native"
|
|
6
|
+
title: "Local Release Assurance Remains SSOT Native"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Draft. This is a tentative proposal record, not an accepted implementation mandate."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes:
|
|
15
|
+
-
|
|
16
|
+
status: "draft"
|
|
17
|
+
note: "Tentative local release assurance proposal; not accepted or implementation-bound."
|
|
18
|
+
at: "2026-05-08T07:33:02Z"
|
|
19
|
+
references: []
|
|
20
|
+
body: |-
|
|
21
|
+
## Status
|
|
22
|
+
|
|
23
|
+
Draft. This is a tentative proposal record, not an accepted implementation mandate.
|
|
24
|
+
|
|
25
|
+
## Context
|
|
26
|
+
|
|
27
|
+
The registry already governs ADRs, SPECs, features, tests, claims, evidence, boundaries, releases, reports, and snapshots. We want to explore release-assurance capabilities without adding mandatory external services or build systems.
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
Keep local release assurance SSOT-native. Candidate capabilities must use existing registry data, local files, canonical JSON, SHA-256 hashes, validation reports, certification reports, and release gates. CUE, Bazel, Nix, Sigstore, Cosign, Rekor, Docker-only assumptions, network services, and mandatory external build tools are out of scope for the core proposal.
|
|
32
|
+
|
|
33
|
+
## Consequences
|
|
34
|
+
|
|
35
|
+
The implementation can remain portable and dependency-light. Any future external integration must be optional and adapter-based, not part of the core assurance contract.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0619"
|
|
4
|
+
number: 619
|
|
5
|
+
slug: "content-addressed-governed-source-snapshots"
|
|
6
|
+
title: "Content Addressed Governed Source Snapshots"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Draft. This records an exploratory direction for later feature rows."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes:
|
|
15
|
+
-
|
|
16
|
+
status: "draft"
|
|
17
|
+
note: "Tentative local release assurance proposal; not accepted or implementation-bound."
|
|
18
|
+
at: "2026-05-08T07:34:02Z"
|
|
19
|
+
references: []
|
|
20
|
+
body: |-
|
|
21
|
+
## Status
|
|
22
|
+
|
|
23
|
+
Draft. This records an exploratory direction for later feature rows.
|
|
24
|
+
|
|
25
|
+
## Context
|
|
26
|
+
|
|
27
|
+
Current SSOT validation hashes ADR and SPEC document bodies and release snapshots hash selected linked test and evidence paths. That does not yet provide a release-scoped source-state root over governed files.
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
Represent governed source state as deterministic file hashes plus a canonical root hash over the governed file hash map. The default scope should be declared or governed paths, not the entire repository. Full-repo hashing may be offered only as explicit opt-in policy.
|
|
32
|
+
|
|
33
|
+
## Consequences
|
|
34
|
+
|
|
35
|
+
Release verification can detect drift across governed source, tests, evidence, documents, and artifacts while avoiding local cache, virtual environment, build-output, and temp-file noise.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0620"
|
|
4
|
+
number: 620
|
|
5
|
+
slug: "local-evidence-bundles-are-derived-release-artifacts"
|
|
6
|
+
title: "Local Evidence Bundles Are Derived Release Artifacts"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Draft. This is a tentative proposal for future implementation."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes:
|
|
15
|
+
-
|
|
16
|
+
status: "draft"
|
|
17
|
+
note: "Tentative local release assurance proposal; not accepted or implementation-bound."
|
|
18
|
+
at: "2026-05-08T07:34:02Z"
|
|
19
|
+
references: []
|
|
20
|
+
body: |-
|
|
21
|
+
## Status
|
|
22
|
+
|
|
23
|
+
Draft. This is a tentative proposal for future implementation.
|
|
24
|
+
|
|
25
|
+
## Context
|
|
26
|
+
|
|
27
|
+
Claims, tests, evidence rows, boundaries, and releases already form a proof chain. Operators still lack a single local artifact that bundles the release proof with source snapshot and artifact manifest references.
|
|
28
|
+
|
|
29
|
+
## Decision
|
|
30
|
+
|
|
31
|
+
Treat local evidence bundles as derived SSOT release artifacts. Bundles are generated from registry truth and linked files; they are not a second source of truth. They should be canonical JSON, locally hashable, locally verifiable, and safe to regenerate.
|
|
32
|
+
|
|
33
|
+
## Consequences
|
|
34
|
+
|
|
35
|
+
Verification can consume a portable local bundle while the registry remains authoritative. Bundle drift is detected through canonical hashing and release gates rather than external signatures.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0621"
|
|
4
|
+
number: 621
|
|
5
|
+
slug: "general-rules-of-interpretation"
|
|
6
|
+
title: "General rules of interpretation govern SSOT meaning"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "SSOT governance relies on authored ADRs, authored SPECs, registry entities, generated projections, CLI summaries, evidence artifacts, and repository documentation. Those surfaces are intentionally different, but the repository does not yet have a general rule set for resolving interpretation questions across them."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
SSOT governance relies on authored ADRs, authored SPECs, registry entities, generated projections, CLI summaries, evidence artifacts, and repository documentation. Those surfaces are intentionally different, but the repository does not yet have a general rule set for resolving interpretation questions across them.
|
|
20
|
+
|
|
21
|
+
Without a governed interpretation rule, readers and automation can over-weight generated views, treat draft proposals as binding, infer support from missing rows, or resolve ambiguous certification and release questions permissively.
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
SSOT governance SHALL use general rules of interpretation for authority, conflict resolution, normative language, projections, entity absence, and fail-closed release decisions.
|
|
26
|
+
|
|
27
|
+
The rules are:
|
|
28
|
+
|
|
29
|
+
- authored ADRs and SPECs govern intent, rationale, and normative requirements;
|
|
30
|
+
- `.ssot/registry.json` governs current machine-readable entity state and relationships;
|
|
31
|
+
- generated exports, reports, graphs, README tables, and CLI summaries are projections unless a SPEC explicitly declares a surface canonical;
|
|
32
|
+
- specific accepted rules narrow or override general accepted rules for their exact scope;
|
|
33
|
+
- accepted documents override draft documents;
|
|
34
|
+
- later documents override earlier documents only through explicit supersession or explicit scoped narrowing;
|
|
35
|
+
- absence of a governed row means absence of a governed assertion;
|
|
36
|
+
- ambiguity in conformance, certification, promotion, publication, and release gates is resolved fail-closed.
|
|
37
|
+
|
|
38
|
+
## Consequences
|
|
39
|
+
|
|
40
|
+
Validation, synchronization, certification, and release tooling must not treat generated projections as independent authority when they disagree with authored documents or the canonical registry.
|
|
41
|
+
|
|
42
|
+
Draft ADRs and SPECs may guide planning, but they must not create binding conformance requirements until accepted or otherwise promoted by the repository's governed lifecycle.
|
|
43
|
+
|
|
44
|
+
Downstream projects may add stricter local rules, but they must not interpret missing, ambiguous, or projection-only data as stronger assurance than the originating SSOT registry supports.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0622"
|
|
4
|
+
number: 622
|
|
5
|
+
slug: "definitions-govern-ssot-vocabulary"
|
|
6
|
+
title: "Definitions govern SSOT vocabulary"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "SSOT governance uses recurring terms across authored ADRs, authored SPECs, registry rows, CLI output, generated projections, evidence artifacts, releases, boundaries, and downstream conformance work. Those terms currently appear across many documents, but there is no single governed vocabulary authority."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
SSOT governance uses recurring terms across authored ADRs, authored SPECs, registry rows, CLI output, generated projections, evidence artifacts, releases, boundaries, and downstream conformance work. Those terms currently appear across many documents, but there is no single governed vocabulary authority.
|
|
20
|
+
|
|
21
|
+
Without a definitions authority, readers and tools can interpret entity families, proof terms, lifecycle terms, projections, and assurance terms inconsistently. That weakens traceability and makes release or certification claims harder to audit.
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
SSOT vocabulary SHALL be governed by a dedicated definitions SPEC.
|
|
26
|
+
|
|
27
|
+
Defined SSOT terms SHALL override informal usage in README files, generated reports, examples, comments, and downstream prose.
|
|
28
|
+
|
|
29
|
+
Entity-family terms SHALL be interpreted according to the definitions SPEC unless a more specific accepted SPEC narrows a term for its own explicit scope.
|
|
30
|
+
|
|
31
|
+
Undefined terms retain their ordinary technical meaning, but they SHALL NOT create conformance, certification, release, or implementation obligations by implication.
|
|
32
|
+
|
|
33
|
+
Downstream repositories MAY add stricter local definitions, but they SHALL NOT redefine upstream SSOT terms to claim stronger assurance than the upstream registry, authored documents, claims, tests, and evidence support.
|
|
34
|
+
|
|
35
|
+
## Consequences
|
|
36
|
+
|
|
37
|
+
New ADRs and SPECs should reuse defined terms where possible instead of creating parallel vocabulary.
|
|
38
|
+
|
|
39
|
+
Definitions that affect validation, synchronization, conformance, release, or certification behavior must be added to the governed definitions SPEC or to a narrower accepted SPEC that states its scope.
|
|
40
|
+
|
|
41
|
+
Generated projections and CLI summaries must not introduce authoritative definitions that do not exist in authored governance.
|
|
@@ -294,7 +294,7 @@
|
|
|
294
294
|
"title": "Out-of-bounds implementation disposition is explicit",
|
|
295
295
|
"filename": "ADR-0616-out-of-bounds-implementation-disposition.yaml",
|
|
296
296
|
"target_path": ".ssot/adr/ADR-0616-out-of-bounds-implementation-disposition.yaml",
|
|
297
|
-
"sha256": "
|
|
297
|
+
"sha256": "d598e42994b2401e93b3c23b3c0095ed24b45ef257ead6689dc476bb273350d3",
|
|
298
298
|
"origin": "ssot-origin",
|
|
299
299
|
"reservation_owner": "ssot-origin",
|
|
300
300
|
"immutable": true,
|
|
@@ -312,7 +312,7 @@
|
|
|
312
312
|
"title": "Feature implementation is capped by active required claims",
|
|
313
313
|
"filename": "ADR-0617-feature-implementation-claim-ceilings.yaml",
|
|
314
314
|
"target_path": ".ssot/adr/ADR-0617-feature-implementation-claim-ceilings.yaml",
|
|
315
|
-
"sha256": "
|
|
315
|
+
"sha256": "0a11198e91bb7e4e6027fbb4824798d784e5b15a9e39a58464ff1fdcb219ced5",
|
|
316
316
|
"origin": "ssot-origin",
|
|
317
317
|
"reservation_owner": "ssot-origin",
|
|
318
318
|
"immutable": true,
|
|
@@ -322,5 +322,113 @@
|
|
|
322
322
|
"supersedes": [],
|
|
323
323
|
"superseded_by": [],
|
|
324
324
|
"status_notes": []
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"id": "adr:0618",
|
|
328
|
+
"number": 618,
|
|
329
|
+
"slug": "local-release-assurance-remains-ssot-native",
|
|
330
|
+
"title": "Local Release Assurance Remains SSOT Native",
|
|
331
|
+
"filename": "ADR-0618-local-release-assurance-remains-ssot-native.yaml",
|
|
332
|
+
"target_path": ".ssot/adr/ADR-0618-local-release-assurance-remains-ssot-native.yaml",
|
|
333
|
+
"sha256": "1fcf1d69ab68ae5e125b0f3bb7f6369240164c4a18b8e686479408bfd282587c",
|
|
334
|
+
"origin": "ssot-origin",
|
|
335
|
+
"reservation_owner": "ssot-origin",
|
|
336
|
+
"immutable": true,
|
|
337
|
+
"minimum_schema_version": "0.4.0",
|
|
338
|
+
"introduced_in": "0.2.10",
|
|
339
|
+
"status": "draft",
|
|
340
|
+
"supersedes": [],
|
|
341
|
+
"superseded_by": [],
|
|
342
|
+
"status_notes": [
|
|
343
|
+
{
|
|
344
|
+
"at": "2026-05-08T07:33:02Z",
|
|
345
|
+
"note": "Tentative local release assurance proposal; not accepted or implementation-bound.",
|
|
346
|
+
"status": "draft"
|
|
347
|
+
}
|
|
348
|
+
]
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
"id": "adr:0619",
|
|
352
|
+
"number": 619,
|
|
353
|
+
"slug": "content-addressed-governed-source-snapshots",
|
|
354
|
+
"title": "Content Addressed Governed Source Snapshots",
|
|
355
|
+
"filename": "ADR-0619-content-addressed-governed-source-snapshots.yaml",
|
|
356
|
+
"target_path": ".ssot/adr/ADR-0619-content-addressed-governed-source-snapshots.yaml",
|
|
357
|
+
"sha256": "3e356168e16d0a4e63288c32a21af6c6e96bf7e92bd124ea796a3fc7e1cc6f9f",
|
|
358
|
+
"origin": "ssot-origin",
|
|
359
|
+
"reservation_owner": "ssot-origin",
|
|
360
|
+
"immutable": true,
|
|
361
|
+
"minimum_schema_version": "0.4.0",
|
|
362
|
+
"introduced_in": "0.2.10",
|
|
363
|
+
"status": "draft",
|
|
364
|
+
"supersedes": [],
|
|
365
|
+
"superseded_by": [],
|
|
366
|
+
"status_notes": [
|
|
367
|
+
{
|
|
368
|
+
"at": "2026-05-08T07:34:02Z",
|
|
369
|
+
"note": "Tentative local release assurance proposal; not accepted or implementation-bound.",
|
|
370
|
+
"status": "draft"
|
|
371
|
+
}
|
|
372
|
+
]
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
"id": "adr:0620",
|
|
376
|
+
"number": 620,
|
|
377
|
+
"slug": "local-evidence-bundles-are-derived-release-artifacts",
|
|
378
|
+
"title": "Local Evidence Bundles Are Derived Release Artifacts",
|
|
379
|
+
"filename": "ADR-0620-local-evidence-bundles-are-derived-release-artifacts.yaml",
|
|
380
|
+
"target_path": ".ssot/adr/ADR-0620-local-evidence-bundles-are-derived-release-artifacts.yaml",
|
|
381
|
+
"sha256": "6bd56ffd4ccdab5d939757fedb1b0c6df9e8dc8c4d0811b0855e84cc8c936ae3",
|
|
382
|
+
"origin": "ssot-origin",
|
|
383
|
+
"reservation_owner": "ssot-origin",
|
|
384
|
+
"immutable": true,
|
|
385
|
+
"minimum_schema_version": "0.4.0",
|
|
386
|
+
"introduced_in": "0.2.10",
|
|
387
|
+
"status": "draft",
|
|
388
|
+
"supersedes": [],
|
|
389
|
+
"superseded_by": [],
|
|
390
|
+
"status_notes": [
|
|
391
|
+
{
|
|
392
|
+
"at": "2026-05-08T07:34:02Z",
|
|
393
|
+
"note": "Tentative local release assurance proposal; not accepted or implementation-bound.",
|
|
394
|
+
"status": "draft"
|
|
395
|
+
}
|
|
396
|
+
]
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"id": "adr:0621",
|
|
400
|
+
"number": 621,
|
|
401
|
+
"slug": "general-rules-of-interpretation",
|
|
402
|
+
"title": "General rules of interpretation govern SSOT meaning",
|
|
403
|
+
"filename": "ADR-0621-general-rules-of-interpretation.yaml",
|
|
404
|
+
"target_path": ".ssot/adr/ADR-0621-general-rules-of-interpretation.yaml",
|
|
405
|
+
"sha256": "20c89d5a323835e4dee328e4debbc8de0edf623f0b297e8158d0e8295f8157a9",
|
|
406
|
+
"origin": "ssot-origin",
|
|
407
|
+
"reservation_owner": "ssot-origin",
|
|
408
|
+
"immutable": true,
|
|
409
|
+
"minimum_schema_version": "0.4.0",
|
|
410
|
+
"introduced_in": "0.2.10",
|
|
411
|
+
"status": "draft",
|
|
412
|
+
"supersedes": [],
|
|
413
|
+
"superseded_by": [],
|
|
414
|
+
"status_notes": []
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"id": "adr:0622",
|
|
418
|
+
"number": 622,
|
|
419
|
+
"slug": "definitions-govern-ssot-vocabulary",
|
|
420
|
+
"title": "Definitions govern SSOT vocabulary",
|
|
421
|
+
"filename": "ADR-0622-definitions-govern-ssot-vocabulary.yaml",
|
|
422
|
+
"target_path": ".ssot/adr/ADR-0622-definitions-govern-ssot-vocabulary.yaml",
|
|
423
|
+
"sha256": "816d194bcbbdf5f4bad1e8ab78e6756103f414554e0cc2a4c525a3697eee188d",
|
|
424
|
+
"origin": "ssot-origin",
|
|
425
|
+
"reservation_owner": "ssot-origin",
|
|
426
|
+
"immutable": true,
|
|
427
|
+
"minimum_schema_version": "0.4.0",
|
|
428
|
+
"introduced_in": "0.2.10",
|
|
429
|
+
"status": "draft",
|
|
430
|
+
"supersedes": [],
|
|
431
|
+
"superseded_by": [],
|
|
432
|
+
"status_notes": []
|
|
325
433
|
}
|
|
326
434
|
]
|
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "spec"
|
|
3
|
+
id: "spc:0601"
|
|
4
|
+
number: 601
|
|
5
|
+
slug: "cli"
|
|
6
|
+
title: "CLI"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Primary distribution: `ssot-cli`"
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
2
16
|
body: |-
|
|
3
17
|
Primary distribution: `ssot-cli`
|
|
4
18
|
|
|
@@ -26,6 +40,11 @@ body: |-
|
|
|
26
40
|
- `ssot-registry release revoke`
|
|
27
41
|
- `ssot-registry graph export`
|
|
28
42
|
|
|
43
|
+
Root metadata flags:
|
|
44
|
+
- `ssot --version`, `ssot-cli --version`, and `ssot-registry --version` SHALL print the installed CLI package version and exit successfully without requiring a subcommand.
|
|
45
|
+
- The reported version SHALL be resolved from installed Python package metadata for `ssot-cli`.
|
|
46
|
+
- Root version handling SHALL run before subcommand dispatch so it works even though normal CLI execution requires a subcommand.
|
|
47
|
+
|
|
29
48
|
ADR and SPEC authoring commands SHALL support two body source flags:
|
|
30
49
|
- `--body`
|
|
31
50
|
- `--body-file`
|
|
@@ -36,19 +55,16 @@ body: |-
|
|
|
36
55
|
- create and update commands SHALL reject requests that provide both `--body` and `--body-file`
|
|
37
56
|
|
|
38
57
|
CLI body flags SHALL map directly onto the corresponding runtime document mutation inputs.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
58
|
+
|
|
59
|
+
Entity create and update commands for `feature`, `test`, `issue`, `boundary`, `profile`, `claim`, `evidence`, `risk`, and `release` SHALL also support two body source flags:
|
|
60
|
+
- `--body`
|
|
61
|
+
- `--body-file`
|
|
62
|
+
|
|
63
|
+
Entity CLI source-selection rules:
|
|
64
|
+
- entity `create` commands MAY omit both `--body` and `--body-file`
|
|
65
|
+
- entity `update` commands MAY omit both `--body` and `--body-file`
|
|
66
|
+
- entity `create` and `update` commands SHALL reject requests that provide both `--body` and `--body-file`
|
|
67
|
+
- when `--body` is provided, the entity row `body` field SHALL be set from the inline UTF-8 text
|
|
68
|
+
- when `--body-file` is provided, the entity row `body` field SHALL be set from the referenced UTF-8 text file
|
|
47
69
|
spec_kind: "operational"
|
|
48
|
-
|
|
49
|
-
status_notes: []
|
|
50
|
-
summary: "Primary distribution: `ssot-cli`"
|
|
51
|
-
superseded_by: []
|
|
52
|
-
supersedes: []
|
|
53
|
-
tags: []
|
|
54
|
-
title: "CLI"
|
|
70
|
+
adr_ids: []
|
|
@@ -12,7 +12,7 @@ body: |-
|
|
|
12
12
|
|
|
13
13
|
Profile row fields:
|
|
14
14
|
|
|
15
|
-
- `id`, `title`, `description`, `status`, `kind`
|
|
15
|
+
- `id`, `title`, `description`, `body`, `status`, `kind`
|
|
16
16
|
- `feature_ids: list[str]`
|
|
17
17
|
- `profile_ids: list[str]`
|
|
18
18
|
- `claim_tier: T0..T4 | null`
|
|
@@ -21,6 +21,7 @@ body: |-
|
|
|
21
21
|
|
|
22
22
|
Boundary rows include:
|
|
23
23
|
|
|
24
|
+
- `body: str | null`
|
|
24
25
|
- `feature_ids: list[str]`
|
|
25
26
|
- `profile_ids: list[str]`
|
|
26
27
|
|
|
@@ -44,7 +44,7 @@ slug: "out-of-bounds-implementation-disposition"
|
|
|
44
44
|
spec_kind: "normative"
|
|
45
45
|
status: "accepted"
|
|
46
46
|
status_notes: []
|
|
47
|
-
summary: "Feature
|
|
47
|
+
summary: "Feature `plan` MAY include:"
|
|
48
48
|
superseded_by: []
|
|
49
49
|
supersedes: []
|
|
50
50
|
tags: []
|
|
@@ -2,38 +2,38 @@ adr_ids:
|
|
|
2
2
|
- "adr:0617"
|
|
3
3
|
body: |-
|
|
4
4
|
## Overview
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
Feature implementation status SHALL be derived and validated through active required claim ceilings.
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
## Active Required Claims
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
For feature implementation closure, active required claims are all linked `feature.claim_ids` whose claim status is not `retired`.
|
|
11
|
-
|
|
11
|
+
|
|
12
12
|
Until a first-class non-blocking claim role exists, every non-retired linked claim SHALL be treated as required for feature implementation closure.
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
## Implementation Status Derivation
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
Automated status synchronization SHALL set a feature to `implemented` only when:
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
1. the feature has at least one active required linked claim,
|
|
19
19
|
2. every active required linked claim has a tier other than `T0`,
|
|
20
20
|
3. every active required linked claim is at or above the feature's `plan.target_claim_tier` when that target is present,
|
|
21
21
|
4. every active required linked claim has status `evidenced` or higher after claim synchronization,
|
|
22
22
|
5. every linked test is `passing`,
|
|
23
23
|
6. every required feature is `implemented`.
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
If any active required linked claim is `T0`, the feature SHALL NOT be synchronized to `implemented`; the highest synchronized status is `partial` unless all support is planned or placeholder-only.
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
If a feature has mixed active required claims and any one of them fails the closure requirements, the feature SHALL NOT be synchronized to `implemented`.
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
## Validation
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
Registry validation SHALL reject a feature with `implementation_status: implemented` when any active required linked claim is `T0` or below the feature's target claim tier.
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
Claim lifecycle status normalization remains the responsibility of automated status synchronization.
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
## Profile Evaluation
|
|
36
|
-
|
|
36
|
+
|
|
37
37
|
Profile and boundary-oriented feature evaluation SHALL use the same all-active-required-claims precedence. A feature with an active required `T0` claim SHALL fail feature-pass evaluation even if another linked claim is stronger.
|
|
38
38
|
decision_date: null
|
|
39
39
|
id: "spc:0617"
|
|
@@ -46,7 +46,7 @@ slug: "feature-implementation-claim-ceilings"
|
|
|
46
46
|
spec_kind: "normative"
|
|
47
47
|
status: "accepted"
|
|
48
48
|
status_notes: []
|
|
49
|
-
summary: "Feature implementation status
|
|
49
|
+
summary: "Feature implementation status SHALL be derived and validated through active required claim ceilings."
|
|
50
50
|
superseded_by: []
|
|
51
51
|
supersedes: []
|
|
52
52
|
tags: []
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "spec"
|
|
3
|
+
id: "spc:0618"
|
|
4
|
+
number: 618
|
|
5
|
+
slug: "local-release-assurance-candidate-scope"
|
|
6
|
+
title: "Local Release Assurance Candidate Scope"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Draft candidate scope."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes:
|
|
15
|
+
-
|
|
16
|
+
status: "draft"
|
|
17
|
+
note: "Tentative local release assurance proposal; not accepted or implementation-bound."
|
|
18
|
+
at: "2026-05-08T07:34:02Z"
|
|
19
|
+
references: []
|
|
20
|
+
body: |-
|
|
21
|
+
## Status
|
|
22
|
+
|
|
23
|
+
Draft candidate scope.
|
|
24
|
+
|
|
25
|
+
## Scope
|
|
26
|
+
|
|
27
|
+
This SPEC defines the exploratory local release assurance scope. The candidate surface includes governed source snapshots, deterministic root hashes, local evidence bundles, output artifact manifests, local verification reports, tamper detection, and release gate integration.
|
|
28
|
+
|
|
29
|
+
## Out Of Scope
|
|
30
|
+
|
|
31
|
+
Mandatory CUE, Bazel, Nix, Sigstore, Cosign, Rekor, Docker-only artifact handling, network services, and required external build systems are out of scope. Optional adapters may be proposed separately later.
|
|
32
|
+
|
|
33
|
+
## Tentative Nature
|
|
34
|
+
|
|
35
|
+
Rows linked to this SPEC should remain draft, absent, backlog, or future until implementation and proof chains exist.
|
|
36
|
+
spec_kind: "governance"
|
|
37
|
+
adr_ids:
|
|
38
|
+
- "adr:0618"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
schema_version: "0.3.0"
|
|
2
|
+
kind: "spec"
|
|
3
|
+
id: "spc:0619"
|
|
4
|
+
number: 619
|
|
5
|
+
slug: "governed-source-snapshot-contract"
|
|
6
|
+
title: "Governed Source Snapshot Contract"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Draft contract."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes:
|
|
15
|
+
-
|
|
16
|
+
status: "draft"
|
|
17
|
+
note: "Tentative local release assurance proposal; not accepted or implementation-bound."
|
|
18
|
+
at: "2026-05-08T07:34:03Z"
|
|
19
|
+
references: []
|
|
20
|
+
body: |-
|
|
21
|
+
## Status
|
|
22
|
+
|
|
23
|
+
Draft contract.
|
|
24
|
+
|
|
25
|
+
## Contract
|
|
26
|
+
|
|
27
|
+
A governed source snapshot records a release id, path policy mode, included paths, excluded paths, file SHA-256 hashes, generated timestamp, registry path, registry hash, and deterministic source root hash.
|
|
28
|
+
|
|
29
|
+
## Path Policy Modes
|
|
30
|
+
|
|
31
|
+
The proposed modes are ssot-only, declared, governed, and full-repo. The default should be declared or governed. Full-repo mode is explicit opt-in only.
|
|
32
|
+
|
|
33
|
+
## Validation
|
|
34
|
+
|
|
35
|
+
Validation recomputes file hashes, rejects missing governed files, enforces canonical ordering, and recomputes the root hash.
|
|
36
|
+
spec_kind: "operational"
|
|
37
|
+
adr_ids:
|
|
38
|
+
- "adr:0618"
|
|
39
|
+
- "adr:0619"
|