attribution-campaign-context 0.1.0__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.
- attribution_campaign_context-0.1.0/.github/workflows/ci.yml +27 -0
- attribution_campaign_context-0.1.0/.github/workflows/publish.yml +28 -0
- attribution_campaign_context-0.1.0/.gitignore +24 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0600-canonical-json-registry.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0601-features-are-targetable-units.yaml +23 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0602-issues-are-plannable-work-items.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0603-entity-centric-registry-derived-graph.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0604-normalized-prefixed-ids.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0605-claim-status-vs-tier.yaml +33 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0606-feature-implementation-vs-lifecycle.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0607-immutable-boundary-and-release-snapshots.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0608-fail-closed-guards.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0609-generated-projections-are-non-canonical.yaml +32 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0610-explicit-schema-versioning.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0611-portable-core-repo-specific-evidence-adapters.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0612-ssot-path-and-filename-length-limits.yaml +22 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0613-profiles-as-reusable-feature-bundles.yaml +41 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0614-specs-own-typed-adr-links.yaml +17 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0615-downstream-assurance-language-ceilings.yaml +62 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0616-out-of-bounds-implementation-disposition.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0617-feature-implementation-claim-ceilings.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0618-local-release-assurance-remains-ssot-native.yaml +35 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0619-content-addressed-governed-source-snapshots.yaml +35 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0620-local-evidence-bundles-are-derived-release-artifacts.yaml +35 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0621-general-rules-of-interpretation.yaml +44 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0622-definitions-govern-ssot-vocabulary.yaml +41 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0625-claim-tier-gates-and-core-promotion.yaml +44 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0626-externally-authored-validation-as-t4.yaml +31 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0627-feature-parent-links-are-inventory-composition.yaml +29 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0628-ssot-mcp-cli-surface-delegation.yaml +60 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0629-ssot-mcp-worker-repair-authority.yaml +21 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0630-scoped-maturation-claims-and-blockers.yaml +21 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0631-mcp-mediated-upgrade-uses-current-runtime.yaml +21 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0632-targeted-repair-with-baseline-validation-drift.yaml +21 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0633-public-registry-save-validates-before-write.yaml +27 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0634-proof-graph-canonical-assurance-unit.yaml +30 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0635-proof-graph-materialization-and-certification-closure.yaml +33 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0636-feature-create-defaults-to-proof-graph-scaffolding.yaml +33 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-0637-pack-schema-compatibility-is-forward-only.yaml +60 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-1000-attribution-campaign-context-surfaces.yaml +25 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-169076658-pack-marketing-attribution-conversion-clean-room-attribution-protocol-policy.yaml +39 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-20222851-pack-marketing-attribution-conversion-browser-attribution-reporting-policy.yaml +38 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-309069435-pack-marketing-attribution-conversion-enhanced-conversion-identifier-policy.yaml +41 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-362483338-pack-url-query-attribution-foundations-attribution-state-context-policy.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-372529914-pack-url-query-attribution-foundations-http-metadata-discovery-policy.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-389551517-pack-url-query-attribution-foundations-traffic-source-classification-policy.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-390576476-pack-marketing-attribution-conversion-conversion-consent-and-privacy-policy.yaml +42 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-428907250-pack-url-query-attribution-foundations-referrer-observability-policy.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-50028530-pack-marketing-attribution-conversion-tracking-template-parameter-policy.yaml +39 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-526958646-pack-marketing-attribution-conversion-industry-conversion-event-protocol-policy.yaml +38 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-535745349-pack-marketing-attribution-conversion-click-measurement-quality-policy.yaml +40 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-554483863-pack-marketing-attribution-conversion-offline-conversion-upload-policy.yaml +39 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-554732146-pack-marketing-attribution-conversion-server-conversion-api-policy.yaml +42 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-646644831-pack-url-query-attribution-foundations-uri-query-attribution-boundary.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-784165129-pack-url-query-attribution-foundations-campaign-parameter-semantics-authority.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/adr/ADR-813582157-pack-marketing-attribution-conversion-click-id-capture-and-retention-policy.yaml +41 -0
- attribution_campaign_context-0.1.0/.ssot/cache/registry.export.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/evidence/attribution-campaign-context-runtime/proof-t0.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/evidence/attribution-campaign-context-runtime/proof-t1.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/evidence/attribution-campaign-context-runtime/proof-t2.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/evidence/attribution.public-operator-surfaces/proof-graph-t0.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/graphs/graph.export.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/registry.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/releases/rel__0.1.0/published.snapshot.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/releases/rel__0.1.0/release.snapshot.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/reports/certification.report.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/reports/claim-evaluation-all.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/reports/evidence-verification-all.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/reports/promotion.report.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/reports/publication.report.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/reports/upgrade.report.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/reports/validation.report.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/adr.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/boundary.snapshot.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/certification.report.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/graph.export.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/published.snapshot.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/registry.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/release.snapshot.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/spec.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/schemas/validation.report.schema.json +1 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0600-registry-core.yaml +75 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0601-cli.yaml +82 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0602-graph-model.yaml +37 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0603-feature-lifecycle.yaml +25 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0604-claim-statuses.yaml +29 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0605-claim-tiers.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0606-snapshots-and-reports.yaml +25 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0607-repo-policy.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0608-gates-and-fences.yaml +33 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0609-id-normalization.yaml +34 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0610-file-tree.yaml +27 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0611-planning-horizons.yaml +27 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0612-python-api.yaml +53 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0613-ssot-path-length-policy.yaml +37 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0614-profile-evaluation-and-boundary-resolution.yaml +72 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0615-typed-spec-to-adr-linking.yaml +20 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0616-out-of-bounds-implementation-disposition.yaml +51 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0617-feature-implementation-claim-ceilings.yaml +64 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0618-local-release-assurance-candidate-scope.yaml +41 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0619-governed-source-snapshot-contract.yaml +39 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0620-local-evidence-bundle-contract.yaml +39 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0621-output-artifact-manifest-contract.yaml +39 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0622-local-release-verification-and-gate-contract.yaml +55 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0623-general-rules-of-interpretation.yaml +82 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0624-ssot-definitions.yaml +132 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0625-claim-tier-gates.yaml +92 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0626-external-validation-evidence.yaml +54 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0627-feature-parent-link-contract.yaml +38 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0628-feature-parent-cli-contract.yaml +41 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0629-ssot-mcp-cli-surface-contract.yaml +96 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0630-ssot-mcp-registry-repair-authority.yaml +24 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0631-scoped-maturation-blocker-contract.yaml +24 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0632-mcp-upgrade-delegation-contract.yaml +25 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0633-targeted-scaffold-repair-contract.yaml +32 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0634-worker-actionability-and-repair-loop.yaml +26 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0635-registry-save-validation-contract.yaml +37 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0636-proof-graph-assurance-contract.yaml +38 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0637-proof-graph-materialization-and-certification-flow.yaml +35 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0638-feature-create-default-proof-scaffold-contract.yaml +44 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-0639-forward-only-pack-schema-compatibility-contract.yaml +59 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-1000-attribution-public-operator-surfaces.yaml +36 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-134619984-pack-marketing-attribution-conversion-meta-conversions-api-requirements.yaml +50 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-157179633-pack-marketing-attribution-conversion-microsoft-url-tracking-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-180547209-pack-marketing-attribution-conversion-microsoft-uet-capi-requirements.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-247858143-pack-marketing-attribution-conversion-google-ads-valuetrack-parameter-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-277029913-pack-marketing-attribution-conversion-meta-pixel-conversion-event-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-372570155-pack-url-query-attribution-foundations-uri-query-syntax-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-382982351-pack-marketing-attribution-conversion-linkedin-conversions-api-requirements.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-395382193-pack-url-query-attribution-foundations-campaign-query-parameter-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-422230747-pack-marketing-attribution-conversion-iab-click-measurement-quality-requirements.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-437451167-pack-marketing-attribution-conversion-w3c-attribution-reporting-requirements.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-470440808-pack-url-query-attribution-foundations-http-request-attribution-context-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-487444199-pack-marketing-attribution-conversion-tiktok-events-api-requirements.yaml +51 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-521270895-pack-marketing-attribution-conversion-google-ads-auto-tagging-click-id-requirements.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-57742836-pack-marketing-attribution-conversion-iab-video-ad-measurement-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-60542381-pack-url-query-attribution-foundations-fetch-navigation-attribution-context-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-607244927-pack-marketing-attribution-conversion-iab-ecapi-conversion-event-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-698811276-pack-url-query-attribution-foundations-referrer-policy-observability-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-702516726-pack-url-query-attribution-foundations-ga4-traffic-source-mapping-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-716760398-pack-marketing-attribution-conversion-microsoft-offline-conversion-requirements.yaml +49 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-732649409-pack-url-query-attribution-foundations-structured-field-attribution-metadata-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-768676948-pack-marketing-attribution-conversion-google-ads-enhanced-conversion-lead-requirements.yaml +48 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-769529942-pack-url-query-attribution-foundations-http-caching-attribution-observability-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-782116126-pack-url-query-attribution-foundations-cookie-attribution-state-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-785128655-pack-marketing-attribution-conversion-mrc-measurement-quality-reference-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-797284788-pack-marketing-attribution-conversion-google-ads-click-conversion-upload-requirements.yaml +50 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-851677841-pack-marketing-attribution-conversion-linkedin-conversion-source-requirements.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-852149576-pack-url-query-attribution-foundations-default-channel-classification-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-863918177-pack-url-query-attribution-foundations-well-known-attribution-metadata-requirements.yaml +46 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-878582376-pack-url-query-attribution-foundations-web-storage-attribution-state-requirements.yaml +45 -0
- attribution_campaign_context-0.1.0/.ssot/specs/SPEC-878757952-pack-marketing-attribution-conversion-iab-admap-clean-room-attribution-requirements.yaml +47 -0
- attribution_campaign_context-0.1.0/.ssot/ssot.toml +27 -0
- attribution_campaign_context-0.1.0/PKG-INFO +636 -0
- attribution_campaign_context-0.1.0/README.md +619 -0
- attribution_campaign_context-0.1.0/docs/attribution-keys.md +36 -0
- attribution_campaign_context-0.1.0/docs/public-operator-surfaces.md +144 -0
- attribution_campaign_context-0.1.0/docs/ssot-governance-packs.md +75 -0
- attribution_campaign_context-0.1.0/pyproject.toml +50 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/__init__.py +39 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/associations.py +127 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/constants.py +24 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/extract.py +79 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/hooks.py +82 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/middleware.py +121 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/models.py +40 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/public_surfaces.py +119 -0
- attribution_campaign_context-0.1.0/src/attribution_campaign_context/subjects.py +21 -0
- attribution_campaign_context-0.1.0/tests/ssot_scaffold/test_attribution_public_operator_surfaces_t0_proof_graph.py +2 -0
- attribution_campaign_context-0.1.0/tests/test_adoption_levels_t2.py +114 -0
- attribution_campaign_context-0.1.0/tests/test_adoption_modes_t2.py +161 -0
- attribution_campaign_context-0.1.0/tests/test_associations_hooks.py +86 -0
- attribution_campaign_context-0.1.0/tests/test_associations_t2.py +79 -0
- attribution_campaign_context-0.1.0/tests/test_constants.py +30 -0
- attribution_campaign_context-0.1.0/tests/test_extract.py +35 -0
- attribution_campaign_context-0.1.0/tests/test_extract_t2.py +60 -0
- attribution_campaign_context-0.1.0/tests/test_hooks_t2.py +71 -0
- attribution_campaign_context-0.1.0/tests/test_middleware.py +79 -0
- attribution_campaign_context-0.1.0/tests/test_middleware_t2.py +141 -0
- attribution_campaign_context-0.1.0/tests/test_public_contract_t2.py +47 -0
- attribution_campaign_context-0.1.0/tests/test_public_surfaces.py +15 -0
- attribution_campaign_context-0.1.0/tests/test_t2_robustness.py +83 -0
- attribution_campaign_context-0.1.0/tests/test_tables_t2.py +61 -0
- attribution_campaign_context-0.1.0/tests/test_touch_lifecycle_t2.py +63 -0
- attribution_campaign_context-0.1.0/uv.lock +1168 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- master
|
|
7
|
+
pull_request:
|
|
8
|
+
branches:
|
|
9
|
+
- master
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
python-package-matrix:
|
|
16
|
+
uses: cobycloud/actions/.github/workflows/reusable-python-package-matrix-ci.yml@main
|
|
17
|
+
with:
|
|
18
|
+
python-versions: '["3.10","3.11","3.12","3.13"]'
|
|
19
|
+
package-cells: '[{"name":"attribution-campaign-context","path":"."}]'
|
|
20
|
+
install-command: uv sync --all-groups --frozen
|
|
21
|
+
compile-command: uv run python -m compileall src tests
|
|
22
|
+
test-command: uv run python -m pytest
|
|
23
|
+
|
|
24
|
+
ssot-validate:
|
|
25
|
+
uses: cobycloud/actions/.github/workflows/reusable-ssot-validate.yml@main
|
|
26
|
+
with:
|
|
27
|
+
validate-command: python -m pip install ssot-registry && python -m ssot_cli.main validate .
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
id-token: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
pypi:
|
|
12
|
+
name: Publish to PyPI
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
environment: pypi
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
|
|
18
|
+
- uses: cobycloud/actions/actions/python-package-build@main
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.13"
|
|
21
|
+
project-path: "."
|
|
22
|
+
out-dir: dist
|
|
23
|
+
upload-artifact: "false"
|
|
24
|
+
|
|
25
|
+
- uses: cobycloud/actions/actions/pypi-publish@main
|
|
26
|
+
with:
|
|
27
|
+
packages-dir: dist
|
|
28
|
+
print-hash: "true"
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.venv/
|
|
2
|
+
.uv-cache/
|
|
3
|
+
__pycache__/
|
|
4
|
+
*.py[cod]
|
|
5
|
+
.pytest_cache/
|
|
6
|
+
dist/
|
|
7
|
+
build/
|
|
8
|
+
*.egg-info/
|
|
9
|
+
|
|
10
|
+
# Local generated caches and temporary package artifacts
|
|
11
|
+
.tmp/
|
|
12
|
+
.tmp*/
|
|
13
|
+
tmp/
|
|
14
|
+
.uv-cache*/
|
|
15
|
+
.uv-python*/
|
|
16
|
+
.venv*/
|
|
17
|
+
.venv-gitvs*/
|
|
18
|
+
generation_examples/
|
|
19
|
+
node_modules/
|
|
20
|
+
.mypy_cache/
|
|
21
|
+
.ruff_cache/
|
|
22
|
+
.tox/
|
|
23
|
+
.nox/
|
|
24
|
+
target/
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0600"
|
|
4
|
+
number: 600
|
|
5
|
+
slug: "canonical-json-registry"
|
|
6
|
+
title: "Canonical registry is a single JSON document"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "The only authored machine-readable source of truth is `.ssot/registry.json`."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
The only authored machine-readable source of truth is `.ssot/registry.json`.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0601"
|
|
4
|
+
number: 601
|
|
5
|
+
slug: "features-are-targetable-units"
|
|
6
|
+
title: "Features are the targetable units"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Features are the only targetable implementation units. There is no separate `targets[]` section."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
Features are the only targetable implementation units. There is no separate `targets[]` section.
|
|
18
|
+
|
|
19
|
+
Because features are the targetable units, the default authoring path for new feature rows shall align with proof requirements. New `feature create` operations are expected to scaffold minimally valid proof-graph closure by default unless the operator explicitly disables that behavior.
|
|
20
|
+
|
|
21
|
+
Feature inventory naming MAY use umbrella/leaf conventions when a repository needs grouped readability, but that convention is not a runtime dependency model. `feature.requires` is reserved for prerequisite features that must independently pass before the dependent feature can pass.
|
|
22
|
+
|
|
23
|
+
Profiles remain the preferred grouped evaluation surface. Operators should not overload umbrella feature names to represent certification or bundle evaluation when a profile is the correct modeled unit.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0602"
|
|
4
|
+
number: 602
|
|
5
|
+
slug: "issues-are-plannable-work-items"
|
|
6
|
+
title: "Issues are plannable work items"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
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."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
Issues and tickets can be planned as current, next, future, explicit, backlog, or out-of-bounds, but they are not substitute targets for features.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0603-entity-centric-registry-derived-graph.yaml
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0603"
|
|
4
|
+
number: 603
|
|
5
|
+
slug: "entity-centric-registry-derived-graph"
|
|
6
|
+
title: "Entity-centric registry with a derived graph export"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "The canonical registry is entity-centric JSON with explicit references. A graph export is derived from it."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
The canonical registry is entity-centric JSON with explicit references. A graph export is derived from it.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0604"
|
|
4
|
+
number: 604
|
|
5
|
+
slug: "normalized-prefixed-ids"
|
|
6
|
+
title: "Normalized prefixed IDs"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Every first-class entity uses a normalized prefixed ID."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
Every first-class entity uses a normalized prefixed ID.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0605"
|
|
4
|
+
number: 605
|
|
5
|
+
slug: "claim-status-vs-tier"
|
|
6
|
+
title: "Claim status and claim tier are orthogonal"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Claims carry both lifecycle status and assurance tier. Earlier wording stated that status and tier are orthogonal, but the registry now also needs explicit promotion gates so a high lifecycle status cannot be mistaken for high assurance."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
Claims carry both lifecycle status and assurance tier. Earlier wording stated that status and tier are orthogonal, but the registry now also needs explicit promotion gates so a high lifecycle status cannot be mistaken for high assurance.
|
|
20
|
+
|
|
21
|
+
## Decision
|
|
22
|
+
|
|
23
|
+
Claim status expresses lifecycle progression. Claim tier expresses assurance strength.
|
|
24
|
+
|
|
25
|
+
Status values such as `asserted`, `evidenced`, `certified`, `promoted`, and `published` indicate where the claim sits in the registry workflow. They do not authorize stronger assurance language or a higher claim tier.
|
|
26
|
+
|
|
27
|
+
Tier values `T0` through `T4` indicate what kind of proof supports the claim. A claim may only be treated as valid at a requested tier when the applicable claim tier gate passes.
|
|
28
|
+
|
|
29
|
+
## Consequences
|
|
30
|
+
|
|
31
|
+
Automation and reviewers must not infer assurance strength from status alone. A claim with a high lifecycle status but insufficient tier-gate evidence must be reported as over-stated or blocked at the requested tier.
|
|
32
|
+
|
|
33
|
+
Claim closure remains a support-coherence check. Tier gates remain the authority for the semantic meaning of `T1`, `T2`, `T3`, and `T4`.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0606-feature-implementation-vs-lifecycle.yaml
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0606"
|
|
4
|
+
number: 606
|
|
5
|
+
slug: "feature-implementation-vs-lifecycle"
|
|
6
|
+
title: "Feature implementation state is separate from lifecycle state"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "`implementation_status` and `lifecycle.stage` are distinct fields."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
`implementation_status` and `lifecycle.stage` are distinct fields.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0607-immutable-boundary-and-release-snapshots.yaml
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0607"
|
|
4
|
+
number: 607
|
|
5
|
+
slug: "immutable-boundary-and-release-snapshots"
|
|
6
|
+
title: "Immutable boundary and release snapshots"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Frozen boundaries and promoted/published releases emit immutable snapshots with hashes."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
Frozen boundaries and promoted/published releases emit immutable snapshots with hashes.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0608"
|
|
4
|
+
number: 608
|
|
5
|
+
slug: "fail-closed-guards"
|
|
6
|
+
title: "Fail-closed guards"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Validation, certification, promotion, publication, and lifecycle transitions refuse to proceed on guard violations."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
Validation, certification, promotion, publication, and lifecycle transitions refuse to proceed on guard violations.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0609-generated-projections-are-non-canonical.yaml
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0609"
|
|
4
|
+
number: 609
|
|
5
|
+
slug: "generated-projections-are-non-canonical"
|
|
6
|
+
title: "Generated projections are non-canonical"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "This is an `ssot-origin` ADR copied into downstream SSOT repositories."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
This is an `ssot-origin` ADR copied into downstream SSOT repositories.
|
|
18
|
+
|
|
19
|
+
In an operator repository, canonical authored SSOT content lives under `.ssot/`:
|
|
20
|
+
|
|
21
|
+
- `.ssot/registry.json`,
|
|
22
|
+
- repo-local ADRs under `.ssot/adr/`,
|
|
23
|
+
- repo-local specs under `.ssot/specs/`.
|
|
24
|
+
|
|
25
|
+
Packaged `ssot-origin` ADRs/specs provide baseline policy, but operators do not edit those synced copies directly.
|
|
26
|
+
|
|
27
|
+
Generated projections include:
|
|
28
|
+
|
|
29
|
+
- graph exports,
|
|
30
|
+
- reports and snapshots,
|
|
31
|
+
- rendered or exported representations such as CSV, YAML, TOML, DOT, PNG, and SVG,
|
|
32
|
+
- mirrored or regenerated documentation derived from the canonical SSOT content.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0610"
|
|
4
|
+
number: 610
|
|
5
|
+
slug: "explicit-schema-versioning"
|
|
6
|
+
title: "Explicit schema versioning"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Breaking schema changes increment `schema_version` and require migration."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
Breaking schema changes increment `schema_version` and require migration.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0611"
|
|
4
|
+
number: 611
|
|
5
|
+
slug: "portable-core-repo-specific-evidence-adapters"
|
|
6
|
+
title: "Portable SSOT core with repo-specific evidence adapters"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
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."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
The SSOT core contract governs and validates the registry graph. Repository-specific evidence generation is implemented outside the core (or through adapters) per repository.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0612-ssot-path-and-filename-length-limits.yaml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0612"
|
|
4
|
+
number: 612
|
|
5
|
+
slug: "ssot-path-and-filename-length-limits"
|
|
6
|
+
title: "Enforce max path and filename lengths under `.ssot`"
|
|
7
|
+
status: "draft"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "Files under `.ssot` MUST respect these limits:"
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
Files under `.ssot` MUST respect these limits:
|
|
18
|
+
|
|
19
|
+
- Maximum relative path length: **240** characters.
|
|
20
|
+
- Maximum filename length: **120** characters.
|
|
21
|
+
|
|
22
|
+
Validation fails when either limit is exceeded.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0613-profiles-as-reusable-feature-bundles.yaml
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0613"
|
|
4
|
+
number: 613
|
|
5
|
+
slug: "profiles-as-reusable-feature-bundles"
|
|
6
|
+
title: "Profiles are reusable feature bundles with derived pass status"
|
|
7
|
+
status: "accepted"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "The registry needed an entity between atomic features and release boundaries:"
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
The registry needed an entity between atomic features and release boundaries:
|
|
20
|
+
|
|
21
|
+
- features are independently targetable,
|
|
22
|
+
- boundaries are release/freeze artifacts,
|
|
23
|
+
- releases certify a boundary scope.
|
|
24
|
+
|
|
25
|
+
Teams also need reusable capability bundles that can be composed and evaluated.
|
|
26
|
+
|
|
27
|
+
## Decision
|
|
28
|
+
|
|
29
|
+
Introduce a first-class `profiles` entity:
|
|
30
|
+
|
|
31
|
+
- profile rows bundle `feature_ids` and nested `profile_ids`,
|
|
32
|
+
- profile pass/fail is computed (never stored),
|
|
33
|
+
- feature pass still requires satisfying claims and guard checks,
|
|
34
|
+
- boundary scope may include both direct `feature_ids` and `profile_ids`,
|
|
35
|
+
- boundary feature scope is resolved dynamically at evaluation/reporting time.
|
|
36
|
+
|
|
37
|
+
Tier resolution is fail-closed:
|
|
38
|
+
|
|
39
|
+
1. feature `plan.target_claim_tier`,
|
|
40
|
+
2. profile `claim_tier`,
|
|
41
|
+
3. no tier => failing evaluation.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0614"
|
|
4
|
+
number: 614
|
|
5
|
+
slug: "specs-own-typed-adr-links"
|
|
6
|
+
title: "SPECs own typed ADR links"
|
|
7
|
+
status: "accepted"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
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."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
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.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0615-downstream-assurance-language-ceilings.yaml
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0615"
|
|
4
|
+
number: 615
|
|
5
|
+
slug: "downstream-assurance-language-ceilings"
|
|
6
|
+
title: "Downstream assurance-language ceilings for feature target claim tiers"
|
|
7
|
+
status: "accepted"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
summary: "SSOT downstream repositories use feature target claim tiers, linked claims, tests, evidence, and tier gates 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."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
SSOT downstream repositories use feature target claim tiers, linked claims, tests, evidence, and tier gates 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.
|
|
20
|
+
|
|
21
|
+
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.
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
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 and the applicable claim tier gate at the stronger tier.
|
|
26
|
+
|
|
27
|
+
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.
|
|
28
|
+
|
|
29
|
+
Acceptable language by tier:
|
|
30
|
+
|
|
31
|
+
| Tier | Assurance ceiling | Acceptable claims language |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| `T0` | Declared / Inventory | declared, tracked, intended, planned, in scope, inventoried |
|
|
34
|
+
| `T1` | Project Verified | project-verified, directly verified, verified by repeatable project-controlled tests, backed by project evidence |
|
|
35
|
+
| `T2` | Robustly Project Verified | robustly project-verified, verified across edge cases, verified across failure modes, verified across declared robustness dimensions |
|
|
36
|
+
| `T3` | Release Certified | release-certified, release-grade verified, certified for a named release, certified for a frozen boundary or profile |
|
|
37
|
+
| `T4` | Externally Certified | externally certified, independently reviewed, third-party validated, externally attested, validated by externally authored tests |
|
|
38
|
+
|
|
39
|
+
Disallowed escalations:
|
|
40
|
+
|
|
41
|
+
- `T0` features must not be described as implemented, working, verified, tested, robustly verified, certified, or externally validated.
|
|
42
|
+
- `T1` features must not be described as robustly verified, release-certified, or externally certified.
|
|
43
|
+
- `T2` features must not be described as release-certified or externally certified.
|
|
44
|
+
- `T3` features must not be described as externally certified, independently reviewed, or externally attested unless `T4` evidence exists.
|
|
45
|
+
|
|
46
|
+
Canonical wording templates:
|
|
47
|
+
|
|
48
|
+
- `T0`: Feature `<id>` is declared in scope for `<capability>`.
|
|
49
|
+
- `T1`: Feature `<id>` is project-verified for direct behavior `<capability>` by repeatable project-controlled checks.
|
|
50
|
+
- `T2`: Feature `<id>` is robustly project-verified for `<capability>` across `<robustness-dimensions>`.
|
|
51
|
+
- `T3`: Feature `<id>` is release-certified for `<release-or-boundary-or-profile>` with passing certification gates.
|
|
52
|
+
- `T4`: Feature `<id>` is externally certified for `<capability>` by `<external-source-or-artifact>`.
|
|
53
|
+
|
|
54
|
+
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, feature target tier evaluation, and the applicable claim tier gate remain the enforcement mechanisms for whether stronger language is valid.
|
|
55
|
+
|
|
56
|
+
## Consequences
|
|
57
|
+
|
|
58
|
+
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.
|
|
59
|
+
|
|
60
|
+
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.
|
|
61
|
+
|
|
62
|
+
Reviewers and automation should treat over-strong assurance language as a policy defect even when the underlying feature is implemented.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0616-out-of-bounds-implementation-disposition.yaml
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0616"
|
|
4
|
+
number: 616
|
|
5
|
+
slug: "out-of-bounds-implementation-disposition"
|
|
6
|
+
title: "Out-of-bounds implementation disposition is explicit"
|
|
7
|
+
status: "accepted"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
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."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
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.
|
|
20
|
+
|
|
21
|
+
That ambiguity matters because there are two different governance meanings:
|
|
22
|
+
|
|
23
|
+
- partial support may be incidental and acceptable as non-targeted behavior,
|
|
24
|
+
- partial support may be prohibited and require removal, quarantine, or a release-blocking follow-up.
|
|
25
|
+
|
|
26
|
+
## Decision
|
|
27
|
+
|
|
28
|
+
SSOT core records the distinction on the feature planning record as `plan.out_of_bounds_disposition`.
|
|
29
|
+
|
|
30
|
+
Allowed values are:
|
|
31
|
+
|
|
32
|
+
- `tolerated`: non-absent implementation exists but is accepted as non-targeted, non-certified, out-of-bounds behavior.
|
|
33
|
+
- `prohibited`: non-absent implementation exists and is not acceptable; removal or quarantine is required.
|
|
34
|
+
|
|
35
|
+
For any feature where `plan.horizon == out_of_bounds` and `implementation_status` is `partial` or `implemented`, the disposition must be explicit.
|
|
36
|
+
|
|
37
|
+
Tolerated out-of-bounds features must not be included in active boundaries and must carry a lifecycle note explaining the non-targeted status.
|
|
38
|
+
|
|
39
|
+
Prohibited out-of-bounds features must target lifecycle `removed` and, while non-absent, must be tied to an open release-blocking issue or active release-blocking risk.
|
|
40
|
+
|
|
41
|
+
## Consequences
|
|
42
|
+
|
|
43
|
+
Downstream registries cannot silently carry ambiguous out-of-bounds partial support.
|
|
44
|
+
|
|
45
|
+
Release and certification workflows can distinguish acceptable non-target behavior from prohibited implementation leakage.
|
|
46
|
+
|
|
47
|
+
A removed feature still requires `implementation_status: absent`; `prohibited` is the managed transition state while code or behavior remains present.
|
attribution_campaign_context-0.1.0/.ssot/adr/ADR-0617-feature-implementation-claim-ceilings.yaml
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
schema_version: "0.7.0"
|
|
2
|
+
kind: "adr"
|
|
3
|
+
id: "adr:0617"
|
|
4
|
+
number: 617
|
|
5
|
+
slug: "feature-implementation-claim-ceilings"
|
|
6
|
+
title: "Feature implementation is capped by active required claims"
|
|
7
|
+
status: "accepted"
|
|
8
|
+
origin: "ssot-origin"
|
|
9
|
+
decision_date: null
|
|
10
|
+
tags: []
|
|
11
|
+
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."
|
|
12
|
+
supersedes: []
|
|
13
|
+
superseded_by: []
|
|
14
|
+
status_notes: []
|
|
15
|
+
references: []
|
|
16
|
+
body: |-
|
|
17
|
+
## Context
|
|
18
|
+
|
|
19
|
+
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.
|
|
20
|
+
|
|
21
|
+
`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`.
|
|
22
|
+
|
|
23
|
+
## Decision
|
|
24
|
+
|
|
25
|
+
Feature implementation promotion is capped by active required linked claims.
|
|
26
|
+
|
|
27
|
+
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.
|
|
28
|
+
|
|
29
|
+
A feature may be marked `implemented` only when:
|
|
30
|
+
|
|
31
|
+
- linked tests pass,
|
|
32
|
+
- required features are implemented,
|
|
33
|
+
- every active required linked claim satisfies the feature's effective target tier,
|
|
34
|
+
- no active required linked claim is `T0`.
|
|
35
|
+
|
|
36
|
+
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`.
|
|
37
|
+
|
|
38
|
+
Direct implementation and certification maturity are related but not identical. `T1` can establish direct implementation. `T2` can establish robust implementation. `T3` and `T4` establish release certification and external validation maturity unless a feature explicitly targets those tiers as its implementation bar.
|
|
39
|
+
|
|
40
|
+
Active weaker claims continue to block feature implementation until they are retired or superseded. A stronger linked claim cannot hide an active weaker required claim.
|
|
41
|
+
|
|
42
|
+
## Consequences
|
|
43
|
+
|
|
44
|
+
Automated status synchronization must use all-pass claim precedence for feature implementation promotion and must respect claim tier gates when evaluating whether active claims satisfy a feature target tier.
|
|
45
|
+
|
|
46
|
+
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.
|
|
47
|
+
|
|
48
|
+
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.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
schema_version: "0.7.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
|
+
at: "2026-05-08T07:33:02Z"
|
|
17
|
+
note: "Tentative local release assurance proposal; not accepted or implementation-bound."
|
|
18
|
+
status: "draft"
|
|
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.7.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
|
+
at: "2026-05-08T07:34:02Z"
|
|
17
|
+
note: "Tentative local release assurance proposal; not accepted or implementation-bound."
|
|
18
|
+
status: "draft"
|
|
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.
|