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.
Files changed (78) hide show
  1. package/NOTICE.md +23 -0
  2. package/assets/README.md +15 -0
  3. package/assets/catalog.yaml +393 -0
  4. package/assets/practices/api.contract-before-implementation.yaml +70 -0
  5. package/assets/practices/compatibility.expiry-contract.yaml +71 -0
  6. package/assets/practices/compatibility.single-owner.yaml +78 -0
  7. package/assets/practices/data.single-authoritative-model.yaml +67 -0
  8. package/assets/practices/decision.record-significant-change.yaml +69 -0
  9. package/assets/practices/migration.target-and-removal-state.yaml +82 -0
  10. package/assets/practices/modularity.no-new-cycle.yaml +71 -0
  11. package/assets/practices/modularity.respect-dependency-direction.yaml +74 -0
  12. package/assets/practices/observability.boundary-telemetry.yaml +65 -0
  13. package/assets/practices/ownership.explicit-lifecycle-owner.yaml +74 -0
  14. package/assets/practices/s6-expanded.yaml +1278 -0
  15. package/assets/practices/security.least-privilege.yaml +70 -0
  16. package/assets/practices/supply-chain.pinned-dependencies.yaml +65 -0
  17. package/assets/profiles/s6.yaml +194 -0
  18. package/assets/sources/core.yaml +211 -0
  19. package/assets/sources/s6.yaml +122 -0
  20. package/bin/archctx.mjs +18231 -2410
  21. package/bin/codegraph.mjs +6 -0
  22. package/package.json +8 -3
  23. package/schemas/cloud/attestation-v2.schema.json +85 -0
  24. package/schemas/cloud/attestation.schema.json +49 -0
  25. package/schemas/cloud/check-delivery.schema.json +25 -0
  26. package/schemas/cloud/cloud-egress-envelope.schema.json +19 -0
  27. package/schemas/cloud/device-identity.schema.json +18 -0
  28. package/schemas/cloud/entitlement.schema.json +24 -0
  29. package/schemas/cloud/governance-key-status.schema.json +19 -0
  30. package/schemas/cloud/org-runner-identity.schema.json +21 -0
  31. package/schemas/cloud/review-challenge-v2.schema.json +23 -0
  32. package/schemas/cloud/runner-identity.schema.json +42 -0
  33. package/schemas/integrations/adapter-fidelity.schema.json +21 -0
  34. package/schemas/integrations/chatgpt-ga-tool.schema.json +25 -0
  35. package/schemas/integrations/likec4-mapping.schema.json +32 -0
  36. package/schemas/integrations/structurizr-mapping.schema.json +33 -0
  37. package/schemas/repo/architecture-intervention.schema.json +41 -0
  38. package/schemas/repo/architecture-node.schema.json +50 -0
  39. package/schemas/repo/architecture-relation.schema.json +26 -0
  40. package/schemas/repo/compatibility-contract.schema.json +49 -0
  41. package/schemas/repo/constraint.schema.json +56 -0
  42. package/schemas/repo/cross-repo-relation.schema.json +47 -0
  43. package/schemas/repo/landscape.schema.json +50 -0
  44. package/schemas/repo/practices/practice-policy.schema.json +72 -0
  45. package/schemas/repo/practices/practice-profile.schema.json +30 -0
  46. package/schemas/repo/practices/practice-source.schema.json +34 -0
  47. package/schemas/repo/practices/practice-waiver.schema.json +27 -0
  48. package/schemas/repo/practices/practice.schema.json +88 -0
  49. package/schemas/runtime/agent-job.schema.json +63 -0
  50. package/schemas/runtime/architecture-candidate-delta-policy.schema.json +129 -0
  51. package/schemas/runtime/architecture-candidate-delta.schema.json +386 -0
  52. package/schemas/runtime/architecture-event.schema.json +76 -0
  53. package/schemas/runtime/architecture-snapshot.schema.json +61 -0
  54. package/schemas/runtime/architecture-subject-selector.schema.json +31 -0
  55. package/schemas/runtime/changeset.schema.json +65 -0
  56. package/schemas/runtime/evidence-binding.schema.json +37 -0
  57. package/schemas/runtime/evidence-item.schema.json +58 -0
  58. package/schemas/runtime/explorer-projection.schema.json +92 -0
  59. package/schemas/runtime/explorer-service.schema.json +19 -0
  60. package/schemas/runtime/external-document-resource.schema.json +55 -0
  61. package/schemas/runtime/investigation-report.schema.json +119 -0
  62. package/schemas/runtime/notification-event.schema.json +18 -0
  63. package/schemas/runtime/notification-provider.schema.json +26 -0
  64. package/schemas/runtime/practice-catalog-manifest.schema.json +22 -0
  65. package/schemas/runtime/practice-check-result.schema.json +45 -0
  66. package/schemas/runtime/practice-checkpoint.schema.json +127 -0
  67. package/schemas/runtime/practice-guidance.schema.json +44 -0
  68. package/schemas/runtime/practice-match.schema.json +41 -0
  69. package/schemas/runtime/product-version-manifest.schema.json +115 -0
  70. package/schemas/runtime/projection-target.schema.json +52 -0
  71. package/schemas/runtime/recommendation-feedback.schema.json +53 -0
  72. package/schemas/runtime/recommendation-run.schema.json +62 -0
  73. package/schemas/runtime/recommendation.schema.json +26 -0
  74. package/schemas/runtime/retrieval-config.schema.json +44 -0
  75. package/schemas/runtime/retrieval-decision.schema.json +49 -0
  76. package/schemas/runtime/retrieval-eval.schema.json +29 -0
  77. package/schemas/runtime/review-result.schema.json +48 -0
  78. package/schemas/runtime/task-context.schema.json +53 -0
