archctx-contracts 0.6.3 → 0.7.1

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 (38) hide show
  1. package/fixtures/invalid/recommendation-v3-structural-before-evidence.json +59 -0
  2. package/fixtures/valid/archctx-capabilities.json +3 -3
  3. package/fixtures/valid/capability-dependencies.json +35 -0
  4. package/fixtures/valid/docs-anchors.json +105 -0
  5. package/fixtures/valid/flow-selector-check.json +50 -0
  6. package/fixtures/valid/product-version-manifest.json +6 -6
  7. package/fixtures/valid/projection-manifest.json +175 -0
  8. package/fixtures/valid/projection-result.json +5 -5
  9. package/fixtures/valid/recommendation-v3.json +69 -0
  10. package/fixtures/valid/runtime-recommendation-show.json +312 -0
  11. package/fixtures/valid/runtime-refactor-scan.json +543 -0
  12. package/package.json +1 -1
  13. package/schemas/runtime/archctx-capabilities.schema.json +7 -2
  14. package/schemas/runtime/architecture-refresh-signal.schema.json +27 -0
  15. package/schemas/runtime/capability-dependencies.schema.json +116 -0
  16. package/schemas/runtime/changeset.schema.json +42 -16
  17. package/schemas/runtime/docs-anchors.schema.json +143 -0
  18. package/schemas/runtime/flow-selector-check.schema.json +109 -0
  19. package/schemas/runtime/projection-apply-readback.schema.json +351 -10
  20. package/schemas/runtime/projection-apply-recovery.schema.json +24 -3
  21. package/schemas/runtime/projection-manifest.schema.json +491 -0
  22. package/schemas/runtime/projection-request.schema.json +11 -2
  23. package/schemas/runtime/projection-result.schema.json +108 -8
  24. package/schemas/runtime/recommendation-v3.schema.json +1167 -0
  25. package/schemas/runtime/runtime-recommendation-show.schema.json +2463 -0
  26. package/schemas/runtime/runtime-refactor-scan.schema.json +2508 -0
  27. package/schemas/runtime/structural-observation-payload.schema.json +579 -0
  28. package/src/architecture.ts +6 -3
  29. package/src/docs-anchors.ts +126 -0
  30. package/src/index.ts +3 -0
  31. package/src/ledger.ts +26 -10
  32. package/src/ownership-dependencies.ts +129 -0
  33. package/src/product-version.ts +2 -2
  34. package/src/projection-manifest.ts +346 -0
  35. package/src/projection.ts +406 -6
  36. package/src/refactor.ts +305 -1
  37. package/src/schema.ts +20 -4
  38. package/src/validator.ts +87 -15
