@ecoma-io/archkeep 0.25.0 → 0.26.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 (120) hide show
  1. package/cli.mjs +166 -506
  2. package/commands.mjs +7 -1
  3. package/package.json +1 -1
  4. package/src/architecture-intent/judge.mjs +1 -1
  5. package/src/architecture-intent/model.mjs +34 -0
  6. package/src/canonical.mjs +2 -1
  7. package/src/commands/adr-for-workspace.mjs +63 -0
  8. package/src/commands/analyze-capability.mjs +13 -0
  9. package/src/commands/change-intent.mjs +11 -0
  10. package/src/commands/change.mjs +247 -34
  11. package/src/commands/check-capability.mjs +13 -0
  12. package/src/commands/check.mjs +13 -3
  13. package/src/commands/compare-capability.mjs +20 -0
  14. package/src/commands/completeness.mjs +12 -0
  15. package/src/commands/context-command.mjs +31 -0
  16. package/src/commands/coverage-verdict.mjs +15 -2
  17. package/src/commands/debt.mjs +30 -0
  18. package/src/commands/decisions.mjs +59 -10
  19. package/src/commands/delta.mjs +263 -49
  20. package/src/commands/diff.mjs +45 -0
  21. package/src/commands/discover.mjs +37 -0
  22. package/src/commands/drift.mjs +45 -0
  23. package/src/commands/evolution.mjs +22 -2
  24. package/src/commands/explain-capability.mjs +11 -0
  25. package/src/commands/explain.mjs +24 -0
  26. package/src/commands/fitness.mjs +119 -10
  27. package/src/commands/govern-capability.mjs +16 -0
  28. package/src/commands/graph.mjs +39 -0
  29. package/src/commands/health.mjs +34 -0
  30. package/src/commands/history.mjs +85 -2
  31. package/src/commands/impact.mjs +23 -0
  32. package/src/commands/inspect-capability.mjs +16 -0
  33. package/src/commands/plan-context-command.mjs +35 -0
  34. package/src/commands/policy.mjs +42 -4
  35. package/src/commands/provenance-command.mjs +15 -24
  36. package/src/commands/report.mjs +38 -0
  37. package/src/commands/rules-capability.mjs +16 -0
  38. package/src/commands/rules.mjs +3 -1
  39. package/src/commands/scenario.mjs +23 -0
  40. package/src/commands/trajectory.mjs +35 -0
  41. package/src/commands/waivers.mjs +30 -0
  42. package/src/corpus/goldens/.gitkeep +0 -0
  43. package/src/corpus/goldens/adr.json +62 -0
  44. package/src/corpus/goldens/adr.text +6 -0
  45. package/src/corpus/goldens/change.json +98 -0
  46. package/src/corpus/goldens/change.text +6 -0
  47. package/src/corpus/goldens/check.json +90 -0
  48. package/src/corpus/goldens/check.sarif +479 -0
  49. package/src/corpus/goldens/check.text +9 -0
  50. package/src/corpus/goldens/context.json +47 -0
  51. package/src/corpus/goldens/context.text +6 -0
  52. package/src/corpus/goldens/debt.json +59 -0
  53. package/src/corpus/goldens/debt.text +7 -0
  54. package/src/corpus/goldens/decisions.json +74 -0
  55. package/src/corpus/goldens/decisions.text +7 -0
  56. package/src/corpus/goldens/delta.json +94 -0
  57. package/src/corpus/goldens/delta.sarif +472 -0
  58. package/src/corpus/goldens/delta.text +5 -0
  59. package/src/corpus/goldens/diff.json +58 -0
  60. package/src/corpus/goldens/diff.text +4 -0
  61. package/src/corpus/goldens/discover.json +77 -0
  62. package/src/corpus/goldens/discover.text +10 -0
  63. package/src/corpus/goldens/drift.json +43 -0
  64. package/src/corpus/goldens/drift.text +3 -0
  65. package/src/corpus/goldens/evolution.json +328 -0
  66. package/src/corpus/goldens/evolution.text +32 -0
  67. package/src/corpus/goldens/explain.json +60 -0
  68. package/src/corpus/goldens/explain.text +7 -0
  69. package/src/corpus/goldens/fitness.json +45 -0
  70. package/src/corpus/goldens/fitness.text +3 -0
  71. package/src/corpus/goldens/graph.json +78 -0
  72. package/src/corpus/goldens/graph.text +10 -0
  73. package/src/corpus/goldens/health.json +72 -0
  74. package/src/corpus/goldens/health.text +10 -0
  75. package/src/corpus/goldens/help.text +104 -0
  76. package/src/corpus/goldens/history.json +43 -0
  77. package/src/corpus/goldens/history.text +4 -0
  78. package/src/corpus/goldens/impact.json +327 -0
  79. package/src/corpus/goldens/impact.text +10 -0
  80. package/src/corpus/goldens/provenance.json +453 -0
  81. package/src/corpus/goldens/provenance.text +14 -0
  82. package/src/corpus/goldens/reconcile.json +168 -0
  83. package/src/corpus/goldens/reconcile.text +3 -0
  84. package/src/corpus/goldens/report.json +168 -0
  85. package/src/corpus/goldens/report.text +42 -0
  86. package/src/corpus/goldens/rules verify.json +0 -0
  87. package/src/corpus/goldens/rules verify.text +0 -0
  88. package/src/corpus/goldens/scenario.json +441 -0
  89. package/src/corpus/goldens/scenario.text +28 -0
  90. package/src/corpus/goldens/trajectory.json +83 -0
  91. package/src/corpus/goldens/trajectory.text +10 -0
  92. package/src/corpus/goldens/usage-error.text +105 -0
  93. package/src/corpus/goldens/waivers.json +40 -0
  94. package/src/corpus/goldens/waivers.text +1 -0
  95. package/src/corpus/goldens-lsp/initialize.result.json +15 -0
  96. package/src/corpus/goldens-lsp/publish-cleared-empty.json +4 -0
  97. package/src/corpus/goldens-lsp/publish-fixed-empty.json +5 -0
  98. package/src/corpus/goldens-lsp/publish-unparseable.json +54 -0
  99. package/src/corpus/goldens-lsp/publish-violation.json +22 -0
  100. package/src/corpus/goldens-lsp/register-watched-files.json +72 -0
  101. package/src/go-work.mjs +8 -23
  102. package/src/governance/evolution-event.mjs +15 -0
  103. package/src/governance/evolution-store.mjs +59 -31
  104. package/src/governance/provenance-record.mjs +0 -152
  105. package/src/governance/verdict.mjs +26 -3
  106. package/src/intent/intent-manifest.json +14 -14
  107. package/src/lsp/server.mjs +5 -8
  108. package/src/lsp/workspace-index.mjs +55 -220
  109. package/src/options.mjs +10 -0
  110. package/src/providers/native/discover.mjs +13 -12
  111. package/src/providers/native/model.mjs +8 -3
  112. package/src/providers/nx-static.mjs +231 -0
  113. package/src/report/json.mjs +3 -2
  114. package/src/report/sarif.mjs +8 -3
  115. package/src/rules/edge-constraints.mjs +9 -0
  116. package/src/rules/index.mjs +26 -10
  117. package/src/rules/messages.mjs +64 -14
  118. package/src/rules/specifiers.mjs +21 -20
  119. package/src/tsconfig-paths.mjs +8 -14
  120. package/src/verdict.mjs +127 -16
