ssot-contracts 0.2.4__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 (61) hide show
  1. ssot_contracts-0.2.4/PKG-INFO +34 -0
  2. ssot_contracts-0.2.4/README.md +8 -0
  3. ssot_contracts-0.2.4/pyproject.toml +45 -0
  4. ssot_contracts-0.2.4/setup.cfg +4 -0
  5. ssot_contracts-0.2.4/src/ssot_contracts/__init__.py +20 -0
  6. ssot_contracts-0.2.4/src/ssot_contracts/contract_data.py +92 -0
  7. ssot_contracts-0.2.4/src/ssot_contracts/generated/__init__.py +1 -0
  8. ssot_contracts-0.2.4/src/ssot_contracts/generated/python/__init__.py +11 -0
  9. ssot_contracts-0.2.4/src/ssot_contracts/generated/python/cli_metadata.py +6 -0
  10. ssot_contracts-0.2.4/src/ssot_contracts/generated/python/enums.py +24 -0
  11. ssot_contracts-0.2.4/src/ssot_contracts/generated/python/ids.py +8 -0
  12. ssot_contracts-0.2.4/src/ssot_contracts/generated/python/tui_metadata.py +18 -0
  13. ssot_contracts-0.2.4/src/ssot_contracts/schema/__init__.py +11 -0
  14. ssot_contracts-0.2.4/src/ssot_contracts/schema/boundary.snapshot.schema.json +15 -0
  15. ssot_contracts-0.2.4/src/ssot_contracts/schema/certification.report.schema.json +11 -0
  16. ssot_contracts-0.2.4/src/ssot_contracts/schema/graph.export.schema.json +54 -0
  17. ssot_contracts-0.2.4/src/ssot_contracts/schema/published.snapshot.schema.json +17 -0
  18. ssot_contracts-0.2.4/src/ssot_contracts/schema/registry.schema.json +1189 -0
  19. ssot_contracts-0.2.4/src/ssot_contracts/schema/release.snapshot.schema.json +20 -0
  20. ssot_contracts-0.2.4/src/ssot_contracts/schema/validation.report.schema.json +12 -0
  21. ssot_contracts-0.2.4/src/ssot_contracts/templates/__init__.py +31 -0
  22. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0001-canonical-json-registry.md +11 -0
  23. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0002-features-are-targetable-units.md +11 -0
  24. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0003-issues-are-plannable-work-items.md +11 -0
  25. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0004-entity-centric-registry-derived-graph.md +11 -0
  26. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0005-normalized-prefixed-ids.md +11 -0
  27. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0006-claim-status-vs-tier.md +11 -0
  28. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0007-feature-implementation-vs-lifecycle.md +11 -0
  29. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0008-immutable-boundary-and-release-snapshots.md +11 -0
  30. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0009-fail-closed-guards.md +11 -0
  31. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0010-generated-projections-are-non-canonical.md +18 -0
  32. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0011-explicit-schema-versioning.md +11 -0
  33. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0012-portable-core-repo-specific-evidence-adapters.md +11 -0
  34. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0013-ssot-path-and-filename-length-limits.md +17 -0
  35. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/ADR-0014-profiles-as-reusable-feature-bundles.md +38 -0
  36. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/__init__.py +0 -0
  37. ssot_contracts-0.2.4/src/ssot_contracts/templates/adr/manifest.json +254 -0
  38. ssot_contracts-0.2.4/src/ssot_contracts/templates/registry.full.json +223 -0
  39. ssot_contracts-0.2.4/src/ssot_contracts/templates/registry.minimal.json +142 -0
  40. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0001-registry-core.md +55 -0
  41. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0002-cli.md +30 -0
  42. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0003-graph-model.md +18 -0
  43. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0004-feature-lifecycle.md +12 -0
  44. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0005-claim-statuses.md +16 -0
  45. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0006-claim-tiers.md +11 -0
  46. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0007-snapshots-and-reports.md +12 -0
  47. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0008-repo-policy.md +28 -0
  48. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0009-gates-and-fences.md +13 -0
  49. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0010-id-normalization.md +21 -0
  50. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0011-file-tree.md +28 -0
  51. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0012-planning-horizons.md +14 -0
  52. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0013-python-api.md +25 -0
  53. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0014-ssot-path-length-policy.md +24 -0
  54. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/SPEC-0015-profile-evaluation-and-boundary-resolution.md +58 -0
  55. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/__init__.py +0 -0
  56. ssot_contracts-0.2.4/src/ssot_contracts/templates/specs/manifest.json +287 -0
  57. ssot_contracts-0.2.4/src/ssot_contracts.egg-info/PKG-INFO +34 -0
  58. ssot_contracts-0.2.4/src/ssot_contracts.egg-info/SOURCES.txt +59 -0
  59. ssot_contracts-0.2.4/src/ssot_contracts.egg-info/dependency_links.txt +1 -0
  60. ssot_contracts-0.2.4/src/ssot_contracts.egg-info/requires.txt +3 -0
  61. ssot_contracts-0.2.4/src/ssot_contracts.egg-info/top_level.txt +1 -0
