archctx 0.1.2 → 0.1.4-beta.0
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.
- package/NOTICE.md +23 -0
- package/assets/README.md +15 -0
- package/assets/catalog.yaml +393 -0
- package/assets/practices/api.contract-before-implementation.yaml +70 -0
- package/assets/practices/compatibility.expiry-contract.yaml +71 -0
- package/assets/practices/compatibility.single-owner.yaml +78 -0
- package/assets/practices/data.single-authoritative-model.yaml +67 -0
- package/assets/practices/decision.record-significant-change.yaml +69 -0
- package/assets/practices/migration.target-and-removal-state.yaml +82 -0
- package/assets/practices/modularity.no-new-cycle.yaml +71 -0
- package/assets/practices/modularity.respect-dependency-direction.yaml +74 -0
- package/assets/practices/observability.boundary-telemetry.yaml +65 -0
- package/assets/practices/ownership.explicit-lifecycle-owner.yaml +74 -0
- package/assets/practices/s6-expanded.yaml +1278 -0
- package/assets/practices/security.least-privilege.yaml +70 -0
- package/assets/practices/supply-chain.pinned-dependencies.yaml +65 -0
- package/assets/profiles/s6.yaml +194 -0
- package/assets/sources/core.yaml +211 -0
- package/assets/sources/s6.yaml +122 -0
- package/bin/archctx.mjs +18231 -2410
- package/bin/codegraph.mjs +6 -0
- package/package.json +8 -3
- package/schemas/cloud/attestation-v2.schema.json +85 -0
- package/schemas/cloud/attestation.schema.json +49 -0
- package/schemas/cloud/check-delivery.schema.json +25 -0
- package/schemas/cloud/cloud-egress-envelope.schema.json +19 -0
- package/schemas/cloud/device-identity.schema.json +18 -0
- package/schemas/cloud/entitlement.schema.json +24 -0
- package/schemas/cloud/governance-key-status.schema.json +19 -0
- package/schemas/cloud/org-runner-identity.schema.json +21 -0
- package/schemas/cloud/review-challenge-v2.schema.json +23 -0
- package/schemas/cloud/runner-identity.schema.json +42 -0
- package/schemas/integrations/adapter-fidelity.schema.json +21 -0
- package/schemas/integrations/chatgpt-ga-tool.schema.json +25 -0
- package/schemas/integrations/likec4-mapping.schema.json +32 -0
- package/schemas/integrations/structurizr-mapping.schema.json +33 -0
- package/schemas/repo/architecture-intervention.schema.json +41 -0
- package/schemas/repo/architecture-node.schema.json +50 -0
- package/schemas/repo/architecture-relation.schema.json +26 -0
- package/schemas/repo/compatibility-contract.schema.json +49 -0
- package/schemas/repo/constraint.schema.json +56 -0
- package/schemas/repo/cross-repo-relation.schema.json +47 -0
- package/schemas/repo/landscape.schema.json +50 -0
- package/schemas/repo/practices/practice-policy.schema.json +72 -0
- package/schemas/repo/practices/practice-profile.schema.json +30 -0
- package/schemas/repo/practices/practice-source.schema.json +34 -0
- package/schemas/repo/practices/practice-waiver.schema.json +27 -0
- package/schemas/repo/practices/practice.schema.json +88 -0
- package/schemas/runtime/agent-job.schema.json +63 -0
- package/schemas/runtime/architecture-candidate-delta-policy.schema.json +129 -0
- package/schemas/runtime/architecture-candidate-delta.schema.json +386 -0
- package/schemas/runtime/architecture-event.schema.json +76 -0
- package/schemas/runtime/architecture-snapshot.schema.json +61 -0
- package/schemas/runtime/architecture-subject-selector.schema.json +31 -0
- package/schemas/runtime/changeset.schema.json +65 -0
- package/schemas/runtime/evidence-binding.schema.json +37 -0
- package/schemas/runtime/evidence-item.schema.json +58 -0
- package/schemas/runtime/explorer-projection.schema.json +92 -0
- package/schemas/runtime/explorer-service.schema.json +19 -0
- package/schemas/runtime/external-document-resource.schema.json +55 -0
- package/schemas/runtime/investigation-report.schema.json +119 -0
- package/schemas/runtime/notification-event.schema.json +18 -0
- package/schemas/runtime/notification-provider.schema.json +26 -0
- package/schemas/runtime/practice-catalog-manifest.schema.json +22 -0
- package/schemas/runtime/practice-check-result.schema.json +45 -0
- package/schemas/runtime/practice-checkpoint.schema.json +127 -0
- package/schemas/runtime/practice-guidance.schema.json +44 -0
- package/schemas/runtime/practice-match.schema.json +41 -0
- package/schemas/runtime/product-version-manifest.schema.json +115 -0
- package/schemas/runtime/projection-target.schema.json +52 -0
- package/schemas/runtime/recommendation-feedback.schema.json +53 -0
- package/schemas/runtime/recommendation-run.schema.json +62 -0
- package/schemas/runtime/recommendation.schema.json +26 -0
- package/schemas/runtime/retrieval-config.schema.json +44 -0
- package/schemas/runtime/retrieval-decision.schema.json +49 -0
- package/schemas/runtime/retrieval-eval.schema.json +29 -0
- package/schemas/runtime/review-result.schema.json +48 -0
- package/schemas/runtime/task-context.schema.json +53 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "archcontext.practice/v1",
|
|
3
|
+
"id": "data.single-authoritative-model",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"status": "active",
|
|
6
|
+
"title": "Data concepts need one authoritative model",
|
|
7
|
+
"summary": "When multiple data shapes represent the same business concept, identify one authoritative model and keep adapters at explicit boundaries.",
|
|
8
|
+
"category": "data",
|
|
9
|
+
"tags": ["data", "model", "authority"],
|
|
10
|
+
"appliesTo": {
|
|
11
|
+
"repositoryKinds": ["application", "service"],
|
|
12
|
+
"languages": [],
|
|
13
|
+
"frameworks": [],
|
|
14
|
+
"pathGlobs": ["src/**", "packages/**", "schemas/**", "migrations/**"],
|
|
15
|
+
"nodeKinds": ["resource", "module", "service"],
|
|
16
|
+
"negativePathGlobs": ["test/**", "**/*.fixture.*"]
|
|
17
|
+
},
|
|
18
|
+
"triggers": {
|
|
19
|
+
"candidateTerms": ["model", "dto", "mapper", "entity", "schema"],
|
|
20
|
+
"pressureSignals": ["dual-track-business-concept"],
|
|
21
|
+
"structuralPredicates": ["parallel-data-shape-observed", "mapper-symbol-added"]
|
|
22
|
+
},
|
|
23
|
+
"evidencePolicy": {
|
|
24
|
+
"minimumStrengthForRecommendation": "heuristic",
|
|
25
|
+
"minimumStrengthForCheckpoint": "observed",
|
|
26
|
+
"minimumStrengthForEnforcement": "observed",
|
|
27
|
+
"requiredKindsForEnforcement": ["symbol", "data-edge"],
|
|
28
|
+
"maxEnforcementWhenOnlyHeuristic": "advisory"
|
|
29
|
+
},
|
|
30
|
+
"guidance": {
|
|
31
|
+
"questions": ["Which representation owns writes?", "Where are adapters allowed?", "What temporary shapes are removed?"],
|
|
32
|
+
"preferred": ["Keep one internal representation.", "Map at ingress, egress, or persistence boundaries."],
|
|
33
|
+
"avoid": ["Business rules duplicated across DTO/entity pairs.", "New mapper chains with no target-state plan."]
|
|
34
|
+
},
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"checkId": "single-authoritative-model",
|
|
38
|
+
"mode": "deterministic",
|
|
39
|
+
"parameters": {
|
|
40
|
+
"requireBoundaryAdapter": true
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"enforcement": {
|
|
45
|
+
"default": "advisory",
|
|
46
|
+
"promotableTo": "checkpoint",
|
|
47
|
+
"repoOptInRequired": true
|
|
48
|
+
},
|
|
49
|
+
"provenance": {
|
|
50
|
+
"sourceKind": "archcontext-native",
|
|
51
|
+
"sourceRefs": [
|
|
52
|
+
{
|
|
53
|
+
"sourceId": "archcontext.spec"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"sourceId": "archcontext.adr.0009"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"curator": "archcontext-maintainers",
|
|
60
|
+
"reviewedAt": "2026-06-23"
|
|
61
|
+
},
|
|
62
|
+
"lifecycle": {
|
|
63
|
+
"introducedAt": "2026-06-23",
|
|
64
|
+
"reviewAfter": "2027-06-23",
|
|
65
|
+
"supersedes": []
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "archcontext.practice/v1",
|
|
3
|
+
"id": "decision.record-significant-change",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"status": "active",
|
|
6
|
+
"title": "Significant architecture changes require a durable decision record",
|
|
7
|
+
"summary": "When a task changes a boundary, persistence model, runtime path, or compatibility contract, record the decision and its tradeoffs before treating the change as settled.",
|
|
8
|
+
"category": "decisions",
|
|
9
|
+
"tags": ["adr", "governance", "tradeoff"],
|
|
10
|
+
"appliesTo": {
|
|
11
|
+
"repositoryKinds": ["application", "service", "library"],
|
|
12
|
+
"languages": [],
|
|
13
|
+
"frameworks": [],
|
|
14
|
+
"pathGlobs": ["**/*"],
|
|
15
|
+
"nodeKinds": ["module", "service", "capability", "public-api"],
|
|
16
|
+
"negativePathGlobs": ["docs/verification/**", "README.md"]
|
|
17
|
+
},
|
|
18
|
+
"triggers": {
|
|
19
|
+
"candidateTerms": ["adr", "decision", "tradeoff", "boundary", "architecture"],
|
|
20
|
+
"pressureSignals": ["architecture-intervention", "boundary-change"],
|
|
21
|
+
"structuralPredicates": ["architecture-boundary-changed", "policy-or-contract-changed"]
|
|
22
|
+
},
|
|
23
|
+
"evidencePolicy": {
|
|
24
|
+
"minimumStrengthForRecommendation": "declared",
|
|
25
|
+
"minimumStrengthForCheckpoint": "observed",
|
|
26
|
+
"minimumStrengthForEnforcement": "observed",
|
|
27
|
+
"requiredKindsForEnforcement": ["architecture-model", "diff"],
|
|
28
|
+
"maxEnforcementWhenOnlyHeuristic": "advisory"
|
|
29
|
+
},
|
|
30
|
+
"guidance": {
|
|
31
|
+
"questions": ["What changed at the architecture boundary?", "Which alternatives were rejected?", "What rollback or review condition exists?"],
|
|
32
|
+
"preferred": ["Record the decision next to the architecture source of truth.", "Keep the record short, specific, and linked to the changed boundary."],
|
|
33
|
+
"avoid": ["Treating a large structural change as self-evident.", "Putting durable rationale only in a PR comment."]
|
|
34
|
+
},
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"checkId": "observed-before-enforced",
|
|
38
|
+
"mode": "deterministic",
|
|
39
|
+
"parameters": {
|
|
40
|
+
"requireObservedEvidence": true
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"enforcement": {
|
|
45
|
+
"default": "advisory",
|
|
46
|
+
"promotableTo": "checkpoint",
|
|
47
|
+
"repoOptInRequired": true
|
|
48
|
+
},
|
|
49
|
+
"provenance": {
|
|
50
|
+
"sourceKind": "curated-open-source",
|
|
51
|
+
"sourceRefs": [
|
|
52
|
+
{
|
|
53
|
+
"sourceId": "madr",
|
|
54
|
+
"sourceRevision": "v4.0.0",
|
|
55
|
+
"licenseSpdx": "MIT OR CC0-1.0"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"sourceId": "archcontext.adr.0036"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"curator": "archcontext-maintainers",
|
|
62
|
+
"reviewedAt": "2026-06-23"
|
|
63
|
+
},
|
|
64
|
+
"lifecycle": {
|
|
65
|
+
"introducedAt": "2026-06-23",
|
|
66
|
+
"reviewAfter": "2027-06-23",
|
|
67
|
+
"supersedes": []
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "archcontext.practice/v1",
|
|
3
|
+
"id": "migration.target-and-removal-state",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"status": "active",
|
|
6
|
+
"title": "Migration work needs both target state and removal state",
|
|
7
|
+
"summary": "A migration is not complete until the desired target state and the removal path for temporary state are both explicit.",
|
|
8
|
+
"category": "migration",
|
|
9
|
+
"tags": ["migration", "target-state", "cleanup"],
|
|
10
|
+
"appliesTo": {
|
|
11
|
+
"repositoryKinds": ["application", "service", "library"],
|
|
12
|
+
"languages": [],
|
|
13
|
+
"frameworks": [],
|
|
14
|
+
"pathGlobs": ["**/*"],
|
|
15
|
+
"nodeKinds": ["module", "service", "resource"],
|
|
16
|
+
"negativePathGlobs": ["docs/**", "test/**"]
|
|
17
|
+
},
|
|
18
|
+
"triggers": {
|
|
19
|
+
"candidateTerms": ["migration", "target state", "cleanup", "remove old", "dual path"],
|
|
20
|
+
"pressureSignals": ["migration-without-target-state", "temporary-state-without-removal"],
|
|
21
|
+
"structuralPredicates": ["old-and-new-path-coexist", "migration-cleanup-missing"]
|
|
22
|
+
},
|
|
23
|
+
"evidencePolicy": {
|
|
24
|
+
"minimumStrengthForRecommendation": "declared",
|
|
25
|
+
"minimumStrengthForCheckpoint": "observed",
|
|
26
|
+
"minimumStrengthForEnforcement": "observed",
|
|
27
|
+
"requiredKindsForEnforcement": ["architecture-model", "diff"],
|
|
28
|
+
"maxEnforcementWhenOnlyHeuristic": "advisory"
|
|
29
|
+
},
|
|
30
|
+
"guidance": {
|
|
31
|
+
"questions": ["What is the final single-path state?", "Which temporary elements remain?", "What proof deletes or retires them?"],
|
|
32
|
+
"preferred": ["Track target state and kill list together.", "Attach review date and owner to temporary state."],
|
|
33
|
+
"avoid": ["Calling migration complete when dual paths still exist.", "Leaving deletion as implicit future work."]
|
|
34
|
+
},
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"checkId": "migration-review-date",
|
|
38
|
+
"mode": "deterministic",
|
|
39
|
+
"parameters": {
|
|
40
|
+
"required": true
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"checkId": "migration-removal-condition",
|
|
45
|
+
"mode": "deterministic",
|
|
46
|
+
"parameters": {
|
|
47
|
+
"required": true
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"enforcement": {
|
|
52
|
+
"default": "advisory",
|
|
53
|
+
"promotableTo": "complete",
|
|
54
|
+
"repoOptInRequired": true,
|
|
55
|
+
"fixtureGate": {
|
|
56
|
+
"positive": [{ "id": "fixture.migration.target-and-removal-state.positive", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Migration evidence without review date or removal condition fails complete enforcement." }],
|
|
57
|
+
"nearNegative": [{ "id": "fixture.migration.target-and-removal-state.near-negative", "path": "evals/practices/benign-negative.jsonl", "description": "Plain migration wording without typed subjects remains non-gating." }],
|
|
58
|
+
"mixedChange": [{ "id": "fixture.migration.target-and-removal-state.mixed-change", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Partial migration proof distinguishes missing removal from invalid review date." }],
|
|
59
|
+
"baseline": [{ "id": "fixture.migration.target-and-removal-state.baseline", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Complete migration review and removal evidence passes deterministically." }]
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"provenance": {
|
|
63
|
+
"sourceKind": "archcontext-native",
|
|
64
|
+
"sourceRefs": [
|
|
65
|
+
{
|
|
66
|
+
"sourceId": "archcontext.adr.0009"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"sourceId": "madr",
|
|
70
|
+
"sourceRevision": "v4.0.0",
|
|
71
|
+
"licenseSpdx": "MIT OR CC0-1.0"
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
"curator": "archcontext-maintainers",
|
|
75
|
+
"reviewedAt": "2026-06-23"
|
|
76
|
+
},
|
|
77
|
+
"lifecycle": {
|
|
78
|
+
"introducedAt": "2026-06-23",
|
|
79
|
+
"reviewAfter": "2027-06-23",
|
|
80
|
+
"supersedes": []
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "archcontext.practice/v1",
|
|
3
|
+
"id": "modularity.no-new-cycle",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"status": "active",
|
|
6
|
+
"title": "Do not introduce new dependency cycles",
|
|
7
|
+
"summary": "A change that creates a new dependency cycle should be stopped or split until the directional boundary is restored.",
|
|
8
|
+
"category": "modularity",
|
|
9
|
+
"tags": ["modularity", "dependency", "cycle"],
|
|
10
|
+
"appliesTo": {
|
|
11
|
+
"repositoryKinds": ["application", "service", "library"],
|
|
12
|
+
"languages": [],
|
|
13
|
+
"frameworks": [],
|
|
14
|
+
"pathGlobs": ["packages/**", "src/**"],
|
|
15
|
+
"nodeKinds": ["module", "service", "package"],
|
|
16
|
+
"negativePathGlobs": ["test/**", "**/*.fixture.*"]
|
|
17
|
+
},
|
|
18
|
+
"triggers": {
|
|
19
|
+
"candidateTerms": ["cycle", "circular", "dependency"],
|
|
20
|
+
"pressureSignals": ["dependency-cycle"],
|
|
21
|
+
"structuralPredicates": ["new-import-cycle-observed", "new-package-cycle-observed"]
|
|
22
|
+
},
|
|
23
|
+
"evidencePolicy": {
|
|
24
|
+
"minimumStrengthForRecommendation": "observed",
|
|
25
|
+
"minimumStrengthForCheckpoint": "observed",
|
|
26
|
+
"minimumStrengthForEnforcement": "observed",
|
|
27
|
+
"requiredKindsForEnforcement": ["import-edge", "diff"],
|
|
28
|
+
"maxEnforcementWhenOnlyHeuristic": "advisory"
|
|
29
|
+
},
|
|
30
|
+
"guidance": {
|
|
31
|
+
"questions": ["Which new edge closed the cycle?", "Can the dependency invert through an interface or existing boundary?", "Is the cycle historical or introduced by this diff?"],
|
|
32
|
+
"preferred": ["Break the newest edge first.", "Move shared contracts to the existing lower-level package."],
|
|
33
|
+
"avoid": ["Adding a helper import that crosses back upward.", "Treating historical cycles and new cycles as the same remediation."]
|
|
34
|
+
},
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"checkId": "no-new-cycle",
|
|
38
|
+
"mode": "deterministic",
|
|
39
|
+
"parameters": {
|
|
40
|
+
"onlyNewViolations": true
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"enforcement": {
|
|
45
|
+
"default": "advisory",
|
|
46
|
+
"promotableTo": "complete",
|
|
47
|
+
"repoOptInRequired": true,
|
|
48
|
+
"fixtureGate": {
|
|
49
|
+
"positive": [{ "id": "fixture.modularity.no-new-cycle.positive", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "New cycle evidence blocks complete enforcement when opted in." }],
|
|
50
|
+
"nearNegative": [{ "id": "fixture.modularity.no-new-cycle.near-negative", "path": "evals/practices/benign-negative.jsonl", "description": "Cycle wording without observed import evidence remains advisory." }],
|
|
51
|
+
"mixedChange": [{ "id": "fixture.modularity.no-new-cycle.mixed-change", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Mixed source and test changes keep cycle subjects scoped." }],
|
|
52
|
+
"baseline": [{ "id": "fixture.modularity.no-new-cycle.baseline", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Historical cycles do not fail unless a new cycle edge appears." }]
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"provenance": {
|
|
56
|
+
"sourceKind": "curated-open-source",
|
|
57
|
+
"sourceRefs": [
|
|
58
|
+
{
|
|
59
|
+
"sourceId": "archunit",
|
|
60
|
+
"licenseSpdx": "Apache-2.0"
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"curator": "archcontext-maintainers",
|
|
64
|
+
"reviewedAt": "2026-06-23"
|
|
65
|
+
},
|
|
66
|
+
"lifecycle": {
|
|
67
|
+
"introducedAt": "2026-06-23",
|
|
68
|
+
"reviewAfter": "2027-06-23",
|
|
69
|
+
"supersedes": []
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "archcontext.practice/v1",
|
|
3
|
+
"id": "modularity.respect-dependency-direction",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"status": "active",
|
|
6
|
+
"title": "Dependency direction must follow declared layers",
|
|
7
|
+
"summary": "When a repository declares layers or package ownership, new imports must move in the allowed direction unless an explicit boundary contract exists.",
|
|
8
|
+
"category": "modularity",
|
|
9
|
+
"tags": ["modularity", "layers", "imports"],
|
|
10
|
+
"appliesTo": {
|
|
11
|
+
"repositoryKinds": ["application", "service", "library"],
|
|
12
|
+
"languages": [],
|
|
13
|
+
"frameworks": [],
|
|
14
|
+
"pathGlobs": ["packages/**", "src/**"],
|
|
15
|
+
"nodeKinds": ["module", "service", "package"],
|
|
16
|
+
"negativePathGlobs": ["test/**", "scripts/**"]
|
|
17
|
+
},
|
|
18
|
+
"triggers": {
|
|
19
|
+
"candidateTerms": ["layer", "boundary", "import", "dependency"],
|
|
20
|
+
"pressureSignals": ["boundary-crossing-import"],
|
|
21
|
+
"structuralPredicates": ["declared-layer-violation-observed", "cross-boundary-import-added"]
|
|
22
|
+
},
|
|
23
|
+
"evidencePolicy": {
|
|
24
|
+
"minimumStrengthForRecommendation": "declared",
|
|
25
|
+
"minimumStrengthForCheckpoint": "observed",
|
|
26
|
+
"minimumStrengthForEnforcement": "observed",
|
|
27
|
+
"requiredKindsForEnforcement": ["import-edge", "architecture-model"],
|
|
28
|
+
"maxEnforcementWhenOnlyHeuristic": "advisory"
|
|
29
|
+
},
|
|
30
|
+
"guidance": {
|
|
31
|
+
"questions": ["Which declared boundary is being crossed?", "Is the dependency direction part of a public contract?", "Can the call move behind a port?"],
|
|
32
|
+
"preferred": ["Use the existing package entrypoint or contract layer.", "Keep core and domain packages free of runtime or surface imports."],
|
|
33
|
+
"avoid": ["Relative imports across package boundaries.", "Adding a convenience import that weakens the layer graph."]
|
|
34
|
+
},
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"checkId": "dependency-direction",
|
|
38
|
+
"mode": "deterministic",
|
|
39
|
+
"parameters": {
|
|
40
|
+
"requiresDeclaredProfile": true
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"enforcement": {
|
|
45
|
+
"default": "advisory",
|
|
46
|
+
"promotableTo": "complete",
|
|
47
|
+
"repoOptInRequired": true,
|
|
48
|
+
"fixtureGate": {
|
|
49
|
+
"positive": [{ "id": "fixture.modularity.respect-dependency-direction.positive", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Typed boundary violation evidence blocks complete enforcement." }],
|
|
50
|
+
"nearNegative": [{ "id": "fixture.modularity.respect-dependency-direction.near-negative", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Plain import edges do not prove declared layer violations." }],
|
|
51
|
+
"mixedChange": [{ "id": "fixture.modularity.respect-dependency-direction.mixed-change", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Mixed historical and new direction violations isolate only the new subject." }],
|
|
52
|
+
"baseline": [{ "id": "fixture.modularity.respect-dependency-direction.baseline", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Historical declared-layer violations pass when unchanged." }]
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"provenance": {
|
|
56
|
+
"sourceKind": "curated-open-source",
|
|
57
|
+
"sourceRefs": [
|
|
58
|
+
{
|
|
59
|
+
"sourceId": "archunit",
|
|
60
|
+
"licenseSpdx": "Apache-2.0"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"sourceId": "archcontext.spec"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"curator": "archcontext-maintainers",
|
|
67
|
+
"reviewedAt": "2026-06-23"
|
|
68
|
+
},
|
|
69
|
+
"lifecycle": {
|
|
70
|
+
"introducedAt": "2026-06-23",
|
|
71
|
+
"reviewAfter": "2027-06-23",
|
|
72
|
+
"supersedes": []
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "archcontext.practice/v1",
|
|
3
|
+
"id": "observability.boundary-telemetry",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"status": "active",
|
|
6
|
+
"title": "New runtime boundaries need telemetry at the boundary",
|
|
7
|
+
"summary": "When a change adds a runtime boundary, queue, external call, or long-lived job, add telemetry that identifies the boundary and failure mode.",
|
|
8
|
+
"category": "observability",
|
|
9
|
+
"tags": ["observability", "telemetry", "runtime-boundary"],
|
|
10
|
+
"appliesTo": {
|
|
11
|
+
"repositoryKinds": ["application", "service"],
|
|
12
|
+
"languages": [],
|
|
13
|
+
"frameworks": [],
|
|
14
|
+
"pathGlobs": ["src/**", "packages/**", "services/**"],
|
|
15
|
+
"nodeKinds": ["service", "resource", "module"],
|
|
16
|
+
"negativePathGlobs": ["test/**", "docs/**"]
|
|
17
|
+
},
|
|
18
|
+
"triggers": {
|
|
19
|
+
"candidateTerms": ["queue", "worker", "external call", "telemetry", "trace", "metric", "log"],
|
|
20
|
+
"pressureSignals": ["runtime-boundary-without-observability"],
|
|
21
|
+
"structuralPredicates": ["runtime-boundary-added", "telemetry-evidence-missing"]
|
|
22
|
+
},
|
|
23
|
+
"evidencePolicy": {
|
|
24
|
+
"minimumStrengthForRecommendation": "declared",
|
|
25
|
+
"minimumStrengthForCheckpoint": "observed",
|
|
26
|
+
"minimumStrengthForEnforcement": "observed",
|
|
27
|
+
"requiredKindsForEnforcement": ["diff", "runtime-check"],
|
|
28
|
+
"maxEnforcementWhenOnlyHeuristic": "advisory"
|
|
29
|
+
},
|
|
30
|
+
"guidance": {
|
|
31
|
+
"questions": ["What boundary can fail independently?", "Which signal identifies latency and failure?", "Where is service identity attached?"],
|
|
32
|
+
"preferred": ["Emit low-cardinality signals at ingress and egress.", "Tie telemetry names to stable architecture IDs where possible."],
|
|
33
|
+
"avoid": ["Adding logs only inside happy-path business logic.", "Using raw request payloads as telemetry fields."]
|
|
34
|
+
},
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"checkId": "boundary-telemetry-required",
|
|
38
|
+
"mode": "deterministic",
|
|
39
|
+
"parameters": {
|
|
40
|
+
"forRuntimeBoundary": true
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"enforcement": {
|
|
45
|
+
"default": "advisory",
|
|
46
|
+
"promotableTo": "checkpoint",
|
|
47
|
+
"repoOptInRequired": true
|
|
48
|
+
},
|
|
49
|
+
"provenance": {
|
|
50
|
+
"sourceKind": "curated-open-source",
|
|
51
|
+
"sourceRefs": [
|
|
52
|
+
{
|
|
53
|
+
"sourceId": "opentelemetry",
|
|
54
|
+
"licenseSpdx": "CC-BY-4.0"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"curator": "archcontext-maintainers",
|
|
58
|
+
"reviewedAt": "2026-06-23"
|
|
59
|
+
},
|
|
60
|
+
"lifecycle": {
|
|
61
|
+
"introducedAt": "2026-06-23",
|
|
62
|
+
"reviewAfter": "2027-06-23",
|
|
63
|
+
"supersedes": []
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "archcontext.practice/v1",
|
|
3
|
+
"id": "ownership.explicit-lifecycle-owner",
|
|
4
|
+
"revision": 1,
|
|
5
|
+
"status": "active",
|
|
6
|
+
"title": "Governed architecture elements need one lifecycle owner",
|
|
7
|
+
"summary": "A component, integration, policy, compatibility path, or generated artifact that can block delivery must have one accountable lifecycle owner.",
|
|
8
|
+
"category": "ownership",
|
|
9
|
+
"tags": ["ownership", "lifecycle", "governance"],
|
|
10
|
+
"appliesTo": {
|
|
11
|
+
"repositoryKinds": ["application", "service", "library"],
|
|
12
|
+
"languages": [],
|
|
13
|
+
"frameworks": [],
|
|
14
|
+
"pathGlobs": ["**/*"],
|
|
15
|
+
"nodeKinds": ["module", "service", "resource", "public-api"],
|
|
16
|
+
"negativePathGlobs": ["test/**", "**/*.fixture.*"]
|
|
17
|
+
},
|
|
18
|
+
"triggers": {
|
|
19
|
+
"candidateTerms": ["owner", "ownership", "team", "lifecycle"],
|
|
20
|
+
"pressureSignals": ["multiple-lifecycle-owner", "missing-owner"],
|
|
21
|
+
"structuralPredicates": ["governed-element-created", "ownership-spread-observed"]
|
|
22
|
+
},
|
|
23
|
+
"evidencePolicy": {
|
|
24
|
+
"minimumStrengthForRecommendation": "declared",
|
|
25
|
+
"minimumStrengthForCheckpoint": "observed",
|
|
26
|
+
"minimumStrengthForEnforcement": "observed",
|
|
27
|
+
"requiredKindsForEnforcement": ["architecture-model", "diff"],
|
|
28
|
+
"maxEnforcementWhenOnlyHeuristic": "advisory"
|
|
29
|
+
},
|
|
30
|
+
"guidance": {
|
|
31
|
+
"questions": ["Who owns this element through removal or replacement?", "Where is that owner recorded?", "What condition ends the obligation?"],
|
|
32
|
+
"preferred": ["Record one owner in the model or policy.", "Use review dates for temporary ownership."],
|
|
33
|
+
"avoid": ["Shared ownership with no escalation path.", "Implicit ownership by whoever touched the file last."]
|
|
34
|
+
},
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"checkId": "owner-required",
|
|
38
|
+
"mode": "deterministic",
|
|
39
|
+
"parameters": {
|
|
40
|
+
"scope": "governed-elements"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"enforcement": {
|
|
45
|
+
"default": "advisory",
|
|
46
|
+
"promotableTo": "complete",
|
|
47
|
+
"repoOptInRequired": true,
|
|
48
|
+
"fixtureGate": {
|
|
49
|
+
"positive": [{ "id": "fixture.ownership.explicit-lifecycle-owner.positive", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Governed subjects without lifecycle owners fail complete enforcement." }],
|
|
50
|
+
"nearNegative": [{ "id": "fixture.ownership.explicit-lifecycle-owner.near-negative", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Plain symbols are not treated as governed owner subjects." }],
|
|
51
|
+
"mixedChange": [{ "id": "fixture.ownership.explicit-lifecycle-owner.mixed-change", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Owned, missing, split and self-attested subjects are separated in one fixture." }],
|
|
52
|
+
"baseline": [{ "id": "fixture.ownership.explicit-lifecycle-owner.baseline", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Owner registry readback anchors complete enforcement to declared model owners." }]
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"provenance": {
|
|
56
|
+
"sourceKind": "curated-open-source",
|
|
57
|
+
"sourceRefs": [
|
|
58
|
+
{
|
|
59
|
+
"sourceId": "backstage",
|
|
60
|
+
"licenseSpdx": "Apache-2.0"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"sourceId": "archcontext.spec"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"curator": "archcontext-maintainers",
|
|
67
|
+
"reviewedAt": "2026-06-23"
|
|
68
|
+
},
|
|
69
|
+
"lifecycle": {
|
|
70
|
+
"introducedAt": "2026-06-23",
|
|
71
|
+
"reviewAfter": "2027-06-23",
|
|
72
|
+
"supersedes": []
|
|
73
|
+
}
|
|
74
|
+
}
|