@@ -0,0 +1,453 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "tool": {
4
+ "name": "@ecoma-io/archkeep",
5
+ "version": "0.26.0"
6
+ },
7
+ "command": "provenance",
8
+ "workspace": {
9
+ "root": "/tmp/archkeep-golden-fixture",
10
+ "provider": "native",
11
+ "marker": "archkeep.json",
12
+ "provenance": {
13
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
14
+ "remote": null,
15
+ "dirty": false
16
+ }
17
+ },
18
+ "status": "ok",
19
+ "exitCode": 0,
20
+ "coverage": {
21
+ "complete": true,
22
+ "projects": 0,
23
+ "analyzedFiles": 0,
24
+ "imports": 0,
25
+ "notAnalyzed": [],
26
+ "blindSpots": [],
27
+ "notes": []
28
+ },
29
+ "result": {
30
+ "repo": {
31
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
32
+ "remote": null,
33
+ "dirty": false
34
+ },
35
+ "established": true,
36
+ "rows": [
37
+ {
38
+ "kind": "allowed[0]",
39
+ "attested": false,
40
+ "origin": null
41
+ },
42
+ {
43
+ "kind": "allowed[1]",
44
+ "attested": false,
45
+ "origin": null
46
+ },
47
+ {
48
+ "kind": "forbidden[0]",
49
+ "attested": false,
50
+ "origin": null
51
+ },
52
+ {
53
+ "kind": "depConstraints[0]",
54
+ "attested": false,
55
+ "origin": null
56
+ },
57
+ {
58
+ "kind": "depConstraints[1]",
59
+ "attested": false,
60
+ "origin": null
61
+ },
62
+ {
63
+ "kind": "depConstraints[2]",
64
+ "attested": false,
65
+ "origin": null
66
+ }
67
+ ],
68
+ "unattested": [
69
+ {
70
+ "kind": "allowed[0]",
71
+ "label": "allowed[0] app→api",
72
+ "note": "no origin recorded — cannot attest"
73
+ },
74
+ {
75
+ "kind": "allowed[1]",
76
+ "label": "allowed[1] api→core",
77
+ "note": "no origin recorded — cannot attest"
78
+ },
79
+ {
80
+ "kind": "forbidden[0]",
81
+ "label": "forbidden[0] core→app",
82
+ "note": "no origin recorded — cannot attest"
83
+ },
84
+ {
85
+ "kind": "depConstraints[0]",
86
+ "label": "depConstraints[0] layer:core",
87
+ "note": "no origin recorded — cannot attest"
88
+ },
89
+ {
90
+ "kind": "depConstraints[1]",
91
+ "label": "depConstraints[1] layer:api",
92
+ "note": "no origin recorded — cannot attest"
93
+ },
94
+ {
95
+ "kind": "depConstraints[2]",
96
+ "label": "depConstraints[2] layer:app",
97
+ "note": "no origin recorded — cannot attest"
98
+ }
99
+ ],
100
+ "unresolvedDecisionRefs": [],
101
+ "decisionLifecycle": [
102
+ {
103
+ "id": "0001-layers",
104
+ "status": "accepted",
105
+ "authority": true,
106
+ "created": null,
107
+ "updated": null,
108
+ "supersedes": [],
109
+ "supersededBy": [],
110
+ "bindings": [
111
+ "intentForbiddenEdge"
112
+ ],
113
+ "attribution": {
114
+ "createdBy": {
115
+ "by": "t <t@t>",
116
+ "tool": "git",
117
+ "on": "2026-01-01T00:00:00Z"
118
+ },
119
+ "lastChangedBy": {
120
+ "by": "t <t@t>",
121
+ "tool": "git",
122
+ "on": "2026-01-01T00:00:00Z"
123
+ }
124
+ },
125
+ "attested": true,
126
+ "note": null
127
+ }
128
+ ],
129
+ "provenanceGraph": {
130
+ "nodes": [
131
+ {
132
+ "id": "decision:0001-layers",
133
+ "kind": "decision",
134
+ "label": "0001-layers",
135
+ "data": {
136
+ "attribution": {
137
+ "createdBy": {
138
+ "by": "t <t@t>",
139
+ "tool": "git",
140
+ "on": "2026-01-01T00:00:00Z"
141
+ },
142
+ "lastChangedBy": {
143
+ "by": "t <t@t>",
144
+ "tool": "git",
145
+ "on": "2026-01-01T00:00:00Z"
146
+ }
147
+ },
148
+ "evidence": {
149
+ "kind": "adr-record",
150
+ "file": "docs/adr/0001-layers.md",
151
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9"
152
+ }
153
+ }
154
+ },
155
+ {
156
+ "id": "repo:1fd51709c377d99a6139891e1200291cf08aede9",
157
+ "kind": "repo",
158
+ "label": "1fd51709c377d99a6139891e1200291cf08aede9",
159
+ "data": {
160
+ "origin": {
161
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
162
+ "remote": null,
163
+ "dirty": false
164
+ },
165
+ "evidence": {
166
+ "kind": "git",
167
+ "file": null,
168
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9"
169
+ }
170
+ }
171
+ },
172
+ {
173
+ "id": "row:allowed[0]:0",
174
+ "kind": "row",
175
+ "label": "allowed[0] app→api",
176
+ "data": {
177
+ "origin": null,
178
+ "evidence": {
179
+ "kind": "governance-row",
180
+ "file": null,
181
+ "commit": null
182
+ }
183
+ }
184
+ },
185
+ {
186
+ "id": "row:allowed[1]:1",
187
+ "kind": "row",
188
+ "label": "allowed[1] api→core",
189
+ "data": {
190
+ "origin": null,
191
+ "evidence": {
192
+ "kind": "governance-row",
193
+ "file": null,
194
+ "commit": null
195
+ }
196
+ }
197
+ },
198
+ {
199
+ "id": "row:depConstraints[0]:3",
200
+ "kind": "row",
201
+ "label": "depConstraints[0] layer:core",
202
+ "data": {
203
+ "origin": null,
204
+ "evidence": {
205
+ "kind": "governance-row",
206
+ "file": null,
207
+ "commit": null
208
+ }
209
+ }
210
+ },
211
+ {
212
+ "id": "row:depConstraints[1]:4",
213
+ "kind": "row",
214
+ "label": "depConstraints[1] layer:api",
215
+ "data": {
216
+ "origin": null,
217
+ "evidence": {
218
+ "kind": "governance-row",
219
+ "file": null,
220
+ "commit": null
221
+ }
222
+ }
223
+ },
224
+ {
225
+ "id": "row:depConstraints[2]:5",
226
+ "kind": "row",
227
+ "label": "depConstraints[2] layer:app",
228
+ "data": {
229
+ "origin": null,
230
+ "evidence": {
231
+ "kind": "governance-row",
232
+ "file": null,
233
+ "commit": null
234
+ }
235
+ }
236
+ },
237
+ {
238
+ "id": "row:forbidden[0]:2",
239
+ "kind": "row",
240
+ "label": "forbidden[0] core→app",
241
+ "data": {
242
+ "origin": null,
243
+ "evidence": {
244
+ "kind": "governance-row",
245
+ "file": null,
246
+ "commit": null
247
+ }
248
+ }
249
+ }
250
+ ],
251
+ "edges": [
252
+ {
253
+ "from": "repo:1fd51709c377d99a6139891e1200291cf08aede9",
254
+ "to": "row:allowed[0]:0",
255
+ "kind": "provenance"
256
+ },
257
+ {
258
+ "from": "repo:1fd51709c377d99a6139891e1200291cf08aede9",
259
+ "to": "row:allowed[1]:1",
260
+ "kind": "provenance"
261
+ },
262
+ {
263
+ "from": "repo:1fd51709c377d99a6139891e1200291cf08aede9",
264
+ "to": "row:depConstraints[0]:3",
265
+ "kind": "provenance"
266
+ },
267
+ {
268
+ "from": "repo:1fd51709c377d99a6139891e1200291cf08aede9",
269
+ "to": "row:depConstraints[1]:4",
270
+ "kind": "provenance"
271
+ },
272
+ {
273
+ "from": "repo:1fd51709c377d99a6139891e1200291cf08aede9",
274
+ "to": "row:depConstraints[2]:5",
275
+ "kind": "provenance"
276
+ },
277
+ {
278
+ "from": "repo:1fd51709c377d99a6139891e1200291cf08aede9",
279
+ "to": "row:forbidden[0]:2",
280
+ "kind": "provenance"
281
+ }
282
+ ],
283
+ "claims": [
284
+ {
285
+ "id": "decision:0001-layers",
286
+ "kind": "lifecycle",
287
+ "verdict": "attested",
288
+ "evidence": [
289
+ {
290
+ "kind": "file-attribution",
291
+ "detail": "created by t <t@t>"
292
+ },
293
+ {
294
+ "kind": "file-attribution",
295
+ "detail": "last changed by t <t@t>"
296
+ }
297
+ ]
298
+ },
299
+ {
300
+ "id": "row:allowed[0]:0",
301
+ "kind": "attestation",
302
+ "verdict": "unattested",
303
+ "evidence": [
304
+ {
305
+ "kind": "origin",
306
+ "detail": "no origin recorded"
307
+ }
308
+ ]
309
+ },
310
+ {
311
+ "id": "row:allowed[1]:1",
312
+ "kind": "attestation",
313
+ "verdict": "unattested",
314
+ "evidence": [
315
+ {
316
+ "kind": "origin",
317
+ "detail": "no origin recorded"
318
+ }
319
+ ]
320
+ },
321
+ {
322
+ "id": "row:depConstraints[0]:3",
323
+ "kind": "attestation",
324
+ "verdict": "unattested",
325
+ "evidence": [
326
+ {
327
+ "kind": "origin",
328
+ "detail": "no origin recorded"
329
+ }
330
+ ]
331
+ },
332
+ {
333
+ "id": "row:depConstraints[1]:4",
334
+ "kind": "attestation",
335
+ "verdict": "unattested",
336
+ "evidence": [
337
+ {
338
+ "kind": "origin",
339
+ "detail": "no origin recorded"
340
+ }
341
+ ]
342
+ },
343
+ {
344
+ "id": "row:depConstraints[2]:5",
345
+ "kind": "attestation",
346
+ "verdict": "unattested",
347
+ "evidence": [
348
+ {
349
+ "kind": "origin",
350
+ "detail": "no origin recorded"
351
+ }
352
+ ]
353
+ },
354
+ {
355
+ "id": "row:forbidden[0]:2",
356
+ "kind": "attestation",
357
+ "verdict": "unattested",
358
+ "evidence": [
359
+ {
360
+ "kind": "origin",
361
+ "detail": "no origin recorded"
362
+ }
363
+ ]
364
+ }
365
+ ],
366
+ "causalChains": []
367
+ },
368
+ "claims": [
369
+ {
370
+ "id": "decision:0001-layers",
371
+ "kind": "lifecycle",
372
+ "verdict": "attested",
373
+ "evidence": [
374
+ {
375
+ "kind": "file-attribution",
376
+ "detail": "created by t <t@t>"
377
+ },
378
+ {
379
+ "kind": "file-attribution",
380
+ "detail": "last changed by t <t@t>"
381
+ }
382
+ ]
383
+ },
384
+ {
385
+ "id": "row:allowed[0]:0",
386
+ "kind": "attestation",
387
+ "verdict": "unattested",
388
+ "evidence": [
389
+ {
390
+ "kind": "origin",
391
+ "detail": "no origin recorded"
392
+ }
393
+ ]
394
+ },
395
+ {
396
+ "id": "row:allowed[1]:1",
397
+ "kind": "attestation",
398
+ "verdict": "unattested",
399
+ "evidence": [
400
+ {
401
+ "kind": "origin",
402
+ "detail": "no origin recorded"
403
+ }
404
+ ]
405
+ },
406
+ {
407
+ "id": "row:depConstraints[0]:3",
408
+ "kind": "attestation",
409
+ "verdict": "unattested",
410
+ "evidence": [
411
+ {
412
+ "kind": "origin",
413
+ "detail": "no origin recorded"
414
+ }
415
+ ]
416
+ },
417
+ {
418
+ "id": "row:depConstraints[1]:4",
419
+ "kind": "attestation",
420
+ "verdict": "unattested",
421
+ "evidence": [
422
+ {
423
+ "kind": "origin",
424
+ "detail": "no origin recorded"
425
+ }
426
+ ]
427
+ },
428
+ {
429
+ "id": "row:depConstraints[2]:5",
430
+ "kind": "attestation",
431
+ "verdict": "unattested",
432
+ "evidence": [
433
+ {
434
+ "kind": "origin",
435
+ "detail": "no origin recorded"
436
+ }
437
+ ]
438
+ },
439
+ {
440
+ "id": "row:forbidden[0]:2",
441
+ "kind": "attestation",
442
+ "verdict": "unattested",
443
+ "evidence": [
444
+ {
445
+ "kind": "origin",
446
+ "detail": "no origin recorded"
447
+ }
448
+ ]
449
+ }
450
+ ]
451
+ }
452
+ }
453
+
@@ -0,0 +1,14 @@
1
+ repo 1fd51709c377d99a6139891e1200291cf08aede9
2
+ rows 6 governance rows, 0 with an origin, 6 without
3
+ unattested (no origin recorded — cannot attest):
4
+ allowed[0]
5
+ allowed[1]
6
+ forbidden[0]
7
+ depConstraints[0]
8
+ depConstraints[1]
9
+ depConstraints[2]
10
+ 6 of them carry no decision behind the rule
11
+ decisions 1 recorded — 1 attributed, 0 without attribution
12
+ accepted 0001-layers created by t <t@t> on 2026-01-01T00:00:00Z; changed by t <t@t> on 2026-01-01T00:00:00Z; binds intentForbiddenEdge
13
+ ✔ every decision's lifecycle is attributed — each change names who recorded it and with what tool
14
+ graph 8 nodes, 6 edges, 7 claims, 0 causal chains
@@ -0,0 +1,168 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "tool": {
4
+ "name": "@ecoma-io/archkeep",
5
+ "version": "0.26.0"
6
+ },
7
+ "command": "reconcile",
8
+ "workspace": {
9
+ "root": "/tmp/archkeep-golden-fixture",
10
+ "provider": "native",
11
+ "marker": "archkeep.json",
12
+ "provenance": {
13
+ "commit": "1fd51709c377d99a6139891e1200291cf08aede9",
14
+ "remote": null,
15
+ "dirty": false
16
+ }
17
+ },
18
+ "status": "ok",
19
+ "exitCode": 0,
20
+ "coverage": {
21
+ "complete": true,
22
+ "projects": 3,
23
+ "analyzedFiles": 3,
24
+ "imports": 2,
25
+ "notAnalyzed": [],
26
+ "blindSpots": [],
27
+ "notes": []
28
+ },
29
+ "result": {
30
+ "intent": {
31
+ "file": "architecture-intent.json",
32
+ "fingerprint": "ce10167aef69f6282985e218a59fe5bb88bd232cb221bc8b1ee8fefbe458b4bc",
33
+ "rows": 6
34
+ },
35
+ "observed": {
36
+ "projects": 3,
37
+ "edges": 2,
38
+ "implicitEdges": 0
39
+ },
40
+ "scores": {
41
+ "projects": [
42
+ {
43
+ "plane": "project",
44
+ "name": "api",
45
+ "state": "match",
46
+ "severity": 0,
47
+ "classification": "match",
48
+ "intentRow": null,
49
+ "confidence": "not governed"
50
+ },
51
+ {
52
+ "plane": "project",
53
+ "name": "app",
54
+ "state": "match",
55
+ "severity": 0,
56
+ "classification": "match",
57
+ "intentRow": null,
58
+ "confidence": "not governed"
59
+ },
60
+ {
61
+ "plane": "project",
62
+ "name": "core",
63
+ "state": "match",
64
+ "severity": 0,
65
+ "classification": "match",
66
+ "intentRow": null,
67
+ "confidence": "not governed"
68
+ }
69
+ ],
70
+ "edges": [
71
+ {
72
+ "plane": "edge",
73
+ "name": "api → core",
74
+ "intentRow": null,
75
+ "state": "match",
76
+ "severity": 0,
77
+ "classification": "match",
78
+ "confidence": "not governed"
79
+ },
80
+ {
81
+ "plane": "edge",
82
+ "name": "app → api",
83
+ "intentRow": null,
84
+ "state": "match",
85
+ "severity": 0,
86
+ "classification": "match",
87
+ "confidence": "not governed"
88
+ }
89
+ ],
90
+ "tags": [],
91
+ "boundaries": [
92
+ {
93
+ "plane": "boundary",
94
+ "name": "api",
95
+ "state": "match",
96
+ "severity": 0,
97
+ "classification": "match",
98
+ "intentRow": null,
99
+ "confidence": "stated"
100
+ },
101
+ {
102
+ "plane": "boundary",
103
+ "name": "app",
104
+ "state": "match",
105
+ "severity": 0,
106
+ "classification": "match",
107
+ "intentRow": null,
108
+ "confidence": "stated"
109
+ },
110
+ {
111
+ "plane": "boundary",
112
+ "name": "core",
113
+ "state": "match",
114
+ "severity": 0,
115
+ "classification": "match",
116
+ "intentRow": null,
117
+ "confidence": "stated"
118
+ }
119
+ ],
120
+ "intentRows": [
121
+ {
122
+ "plane": "intent-row",
123
+ "name": "app → api",
124
+ "state": "match",
125
+ "severity": 0,
126
+ "classification": "match",
127
+ "intentRow": {
128
+ "plane": "intent-row",
129
+ "index": 0,
130
+ "kind": "allowed",
131
+ "key": "app → api"
132
+ },
133
+ "confidence": "stated"
134
+ },
135
+ {
136
+ "plane": "intent-row",
137
+ "name": "api → core",
138
+ "state": "match",
139
+ "severity": 0,
140
+ "classification": "match",
141
+ "intentRow": {
142
+ "plane": "intent-row",
143
+ "index": 1,
144
+ "kind": "allowed",
145
+ "key": "api → core"
146
+ },
147
+ "confidence": "stated"
148
+ },
149
+ {
150
+ "plane": "intent-row",
151
+ "name": "core → app",
152
+ "state": "match",
153
+ "severity": 0,
154
+ "classification": "match",
155
+ "intentRow": {
156
+ "plane": "intent-row",
157
+ "index": 2,
158
+ "kind": "forbidden",
159
+ "key": "core → app"
160
+ },
161
+ "confidence": "stated"
162
+ }
163
+ ]
164
+ },
165
+ "unknownFiles": []
166
+ }
167
+ }
168
+
@@ -0,0 +1,3 @@
1
+ intent ce10167aef69f6282985e218a59fe5bb88bd232cb221bc8b1ee8fefbe458b4bc — 6 rows
2
+ observed 3 projects, 2 edges
3
+ ✔ no divergence — the observed architecture matches the intended model (3 projects and 2 edges)