@@ -0,0 +1,34 @@
1
+ Metadata-Version: 2.4
2
+ Name: ssot-contracts
3
+ Version: 0.2.4
4
+ Summary: Canonical schemas, templates, manifests, and generated Python contract artifacts for SSOT.
5
+ Author-email: Jacob Stewart <jacob@swarmauri.com>
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/groupsum/ssot-registry
8
+ Project-URL: Repository, https://github.com/groupsum/ssot-registry
9
+ Project-URL: Issues, https://github.com/groupsum/ssot-registry/issues
10
+ Keywords: ssot,contracts,schemas,templates,manifests
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3 :: Only
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: File Formats :: JSON
21
+ Classifier: Topic :: File Formats :: JSON :: JSON Schema
22
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
23
+ Requires-Python: <3.14,>=3.10
24
+ Description-Content-Type: text/markdown
25
+ Requires-Dist: tomli>=2.0.1; python_version < "3.11"
26
+
27
+ # ssot-contracts
28
+
29
+ Canonical machine-readable SSOT artifacts:
30
+
31
+ - JSON Schemas
32
+ - packaged registry templates
33
+ - packaged ssot-origin ADR and SPEC manifests
34
+ - generated Python contract metadata
@@ -0,0 +1,8 @@
1
+ # ssot-contracts
2
+
3
+ Canonical machine-readable SSOT artifacts:
4
+
5
+ - JSON Schemas
6
+ - packaged registry templates
7
+ - packaged ssot-origin ADR and SPEC manifests
8
+ - generated Python contract metadata
@@ -0,0 +1,45 @@
1
+ [build-system]
2
+ requires = ["setuptools>=69", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "ssot-contracts"
7
+ version = "0.2.4"
8
+ description = "Canonical schemas, templates, manifests, and generated Python contract artifacts for SSOT."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10,<3.14"
11
+ license = "Apache-2.0"
12
+ authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
13
+ dependencies = ["tomli>=2.0.1; python_version < '3.11'"]
14
+ keywords = ["ssot", "contracts", "schemas", "templates", "manifests"]
15
+ classifiers = [
16
+ "Development Status :: 3 - Alpha",
17
+ "Intended Audience :: Developers",
18
+ "Operating System :: OS Independent",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3 :: Only",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Topic :: File Formats :: JSON",
26
+ "Topic :: File Formats :: JSON :: JSON Schema",
27
+ "Topic :: Software Development :: Libraries :: Python Modules",
28
+ ]
29
+
30
+ [project.urls]
31
+ Homepage = "https://github.com/groupsum/ssot-registry"
32
+ Repository = "https://github.com/groupsum/ssot-registry"
33
+ Issues = "https://github.com/groupsum/ssot-registry/issues"
34
+
35
+ [tool.setuptools]
36
+ package-dir = {"" = "src"}
37
+
38
+ [tool.setuptools.packages.find]
39
+ where = ["src"]
40
+
41
+ [tool.setuptools.package-data]
42
+ "ssot_contracts.schema" = ["*.json"]
43
+ "ssot_contracts.templates" = ["*.json"]
44
+ "ssot_contracts.templates.adr" = ["*.md", "*.json"]
45
+ "ssot_contracts.templates.specs" = ["*.md", "*.json"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,20 @@
1
+ from .contract_data import CONTRACT_DATA
2
+ from .schema import list_schema_names, load_schema_text
3
+ from .templates import (
4
+ list_document_manifest_entries,
5
+ load_document_manifest,
6
+ load_template_text,
7
+ read_packaged_document_bytes,
8
+ read_packaged_document_text,
9
+ )
10
+
11
+ __all__ = [
12
+ "CONTRACT_DATA",
13
+ "list_document_manifest_entries",
14
+ "list_schema_names",
15
+ "load_document_manifest",
16
+ "load_schema_text",
17
+ "load_template_text",
18
+ "read_packaged_document_bytes",
19
+ "read_packaged_document_text",
20
+ ]
@@ -0,0 +1,92 @@
1
+ from __future__ import annotations
2
+
3
+ CONTRACT_DATA = {
4
+ "schema_version": 7,
5
+ "output_formats": ["json", "csv", "df", "yaml", "toml"],
6
+ "entity_sections": [
7
+ {"key": "features", "label": "Features"},
8
+ {"key": "profiles", "label": "Profiles"},
9
+ {"key": "tests", "label": "Tests"},
10
+ {"key": "claims", "label": "Claims"},
11
+ {"key": "evidence", "label": "Evidence"},
12
+ {"key": "issues", "label": "Issues"},
13
+ {"key": "risks", "label": "Risks"},
14
+ {"key": "boundaries", "label": "Boundaries"},
15
+ {"key": "releases", "label": "Releases"},
16
+ {"key": "adrs", "label": "ADRs"},
17
+ {"key": "specs", "label": "Specs"},
18
+ ],
19
+ "entity_prefixes": {
20
+ "repo": "repo:",
21
+ "features": "feat:",
22
+ "profiles": "prf:",
23
+ "tests": "tst:",
24
+ "claims": "clm:",
25
+ "evidence": "evd:",
26
+ "issues": "iss:",
27
+ "risks": "rsk:",
28
+ "boundaries": "bnd:",
29
+ "releases": "rel:",
30
+ "adrs": "adr:",
31
+ "specs": "spc:",
32
+ },
33
+ "graph_node_kind": {
34
+ "features": "feature",
35
+ "profiles": "profile",
36
+ "tests": "test",
37
+ "claims": "claim",
38
+ "evidence": "evidence",
39
+ "issues": "issue",
40
+ "risks": "risk",
41
+ "boundaries": "boundary",
42
+ "releases": "release",
43
+ },
44
+ "choice_sets": {
45
+ "feature_implementation_statuses": ["absent", "partial", "implemented"],
46
+ "feature_lifecycle_stages": ["active", "deprecated", "obsolete", "removed"],
47
+ "planning_horizons": ["current", "next", "future", "explicit", "backlog", "out_of_bounds"],
48
+ "test_statuses": ["planned", "passing", "failing", "blocked", "skipped"],
49
+ "profile_statuses": ["draft", "active", "retired"],
50
+ "profile_kinds": ["capability", "certification", "deployment", "interoperability"],
51
+ "claim_tiers": ["T0", "T1", "T2", "T3", "T4"],
52
+ "claim_statuses": [
53
+ "proposed",
54
+ "declared",
55
+ "implemented",
56
+ "asserted",
57
+ "evidenced",
58
+ "certified",
59
+ "promoted",
60
+ "published",
61
+ "blocked",
62
+ "retired",
63
+ ],
64
+ "evidence_statuses": ["planned", "collected", "passed", "failed", "stale"],
65
+ "issue_statuses": ["open", "in_progress", "blocked", "resolved", "closed"],
66
+ "risk_statuses": ["active", "mitigated", "accepted", "retired"],
67
+ "boundary_statuses": ["draft", "active", "frozen", "retired"],
68
+ "release_statuses": ["draft", "candidate", "certified", "promoted", "published", "revoked"],
69
+ "severities": ["low", "medium", "high", "critical"],
70
+ "document_statuses": ["draft", "in_review", "accepted", "rejected", "superseded", "withdrawn", "retired"],
71
+ "spec_kinds": ["normative", "operational", "governance", "local-policy"],
72
+ },
73
+ "document_contract": {
74
+ "kinds": ["adr", "spec"],
75
+ "sections": {"adr": "adrs", "spec": "specs"},
76
+ "filename_prefixes": {"adr": "ADR", "spec": "SPEC"},
77
+ "path_keys": {"adr": "adr_root", "spec": "spec_root"},
78
+ "reservation_keys": {"adr": "adr", "spec": "spec"},
79
+ "default_reservations": {
80
+ "adr": [
81
+ {"owner": "ssot-origin", "start": 1, "end": 499, "immutable": True, "deletable": False, "assignable_by_repo": False},
82
+ {"owner": "ssot-core", "start": 500, "end": 999, "immutable": True, "deletable": False, "assignable_by_repo": False},
83
+ {"owner": "repo-local-default", "start": 1000, "end": 4999, "immutable": False, "deletable": True, "assignable_by_repo": True},
84
+ ],
85
+ "spec": [
86
+ {"owner": "ssot-origin", "start": 1, "end": 499, "immutable": True, "deletable": False, "assignable_by_repo": False},
87
+ {"owner": "ssot-core", "start": 500, "end": 999, "immutable": True, "deletable": False, "assignable_by_repo": False},
88
+ {"owner": "repo-local-default", "start": 1000, "end": 4999, "immutable": False, "deletable": True, "assignable_by_repo": True},
89
+ ],
90
+ },
91
+ },
92
+ }
@@ -0,0 +1 @@
1
+ __all__: list[str] = []
@@ -0,0 +1,11 @@
1
+ from .cli_metadata import CLI_COMMAND_LABELS, OUTPUT_FORMATS
2
+ from .enums import *
3
+ from .ids import *
4
+ from .tui_metadata import ENTITY_SECTIONS, ENTITY_VIEW_SECTIONS
5
+
6
+ __all__ = [
7
+ "CLI_COMMAND_LABELS",
8
+ "ENTITY_SECTIONS",
9
+ "ENTITY_VIEW_SECTIONS",
10
+ "OUTPUT_FORMATS",
11
+ ]
@@ -0,0 +1,6 @@
1
+ from __future__ import annotations
2
+
3
+ from ssot_contracts.contract_data import CONTRACT_DATA
4
+
5
+ OUTPUT_FORMATS = tuple(CONTRACT_DATA["output_formats"])
6
+ CLI_COMMAND_LABELS = tuple(section["key"] for section in CONTRACT_DATA["entity_sections"] if section["key"] not in {"adrs", "specs"})
@@ -0,0 +1,24 @@
1
+ from __future__ import annotations
2
+
3
+ from ssot_contracts.contract_data import CONTRACT_DATA
4
+
5
+ SCHEMA_VERSION = CONTRACT_DATA["schema_version"]
6
+ ENTITY_PREFIXES = CONTRACT_DATA["entity_prefixes"]
7
+ GRAPH_NODE_KIND = CONTRACT_DATA["graph_node_kind"]
8
+
9
+ FEATURE_IMPLEMENTATION_STATUSES = set(CONTRACT_DATA["choice_sets"]["feature_implementation_statuses"])
10
+ FEATURE_LIFECYCLE_STAGES = set(CONTRACT_DATA["choice_sets"]["feature_lifecycle_stages"])
11
+ PLANNING_HORIZONS = set(CONTRACT_DATA["choice_sets"]["planning_horizons"])
12
+ TEST_STATUSES = set(CONTRACT_DATA["choice_sets"]["test_statuses"])
13
+ PROFILE_STATUSES = set(CONTRACT_DATA["choice_sets"]["profile_statuses"])
14
+ PROFILE_KINDS = set(CONTRACT_DATA["choice_sets"]["profile_kinds"])
15
+ CLAIM_TIERS = set(CONTRACT_DATA["choice_sets"]["claim_tiers"])
16
+ CLAIM_STATUSES = set(CONTRACT_DATA["choice_sets"]["claim_statuses"])
17
+ EVIDENCE_STATUSES = set(CONTRACT_DATA["choice_sets"]["evidence_statuses"])
18
+ ISSUE_STATUSES = set(CONTRACT_DATA["choice_sets"]["issue_statuses"])
19
+ RISK_STATUSES = set(CONTRACT_DATA["choice_sets"]["risk_statuses"])
20
+ BOUNDARY_STATUSES = set(CONTRACT_DATA["choice_sets"]["boundary_statuses"])
21
+ RELEASE_STATUSES = set(CONTRACT_DATA["choice_sets"]["release_statuses"])
22
+ SEVERITIES = set(CONTRACT_DATA["choice_sets"]["severities"])
23
+ DOCUMENT_STATUSES = tuple(CONTRACT_DATA["choice_sets"]["document_statuses"])
24
+ SPEC_KINDS = set(CONTRACT_DATA["choice_sets"]["spec_kinds"])
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+
5
+ from ssot_contracts.contract_data import CONTRACT_DATA
6
+
7
+ ENTITY_PREFIXES = CONTRACT_DATA["entity_prefixes"]
8
+ ID_PATTERN = re.compile(r"^[a-z][a-z0-9-]*:[a-z0-9][a-z0-9._-]*$")
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+
3
+ from ssot_contracts.contract_data import CONTRACT_DATA
4
+
5
+ ENTITY_SECTIONS = tuple((section["key"], section["label"]) for section in CONTRACT_DATA["entity_sections"])
6
+ ENTITY_VIEW_SECTIONS = {
7
+ "features": ("id", "title", "implementation_status"),
8
+ "profiles": ("id", "title", "status"),
9
+ "tests": ("id", "title", "status"),
10
+ "claims": ("id", "title", "status"),
11
+ "evidence": ("id", "title", "status"),
12
+ "issues": ("id", "title", "status"),
13
+ "risks": ("id", "title", "status"),
14
+ "boundaries": ("id", "title", "status"),
15
+ "releases": ("id", "version", "status"),
16
+ "adrs": ("id", "title", "status"),
17
+ "specs": ("id", "title", "status"),
18
+ }
@@ -0,0 +1,11 @@
1
+ from __future__ import annotations
2
+
3
+ from importlib import resources
4
+
5
+
6
+ def list_schema_names() -> list[str]:
7
+ return sorted(entry.name for entry in resources.files(__package__).iterdir() if entry.name.endswith(".json"))
8
+
9
+
10
+ def load_schema_text(name: str) -> str:
11
+ return resources.files(__package__).joinpath(name).read_text(encoding="utf-8")
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.invalid/ssot-registry/boundary.snapshot.schema.json",
4
+ "type": "object",
5
+ "required": [
6
+ "schema_version",
7
+ "kind",
8
+ "generated_at",
9
+ "registry_path",
10
+ "registry_sha256",
11
+ "boundary",
12
+ "features",
13
+ "summary"
14
+ ]
15
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.invalid/ssot-registry/certification.report.schema.json",
4
+ "type": "object",
5
+ "required": [
6
+ "passed",
7
+ "registry_path",
8
+ "release",
9
+ "summary"
10
+ ]
11
+ }
@@ -0,0 +1,54 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.invalid/ssot-registry/graph.export.schema.json",
4
+ "type": "object",
5
+ "required": [
6
+ "nodes",
7
+ "edges"
8
+ ],
9
+ "properties": {
10
+ "nodes": {
11
+ "type": "array",
12
+ "items": {
13
+ "type": "object",
14
+ "required": [
15
+ "id",
16
+ "kind"
17
+ ],
18
+ "properties": {
19
+ "id": {
20
+ "type": "string"
21
+ },
22
+ "kind": {
23
+ "type": "string"
24
+ }
25
+ },
26
+ "additionalProperties": false
27
+ }
28
+ },
29
+ "edges": {
30
+ "type": "array",
31
+ "items": {
32
+ "type": "object",
33
+ "required": [
34
+ "type",
35
+ "from",
36
+ "to"
37
+ ],
38
+ "properties": {
39
+ "type": {
40
+ "type": "string"
41
+ },
42
+ "from": {
43
+ "type": "string"
44
+ },
45
+ "to": {
46
+ "type": "string"
47
+ }
48
+ },
49
+ "additionalProperties": false
50
+ }
51
+ }
52
+ },
53
+ "additionalProperties": false
54
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://example.invalid/ssot-registry/published.snapshot.schema.json",
4
+ "type": "object",
5
+ "required": [
6
+ "schema_version",
7
+ "kind",
8
+ "generated_at",
9
+ "registry_path",
10
+ "registry_sha256",
11
+ "release",
12
+ "boundary",
13
+ "claims",
14
+ "evidence",
15
+ "summary"
16
+ ]
17
+ }