@ybotok/loam 0.2.0-alpha.1 → 0.2.0-alpha.13

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 (901) hide show
  1. package/CHANGELOG.md +3448 -0
  2. package/COMPARISON.md +91 -3
  3. package/CONTRIBUTING.md +37 -0
  4. package/MIGRATING-from-OpenSpec.md +47 -23
  5. package/QUICKSTART.md +189 -12
  6. package/README.md +274 -65
  7. package/ROADMAP.md +572 -31
  8. package/SCHEMA.md +1709 -155
  9. package/WORKFLOW.md +298 -72
  10. package/dist/cli.js +26 -8
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/adopt/adopt.js +5 -10
  13. package/dist/commands/adopt/adopt.js.map +1 -1
  14. package/dist/commands/adopt/render.js +50 -9
  15. package/dist/commands/adopt/render.js.map +1 -1
  16. package/dist/commands/archive/archive.js +16 -19
  17. package/dist/commands/archive/archive.js.map +1 -1
  18. package/dist/commands/archive/closing.js +42 -0
  19. package/dist/commands/archive/closing.js.map +1 -0
  20. package/dist/commands/archive/plan/contracts/asyncapi.js +36 -42
  21. package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -1
  22. package/dist/commands/archive/plan/contracts/consumers.js +56 -0
  23. package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
  24. package/dist/commands/archive/plan/contracts/openapi.js +77 -43
  25. package/dist/commands/archive/plan/contracts/openapi.js.map +1 -1
  26. package/dist/commands/archive/plan/contracts/verdict-lines.js +103 -0
  27. package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
  28. package/dist/commands/archive/plan/document/head.js +151 -0
  29. package/dist/commands/archive/plan/document/head.js.map +1 -0
  30. package/dist/commands/archive/plan/document/links.js +284 -0
  31. package/dist/commands/archive/plan/document/links.js.map +1 -0
  32. package/dist/commands/archive/plan/document/run.js +136 -0
  33. package/dist/commands/archive/plan/document/run.js.map +1 -0
  34. package/dist/commands/archive/plan/gate.js +21 -19
  35. package/dist/commands/archive/plan/gate.js.map +1 -1
  36. package/dist/commands/archive/plan/landscape.js +167 -30
  37. package/dist/commands/archive/plan/landscape.js.map +1 -1
  38. package/dist/commands/archive/plan/model/extending.js +85 -0
  39. package/dist/commands/archive/plan/model/extending.js.map +1 -0
  40. package/dist/commands/archive/plan/refusal.js +14 -19
  41. package/dist/commands/archive/plan/refusal.js.map +1 -1
  42. package/dist/commands/archive/plan/specs.js +137 -56
  43. package/dist/commands/archive/plan/specs.js.map +1 -1
  44. package/dist/commands/archive/plan/state.js +3 -0
  45. package/dist/commands/archive/plan/state.js.map +1 -1
  46. package/dist/commands/archive/run.js +134 -30
  47. package/dist/commands/archive/run.js.map +1 -1
  48. package/dist/commands/archive/shipped.js +49 -0
  49. package/dist/commands/archive/shipped.js.map +1 -0
  50. package/dist/commands/context/context.js +85 -18
  51. package/dist/commands/context/context.js.map +1 -1
  52. package/dist/commands/context/print.js +29 -7
  53. package/dist/commands/context/print.js.map +1 -1
  54. package/dist/commands/delta/delta.js +102 -14
  55. package/dist/commands/delta/delta.js.map +1 -1
  56. package/dist/commands/delta/print.js +17 -1
  57. package/dist/commands/delta/print.js.map +1 -1
  58. package/dist/commands/dependencies.js +3 -7
  59. package/dist/commands/dependencies.js.map +1 -1
  60. package/dist/commands/diff/diff.js +20 -27
  61. package/dist/commands/diff/diff.js.map +1 -1
  62. package/dist/commands/doctor.js +60 -1
  63. package/dist/commands/doctor.js.map +1 -1
  64. package/dist/commands/explain/explain.js +89 -13
  65. package/dist/commands/explain/explain.js.map +1 -1
  66. package/dist/commands/explore.js +16 -10
  67. package/dist/commands/explore.js.map +1 -1
  68. package/dist/commands/gate/gate.js +45 -8
  69. package/dist/commands/gate/gate.js.map +1 -1
  70. package/dist/commands/gate/print.js +15 -3
  71. package/dist/commands/gate/print.js.map +1 -1
  72. package/dist/commands/gherkin/commit.js +13 -54
  73. package/dist/commands/gherkin/commit.js.map +1 -1
  74. package/dist/commands/gherkin/gherkin.js +36 -20
  75. package/dist/commands/gherkin/gherkin.js.map +1 -1
  76. package/dist/commands/gherkin/reconcile.js +10 -13
  77. package/dist/commands/gherkin/reconcile.js.map +1 -1
  78. package/dist/commands/init/first-hour.js +44 -0
  79. package/dist/commands/init/first-hour.js.map +1 -1
  80. package/dist/commands/init/init.js +18 -22
  81. package/dist/commands/init/init.js.map +1 -1
  82. package/dist/commands/list/campaign/campaign.js +4 -6
  83. package/dist/commands/list/campaign/campaign.js.map +1 -1
  84. package/dist/commands/list/json.js +5 -7
  85. package/dist/commands/list/json.js.map +1 -1
  86. package/dist/commands/list/list.js +44 -29
  87. package/dist/commands/list/list.js.map +1 -1
  88. package/dist/commands/list/print.js +52 -9
  89. package/dist/commands/list/print.js.map +1 -1
  90. package/dist/commands/list/suites/suites.js +140 -0
  91. package/dist/commands/list/suites/suites.js.map +1 -0
  92. package/dist/commands/list/views.js +37 -34
  93. package/dist/commands/list/views.js.map +1 -1
  94. package/dist/commands/mcp/dispatch.js +91 -36
  95. package/dist/commands/mcp/dispatch.js.map +1 -1
  96. package/dist/commands/mcp/mcp.js +56 -15
  97. package/dist/commands/mcp/mcp.js.map +1 -1
  98. package/dist/commands/mcp/serve.js.map +1 -1
  99. package/dist/commands/migrate-openspec/materialize/active.js +27 -22
  100. package/dist/commands/migrate-openspec/materialize/active.js.map +1 -1
  101. package/dist/commands/migrate-openspec/materialize/stage.js +4 -3
  102. package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -1
  103. package/dist/commands/migrate-openspec/materialize/target.js +2 -2
  104. package/dist/commands/migrate-openspec/materialize/target.js.map +1 -1
  105. package/dist/commands/migrate-openspec/openspec/decisions.js +9 -14
  106. package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -1
  107. package/dist/commands/migrate-openspec/openspec/error.js +7 -8
  108. package/dist/commands/migrate-openspec/openspec/error.js.map +1 -1
  109. package/dist/commands/migrate-openspec/openspec/mapping.js +1 -9
  110. package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -1
  111. package/dist/commands/migrate-openspec/openspec/paths.js +3 -6
  112. package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -1
  113. package/dist/commands/new/capability-template.js +118 -0
  114. package/dist/commands/new/capability-template.js.map +1 -0
  115. package/dist/commands/new/commit.js +8 -22
  116. package/dist/commands/new/commit.js.map +1 -1
  117. package/dist/commands/new/modifies.js +206 -0
  118. package/dist/commands/new/modifies.js.map +1 -0
  119. package/dist/commands/new/new.js +59 -14
  120. package/dist/commands/new/new.js.map +1 -1
  121. package/dist/commands/new/templates.js +48 -124
  122. package/dist/commands/new/templates.js.map +1 -1
  123. package/dist/commands/open.js +3 -7
  124. package/dist/commands/open.js.map +1 -1
  125. package/dist/commands/policy/gate.js +27 -0
  126. package/dist/commands/policy/gate.js.map +1 -1
  127. package/dist/commands/rebase/plan.js +2 -2
  128. package/dist/commands/rebase/plan.js.map +1 -1
  129. package/dist/commands/rebase/rebase.js +60 -35
  130. package/dist/commands/rebase/rebase.js.map +1 -1
  131. package/dist/commands/seed/commit.js +55 -26
  132. package/dist/commands/seed/commit.js.map +1 -1
  133. package/dist/commands/seed/plan.js +158 -13
  134. package/dist/commands/seed/plan.js.map +1 -1
  135. package/dist/commands/seed/seed.js +13 -11
  136. package/dist/commands/seed/seed.js.map +1 -1
  137. package/dist/commands/show/feature.js +9 -5
  138. package/dist/commands/show/feature.js.map +1 -1
  139. package/dist/commands/show/introduced.js +157 -0
  140. package/dist/commands/show/introduced.js.map +1 -0
  141. package/dist/commands/show/marks.js +35 -6
  142. package/dist/commands/show/marks.js.map +1 -1
  143. package/dist/commands/show/service.js +41 -33
  144. package/dist/commands/show/service.js.map +1 -1
  145. package/dist/commands/show/show.js +17 -7
  146. package/dist/commands/show/show.js.map +1 -1
  147. package/dist/commands/status/fleet-next.js +90 -0
  148. package/dist/commands/status/fleet-next.js.map +1 -0
  149. package/dist/commands/status/json.js +2 -0
  150. package/dist/commands/status/json.js.map +1 -1
  151. package/dist/commands/status/print.js +89 -37
  152. package/dist/commands/status/print.js.map +1 -1
  153. package/dist/commands/status/status.js +3 -7
  154. package/dist/commands/status/status.js.map +1 -1
  155. package/dist/commands/steps/steps.js +103 -23
  156. package/dist/commands/steps/steps.js.map +1 -1
  157. package/dist/commands/subsystem/edit.js +7 -7
  158. package/dist/commands/subsystem/edit.js.map +1 -1
  159. package/dist/commands/subsystem/move.js +106 -46
  160. package/dist/commands/subsystem/move.js.map +1 -1
  161. package/dist/commands/subsystem/query.js +2 -4
  162. package/dist/commands/subsystem/query.js.map +1 -1
  163. package/dist/commands/subsystem/subsystem.js +4 -7
  164. package/dist/commands/subsystem/subsystem.js.map +1 -1
  165. package/dist/commands/subsystem/sync.js +289 -74
  166. package/dist/commands/subsystem/sync.js.map +1 -1
  167. package/dist/commands/subsystem/txn/exclude.js +132 -0
  168. package/dist/commands/subsystem/txn/exclude.js.map +1 -0
  169. package/dist/commands/subsystem/txn/links.js +128 -0
  170. package/dist/commands/subsystem/txn/links.js.map +1 -0
  171. package/dist/commands/subsystem/txn/report.js +174 -0
  172. package/dist/commands/subsystem/txn/report.js.map +1 -0
  173. package/dist/commands/subsystem/txn/txn.js +147 -45
  174. package/dist/commands/subsystem/txn/txn.js.map +1 -1
  175. package/dist/commands/subsystem/txn/views.js +200 -21
  176. package/dist/commands/subsystem/txn/views.js.map +1 -1
  177. package/dist/commands/tasks/actions.js +107 -0
  178. package/dist/commands/tasks/actions.js.map +1 -0
  179. package/dist/commands/tasks/render.js +253 -0
  180. package/dist/commands/tasks/render.js.map +1 -0
  181. package/dist/commands/tasks/tasks.js +119 -0
  182. package/dist/commands/tasks/tasks.js.map +1 -0
  183. package/dist/commands/unarchive/manifest.js +42 -26
  184. package/dist/commands/unarchive/manifest.js.map +1 -1
  185. package/dist/commands/unarchive/restore.js +83 -33
  186. package/dist/commands/unarchive/restore.js.map +1 -1
  187. package/dist/commands/unarchive/unarchive.js +22 -30
  188. package/dist/commands/unarchive/unarchive.js.map +1 -1
  189. package/dist/commands/validate/arch-coverage.js +78 -27
  190. package/dist/commands/validate/arch-coverage.js.map +1 -1
  191. package/dist/commands/validate/checks/fleet-shape.js +34 -126
  192. package/dist/commands/validate/checks/fleet-shape.js.map +1 -1
  193. package/dist/commands/validate/checks/health-deps.js +9 -6
  194. package/dist/commands/validate/checks/health-deps.js.map +1 -1
  195. package/dist/commands/validate/checks/introduced.js +102 -0
  196. package/dist/commands/validate/checks/introduced.js.map +1 -0
  197. package/dist/commands/validate/checks/requirements.js +18 -8
  198. package/dist/commands/validate/checks/requirements.js.map +1 -1
  199. package/dist/commands/validate/checks/sources.js +11 -2
  200. package/dist/commands/validate/checks/sources.js.map +1 -1
  201. package/dist/commands/validate/coverage/covers-after.js +105 -0
  202. package/dist/commands/validate/coverage/covers-after.js.map +1 -0
  203. package/dist/commands/validate/feature.js +26 -20
  204. package/dist/commands/validate/feature.js.map +1 -1
  205. package/dist/commands/validate/fleet/census.js +37 -13
  206. package/dist/commands/validate/fleet/census.js.map +1 -1
  207. package/dist/commands/validate/fleet/landscape.js +144 -126
  208. package/dist/commands/validate/fleet/landscape.js.map +1 -1
  209. package/dist/commands/validate/fleet/load.js +66 -0
  210. package/dist/commands/validate/fleet/load.js.map +1 -1
  211. package/dist/commands/validate/fleet/map/attest.js +98 -0
  212. package/dist/commands/validate/fleet/map/attest.js.map +1 -0
  213. package/dist/commands/validate/fleet/map/bindings.js +107 -0
  214. package/dist/commands/validate/fleet/map/bindings.js.map +1 -0
  215. package/dist/commands/validate/fleet/map/consumers.js +244 -0
  216. package/dist/commands/validate/fleet/map/consumers.js.map +1 -0
  217. package/dist/commands/validate/fleet/map/isolation.js +116 -0
  218. package/dist/commands/validate/fleet/map/isolation.js.map +1 -0
  219. package/dist/commands/validate/fleet/map/usecases.js +54 -0
  220. package/dist/commands/validate/fleet/map/usecases.js.map +1 -0
  221. package/dist/commands/validate/fleet/obligations.js +44 -14
  222. package/dist/commands/validate/fleet/obligations.js.map +1 -1
  223. package/dist/commands/validate/fleet/scorecard/print.js +10 -2
  224. package/dist/commands/validate/fleet/scorecard/print.js.map +1 -1
  225. package/dist/commands/validate/fleet/scorecard/scorecard.js +17 -11
  226. package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -1
  227. package/dist/commands/validate/fleet/usecases/place.js.map +1 -1
  228. package/dist/commands/validate/fleet/views/fleet-project.js +217 -0
  229. package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -0
  230. package/dist/commands/validate/fleet/views/ids.js +50 -15
  231. package/dist/commands/validate/fleet/views/ids.js.map +1 -1
  232. package/dist/commands/validate/fleet/views/projects.js +278 -0
  233. package/dist/commands/validate/fleet/views/projects.js.map +1 -0
  234. package/dist/commands/validate/fleet/views/root-documents.js +83 -0
  235. package/dist/commands/validate/fleet/views/root-documents.js.map +1 -0
  236. package/dist/commands/validate/fleet/views/stale.js +40 -47
  237. package/dist/commands/validate/fleet/views/stale.js.map +1 -1
  238. package/dist/commands/validate/links/corpus.js +1 -4
  239. package/dist/commands/validate/links/corpus.js.map +1 -1
  240. package/dist/commands/validate/links/glossary.js.map +1 -1
  241. package/dist/commands/validate/render/repeats.js +63 -0
  242. package/dist/commands/validate/render/repeats.js.map +1 -0
  243. package/dist/commands/validate/render/rollups.js +115 -0
  244. package/dist/commands/validate/render/rollups.js.map +1 -0
  245. package/dist/commands/validate/render/text.js +199 -0
  246. package/dist/commands/validate/render/text.js.map +1 -0
  247. package/dist/commands/validate/report.js +36 -160
  248. package/dist/commands/validate/report.js.map +1 -1
  249. package/dist/commands/validate/scope.js +113 -0
  250. package/dist/commands/validate/scope.js.map +1 -0
  251. package/dist/commands/validate/service/api.js +21 -107
  252. package/dist/commands/validate/service/api.js.map +1 -1
  253. package/dist/commands/validate/service/contracts/generated.js +134 -0
  254. package/dist/commands/validate/service/contracts/generated.js.map +1 -0
  255. package/dist/commands/validate/service/events/events.js +36 -14
  256. package/dist/commands/validate/service/events/events.js.map +1 -1
  257. package/dist/commands/validate/service/events/message-producers.js +1 -1
  258. package/dist/commands/validate/service/events/message-producers.js.map +1 -1
  259. package/dist/commands/validate/service/evidence-pins.js +56 -10
  260. package/dist/commands/validate/service/evidence-pins.js.map +1 -1
  261. package/dist/commands/validate/service/model/diverged.js +226 -0
  262. package/dist/commands/validate/service/model/diverged.js.map +1 -0
  263. package/dist/commands/validate/service/model/grade.js +163 -0
  264. package/dist/commands/validate/service/model/grade.js.map +1 -0
  265. package/dist/commands/validate/service/service.js +121 -61
  266. package/dist/commands/validate/service/service.js.map +1 -1
  267. package/dist/commands/validate/service/specs.js +88 -28
  268. package/dist/commands/validate/service/specs.js.map +1 -1
  269. package/dist/commands/validate/service/spine.js +38 -3
  270. package/dist/commands/validate/service/spine.js.map +1 -1
  271. package/dist/commands/validate/service/usecases/tags.js +113 -0
  272. package/dist/commands/validate/service/usecases/tags.js.map +1 -0
  273. package/dist/commands/validate/service/usecases/usecases.js +209 -0
  274. package/dist/commands/validate/service/usecases/usecases.js.map +1 -0
  275. package/dist/commands/validate/validate.js +85 -60
  276. package/dist/commands/validate/validate.js.map +1 -1
  277. package/dist/commands/verify/cross/diff.js +2 -6
  278. package/dist/commands/verify/cross/diff.js.map +1 -1
  279. package/dist/commands/verify/evidence/contract.js +1 -1
  280. package/dist/commands/verify/evidence/contract.js.map +1 -1
  281. package/dist/commands/verify/evidence/read.js +12 -3
  282. package/dist/commands/verify/evidence/read.js.map +1 -1
  283. package/dist/commands/verify/frozen.js +45 -23
  284. package/dist/commands/verify/frozen.js.map +1 -1
  285. package/dist/commands/verify/record.js +69 -17
  286. package/dist/commands/verify/record.js.map +1 -1
  287. package/dist/commands/verify/report.js +27 -44
  288. package/dist/commands/verify/report.js.map +1 -1
  289. package/dist/commands/verify/results.js +112 -30
  290. package/dist/commands/verify/results.js.map +1 -1
  291. package/dist/commands/verify/verify.js +55 -52
  292. package/dist/commands/verify/verify.js.map +1 -1
  293. package/dist/commands/vouch/pack/pack.js +2 -2
  294. package/dist/commands/vouch/pack/pack.js.map +1 -1
  295. package/dist/commands/vouch/pack/print.js +1 -6
  296. package/dist/commands/vouch/pack/print.js.map +1 -1
  297. package/dist/commands/vouch/pack/sections.js +1 -2
  298. package/dist/commands/vouch/pack/sections.js.map +1 -1
  299. package/dist/commands/vouch/run.js +26 -81
  300. package/dist/commands/vouch/run.js.map +1 -1
  301. package/dist/commands/vouch/sample/plan.js +20 -34
  302. package/dist/commands/vouch/sample/plan.js.map +1 -1
  303. package/dist/commands/vouch/vet/verify.js +39 -7
  304. package/dist/commands/vouch/vet/verify.js.map +1 -1
  305. package/dist/commands/vouch/vouch.js +10 -17
  306. package/dist/commands/vouch/vouch.js.map +1 -1
  307. package/dist/core/agent/agents-md/command-map.js +81 -106
  308. package/dist/core/agent/agents-md/command-map.js.map +1 -1
  309. package/dist/core/agent/agents-md/map/explain.js +21 -9
  310. package/dist/core/agent/agents-md/map/explain.js.map +1 -1
  311. package/dist/core/agent/agents-md/map/lenses/context.js +17 -8
  312. package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -1
  313. package/dist/core/agent/agents-md/map/lenses/diff.js +33 -20
  314. package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -1
  315. package/dist/core/agent/agents-md/map/lenses/gate.js +13 -5
  316. package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -1
  317. package/dist/core/agent/agents-md/map/mcp.js +10 -7
  318. package/dist/core/agent/agents-md/map/mcp.js.map +1 -1
  319. package/dist/core/agent/agents-md/map/status.js +24 -8
  320. package/dist/core/agent/agents-md/map/status.js.map +1 -1
  321. package/dist/core/agent/agents-md/map/subsystem.js +80 -8
  322. package/dist/core/agent/agents-md/map/subsystem.js.map +1 -1
  323. package/dist/core/agent/agents-md/map/usecases.js +88 -10
  324. package/dist/core/agent/agents-md/map/usecases.js.map +1 -1
  325. package/dist/core/agent/agents-md/refusals.js +49 -22
  326. package/dist/core/agent/agents-md/refusals.js.map +1 -1
  327. package/dist/core/agent/agents-md.js +39 -6
  328. package/dist/core/agent/agents-md.js.map +1 -1
  329. package/dist/core/agent/agents-stamp.js +10 -0
  330. package/dist/core/agent/agents-stamp.js.map +1 -1
  331. package/dist/core/agent/protocol.js +1 -1
  332. package/dist/core/agent/protocol.js.map +1 -1
  333. package/dist/core/agent/scaffold.js +10 -15
  334. package/dist/core/agent/scaffold.js.map +1 -1
  335. package/dist/core/agent/support/report.js +46 -5
  336. package/dist/core/agent/support/report.js.map +1 -1
  337. package/dist/core/agent/tools/dialects.js +1 -0
  338. package/dist/core/agent/tools/dialects.js.map +1 -1
  339. package/dist/core/agent/tools/registry.js +41 -76
  340. package/dist/core/agent/tools/registry.js.map +1 -1
  341. package/dist/core/agent/workflows/adopt.js +158 -11
  342. package/dist/core/agent/workflows/adopt.js.map +1 -1
  343. package/dist/core/agent/workflows/check.js +78 -39
  344. package/dist/core/agent/workflows/check.js.map +1 -1
  345. package/dist/core/agent/workflows/closing.js +88 -27
  346. package/dist/core/agent/workflows/closing.js.map +1 -1
  347. package/dist/core/agent/workflows/feature.js +128 -13
  348. package/dist/core/agent/workflows/feature.js.map +1 -1
  349. package/dist/core/agent/workflows/implement.js +96 -13
  350. package/dist/core/agent/workflows/implement.js.map +1 -1
  351. package/dist/core/agent/workflows/reference/authoring.js +106 -4
  352. package/dist/core/agent/workflows/reference/authoring.js.map +1 -1
  353. package/dist/core/agent/workflows/reference/codes.js +8 -6
  354. package/dist/core/agent/workflows/reference/codes.js.map +1 -1
  355. package/dist/core/agent/workflows/reference/done-check.js +37 -15
  356. package/dist/core/agent/workflows/reference/done-check.js.map +1 -1
  357. package/dist/core/agent/workflows/reference/drawing/drawing.js +253 -0
  358. package/dist/core/agent/workflows/reference/drawing/drawing.js.map +1 -0
  359. package/dist/core/agent/workflows/reference/reference.js +6 -3
  360. package/dist/core/agent/workflows/reference/reference.js.map +1 -1
  361. package/dist/core/agent/workflows/reference/spine.js +68 -27
  362. package/dist/core/agent/workflows/reference/spine.js.map +1 -1
  363. package/dist/core/asyncapi/baseline/plan.js +14 -81
  364. package/dist/core/asyncapi/baseline/plan.js.map +1 -1
  365. package/dist/core/asyncapi/digest.js +30 -25
  366. package/dist/core/asyncapi/digest.js.map +1 -1
  367. package/dist/core/asyncapi/merge/components.js +5 -4
  368. package/dist/core/asyncapi/merge/components.js.map +1 -1
  369. package/dist/core/asyncapi/merge/error.js +7 -2
  370. package/dist/core/asyncapi/merge/error.js.map +1 -1
  371. package/dist/core/asyncapi/merge/markers.js +32 -50
  372. package/dist/core/asyncapi/merge/markers.js.map +1 -1
  373. package/dist/core/asyncapi/merge/merge.js +33 -53
  374. package/dist/core/asyncapi/merge/merge.js.map +1 -1
  375. package/dist/core/asyncapi/merge/pin.js +12 -36
  376. package/dist/core/asyncapi/merge/pin.js.map +1 -1
  377. package/dist/core/asyncapi/model.js.map +1 -1
  378. package/dist/core/asyncapi/read.js +36 -12
  379. package/dist/core/asyncapi/read.js.map +1 -1
  380. package/dist/core/brief/brief.js +96 -36
  381. package/dist/core/brief/brief.js.map +1 -1
  382. package/dist/core/brief/checks.js +138 -3
  383. package/dist/core/brief/checks.js.map +1 -1
  384. package/dist/core/brief/landscape.js +209 -130
  385. package/dist/core/brief/landscape.js.map +1 -1
  386. package/dist/core/brief/map/extend.js +84 -0
  387. package/dist/core/brief/map/extend.js.map +1 -0
  388. package/dist/core/brief/map/owed.js +266 -0
  389. package/dist/core/brief/map/owed.js.map +1 -0
  390. package/dist/core/brief/targets.js +109 -31
  391. package/dist/core/brief/targets.js.map +1 -1
  392. package/dist/core/brief/unchecked.js +14 -3
  393. package/dist/core/brief/unchecked.js.map +1 -1
  394. package/dist/core/c4/arch.js +90 -182
  395. package/dist/core/c4/arch.js.map +1 -1
  396. package/dist/core/c4/direction/direction.js +114 -0
  397. package/dist/core/c4/direction/direction.js.map +1 -0
  398. package/dist/core/c4/likec4.js +169 -14
  399. package/dist/core/c4/likec4.js.map +1 -1
  400. package/dist/core/c4/locate/unlocated.js +150 -0
  401. package/dist/core/c4/locate/unlocated.js.map +1 -0
  402. package/dist/core/c4/parsed/deployment.js +160 -0
  403. package/dist/core/c4/parsed/deployment.js.map +1 -0
  404. package/dist/core/c4/parsed/dynamic-views.js.map +1 -1
  405. package/dist/core/c4/parsed/values.js +54 -1
  406. package/dist/core/c4/parsed/values.js.map +1 -1
  407. package/dist/core/c4/parsed/view-ids.js +39 -1
  408. package/dist/core/c4/parsed/view-ids.js.map +1 -1
  409. package/dist/core/c4/prefetch/fleet.js +134 -0
  410. package/dist/core/c4/prefetch/fleet.js.map +1 -0
  411. package/dist/core/c4/project/architecture.js +123 -7
  412. package/dist/core/c4/project/architecture.js.map +1 -1
  413. package/dist/core/c4/project/batch.js +140 -0
  414. package/dist/core/c4/project/batch.js.map +1 -0
  415. package/dist/core/c4/project/documents.js +43 -12
  416. package/dist/core/c4/project/documents.js.map +1 -1
  417. package/dist/core/c4/project/load.js +79 -43
  418. package/dist/core/c4/project/load.js.map +1 -1
  419. package/dist/core/c4/project/staged.js +277 -0
  420. package/dist/core/c4/project/staged.js.map +1 -0
  421. package/dist/core/c4/resolve/attested.js +0 -0
  422. package/dist/core/c4/resolve/attested.js.map +1 -0
  423. package/dist/core/c4/resolve/external.js +51 -0
  424. package/dist/core/c4/resolve/external.js.map +1 -0
  425. package/dist/core/c4/resolve/service.js +78 -17
  426. package/dist/core/c4/resolve/service.js.map +1 -1
  427. package/dist/core/c4/resolve/steps.js +290 -0
  428. package/dist/core/c4/resolve/steps.js.map +1 -0
  429. package/dist/core/c4/resolve/systems.js +154 -0
  430. package/dist/core/c4/resolve/systems.js.map +1 -0
  431. package/dist/core/c4/root-project/exclude.js +352 -0
  432. package/dist/core/c4/root-project/exclude.js.map +1 -0
  433. package/dist/core/c4/seed/template.js +65 -1
  434. package/dist/core/c4/seed/template.js.map +1 -1
  435. package/dist/core/c4/service-model/created/models.js +96 -0
  436. package/dist/core/c4/service-model/created/models.js.map +1 -0
  437. package/dist/core/c4/service-model/documents.js +47 -0
  438. package/dist/core/c4/service-model/documents.js.map +1 -0
  439. package/dist/core/c4/service-model/fleet/extending.js +82 -0
  440. package/dist/core/c4/service-model/fleet/extending.js.map +1 -0
  441. package/dist/core/c4/service-model/load.js +165 -0
  442. package/dist/core/c4/service-model/load.js.map +1 -0
  443. package/dist/core/c4/service-model/renderer.js +128 -0
  444. package/dist/core/c4/service-model/renderer.js.map +1 -0
  445. package/dist/core/c4/service-model/shape.js +106 -0
  446. package/dist/core/c4/service-model/shape.js.map +1 -0
  447. package/dist/core/c4/service-model/slice.js +188 -0
  448. package/dist/core/c4/service-model/slice.js.map +1 -0
  449. package/dist/core/c4/source-mask.js +297 -10
  450. package/dist/core/c4/source-mask.js.map +1 -1
  451. package/dist/core/c4/source-scan.js +222 -141
  452. package/dist/core/c4/source-scan.js.map +1 -1
  453. package/dist/core/c4/splice/authored-source.js +79 -13
  454. package/dist/core/c4/splice/authored-source.js.map +1 -1
  455. package/dist/core/c4/splice/contract.js +20 -0
  456. package/dist/core/c4/splice/contract.js.map +1 -1
  457. package/dist/core/c4/splice/delta-blocks.js +20 -20
  458. package/dist/core/c4/splice/delta-blocks.js.map +1 -1
  459. package/dist/core/c4/splice/identity/declared.js +87 -0
  460. package/dist/core/c4/splice/identity/declared.js.map +1 -0
  461. package/dist/core/c4/splice/identity/edges.js +37 -0
  462. package/dist/core/c4/splice/identity/edges.js.map +1 -1
  463. package/dist/core/c4/splice/identity/existing.js +80 -0
  464. package/dist/core/c4/splice/identity/existing.js.map +1 -0
  465. package/dist/core/c4/splice/identity/interior.js +80 -0
  466. package/dist/core/c4/splice/identity/interior.js.map +1 -0
  467. package/dist/core/c4/splice/identity/owner.js +50 -0
  468. package/dist/core/c4/splice/identity/owner.js.map +1 -0
  469. package/dist/core/c4/splice/landscape-merge.js +182 -114
  470. package/dist/core/c4/splice/landscape-merge.js.map +1 -1
  471. package/dist/core/c4/splice/model/merge.js +151 -0
  472. package/dist/core/c4/splice/model/merge.js.map +1 -0
  473. package/dist/core/c4/splice/placement.js +160 -56
  474. package/dist/core/c4/splice/placement.js.map +1 -1
  475. package/dist/core/c4/splice/text/spot.js +131 -0
  476. package/dist/core/c4/splice/text/spot.js.map +1 -0
  477. package/dist/core/c4/workspace.js +13 -19
  478. package/dist/core/c4/workspace.js.map +1 -1
  479. package/dist/core/capabilities/capabilities.js +6 -6
  480. package/dist/core/capabilities/capabilities.js.map +1 -1
  481. package/dist/core/capabilities/delta/doc.js +7 -10
  482. package/dist/core/capabilities/delta/doc.js.map +1 -1
  483. package/dist/core/capabilities/delta/uncovered.js +2 -2
  484. package/dist/core/capabilities/delta/uncovered.js.map +1 -1
  485. package/dist/core/capabilities/findings.js +18 -22
  486. package/dist/core/capabilities/findings.js.map +1 -1
  487. package/dist/core/capabilities/realizes/findings.js +12 -19
  488. package/dist/core/capabilities/realizes/findings.js.map +1 -1
  489. package/dist/core/capabilities/realizes/join.js +0 -20
  490. package/dist/core/capabilities/realizes/join.js.map +1 -1
  491. package/dist/core/capabilities/rollup.js +6 -0
  492. package/dist/core/capabilities/rollup.js.map +1 -1
  493. package/dist/core/capabilities/tree.js +6 -28
  494. package/dist/core/capabilities/tree.js.map +1 -1
  495. package/dist/core/capabilities/usecase-join.js +3 -13
  496. package/dist/core/capabilities/usecase-join.js.map +1 -1
  497. package/dist/core/coherence/authoring/scaffold.js +11 -3
  498. package/dist/core/coherence/authoring/scaffold.js.map +1 -1
  499. package/dist/core/coherence/authoring/sentinels.js +2 -1
  500. package/dist/core/coherence/authoring/sentinels.js.map +1 -1
  501. package/dist/core/coherence/calls/called.js +52 -0
  502. package/dist/core/coherence/calls/called.js.map +1 -0
  503. package/dist/core/coherence/coherence.js +103 -22
  504. package/dist/core/coherence/coherence.js.map +1 -1
  505. package/dist/core/coherence/consumed/operations.js +70 -0
  506. package/dist/core/coherence/consumed/operations.js.map +1 -0
  507. package/dist/core/coherence/consumed/refusal.js +38 -0
  508. package/dist/core/coherence/consumed/refusal.js.map +1 -0
  509. package/dist/core/coherence/covers/health.js +85 -0
  510. package/dist/core/coherence/covers/health.js.map +1 -0
  511. package/dist/core/coherence/declared.js +60 -34
  512. package/dist/core/coherence/declared.js.map +1 -1
  513. package/dist/core/coherence/events/declared.js +44 -59
  514. package/dist/core/coherence/events/declared.js.map +1 -1
  515. package/dist/core/coherence/events/events.js +147 -16
  516. package/dist/core/coherence/events/events.js.map +1 -1
  517. package/dist/core/coherence/events/grades.js +31 -8
  518. package/dist/core/coherence/events/grades.js.map +1 -1
  519. package/dist/core/coherence/events/lookups.js +28 -87
  520. package/dist/core/coherence/events/lookups.js.map +1 -1
  521. package/dist/core/coherence/events/produced.js +100 -0
  522. package/dist/core/coherence/events/produced.js.map +1 -0
  523. package/dist/core/coherence/lookups.js +18 -78
  524. package/dist/core/coherence/lookups.js.map +1 -1
  525. package/dist/core/coherence/retired/archived.js +285 -0
  526. package/dist/core/coherence/retired/archived.js.map +1 -0
  527. package/dist/core/coherence/retired/event-pair.js +62 -0
  528. package/dist/core/coherence/retired/event-pair.js.map +1 -0
  529. package/dist/core/coherence/retired/merged.js +79 -0
  530. package/dist/core/coherence/retired/merged.js.map +1 -0
  531. package/dist/core/coherence/retired/retirement.js +49 -0
  532. package/dist/core/coherence/retired/retirement.js.map +1 -0
  533. package/dist/core/coherence/retired/revival/arrivals.js +131 -0
  534. package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
  535. package/dist/core/coherence/retired/revival/revived.js +297 -0
  536. package/dist/core/coherence/retired/revival/revived.js.map +1 -0
  537. package/dist/core/consumers/after.js +113 -0
  538. package/dist/core/consumers/after.js.map +1 -0
  539. package/dist/core/consumers/consumers.js +296 -0
  540. package/dist/core/consumers/consumers.js.map +1 -0
  541. package/dist/core/consumers/current.js +211 -0
  542. package/dist/core/consumers/current.js.map +1 -0
  543. package/dist/core/consumers/scan.js +46 -0
  544. package/dist/core/consumers/scan.js.map +1 -0
  545. package/dist/core/consumers/state.js +27 -0
  546. package/dist/core/consumers/state.js.map +1 -0
  547. package/dist/core/delta/delta.js +51 -6
  548. package/dist/core/delta/delta.js.map +1 -1
  549. package/dist/core/dependencies/fanin.js +2 -2
  550. package/dist/core/dependencies/fanin.js.map +1 -1
  551. package/dist/core/deployment/delta.js +191 -0
  552. package/dist/core/deployment/delta.js.map +1 -0
  553. package/dist/core/deployment/objects.js +145 -0
  554. package/dist/core/deployment/objects.js.map +1 -0
  555. package/dist/core/diff/base-git.js +94 -12
  556. package/dist/core/diff/base-git.js.map +1 -1
  557. package/dist/core/diff/base-state.js +49 -21
  558. package/dist/core/diff/base-state.js.map +1 -1
  559. package/dist/core/diff/joins.js +136 -0
  560. package/dist/core/diff/joins.js.map +1 -0
  561. package/dist/core/diff/scope/changed-paths.js +22 -6
  562. package/dist/core/diff/scope/changed-paths.js.map +1 -1
  563. package/dist/core/diff/scope/edges.js +82 -0
  564. package/dist/core/diff/scope/edges.js.map +1 -0
  565. package/dist/core/diff/semantic.js +100 -31
  566. package/dist/core/diff/semantic.js.map +1 -1
  567. package/dist/core/docs.js +31 -22
  568. package/dist/core/docs.js.map +1 -1
  569. package/dist/core/doctor/agents.js +34 -18
  570. package/dist/core/doctor/agents.js.map +1 -1
  571. package/dist/core/doctor/config.js +7 -3
  572. package/dist/core/doctor/config.js.map +1 -1
  573. package/dist/core/doctor/doctor.js +91 -11
  574. package/dist/core/doctor/doctor.js.map +1 -1
  575. package/dist/core/doctor/report.js.map +1 -1
  576. package/dist/core/doctor/reports/scan.js +242 -0
  577. package/dist/core/doctor/reports/scan.js.map +1 -0
  578. package/dist/core/document/apply.js +158 -11
  579. package/dist/core/document/apply.js.map +1 -1
  580. package/dist/core/document/frontmatter.js +55 -0
  581. package/dist/core/document/frontmatter.js.map +1 -1
  582. package/dist/core/document/parse.js +29 -6
  583. package/dist/core/document/parse.js.map +1 -1
  584. package/dist/core/document/scenarios.js +17 -0
  585. package/dist/core/document/scenarios.js.map +1 -1
  586. package/dist/core/document/spec.js +4 -11
  587. package/dist/core/document/spec.js.map +1 -1
  588. package/dist/core/envelope/config.js +10 -0
  589. package/dist/core/envelope/config.js.map +1 -1
  590. package/dist/core/envelope/json.js +34 -0
  591. package/dist/core/envelope/json.js.map +1 -1
  592. package/dist/core/explain/families.js +26 -21
  593. package/dist/core/explain/families.js.map +1 -1
  594. package/dist/core/explain/lookup.js +14 -1
  595. package/dist/core/explain/lookup.js.map +1 -1
  596. package/dist/core/explain/refusals.js +5 -5
  597. package/dist/core/explain/refusals.js.map +1 -1
  598. package/dist/core/explain/terms/documents.js +227 -0
  599. package/dist/core/explain/terms/documents.js.map +1 -0
  600. package/dist/core/explain/terms/done-check.js +144 -0
  601. package/dist/core/explain/terms/done-check.js.map +1 -0
  602. package/dist/core/explain/terms/entry.js +14 -0
  603. package/dist/core/explain/terms/entry.js.map +1 -0
  604. package/dist/core/explain/terms/stages.js +71 -0
  605. package/dist/core/explain/terms/stages.js.map +1 -0
  606. package/dist/core/explain/terms/tasks.js +97 -0
  607. package/dist/core/explain/terms/tasks.js.map +1 -0
  608. package/dist/core/explain/terms.js +68 -109
  609. package/dist/core/explain/terms.js.map +1 -1
  610. package/dist/core/explore/explore.js +40 -10
  611. package/dist/core/explore/explore.js.map +1 -1
  612. package/dist/core/fleet-context.js +81 -95
  613. package/dist/core/fleet-context.js.map +1 -1
  614. package/dist/core/gate/checks.js +11 -4
  615. package/dist/core/gate/checks.js.map +1 -1
  616. package/dist/core/gate/partners.js +69 -28
  617. package/dist/core/gate/partners.js.map +1 -1
  618. package/dist/core/gate/report.js.map +1 -1
  619. package/dist/core/gate/verification.js +75 -12
  620. package/dist/core/gate/verification.js.map +1 -1
  621. package/dist/core/gherkin/stale.js +13 -37
  622. package/dist/core/gherkin/stale.js.map +1 -1
  623. package/dist/core/glossary/delta.js +10 -7
  624. package/dist/core/glossary/delta.js.map +1 -1
  625. package/dist/core/glossary/tree.js +6 -19
  626. package/dist/core/glossary/tree.js.map +1 -1
  627. package/dist/core/kernel/concurrency.js +19 -0
  628. package/dist/core/kernel/concurrency.js.map +1 -1
  629. package/dist/core/kernel/ids/fqn/ancestors.js +65 -0
  630. package/dist/core/kernel/ids/fqn/ancestors.js.map +1 -0
  631. package/dist/core/kernel/path-safety.js +38 -0
  632. package/dist/core/kernel/path-safety.js.map +1 -1
  633. package/dist/core/kernel/records.js +11 -0
  634. package/dist/core/kernel/records.js.map +1 -1
  635. package/dist/core/links/backlinks.js +1 -3
  636. package/dist/core/links/backlinks.js.map +1 -1
  637. package/dist/core/links/corpus.js +51 -37
  638. package/dist/core/links/corpus.js.map +1 -1
  639. package/dist/core/links/findings.js.map +1 -1
  640. package/dist/core/links/parse.js +38 -9
  641. package/dist/core/links/parse.js.map +1 -1
  642. package/dist/core/mcp/argv.js +101 -0
  643. package/dist/core/mcp/argv.js.map +1 -1
  644. package/dist/core/mcp/author-tools.js +2 -1
  645. package/dist/core/mcp/author-tools.js.map +1 -1
  646. package/dist/core/mcp/protocol.js +2 -2
  647. package/dist/core/mcp/protocol.js.map +1 -1
  648. package/dist/core/mcp/tools.js +43 -33
  649. package/dist/core/mcp/tools.js.map +1 -1
  650. package/dist/core/openapi/baseline/gate.js +53 -12
  651. package/dist/core/openapi/baseline/gate.js.map +1 -1
  652. package/dist/core/openapi/baseline/plan.js +40 -10
  653. package/dist/core/openapi/baseline/plan.js.map +1 -1
  654. package/dist/core/openapi/baseline/record.js +0 -1
  655. package/dist/core/openapi/baseline/record.js.map +1 -1
  656. package/dist/core/openapi/contract-text.js +33 -0
  657. package/dist/core/openapi/contract-text.js.map +1 -0
  658. package/dist/core/openapi/contract-tree.js +301 -0
  659. package/dist/core/openapi/contract-tree.js.map +1 -0
  660. package/dist/core/openapi/depth.js +38 -24
  661. package/dist/core/openapi/depth.js.map +1 -1
  662. package/dist/core/openapi/digest.js +52 -2
  663. package/dist/core/openapi/digest.js.map +1 -1
  664. package/dist/core/openapi/doc.js +12 -4
  665. package/dist/core/openapi/doc.js.map +1 -1
  666. package/dist/core/openapi/merge/components.js +25 -60
  667. package/dist/core/openapi/merge/components.js.map +1 -1
  668. package/dist/core/openapi/merge/error.js +3 -13
  669. package/dist/core/openapi/merge/error.js.map +1 -1
  670. package/dist/core/openapi/merge/markers.js +26 -30
  671. package/dist/core/openapi/merge/markers.js.map +1 -1
  672. package/dist/core/openapi/merge/merge.js +28 -52
  673. package/dist/core/openapi/merge/merge.js.map +1 -1
  674. package/dist/core/openapi/merge/pin.js +17 -35
  675. package/dist/core/openapi/merge/pin.js.map +1 -1
  676. package/dist/core/openspec/decide/verdict.js.map +1 -1
  677. package/dist/core/openspec/inventory.js +4 -5
  678. package/dist/core/openspec/inventory.js.map +1 -1
  679. package/dist/core/openspec/model/mapping.js +30 -28
  680. package/dist/core/openspec/model/mapping.js.map +1 -1
  681. package/dist/core/openspec/model/model.js +12 -7
  682. package/dist/core/openspec/model/model.js.map +1 -1
  683. package/dist/core/openspec/scan/changes.js +10 -4
  684. package/dist/core/openspec/scan/changes.js.map +1 -1
  685. package/dist/core/openspec/scan/config.js +7 -16
  686. package/dist/core/openspec/scan/config.js.map +1 -1
  687. package/dist/core/openspec/scan/shape.js +63 -19
  688. package/dist/core/openspec/scan/shape.js.map +1 -1
  689. package/dist/core/openspec/scan/walk.js +21 -38
  690. package/dist/core/openspec/scan/walk.js.map +1 -1
  691. package/dist/core/pack/living.js +43 -4
  692. package/dist/core/pack/living.js.map +1 -1
  693. package/dist/core/pack/pack.js +50 -6
  694. package/dist/core/pack/pack.js.map +1 -1
  695. package/dist/core/projection/arch-slice.js +2 -2
  696. package/dist/core/projection/arch-slice.js.map +1 -1
  697. package/dist/core/projection/introduced.js +14 -0
  698. package/dist/core/projection/introduced.js.map +1 -0
  699. package/dist/core/provenance/findings.js +48 -12
  700. package/dist/core/provenance/findings.js.map +1 -1
  701. package/dist/core/provenance/git.js +33 -57
  702. package/dist/core/provenance/git.js.map +1 -1
  703. package/dist/core/provenance/gitq/moves.js +71 -114
  704. package/dist/core/provenance/gitq/moves.js.map +1 -1
  705. package/dist/core/provenance/gitq/vouched-ancestor.js +2 -2
  706. package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -1
  707. package/dist/core/provenance/sources.js +23 -6
  708. package/dist/core/provenance/sources.js.map +1 -1
  709. package/dist/core/provenance/stamp.js +5 -17
  710. package/dist/core/provenance/stamp.js.map +1 -1
  711. package/dist/core/repo/authored/paths.js +18 -0
  712. package/dist/core/repo/authored/paths.js.map +1 -1
  713. package/dist/core/repo/entries.js.map +1 -1
  714. package/dist/core/repo/paths.js +92 -6
  715. package/dist/core/repo/paths.js.map +1 -1
  716. package/dist/core/repo/repo.js +74 -14
  717. package/dist/core/repo/repo.js.map +1 -1
  718. package/dist/core/repo/tree/find.js +12 -3
  719. package/dist/core/repo/tree/find.js.map +1 -1
  720. package/dist/core/repo/tree/fs.js +27 -1
  721. package/dist/core/repo/tree/fs.js.map +1 -1
  722. package/dist/core/repo/tree/render/body.js +258 -0
  723. package/dist/core/repo/tree/render/body.js.map +1 -0
  724. package/dist/core/repo/tree/render/projects.js +182 -0
  725. package/dist/core/repo/tree/render/projects.js.map +1 -0
  726. package/dist/core/repo/tree/render/service/header.js +125 -0
  727. package/dist/core/repo/tree/render/service/header.js.map +1 -0
  728. package/dist/core/repo/tree/render/service/peers.js +28 -0
  729. package/dist/core/repo/tree/render/service/peers.js.map +1 -0
  730. package/dist/core/repo/tree/render/service/view-id.js +67 -0
  731. package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
  732. package/dist/core/repo/tree/render/service/views.js +78 -0
  733. package/dist/core/repo/tree/render/service/views.js.map +1 -0
  734. package/dist/core/repo/tree/render/stale.js +42 -0
  735. package/dist/core/repo/tree/render/stale.js.map +1 -0
  736. package/dist/core/repo/tree/render/text.js +84 -0
  737. package/dist/core/repo/tree/render/text.js.map +1 -0
  738. package/dist/core/repo/tree/render/views.js +293 -0
  739. package/dist/core/repo/tree/render/views.js.map +1 -0
  740. package/dist/core/repo/tree/walk.js +53 -32
  741. package/dist/core/repo/tree/walk.js.map +1 -1
  742. package/dist/core/results.js +47 -12
  743. package/dist/core/results.js.map +1 -1
  744. package/dist/core/scaffold/landscape.js +121 -13
  745. package/dist/core/scaffold/landscape.js.map +1 -1
  746. package/dist/core/scaffold/legacy.js +271 -0
  747. package/dist/core/scaffold/legacy.js.map +1 -0
  748. package/dist/core/staging/commit.js +26 -15
  749. package/dist/core/staging/commit.js.map +1 -1
  750. package/dist/core/staging/lock.js +74 -12
  751. package/dist/core/staging/lock.js.map +1 -1
  752. package/dist/core/staging/recovery/intent.js +2 -5
  753. package/dist/core/staging/recovery/intent.js.map +1 -1
  754. package/dist/core/staging/recovery/recover.js +84 -6
  755. package/dist/core/staging/recovery/recover.js.map +1 -1
  756. package/dist/core/staging/snapshot/manifest.js +188 -0
  757. package/dist/core/staging/snapshot/manifest.js.map +1 -0
  758. package/dist/core/staging/{snapshot.js → snapshot/snapshot.js} +39 -45
  759. package/dist/core/staging/snapshot/snapshot.js.map +1 -0
  760. package/dist/core/staging/txn/forward.js +24 -14
  761. package/dist/core/staging/txn/forward.js.map +1 -1
  762. package/dist/core/staging/writes.js.map +1 -1
  763. package/dist/core/status/actions/execution.js +11 -0
  764. package/dist/core/status/actions/execution.js.map +1 -1
  765. package/dist/core/status/contracts.js +39 -15
  766. package/dist/core/status/contracts.js.map +1 -1
  767. package/dist/core/status/feature/artifacts.js +33 -8
  768. package/dist/core/status/feature/artifacts.js.map +1 -1
  769. package/dist/core/status/feature/feature.js +24 -17
  770. package/dist/core/status/feature/feature.js.map +1 -1
  771. package/dist/core/status/feature/next.js +20 -7
  772. package/dist/core/status/feature/next.js.map +1 -1
  773. package/dist/core/status/feature/words.js +96 -0
  774. package/dist/core/status/feature/words.js.map +1 -0
  775. package/dist/core/status/fleet/fleet.js +43 -14
  776. package/dist/core/status/fleet/fleet.js.map +1 -1
  777. package/dist/core/status/fleet/next.js +153 -58
  778. package/dist/core/status/fleet/next.js.map +1 -1
  779. package/dist/core/status/report.js.map +1 -1
  780. package/dist/core/status/scan.js.map +1 -1
  781. package/dist/core/status/verification.js +30 -15
  782. package/dist/core/status/verification.js.map +1 -1
  783. package/dist/core/tasks/packet.js +199 -0
  784. package/dist/core/tasks/packet.js.map +1 -0
  785. package/dist/core/tasks/record.js +43 -0
  786. package/dist/core/tasks/record.js.map +1 -0
  787. package/dist/core/tasks/sources.js +181 -0
  788. package/dist/core/tasks/sources.js.map +1 -0
  789. package/dist/core/tasks/stamps.js +76 -0
  790. package/dist/core/tasks/stamps.js.map +1 -0
  791. package/dist/core/tasks/unit.js +0 -0
  792. package/dist/core/tasks/unit.js.map +1 -0
  793. package/dist/core/usecases/capability.js +11 -14
  794. package/dist/core/usecases/capability.js.map +1 -1
  795. package/dist/core/usecases/delta/claims.js +31 -7
  796. package/dist/core/usecases/delta/claims.js.map +1 -1
  797. package/dist/core/usecases/delta/flows.js +5 -7
  798. package/dist/core/usecases/delta/flows.js.map +1 -1
  799. package/dist/core/usecases/delta/modified.js +315 -0
  800. package/dist/core/usecases/delta/modified.js.map +1 -0
  801. package/dist/core/usecases/delta/overlay.js +32 -191
  802. package/dist/core/usecases/delta/overlay.js.map +1 -1
  803. package/dist/core/usecases/fleet.js +195 -36
  804. package/dist/core/usecases/fleet.js.map +1 -1
  805. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/capability-tag.js +8 -9
  806. package/dist/core/usecases/grade/capability-tag.js.map +1 -0
  807. package/dist/core/usecases/grade/feature.js +88 -0
  808. package/dist/core/usecases/grade/feature.js.map +1 -0
  809. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/requirement-tag.js +3 -4
  810. package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
  811. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/steps.js +102 -33
  812. package/dist/core/usecases/grade/steps.js.map +1 -0
  813. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/usecases.js +23 -10
  814. package/dist/core/usecases/grade/usecases.js.map +1 -0
  815. package/dist/core/usecases/operations.js +26 -14
  816. package/dist/core/usecases/operations.js.map +1 -1
  817. package/dist/core/usecases/place.js.map +1 -1
  818. package/dist/core/usecases/service/exclude.js +119 -0
  819. package/dist/core/usecases/service/exclude.js.map +1 -0
  820. package/dist/core/usecases/service/flows.js +164 -0
  821. package/dist/core/usecases/service/flows.js.map +1 -0
  822. package/dist/core/usecases/suites/participants.js +83 -0
  823. package/dist/core/usecases/suites/participants.js.map +1 -0
  824. package/dist/core/usecases/suites/suites.js +45 -0
  825. package/dist/core/usecases/suites/suites.js.map +1 -0
  826. package/dist/core/verify/answers.js +12 -5
  827. package/dist/core/verify/answers.js.map +1 -1
  828. package/dist/core/verify/build.js +102 -82
  829. package/dist/core/verify/build.js.map +1 -1
  830. package/dist/core/verify/checklist.js +70 -12
  831. package/dist/core/verify/checklist.js.map +1 -1
  832. package/dist/core/verify/location.js +67 -0
  833. package/dist/core/verify/location.js.map +1 -0
  834. package/dist/core/verify/pins/lint.js +3 -2
  835. package/dist/core/verify/pins/lint.js.map +1 -1
  836. package/dist/core/verify/pins/pin.js +1 -1
  837. package/dist/core/verify/pins/pin.js.map +1 -1
  838. package/dist/core/verify/read/file.js +224 -0
  839. package/dist/core/verify/read/file.js.map +1 -0
  840. package/dist/core/verify/{file.js → read/shape.js} +16 -104
  841. package/dist/core/verify/read/shape.js.map +1 -0
  842. package/dist/core/verify/read/union.js +105 -0
  843. package/dist/core/verify/read/union.js.map +1 -0
  844. package/dist/core/verify/record.js +35 -12
  845. package/dist/core/verify/record.js.map +1 -1
  846. package/dist/core/verify/store/commit.js +40 -30
  847. package/dist/core/verify/store/commit.js.map +1 -1
  848. package/dist/core/verify/store/render.js +8 -4
  849. package/dist/core/verify/store/render.js.map +1 -1
  850. package/dist/core/vocabulary/issue.js +4 -0
  851. package/dist/core/vocabulary/issue.js.map +1 -1
  852. package/dist/core/vocabulary/maturity.js +75 -4
  853. package/dist/core/vocabulary/maturity.js.map +1 -1
  854. package/dist/core/vocabulary/report.js +16 -1
  855. package/dist/core/vocabulary/report.js.map +1 -1
  856. package/examples/README.md +54 -11
  857. package/examples/docs/architecture/landscape.likec4 +62 -6
  858. package/examples/docs/architecture/services.likec4 +70 -0
  859. package/examples/docs/architecture/subsystems.likec4 +7 -0
  860. package/examples/docs/architecture/usecases/order-notification.likec4 +16 -7
  861. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +11 -8
  862. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +6 -6
  863. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +4 -1
  864. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +13 -10
  865. package/examples/docs/likec4.config.json +0 -1
  866. package/examples/docs/services/checkout-web/model.likec4 +39 -56
  867. package/examples/docs/services/order-service/arch.spec.md +13 -6
  868. package/examples/docs/services/order-service/asyncapi.yaml +3 -2
  869. package/examples/docs/services/order-service/model.likec4 +58 -70
  870. package/examples/docs/services/payment-service/arch.spec.md +7 -4
  871. package/examples/docs/services/payment-service/model.likec4 +38 -37
  872. package/examples/docs/services/platform/identity-service/arch.spec.md +7 -4
  873. package/examples/docs/services/platform/identity-service/model.likec4 +35 -37
  874. package/examples/docs/services/platform/notification-service/asyncapi.yaml +2 -1
  875. package/examples/docs/services/platform/notification-service/health.yaml +8 -3
  876. package/examples/docs/services/platform/notification-service/model.likec4 +43 -64
  877. package/package.json +1 -1
  878. package/dist/commands/validate/checks/vocabulary.js +0 -31
  879. package/dist/commands/validate/checks/vocabulary.js.map +0 -1
  880. package/dist/commands/validate/fleet/usecases/capability-tag.js.map +0 -1
  881. package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +0 -1
  882. package/dist/commands/validate/fleet/usecases/steps.js.map +0 -1
  883. package/dist/commands/validate/fleet/usecases/usecases.js.map +0 -1
  884. package/dist/core/agent/agents-md/artifacts.js +0 -220
  885. package/dist/core/agent/agents-md/artifacts.js.map +0 -1
  886. package/dist/core/agent/agents-md/cycle.js +0 -165
  887. package/dist/core/agent/agents-md/cycle.js.map +0 -1
  888. package/dist/core/agent/agents-md/shipped/archive-gate.js +0 -98
  889. package/dist/core/agent/agents-md/shipped/archive-gate.js.map +0 -1
  890. package/dist/core/agent/agents-md/spine.js +0 -40
  891. package/dist/core/agent/agents-md/spine.js.map +0 -1
  892. package/dist/core/coherence/events/merged.js +0 -40
  893. package/dist/core/coherence/events/merged.js.map +0 -1
  894. package/dist/core/diff/current-state.js +0 -96
  895. package/dist/core/diff/current-state.js.map +0 -1
  896. package/dist/core/diff/victims.js +0 -247
  897. package/dist/core/diff/victims.js.map +0 -1
  898. package/dist/core/repo/tree/views.js +0 -172
  899. package/dist/core/repo/tree/views.js.map +0 -1
  900. package/dist/core/staging/snapshot.js.map +0 -1
  901. package/dist/core/verify/file.js.map +0 -1
