ssot-contracts 0.2.14.dev1__tar.gz → 0.2.15.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.
Files changed (103) hide show
  1. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/PKG-INFO +4 -5
  2. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/README.md +3 -4
  3. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/pyproject.toml +3 -3
  4. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/contract_data.py +1 -1
  5. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/registry.schema.json +1 -1
  6. ssot_contracts-0.2.15.dev2/src/ssot_contracts/schema/release.snapshot.schema.json +1 -0
  7. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0600-canonical-json-registry.yaml +17 -0
  8. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0601-features-are-targetable-units.yaml +17 -0
  9. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0602-issues-are-plannable-work-items.yaml +17 -0
  10. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0603-entity-centric-registry-derived-graph.yaml +17 -0
  11. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0604-normalized-prefixed-ids.yaml +17 -0
  12. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0605-claim-status-vs-tier.yaml +17 -0
  13. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0606-feature-implementation-vs-lifecycle.yaml +17 -0
  14. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0607-immutable-boundary-and-release-snapshots.yaml +17 -0
  15. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0608-fail-closed-guards.yaml +17 -0
  16. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0609-generated-projections-are-non-canonical.yaml +32 -0
  17. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0610-explicit-schema-versioning.yaml +17 -0
  18. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0611-portable-core-repo-specific-evidence-adapters.yaml +17 -0
  19. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0612-ssot-path-and-filename-length-limits.yaml +22 -0
  20. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0613-profiles-as-reusable-feature-bundles.yaml +41 -0
  21. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0614-specs-own-typed-adr-links.yaml +17 -0
  22. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0615-downstream-assurance-language-ceilings.yaml +62 -0
  23. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/adr/ADR-0616-out-of-bounds-implementation-disposition.yaml +47 -0
  24. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/templates/adr/manifest.json +51 -51
  25. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/templates/registry.full.json +1 -1
  26. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/templates/registry.minimal.json +1 -1
  27. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0600-registry-core.yaml +67 -0
  28. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0601-cli.yaml +54 -0
  29. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0602-graph-model.yaml +31 -0
  30. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0603-feature-lifecycle.yaml +25 -0
  31. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0604-claim-statuses.yaml +29 -0
  32. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0605-claim-tiers.yaml +24 -0
  33. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0606-snapshots-and-reports.yaml +25 -0
  34. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0607-repo-policy.yaml +39 -0
  35. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0608-gates-and-fences.yaml +26 -0
  36. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0609-id-normalization.yaml +34 -0
  37. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0610-file-tree.yaml +26 -0
  38. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0611-planning-horizons.yaml +27 -0
  39. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0612-python-api.yaml +53 -0
  40. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0613-ssot-path-length-policy.yaml +37 -0
  41. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0614-profile-evaluation-and-boundary-resolution.yaml +71 -0
  42. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0615-typed-spec-to-adr-linking.yaml +20 -0
  43. ssot_contracts-0.2.15.dev2/src/ssot_contracts/templates/specs/SPEC-0616-out-of-bounds-implementation-disposition.yaml +51 -0
  44. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/templates/specs/manifest.json +51 -51
  45. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts.egg-info/PKG-INFO +4 -5
  46. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts.egg-info/SOURCES.txt +34 -34
  47. ssot_contracts-0.2.14.dev1/src/ssot_contracts/schema/release.snapshot.schema.json +0 -1
  48. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0600-canonical-json-registry.json +0 -1
  49. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0601-features-are-targetable-units.json +0 -1
  50. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0602-issues-are-plannable-work-items.json +0 -1
  51. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0603-entity-centric-registry-derived-graph.json +0 -1
  52. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0604-normalized-prefixed-ids.json +0 -1
  53. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0605-claim-status-vs-tier.json +0 -1
  54. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0606-feature-implementation-vs-lifecycle.json +0 -1
  55. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0607-immutable-boundary-and-release-snapshots.json +0 -1
  56. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0608-fail-closed-guards.json +0 -1
  57. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0609-generated-projections-are-non-canonical.json +0 -1
  58. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0610-explicit-schema-versioning.json +0 -1
  59. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0611-portable-core-repo-specific-evidence-adapters.json +0 -1
  60. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0612-ssot-path-and-filename-length-limits.json +0 -1
  61. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0613-profiles-as-reusable-feature-bundles.json +0 -1
  62. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0614-specs-own-typed-adr-links.json +0 -1
  63. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0615-downstream-assurance-language-ceilings.json +0 -1
  64. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/adr/ADR-0616-out-of-bounds-implementation-disposition.json +0 -1
  65. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0600-registry-core.json +0 -1
  66. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0601-cli.json +0 -1
  67. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0602-graph-model.json +0 -1
  68. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0603-feature-lifecycle.json +0 -1
  69. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0604-claim-statuses.json +0 -1
  70. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0605-claim-tiers.json +0 -1
  71. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0606-snapshots-and-reports.json +0 -1
  72. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0607-repo-policy.json +0 -1
  73. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0608-gates-and-fences.json +0 -1
  74. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0609-id-normalization.json +0 -1
  75. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0610-file-tree.json +0 -1
  76. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0611-planning-horizons.json +0 -1
  77. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0612-python-api.json +0 -1
  78. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0613-ssot-path-length-policy.json +0 -1
  79. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0614-profile-evaluation-and-boundary-resolution.json +0 -1
  80. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0615-typed-spec-to-adr-linking.json +0 -1
  81. ssot_contracts-0.2.14.dev1/src/ssot_contracts/templates/specs/SPEC-0616-out-of-bounds-implementation-disposition.json +0 -1
  82. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/setup.cfg +0 -0
  83. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/__init__.py +0 -0
  84. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/generated/__init__.py +0 -0
  85. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/generated/python/__init__.py +0 -0
  86. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/generated/python/cli_metadata.py +0 -0
  87. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/generated/python/enums.py +0 -0
  88. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/generated/python/ids.py +0 -0
  89. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/generated/python/tui_metadata.py +0 -0
  90. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/__init__.py +0 -0
  91. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/adr.schema.json +0 -0
  92. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/boundary.snapshot.schema.json +0 -0
  93. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/certification.report.schema.json +0 -0
  94. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/graph.export.schema.json +0 -0
  95. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/published.snapshot.schema.json +0 -0
  96. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/spec.schema.json +0 -0
  97. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/schema/validation.report.schema.json +0 -0
  98. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/templates/__init__.py +0 -0
  99. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/templates/adr/__init__.py +0 -0
  100. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts/templates/specs/__init__.py +0 -0
  101. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts.egg-info/dependency_links.txt +0 -0
  102. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.dev2}/src/ssot_contracts.egg-info/requires.txt +0 -0
  103. {ssot_contracts-0.2.14.dev1 → ssot_contracts-0.2.15.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.14.dev1
3
+ Version: 0.2.15.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
@@ -58,7 +58,7 @@ Use `ssot-contracts` when you want:
58
58
 
59
59
  - packaged schemas and templates without the full CLI
60
60
  - a stable place to load SSOT manifests and contract metadata from Python
61
- - the artifact layer consumed by [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), and [ssot-codegen](https://pypi.org/project/ssot-codegen/)
61
+ - the artifact layer consumed by [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-conformance](https://pypi.org/project/ssot-conformance/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), and [ssot-codegen](https://pypi.org/project/ssot-codegen/)
62
62
 
63
63
  Use another package when you want:
64
64
 
@@ -136,7 +136,7 @@ Read packaged document bodies:
136
136
  ```python
137
137
  from ssot_contracts import read_packaged_document_text
138
138
 
139
- text = read_packaged_document_text("adr", "ADR-0600-canonical-json-registry.json")
139
+ text = read_packaged_document_text("adr", "ADR-0600-canonical-json-registry.yaml")
140
140
  print(text.splitlines()[0])
141
141
  ```
142
142
 
@@ -155,7 +155,6 @@ These modules provide shared constants such as output formats, entity section la
155
155
 
156
156
  - Package type: artifact and contract package
157
157
  - Depends on: standard library only, plus `tomli` on Python earlier than 3.11
158
- - Consumed by: [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), [ssot-codegen](https://pypi.org/project/ssot-codegen/)
158
+ - Consumed by: [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-conformance](https://pypi.org/project/ssot-conformance/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), [ssot-codegen](https://pypi.org/project/ssot-codegen/)
159
159
 
160
160
  If you need the canonical packaged schemas and manifests, install this package. It is the lowest-level reusable contract layer in the workspace.
161
-
@@ -27,7 +27,7 @@ Use `ssot-contracts` when you want:
27
27
 
28
28
  - packaged schemas and templates without the full CLI
29
29
  - a stable place to load SSOT manifests and contract metadata from Python
30
- - the artifact layer consumed by [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), and [ssot-codegen](https://pypi.org/project/ssot-codegen/)
30
+ - the artifact layer consumed by [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-conformance](https://pypi.org/project/ssot-conformance/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), and [ssot-codegen](https://pypi.org/project/ssot-codegen/)
31
31
 
32
32
  Use another package when you want:
33
33
 
@@ -105,7 +105,7 @@ Read packaged document bodies:
105
105
  ```python
106
106
  from ssot_contracts import read_packaged_document_text
107
107
 
108
- text = read_packaged_document_text("adr", "ADR-0600-canonical-json-registry.json")
108
+ text = read_packaged_document_text("adr", "ADR-0600-canonical-json-registry.yaml")
109
109
  print(text.splitlines()[0])
110
110
  ```
111
111
 
@@ -124,7 +124,6 @@ These modules provide shared constants such as output formats, entity section la
124
124
 
125
125
  - Package type: artifact and contract package
126
126
  - Depends on: standard library only, plus `tomli` on Python earlier than 3.11
127
- - Consumed by: [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), [ssot-codegen](https://pypi.org/project/ssot-codegen/)
127
+ - Consumed by: [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-cli](https://pypi.org/project/ssot-cli/), [ssot-conformance](https://pypi.org/project/ssot-conformance/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), [ssot-codegen](https://pypi.org/project/ssot-codegen/)
128
128
 
129
129
  If you need the canonical packaged schemas and manifests, install this package. It is the lowest-level reusable contract layer in the workspace.
130
-
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ssot-contracts"
7
- version = "0.2.14.dev1"
7
+ version = "0.2.15.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"
@@ -46,5 +46,5 @@ where = ["src"]
46
46
  [tool.setuptools.package-data]
47
47
  "ssot_contracts.schema" = ["*.json"]
48
48
  "ssot_contracts.templates" = ["*.json"]
49
- "ssot_contracts.templates.adr" = ["*.json"]
50
- "ssot_contracts.templates.specs" = ["*.json"]
49
+ "ssot_contracts.templates.adr" = ["*.json", "*.yaml"]
50
+ "ssot_contracts.templates.specs" = ["*.json", "*.yaml"]
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  CONTRACT_DATA = {
4
- "schema_version": "0.2.0",
4
+ "schema_version": "0.3.0",
5
5
  "output_formats": ["json", "csv", "df", "yaml", "toml"],
6
6
  "entity_sections": [
7
7
  {"key": "features", "label": "Features"},
@@ -1 +1 @@
1
- {"$defs":{"adr":{"additionalProperties":true,"properties":{"content_sha256":{"pattern":"^[a-f0-9]{64}$","type":"string"},"id":{"$ref":"#/$defs/normalizedId"},"immutable":{"type":"boolean"},"managed":{"type":"boolean"},"number":{"minimum":1,"type":"integer"},"origin":{"enum":["ssot-core","ssot-origin","repo-local"]},"package_version":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"slug":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"status":{"$ref":"#/$defs/documentStatus"},"status_notes":{"items":{"$ref":"#/$defs/statusNote"},"type":"array"},"superseded_by":{"$ref":"#/$defs/stringList"},"supersedes":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","number","slug","title","path","origin","managed","immutable","package_version","content_sha256","status","supersedes","superseded_by","status_notes"],"type":"object"},"boundary":{"additionalProperties":true,"properties":{"feature_ids":{"$ref":"#/$defs/stringList"},"frozen":{"type":"boolean"},"id":{"$ref":"#/$defs/normalizedId"},"profile_ids":{"items":{"type":"string"},"type":"array"},"status":{"enum":["draft","active","frozen","retired"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","frozen","feature_ids","profile_ids"],"type":"object"},"claim":{"additionalProperties":true,"properties":{"description":{"type":"string"},"evidence_ids":{"$ref":"#/$defs/stringList"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"minLength":1,"type":"string"},"status":{"enum":["proposed","declared","implemented","asserted","evidenced","certified","promoted","published","blocked","retired"]},"test_ids":{"$ref":"#/$defs/stringList"},"tier":{"enum":["T0","T1","T2","T3","T4"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","tier","kind","description","feature_ids","test_ids","evidence_ids"],"type":"object"},"documentIdReservations":{"additionalProperties":false,"properties":{"adr":{"items":{"$ref":"#/$defs/documentReservationRange"},"type":"array"},"spec":{"items":{"$ref":"#/$defs/documentReservationRange"},"type":"array"}},"required":["adr","spec"],"type":"object"},"documentReservationRange":{"additionalProperties":true,"properties":{"assignable_by_repo":{"type":"boolean"},"deletable":{"type":"boolean"},"end":{"minimum":1,"type":"integer"},"immutable":{"type":"boolean"},"owner":{"minLength":1,"type":"string"},"start":{"minimum":1,"type":"integer"}},"required":["owner","start","end","immutable","deletable","assignable_by_repo"],"type":"object"},"documentStatus":{"enum":["draft","in_review","accepted","rejected","superseded","withdrawn","retired"]},"evidence":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"status":{"enum":["planned","collected","passed","failed","stale"]},"test_ids":{"$ref":"#/$defs/stringList"},"tier":{"enum":["T0","T1","T2","T3","T4"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","kind","tier","path","claim_ids","test_ids"],"type":"object"},"feature":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"description":{"type":"string"},"id":{"$ref":"#/$defs/normalizedId"},"implementation_status":{"enum":["absent","partial","implemented"]},"lifecycle":{"$ref":"#/$defs/featureLifecycle"},"plan":{"$ref":"#/$defs/featurePlan"},"requires":{"$ref":"#/$defs/stringList"},"spec_ids":{"$ref":"#/$defs/stringList"},"test_ids":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","title","description","implementation_status","lifecycle","plan","spec_ids","claim_ids","test_ids"],"type":"object"},"featureLifecycle":{"additionalProperties":true,"properties":{"effective_release_id":{"type":["string","null"]},"note":{"type":["string","null"]},"replacement_feature_ids":{"$ref":"#/$defs/stringList"},"stage":{"enum":["active","deprecated","obsolete","removed"]}},"required":["stage","replacement_feature_ids","note"],"type":"object"},"featurePlan":{"additionalProperties":true,"properties":{"horizon":{"enum":["current","next","future","explicit","backlog","out_of_bounds"]},"out_of_bounds_disposition":{"enum":["prohibited","tolerated",null],"type":["string","null"]},"slot":{"type":["string","null"]},"target_claim_tier":{"enum":["T0","T1","T2","T3","T4",null],"type":["string","null"]},"target_lifecycle_stage":{"enum":["active","deprecated","obsolete","removed"]}},"required":["horizon","slot","target_claim_tier","target_lifecycle_stage"],"type":"object"},"guardPolicies":{"additionalProperties":true,"type":"object"},"issue":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"description":{"type":"string"},"evidence_ids":{"$ref":"#/$defs/stringList"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"plan":{"$ref":"#/$defs/issuePlan"},"release_blocking":{"type":"boolean"},"risk_ids":{"$ref":"#/$defs/stringList"},"severity":{"enum":["low","medium","high","critical"]},"status":{"enum":["open","in_progress","blocked","resolved","closed"]},"test_ids":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","severity","description","plan","feature_ids","claim_ids","test_ids","evidence_ids","risk_ids","release_blocking"],"type":"object"},"issuePlan":{"additionalProperties":true,"properties":{"horizon":{"enum":["current","next","future","explicit","backlog","out_of_bounds"]},"slot":{"type":["string","null"]}},"required":["horizon","slot"],"type":"object"},"normalizedId":{"maxLength":128,"pattern":"^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9._-]*$","type":"string"},"paths":{"additionalProperties":true,"properties":{"adr_root":{"minLength":1,"type":"string"},"cache_root":{"minLength":1,"type":"string"},"evidence_root":{"minLength":1,"type":"string"},"graph_root":{"minLength":1,"type":"string"},"release_root":{"minLength":1,"type":"string"},"report_root":{"minLength":1,"type":"string"},"schema_root":{"minLength":1,"type":"string"},"spec_root":{"minLength":1,"type":"string"},"ssot_root":{"minLength":1,"type":"string"}},"required":["ssot_root","schema_root","adr_root","spec_root","graph_root","evidence_root","release_root","report_root","cache_root"],"type":"object"},"profile":{"additionalProperties":false,"properties":{"claim_tier":{"enum":["T0","T1","T2","T3","T4",null],"type":["string","null"]},"description":{"type":"string"},"evaluation":{"additionalProperties":false,"properties":{"allow_feature_override_tier":{"type":"boolean"},"mode":{"enum":["all_features_must_pass"]}},"required":["mode","allow_feature_override_tier"],"type":"object"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"enum":["capability","certification","deployment","interoperability"]},"profile_ids":{"$ref":"#/$defs/stringList"},"status":{"enum":["draft","active","retired"]},"title":{"type":"string"}},"required":["id","title","description","status","kind","feature_ids","profile_ids","claim_tier","evaluation"],"type":"object"},"program":{"additionalProperties":true,"properties":{"active_boundary_id":{"$ref":"#/$defs/normalizedId"},"active_release_id":{"$ref":"#/$defs/normalizedId"}},"required":["active_boundary_id","active_release_id"],"type":"object"},"release":{"additionalProperties":true,"properties":{"boundary_id":{"$ref":"#/$defs/normalizedId"},"claim_ids":{"$ref":"#/$defs/stringList"},"evidence_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"status":{"enum":["draft","candidate","certified","promoted","published","revoked"]},"version":{"minLength":1,"type":"string"}},"required":["id","version","status","boundary_id","claim_ids","evidence_ids"],"type":"object"},"repo":{"additionalProperties":true,"properties":{"id":{"$ref":"#/$defs/normalizedId"},"kind":{"enum":["ssot-core","ssot-origin","repo-local"]},"name":{"minLength":1,"type":"string"},"version":{"minLength":1,"type":"string"}},"required":["id","name","version","kind"],"type":"object"},"risk":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"description":{"type":"string"},"evidence_ids":{"$ref":"#/$defs/stringList"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"issue_ids":{"$ref":"#/$defs/stringList"},"release_blocking":{"type":"boolean"},"severity":{"enum":["low","medium","high","critical"]},"status":{"enum":["active","mitigated","accepted","retired"]},"test_ids":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","severity","description","feature_ids","claim_ids","test_ids","evidence_ids","issue_ids","release_blocking"],"type":"object"},"spec":{"additionalProperties":true,"properties":{"adr_ids":{"$ref":"#/$defs/stringList"},"content_sha256":{"pattern":"^[a-f0-9]{64}$","type":"string"},"id":{"$ref":"#/$defs/normalizedId"},"immutable":{"type":"boolean"},"kind":{"enum":["normative","operational","governance","local-policy"]},"managed":{"type":"boolean"},"number":{"minimum":1,"type":"integer"},"origin":{"enum":["ssot-core","ssot-origin","repo-local"]},"package_version":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"slug":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"status":{"$ref":"#/$defs/documentStatus"},"status_notes":{"items":{"$ref":"#/$defs/statusNote"},"type":"array"},"superseded_by":{"$ref":"#/$defs/stringList"},"supersedes":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","number","slug","title","path","origin","managed","immutable","package_version","content_sha256","kind","adr_ids","status","supersedes","superseded_by","status_notes"],"type":"object"},"statusNote":{"additionalProperties":false,"properties":{"actor":{"minLength":1,"type":"string"},"at":{"minLength":1,"type":"string"},"note":{"minLength":1,"type":"string"},"reason":{"minLength":1,"type":"string"},"status":{"$ref":"#/$defs/documentStatus"}},"required":["status","note","at"],"type":"object"},"stringList":{"items":{"$ref":"#/$defs/normalizedId"},"type":"array"},"test":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"evidence_ids":{"$ref":"#/$defs/stringList"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"status":{"enum":["planned","passing","failing","blocked","skipped"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","kind","path","feature_ids","claim_ids","evidence_ids"],"type":"object"},"tooling":{"additionalProperties":true,"properties":{"initialized_with_version":{"minLength":1,"type":"string"},"last_upgraded_from_version":{"minLength":1,"type":"string"},"ssot_registry_version":{"minLength":1,"type":"string"}},"required":["ssot_registry_version","initialized_with_version","last_upgraded_from_version"],"type":"object"}},"$id":"https://example.invalid/ssot-registry/registry.schema.json","$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"allOf":[{"if":{"properties":{"repo":{"properties":{"kind":{"const":"repo-local"}},"required":["kind"],"type":"object"}}},"then":{"properties":{"adrs":{"not":{"contains":{"properties":{"origin":{"const":"ssot-core"}},"required":["origin"],"type":"object"}}},"specs":{"not":{"contains":{"properties":{"origin":{"const":"ssot-core"}},"required":["origin"],"type":"object"}}}}}}],"properties":{"adrs":{"items":{"$ref":"#/$defs/adr"},"type":"array"},"boundaries":{"items":{"$ref":"#/$defs/boundary"},"type":"array"},"claims":{"items":{"$ref":"#/$defs/claim"},"type":"array"},"document_id_reservations":{"$ref":"#/$defs/documentIdReservations"},"evidence":{"items":{"$ref":"#/$defs/evidence"},"type":"array"},"features":{"items":{"$ref":"#/$defs/feature"},"type":"array"},"guard_policies":{"$ref":"#/$defs/guardPolicies"},"issues":{"items":{"$ref":"#/$defs/issue"},"type":"array"},"paths":{"$ref":"#/$defs/paths"},"profiles":{"items":{"$ref":"#/$defs/profile"},"type":"array"},"program":{"$ref":"#/$defs/program"},"releases":{"items":{"$ref":"#/$defs/release"},"type":"array"},"repo":{"$ref":"#/$defs/repo"},"risks":{"items":{"$ref":"#/$defs/risk"},"type":"array"},"schema_version":{"const":"0.1.0"},"specs":{"items":{"$ref":"#/$defs/spec"},"type":"array"},"tests":{"items":{"$ref":"#/$defs/test"},"type":"array"},"tooling":{"$ref":"#/$defs/tooling"}},"required":["schema_version","repo","tooling","paths","program","guard_policies","document_id_reservations","features","profiles","tests","claims","evidence","issues","risks","boundaries","releases","adrs","specs"],"title":"ssot-registry canonical registry","type":"object"}
1
+ {"$defs":{"adr":{"additionalProperties":true,"properties":{"content_sha256":{"pattern":"^[a-f0-9]{64}$","type":"string"},"id":{"$ref":"#/$defs/normalizedId"},"immutable":{"type":"boolean"},"managed":{"type":"boolean"},"number":{"minimum":1,"type":"integer"},"origin":{"enum":["ssot-core","ssot-origin","repo-local"]},"package_version":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"slug":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"status":{"$ref":"#/$defs/documentStatus"},"status_notes":{"items":{"$ref":"#/$defs/statusNote"},"type":"array"},"superseded_by":{"$ref":"#/$defs/stringList"},"supersedes":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","number","slug","title","path","origin","managed","immutable","package_version","content_sha256","status","supersedes","superseded_by","status_notes"],"type":"object"},"boundary":{"additionalProperties":true,"properties":{"feature_ids":{"$ref":"#/$defs/stringList"},"frozen":{"type":"boolean"},"id":{"$ref":"#/$defs/normalizedId"},"profile_ids":{"items":{"type":"string"},"type":"array"},"status":{"enum":["draft","active","frozen","retired"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","frozen","feature_ids","profile_ids"],"type":"object"},"claim":{"additionalProperties":true,"properties":{"description":{"type":"string"},"evidence_ids":{"$ref":"#/$defs/stringList"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"minLength":1,"type":"string"},"status":{"enum":["proposed","declared","implemented","asserted","evidenced","certified","promoted","published","blocked","retired"]},"test_ids":{"$ref":"#/$defs/stringList"},"tier":{"enum":["T0","T1","T2","T3","T4"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","tier","kind","description","feature_ids","test_ids","evidence_ids"],"type":"object"},"documentIdReservations":{"additionalProperties":false,"properties":{"adr":{"items":{"$ref":"#/$defs/documentReservationRange"},"type":"array"},"spec":{"items":{"$ref":"#/$defs/documentReservationRange"},"type":"array"}},"required":["adr","spec"],"type":"object"},"documentReservationRange":{"additionalProperties":true,"properties":{"assignable_by_repo":{"type":"boolean"},"deletable":{"type":"boolean"},"end":{"minimum":1,"type":"integer"},"immutable":{"type":"boolean"},"owner":{"minLength":1,"type":"string"},"start":{"minimum":1,"type":"integer"}},"required":["owner","start","end","immutable","deletable","assignable_by_repo"],"type":"object"},"documentStatus":{"enum":["draft","in_review","accepted","rejected","superseded","withdrawn","retired"]},"evidence":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"status":{"enum":["planned","collected","passed","failed","stale"]},"test_ids":{"$ref":"#/$defs/stringList"},"tier":{"enum":["T0","T1","T2","T3","T4"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","kind","tier","path","claim_ids","test_ids"],"type":"object"},"feature":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"description":{"type":"string"},"id":{"$ref":"#/$defs/normalizedId"},"implementation_status":{"enum":["absent","partial","implemented"]},"lifecycle":{"$ref":"#/$defs/featureLifecycle"},"plan":{"$ref":"#/$defs/featurePlan"},"requires":{"$ref":"#/$defs/stringList"},"spec_ids":{"$ref":"#/$defs/stringList"},"test_ids":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","title","description","implementation_status","lifecycle","plan","spec_ids","claim_ids","test_ids"],"type":"object"},"featureLifecycle":{"additionalProperties":true,"properties":{"effective_release_id":{"type":["string","null"]},"note":{"type":["string","null"]},"replacement_feature_ids":{"$ref":"#/$defs/stringList"},"stage":{"enum":["active","deprecated","obsolete","removed"]}},"required":["stage","replacement_feature_ids","note"],"type":"object"},"featurePlan":{"additionalProperties":true,"properties":{"horizon":{"enum":["current","next","future","explicit","backlog","out_of_bounds"]},"out_of_bounds_disposition":{"enum":["prohibited","tolerated",null],"type":["string","null"]},"slot":{"type":["string","null"]},"target_claim_tier":{"enum":["T0","T1","T2","T3","T4",null],"type":["string","null"]},"target_lifecycle_stage":{"enum":["active","deprecated","obsolete","removed"]}},"required":["horizon","slot","target_claim_tier","target_lifecycle_stage"],"type":"object"},"guardPolicies":{"additionalProperties":true,"type":"object"},"issue":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"description":{"type":"string"},"evidence_ids":{"$ref":"#/$defs/stringList"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"plan":{"$ref":"#/$defs/issuePlan"},"release_blocking":{"type":"boolean"},"risk_ids":{"$ref":"#/$defs/stringList"},"severity":{"enum":["low","medium","high","critical"]},"status":{"enum":["open","in_progress","blocked","resolved","closed"]},"test_ids":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","severity","description","plan","feature_ids","claim_ids","test_ids","evidence_ids","risk_ids","release_blocking"],"type":"object"},"issuePlan":{"additionalProperties":true,"properties":{"horizon":{"enum":["current","next","future","explicit","backlog","out_of_bounds"]},"slot":{"type":["string","null"]}},"required":["horizon","slot"],"type":"object"},"normalizedId":{"maxLength":128,"pattern":"^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9._-]*$","type":"string"},"paths":{"additionalProperties":true,"properties":{"adr_root":{"minLength":1,"type":"string"},"cache_root":{"minLength":1,"type":"string"},"evidence_root":{"minLength":1,"type":"string"},"graph_root":{"minLength":1,"type":"string"},"release_root":{"minLength":1,"type":"string"},"report_root":{"minLength":1,"type":"string"},"schema_root":{"minLength":1,"type":"string"},"spec_root":{"minLength":1,"type":"string"},"ssot_root":{"minLength":1,"type":"string"}},"required":["ssot_root","schema_root","adr_root","spec_root","graph_root","evidence_root","release_root","report_root","cache_root"],"type":"object"},"profile":{"additionalProperties":false,"properties":{"claim_tier":{"enum":["T0","T1","T2","T3","T4",null],"type":["string","null"]},"description":{"type":"string"},"evaluation":{"additionalProperties":false,"properties":{"allow_feature_override_tier":{"type":"boolean"},"mode":{"enum":["all_features_must_pass"]}},"required":["mode","allow_feature_override_tier"],"type":"object"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"enum":["capability","certification","deployment","interoperability"]},"profile_ids":{"$ref":"#/$defs/stringList"},"status":{"enum":["draft","active","retired"]},"title":{"type":"string"}},"required":["id","title","description","status","kind","feature_ids","profile_ids","claim_tier","evaluation"],"type":"object"},"program":{"additionalProperties":true,"properties":{"active_boundary_id":{"$ref":"#/$defs/normalizedId"},"active_release_id":{"$ref":"#/$defs/normalizedId"}},"required":["active_boundary_id","active_release_id"],"type":"object"},"release":{"additionalProperties":true,"properties":{"boundary_id":{"$ref":"#/$defs/normalizedId"},"boundary_ids":{"$ref":"#/$defs/stringList"},"claim_ids":{"$ref":"#/$defs/stringList"},"evidence_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"status":{"enum":["draft","candidate","certified","promoted","published","revoked"]},"version":{"minLength":1,"type":"string"}},"required":["id","version","status","boundary_id","boundary_ids","claim_ids","evidence_ids"],"type":"object"},"repo":{"additionalProperties":true,"properties":{"id":{"$ref":"#/$defs/normalizedId"},"kind":{"enum":["ssot-core","ssot-origin","repo-local"]},"name":{"minLength":1,"type":"string"},"version":{"minLength":1,"type":"string"}},"required":["id","name","version","kind"],"type":"object"},"risk":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"description":{"type":"string"},"evidence_ids":{"$ref":"#/$defs/stringList"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"issue_ids":{"$ref":"#/$defs/stringList"},"release_blocking":{"type":"boolean"},"severity":{"enum":["low","medium","high","critical"]},"status":{"enum":["active","mitigated","accepted","retired"]},"test_ids":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","severity","description","feature_ids","claim_ids","test_ids","evidence_ids","issue_ids","release_blocking"],"type":"object"},"spec":{"additionalProperties":true,"properties":{"adr_ids":{"$ref":"#/$defs/stringList"},"content_sha256":{"pattern":"^[a-f0-9]{64}$","type":"string"},"id":{"$ref":"#/$defs/normalizedId"},"immutable":{"type":"boolean"},"kind":{"enum":["normative","operational","governance","local-policy"]},"managed":{"type":"boolean"},"number":{"minimum":1,"type":"integer"},"origin":{"enum":["ssot-core","ssot-origin","repo-local"]},"package_version":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"slug":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"status":{"$ref":"#/$defs/documentStatus"},"status_notes":{"items":{"$ref":"#/$defs/statusNote"},"type":"array"},"superseded_by":{"$ref":"#/$defs/stringList"},"supersedes":{"$ref":"#/$defs/stringList"},"title":{"minLength":1,"type":"string"}},"required":["id","number","slug","title","path","origin","managed","immutable","package_version","content_sha256","kind","adr_ids","status","supersedes","superseded_by","status_notes"],"type":"object"},"statusNote":{"additionalProperties":false,"properties":{"actor":{"minLength":1,"type":"string"},"at":{"minLength":1,"type":"string"},"note":{"minLength":1,"type":"string"},"reason":{"minLength":1,"type":"string"},"status":{"$ref":"#/$defs/documentStatus"}},"required":["status","note","at"],"type":"object"},"stringList":{"items":{"$ref":"#/$defs/normalizedId"},"type":"array"},"test":{"additionalProperties":true,"properties":{"claim_ids":{"$ref":"#/$defs/stringList"},"evidence_ids":{"$ref":"#/$defs/stringList"},"execution":{"$ref":"#/$defs/testExecution"},"feature_ids":{"$ref":"#/$defs/stringList"},"id":{"$ref":"#/$defs/normalizedId"},"kind":{"minLength":1,"type":"string"},"path":{"minLength":1,"type":"string"},"status":{"enum":["planned","passing","failing","blocked","skipped"]},"title":{"minLength":1,"type":"string"}},"required":["id","title","status","kind","path","feature_ids","claim_ids","evidence_ids"],"type":"object"},"testExecution":{"additionalProperties":false,"properties":{"argv":{"items":{"type":"string"},"minItems":1,"type":"array"},"cwd":{"minLength":1,"type":"string"},"env":{"additionalProperties":{"type":"string"},"type":"object"},"mode":{"const":"command"},"success":{"$ref":"#/$defs/testExecutionSuccess"},"timeout_seconds":{"exclusiveMinimum":0,"type":"integer"}},"required":["mode","argv","cwd","env","timeout_seconds","success"],"type":"object"},"testExecutionSuccess":{"additionalProperties":false,"properties":{"expected":{"type":"integer"},"type":{"const":"exit_code"}},"required":["type","expected"],"type":"object"},"tooling":{"additionalProperties":true,"properties":{"initialized_with_version":{"minLength":1,"type":"string"},"last_upgraded_from_version":{"minLength":1,"type":"string"},"ssot_registry_version":{"minLength":1,"type":"string"}},"required":["ssot_registry_version","initialized_with_version","last_upgraded_from_version"],"type":"object"}},"$id":"https://example.invalid/ssot-registry/registry.schema.json","$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false,"allOf":[{"if":{"properties":{"repo":{"properties":{"kind":{"const":"repo-local"}},"required":["kind"],"type":"object"}}},"then":{"properties":{"adrs":{"not":{"contains":{"properties":{"origin":{"const":"ssot-core"}},"required":["origin"],"type":"object"}}},"specs":{"not":{"contains":{"properties":{"origin":{"const":"ssot-core"}},"required":["origin"],"type":"object"}}}}}}],"properties":{"adrs":{"items":{"$ref":"#/$defs/adr"},"type":"array"},"boundaries":{"items":{"$ref":"#/$defs/boundary"},"type":"array"},"claims":{"items":{"$ref":"#/$defs/claim"},"type":"array"},"document_id_reservations":{"$ref":"#/$defs/documentIdReservations"},"evidence":{"items":{"$ref":"#/$defs/evidence"},"type":"array"},"features":{"items":{"$ref":"#/$defs/feature"},"type":"array"},"guard_policies":{"$ref":"#/$defs/guardPolicies"},"issues":{"items":{"$ref":"#/$defs/issue"},"type":"array"},"paths":{"$ref":"#/$defs/paths"},"profiles":{"items":{"$ref":"#/$defs/profile"},"type":"array"},"program":{"$ref":"#/$defs/program"},"releases":{"items":{"$ref":"#/$defs/release"},"type":"array"},"repo":{"$ref":"#/$defs/repo"},"risks":{"items":{"$ref":"#/$defs/risk"},"type":"array"},"schema_version":{"const":"0.3.0"},"specs":{"items":{"$ref":"#/$defs/spec"},"type":"array"},"tests":{"items":{"$ref":"#/$defs/test"},"type":"array"},"tooling":{"$ref":"#/$defs/tooling"}},"required":["schema_version","repo","tooling","paths","program","guard_policies","document_id_reservations","features","profiles","tests","claims","evidence","issues","risks","boundaries","releases","adrs","specs"],"title":"ssot-registry canonical registry","type":"object"}
@@ -0,0 +1 @@
1
+ {"$id":"https://example.invalid/ssot-registry/release.snapshot.schema.json","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"boundaries":{"items":{"type":"object"},"type":"array"},"boundary":{"type":["object","null"]},"claims":{"items":{"type":"object"},"type":"array"},"evidence":{"items":{"type":"object"},"type":"array"},"features":{"items":{"type":"object"},"type":"array"},"file_hashes":{"type":"object"},"generated_at":{"type":"string"},"kind":{"const":"release_snapshot"},"profile_evaluations":{"items":{"type":"object"},"type":"array"},"profiles":{"items":{"type":"object"},"type":"array"},"registry_path":{"type":"string"},"registry_sha256":{"type":"string"},"release":{"properties":{"boundary_id":{"type":"string"},"boundary_ids":{"items":{"type":"string"},"type":"array"},"claim_ids":{"items":{"type":"string"},"type":"array"},"evidence_ids":{"items":{"type":"string"},"type":"array"},"id":{"type":"string"},"status":{"type":"string"},"version":{"type":"string"}},"required":["id","version","status","boundary_id","boundary_ids","claim_ids","evidence_ids"],"type":"object"},"schema_version":{"type":"integer"},"summary":{"properties":{"boundary_count":{"type":"integer"},"boundary_id":{"type":["string","null"]},"boundary_ids":{"items":{"type":"string"},"type":"array"},"claim_count":{"type":"integer"},"evidence_count":{"type":"integer"},"feature_count":{"type":"integer"},"profile_count":{"type":"integer"},"release_id":{"type":"string"},"status":{"type":"string"},"test_count":{"type":"integer"},"version":{"type":"string"}},"required":["release_id","version","boundary_id","boundary_ids","boundary_count","feature_count","profile_count","claim_count","test_count","evidence_count","status"],"type":"object"},"tests":{"items":{"type":"object"},"type":"array"}},"required":["schema_version","kind","generated_at","registry_path","registry_sha256","release","boundary","boundaries","features","profiles","profile_evaluations","claims","tests","evidence","file_hashes","summary"],"type":"object"}
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ The only authored machine-readable source of truth is `.ssot/registry.json`.
3
+ decision_date: null
4
+ id: "adr:0600"
5
+ kind: "adr"
6
+ number: 600
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "canonical-json-registry"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "The only authored machine-readable source of truth is `.ssot/registry.json`."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Canonical registry is a single JSON document"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ Features are the only targetable implementation units. There is no separate `targets[]` section.
3
+ decision_date: null
4
+ id: "adr:0601"
5
+ kind: "adr"
6
+ number: 601
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "features-are-targetable-units"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "Features are the only targetable implementation units. There is no separate `targets[]` section."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Features are the targetable units"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ Issues and tickets can be planned as current, next, future, explicit, backlog, or out-of-bounds, but they are not substitute targets for features.
3
+ decision_date: null
4
+ id: "adr:0602"
5
+ kind: "adr"
6
+ number: 602
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "issues-are-plannable-work-items"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "Issues and tickets can be planned as current, next, future, explicit, backlog, or out-of-bounds, but they are not substitute targets for features."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Issues are plannable work items"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ The canonical registry is entity-centric JSON with explicit references. A graph export is derived from it.
3
+ decision_date: null
4
+ id: "adr:0603"
5
+ kind: "adr"
6
+ number: 603
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "entity-centric-registry-derived-graph"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "The canonical registry is entity-centric JSON with explicit references. A graph export is derived from it."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Entity-centric registry with a derived graph export"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ Every first-class entity uses a normalized prefixed ID.
3
+ decision_date: null
4
+ id: "adr:0604"
5
+ kind: "adr"
6
+ number: 604
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "normalized-prefixed-ids"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "Every first-class entity uses a normalized prefixed ID."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Normalized prefixed IDs"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ Claim status expresses lifecycle progression. Claim tier expresses assurance strength.
3
+ decision_date: null
4
+ id: "adr:0605"
5
+ kind: "adr"
6
+ number: 605
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "claim-status-vs-tier"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "Claim status expresses lifecycle progression. Claim tier expresses assurance strength."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Claim status and claim tier are orthogonal"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ `implementation_status` and `lifecycle.stage` are distinct fields.
3
+ decision_date: null
4
+ id: "adr:0606"
5
+ kind: "adr"
6
+ number: 606
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "feature-implementation-vs-lifecycle"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "`implementation_status` and `lifecycle.stage` are distinct fields."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Feature implementation state is separate from lifecycle state"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ Frozen boundaries and promoted/published releases emit immutable snapshots with hashes.
3
+ decision_date: null
4
+ id: "adr:0607"
5
+ kind: "adr"
6
+ number: 607
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "immutable-boundary-and-release-snapshots"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "Frozen boundaries and promoted/published releases emit immutable snapshots with hashes."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Immutable boundary and release snapshots"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ Validation, certification, promotion, publication, and lifecycle transitions refuse to proceed on guard violations.
3
+ decision_date: null
4
+ id: "adr:0608"
5
+ kind: "adr"
6
+ number: 608
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "fail-closed-guards"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "Validation, certification, promotion, publication, and lifecycle transitions refuse to proceed on guard violations."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Fail-closed guards"
@@ -0,0 +1,32 @@
1
+ body: |-
2
+ This is an `ssot-origin` ADR copied into downstream SSOT repositories.
3
+
4
+ In an operator repository, canonical authored SSOT content lives under `.ssot/`:
5
+
6
+ - `.ssot/registry.json`,
7
+ - repo-local ADRs under `.ssot/adr/`,
8
+ - repo-local specs under `.ssot/specs/`.
9
+
10
+ Packaged `ssot-origin` ADRs/specs provide baseline policy, but operators do not edit those synced copies directly.
11
+
12
+ Generated projections include:
13
+
14
+ - graph exports,
15
+ - reports and snapshots,
16
+ - rendered or exported representations such as CSV, YAML, TOML, DOT, PNG, and SVG,
17
+ - mirrored or regenerated documentation derived from the canonical SSOT content.
18
+ decision_date: null
19
+ id: "adr:0609"
20
+ kind: "adr"
21
+ number: 609
22
+ origin: "ssot-origin"
23
+ references: []
24
+ schema_version: "0.1.0"
25
+ slug: "generated-projections-are-non-canonical"
26
+ status: "draft"
27
+ status_notes: []
28
+ summary: "This is an `ssot-origin` ADR copied into downstream SSOT repositories."
29
+ superseded_by: []
30
+ supersedes: []
31
+ tags: []
32
+ title: "Generated projections are non-canonical"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ Breaking schema changes increment `schema_version` and require migration.
3
+ decision_date: null
4
+ id: "adr:0610"
5
+ kind: "adr"
6
+ number: 610
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "explicit-schema-versioning"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "Breaking schema changes increment `schema_version` and require migration."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Explicit schema versioning"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ The SSOT core contract governs and validates the registry graph. Repository-specific evidence generation is implemented outside the core (or through adapters) per repository.
3
+ decision_date: null
4
+ id: "adr:0611"
5
+ kind: "adr"
6
+ number: 611
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.1.0"
10
+ slug: "portable-core-repo-specific-evidence-adapters"
11
+ status: "draft"
12
+ status_notes: []
13
+ summary: "The SSOT core contract governs and validates the registry graph. Repository-specific evidence generation is implemented outside the core (or through adapters) per repository."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "Portable SSOT core with repo-specific evidence adapters"
@@ -0,0 +1,22 @@
1
+ body: |-
2
+ Files under `.ssot` MUST respect these limits:
3
+
4
+ - Maximum relative path length: **240** characters.
5
+ - Maximum filename length: **120** characters.
6
+
7
+ Validation fails when either limit is exceeded.
8
+ decision_date: null
9
+ id: "adr:0612"
10
+ kind: "adr"
11
+ number: 612
12
+ origin: "ssot-origin"
13
+ references: []
14
+ schema_version: "0.1.0"
15
+ slug: "ssot-path-and-filename-length-limits"
16
+ status: "draft"
17
+ status_notes: []
18
+ summary: "Files under `.ssot` MUST respect these limits:"
19
+ superseded_by: []
20
+ supersedes: []
21
+ tags: []
22
+ title: "Enforce max path and filename lengths under `.ssot`"
@@ -0,0 +1,41 @@
1
+ body: |-
2
+ ## Context
3
+
4
+ The registry needed an entity between atomic features and release boundaries:
5
+
6
+ - features are independently targetable,
7
+ - boundaries are release/freeze artifacts,
8
+ - releases certify a boundary scope.
9
+
10
+ Teams also need reusable capability bundles that can be composed and evaluated.
11
+
12
+ ## Decision
13
+
14
+ Introduce a first-class `profiles` entity:
15
+
16
+ - profile rows bundle `feature_ids` and nested `profile_ids`,
17
+ - profile pass/fail is computed (never stored),
18
+ - feature pass still requires satisfying claims and guard checks,
19
+ - boundary scope may include both direct `feature_ids` and `profile_ids`,
20
+ - boundary feature scope is resolved dynamically at evaluation/reporting time.
21
+
22
+ Tier resolution is fail-closed:
23
+
24
+ 1. feature `plan.target_claim_tier`,
25
+ 2. profile `claim_tier`,
26
+ 3. no tier => failing evaluation.
27
+ decision_date: null
28
+ id: "adr:0613"
29
+ kind: "adr"
30
+ number: 613
31
+ origin: "ssot-origin"
32
+ references: []
33
+ schema_version: "0.1.0"
34
+ slug: "profiles-as-reusable-feature-bundles"
35
+ status: "accepted"
36
+ status_notes: []
37
+ summary: "The registry needed an entity between atomic features and release boundaries:"
38
+ superseded_by: []
39
+ supersedes: []
40
+ tags: []
41
+ title: "Profiles are reusable feature bundles with derived pass status"
@@ -0,0 +1,17 @@
1
+ body: |-
2
+ SPEC documents own typed ADR references. Features continue to reference SPECs only. Feature-to-ADR visibility is derived transitively through feature.spec_ids -> spec.adr_ids. This is a breaking schema-model change that requires a schema_version bump and migration support.
3
+ decision_date: null
4
+ id: "adr:0614"
5
+ kind: "adr"
6
+ number: 614
7
+ origin: "ssot-origin"
8
+ references: []
9
+ schema_version: "0.2.0"
10
+ slug: "specs-own-typed-adr-links"
11
+ status: "accepted"
12
+ status_notes: []
13
+ summary: "SPEC documents own typed ADR references. Features continue to reference SPECs only. Feature-to-ADR visibility is derived transitively through feature.spec_ids -> spec.adr_ids. This is a breaking schema-model change that requires a schema_version bump and migration support."
14
+ superseded_by: []
15
+ supersedes: []
16
+ tags: []
17
+ title: "SPECs own typed ADR links"
@@ -0,0 +1,62 @@
1
+ body: |-
2
+ ## Context
3
+
4
+ SSOT downstream repositories use feature target claim tiers, linked claims, tests, and evidence to describe what a system can responsibly claim about a feature. The shared `T0` through `T4` tiers describe assurance strength, but downstream reports, release notes, README content, generated summaries, and certification artifacts also need a common language ceiling so weakly evidenced features are not described with stronger assurance language than their proof chains support.
5
+
6
+ This ADR is an `ssot-origin` decision. It is intended to apply to downstream repositories that synchronize and conform to SSOT origin documents, not only to the `ssot-registry` package repository.
7
+
8
+ ## Decision
9
+
10
+ Downstream SSOT repositories must treat each feature's effective target claim tier as the ceiling for assurance language used in SSOT-controlled outputs. A feature may be described with language from its effective tier or any weaker tier. It must not be described with stronger language unless a linked claim passes claim-closure checks at the stronger tier and the feature evaluation requires or accepts that stronger tier.
11
+
12
+ The effective tier is resolved by the applicable evaluation policy. For direct feature evaluation, use `feature.plan.target_claim_tier`. For profile evaluation, use the feature target tier when present, otherwise the profile claim tier when the profile policy permits that fallback. If no effective tier can be resolved, downstream tooling must fail closed and must not emit assurance claims stronger than inventory-level language.
13
+
14
+ Acceptable language by tier:
15
+
16
+ | Tier | Assurance ceiling | Acceptable claims language |
17
+ |---|---|---|
18
+ | `T0` | Declared intent or inventory-level | declared, tracked, intended, planned, in scope, inventory-level support |
19
+ | `T1` | Maintainer-asserted with local evidence | maintainer-asserted, locally evidenced, supported by local evidence, observed in maintainer-run checks |
20
+ | `T2` | Reproducible project-controlled verification | reproducibly verified, project-verified, verified by project-controlled tests or CI, repeatably validated |
21
+ | `T3` | Release-grade certified claim | release-certified, release-grade verified, certified for a named release or frozen boundary |
22
+ | `T4` | Independently reviewed or externally attested claim | independently reviewed, externally attested, third-party validated, validated by a named external source or artifact |
23
+
24
+ Disallowed escalations:
25
+
26
+ - `T0` features must not be described as working, verified, tested, certified, or attested.
27
+ - `T1` features must not be described as reproducibly verified, release-certified, or independently reviewed.
28
+ - `T2` features must not be described as release-certified or independently reviewed.
29
+ - `T3` features must not be described as independently reviewed or externally attested unless `T4` evidence exists.
30
+
31
+ Canonical wording templates:
32
+
33
+ - `T0`: Feature `<id>` is declared in scope for `<capability>`.
34
+ - `T1`: Maintainers assert that feature `<id>` supports `<capability>`, backed by local evidence `<evidence-id>`.
35
+ - `T2`: Feature `<id>` is reproducibly verified by project-controlled checks for `<capability>`.
36
+ - `T3`: Feature `<id>` is release-certified for `<release-or-boundary>` with passing claim closure at tier `T3` or higher.
37
+ - `T4`: Feature `<id>` is independently reviewed or externally attested for `<capability>` by `<source-or-artifact>`.
38
+
39
+ Claim status remains orthogonal to claim tier. Status may describe lifecycle progress, but it does not authorize stronger assurance language. Evidence tier alignment, linked test status, and feature target tier evaluation remain the enforcement mechanisms for whether stronger language is valid.
40
+
41
+ ## Consequences
42
+
43
+ Downstream generated summaries, READMEs, release notes, certification reports, review comments, and human-authored SSOT-controlled documentation must choose assurance language from the feature's effective tier or a weaker tier.
44
+
45
+ Downstream projects may adopt stricter vocabulary, additional review gates, or domain-specific phrasing, but they must not permit stronger assurance wording than the feature's passing proof chain supports.
46
+
47
+ Reviewers and automation should treat over-strong assurance language as a policy defect even when the underlying feature is implemented.
48
+ decision_date: null
49
+ id: "adr:0615"
50
+ kind: "adr"
51
+ number: 615
52
+ origin: "ssot-origin"
53
+ references: []
54
+ schema_version: "0.2.0"
55
+ slug: "downstream-assurance-language-ceilings"
56
+ status: "accepted"
57
+ status_notes: []
58
+ summary: "SSOT downstream repositories use feature target claim tiers, linked claims, tests, and evidence to describe what a system can responsibly claim about a feature. The shared `T0` through `T4` tiers describe assurance strength, but downstream reports, release notes, README content, generated summaries, and certification artifacts also need a common language ceiling so weakly evidenced features are not described with stronger assurance language than their proof chains support."
59
+ superseded_by: []
60
+ supersedes: []
61
+ tags: []
62
+ title: "Downstream assurance-language ceilings for feature target claim tiers"