@@ -0,0 +1,543 @@
1
+ {
2
+ "schemaVersion": "archcontext.runtime-refactor-scan/v1",
3
+ "repository": {
4
+ "repositoryId": "repo.537182127c5f2134",
5
+ "storageRepositoryId": "repo.03ba73c90cbf6a7e"
6
+ },
7
+ "worktree": {
8
+ "workspaceId": "ws.537182127c5f2134",
9
+ "storageWorkspaceId": "ws.537182127c5f2134",
10
+ "branch": "main",
11
+ "headSha": "728b42479d7ab7a2d401ea44af26cdac64912f0f",
12
+ "worktreeDigest": "sha256:96cbb5ccf708d8b7c56c2633e8937311338957998b7154879461706460d4c467"
13
+ },
14
+ "requestId": "refactor_request.d514edefd58b7a9e",
15
+ "request": {
16
+ "schemaVersion": "archcontext.refactor-request/v1",
17
+ "scope": {
18
+ "kind": "repository"
19
+ }
20
+ },
21
+ "trackedFileCount": 9,
22
+ "untrackedExcludedCount": 0,
23
+ "snapshot": {
24
+ "schemaVersion": "archcontext.module-statistics/v1",
25
+ "repository": {
26
+ "repositoryId": "repo.537182127c5f2134",
27
+ "storageRepositoryId": "repo.03ba73c90cbf6a7e"
28
+ },
29
+ "worktree": {
30
+ "workspaceId": "ws.537182127c5f2134",
31
+ "storageWorkspaceId": "ws.537182127c5f2134",
32
+ "branch": "main",
33
+ "headSha": "728b42479d7ab7a2d401ea44af26cdac64912f0f",
34
+ "worktreeDigest": "sha256:96cbb5ccf708d8b7c56c2633e8937311338957998b7154879461706460d4c467"
35
+ },
36
+ "modelDigest": "sha256:54ed020e2f65d0649b215df9251332d5a288746a687d9d7a654b9700dfd995a7",
37
+ "codeFacts": {
38
+ "provider": "codegraph",
39
+ "version": "",
40
+ "binaryDigest": "",
41
+ "indexedWorktreeDigest": null,
42
+ "coverage": "unknown",
43
+ "truncated": true,
44
+ "edgeLimit": 5000,
45
+ "reasonCodes": [
46
+ "caller-coverage-unknown",
47
+ "code-facts-missing",
48
+ "code-facts-truncated",
49
+ "node-footprint-undeclared"
50
+ ]
51
+ },
52
+ "modules": [
53
+ {
54
+ "nodeId": "capability.architecture.context",
55
+ "nodeDigest": "sha256:47f48ff9115682aeb1cce33a01ecac47ef79935a7e9a10a4577d7e7c8582c3f0",
56
+ "parentNodeId": null,
57
+ "footprintDeclared": false,
58
+ "footprint": null,
59
+ "surfaces": {
60
+ "declaredEntrypoints": [],
61
+ "observedEntrypoints": [],
62
+ "lifecycleOwners": [],
63
+ "datastoreSubjects": []
64
+ },
65
+ "dependencyGraph": null,
66
+ "tests": {
67
+ "testFileCount": null,
68
+ "observedTestEdges": null,
69
+ "callerCoverage": null,
70
+ "coverageStatus": "unknown"
71
+ },
72
+ "uncertainty": {
73
+ "unresolvedImports": 0,
74
+ "dynamicInvocation": "unknown",
75
+ "ambiguousOwnership": false
76
+ },
77
+ "moduleDigest": "sha256:7c539afac512c4aed0d7408f4b1945c51ddb79e24a017732c2a2a5cd5f52481e"
78
+ },
79
+ {
80
+ "nodeId": "module.dump",
81
+ "nodeDigest": "sha256:8f77a427f093506f0ff5197dd0129f6888c1653c0ccc65e3981d587e102a882b",
82
+ "parentNodeId": null,
83
+ "footprintDeclared": true,
84
+ "footprint": {
85
+ "fileCount": 1,
86
+ "lineCount": 1,
87
+ "sourceFilesDigest": "sha256:5f2ceccfe01dc55c63a1b0e5bf2ce51676e8f2805499e0c8519d59fdc8e265c4",
88
+ "includePatterns": [
89
+ "src/**"
90
+ ],
91
+ "excludePatterns": []
92
+ },
93
+ "surfaces": {
94
+ "declaredEntrypoints": [],
95
+ "observedEntrypoints": [],
96
+ "lifecycleOwners": [],
97
+ "datastoreSubjects": []
98
+ },
99
+ "dependencyGraph": null,
100
+ "tests": {
101
+ "testFileCount": null,
102
+ "observedTestEdges": null,
103
+ "callerCoverage": null,
104
+ "coverageStatus": "unknown"
105
+ },
106
+ "uncertainty": {
107
+ "unresolvedImports": 0,
108
+ "dynamicInvocation": "unknown",
109
+ "ambiguousOwnership": false
110
+ },
111
+ "moduleDigest": "sha256:32d887790fe89e1415d1cb0e68557509e025b4026184ad8a463f4d886a3de182"
112
+ }
113
+ ],
114
+ "repositorySummary": {
115
+ "moduleCount": 2,
116
+ "undeclaredFootprintNodeCount": 1,
117
+ "ownedFileCount": 1,
118
+ "unownedFileCount": 0,
119
+ "multiplyOwnedFileCount": 0,
120
+ "crossModuleEdgeCount": 0,
121
+ "crossModuleCycleCount": 0,
122
+ "stronglyConnectedComponentCount": 0,
123
+ "unresolvedImportCount": 0,
124
+ "dynamicInvocationRiskCount": 2
125
+ },
126
+ "createdAt": "2026-10-11T04:21:31.000Z",
127
+ "snapshotDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e"
128
+ },
129
+ "assessment": {
130
+ "schemaVersion": "archcontext.refactor-assessment/v1",
131
+ "requestId": "refactor_request.d514edefd58b7a9e",
132
+ "statisticsSnapshotDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e",
133
+ "modelDigest": "sha256:54ed020e2f65d0649b215df9251332d5a288746a687d9d7a654b9700dfd995a7",
134
+ "codeFactsDigest": "sha256:1044803e55c9413cc85b58a5d5ec995b311d1ee50cc476f80b7f7babf3ad4662",
135
+ "requestedScope": {
136
+ "kind": "repository"
137
+ },
138
+ "proposalDigest": null,
139
+ "observations": [
140
+ {
141
+ "kind": "evidence-gap",
142
+ "subjectSelectorId": "repository:repo.537182127c5f2134",
143
+ "metrics": {
144
+ "unresolvedImportCount": 0,
145
+ "edgeLimit": 5000
146
+ },
147
+ "evidence": {
148
+ "kind": "evidence-gap",
149
+ "coverage": "unknown",
150
+ "reasonCodes": [
151
+ "caller-coverage-unknown",
152
+ "code-facts-missing",
153
+ "code-facts-truncated",
154
+ "node-footprint-undeclared"
155
+ ],
156
+ "unresolvedImports": [],
157
+ "totalCount": 0,
158
+ "truncated": false
159
+ },
160
+ "signalIds": [
161
+ "signal.evidence-gap.262e0ca20828366e"
162
+ ]
163
+ },
164
+ {
165
+ "kind": "undeclared-footprint",
166
+ "subjectSelectorId": "capability.architecture.context",
167
+ "metrics": {},
168
+ "evidence": {
169
+ "kind": "undeclared-footprint",
170
+ "paths": [],
171
+ "totalCount": 0,
172
+ "truncated": false
173
+ },
174
+ "signalIds": [
175
+ "signal.undeclared-footprint.bc66b760c4329111"
176
+ ]
177
+ }
178
+ ],
179
+ "scale": null,
180
+ "scaleReasonCodes": [],
181
+ "affectedNodeIds": [],
182
+ "majorChangeReasons": [],
183
+ "pressure": {
184
+ "level": "low",
185
+ "score": 10,
186
+ "signalIds": [
187
+ "signal.evidence-gap.262e0ca20828366e",
188
+ "signal.undeclared-footprint.bc66b760c4329111"
189
+ ]
190
+ },
191
+ "confidence": {
192
+ "level": "low",
193
+ "callerCoverage": null,
194
+ "testsObserved": null,
195
+ "rollbackObserved": null,
196
+ "unresolvedEvidence": [
197
+ "coverage:unknown"
198
+ ]
199
+ },
200
+ "createdAt": "2026-10-11T04:21:31.000Z",
201
+ "assessmentDigest": "sha256:308510d9a08558453b9644d33fe24a73f4579832c448602b24c5053bdc4aa5ca"
202
+ },
203
+ "proposedRecommendations": [
204
+ {
205
+ "schemaVersion": "archcontext.recommendation/v3",
206
+ "recommendationId": "recommendation.c8c842b3d8529388",
207
+ "runId": "recommendation_run.9d3423295f1a45e6",
208
+ "fingerprint": "sha256:27b2fed8524041b6003797081dbf77355d7fccfa54327becf00ecaef0728db2a",
209
+ "subject": "capability.architecture.context",
210
+ "status": "open",
211
+ "confidence": "low",
212
+ "enforcement": "advisory",
213
+ "risk": "medium",
214
+ "uncertainty": "high",
215
+ "evidenceBindingIds": [
216
+ "binding.7577455e29083b0b"
217
+ ],
218
+ "explanation": [
219
+ "capability.architecture.context declares no source.include footprint, so none of its files or imports are measured.",
220
+ "It declares no entrypoint paths either."
221
+ ],
222
+ "authoredBy": {
223
+ "kind": "daemon",
224
+ "id": "archctxd",
225
+ "source": "daemon"
226
+ },
227
+ "subjectSelectorId": "subject.node.d4eae75fb5b5121f",
228
+ "relations": {},
229
+ "createdAt": "2026-10-11T04:21:31.000Z",
230
+ "updatedAt": "2026-10-11T04:21:31.000Z",
231
+ "category": "structural_observation",
232
+ "payload": {
233
+ "assessmentDigest": "sha256:308510d9a08558453b9644d33fe24a73f4579832c448602b24c5053bdc4aa5ca",
234
+ "kind": "undeclared-footprint",
235
+ "affectedNodeIds": [
236
+ "capability.architecture.context"
237
+ ],
238
+ "baselineSnapshotDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e",
239
+ "derivedOutcomes": [
240
+ {
241
+ "metric": "module.footprintDeclared",
242
+ "subjectSelectorId": "subject.node.d4eae75fb5b5121f",
243
+ "nodeId": "capability.architecture.context",
244
+ "operator": "present",
245
+ "value": null,
246
+ "required": true,
247
+ "outcomeId": "outcome.58946c9d4f0f41c1"
248
+ }
249
+ ],
250
+ "metrics": {},
251
+ "signalIds": [
252
+ "signal.undeclared-footprint.bc66b760c4329111"
253
+ ],
254
+ "evidence": {
255
+ "kind": "undeclared-footprint",
256
+ "paths": [],
257
+ "totalCount": 0,
258
+ "truncated": false
259
+ }
260
+ },
261
+ "extensions": {
262
+ "assessmentDigest": "sha256:308510d9a08558453b9644d33fe24a73f4579832c448602b24c5053bdc4aa5ca",
263
+ "baselineSnapshotDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e",
264
+ "riskSignals": [
265
+ "ownership-change"
266
+ ],
267
+ "uncertaintySignals": [
268
+ "low-coverage"
269
+ ],
270
+ "score": 23
271
+ }
272
+ },
273
+ {
274
+ "schemaVersion": "archcontext.recommendation/v3",
275
+ "recommendationId": "recommendation.22feb92677c752aa",
276
+ "runId": "recommendation_run.9d3423295f1a45e6",
277
+ "fingerprint": "sha256:d84b7558a783350a40ee16260cce07b4caed1270b8984f774329fa980f91b0a9",
278
+ "subject": "repository:repo.537182127c5f2134",
279
+ "status": "open",
280
+ "confidence": "low",
281
+ "enforcement": "advisory",
282
+ "risk": "low",
283
+ "uncertainty": "high",
284
+ "evidenceBindingIds": [
285
+ "binding.3bc9dc35b8c72768"
286
+ ],
287
+ "explanation": [
288
+ "Code facts coverage is unknown (caller-coverage-unknown, code-facts-missing, code-facts-truncated, node-footprint-undeclared), so structural metrics are incomplete."
289
+ ],
290
+ "authoredBy": {
291
+ "kind": "daemon",
292
+ "id": "archctxd",
293
+ "source": "daemon"
294
+ },
295
+ "subjectSelectorId": "subject.repository.525bab1b3e65c960",
296
+ "relations": {},
297
+ "createdAt": "2026-10-11T04:21:31.000Z",
298
+ "updatedAt": "2026-10-11T04:21:31.000Z",
299
+ "category": "structural_observation",
300
+ "payload": {
301
+ "assessmentDigest": "sha256:308510d9a08558453b9644d33fe24a73f4579832c448602b24c5053bdc4aa5ca",
302
+ "kind": "evidence-gap",
303
+ "affectedNodeIds": [],
304
+ "baselineSnapshotDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e",
305
+ "derivedOutcomes": [
306
+ {
307
+ "metric": "repositorySummary.unresolvedImportCount",
308
+ "subjectSelectorId": "subject.repository.525bab1b3e65c960",
309
+ "nodeId": null,
310
+ "operator": "absent",
311
+ "value": null,
312
+ "required": true,
313
+ "outcomeId": "outcome.8ad0edda6755e289"
314
+ }
315
+ ],
316
+ "metrics": {
317
+ "unresolvedImportCount": 0,
318
+ "edgeLimit": 5000
319
+ },
320
+ "signalIds": [
321
+ "signal.evidence-gap.262e0ca20828366e"
322
+ ],
323
+ "evidence": {
324
+ "kind": "evidence-gap",
325
+ "coverage": "unknown",
326
+ "reasonCodes": [
327
+ "caller-coverage-unknown",
328
+ "code-facts-missing",
329
+ "code-facts-truncated",
330
+ "node-footprint-undeclared"
331
+ ],
332
+ "unresolvedImports": [],
333
+ "totalCount": 0,
334
+ "truncated": false
335
+ }
336
+ },
337
+ "extensions": {
338
+ "assessmentDigest": "sha256:308510d9a08558453b9644d33fe24a73f4579832c448602b24c5053bdc4aa5ca",
339
+ "baselineSnapshotDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e",
340
+ "riskSignals": [],
341
+ "uncertaintySignals": [
342
+ "low-coverage"
343
+ ],
344
+ "score": 13
345
+ }
346
+ }
347
+ ],
348
+ "evidenceItems": [
349
+ {
350
+ "schemaVersion": "archcontext.evidence-item/v2",
351
+ "evidenceId": "evidence.module_statistics_snapshot.35796bb112cab526",
352
+ "kind": "module-statistics-snapshot",
353
+ "strength": "observed",
354
+ "polarity": "positive",
355
+ "origin": "runtime-daemon",
356
+ "subject": "repository:repo.537182127c5f2134",
357
+ "selector": {
358
+ "kind": "snapshot",
359
+ "id": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e"
360
+ },
361
+ "summary": "Module statistics baseline for 2 declared module(s).",
362
+ "coverage": {
363
+ "level": "unknown",
364
+ "scope": "module-statistics-snapshot"
365
+ },
366
+ "supports": [
367
+ "recommendation"
368
+ ],
369
+ "provenance": {
370
+ "producer": "recommendation-engine",
371
+ "command": "archctx refactor record",
372
+ "inputDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e"
373
+ },
374
+ "createdAt": "2026-10-11T04:21:31.000Z",
375
+ "digest": "sha256:5ee758961ef4ea532ef72359f46e2d06fa528d70bab6bd19cd59dbfca8acd3fc",
376
+ "extensions": {
377
+ "moduleStatisticsSnapshot": {
378
+ "schemaVersion": "archcontext.module-statistics/v1",
379
+ "repository": {
380
+ "repositoryId": "repo.537182127c5f2134",
381
+ "storageRepositoryId": "repo.03ba73c90cbf6a7e"
382
+ },
383
+ "worktree": {
384
+ "workspaceId": "ws.537182127c5f2134",
385
+ "storageWorkspaceId": "ws.537182127c5f2134",
386
+ "branch": "main",
387
+ "headSha": "728b42479d7ab7a2d401ea44af26cdac64912f0f",
388
+ "worktreeDigest": "sha256:96cbb5ccf708d8b7c56c2633e8937311338957998b7154879461706460d4c467"
389
+ },
390
+ "modelDigest": "sha256:54ed020e2f65d0649b215df9251332d5a288746a687d9d7a654b9700dfd995a7",
391
+ "codeFacts": {
392
+ "provider": "codegraph",
393
+ "version": "",
394
+ "binaryDigest": "",
395
+ "indexedWorktreeDigest": null,
396
+ "coverage": "unknown",
397
+ "truncated": true,
398
+ "edgeLimit": 5000,
399
+ "reasonCodes": [
400
+ "caller-coverage-unknown",
401
+ "code-facts-missing",
402
+ "code-facts-truncated",
403
+ "node-footprint-undeclared"
404
+ ]
405
+ },
406
+ "modules": [
407
+ {
408
+ "nodeId": "capability.architecture.context",
409
+ "nodeDigest": "sha256:47f48ff9115682aeb1cce33a01ecac47ef79935a7e9a10a4577d7e7c8582c3f0",
410
+ "parentNodeId": null,
411
+ "footprintDeclared": false,
412
+ "footprint": null,
413
+ "surfaces": {
414
+ "declaredEntrypoints": [],
415
+ "observedEntrypoints": [],
416
+ "lifecycleOwners": [],
417
+ "datastoreSubjects": []
418
+ },
419
+ "dependencyGraph": null,
420
+ "tests": {
421
+ "testFileCount": null,
422
+ "observedTestEdges": null,
423
+ "callerCoverage": null,
424
+ "coverageStatus": "unknown"
425
+ },
426
+ "uncertainty": {
427
+ "unresolvedImports": 0,
428
+ "dynamicInvocation": "unknown",
429
+ "ambiguousOwnership": false
430
+ },
431
+ "moduleDigest": "sha256:7c539afac512c4aed0d7408f4b1945c51ddb79e24a017732c2a2a5cd5f52481e"
432
+ },
433
+ {
434
+ "nodeId": "module.dump",
435
+ "nodeDigest": "sha256:8f77a427f093506f0ff5197dd0129f6888c1653c0ccc65e3981d587e102a882b",
436
+ "parentNodeId": null,
437
+ "footprintDeclared": true,
438
+ "footprint": {
439
+ "fileCount": 1,
440
+ "lineCount": 1,
441
+ "sourceFilesDigest": "sha256:5f2ceccfe01dc55c63a1b0e5bf2ce51676e8f2805499e0c8519d59fdc8e265c4",
442
+ "includePatterns": [
443
+ "src/**"
444
+ ],
445
+ "excludePatterns": []
446
+ },
447
+ "surfaces": {
448
+ "declaredEntrypoints": [],
449
+ "observedEntrypoints": [],
450
+ "lifecycleOwners": [],
451
+ "datastoreSubjects": []
452
+ },
453
+ "dependencyGraph": null,
454
+ "tests": {
455
+ "testFileCount": null,
456
+ "observedTestEdges": null,
457
+ "callerCoverage": null,
458
+ "coverageStatus": "unknown"
459
+ },
460
+ "uncertainty": {
461
+ "unresolvedImports": 0,
462
+ "dynamicInvocation": "unknown",
463
+ "ambiguousOwnership": false
464
+ },
465
+ "moduleDigest": "sha256:32d887790fe89e1415d1cb0e68557509e025b4026184ad8a463f4d886a3de182"
466
+ }
467
+ ],
468
+ "repositorySummary": {
469
+ "moduleCount": 2,
470
+ "undeclaredFootprintNodeCount": 1,
471
+ "ownedFileCount": 1,
472
+ "unownedFileCount": 0,
473
+ "multiplyOwnedFileCount": 0,
474
+ "crossModuleEdgeCount": 0,
475
+ "crossModuleCycleCount": 0,
476
+ "stronglyConnectedComponentCount": 0,
477
+ "unresolvedImportCount": 0,
478
+ "dynamicInvocationRiskCount": 2
479
+ },
480
+ "createdAt": "2026-10-11T04:21:31.000Z",
481
+ "snapshotDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e"
482
+ }
483
+ }
484
+ }
485
+ ],
486
+ "evidenceBindings": [
487
+ {
488
+ "schemaVersion": "archcontext.evidence-binding/v1",
489
+ "bindingId": "binding.7577455e29083b0b",
490
+ "evidenceId": "evidence.module_statistics_snapshot.35796bb112cab526",
491
+ "target": {
492
+ "kind": "recommendation",
493
+ "id": "recommendation.c8c842b3d8529388"
494
+ },
495
+ "bindingReason": "deterministic-check",
496
+ "authorityEffect": "context-only",
497
+ "createdAt": "2026-10-11T04:21:31.000Z",
498
+ "provenance": {
499
+ "producer": "recommendation-engine",
500
+ "command": "archctx refactor record",
501
+ "inputDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e"
502
+ }
503
+ },
504
+ {
505
+ "schemaVersion": "archcontext.evidence-binding/v1",
506
+ "bindingId": "binding.3bc9dc35b8c72768",
507
+ "evidenceId": "evidence.module_statistics_snapshot.35796bb112cab526",
508
+ "target": {
509
+ "kind": "recommendation",
510
+ "id": "recommendation.22feb92677c752aa"
511
+ },
512
+ "bindingReason": "deterministic-check",
513
+ "authorityEffect": "context-only",
514
+ "createdAt": "2026-10-11T04:21:31.000Z",
515
+ "provenance": {
516
+ "producer": "recommendation-engine",
517
+ "command": "archctx refactor record",
518
+ "inputDigest": "sha256:35796bb112cab526dfe31a9ad84bc9df5d28b6a9ef4154d7d3c2d7d3a7753f7e"
519
+ }
520
+ }
521
+ ],
522
+ "suppressed": [],
523
+ "recording": {
524
+ "recordable": true,
525
+ "reasonCode": null,
526
+ "measuredBytes": 11039,
527
+ "limitBytes": 262144
528
+ },
529
+ "limits": {
530
+ "evidenceSampleLimit": 20,
531
+ "maxEvidenceSampleLimit": 20,
532
+ "maxRecommendationsPerRun": 25,
533
+ "candidateCount": 2,
534
+ "omittedCandidateCount": 0
535
+ },
536
+ "recordCommand": "archctx refactor record --assessment-digest sha256:308510d9a08558453b9644d33fe24a73f4579832c448602b24c5053bdc4aa5ca --expected-worktree-digest sha256:96cbb5ccf708d8b7c56c2633e8937311338957998b7154879461706460d4c467",
537
+ "privacy": {
538
+ "writes": "none",
539
+ "rawSourcePersisted": false,
540
+ "rawDiffPersisted": false,
541
+ "promptPersisted": false
542
+ }
543
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "archctx-contracts",
3
- "version": "0.6.3",
3
+ "version": "0.7.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -31,7 +31,7 @@
31
31
  "additionalProperties": false,
32
32
  "required": ["architectureDocs", "agentContext"],
33
33
  "properties": {
34
- "architectureDocs": { "const": "archcontext.docs-renderer/v4" },
34
+ "architectureDocs": { "const": "archcontext.docs-renderer/v5" },
35
35
  "agentContext": { "const": "archcontext.agent-context-renderer/v1" }
36
36
  }
37
37
  },