package/NOTICE.md ADDED
@@ -0,0 +1,23 @@
1
+ # archctx Notices
2
+
3
+ This package includes curated architecture practice assets. The source registry bundled in `assets/sources/` is the authoritative provenance record.
4
+
5
+ - Structurizr DSL Documentation (structurizr.dsl): LicenseRef-Structurizr-Docs; Structurizr DSL documentation; revision pinned-reference-2026-06-24.
6
+ - The Twelve-Factor App (twelve-factor): MIT; The Twelve-Factor App contributors; revision pinned-reference-2026-06-24.
7
+ - Kubernetes Documentation (kubernetes.docs): CC-BY-4.0; Kubernetes documentation contributors; revision pinned-reference-2026-06-24.
8
+ - CNCF TAG App Delivery (cncf.app-delivery): Apache-2.0; CNCF TAG App Delivery contributors; revision pinned-reference-2026-06-24.
9
+ - Google SRE Book (google.sre): CC-BY-NC-ND-4.0; Google SRE Book authors; revision pinned-reference-2026-06-24.
10
+ - Azure Architecture Center (azure.architecture): LicenseRef-Microsoft-Docs; Microsoft Learn documentation; revision pinned-reference-2026-06-24.
11
+ - OWASP Cheat Sheet Series (owasp.cheat-sheet-series): CC-BY-SA-4.0; OWASP Cheat Sheet Series contributors; revision pinned-reference-2026-06-24.
12
+ - arc42 Template (arc42): CC-BY-SA-4.0; arc42 contributors; revision pinned-reference-2026-06-24.
13
+ - ArchContext Product Specification (archcontext.spec): LicenseRef-ArchContext-Repo; ArchContext maintainers; revision 2026-06-23.
14
+ - ADR-0008 Declared Observed Verified (archcontext.adr.0008): LicenseRef-ArchContext-Repo; ArchContext maintainers; revision 2026-06-23.
15
+ - ADR-0009 Target State vs Migration State (archcontext.adr.0009): LicenseRef-ArchContext-Repo; ArchContext maintainers; revision 2026-06-23.
16
+ - ADR-0010 Compatibility Code Requires Contract (archcontext.adr.0010): LicenseRef-ArchContext-Repo; ArchContext maintainers; revision 2026-06-23.
17
+ - ADR-0012 Changeset-only Architecture Writes (archcontext.adr.0012): LicenseRef-ArchContext-Repo; ArchContext maintainers; revision 2026-06-23.
18
+ - ADR-0036 Deterministic Gate LLM Advisory (archcontext.adr.0036): LicenseRef-ArchContext-Repo; ArchContext maintainers; revision 2026-06-23.
19
+ - Markdown Architectural Decision Records (madr): MIT OR CC0-1.0; MADR contributors; revision v4.0.0.
20
+ - Backstage Software Catalog (backstage): Apache-2.0; Backstage contributors; revision pinned-reference.
21
+ - ArchUnit (archunit): Apache-2.0; ArchUnit contributors; revision pinned-reference.
22
+ - OpenTelemetry Documentation (opentelemetry): CC-BY-4.0; OpenTelemetry contributors; revision pinned-reference.
23
+ - OpenSSF Scorecard (openssf.scorecard): Apache-2.0; OpenSSF Scorecard contributors; revision pinned-reference.
@@ -0,0 +1,15 @@
1
+ # Practice Catalog Assets
2
+
3
+ Built-in assets use `.yaml` files containing the JSON-compatible YAML subset.
4
+ The loader intentionally keeps parsing strict in the first release so catalog
5
+ digests stay stable across operating systems and formatter changes.
6
+
7
+ Authoring rules:
8
+
9
+ - Every practice is original ArchContext guidance, not copied source text.
10
+ - Every source reference must exist under `sources/`.
11
+ - Candidate terms are recall hints only; enforcement requires deterministic
12
+ checks and repository opt-in.
13
+ - Built-in assets default to advisory.
14
+ - Repo overlays live under `.archcontext/practices/` and must use
15
+ `overlay.mode` for `replace` or `disable`.
@@ -0,0 +1,393 @@
1
+ {
2
+ "schemaVersion": "archcontext.practice-catalog-manifest/v1",
3
+ "catalogVersion": "2026.06.0",
4
+ "productVersion": "0.1.4-beta.0",
5
+ "generatedAt": "1970-01-01T00:00:00.000Z",
6
+ "entries": [
7
+ {
8
+ "id": "api.backward-compatible-error-shape",
9
+ "revision": 1,
10
+ "digest": "sha256:6c8449b8ed749dd799a0b18c7c18e5bd7419ee023ceb39220a4a5d14497620bc",
11
+ "sourceIds": [
12
+ "archcontext.adr.0010",
13
+ "twelve-factor"
14
+ ]
15
+ },
16
+ {
17
+ "id": "api.contract-before-implementation",
18
+ "revision": 1,
19
+ "digest": "sha256:feda012bf57e5d3b8cef58fc1f9a7d8a44a4f894325f294dc91e3eec5cc01274",
20
+ "sourceIds": [
21
+ "archcontext.adr.0012"
22
+ ]
23
+ },
24
+ {
25
+ "id": "api.idempotency-contract",
26
+ "revision": 1,
27
+ "digest": "sha256:f0227e27220720c3def141cb7ec0a52279e88a231ec16d6907831718f129b609",
28
+ "sourceIds": [
29
+ "archcontext.adr.0036",
30
+ "twelve-factor"
31
+ ]
32
+ },
33
+ {
34
+ "id": "api.schema-version-contract",
35
+ "revision": 1,
36
+ "digest": "sha256:558ffdcbe6bda5bbdeec983b94ee01228a5bb155d20c7e70a8bef3e658521930",
37
+ "sourceIds": [
38
+ "archcontext.adr.0012",
39
+ "structurizr.dsl"
40
+ ]
41
+ },
42
+ {
43
+ "id": "compatibility.deprecation-window",
44
+ "revision": 1,
45
+ "digest": "sha256:040265971f79b54d451146fab43f3a46373b17ef6f9a947753b64b4b9531a8f1",
46
+ "sourceIds": [
47
+ "archcontext.adr.0009",
48
+ "archcontext.adr.0010"
49
+ ]
50
+ },
51
+ {
52
+ "id": "compatibility.expiry-contract",
53
+ "revision": 1,
54
+ "digest": "sha256:fac35fddef8cc263ea8af18052c2ceae86484f340192c84b2358c130bf16d411",
55
+ "sourceIds": [
56
+ "archcontext.adr.0010"
57
+ ]
58
+ },
59
+ {
60
+ "id": "compatibility.rollback-entrypoint",
61
+ "revision": 1,
62
+ "digest": "sha256:40bccd9b8691221ba3dfc443dcdf41181f4ffd31162460054c01cfa85df8d363",
63
+ "sourceIds": [
64
+ "azure.architecture",
65
+ "twelve-factor"
66
+ ]
67
+ },
68
+ {
69
+ "id": "compatibility.single-owner",
70
+ "revision": 1,
71
+ "digest": "sha256:10cd2ee205eb6440efb12cb88d6e4256f90bb71e575a51a2c8eb0912da1ae4b3",
72
+ "sourceIds": [
73
+ "archcontext.adr.0010",
74
+ "madr"
75
+ ]
76
+ },
77
+ {
78
+ "id": "data.event-version-lineage",
79
+ "revision": 1,
80
+ "digest": "sha256:cca5d1661791d76f7eaf4eb0afa8a98958ac2bf9de9e4e02f33ef2a6b9203a3d",
81
+ "sourceIds": [
82
+ "archcontext.adr.0010",
83
+ "kubernetes.docs"
84
+ ]
85
+ },
86
+ {
87
+ "id": "data.migration-backfill-evidence",
88
+ "revision": 1,
89
+ "digest": "sha256:12f11757903e72fb3839a9901b2aa950399f9a21b42a4d5e6ac04e32550c50b0",
90
+ "sourceIds": [
91
+ "archcontext.adr.0009",
92
+ "opentelemetry"
93
+ ]
94
+ },
95
+ {
96
+ "id": "data.schema-ownership-boundary",
97
+ "revision": 1,
98
+ "digest": "sha256:0173e7cf21315602254df946eabf36ff48e0daae175da0ac896ce236b990f902",
99
+ "sourceIds": [
100
+ "archcontext.adr.0008",
101
+ "backstage"
102
+ ]
103
+ },
104
+ {
105
+ "id": "data.single-authoritative-model",
106
+ "revision": 1,
107
+ "digest": "sha256:3aa691d353de1c5c7949d46fb222791fc95ec5974f0b902354672d1e769ae04e",
108
+ "sourceIds": [
109
+ "archcontext.adr.0009",
110
+ "archcontext.spec"
111
+ ]
112
+ },
113
+ {
114
+ "id": "decision.decision-review-date",
115
+ "revision": 1,
116
+ "digest": "sha256:66e27ef86c399ff45984826386e1eca9e183b848839d92644bd1def230f41341",
117
+ "sourceIds": [
118
+ "archcontext.adr.0009",
119
+ "madr"
120
+ ]
121
+ },
122
+ {
123
+ "id": "decision.record-significant-change",
124
+ "revision": 1,
125
+ "digest": "sha256:d95b84a2a42979a81158b523c8fa4975d3b98fdc500cfee570a55b92cd60acab",
126
+ "sourceIds": [
127
+ "archcontext.adr.0036",
128
+ "madr"
129
+ ]
130
+ },
131
+ {
132
+ "id": "decision.supersession-link",
133
+ "revision": 1,
134
+ "digest": "sha256:ccd67b3bf3b0642757c907a1b2c5c28a2ce88d49838a6b814e4cea280efabc91",
135
+ "sourceIds": [
136
+ "archcontext.adr.0012",
137
+ "madr"
138
+ ]
139
+ },
140
+ {
141
+ "id": "decision.tradeoff-options-recorded",
142
+ "revision": 1,
143
+ "digest": "sha256:1027090dcc8a87dcc647cdf905ab8f8fa72b462d602ff645ea538c51dd677a27",
144
+ "sourceIds": [
145
+ "archcontext.adr.0012",
146
+ "madr"
147
+ ]
148
+ },
149
+ {
150
+ "id": "migration.backfill-reconciliation",
151
+ "revision": 1,
152
+ "digest": "sha256:8a0eeb42bebb5abdaacd0a97d15a3e07bd1c846c7514e03e8a85f5a1cb3eb73d",
153
+ "sourceIds": [
154
+ "archcontext.adr.0009",
155
+ "archcontext.spec"
156
+ ]
157
+ },
158
+ {
159
+ "id": "migration.parallel-run-observability",
160
+ "revision": 1,
161
+ "digest": "sha256:2a4db10fa9b3eea976aa5c88c118146903eb3cda606c211008c45d98e1ddf6b1",
162
+ "sourceIds": [
163
+ "archcontext.adr.0009",
164
+ "opentelemetry"
165
+ ]
166
+ },
167
+ {
168
+ "id": "migration.rollback-plan",
169
+ "revision": 1,
170
+ "digest": "sha256:2948186128975b08ad8164c630d4ae7f5f7c36d43b1b1279809e3b785080e297",
171
+ "sourceIds": [
172
+ "archcontext.adr.0009",
173
+ "azure.architecture"
174
+ ]
175
+ },
176
+ {
177
+ "id": "migration.target-and-removal-state",
178
+ "revision": 1,
179
+ "digest": "sha256:d2803800c9deb288113e5f087c96e35bb45d9f2dae0d8a9350e1434f7369cd7e",
180
+ "sourceIds": [
181
+ "archcontext.adr.0009",
182
+ "madr"
183
+ ]
184
+ },
185
+ {
186
+ "id": "modularity.layer-contract-declared",
187
+ "revision": 1,
188
+ "digest": "sha256:9f48437f90e17c6b518983e6f305022db0c18c7a7b5beb17a4cff5df57824bae",
189
+ "sourceIds": [
190
+ "archunit",
191
+ "structurizr.dsl"
192
+ ]
193
+ },
194
+ {
195
+ "id": "modularity.no-new-cycle",
196
+ "revision": 1,
197
+ "digest": "sha256:411e860fd6ddbfd12dc6dd2a90a09f618d64842efbe0fd08b01f6e12ef98038e",
198
+ "sourceIds": [
199
+ "archunit"
200
+ ]
201
+ },
202
+ {
203
+ "id": "modularity.no-shared-internal-imports",
204
+ "revision": 1,
205
+ "digest": "sha256:19e99f0c9bc10ad6c96c219021f865191a05c6c3bcd38ae4ee0d9ad61de43332",
206
+ "sourceIds": [
207
+ "archcontext.adr.0012",
208
+ "archunit"
209
+ ]
210
+ },
211
+ {
212
+ "id": "modularity.respect-dependency-direction",
213
+ "revision": 1,
214
+ "digest": "sha256:b14a5f8d63aa306bb275e2de6c282856347579dcddad2c9728fdfd87662f8623",
215
+ "sourceIds": [
216
+ "archcontext.spec",
217
+ "archunit"
218
+ ]
219
+ },
220
+ {
221
+ "id": "observability.boundary-telemetry",
222
+ "revision": 1,
223
+ "digest": "sha256:350c5a53f961911d9f29131f38ebdfacc099e05554c8e1ce0b23e9b0152fa105",
224
+ "sourceIds": [
225
+ "opentelemetry"
226
+ ]
227
+ },
228
+ {
229
+ "id": "observability.error-budget-signal",
230
+ "revision": 1,
231
+ "digest": "sha256:af034b7c1fee1653d551a710f155d48a0094ca3917779476b70529b9d23ed40d",
232
+ "sourceIds": [
233
+ "azure.architecture",
234
+ "opentelemetry"
235
+ ]
236
+ },
237
+ {
238
+ "id": "observability.queue-boundary-metrics",
239
+ "revision": 1,
240
+ "digest": "sha256:5323893611436bd10f21565731c3338f6e8fa8500bdab321ba1d3389b10fc427",
241
+ "sourceIds": [
242
+ "cncf.app-delivery",
243
+ "opentelemetry"
244
+ ]
245
+ },
246
+ {
247
+ "id": "observability.release-health-probe",
248
+ "revision": 1,
249
+ "digest": "sha256:eb5e957beea83b88b4edfb6e265c2f62fe35a69402799304f4abab87f59115d0",
250
+ "sourceIds": [
251
+ "kubernetes.docs",
252
+ "opentelemetry"
253
+ ]
254
+ },
255
+ {
256
+ "id": "ownership.escalation-contact",
257
+ "revision": 1,
258
+ "digest": "sha256:610f39e8e67e37abdc2b78079cef59c04adcbdbcc2773e69c5b703ddbf80b0fa",
259
+ "sourceIds": [
260
+ "backstage",
261
+ "cncf.app-delivery"
262
+ ]
263
+ },
264
+ {
265
+ "id": "ownership.explicit-lifecycle-owner",
266
+ "revision": 1,
267
+ "digest": "sha256:c0ba742d5ff505305292fb6cd508d27bbabe94e2ba045b316ace4e783d16944e",
268
+ "sourceIds": [
269
+ "archcontext.spec",
270
+ "backstage"
271
+ ]
272
+ },
273
+ {
274
+ "id": "ownership.operational-owner",
275
+ "revision": 1,
276
+ "digest": "sha256:d8fdacf11a8e9ee2e46eaf9a78f57a3b6d66c057e8a2bfcac29b3faac09a1f8f",
277
+ "sourceIds": [
278
+ "archcontext.adr.0036",
279
+ "backstage"
280
+ ]
281
+ },
282
+ {
283
+ "id": "ownership.service-catalog-entry",
284
+ "revision": 1,
285
+ "digest": "sha256:59d5562970fd857087bcf6243391b980d8d0d13f36be4396dc7af54b5a5f8197",
286
+ "sourceIds": [
287
+ "archcontext.spec",
288
+ "backstage"
289
+ ]
290
+ },
291
+ {
292
+ "id": "security.audit-log-redaction",
293
+ "revision": 1,
294
+ "digest": "sha256:921d52cfaa2d2a39ae1bd37c630ef55eef6a6f1248ddb23cbf4ece54cc7105db",
295
+ "sourceIds": [
296
+ "archcontext.adr.0036",
297
+ "archcontext.spec"
298
+ ]
299
+ },
300
+ {
301
+ "id": "security.external-permission-review",
302
+ "revision": 1,
303
+ "digest": "sha256:5dafe3a89389bfb95e75db79afe58d9894dd51c8fe02fd5a3756c47dc6ac4a59",
304
+ "sourceIds": [
305
+ "archcontext.adr.0036",
306
+ "openssf.scorecard"
307
+ ]
308
+ },
309
+ {
310
+ "id": "security.least-privilege",
311
+ "revision": 1,
312
+ "digest": "sha256:cd6ac2258d32c3df30427c62762cfc58e64cca74087e7e54455eecde54f89f08",
313
+ "sourceIds": [
314
+ "archcontext.adr.0036"
315
+ ]
316
+ },
317
+ {
318
+ "id": "security.secret-material-never-enters-repo",
319
+ "revision": 1,
320
+ "digest": "sha256:0fd56ae3c4ee17575d9bb42af31d8a2febee4ba98b34fe3be56c4deb9e770cb1",
321
+ "sourceIds": [
322
+ "archcontext.adr.0036",
323
+ "openssf.scorecard"
324
+ ]
325
+ },
326
+ {
327
+ "id": "security.secret-redaction-old",
328
+ "revision": 1,
329
+ "digest": "sha256:14a71e065a55da1b7b8c4cdb24d15960d4ccd9fa5d5dcc36b2f185695bb02bd9",
330
+ "sourceIds": [
331
+ "archcontext.adr.0036",
332
+ "openssf.scorecard"
333
+ ]
334
+ },
335
+ {
336
+ "id": "supply-chain.dependency-update-review",
337
+ "revision": 1,
338
+ "digest": "sha256:6c7e92c1a9f898fc2eb771f083403b6289b01d125df3d56dd1391efca8845524",
339
+ "sourceIds": [
340
+ "archcontext.adr.0036",
341
+ "openssf.scorecard"
342
+ ]
343
+ },
344
+ {
345
+ "id": "supply-chain.pinned-dependencies",
346
+ "revision": 1,
347
+ "digest": "sha256:d091497c904baa5bc010eb77fbea202b5f3700ec9a0d5ee45db6d34c8a61e82b",
348
+ "sourceIds": [
349
+ "openssf.scorecard"
350
+ ]
351
+ },
352
+ {
353
+ "id": "supply-chain.release-artifact-digest",
354
+ "revision": 1,
355
+ "digest": "sha256:7b417cb099ae7c0d52193835bf9453380f374beb08feebf1d6aa3a194538e0ba",
356
+ "sourceIds": [
357
+ "openssf.scorecard",
358
+ "twelve-factor"
359
+ ]
360
+ },
361
+ {
362
+ "id": "supply-chain.sbom-manifest",
363
+ "revision": 1,
364
+ "digest": "sha256:c46fc62568baa386231f4ab57d311cdf2706c12b3f179e9a859c45b6d7e14f70",
365
+ "sourceIds": [
366
+ "cncf.app-delivery",
367
+ "openssf.scorecard"
368
+ ]
369
+ }
370
+ ],
371
+ "sourceIds": [
372
+ "arc42",
373
+ "archcontext.adr.0008",
374
+ "archcontext.adr.0009",
375
+ "archcontext.adr.0010",
376
+ "archcontext.adr.0012",
377
+ "archcontext.adr.0036",
378
+ "archcontext.spec",
379
+ "archunit",
380
+ "azure.architecture",
381
+ "backstage",
382
+ "cncf.app-delivery",
383
+ "google.sre",
384
+ "kubernetes.docs",
385
+ "madr",
386
+ "openssf.scorecard",
387
+ "opentelemetry",
388
+ "owasp.cheat-sheet-series",
389
+ "structurizr.dsl",
390
+ "twelve-factor"
391
+ ],
392
+ "catalogDigest": "sha256:19c4fdf4068eaf19f782d92373354cff071947134e76eb6927998d5a9a1146c3"
393
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "schemaVersion": "archcontext.practice/v1",
3
+ "id": "api.contract-before-implementation",
4
+ "revision": 1,
5
+ "status": "active",
6
+ "title": "API boundary changes should update the contract before implementation",
7
+ "summary": "A public API, event, or integration boundary should have its contract updated before downstream implementation details depend on it.",
8
+ "category": "api",
9
+ "tags": ["api", "contract", "boundary"],
10
+ "appliesTo": {
11
+ "repositoryKinds": ["application", "service", "library"],
12
+ "languages": [],
13
+ "frameworks": [],
14
+ "pathGlobs": ["src/**", "packages/**", "schemas/**"],
15
+ "nodeKinds": ["public-api", "service", "module"],
16
+ "negativePathGlobs": ["test/**", "docs/**"]
17
+ },
18
+ "triggers": {
19
+ "candidateTerms": ["api", "contract", "schema", "event", "public"],
20
+ "pressureSignals": ["contract-after-implementation"],
21
+ "structuralPredicates": ["public-api-changed", "schema-contract-missing"]
22
+ },
23
+ "evidencePolicy": {
24
+ "minimumStrengthForRecommendation": "declared",
25
+ "minimumStrengthForCheckpoint": "observed",
26
+ "minimumStrengthForEnforcement": "observed",
27
+ "requiredKindsForEnforcement": ["diff", "path", "test"],
28
+ "maxEnforcementWhenOnlyHeuristic": "advisory"
29
+ },
30
+ "guidance": {
31
+ "questions": ["Which consumer sees this boundary?", "Where is the contract versioned?", "What compatibility test proves the shape?"],
32
+ "preferred": ["Change the schema or contract in the same slice.", "Keep implementation and contract reviewable together."],
33
+ "avoid": ["Implementing first and documenting later.", "Letting tests be the only public contract."]
34
+ },
35
+ "checks": [
36
+ {
37
+ "checkId": "required-test-evidence",
38
+ "mode": "deterministic",
39
+ "parameters": {
40
+ "scope": "public-api"
41
+ }
42
+ }
43
+ ],
44
+ "enforcement": {
45
+ "default": "advisory",
46
+ "promotableTo": "complete",
47
+ "repoOptInRequired": true,
48
+ "fixtureGate": {
49
+ "positive": [{ "id": "fixture.api.contract-before-implementation.positive", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Policy-declared test evidence can satisfy complete enforcement." }],
50
+ "nearNegative": [{ "id": "fixture.api.contract-before-implementation.near-negative", "path": "evals/practices/benign-negative.jsonl", "description": "Benign API wording does not become complete enforcement." }],
51
+ "mixedChange": [{ "id": "fixture.api.contract-before-implementation.mixed-change", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Partial command-only evidence still fails the required subject proof." }],
52
+ "baseline": [{ "id": "fixture.api.contract-before-implementation.baseline", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Policy-declared test evidence is evaluated against explicit match subjects." }]
53
+ }
54
+ },
55
+ "provenance": {
56
+ "sourceKind": "archcontext-native",
57
+ "sourceRefs": [
58
+ {
59
+ "sourceId": "archcontext.adr.0012"
60
+ }
61
+ ],
62
+ "curator": "archcontext-maintainers",
63
+ "reviewedAt": "2026-06-23"
64
+ },
65
+ "lifecycle": {
66
+ "introducedAt": "2026-06-23",
67
+ "reviewAfter": "2027-06-23",
68
+ "supersedes": []
69
+ }
70
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "schemaVersion": "archcontext.practice/v1",
3
+ "id": "compatibility.expiry-contract",
4
+ "revision": 1,
5
+ "status": "active",
6
+ "title": "Temporary compatibility needs an expiry contract",
7
+ "summary": "A temporary compatibility path must name its durable reason, review date, and deletion condition before it can become governed code.",
8
+ "category": "compatibility",
9
+ "tags": ["compatibility", "expiry", "cleanup"],
10
+ "appliesTo": {
11
+ "repositoryKinds": ["application", "service", "library"],
12
+ "languages": [],
13
+ "frameworks": [],
14
+ "pathGlobs": ["**/*"],
15
+ "nodeKinds": ["module", "service", "public-api"],
16
+ "negativePathGlobs": ["test/**", "docs/**"]
17
+ },
18
+ "triggers": {
19
+ "candidateTerms": ["temporary", "compatibility", "fallback", "cleanup later", "legacy"],
20
+ "pressureSignals": ["unbounded-compatibility-path"],
21
+ "structuralPredicates": ["compatibility-path-added", "cleanup-contract-missing"]
22
+ },
23
+ "evidencePolicy": {
24
+ "minimumStrengthForRecommendation": "heuristic",
25
+ "minimumStrengthForCheckpoint": "observed",
26
+ "minimumStrengthForEnforcement": "observed",
27
+ "requiredKindsForEnforcement": ["diff", "architecture-model"],
28
+ "maxEnforcementWhenOnlyHeuristic": "advisory"
29
+ },
30
+ "guidance": {
31
+ "questions": ["When can this code be removed?", "What proof closes the compatibility window?", "Who reviews it if the date passes?"],
32
+ "preferred": ["Use a dated removal condition and owner.", "Keep compatibility logic at one boundary."],
33
+ "avoid": ["Open-ended temporary branches.", "Cleanup notes with no owner or date."]
34
+ },
35
+ "checks": [
36
+ {
37
+ "checkId": "compatibility-contract-required",
38
+ "mode": "deterministic",
39
+ "parameters": {
40
+ "requireRemovalCondition": true,
41
+ "requireReviewDate": true
42
+ }
43
+ }
44
+ ],
45
+ "enforcement": {
46
+ "default": "advisory",
47
+ "promotableTo": "complete",
48
+ "repoOptInRequired": true,
49
+ "fixtureGate": {
50
+ "positive": [{ "id": "fixture.compatibility.expiry-contract.positive", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Invalid or vague expiry evidence blocks complete enforcement." }],
51
+ "nearNegative": [{ "id": "fixture.compatibility.expiry-contract.near-negative", "path": "evals/practices/benign-negative.jsonl", "description": "General compatibility wording remains advisory without scoped evidence." }],
52
+ "mixedChange": [{ "id": "fixture.compatibility.expiry-contract.mixed-change", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Mixed migration evidence distinguishes review date from removal condition." }],
53
+ "baseline": [{ "id": "fixture.compatibility.expiry-contract.baseline", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Complete migration evidence passes with stable baseline subjects." }]
54
+ }
55
+ },
56
+ "provenance": {
57
+ "sourceKind": "archcontext-native",
58
+ "sourceRefs": [
59
+ {
60
+ "sourceId": "archcontext.adr.0010"
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,78 @@
1
+ {
2
+ "schemaVersion": "archcontext.practice/v1",
3
+ "id": "compatibility.single-owner",
4
+ "revision": 1,
5
+ "status": "active",
6
+ "title": "Compatibility paths require one lifecycle owner",
7
+ "summary": "A compatibility path must have one accountable owner, a durable reason, a removal condition, and a bounded review date.",
8
+ "category": "compatibility",
9
+ "tags": ["compatibility", "migration", "lifecycle"],
10
+ "appliesTo": {
11
+ "repositoryKinds": ["application", "service", "library"],
12
+ "languages": [],
13
+ "frameworks": [],
14
+ "pathGlobs": ["**/*"],
15
+ "nodeKinds": ["module", "service", "public-api"],
16
+ "negativePathGlobs": ["test/**", "**/*.fixture.*"]
17
+ },
18
+ "triggers": {
19
+ "candidateTerms": ["compatibility", "legacy", "fallback", "adapter", "v1", "v2"],
20
+ "pressureSignals": ["unjustified-wrapper-adapter", "dual-track-business-concept"],
21
+ "structuralPredicates": ["compatibility-path-added", "parallel-public-api-observed"]
22
+ },
23
+ "evidencePolicy": {
24
+ "minimumStrengthForRecommendation": "heuristic",
25
+ "minimumStrengthForCheckpoint": "observed",
26
+ "minimumStrengthForEnforcement": "observed",
27
+ "requiredKindsForEnforcement": ["diff", "symbol"],
28
+ "maxEnforcementWhenOnlyHeuristic": "advisory"
29
+ },
30
+ "guidance": {
31
+ "questions": ["Who owns the compatibility path through removal?", "What external contract or persisted state requires it?", "What exact condition allows deletion?"],
32
+ "preferred": ["Adapt at one boundary and keep one internal representation.", "Record owner, review date, tests, and removal condition."],
33
+ "avoid": ["Maintaining v1/v2 branches in multiple business layers.", "Permanent fallback code with a generic cleanup note."]
34
+ },
35
+ "checks": [
36
+ {
37
+ "checkId": "compatibility-contract-required",
38
+ "mode": "deterministic",
39
+ "parameters": {
40
+ "requireOwner": true,
41
+ "requireRemovalCondition": true,
42
+ "requireReviewDate": true,
43
+ "requireTests": true
44
+ }
45
+ }
46
+ ],
47
+ "enforcement": {
48
+ "default": "advisory",
49
+ "promotableTo": "complete",
50
+ "repoOptInRequired": true,
51
+ "fixtureGate": {
52
+ "positive": [{ "id": "fixture.compatibility.single-owner.positive", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Missing durable compatibility contract blocks complete enforcement." }],
53
+ "nearNegative": [{ "id": "fixture.compatibility.single-owner.near-negative", "path": "evals/practices/benign-negative.jsonl", "description": "Heuristic legacy wording cannot become a complete violation." }],
54
+ "mixedChange": [{ "id": "fixture.compatibility.single-owner.mixed-change", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Mixed source and test changes keep eligible subjects scoped." }],
55
+ "baseline": [{ "id": "fixture.compatibility.single-owner.baseline", "path": "packages/core/practice-engine/test/practice-engine.test.ts", "description": "Previous checkpoint match keeps historical compatibility paths from appearing new." }]
56
+ }
57
+ },
58
+ "provenance": {
59
+ "sourceKind": "archcontext-native",
60
+ "sourceRefs": [
61
+ {
62
+ "sourceId": "archcontext.adr.0010"
63
+ },
64
+ {
65
+ "sourceId": "madr",
66
+ "sourceRevision": "v4.0.0",
67
+ "licenseSpdx": "MIT OR CC0-1.0"
68
+ }
69
+ ],
70
+ "curator": "archcontext-maintainers",
71
+ "reviewedAt": "2026-06-23"
72
+ },
73
+ "lifecycle": {
74
+ "introducedAt": "2026-06-23",
75
+ "reviewAfter": "2027-06-23",
76
+ "supersedes": []
77
+ }
78
+ }