@@ -0,0 +1,315 @@
1
+ /**
2
+ * The LIVING flows whose `#req-` tag claims a requirement this feature changes:
3
+ * `usecase.requirement-modified` for one it rewrites, and
4
+ * `usecase.requirement-unresolved` for one it takes away.
5
+ *
6
+ * THE HOLE. A `#req-` tag joins a flow to one named promise, and the join is by
7
+ * id. A MODIFIED requirement keeps its id and replaces its whole text, so after
8
+ * the archive the tag still resolves, every grade of the flow stays green — and
9
+ * the flow can be drawing exactly the behaviour the new wording forbids: an
10
+ * event path the requirement now says is gone, a hop through a service it no
11
+ * longer names. Nothing in loam reads a flow's MEANING, so nothing can say
12
+ * whether the drawing still keeps the promise. What loam can say is that the
13
+ * promise moved under it, and it said nothing.
14
+ *
15
+ * A WARNING, AND IT NEVER GATES. Rewording a promise a flow keeps is ordinary;
16
+ * the flow may well still keep it. This names each flow and the requirement, so
17
+ * the author reads one against the other while the feature is still open — and
18
+ * redraws the flow in the same change where it no longer holds.
19
+ *
20
+ * A REMOVAL IS THE FLEET'S OWN ERROR, ONE ARCHIVE EARLY. The merge deletes the
21
+ * promise and leaves the tag, so the very next `validate --all` reports the flow
22
+ * `usecase.requirement-unresolved` — while the feature gate had said nothing and
23
+ * the archive had exited 0 (the real-fleet review, 2026-10-21). That grade holds
24
+ * no judgement about the drawing: the tag resolves to nothing, whatever the flow
25
+ * shows. So it is raised here under the SAME code, at the same severity, with
26
+ * the VIEW as its subject as at fleet altitude — the fleet's grade predicted,
27
+ * not a second opinion beside it — and as an error it gates the archive.
28
+ * `--approve` may walk past it, for `capability.remove-requirement-realized`'s
29
+ * reason one carrier over: retiring a promise something still claims is the
30
+ * author's call about the feature, loam reads the flow perfectly well (this is
31
+ * no `usecase.flow-invalid` blindness), and the living docs then carry exactly
32
+ * the error this named.
33
+ *
34
+ * GRADED AGAINST WHAT THE MERGE LEAVES, not against the REMOVED list. Each
35
+ * document's after-side is the merge's own fold (`applyRequirementDelta`), so a
36
+ * removal the same delta re-spells under an id that flattens to the same tag
37
+ * leaves the tag resolving and earns nothing, exactly as the fleet will grade
38
+ * it. The same verdict is asked of a MODIFIED: it keeps its id, but
39
+ * an id this feature adds beside it may flatten to the same tag, and then the
40
+ * merge breaks the tag too — the error, not the warning, whose "the tag will
41
+ * still resolve" would be false. And only a claim that resolves TODAY is asked
42
+ * about: one that is already broken is `validate --all`'s finding now, and
43
+ * reporting it again here would be one mistake counted twice.
44
+ *
45
+ * TWO ALTITUDES, TWO SCOPES — the ones `validate --all` resolves the tag with.
46
+ * A flow in `architecture/` keeps a BUSINESS promise: its `#req-` tag is scoped
47
+ * by its `#cap-` tag to a capability document (`core/capabilities/usecase-join.ts`),
48
+ * so it is asked about the capability requirements this feature changes. A
49
+ * flow beside a service's model keeps that SERVICE's promise: its `#req-` tag is
50
+ * scoped by the directory to the ids of that service's spec.md and arch.spec.md
51
+ * (`commands/validate/service/usecases/tags.ts`), so it is asked about the
52
+ * service requirements this feature changes there — and only the services the
53
+ * feature's `specs/` touch can hold one. BOTH documents are that scope, so the
54
+ * one a touched service carries no delta for is read as it stands: without it
55
+ * an id the other document also declares would read as gone after the merge,
56
+ * and gate an archive the fleet then grades green. The feature's own
57
+ * `usecases/` are not living and are graded against the new text already
58
+ * (`../grade/feature.ts`).
59
+ *
60
+ * WHAT IT COSTS. Nothing, for a feature that modifies and removes no
61
+ * requirement — which is nearly every feature, and the caller does not call
62
+ * this then. For one that does, a byte scan for the tag's own spelling
63
+ * (`req-<slug>`) over the documents that could declare it, the living document
64
+ * of a touched service's other axis, and a LikeC4 load only for a project one
65
+ * of them is in: a tag name is one token, so a document without its characters
66
+ * cannot carry it. A project that does not parse is skipped, not reported —
67
+ * `validate --all` owns that answer (`usecase.flow-invalid`, `landscape.invalid`),
68
+ * and a finding about one requirement must not become a second report of a
69
+ * broken map.
70
+ */
71
+ import { existsSync } from "node:fs";
72
+ import { readFile } from "node:fs/promises";
73
+ import { join, relative } from "node:path";
74
+ import { REQ_TAG_PREFIX, resolveCapabilityTags, resolveRequirementTags, tagSlug, } from "../../capabilities/usecase-join.js";
75
+ import { gradableCapabilityIds } from "../../capabilities/findings.js";
76
+ import { architectureDocuments } from "../../c4/project/documents.js";
77
+ import { architectureProjectDocuments } from "../../c4/project/architecture.js";
78
+ import { applyRequirementDelta, replacementsOf } from "../../document/apply.js";
79
+ import { SPEC_AXES } from "../../repo/paths.js";
80
+ import { compareIds } from "../../repo/entries.js";
81
+ import { useCasesIn } from "../fleet.js";
82
+ import { viewFile } from "../place.js";
83
+ import { readServiceFlows } from "../service/flows.js";
84
+ export async function changedPromiseFlowIssues(req) {
85
+ const tables = {
86
+ capability: tableOf(req.capabilities),
87
+ service: tableOf(await withUntouchedAxes(req)),
88
+ };
89
+ const flows = [
90
+ ...(await fleetFlows(req, changedIds(tables.capability))),
91
+ ...(await serviceFlows(req, changedIds(tables.service))),
92
+ ];
93
+ const issues = [];
94
+ for (const flow of flows.sort((a, b) => compareIds(a.file, b.file) || compareIds(a.view.id, b.view.id))) {
95
+ const table = tables[flow.altitude];
96
+ const after = new Map(resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.merged.get(id)).map((c) => [c.tag, c]));
97
+ for (const claim of resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.living.get(id))) {
98
+ if (claim.kind !== "resolved")
99
+ continue;
100
+ const change = changeOf(table, claim);
101
+ if (change === null)
102
+ continue;
103
+ // The merge's verdict first, for either change: a MODIFIED keeps its id,
104
+ // but an id this feature adds beside it can flatten to the same tag, and
105
+ // then the warning's "the tag will still resolve" would be false.
106
+ const later = after.get(claim.tag);
107
+ if (later !== undefined && later.kind !== "resolved")
108
+ issues.push(brokenIssue(flow, claim, { change, later }));
109
+ else if (change === "MODIFIES")
110
+ issues.push(modifiedIssue(flow, claim));
111
+ }
112
+ }
113
+ return issues;
114
+ }
115
+ function changeOf(table, claim) {
116
+ if (table.modified.get(claim.capability)?.has(claim.id) === true)
117
+ return "MODIFIES";
118
+ return table.removed.get(claim.capability)?.has(claim.id) === true ? "REMOVES" : null;
119
+ }
120
+ function whose(flow, claim) {
121
+ return flow.altitude === "capability" ? `${claim.capability}#${claim.id}` : `${claim.capability}'s requirement ${claim.id}`;
122
+ }
123
+ function modifiedIssue(flow, claim) {
124
+ return {
125
+ severity: "warn",
126
+ code: "usecase.requirement-modified",
127
+ subject: claim.capability,
128
+ message: `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature MODIFIES. ` +
129
+ `The tag will still resolve after the archive and nothing grades what the flow draws against the new ` +
130
+ `wording: read the flow against the replacement, and redraw it in this change if it no longer keeps the promise.`,
131
+ locations: [{ path: flow.file, role: "primary" }],
132
+ };
133
+ }
134
+ /**
135
+ * The tag the merge breaks. Two ways, and each has its own fix: a removal
136
+ * leaves nothing the tag names, and an id this feature adds can flatten to the
137
+ * same tag as the one it claims — the only way a MODIFIED, which keeps its id,
138
+ * can break it at all.
139
+ */
140
+ function brokenIssue(flow, claim, broken) {
141
+ const { change, later } = broken;
142
+ const [why, fix] = later.kind === "many"
143
+ ? [
144
+ `${later.ids.length} requirements will flatten to '${later.slug}' (${later.ids.join(", ")}), so nothing in the tag can say which promise the flow keeps`,
145
+ "rename one of the colliding ids in this change",
146
+ ]
147
+ : [
148
+ "nothing it names is left",
149
+ "drop the tag (or point it at the promise that replaces this one) in this change, or MODIFY the requirement instead of removing it",
150
+ ];
151
+ return {
152
+ severity: "error",
153
+ code: "usecase.requirement-unresolved",
154
+ // The VIEW, as `validate --all` names it once the archive lands — so the
155
+ // prediction and the outcome are about one thing a reader opens.
156
+ subject: flow.view.id,
157
+ message: `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature ${change}. ` +
158
+ `After the archive the tag no longer resolves — ${why} — and \`loam validate --all\` reports this flow with this ` +
159
+ `same error: ${fix}.`,
160
+ locations: [{ path: flow.file, role: "primary" }],
161
+ };
162
+ }
163
+ /**
164
+ * Each document's table rows. The modified and removed ids are named by the id
165
+ * the LIVING document gives them — selected by `replacementsOf`, the merge's own
166
+ * walk, so a MODIFIED or REMOVED written by heading alone still names the id a
167
+ * tag carries — and the after-side is that same merge's result. A document the
168
+ * merge would refuse keeps its living ids on both sides and changes nothing:
169
+ * the delta gate reports it, and nothing here has a true thing to say about a
170
+ * merge that cannot happen.
171
+ *
172
+ * TODAY'S side leaves out a living requirement sitting under a REMOVED heading,
173
+ * as both fleet indexes do (`capabilityRequirementIndex`, `requirementIdsOf`):
174
+ * a tag resolving only through one is already the fleet's error. The fold
175
+ * still runs on the whole living list, because that is the archive's input.
176
+ */
177
+ function tableOf(docs) {
178
+ const table = { living: new Map(), merged: new Map(), modified: new Map(), removed: new Map() };
179
+ for (const doc of docs) {
180
+ const living = doc.living.filter((r) => r.kind !== "REMOVED");
181
+ let fold;
182
+ try {
183
+ fold = { replaced: replacementsOf([...doc.living], [...doc.reqs]), merged: applyRequirementDelta([...doc.living], [...doc.reqs]) };
184
+ }
185
+ catch {
186
+ fold = { replaced: [], merged: living };
187
+ }
188
+ idsInto(table.living, doc.id, living);
189
+ idsInto(table.merged, doc.id, fold.merged);
190
+ for (const r of fold.replaced) {
191
+ if (r.living.id === undefined || (r.kind !== "MODIFIED" && r.kind !== "REMOVED"))
192
+ continue;
193
+ const into = r.kind === "MODIFIED" ? table.modified : table.removed;
194
+ into.set(doc.id, (into.get(doc.id) ?? new Set()).add(r.living.id));
195
+ }
196
+ }
197
+ return table;
198
+ }
199
+ /** A document's ids, unioned into its row — created even when empty, which is the `empty` arm's answer rather than `undocumented`'s. */
200
+ function idsInto(rows, id, reqs) {
201
+ const ids = rows.get(id) ?? new Set();
202
+ for (const r of reqs)
203
+ if (r.id !== undefined)
204
+ ids.add(r.id);
205
+ rows.set(id, ids);
206
+ }
207
+ /** The ids each document's delta modifies or removes — what a flow has to mention to be asked about at all. */
208
+ function changedIds(table) {
209
+ const out = new Map();
210
+ for (const rows of [table.modified, table.removed]) {
211
+ for (const [id, ids] of rows)
212
+ out.set(id, new Set([...(out.get(id) ?? []), ...ids]));
213
+ }
214
+ return out;
215
+ }
216
+ /**
217
+ * The service pairs, plus — for each service whose delta modifies or removes
218
+ * something — every document of it the feature carries no delta for, as it
219
+ * stands (`reqs: []`, so it changes nothing and only widens both sides).
220
+ * `requirementIdsOf` (`commands/validate/service/usecases/usecases.ts`) reads
221
+ * both documents for a service-local tag, skipping a requirement under a
222
+ * REMOVED heading; so must this, or a tag the untouched document keeps
223
+ * resolving reads as broken — and one only a REMOVED entry there answers reads
224
+ * as kept, though the archive leaves that document as it is.
225
+ */
226
+ async function withUntouchedAxes(req) {
227
+ const out = [...req.services];
228
+ const asked = new Set();
229
+ // Sequential, and it costs nothing worth racing: a feature names a handful of
230
+ // services, each read is one memoised document, and most services here
231
+ // already have both axes in the feature or no second document at all.
232
+ for (const pair of req.services) {
233
+ const own = req.services.filter((p) => p.id === pair.id);
234
+ if (asked.has(pair.id) || !own.some((p) => p.reqs.some((r) => r.kind === "MODIFIED" || r.kind === "REMOVED")))
235
+ continue;
236
+ asked.add(pair.id);
237
+ const paths = await pair.paths();
238
+ for (const axis of SPEC_AXES) {
239
+ if (own.some((p) => p.axis === axis.key) || !existsSync(paths[axis.key]))
240
+ continue;
241
+ const living = (await req.readRequirements(paths[axis.key])).filter((r) => r.kind !== "REMOVED");
242
+ out.push({ id: pair.id, reqs: [], living });
243
+ }
244
+ }
245
+ return out;
246
+ }
247
+ /** The tag spellings that could claim one of these ids. */
248
+ function needlesFor(changed) {
249
+ return [...new Set([...changed.values()].flatMap((ids) => [...ids].map((id) => `${REQ_TAG_PREFIX}${tagSlug(id)}`)))];
250
+ }
251
+ /** Does any of these documents contain one of the tag spellings at all? Unreadable fails closed, as `../fleet.ts`'s gate does. */
252
+ async function mentions(paths, needles) {
253
+ for (const path of paths) {
254
+ try {
255
+ const text = (await readFile(path)).toString("latin1");
256
+ if (needles.some((needle) => text.includes(needle)))
257
+ return true;
258
+ }
259
+ catch {
260
+ return true;
261
+ }
262
+ }
263
+ return false;
264
+ }
265
+ async function fleetFlows(req, changed) {
266
+ // The vocabulary ladder (`core/capabilities/findings.ts`): with nothing
267
+ // declared no `#cap-` tag resolves, so no fleet flow can be said to claim anything.
268
+ const declared = gradableCapabilityIds(req.vocabulary);
269
+ if (changed.size === 0 || declared === null)
270
+ return [];
271
+ if (!(await mentions(await architectureProjectDocuments(req.docsDir), needlesFor(changed))))
272
+ return [];
273
+ const read = useCasesIn(await req.architecture(), req.known);
274
+ if (read.kind !== "read")
275
+ return [];
276
+ return read.views.map((view) => ({
277
+ view,
278
+ file: viewFile(view),
279
+ scope: resolveCapabilityTags(view.tags, declared).flatMap((c) => (c.kind === "resolved" ? [c.id] : [])),
280
+ altitude: "capability",
281
+ }));
282
+ }
283
+ async function serviceFlows(req, changed) {
284
+ const out = [];
285
+ for (const [service, ids] of changed) {
286
+ // Sequential on purpose, for `../fleet.ts`'s gate's reason: nearly every
287
+ // service answers from one readdir and a byte scan, and the rare one that
288
+ // opens a workspace should not be raced by the ones that do not need one.
289
+ const pair = req.services.find((doc) => doc.id === service);
290
+ if (pair === undefined)
291
+ continue;
292
+ const paths = await pair.paths();
293
+ if (!(await mentions(await architectureDocuments(paths.dir), needlesFor(new Map([[service, ids]])))))
294
+ continue;
295
+ const model = await req.serviceModel(paths);
296
+ if (model.mapUnreadable || model.doc.errors.length > 0)
297
+ continue;
298
+ const flows = await readServiceFlows({
299
+ paths,
300
+ model: model.doc,
301
+ known: req.known,
302
+ ...(model.shape === "extending" && model.project !== null
303
+ ? { extending: { docsDir: req.docsDir, project: model.project } }
304
+ : {}),
305
+ });
306
+ if (flows.kind !== "read")
307
+ continue;
308
+ for (const view of flows.views) {
309
+ const file = relative(req.docsDir, join(paths.dir, view.sourcePath ?? "model.likec4")).split(/[\\/]/).join("/");
310
+ out.push({ view, file, scope: [service], altitude: "service" });
311
+ }
312
+ }
313
+ return out;
314
+ }
315
+ //# sourceMappingURL=modified.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modified.js","sourceRoot":"","sources":["../../../../src/core/usecases/delta/modified.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The LIVING flows whose `#req-` tag claims a requirement this feature changes:\n * `usecase.requirement-modified` for one it rewrites, and\n * `usecase.requirement-unresolved` for one it takes away.\n *\n * THE HOLE. A `#req-` tag joins a flow to one named promise, and the join is by\n * id. A MODIFIED requirement keeps its id and replaces its whole text, so after\n * the archive the tag still resolves, every grade of the flow stays green — and\n * the flow can be drawing exactly the behaviour the new wording forbids: an\n * event path the requirement now says is gone, a hop through a service it no\n * longer names. Nothing in loam reads a flow's MEANING, so nothing can say\n * whether the drawing still keeps the promise. What loam can say is that the\n * promise moved under it, and it said nothing.\n *\n * A WARNING, AND IT NEVER GATES. Rewording a promise a flow keeps is ordinary;\n * the flow may well still keep it. This names each flow and the requirement, so\n * the author reads one against the other while the feature is still open — and\n * redraws the flow in the same change where it no longer holds.\n *\n * A REMOVAL IS THE FLEET'S OWN ERROR, ONE ARCHIVE EARLY. The merge deletes the\n * promise and leaves the tag, so the very next `validate --all` reports the flow\n * `usecase.requirement-unresolved` — while the feature gate had said nothing and\n * the archive had exited 0 (the real-fleet review, 2026-10-21). That grade holds\n * no judgement about the drawing: the tag resolves to nothing, whatever the flow\n * shows. So it is raised here under the SAME code, at the same severity, with\n * the VIEW as its subject as at fleet altitude — the fleet's grade predicted,\n * not a second opinion beside it — and as an error it gates the archive.\n * `--approve` may walk past it, for `capability.remove-requirement-realized`'s\n * reason one carrier over: retiring a promise something still claims is the\n * author's call about the feature, loam reads the flow perfectly well (this is\n * no `usecase.flow-invalid` blindness), and the living docs then carry exactly\n * the error this named.\n *\n * GRADED AGAINST WHAT THE MERGE LEAVES, not against the REMOVED list. Each\n * document's after-side is the merge's own fold (`applyRequirementDelta`), so a\n * removal the same delta re-spells under an id that flattens to the same tag\n * leaves the tag resolving and earns nothing, exactly as the fleet will grade\n * it. The same verdict is asked of a MODIFIED: it keeps its id, but\n * an id this feature adds beside it may flatten to the same tag, and then the\n * merge breaks the tag too — the error, not the warning, whose \"the tag will\n * still resolve\" would be false. And only a claim that resolves TODAY is asked\n * about: one that is already broken is `validate --all`'s finding now, and\n * reporting it again here would be one mistake counted twice.\n *\n * TWO ALTITUDES, TWO SCOPES — the ones `validate --all` resolves the tag with.\n * A flow in `architecture/` keeps a BUSINESS promise: its `#req-` tag is scoped\n * by its `#cap-` tag to a capability document (`core/capabilities/usecase-join.ts`),\n * so it is asked about the capability requirements this feature changes. A\n * flow beside a service's model keeps that SERVICE's promise: its `#req-` tag is\n * scoped by the directory to the ids of that service's spec.md and arch.spec.md\n * (`commands/validate/service/usecases/tags.ts`), so it is asked about the\n * service requirements this feature changes there — and only the services the\n * feature's `specs/` touch can hold one. BOTH documents are that scope, so the\n * one a touched service carries no delta for is read as it stands: without it\n * an id the other document also declares would read as gone after the merge,\n * and gate an archive the fleet then grades green. The feature's own\n * `usecases/` are not living and are graded against the new text already\n * (`../grade/feature.ts`).\n *\n * WHAT IT COSTS. Nothing, for a feature that modifies and removes no\n * requirement — which is nearly every feature, and the caller does not call\n * this then. For one that does, a byte scan for the tag's own spelling\n * (`req-<slug>`) over the documents that could declare it, the living document\n * of a touched service's other axis, and a LikeC4 load only for a project one\n * of them is in: a tag name is one token, so a document without its characters\n * cannot carry it. A project that does not parse is skipped, not reported —\n * `validate --all` owns that answer (`usecase.flow-invalid`, `landscape.invalid`),\n * and a finding about one requirement must not become a second report of a\n * broken map.\n */\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport {\n REQ_TAG_PREFIX,\n resolveCapabilityTags,\n resolveRequirementTags,\n tagSlug,\n type RequirementClaim,\n} from \"../../capabilities/usecase-join.js\";\nimport { gradableCapabilityIds } from \"../../capabilities/findings.js\";\nimport type { CapabilityVocabulary } from \"../../capabilities/capabilities.js\";\nimport type { CapabilityDeltaDoc } from \"../../capabilities/delta/uncovered.js\";\nimport { architectureDocuments } from \"../../c4/project/documents.js\";\nimport { architectureProjectDocuments } from \"../../c4/project/architecture.js\";\nimport type { ParsedView } from \"../../c4/parsed/dynamic-views.js\";\nimport type { LoadedDoc } from \"../../c4/likec4.js\";\nimport type { ServiceModel } from \"../../c4/service-model/load.js\";\nimport { applyRequirementDelta, replacementsOf, type Replacement } from \"../../document/apply.js\";\nimport type { Requirement } from \"../../document/spec.js\";\nimport type { DocsDir } from \"../../kernel/ids/dirs.js\";\nimport { SPEC_AXES, type ServicePaths, type SpecAxis } from \"../../repo/paths.js\";\nimport { compareIds } from \"../../repo/entries.js\";\nimport type { Issue } from \"../../vocabulary/issue.js\";\nimport { useCasesIn } from \"../fleet.js\";\nimport { viewFile } from \"../place.js\";\nimport { readServiceFlows } from \"../service/flows.js\";\n\n/** One delta document beside the living one it merges into — a capability's, or one spec axis of a service. */\nexport interface DeltaPair {\n /** The capability id, or the service id. */\n id: string;\n reqs: readonly Requirement[];\n living: readonly Requirement[];\n}\n\n/** One spec axis of a service the feature touches, and where that service lives — asked only for one whose delta changes something. */\nexport interface ServiceDeltaPair extends DeltaPair {\n /** Which of the service's two documents this is: the other is read as it stands when the feature carries no delta for it. */\n axis: SpecAxis[\"key\"];\n paths: () => Promise<ServicePaths>;\n}\n\nexport interface ChangedPromiseRequest {\n docsDir: DocsDir;\n /** The feature's capability deltas — what an `architecture/` flow's tag is asked about. */\n capabilities: readonly CapabilityDeltaDoc[];\n /** The feature's service deltas, one entry per spec axis — what a service's own flow is asked about. */\n services: readonly ServiceDeltaPair[];\n /** The capability vocabulary a `#cap-` tag resolves against. */\n vocabulary: CapabilityVocabulary;\n /** The enumerated fleet, for the element→service resolver's reason (`../fleet.ts`). */\n known: ReadonlySet<string>;\n /**\n * A service's model, read the way its shape demands. Injected for\n * `./overlay.ts`'s reason: a memoised read does not justify an edge from\n * `core/usecases/` to `fleet-context`.\n */\n serviceModel: (paths: ServicePaths) => Promise<ServiceModel>;\n /**\n * The `architecture/` project, as the invocation already holds it — the\n * same injection, for the same reason: `validate --all` and `status` run this\n * walk once per active feature, and a fresh load per feature is a LikeC4\n * workspace each.\n */\n architecture: () => Promise<LoadedDoc>;\n /** A living requirements document, parsed — a touched service's axis the feature carries no delta for. Injected for the same reason again. */\n readRequirements: (path: string) => Promise<Requirement[]>;\n}\n\n/** One living flow, located, and the scope its `#req-` tag resolves in. */\ninterface LivingFlow {\n view: ParsedView;\n /** The repo-relative file a reader opens. */\n file: string;\n /** The capability ids its own `#cap-` tags resolve to, or — beside a model — its service alone. */\n scope: string[];\n /** Which of the two scopes `scope` is in: a capability id and a service id may be spelled alike. */\n altitude: Altitude;\n}\n\ntype Altitude = \"capability\" | \"service\";\n\ntype Resolved = Extract<RequirementClaim, { kind: \"resolved\" }>;\n\n/**\n * Per document id — a capability, or a service's two axes together, the one\n * set its directory-scoped tag is read against — the ids a tag resolves\n * against today and after the merge, and which living ids this feature\n * rewrites or retires.\n */\ninterface Table {\n living: Map<string, Set<string>>;\n merged: Map<string, Set<string>>;\n modified: Map<string, Set<string>>;\n removed: Map<string, Set<string>>;\n}\n\nexport async function changedPromiseFlowIssues(req: ChangedPromiseRequest): Promise<Issue[]> {\n const tables: Record<Altitude, Table> = {\n capability: tableOf(req.capabilities),\n service: tableOf(await withUntouchedAxes(req)),\n };\n const flows = [\n ...(await fleetFlows(req, changedIds(tables.capability))),\n ...(await serviceFlows(req, changedIds(tables.service))),\n ];\n const issues: Issue[] = [];\n for (const flow of flows.sort((a, b) => compareIds(a.file, b.file) || compareIds(a.view.id, b.view.id))) {\n const table = tables[flow.altitude];\n const after = new Map(resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.merged.get(id)).map((c) => [c.tag, c]));\n for (const claim of resolveRequirementTags(flow.view.tags, flow.scope, (id) => table.living.get(id))) {\n if (claim.kind !== \"resolved\") continue;\n const change = changeOf(table, claim);\n if (change === null) continue;\n // The merge's verdict first, for either change: a MODIFIED keeps its id,\n // but an id this feature adds beside it can flatten to the same tag, and\n // then the warning's \"the tag will still resolve\" would be false.\n const later = after.get(claim.tag);\n if (later !== undefined && later.kind !== \"resolved\") issues.push(brokenIssue(flow, claim, { change, later }));\n else if (change === \"MODIFIES\") issues.push(modifiedIssue(flow, claim));\n }\n }\n return issues;\n}\n\nfunction changeOf(table: Table, claim: Resolved): \"MODIFIES\" | \"REMOVES\" | null {\n if (table.modified.get(claim.capability)?.has(claim.id) === true) return \"MODIFIES\";\n return table.removed.get(claim.capability)?.has(claim.id) === true ? \"REMOVES\" : null;\n}\n\nfunction whose(flow: LivingFlow, claim: Resolved): string {\n return flow.altitude === \"capability\" ? `${claim.capability}#${claim.id}` : `${claim.capability}'s requirement ${claim.id}`;\n}\n\nfunction modifiedIssue(flow: LivingFlow, claim: Resolved): Issue {\n return {\n severity: \"warn\",\n code: \"usecase.requirement-modified\",\n subject: claim.capability,\n message:\n `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature MODIFIES. ` +\n `The tag will still resolve after the archive and nothing grades what the flow draws against the new ` +\n `wording: read the flow against the replacement, and redraw it in this change if it no longer keeps the promise.`,\n locations: [{ path: flow.file, role: \"primary\" }],\n };\n}\n\n/**\n * The tag the merge breaks. Two ways, and each has its own fix: a removal\n * leaves nothing the tag names, and an id this feature adds can flatten to the\n * same tag as the one it claims — the only way a MODIFIED, which keeps its id,\n * can break it at all.\n */\nfunction brokenIssue(\n flow: LivingFlow,\n claim: Resolved,\n broken: { change: \"MODIFIES\" | \"REMOVES\"; later: Exclude<RequirementClaim, { kind: \"resolved\" }> },\n): Issue {\n const { change, later } = broken;\n const [why, fix] =\n later.kind === \"many\"\n ? [\n `${later.ids.length} requirements will flatten to '${later.slug}' (${later.ids.join(\", \")}), so nothing in the tag can say which promise the flow keeps`,\n \"rename one of the colliding ids in this change\",\n ]\n : [\n \"nothing it names is left\",\n \"drop the tag (or point it at the promise that replaces this one) in this change, or MODIFY the requirement instead of removing it\",\n ];\n return {\n severity: \"error\",\n code: \"usecase.requirement-unresolved\",\n // The VIEW, as `validate --all` names it once the archive lands — so the\n // prediction and the outcome are about one thing a reader opens.\n subject: flow.view.id,\n message:\n `${flow.file}: flow '${flow.view.id}' is tagged #${claim.tag} — it claims ${whose(flow, claim)}, which this feature ${change}. ` +\n `After the archive the tag no longer resolves — ${why} — and \\`loam validate --all\\` reports this flow with this ` +\n `same error: ${fix}.`,\n locations: [{ path: flow.file, role: \"primary\" }],\n };\n}\n\n/**\n * Each document's table rows. The modified and removed ids are named by the id\n * the LIVING document gives them — selected by `replacementsOf`, the merge's own\n * walk, so a MODIFIED or REMOVED written by heading alone still names the id a\n * tag carries — and the after-side is that same merge's result. A document the\n * merge would refuse keeps its living ids on both sides and changes nothing:\n * the delta gate reports it, and nothing here has a true thing to say about a\n * merge that cannot happen.\n *\n * TODAY'S side leaves out a living requirement sitting under a REMOVED heading,\n * as both fleet indexes do (`capabilityRequirementIndex`, `requirementIdsOf`):\n * a tag resolving only through one is already the fleet's error. The fold\n * still runs on the whole living list, because that is the archive's input.\n */\nfunction tableOf(docs: readonly DeltaPair[]): Table {\n const table: Table = { living: new Map(), merged: new Map(), modified: new Map(), removed: new Map() };\n for (const doc of docs) {\n const living = doc.living.filter((r) => r.kind !== \"REMOVED\");\n let fold: { replaced: Replacement[]; merged: readonly Requirement[] };\n try {\n fold = { replaced: replacementsOf([...doc.living], [...doc.reqs]), merged: applyRequirementDelta([...doc.living], [...doc.reqs]) };\n } catch {\n fold = { replaced: [], merged: living };\n }\n idsInto(table.living, doc.id, living);\n idsInto(table.merged, doc.id, fold.merged);\n for (const r of fold.replaced) {\n if (r.living.id === undefined || (r.kind !== \"MODIFIED\" && r.kind !== \"REMOVED\")) continue;\n const into = r.kind === \"MODIFIED\" ? table.modified : table.removed;\n into.set(doc.id, (into.get(doc.id) ?? new Set()).add(r.living.id));\n }\n }\n return table;\n}\n\n/** A document's ids, unioned into its row — created even when empty, which is the `empty` arm's answer rather than `undocumented`'s. */\nfunction idsInto(rows: Map<string, Set<string>>, id: string, reqs: readonly Requirement[]): void {\n const ids = rows.get(id) ?? new Set<string>();\n for (const r of reqs) if (r.id !== undefined) ids.add(r.id);\n rows.set(id, ids);\n}\n\n/** The ids each document's delta modifies or removes — what a flow has to mention to be asked about at all. */\nfunction changedIds(table: Table): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>();\n for (const rows of [table.modified, table.removed]) {\n for (const [id, ids] of rows) out.set(id, new Set([...(out.get(id) ?? []), ...ids]));\n }\n return out;\n}\n\n/**\n * The service pairs, plus — for each service whose delta modifies or removes\n * something — every document of it the feature carries no delta for, as it\n * stands (`reqs: []`, so it changes nothing and only widens both sides).\n * `requirementIdsOf` (`commands/validate/service/usecases/usecases.ts`) reads\n * both documents for a service-local tag, skipping a requirement under a\n * REMOVED heading; so must this, or a tag the untouched document keeps\n * resolving reads as broken — and one only a REMOVED entry there answers reads\n * as kept, though the archive leaves that document as it is.\n */\nasync function withUntouchedAxes(req: ChangedPromiseRequest): Promise<DeltaPair[]> {\n const out: DeltaPair[] = [...req.services];\n const asked = new Set<string>();\n // Sequential, and it costs nothing worth racing: a feature names a handful of\n // services, each read is one memoised document, and most services here\n // already have both axes in the feature or no second document at all.\n for (const pair of req.services) {\n const own = req.services.filter((p) => p.id === pair.id);\n if (asked.has(pair.id) || !own.some((p) => p.reqs.some((r) => r.kind === \"MODIFIED\" || r.kind === \"REMOVED\"))) continue;\n asked.add(pair.id);\n const paths = await pair.paths();\n for (const axis of SPEC_AXES) {\n if (own.some((p) => p.axis === axis.key) || !existsSync(paths[axis.key])) continue;\n const living = (await req.readRequirements(paths[axis.key])).filter((r) => r.kind !== \"REMOVED\");\n out.push({ id: pair.id, reqs: [], living });\n }\n }\n return out;\n}\n\n/** The tag spellings that could claim one of these ids. */\nfunction needlesFor(changed: ReadonlyMap<string, ReadonlySet<string>>): string[] {\n return [...new Set([...changed.values()].flatMap((ids) => [...ids].map((id) => `${REQ_TAG_PREFIX}${tagSlug(id)}`)))];\n}\n\n/** Does any of these documents contain one of the tag spellings at all? Unreadable fails closed, as `../fleet.ts`'s gate does. */\nasync function mentions(paths: readonly string[], needles: readonly string[]): Promise<boolean> {\n for (const path of paths) {\n try {\n const text = (await readFile(path)).toString(\"latin1\");\n if (needles.some((needle) => text.includes(needle))) return true;\n } catch {\n return true;\n }\n }\n return false;\n}\n\nasync function fleetFlows(req: ChangedPromiseRequest, changed: ReadonlyMap<string, ReadonlySet<string>>): Promise<LivingFlow[]> {\n // The vocabulary ladder (`core/capabilities/findings.ts`): with nothing\n // declared no `#cap-` tag resolves, so no fleet flow can be said to claim anything.\n const declared = gradableCapabilityIds(req.vocabulary);\n if (changed.size === 0 || declared === null) return [];\n if (!(await mentions(await architectureProjectDocuments(req.docsDir), needlesFor(changed)))) return [];\n const read = useCasesIn(await req.architecture(), req.known);\n if (read.kind !== \"read\") return [];\n return read.views.map((view) => ({\n view,\n file: viewFile(view),\n scope: resolveCapabilityTags(view.tags, declared).flatMap((c) => (c.kind === \"resolved\" ? [c.id] : [])),\n altitude: \"capability\" as const,\n }));\n}\n\nasync function serviceFlows(req: ChangedPromiseRequest, changed: ReadonlyMap<string, ReadonlySet<string>>): Promise<LivingFlow[]> {\n const out: LivingFlow[] = [];\n for (const [service, ids] of changed) {\n // Sequential on purpose, for `../fleet.ts`'s gate's reason: nearly every\n // service answers from one readdir and a byte scan, and the rare one that\n // opens a workspace should not be raced by the ones that do not need one.\n const pair = req.services.find((doc) => doc.id === service);\n if (pair === undefined) continue;\n const paths = await pair.paths();\n if (!(await mentions(await architectureDocuments(paths.dir), needlesFor(new Map([[service, ids]]))))) continue;\n const model = await req.serviceModel(paths);\n if (model.mapUnreadable || model.doc.errors.length > 0) continue;\n const flows = await readServiceFlows({\n paths,\n model: model.doc,\n known: req.known,\n ...(model.shape === \"extending\" && model.project !== null\n ? { extending: { docsDir: req.docsDir, project: model.project } }\n : {}),\n });\n if (flows.kind !== \"read\") continue;\n for (const view of flows.views) {\n const file = relative(req.docsDir, join(paths.dir, view.sourcePath ?? \"model.likec4\")).split(/[\\\\/]/).join(\"/\");\n out.push({ view, file, scope: [service], altitude: \"service\" });\n }\n }\n return out;\n}\n"]}