@@ -39,7 +39,12 @@
39
39
  "type": "array",
40
40
  "minItems": 3,
41
41
  "uniqueItems": true,
42
- "items": { "enum": ["architecture-docs-renderer-v2", "architecture-refresh-signal-v1", "module-statistics-v1", "projection-apply-readback-v1", "projection-apply-receipt-v1", "projection-apply-recovery-v1", "projection-prior-committed-applies-v1", "projection-protocol-v2", "recommendation-v3", "refactor-assessment-v1", "refactor-resolution-v1"] }
42
+ "items": {
43
+ "type": "string",
44
+ "pattern": "^[a-z0-9]+(-[a-z0-9]+)*-v[0-9]+$",
45
+ "description": "One feature flag: a lowercase kebab-case name that ends in a version suffix (-v1, -v2, ...). The pattern is open, so a validator built from this schema accepts flags that a later archctx adds. A consumer must ignore a flag it does not know. examples lists the flags this schema version knows.",
46
+ "examples": ["architecture-change-capabilities-v1", "architecture-docs-renderer-v2", "architecture-refresh-signal-v1", "capability-dependencies-v1", "changeset-entity-operations-v1", "changeset-ownership-delta-v1", "code-facts-unavailable-error-v1", "docs-anchors-v1", "flow-selector-check-v1", "module-statistics-v1", "projection-apply-readback-v1", "projection-apply-receipt-v1", "projection-apply-recovery-v1", "projection-apply-replay-v1", "projection-check-freshness-v1", "projection-manifest-contract-v2", "projection-observed-major-change-acceptance-v1", "projection-orphan-review-v1", "projection-preview-v1", "projection-prior-committed-applies-v1", "projection-protocol-v2", "recommendation-scan-decision-v1", "recommendation-v3", "refactor-assessment-v1", "refactor-observation-evidence-v1", "refactor-resolution-v1", "refactor-scan-limits-v1", "refactor-scan-untracked-count-v1"]
47
+ }
43
48
  }
44
49
  }
45
50
  }
@@ -40,6 +40,12 @@
40
40
  "uniqueItems": true,
41
41
  "items": { "type": "string", "minLength": 1 }
42
42
  },
43
+ "capabilities": {
44
+ "type": "array",
45
+ "minItems": 1,
46
+ "description": "The observed per-capability breakdown of this signal, sorted by capabilityId (enforced by architectureRefreshSignalInvariantIssues). Part of the signal identity; signals committed before it existed lack it.",
47
+ "items": { "$ref": "#/$defs/capabilityChange" }
48
+ },
43
49
  "refreshTargets": {
44
50
  "type": "array",
45
51
  "minItems": 1,
@@ -59,6 +65,27 @@
59
65
  ],
60
66
  "$defs": {
61
67
  "digest": { "type": "string", "pattern": "^sha256:[a-f0-9]{64}$" },
68
+ "capabilityChange": {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "required": ["capabilityId", "reasonCodes", "changedFacets", "proofStatusBefore", "proofStatusAfter"],
72
+ "properties": {
73
+ "capabilityId": { "type": "string", "minLength": 1 },
74
+ "reasonCodes": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/reasonCode" } },
75
+ "changedFacets": { "type": "array", "uniqueItems": true, "items": { "enum": ["constraints", "entrypoints", "interfaces", "lifecycle", "names", "ownership", "placement", "relations", "responsibilities", "riskBoundaries"] } },
76
+ "proofStatusBefore": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/proofStatus" }] },
77
+ "proofStatusAfter": { "anyOf": [{ "type": "null" }, { "$ref": "#/$defs/proofStatus" }] }
78
+ }
79
+ },
80
+ "proofStatus": {
81
+ "type": "object",
82
+ "additionalProperties": false,
83
+ "required": ["p1", "p2"],
84
+ "properties": {
85
+ "p1": { "enum": ["proven", "unprovable"] },
86
+ "p2": { "enum": ["not-applicable", "proven", "unprovable"] }
87
+ }
88
+ },
62
89
  "reasonCode": {
63
90
  "enum": ["constraint-changed", "entrypoint-changed", "interface-changed", "lifecycle-changed", "node-added", "node-moved", "node-removed", "node-renamed", "ownership-changed", "relation-changed", "responsibility-changed", "risk-boundary-changed", "verified-flow-proof-changed"]
64
91
  },