@ybotok/loam 0.1.0-beta.3 → 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 (1256) hide show
  1. package/CHANGELOG.md +5992 -82
  2. package/COMPARISON.md +168 -63
  3. package/CONTRIBUTING.md +121 -0
  4. package/MIGRATING-from-OpenSpec.md +238 -55
  5. package/QUICKSTART.md +302 -0
  6. package/README.md +653 -144
  7. package/ROADMAP.md +1035 -0
  8. package/SCHEMA.md +3916 -263
  9. package/SECURITY.md +21 -3
  10. package/WORKFLOW.md +927 -0
  11. package/dist/cli.js +133 -21
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/adopt/adopt.js +204 -0
  14. package/dist/commands/adopt/adopt.js.map +1 -0
  15. package/dist/commands/adopt/render.js +309 -0
  16. package/dist/commands/adopt/render.js.map +1 -0
  17. package/dist/commands/archive/archive.js +74 -0
  18. package/dist/commands/archive/archive.js.map +1 -0
  19. package/dist/commands/archive/closing.js +42 -0
  20. package/dist/commands/archive/closing.js.map +1 -0
  21. package/dist/commands/archive/plan/contracts/asyncapi.js +172 -0
  22. package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
  23. package/dist/commands/archive/plan/contracts/consumers.js +56 -0
  24. package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
  25. package/dist/commands/archive/plan/contracts/openapi.js +193 -0
  26. package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
  27. package/dist/commands/archive/plan/contracts/verdict-lines.js +103 -0
  28. package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
  29. package/dist/commands/archive/plan/document/head.js +151 -0
  30. package/dist/commands/archive/plan/document/head.js.map +1 -0
  31. package/dist/commands/archive/plan/document/links.js +284 -0
  32. package/dist/commands/archive/plan/document/links.js.map +1 -0
  33. package/dist/commands/archive/plan/document/run.js +136 -0
  34. package/dist/commands/archive/plan/document/run.js.map +1 -0
  35. package/dist/commands/archive/plan/gate.js +319 -0
  36. package/dist/commands/archive/plan/gate.js.map +1 -0
  37. package/dist/commands/archive/plan/landscape.js +298 -0
  38. package/dist/commands/archive/plan/landscape.js.map +1 -0
  39. package/dist/commands/archive/plan/model/extending.js +85 -0
  40. package/dist/commands/archive/plan/model/extending.js.map +1 -0
  41. package/dist/commands/archive/plan/refusal.js +106 -0
  42. package/dist/commands/archive/plan/refusal.js.map +1 -0
  43. package/dist/commands/archive/plan/specs.js +318 -0
  44. package/dist/commands/archive/plan/specs.js.map +1 -0
  45. package/dist/commands/archive/plan/state.js +30 -0
  46. package/dist/commands/archive/plan/state.js.map +1 -0
  47. package/dist/commands/archive/run.js +355 -0
  48. package/dist/commands/archive/run.js.map +1 -0
  49. package/dist/commands/archive/shipped.js +49 -0
  50. package/dist/commands/archive/shipped.js.map +1 -0
  51. package/dist/commands/context/context.js +166 -0
  52. package/dist/commands/context/context.js.map +1 -0
  53. package/dist/commands/context/print.js +305 -0
  54. package/dist/commands/context/print.js.map +1 -0
  55. package/dist/commands/delta/delta.js +367 -0
  56. package/dist/commands/delta/delta.js.map +1 -0
  57. package/dist/commands/delta/print.js +221 -0
  58. package/dist/commands/delta/print.js.map +1 -0
  59. package/dist/commands/dependencies.js +6 -8
  60. package/dist/commands/dependencies.js.map +1 -1
  61. package/dist/commands/diff/diff.js +86 -0
  62. package/dist/commands/diff/diff.js.map +1 -0
  63. package/dist/commands/diff/print.js +38 -0
  64. package/dist/commands/diff/print.js.map +1 -0
  65. package/dist/commands/doctor.js +65 -5
  66. package/dist/commands/doctor.js.map +1 -1
  67. package/dist/commands/explain/explain.js +227 -0
  68. package/dist/commands/explain/explain.js.map +1 -0
  69. package/dist/commands/explore.js +39 -28
  70. package/dist/commands/explore.js.map +1 -1
  71. package/dist/commands/gate/gate.js +152 -0
  72. package/dist/commands/gate/gate.js.map +1 -0
  73. package/dist/commands/gate/print.js +66 -0
  74. package/dist/commands/gate/print.js.map +1 -0
  75. package/dist/commands/gherkin/commit.js +105 -0
  76. package/dist/commands/gherkin/commit.js.map +1 -0
  77. package/dist/commands/gherkin/gherkin.js +262 -0
  78. package/dist/commands/gherkin/gherkin.js.map +1 -0
  79. package/dist/commands/gherkin/reconcile.js +146 -0
  80. package/dist/commands/gherkin/reconcile.js.map +1 -0
  81. package/dist/commands/gherkin/render.js +77 -0
  82. package/dist/commands/gherkin/render.js.map +1 -0
  83. package/dist/commands/init/example.js +204 -0
  84. package/dist/commands/init/example.js.map +1 -0
  85. package/dist/commands/init/first-hour.js +72 -0
  86. package/dist/commands/init/first-hour.js.map +1 -0
  87. package/dist/commands/{init.js → init/init.js} +142 -71
  88. package/dist/commands/init/init.js.map +1 -0
  89. package/dist/commands/init/mcp.js +131 -0
  90. package/dist/commands/init/mcp.js.map +1 -0
  91. package/dist/commands/init/options.js +78 -0
  92. package/dist/commands/init/options.js.map +1 -0
  93. package/dist/commands/instructions.js +72 -14
  94. package/dist/commands/instructions.js.map +1 -1
  95. package/dist/commands/list/campaign/campaign.js +63 -0
  96. package/dist/commands/list/campaign/campaign.js.map +1 -0
  97. package/dist/commands/list/campaign/owners.js +65 -0
  98. package/dist/commands/list/campaign/owners.js.map +1 -0
  99. package/dist/commands/list/json.js +155 -0
  100. package/dist/commands/list/json.js.map +1 -0
  101. package/dist/commands/list/list.js +358 -0
  102. package/dist/commands/list/list.js.map +1 -0
  103. package/dist/commands/list/print.js +344 -0
  104. package/dist/commands/list/print.js.map +1 -0
  105. package/dist/commands/list/review.js +120 -0
  106. package/dist/commands/list/review.js.map +1 -0
  107. package/dist/commands/list/suites/suites.js +140 -0
  108. package/dist/commands/list/suites/suites.js.map +1 -0
  109. package/dist/commands/list/views.js +108 -0
  110. package/dist/commands/list/views.js.map +1 -0
  111. package/dist/commands/mcp/dispatch.js +238 -0
  112. package/dist/commands/mcp/dispatch.js.map +1 -0
  113. package/dist/commands/mcp/mcp.js +75 -0
  114. package/dist/commands/mcp/mcp.js.map +1 -0
  115. package/dist/commands/mcp/serve.js +55 -0
  116. package/dist/commands/mcp/serve.js.map +1 -0
  117. package/dist/commands/migrate-openspec/materialize/active.js +175 -0
  118. package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
  119. package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
  120. package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
  121. package/dist/commands/migrate-openspec/materialize/living.js +62 -0
  122. package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
  123. package/dist/commands/migrate-openspec/materialize/stage.js +143 -0
  124. package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
  125. package/dist/commands/migrate-openspec/materialize/target.js +219 -0
  126. package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
  127. package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
  128. package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
  129. package/dist/commands/migrate-openspec/openspec/decisions.js +86 -0
  130. package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
  131. package/dist/commands/migrate-openspec/openspec/error.js +18 -0
  132. package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
  133. package/dist/commands/migrate-openspec/openspec/mapping.js +162 -0
  134. package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
  135. package/dist/commands/migrate-openspec/openspec/paths.js +40 -0
  136. package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
  137. package/dist/commands/migrate-openspec/openspec/read.js +49 -0
  138. package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
  139. package/dist/commands/migrate-openspec/print.js +89 -0
  140. package/dist/commands/migrate-openspec/print.js.map +1 -0
  141. package/dist/commands/new/capability-template.js +118 -0
  142. package/dist/commands/new/capability-template.js.map +1 -0
  143. package/dist/commands/new/commit.js +62 -0
  144. package/dist/commands/new/commit.js.map +1 -0
  145. package/dist/commands/new/modifies.js +206 -0
  146. package/dist/commands/new/modifies.js.map +1 -0
  147. package/dist/commands/new/new.js +328 -0
  148. package/dist/commands/new/new.js.map +1 -0
  149. package/dist/commands/new/templates.js +279 -0
  150. package/dist/commands/new/templates.js.map +1 -0
  151. package/dist/commands/open.js +199 -0
  152. package/dist/commands/open.js.map +1 -0
  153. package/dist/commands/policy/format.js +152 -0
  154. package/dist/commands/policy/format.js.map +1 -0
  155. package/dist/commands/{docs-repo-gate.js → policy/gate.js} +38 -11
  156. package/dist/commands/policy/gate.js.map +1 -0
  157. package/dist/commands/rebase/edit.js +106 -0
  158. package/dist/commands/rebase/edit.js.map +1 -0
  159. package/dist/commands/rebase/living.js +185 -0
  160. package/dist/commands/rebase/living.js.map +1 -0
  161. package/dist/commands/rebase/plan.js +245 -0
  162. package/dist/commands/rebase/plan.js.map +1 -0
  163. package/dist/commands/rebase/rebase.js +300 -0
  164. package/dist/commands/rebase/rebase.js.map +1 -0
  165. package/dist/commands/seed/commit.js +221 -0
  166. package/dist/commands/seed/commit.js.map +1 -0
  167. package/dist/commands/seed/plan.js +278 -0
  168. package/dist/commands/seed/plan.js.map +1 -0
  169. package/dist/commands/seed/seed.js +174 -0
  170. package/dist/commands/seed/seed.js.map +1 -0
  171. package/dist/commands/show/feature.js +182 -0
  172. package/dist/commands/show/feature.js.map +1 -0
  173. package/dist/commands/show/introduced.js +157 -0
  174. package/dist/commands/show/introduced.js.map +1 -0
  175. package/dist/commands/show/marks.js +53 -0
  176. package/dist/commands/show/marks.js.map +1 -0
  177. package/dist/commands/show/service.js +239 -0
  178. package/dist/commands/show/service.js.map +1 -0
  179. package/dist/commands/show/show.js +87 -0
  180. package/dist/commands/show/show.js.map +1 -0
  181. package/dist/commands/status/fleet-next.js +90 -0
  182. package/dist/commands/status/fleet-next.js.map +1 -0
  183. package/dist/commands/status/json.js +47 -0
  184. package/dist/commands/status/json.js.map +1 -0
  185. package/dist/commands/status/print.js +209 -0
  186. package/dist/commands/status/print.js.map +1 -0
  187. package/dist/commands/status/status.js +115 -0
  188. package/dist/commands/status/status.js.map +1 -0
  189. package/dist/commands/steps/steps.js +269 -0
  190. package/dist/commands/steps/steps.js.map +1 -0
  191. package/dist/commands/subsystem/edit.js +192 -0
  192. package/dist/commands/subsystem/edit.js.map +1 -0
  193. package/dist/commands/subsystem/move.js +325 -0
  194. package/dist/commands/subsystem/move.js.map +1 -0
  195. package/dist/commands/subsystem/query.js +113 -0
  196. package/dist/commands/subsystem/query.js.map +1 -0
  197. package/dist/commands/subsystem/subsystem.js +98 -0
  198. package/dist/commands/subsystem/subsystem.js.map +1 -0
  199. package/dist/commands/subsystem/sync.js +318 -0
  200. package/dist/commands/subsystem/sync.js.map +1 -0
  201. package/dist/commands/subsystem/txn/exclude.js +132 -0
  202. package/dist/commands/subsystem/txn/exclude.js.map +1 -0
  203. package/dist/commands/subsystem/txn/links.js +128 -0
  204. package/dist/commands/subsystem/txn/links.js.map +1 -0
  205. package/dist/commands/subsystem/txn/report.js +174 -0
  206. package/dist/commands/subsystem/txn/report.js.map +1 -0
  207. package/dist/commands/subsystem/txn/txn.js +196 -0
  208. package/dist/commands/subsystem/txn/txn.js.map +1 -0
  209. package/dist/commands/subsystem/txn/views.js +249 -0
  210. package/dist/commands/subsystem/txn/views.js.map +1 -0
  211. package/dist/commands/tasks/actions.js +107 -0
  212. package/dist/commands/tasks/actions.js.map +1 -0
  213. package/dist/commands/tasks/render.js +253 -0
  214. package/dist/commands/tasks/render.js.map +1 -0
  215. package/dist/commands/tasks/tasks.js +119 -0
  216. package/dist/commands/tasks/tasks.js.map +1 -0
  217. package/dist/commands/unarchive/manifest.js +176 -0
  218. package/dist/commands/unarchive/manifest.js.map +1 -0
  219. package/dist/commands/unarchive/restore.js +254 -0
  220. package/dist/commands/unarchive/restore.js.map +1 -0
  221. package/dist/commands/unarchive/unarchive.js +59 -0
  222. package/dist/commands/unarchive/unarchive.js.map +1 -0
  223. package/dist/commands/validate/arch-coverage.js +245 -0
  224. package/dist/commands/validate/arch-coverage.js.map +1 -0
  225. package/dist/commands/validate/checks/fleet-shape.js +204 -0
  226. package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
  227. package/dist/commands/validate/checks/health-deps.js +58 -0
  228. package/dist/commands/validate/checks/health-deps.js.map +1 -0
  229. package/dist/commands/validate/checks/introduced.js +102 -0
  230. package/dist/commands/validate/checks/introduced.js.map +1 -0
  231. package/dist/commands/validate/checks/requirements.js +264 -0
  232. package/dist/commands/validate/checks/requirements.js.map +1 -0
  233. package/dist/commands/validate/checks/sources.js +85 -0
  234. package/dist/commands/validate/checks/sources.js.map +1 -0
  235. package/dist/commands/validate/coverage/covers-after.js +105 -0
  236. package/dist/commands/validate/coverage/covers-after.js.map +1 -0
  237. package/dist/commands/validate/feature.js +222 -0
  238. package/dist/commands/validate/feature.js.map +1 -0
  239. package/dist/commands/validate/fleet/census.js +93 -0
  240. package/dist/commands/validate/fleet/census.js.map +1 -0
  241. package/dist/commands/validate/fleet/kind-tags.js +39 -0
  242. package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
  243. package/dist/commands/validate/fleet/landscape.js +371 -0
  244. package/dist/commands/validate/fleet/landscape.js.map +1 -0
  245. package/dist/commands/validate/fleet/load.js +118 -0
  246. package/dist/commands/validate/fleet/load.js.map +1 -0
  247. package/dist/commands/validate/fleet/map/attest.js +98 -0
  248. package/dist/commands/validate/fleet/map/attest.js.map +1 -0
  249. package/dist/commands/validate/fleet/map/bindings.js +107 -0
  250. package/dist/commands/validate/fleet/map/bindings.js.map +1 -0
  251. package/dist/commands/validate/fleet/map/consumers.js +244 -0
  252. package/dist/commands/validate/fleet/map/consumers.js.map +1 -0
  253. package/dist/commands/validate/fleet/map/isolation.js +116 -0
  254. package/dist/commands/validate/fleet/map/isolation.js.map +1 -0
  255. package/dist/commands/validate/fleet/map/usecases.js +54 -0
  256. package/dist/commands/validate/fleet/map/usecases.js.map +1 -0
  257. package/dist/commands/validate/fleet/obligations.js +266 -0
  258. package/dist/commands/validate/fleet/obligations.js.map +1 -0
  259. package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
  260. package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
  261. package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
  262. package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
  263. package/dist/commands/validate/fleet/scorecard/print.js +71 -0
  264. package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
  265. package/dist/commands/validate/fleet/scorecard/scorecard.js +162 -0
  266. package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
  267. package/dist/commands/validate/fleet/usecases/place.js +13 -0
  268. package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
  269. package/dist/commands/validate/fleet/views/fleet-project.js +217 -0
  270. package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -0
  271. package/dist/commands/validate/fleet/views/ids.js +75 -0
  272. package/dist/commands/validate/fleet/views/ids.js.map +1 -0
  273. package/dist/commands/validate/fleet/views/projects.js +278 -0
  274. package/dist/commands/validate/fleet/views/projects.js.map +1 -0
  275. package/dist/commands/validate/fleet/views/root-documents.js +83 -0
  276. package/dist/commands/validate/fleet/views/root-documents.js.map +1 -0
  277. package/dist/commands/validate/fleet/views/stale.js +52 -0
  278. package/dist/commands/validate/fleet/views/stale.js.map +1 -0
  279. package/dist/commands/validate/links/corpus.js +89 -0
  280. package/dist/commands/validate/links/corpus.js.map +1 -0
  281. package/dist/commands/validate/links/glossary.js +75 -0
  282. package/dist/commands/validate/links/glossary.js.map +1 -0
  283. package/dist/commands/validate/render/repeats.js +63 -0
  284. package/dist/commands/validate/render/repeats.js.map +1 -0
  285. package/dist/commands/validate/render/rollups.js +115 -0
  286. package/dist/commands/validate/render/rollups.js.map +1 -0
  287. package/dist/commands/validate/render/text.js +199 -0
  288. package/dist/commands/validate/render/text.js.map +1 -0
  289. package/dist/commands/validate/report.js +145 -0
  290. package/dist/commands/validate/report.js.map +1 -0
  291. package/dist/commands/validate/scope.js +113 -0
  292. package/dist/commands/validate/scope.js.map +1 -0
  293. package/dist/commands/validate/service/api.js +252 -0
  294. package/dist/commands/validate/service/api.js.map +1 -0
  295. package/dist/commands/validate/service/contracts/generated.js +134 -0
  296. package/dist/commands/validate/service/contracts/generated.js.map +1 -0
  297. package/dist/commands/validate/service/events/events.js +241 -0
  298. package/dist/commands/validate/service/events/events.js.map +1 -0
  299. package/dist/commands/validate/service/events/message-producers.js +77 -0
  300. package/dist/commands/validate/service/events/message-producers.js.map +1 -0
  301. package/dist/commands/validate/service/evidence-pins.js +177 -0
  302. package/dist/commands/validate/service/evidence-pins.js.map +1 -0
  303. package/dist/commands/validate/service/model/diverged.js +226 -0
  304. package/dist/commands/validate/service/model/diverged.js.map +1 -0
  305. package/dist/commands/validate/service/model/grade.js +163 -0
  306. package/dist/commands/validate/service/model/grade.js.map +1 -0
  307. package/dist/commands/validate/service/service.js +310 -0
  308. package/dist/commands/validate/service/service.js.map +1 -0
  309. package/dist/commands/validate/service/specs.js +279 -0
  310. package/dist/commands/validate/service/specs.js.map +1 -0
  311. package/dist/commands/validate/service/spine.js +148 -0
  312. package/dist/commands/validate/service/spine.js.map +1 -0
  313. package/dist/commands/validate/service/usecases/tags.js +113 -0
  314. package/dist/commands/validate/service/usecases/tags.js.map +1 -0
  315. package/dist/commands/validate/service/usecases/usecases.js +209 -0
  316. package/dist/commands/validate/service/usecases/usecases.js.map +1 -0
  317. package/dist/commands/validate/validate.js +363 -0
  318. package/dist/commands/validate/validate.js.map +1 -0
  319. package/dist/commands/verify/cross/diff.js +178 -0
  320. package/dist/commands/verify/cross/diff.js.map +1 -0
  321. package/dist/commands/verify/evidence/contract.js +32 -0
  322. package/dist/commands/verify/evidence/contract.js.map +1 -0
  323. package/dist/commands/verify/evidence/pins.js +52 -0
  324. package/dist/commands/verify/evidence/pins.js.map +1 -0
  325. package/dist/commands/verify/evidence/read.js +81 -0
  326. package/dist/commands/verify/evidence/read.js.map +1 -0
  327. package/dist/commands/verify/frozen.js +263 -0
  328. package/dist/commands/verify/frozen.js.map +1 -0
  329. package/dist/commands/verify/record.js +278 -0
  330. package/dist/commands/verify/record.js.map +1 -0
  331. package/dist/commands/verify/report.js +206 -0
  332. package/dist/commands/verify/report.js.map +1 -0
  333. package/dist/commands/verify/results.js +328 -0
  334. package/dist/commands/verify/results.js.map +1 -0
  335. package/dist/commands/verify/verify.js +220 -0
  336. package/dist/commands/verify/verify.js.map +1 -0
  337. package/dist/commands/vouch/contract.js +11 -0
  338. package/dist/commands/vouch/contract.js.map +1 -0
  339. package/dist/commands/vouch/pack/contract.js +2 -0
  340. package/dist/commands/vouch/pack/contract.js.map +1 -0
  341. package/dist/commands/vouch/pack/pack.js +266 -0
  342. package/dist/commands/vouch/pack/pack.js.map +1 -0
  343. package/dist/commands/vouch/pack/print.js +266 -0
  344. package/dist/commands/vouch/pack/print.js.map +1 -0
  345. package/dist/commands/vouch/pack/sections.js +141 -0
  346. package/dist/commands/vouch/pack/sections.js.map +1 -0
  347. package/dist/commands/vouch/prompt/confirm.js +46 -0
  348. package/dist/commands/vouch/prompt/confirm.js.map +1 -0
  349. package/dist/commands/vouch/report.js +101 -0
  350. package/dist/commands/vouch/report.js.map +1 -0
  351. package/dist/commands/vouch/run.js +230 -0
  352. package/dist/commands/vouch/run.js.map +1 -0
  353. package/dist/commands/vouch/sample/plan.js +111 -0
  354. package/dist/commands/vouch/sample/plan.js.map +1 -0
  355. package/dist/commands/vouch/sample/print.js +109 -0
  356. package/dist/commands/vouch/sample/print.js.map +1 -0
  357. package/dist/commands/vouch/vet/verify.js +155 -0
  358. package/dist/commands/vouch/vet/verify.js.map +1 -0
  359. package/dist/commands/vouch/vouch.js +169 -0
  360. package/dist/commands/vouch/vouch.js.map +1 -0
  361. package/dist/core/agent/agents-md/command-map.js +299 -0
  362. package/dist/core/agent/agents-md/command-map.js.map +1 -0
  363. package/dist/core/agent/agents-md/map/explain.js +46 -0
  364. package/dist/core/agent/agents-md/map/explain.js.map +1 -0
  365. package/dist/core/agent/agents-md/map/lenses/context.js +50 -0
  366. package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
  367. package/dist/core/agent/agents-md/map/lenses/diff.js +59 -0
  368. package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
  369. package/dist/core/agent/agents-md/map/lenses/gate.js +65 -0
  370. package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
  371. package/dist/core/agent/agents-md/map/mcp.js +44 -0
  372. package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
  373. package/dist/core/agent/agents-md/map/status.js +78 -0
  374. package/dist/core/agent/agents-md/map/status.js.map +1 -0
  375. package/dist/core/agent/agents-md/map/subsystem.js +104 -0
  376. package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
  377. package/dist/core/agent/agents-md/map/usecases.js +138 -0
  378. package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
  379. package/dist/core/agent/agents-md/refusals.js +273 -0
  380. package/dist/core/agent/agents-md/refusals.js.map +1 -0
  381. package/dist/core/agent/agents-md.js +203 -0
  382. package/dist/core/agent/agents-md.js.map +1 -0
  383. package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +60 -0
  384. package/dist/core/agent/agents-stamp.js.map +1 -0
  385. package/dist/core/agent/contract.js +2 -0
  386. package/dist/core/agent/contract.js.map +1 -0
  387. package/dist/core/agent/protocol.js +193 -0
  388. package/dist/core/agent/protocol.js.map +1 -0
  389. package/dist/core/agent/scaffold.js +254 -0
  390. package/dist/core/agent/scaffold.js.map +1 -0
  391. package/dist/core/agent/support/report.js +144 -0
  392. package/dist/core/agent/support/report.js.map +1 -0
  393. package/dist/core/agent/tools/dialects.js +151 -0
  394. package/dist/core/agent/tools/dialects.js.map +1 -0
  395. package/dist/core/agent/tools/registry.js +193 -0
  396. package/dist/core/agent/tools/registry.js.map +1 -0
  397. package/dist/core/agent/workflows/adopt.js +280 -0
  398. package/dist/core/agent/workflows/adopt.js.map +1 -0
  399. package/dist/core/agent/workflows/check.js +373 -0
  400. package/dist/core/agent/workflows/check.js.map +1 -0
  401. package/dist/core/agent/workflows/closing.js +323 -0
  402. package/dist/core/agent/workflows/closing.js.map +1 -0
  403. package/dist/core/agent/workflows/feature.js +220 -0
  404. package/dist/core/agent/workflows/feature.js.map +1 -0
  405. package/dist/core/agent/workflows/implement.js +188 -0
  406. package/dist/core/agent/workflows/implement.js.map +1 -0
  407. package/dist/core/agent/workflows/reference/authoring.js +311 -0
  408. package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
  409. package/dist/core/agent/workflows/reference/codes.js +67 -0
  410. package/dist/core/agent/workflows/reference/codes.js.map +1 -0
  411. package/dist/core/agent/workflows/reference/done-check.js +210 -0
  412. package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
  413. package/dist/core/agent/workflows/reference/drawing/drawing.js +253 -0
  414. package/dist/core/agent/workflows/reference/drawing/drawing.js.map +1 -0
  415. package/dist/core/agent/workflows/reference/reference.js +19 -0
  416. package/dist/core/agent/workflows/reference/reference.js.map +1 -0
  417. package/dist/core/agent/workflows/reference/spine.js +338 -0
  418. package/dist/core/agent/workflows/reference/spine.js.map +1 -0
  419. package/dist/core/asyncapi/baseline/plan.js +43 -0
  420. package/dist/core/asyncapi/baseline/plan.js.map +1 -0
  421. package/dist/core/asyncapi/baseline/surfaces.js +54 -0
  422. package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
  423. package/dist/core/asyncapi/depth.js +164 -0
  424. package/dist/core/asyncapi/depth.js.map +1 -0
  425. package/dist/core/asyncapi/digest.js +146 -0
  426. package/dist/core/asyncapi/digest.js.map +1 -0
  427. package/dist/core/asyncapi/merge/components.js +92 -0
  428. package/dist/core/asyncapi/merge/components.js.map +1 -0
  429. package/dist/core/asyncapi/merge/error.js +38 -0
  430. package/dist/core/asyncapi/merge/error.js.map +1 -0
  431. package/dist/core/asyncapi/merge/markers.js +290 -0
  432. package/dist/core/asyncapi/merge/markers.js.map +1 -0
  433. package/dist/core/asyncapi/merge/merge.js +195 -0
  434. package/dist/core/asyncapi/merge/merge.js.map +1 -0
  435. package/dist/core/asyncapi/merge/pin.js +83 -0
  436. package/dist/core/asyncapi/merge/pin.js.map +1 -0
  437. package/dist/core/asyncapi/model.js +11 -0
  438. package/dist/core/asyncapi/model.js.map +1 -0
  439. package/dist/core/asyncapi/producers.js +50 -0
  440. package/dist/core/asyncapi/producers.js.map +1 -0
  441. package/dist/core/asyncapi/read.js +263 -0
  442. package/dist/core/asyncapi/read.js.map +1 -0
  443. package/dist/core/brief/brief.js +285 -0
  444. package/dist/core/brief/brief.js.map +1 -0
  445. package/dist/core/brief/checks.js +385 -0
  446. package/dist/core/brief/checks.js.map +1 -0
  447. package/dist/core/brief/landscape.js +273 -0
  448. package/dist/core/brief/landscape.js.map +1 -0
  449. package/dist/core/brief/map/extend.js +84 -0
  450. package/dist/core/brief/map/extend.js.map +1 -0
  451. package/dist/core/brief/map/owed.js +266 -0
  452. package/dist/core/brief/map/owed.js.map +1 -0
  453. package/dist/core/brief/targets.js +304 -0
  454. package/dist/core/brief/targets.js.map +1 -0
  455. package/dist/core/brief/unchecked.js +58 -0
  456. package/dist/core/brief/unchecked.js.map +1 -0
  457. package/dist/core/c4/arch.js +190 -0
  458. package/dist/core/c4/arch.js.map +1 -0
  459. package/dist/core/c4/direction/direction.js +114 -0
  460. package/dist/core/c4/direction/direction.js.map +1 -0
  461. package/dist/core/c4/likec4.js +243 -0
  462. package/dist/core/c4/likec4.js.map +1 -0
  463. package/dist/core/c4/locate/unlocated.js +150 -0
  464. package/dist/core/c4/locate/unlocated.js.map +1 -0
  465. package/dist/core/c4/parsed/deployment.js +160 -0
  466. package/dist/core/c4/parsed/deployment.js.map +1 -0
  467. package/dist/core/c4/parsed/dynamic-views.js +132 -0
  468. package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
  469. package/dist/core/c4/parsed/specification.js +78 -0
  470. package/dist/core/c4/parsed/specification.js.map +1 -0
  471. package/dist/core/c4/parsed/values.js +110 -0
  472. package/dist/core/c4/parsed/values.js.map +1 -0
  473. package/dist/core/c4/parsed/view-ids.js +113 -0
  474. package/dist/core/c4/parsed/view-ids.js.map +1 -0
  475. package/dist/core/c4/prefetch/fleet.js +134 -0
  476. package/dist/core/c4/prefetch/fleet.js.map +1 -0
  477. package/dist/core/c4/project/architecture.js +161 -0
  478. package/dist/core/c4/project/architecture.js.map +1 -0
  479. package/dist/core/c4/project/batch.js +140 -0
  480. package/dist/core/c4/project/batch.js.map +1 -0
  481. package/dist/core/c4/project/documents.js +89 -0
  482. package/dist/core/c4/project/documents.js.map +1 -0
  483. package/dist/core/c4/project/load.js +219 -0
  484. package/dist/core/c4/project/load.js.map +1 -0
  485. package/dist/core/c4/project/staged.js +277 -0
  486. package/dist/core/c4/project/staged.js.map +1 -0
  487. package/dist/core/c4/resolve/attested.js +0 -0
  488. package/dist/core/c4/resolve/attested.js.map +1 -0
  489. package/dist/core/c4/resolve/external.js +51 -0
  490. package/dist/core/c4/resolve/external.js.map +1 -0
  491. package/dist/core/c4/resolve/service.js +174 -0
  492. package/dist/core/c4/resolve/service.js.map +1 -0
  493. package/dist/core/c4/resolve/steps.js +290 -0
  494. package/dist/core/c4/resolve/steps.js.map +1 -0
  495. package/dist/core/c4/resolve/systems.js +154 -0
  496. package/dist/core/c4/resolve/systems.js.map +1 -0
  497. package/dist/core/c4/root-project/exclude.js +352 -0
  498. package/dist/core/c4/root-project/exclude.js.map +1 -0
  499. package/dist/core/c4/seed/fleet-file.js +201 -0
  500. package/dist/core/c4/seed/fleet-file.js.map +1 -0
  501. package/dist/core/c4/seed/items.js +91 -0
  502. package/dist/core/c4/seed/items.js.map +1 -0
  503. package/dist/core/c4/seed/stamp.js +48 -0
  504. package/dist/core/c4/seed/stamp.js.map +1 -0
  505. package/dist/core/c4/seed/template.js +173 -0
  506. package/dist/core/c4/seed/template.js.map +1 -0
  507. package/dist/core/c4/service-model/created/models.js +96 -0
  508. package/dist/core/c4/service-model/created/models.js.map +1 -0
  509. package/dist/core/c4/service-model/documents.js +47 -0
  510. package/dist/core/c4/service-model/documents.js.map +1 -0
  511. package/dist/core/c4/service-model/fleet/extending.js +82 -0
  512. package/dist/core/c4/service-model/fleet/extending.js.map +1 -0
  513. package/dist/core/c4/service-model/load.js +165 -0
  514. package/dist/core/c4/service-model/load.js.map +1 -0
  515. package/dist/core/c4/service-model/renderer.js +128 -0
  516. package/dist/core/c4/service-model/renderer.js.map +1 -0
  517. package/dist/core/c4/service-model/shape.js +106 -0
  518. package/dist/core/c4/service-model/shape.js.map +1 -0
  519. package/dist/core/c4/service-model/slice.js +188 -0
  520. package/dist/core/c4/service-model/slice.js.map +1 -0
  521. package/dist/core/c4/source-mask.js +369 -0
  522. package/dist/core/c4/source-mask.js.map +1 -0
  523. package/dist/core/c4/source-scan.js +308 -0
  524. package/dist/core/c4/source-scan.js.map +1 -0
  525. package/dist/core/c4/splice/authored-source.js +167 -0
  526. package/dist/core/c4/splice/authored-source.js.map +1 -0
  527. package/dist/core/c4/splice/contract.js +30 -0
  528. package/dist/core/c4/splice/contract.js.map +1 -0
  529. package/dist/core/c4/splice/delta-blocks.js +126 -0
  530. package/dist/core/c4/splice/delta-blocks.js.map +1 -0
  531. package/dist/core/c4/splice/identity/declared.js +87 -0
  532. package/dist/core/c4/splice/identity/declared.js.map +1 -0
  533. package/dist/core/c4/splice/identity/edges.js +73 -0
  534. package/dist/core/c4/splice/identity/edges.js.map +1 -0
  535. package/dist/core/c4/splice/identity/existing.js +80 -0
  536. package/dist/core/c4/splice/identity/existing.js.map +1 -0
  537. package/dist/core/c4/splice/identity/interior.js +80 -0
  538. package/dist/core/c4/splice/identity/interior.js.map +1 -0
  539. package/dist/core/c4/splice/identity/owner.js +50 -0
  540. package/dist/core/c4/splice/identity/owner.js.map +1 -0
  541. package/dist/core/c4/splice/landscape-merge.js +337 -0
  542. package/dist/core/c4/splice/landscape-merge.js.map +1 -0
  543. package/dist/core/c4/splice/model/merge.js +151 -0
  544. package/dist/core/c4/splice/model/merge.js.map +1 -0
  545. package/dist/core/c4/splice/placement.js +298 -0
  546. package/dist/core/c4/splice/placement.js.map +1 -0
  547. package/dist/core/c4/splice/text/spot.js +131 -0
  548. package/dist/core/c4/splice/text/spot.js.map +1 -0
  549. package/dist/core/c4/workspace.js +166 -0
  550. package/dist/core/c4/workspace.js.map +1 -0
  551. package/dist/core/capabilities/authoring/notes.js +141 -0
  552. package/dist/core/capabilities/authoring/notes.js.map +1 -0
  553. package/dist/core/capabilities/capabilities.js +124 -0
  554. package/dist/core/capabilities/capabilities.js.map +1 -0
  555. package/dist/core/capabilities/delta/doc.js +47 -0
  556. package/dist/core/capabilities/delta/doc.js.map +1 -0
  557. package/dist/core/capabilities/delta/overlay.js +129 -0
  558. package/dist/core/capabilities/delta/overlay.js.map +1 -0
  559. package/dist/core/capabilities/delta/summary.js +57 -0
  560. package/dist/core/capabilities/delta/summary.js.map +1 -0
  561. package/dist/core/capabilities/delta/tree.js +43 -0
  562. package/dist/core/capabilities/delta/tree.js.map +1 -0
  563. package/dist/core/capabilities/delta/uncovered.js +222 -0
  564. package/dist/core/capabilities/delta/uncovered.js.map +1 -0
  565. package/dist/core/capabilities/findings.js +338 -0
  566. package/dist/core/capabilities/findings.js.map +1 -0
  567. package/dist/core/capabilities/realizes/findings.js +174 -0
  568. package/dist/core/capabilities/realizes/findings.js.map +1 -0
  569. package/dist/core/capabilities/realizes/join.js +123 -0
  570. package/dist/core/capabilities/realizes/join.js.map +1 -0
  571. package/dist/core/capabilities/rollup.js +205 -0
  572. package/dist/core/capabilities/rollup.js.map +1 -0
  573. package/dist/core/capabilities/tree.js +104 -0
  574. package/dist/core/capabilities/tree.js.map +1 -0
  575. package/dist/core/capabilities/usecase-join.js +267 -0
  576. package/dist/core/capabilities/usecase-join.js.map +1 -0
  577. package/dist/core/coherence/authoring/scaffold.js +185 -0
  578. package/dist/core/coherence/authoring/scaffold.js.map +1 -0
  579. package/dist/core/coherence/authoring/sentinels.js +75 -0
  580. package/dist/core/coherence/authoring/sentinels.js.map +1 -0
  581. package/dist/core/coherence/calls/called.js +52 -0
  582. package/dist/core/coherence/calls/called.js.map +1 -0
  583. package/dist/core/coherence/coherence.js +332 -0
  584. package/dist/core/coherence/coherence.js.map +1 -0
  585. package/dist/core/coherence/consumed/operations.js +70 -0
  586. package/dist/core/coherence/consumed/operations.js.map +1 -0
  587. package/dist/core/coherence/consumed/refusal.js +38 -0
  588. package/dist/core/coherence/consumed/refusal.js.map +1 -0
  589. package/dist/core/coherence/covers/health.js +85 -0
  590. package/dist/core/coherence/covers/health.js.map +1 -0
  591. package/dist/core/coherence/declared.js +295 -0
  592. package/dist/core/coherence/declared.js.map +1 -0
  593. package/dist/core/coherence/events/declared.js +191 -0
  594. package/dist/core/coherence/events/declared.js.map +1 -0
  595. package/dist/core/coherence/events/events.js +335 -0
  596. package/dist/core/coherence/events/events.js.map +1 -0
  597. package/dist/core/coherence/events/grades.js +189 -0
  598. package/dist/core/coherence/events/grades.js.map +1 -0
  599. package/dist/core/coherence/events/lookups.js +63 -0
  600. package/dist/core/coherence/events/lookups.js.map +1 -0
  601. package/dist/core/coherence/events/produced.js +100 -0
  602. package/dist/core/coherence/events/produced.js.map +1 -0
  603. package/dist/core/coherence/living.js +198 -0
  604. package/dist/core/coherence/living.js.map +1 -0
  605. package/dist/core/coherence/lookups.js +95 -0
  606. package/dist/core/coherence/lookups.js.map +1 -0
  607. package/dist/core/coherence/pending.js +39 -0
  608. package/dist/core/coherence/pending.js.map +1 -0
  609. package/dist/core/coherence/retired/archived.js +285 -0
  610. package/dist/core/coherence/retired/archived.js.map +1 -0
  611. package/dist/core/coherence/retired/event-pair.js +62 -0
  612. package/dist/core/coherence/retired/event-pair.js.map +1 -0
  613. package/dist/core/coherence/retired/merged.js +79 -0
  614. package/dist/core/coherence/retired/merged.js.map +1 -0
  615. package/dist/core/coherence/retired/retirement.js +49 -0
  616. package/dist/core/coherence/retired/retirement.js.map +1 -0
  617. package/dist/core/coherence/retired/revival/arrivals.js +131 -0
  618. package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
  619. package/dist/core/coherence/retired/revival/revived.js +297 -0
  620. package/dist/core/coherence/retired/revival/revived.js.map +1 -0
  621. package/dist/core/conflict-markers.js +60 -0
  622. package/dist/core/conflict-markers.js.map +1 -0
  623. package/dist/core/consumers/after.js +113 -0
  624. package/dist/core/consumers/after.js.map +1 -0
  625. package/dist/core/consumers/consumers.js +296 -0
  626. package/dist/core/consumers/consumers.js.map +1 -0
  627. package/dist/core/consumers/current.js +211 -0
  628. package/dist/core/consumers/current.js.map +1 -0
  629. package/dist/core/consumers/scan.js +46 -0
  630. package/dist/core/consumers/scan.js.map +1 -0
  631. package/dist/core/consumers/state.js +27 -0
  632. package/dist/core/consumers/state.js.map +1 -0
  633. package/dist/core/delta/claims.js +73 -0
  634. package/dist/core/delta/claims.js.map +1 -0
  635. package/dist/core/delta/delta.js +341 -0
  636. package/dist/core/delta/delta.js.map +1 -0
  637. package/dist/core/delta/document.js +177 -0
  638. package/dist/core/delta/document.js.map +1 -0
  639. package/dist/core/delta/scope.js +48 -0
  640. package/dist/core/delta/scope.js.map +1 -0
  641. package/dist/core/delta/select.js +237 -0
  642. package/dist/core/delta/select.js.map +1 -0
  643. package/dist/core/dependencies/dependencies.js +141 -0
  644. package/dist/core/dependencies/dependencies.js.map +1 -0
  645. package/dist/core/dependencies/facts.js +165 -0
  646. package/dist/core/dependencies/facts.js.map +1 -0
  647. package/dist/core/dependencies/fanin.js +88 -0
  648. package/dist/core/dependencies/fanin.js.map +1 -0
  649. package/dist/core/dependencies/graph.js +106 -0
  650. package/dist/core/dependencies/graph.js.map +1 -0
  651. package/dist/core/deployment/delta.js +191 -0
  652. package/dist/core/deployment/delta.js.map +1 -0
  653. package/dist/core/deployment/objects.js +145 -0
  654. package/dist/core/deployment/objects.js.map +1 -0
  655. package/dist/core/diff/base-git.js +230 -0
  656. package/dist/core/diff/base-git.js.map +1 -0
  657. package/dist/core/diff/base-state.js +237 -0
  658. package/dist/core/diff/base-state.js.map +1 -0
  659. package/dist/core/diff/joins.js +136 -0
  660. package/dist/core/diff/joins.js.map +1 -0
  661. package/dist/core/diff/scope/changed-paths.js +204 -0
  662. package/dist/core/diff/scope/changed-paths.js.map +1 -0
  663. package/dist/core/diff/scope/edges.js +82 -0
  664. package/dist/core/diff/scope/edges.js.map +1 -0
  665. package/dist/core/diff/semantic.js +312 -0
  666. package/dist/core/diff/semantic.js.map +1 -0
  667. package/dist/core/docs.js +37 -85
  668. package/dist/core/docs.js.map +1 -1
  669. package/dist/core/doctor/agents.js +238 -0
  670. package/dist/core/doctor/agents.js.map +1 -0
  671. package/dist/core/doctor/config.js +139 -0
  672. package/dist/core/doctor/config.js.map +1 -0
  673. package/dist/core/doctor/doctor.js +355 -0
  674. package/dist/core/doctor/doctor.js.map +1 -0
  675. package/dist/core/doctor/report.js +13 -0
  676. package/dist/core/doctor/report.js.map +1 -0
  677. package/dist/core/doctor/reports/scan.js +242 -0
  678. package/dist/core/doctor/reports/scan.js.map +1 -0
  679. package/dist/core/doctor/residue.js +110 -0
  680. package/dist/core/doctor/residue.js.map +1 -0
  681. package/dist/core/document/apply.js +224 -0
  682. package/dist/core/document/apply.js.map +1 -0
  683. package/dist/core/{frontmatter.js → document/frontmatter.js} +103 -2
  684. package/dist/core/document/frontmatter.js.map +1 -0
  685. package/dist/core/document/grammar/directives.js +143 -0
  686. package/dist/core/document/grammar/directives.js.map +1 -0
  687. package/dist/core/document/parse.js +286 -0
  688. package/dist/core/document/parse.js.map +1 -0
  689. package/dist/core/document/scenarios.js +238 -0
  690. package/dist/core/document/scenarios.js.map +1 -0
  691. package/dist/core/document/spec.js +234 -0
  692. package/dist/core/document/spec.js.map +1 -0
  693. package/dist/core/{config.js → envelope/config.js} +89 -18
  694. package/dist/core/envelope/config.js.map +1 -0
  695. package/dist/core/envelope/json.js +209 -0
  696. package/dist/core/envelope/json.js.map +1 -0
  697. package/dist/core/{version.js → envelope/version.js} +3 -3
  698. package/dist/core/envelope/version.js.map +1 -0
  699. package/dist/core/explain/families.js +180 -0
  700. package/dist/core/explain/families.js.map +1 -0
  701. package/dist/core/explain/fix-tables.js +178 -0
  702. package/dist/core/explain/fix-tables.js.map +1 -0
  703. package/dist/core/explain/lookup.js +194 -0
  704. package/dist/core/explain/lookup.js.map +1 -0
  705. package/dist/core/explain/refusals.js +49 -0
  706. package/dist/core/explain/refusals.js.map +1 -0
  707. package/dist/core/explain/terms/documents.js +227 -0
  708. package/dist/core/explain/terms/documents.js.map +1 -0
  709. package/dist/core/explain/terms/done-check.js +144 -0
  710. package/dist/core/explain/terms/done-check.js.map +1 -0
  711. package/dist/core/explain/terms/entry.js +14 -0
  712. package/dist/core/explain/terms/entry.js.map +1 -0
  713. package/dist/core/explain/terms/stages.js +71 -0
  714. package/dist/core/explain/terms/stages.js.map +1 -0
  715. package/dist/core/explain/terms/tasks.js +97 -0
  716. package/dist/core/explain/terms/tasks.js.map +1 -0
  717. package/dist/core/explain/terms.js +103 -0
  718. package/dist/core/explain/terms.js.map +1 -0
  719. package/dist/core/explore/describe.js +105 -0
  720. package/dist/core/explore/describe.js.map +1 -0
  721. package/dist/core/explore/explore.js +204 -0
  722. package/dist/core/explore/explore.js.map +1 -0
  723. package/dist/core/fleet-context.js +174 -146
  724. package/dist/core/fleet-context.js.map +1 -1
  725. package/dist/core/gate/checks.js +208 -0
  726. package/dist/core/gate/checks.js.map +1 -0
  727. package/dist/core/gate/partners.js +246 -0
  728. package/dist/core/gate/partners.js.map +1 -0
  729. package/dist/core/gate/report.js +47 -0
  730. package/dist/core/gate/report.js.map +1 -0
  731. package/dist/core/gate/verification.js +176 -0
  732. package/dist/core/gate/verification.js.map +1 -0
  733. package/dist/core/gherkin/digest.js +60 -0
  734. package/dist/core/gherkin/digest.js.map +1 -0
  735. package/dist/core/gherkin/emit.js +177 -0
  736. package/dist/core/gherkin/emit.js.map +1 -0
  737. package/dist/core/gherkin/read.js +76 -0
  738. package/dist/core/gherkin/read.js.map +1 -0
  739. package/dist/core/gherkin/stale.js +210 -0
  740. package/dist/core/gherkin/stale.js.map +1 -0
  741. package/dist/core/gherkin/stamp.js +77 -0
  742. package/dist/core/gherkin/stamp.js.map +1 -0
  743. package/dist/core/gherkin/steps/catalogue.js +154 -0
  744. package/dist/core/gherkin/steps/catalogue.js.map +1 -0
  745. package/dist/core/gherkin/steps/inventory.js +98 -0
  746. package/dist/core/gherkin/steps/inventory.js.map +1 -0
  747. package/dist/core/gherkin/steps/phrase.js +72 -0
  748. package/dist/core/gherkin/steps/phrase.js.map +1 -0
  749. package/dist/core/glossary/delta.js +109 -0
  750. package/dist/core/glossary/delta.js.map +1 -0
  751. package/dist/core/glossary/tree.js +73 -0
  752. package/dist/core/glossary/tree.js.map +1 -0
  753. package/dist/core/{concurrency.js → kernel/concurrency.js} +19 -0
  754. package/dist/core/kernel/concurrency.js.map +1 -0
  755. package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
  756. package/dist/core/kernel/document-bytes.js.map +1 -0
  757. package/dist/core/kernel/fences.js +42 -0
  758. package/dist/core/kernel/fences.js.map +1 -0
  759. package/dist/core/kernel/ids/capability.js +72 -0
  760. package/dist/core/kernel/ids/capability.js.map +1 -0
  761. package/dist/core/kernel/ids/dirs.js +33 -0
  762. package/dist/core/kernel/ids/dirs.js.map +1 -0
  763. package/dist/core/kernel/ids/feature.js +75 -0
  764. package/dist/core/kernel/ids/feature.js.map +1 -0
  765. package/dist/core/kernel/ids/fqn/ancestors.js +65 -0
  766. package/dist/core/kernel/ids/fqn/ancestors.js.map +1 -0
  767. package/dist/core/kernel/ids/service.js +156 -0
  768. package/dist/core/kernel/ids/service.js.map +1 -0
  769. package/dist/core/kernel/ids/subsystem.js +63 -0
  770. package/dist/core/kernel/ids/subsystem.js.map +1 -0
  771. package/dist/core/{path-safety.js → kernel/path-safety.js} +56 -4
  772. package/dist/core/kernel/path-safety.js.map +1 -0
  773. package/dist/core/{records.js → kernel/records.js} +11 -0
  774. package/dist/core/kernel/records.js.map +1 -0
  775. package/dist/core/links/backlinks.js +66 -0
  776. package/dist/core/links/backlinks.js.map +1 -0
  777. package/dist/core/links/case.js +74 -0
  778. package/dist/core/links/case.js.map +1 -0
  779. package/dist/core/links/corpus.js +118 -0
  780. package/dist/core/links/corpus.js.map +1 -0
  781. package/dist/core/links/findings.js +110 -0
  782. package/dist/core/links/findings.js.map +1 -0
  783. package/dist/core/links/parse.js +265 -0
  784. package/dist/core/links/parse.js.map +1 -0
  785. package/dist/core/mcp/argv.js +212 -0
  786. package/dist/core/mcp/argv.js.map +1 -0
  787. package/dist/core/mcp/author-tools.js +73 -0
  788. package/dist/core/mcp/author-tools.js.map +1 -0
  789. package/dist/core/mcp/framing.js +46 -0
  790. package/dist/core/mcp/framing.js.map +1 -0
  791. package/dist/core/mcp/protocol.js +280 -0
  792. package/dist/core/mcp/protocol.js.map +1 -0
  793. package/dist/core/mcp/tools.js +324 -0
  794. package/dist/core/mcp/tools.js.map +1 -0
  795. package/dist/core/obligations/obligations.js +106 -0
  796. package/dist/core/obligations/obligations.js.map +1 -0
  797. package/dist/core/openapi/baseline/gate.js +207 -0
  798. package/dist/core/openapi/baseline/gate.js.map +1 -0
  799. package/dist/core/openapi/baseline/plan.js +142 -0
  800. package/dist/core/openapi/baseline/plan.js.map +1 -0
  801. package/dist/core/openapi/baseline/record.js +174 -0
  802. package/dist/core/openapi/baseline/record.js.map +1 -0
  803. package/dist/core/openapi/contract-text.js +33 -0
  804. package/dist/core/openapi/contract-text.js.map +1 -0
  805. package/dist/core/openapi/contract-tree.js +301 -0
  806. package/dist/core/openapi/contract-tree.js.map +1 -0
  807. package/dist/core/openapi/depth.js +136 -0
  808. package/dist/core/openapi/depth.js.map +1 -0
  809. package/dist/core/openapi/digest.js +239 -0
  810. package/dist/core/openapi/digest.js.map +1 -0
  811. package/dist/core/{openapi.js → openapi/doc.js} +54 -108
  812. package/dist/core/openapi/doc.js.map +1 -0
  813. package/dist/core/openapi/merge/components.js +199 -0
  814. package/dist/core/openapi/merge/components.js.map +1 -0
  815. package/dist/core/openapi/merge/error.js +16 -0
  816. package/dist/core/openapi/merge/error.js.map +1 -0
  817. package/dist/core/openapi/merge/markers.js +204 -0
  818. package/dist/core/openapi/merge/markers.js.map +1 -0
  819. package/dist/core/openapi/merge/merge.js +232 -0
  820. package/dist/core/openapi/merge/merge.js.map +1 -0
  821. package/dist/core/openapi/merge/pin.js +110 -0
  822. package/dist/core/openapi/merge/pin.js.map +1 -0
  823. package/dist/core/openspec/decide/capabilities.js +244 -0
  824. package/dist/core/openspec/decide/capabilities.js.map +1 -0
  825. package/dist/core/openspec/decide/dispositions.js +63 -0
  826. package/dist/core/openspec/decide/dispositions.js.map +1 -0
  827. package/dist/core/openspec/decide/renames.js +179 -0
  828. package/dist/core/openspec/decide/renames.js.map +1 -0
  829. package/dist/core/openspec/decide/verdict.js +84 -0
  830. package/dist/core/openspec/decide/verdict.js.map +1 -0
  831. package/dist/core/openspec/inventory.js +220 -0
  832. package/dist/core/openspec/inventory.js.map +1 -0
  833. package/dist/core/openspec/model/mapping.js +78 -0
  834. package/dist/core/openspec/model/mapping.js.map +1 -0
  835. package/dist/core/openspec/model/model.js +70 -0
  836. package/dist/core/openspec/model/model.js.map +1 -0
  837. package/dist/core/openspec/scan/changes.js +241 -0
  838. package/dist/core/openspec/scan/changes.js.map +1 -0
  839. package/dist/core/openspec/scan/config.js +191 -0
  840. package/dist/core/openspec/scan/config.js.map +1 -0
  841. package/dist/core/openspec/scan/shape.js +304 -0
  842. package/dist/core/openspec/scan/shape.js.map +1 -0
  843. package/dist/core/openspec/scan/walk.js +116 -0
  844. package/dist/core/openspec/scan/walk.js.map +1 -0
  845. package/dist/core/openspec/scan/workspace.js +71 -0
  846. package/dist/core/openspec/scan/workspace.js.map +1 -0
  847. package/dist/core/owners/codeowners.js +141 -0
  848. package/dist/core/owners/codeowners.js.map +1 -0
  849. package/dist/core/pack/features.js +120 -0
  850. package/dist/core/pack/features.js.map +1 -0
  851. package/dist/core/pack/joins.js +112 -0
  852. package/dist/core/pack/joins.js.map +1 -0
  853. package/dist/core/pack/living.js +157 -0
  854. package/dist/core/pack/living.js.map +1 -0
  855. package/dist/core/pack/pack.js +120 -0
  856. package/dist/core/pack/pack.js.map +1 -0
  857. package/dist/core/permissions/permissions.js +87 -0
  858. package/dist/core/permissions/permissions.js.map +1 -0
  859. package/dist/core/projection/api.js +84 -0
  860. package/dist/core/projection/api.js.map +1 -0
  861. package/dist/core/projection/arch-slice.js +63 -0
  862. package/dist/core/projection/arch-slice.js.map +1 -0
  863. package/dist/core/projection/events.js +34 -0
  864. package/dist/core/projection/events.js.map +1 -0
  865. package/dist/core/projection/introduced.js +14 -0
  866. package/dist/core/projection/introduced.js.map +1 -0
  867. package/dist/core/provenance/findings.js +244 -0
  868. package/dist/core/provenance/findings.js.map +1 -0
  869. package/dist/core/provenance/git.js +201 -0
  870. package/dist/core/provenance/git.js.map +1 -0
  871. package/dist/core/provenance/gitq/moves.js +139 -0
  872. package/dist/core/provenance/gitq/moves.js.map +1 -0
  873. package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
  874. package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
  875. package/dist/core/provenance/sample/scope.js +238 -0
  876. package/dist/core/provenance/sample/scope.js.map +1 -0
  877. package/dist/core/provenance/sample/sections.js +61 -0
  878. package/dist/core/provenance/sample/sections.js.map +1 -0
  879. package/dist/core/provenance/sources.js +280 -0
  880. package/dist/core/provenance/sources.js.map +1 -0
  881. package/dist/core/provenance/stamp.js +220 -0
  882. package/dist/core/provenance/stamp.js.map +1 -0
  883. package/dist/core/provenance/walk.js +157 -0
  884. package/dist/core/provenance/walk.js.map +1 -0
  885. package/dist/core/repo/authored/paths.js +210 -0
  886. package/dist/core/repo/authored/paths.js.map +1 -0
  887. package/dist/core/repo/entries.js +126 -0
  888. package/dist/core/repo/entries.js.map +1 -0
  889. package/dist/core/repo/paths.js +322 -0
  890. package/dist/core/repo/paths.js.map +1 -0
  891. package/dist/core/repo/repo.js +308 -0
  892. package/dist/core/repo/repo.js.map +1 -0
  893. package/dist/core/repo/service-target.js +153 -0
  894. package/dist/core/repo/service-target.js.map +1 -0
  895. package/dist/core/repo/state.js +58 -0
  896. package/dist/core/repo/state.js.map +1 -0
  897. package/dist/core/repo/tree/find.js +61 -0
  898. package/dist/core/repo/tree/find.js.map +1 -0
  899. package/dist/core/repo/tree/fs.js +90 -0
  900. package/dist/core/repo/tree/fs.js.map +1 -0
  901. package/dist/core/repo/tree/marker.js +61 -0
  902. package/dist/core/repo/tree/marker.js.map +1 -0
  903. package/dist/core/repo/tree/render/body.js +258 -0
  904. package/dist/core/repo/tree/render/body.js.map +1 -0
  905. package/dist/core/repo/tree/render/projects.js +182 -0
  906. package/dist/core/repo/tree/render/projects.js.map +1 -0
  907. package/dist/core/repo/tree/render/service/header.js +125 -0
  908. package/dist/core/repo/tree/render/service/header.js.map +1 -0
  909. package/dist/core/repo/tree/render/service/peers.js +28 -0
  910. package/dist/core/repo/tree/render/service/peers.js.map +1 -0
  911. package/dist/core/repo/tree/render/service/view-id.js +67 -0
  912. package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
  913. package/dist/core/repo/tree/render/service/views.js +78 -0
  914. package/dist/core/repo/tree/render/service/views.js.map +1 -0
  915. package/dist/core/repo/tree/render/stale.js +42 -0
  916. package/dist/core/repo/tree/render/stale.js.map +1 -0
  917. package/dist/core/repo/tree/render/text.js +84 -0
  918. package/dist/core/repo/tree/render/text.js.map +1 -0
  919. package/dist/core/repo/tree/render/views.js +293 -0
  920. package/dist/core/repo/tree/render/views.js.map +1 -0
  921. package/dist/core/repo/tree/walk.js +255 -0
  922. package/dist/core/repo/tree/walk.js.map +1 -0
  923. package/dist/core/results.js +146 -14
  924. package/dist/core/results.js.map +1 -1
  925. package/dist/core/scaffold/landscape.js +239 -0
  926. package/dist/core/scaffold/landscape.js.map +1 -0
  927. package/dist/core/scaffold/legacy.js +271 -0
  928. package/dist/core/scaffold/legacy.js.map +1 -0
  929. package/dist/core/scaffold/readme.js +84 -0
  930. package/dist/core/scaffold/readme.js.map +1 -0
  931. package/dist/core/staging/commit.js +252 -0
  932. package/dist/core/staging/commit.js.map +1 -0
  933. package/dist/core/staging/interrupted.js +96 -0
  934. package/dist/core/staging/interrupted.js.map +1 -0
  935. package/dist/core/staging/lock.js +268 -0
  936. package/dist/core/staging/lock.js.map +1 -0
  937. package/dist/core/staging/recovery/finding.js +35 -0
  938. package/dist/core/staging/recovery/finding.js.map +1 -0
  939. package/dist/core/staging/recovery/intent.js +95 -0
  940. package/dist/core/staging/recovery/intent.js.map +1 -0
  941. package/dist/core/staging/recovery/recover.js +204 -0
  942. package/dist/core/staging/recovery/recover.js.map +1 -0
  943. package/dist/core/staging/recovery/residue.js +62 -0
  944. package/dist/core/staging/recovery/residue.js.map +1 -0
  945. package/dist/core/staging/snapshot/manifest.js +188 -0
  946. package/dist/core/staging/snapshot/manifest.js.map +1 -0
  947. package/dist/core/staging/snapshot/snapshot.js +196 -0
  948. package/dist/core/staging/snapshot/snapshot.js.map +1 -0
  949. package/dist/core/staging/txn/forward.js +181 -0
  950. package/dist/core/staging/txn/forward.js.map +1 -0
  951. package/dist/core/staging/txn/journal.js +139 -0
  952. package/dist/core/staging/txn/journal.js.map +1 -0
  953. package/dist/core/staging/txn/transaction.js +75 -0
  954. package/dist/core/staging/txn/transaction.js.map +1 -0
  955. package/dist/core/staging/writes.js +113 -0
  956. package/dist/core/staging/writes.js.map +1 -0
  957. package/dist/core/status/actions/execution.js +60 -0
  958. package/dist/core/status/actions/execution.js.map +1 -0
  959. package/dist/core/status/contracts.js +126 -0
  960. package/dist/core/status/contracts.js.map +1 -0
  961. package/dist/core/status/feature/artifacts.js +196 -0
  962. package/dist/core/status/feature/artifacts.js.map +1 -0
  963. package/dist/core/status/feature/feature.js +214 -0
  964. package/dist/core/status/feature/feature.js.map +1 -0
  965. package/dist/core/status/feature/next.js +163 -0
  966. package/dist/core/status/feature/next.js.map +1 -0
  967. package/dist/core/status/feature/state.js +21 -0
  968. package/dist/core/status/feature/state.js.map +1 -0
  969. package/dist/core/status/feature/words.js +96 -0
  970. package/dist/core/status/feature/words.js.map +1 -0
  971. package/dist/core/status/fleet/fleet.js +216 -0
  972. package/dist/core/status/fleet/fleet.js.map +1 -0
  973. package/dist/core/status/fleet/next.js +302 -0
  974. package/dist/core/status/fleet/next.js.map +1 -0
  975. package/dist/core/status/interrupted.js +97 -0
  976. package/dist/core/status/interrupted.js.map +1 -0
  977. package/dist/core/status/report.js +31 -0
  978. package/dist/core/status/report.js.map +1 -0
  979. package/dist/core/status/scan.js +41 -0
  980. package/dist/core/status/scan.js.map +1 -0
  981. package/dist/core/status/verification.js +216 -0
  982. package/dist/core/status/verification.js.map +1 -0
  983. package/dist/core/tasks/packet.js +199 -0
  984. package/dist/core/tasks/packet.js.map +1 -0
  985. package/dist/core/tasks/record.js +43 -0
  986. package/dist/core/tasks/record.js.map +1 -0
  987. package/dist/core/tasks/sources.js +181 -0
  988. package/dist/core/tasks/sources.js.map +1 -0
  989. package/dist/core/tasks/stamps.js +76 -0
  990. package/dist/core/tasks/stamps.js.map +1 -0
  991. package/dist/core/tasks/unit.js +0 -0
  992. package/dist/core/tasks/unit.js.map +1 -0
  993. package/dist/core/usecases/capability.js +166 -0
  994. package/dist/core/usecases/capability.js.map +1 -0
  995. package/dist/core/usecases/delta/claims.js +140 -0
  996. package/dist/core/usecases/delta/claims.js.map +1 -0
  997. package/dist/core/usecases/delta/flows.js +101 -0
  998. package/dist/core/usecases/delta/flows.js.map +1 -0
  999. package/dist/core/usecases/delta/modified.js +315 -0
  1000. package/dist/core/usecases/delta/modified.js.map +1 -0
  1001. package/dist/core/usecases/delta/overlay.js +76 -0
  1002. package/dist/core/usecases/delta/overlay.js.map +1 -0
  1003. package/dist/core/usecases/fleet.js +296 -0
  1004. package/dist/core/usecases/fleet.js.map +1 -0
  1005. package/dist/core/usecases/grade/capability-tag.js +93 -0
  1006. package/dist/core/usecases/grade/capability-tag.js.map +1 -0
  1007. package/dist/core/usecases/grade/feature.js +88 -0
  1008. package/dist/core/usecases/grade/feature.js.map +1 -0
  1009. package/dist/core/usecases/grade/requirement-tag.js +94 -0
  1010. package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
  1011. package/dist/core/usecases/grade/steps.js +266 -0
  1012. package/dist/core/usecases/grade/steps.js.map +1 -0
  1013. package/dist/core/usecases/grade/usecases.js +112 -0
  1014. package/dist/core/usecases/grade/usecases.js.map +1 -0
  1015. package/dist/core/usecases/operations.js +123 -0
  1016. package/dist/core/usecases/operations.js.map +1 -0
  1017. package/dist/core/usecases/place.js +44 -0
  1018. package/dist/core/usecases/place.js.map +1 -0
  1019. package/dist/core/usecases/service/exclude.js +119 -0
  1020. package/dist/core/usecases/service/exclude.js.map +1 -0
  1021. package/dist/core/usecases/service/flows.js +164 -0
  1022. package/dist/core/usecases/service/flows.js.map +1 -0
  1023. package/dist/core/usecases/suites/participants.js +83 -0
  1024. package/dist/core/usecases/suites/participants.js.map +1 -0
  1025. package/dist/core/usecases/suites/suites.js +45 -0
  1026. package/dist/core/usecases/suites/suites.js.map +1 -0
  1027. package/dist/core/usecases/touch.js +101 -0
  1028. package/dist/core/usecases/touch.js.map +1 -0
  1029. package/dist/core/verify/answers.js +180 -0
  1030. package/dist/core/verify/answers.js.map +1 -0
  1031. package/dist/core/verify/build.js +170 -0
  1032. package/dist/core/verify/build.js.map +1 -0
  1033. package/dist/core/verify/checklist.js +259 -0
  1034. package/dist/core/verify/checklist.js.map +1 -0
  1035. package/dist/core/verify/claims/identity.js +61 -0
  1036. package/dist/core/verify/claims/identity.js.map +1 -0
  1037. package/dist/core/verify/cross/diff.js +97 -0
  1038. package/dist/core/verify/cross/diff.js.map +1 -0
  1039. package/dist/core/verify/evidence/contract.js +169 -0
  1040. package/dist/core/verify/evidence/contract.js.map +1 -0
  1041. package/dist/core/verify/location.js +67 -0
  1042. package/dist/core/verify/location.js.map +1 -0
  1043. package/dist/core/verify/pins/lint.js +158 -0
  1044. package/dist/core/verify/pins/lint.js.map +1 -0
  1045. package/dist/core/verify/pins/pin.js +95 -0
  1046. package/dist/core/verify/pins/pin.js.map +1 -0
  1047. package/dist/core/verify/read/file.js +224 -0
  1048. package/dist/core/verify/read/file.js.map +1 -0
  1049. package/dist/core/verify/read/shape.js +169 -0
  1050. package/dist/core/verify/read/shape.js.map +1 -0
  1051. package/dist/core/verify/read/union.js +105 -0
  1052. package/dist/core/verify/read/union.js.map +1 -0
  1053. package/dist/core/verify/record.js +165 -0
  1054. package/dist/core/verify/record.js.map +1 -0
  1055. package/dist/core/verify/store/commit.js +99 -0
  1056. package/dist/core/verify/store/commit.js.map +1 -0
  1057. package/dist/core/verify/store/render.js +61 -0
  1058. package/dist/core/verify/store/render.js.map +1 -0
  1059. package/dist/core/vocabulary/health.js +91 -0
  1060. package/dist/core/vocabulary/health.js.map +1 -0
  1061. package/dist/core/vocabulary/issue.js +59 -0
  1062. package/dist/core/vocabulary/issue.js.map +1 -0
  1063. package/dist/core/vocabulary/maturity.js +216 -0
  1064. package/dist/core/vocabulary/maturity.js.map +1 -0
  1065. package/dist/core/vocabulary/report.js +90 -0
  1066. package/dist/core/vocabulary/report.js.map +1 -0
  1067. package/dist/core/vocabulary/steps.js +266 -0
  1068. package/dist/core/vocabulary/steps.js.map +1 -0
  1069. package/dist/core/workspace/discover.js +239 -0
  1070. package/dist/core/workspace/discover.js.map +1 -0
  1071. package/dist/core/workspace/render.js +52 -0
  1072. package/dist/core/workspace/render.js.map +1 -0
  1073. package/examples/README.md +232 -0
  1074. package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
  1075. package/examples/docs/architecture/capabilities.yaml +31 -0
  1076. package/examples/docs/architecture/landscape.likec4 +336 -0
  1077. package/examples/docs/architecture/obligations.yaml +23 -0
  1078. package/examples/docs/architecture/permissions.yaml +50 -0
  1079. package/examples/docs/architecture/services.likec4 +70 -0
  1080. package/examples/docs/architecture/subsystems.likec4 +18 -0
  1081. package/examples/docs/architecture/usecases/order-notification.likec4 +74 -0
  1082. package/examples/docs/capabilities/checkout/spec.md +55 -0
  1083. package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
  1084. package/examples/docs/capabilities/order-notifications/spec.md +43 -0
  1085. package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
  1086. package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
  1087. package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
  1088. package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
  1089. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +132 -0
  1090. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
  1091. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
  1092. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
  1093. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
  1094. package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
  1095. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +31 -0
  1096. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
  1097. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
  1098. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
  1099. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
  1100. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
  1101. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
  1102. package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
  1103. package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
  1104. package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
  1105. package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
  1106. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +73 -0
  1107. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
  1108. package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
  1109. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
  1110. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
  1111. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
  1112. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
  1113. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
  1114. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
  1115. package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
  1116. package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
  1117. package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
  1118. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
  1119. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
  1120. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
  1121. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
  1122. package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
  1123. package/examples/docs/glossary/order.md +15 -0
  1124. package/examples/docs/glossary/payments/authorization.md +14 -0
  1125. package/examples/docs/likec4.config.json +8 -0
  1126. package/examples/docs/loam.json +3 -0
  1127. package/examples/docs/services/checkout-web/model.likec4 +92 -0
  1128. package/examples/docs/services/checkout-web/spec.md +91 -0
  1129. package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
  1130. package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
  1131. package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
  1132. package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
  1133. package/examples/docs/services/order-service/arch.spec.md +134 -0
  1134. package/examples/docs/services/order-service/asyncapi.yaml +109 -0
  1135. package/examples/docs/services/order-service/health.yaml +57 -0
  1136. package/examples/docs/services/order-service/model.likec4 +126 -0
  1137. package/examples/docs/services/order-service/openapi.yaml +257 -0
  1138. package/examples/docs/services/order-service/runbook.md +62 -0
  1139. package/examples/docs/services/order-service/spec.md +134 -0
  1140. package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
  1141. package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
  1142. package/examples/docs/services/payment-service/arch.spec.md +76 -0
  1143. package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
  1144. package/examples/docs/services/payment-service/health.yaml +39 -0
  1145. package/examples/docs/services/payment-service/model.likec4 +68 -0
  1146. package/examples/docs/services/payment-service/openapi.yaml +151 -0
  1147. package/examples/docs/services/payment-service/runbook.md +37 -0
  1148. package/examples/docs/services/payment-service/spec.md +88 -0
  1149. package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
  1150. package/examples/docs/services/platform/identity-service/arch.spec.md +120 -0
  1151. package/examples/docs/services/platform/identity-service/health.yaml +70 -0
  1152. package/examples/docs/services/platform/identity-service/model.likec4 +81 -0
  1153. package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
  1154. package/examples/docs/services/platform/identity-service/runbook.md +95 -0
  1155. package/examples/docs/services/platform/identity-service/spec.md +119 -0
  1156. package/examples/docs/services/platform/notification-service/asyncapi.yaml +200 -0
  1157. package/examples/docs/services/platform/notification-service/health.yaml +40 -0
  1158. package/examples/docs/services/platform/notification-service/model.likec4 +97 -0
  1159. package/examples/docs/services/platform/notification-service/runbook.md +48 -0
  1160. package/examples/docs/services/platform/notification-service/spec.md +112 -0
  1161. package/examples/docs/services/platform/subsystem.yaml +2 -0
  1162. package/examples/fleet.yaml +57 -0
  1163. package/package.json +19 -6
  1164. package/dist/commands/adopt.js +0 -240
  1165. package/dist/commands/adopt.js.map +0 -1
  1166. package/dist/commands/archive.js +0 -1313
  1167. package/dist/commands/archive.js.map +0 -1
  1168. package/dist/commands/delta.js +0 -388
  1169. package/dist/commands/delta.js.map +0 -1
  1170. package/dist/commands/docs-repo-gate.js.map +0 -1
  1171. package/dist/commands/format.js +0 -17
  1172. package/dist/commands/format.js.map +0 -1
  1173. package/dist/commands/gherkin.js +0 -309
  1174. package/dist/commands/gherkin.js.map +0 -1
  1175. package/dist/commands/init.js.map +0 -1
  1176. package/dist/commands/list.js +0 -295
  1177. package/dist/commands/list.js.map +0 -1
  1178. package/dist/commands/migrate-openspec.js +0 -950
  1179. package/dist/commands/migrate-openspec.js.map +0 -1
  1180. package/dist/commands/new.js +0 -413
  1181. package/dist/commands/new.js.map +0 -1
  1182. package/dist/commands/rebase.js +0 -356
  1183. package/dist/commands/rebase.js.map +0 -1
  1184. package/dist/commands/show.js +0 -320
  1185. package/dist/commands/show.js.map +0 -1
  1186. package/dist/commands/status.js +0 -262
  1187. package/dist/commands/status.js.map +0 -1
  1188. package/dist/commands/unarchive.js +0 -317
  1189. package/dist/commands/unarchive.js.map +0 -1
  1190. package/dist/commands/validate.js +0 -1773
  1191. package/dist/commands/validate.js.map +0 -1
  1192. package/dist/commands/verify.js +0 -775
  1193. package/dist/commands/verify.js.map +0 -1
  1194. package/dist/commands/vouch.js +0 -421
  1195. package/dist/commands/vouch.js.map +0 -1
  1196. package/dist/core/agent.js +0 -2173
  1197. package/dist/core/agent.js.map +0 -1
  1198. package/dist/core/agents-stamp.js.map +0 -1
  1199. package/dist/core/arch.js +0 -130
  1200. package/dist/core/arch.js.map +0 -1
  1201. package/dist/core/asyncapi.js +0 -253
  1202. package/dist/core/asyncapi.js.map +0 -1
  1203. package/dist/core/brief.js +0 -755
  1204. package/dist/core/brief.js.map +0 -1
  1205. package/dist/core/coherence.js +0 -577
  1206. package/dist/core/coherence.js.map +0 -1
  1207. package/dist/core/concurrency.js.map +0 -1
  1208. package/dist/core/config.js.map +0 -1
  1209. package/dist/core/delta.js +0 -476
  1210. package/dist/core/delta.js.map +0 -1
  1211. package/dist/core/dependencies.js +0 -356
  1212. package/dist/core/dependencies.js.map +0 -1
  1213. package/dist/core/doctor.js +0 -596
  1214. package/dist/core/doctor.js.map +0 -1
  1215. package/dist/core/document-bytes.js.map +0 -1
  1216. package/dist/core/explore.js +0 -225
  1217. package/dist/core/explore.js.map +0 -1
  1218. package/dist/core/frontmatter.js.map +0 -1
  1219. package/dist/core/gherkin.js +0 -463
  1220. package/dist/core/gherkin.js.map +0 -1
  1221. package/dist/core/health.js +0 -67
  1222. package/dist/core/health.js.map +0 -1
  1223. package/dist/core/ids.js +0 -122
  1224. package/dist/core/ids.js.map +0 -1
  1225. package/dist/core/issue.js +0 -9
  1226. package/dist/core/issue.js.map +0 -1
  1227. package/dist/core/json.js +0 -74
  1228. package/dist/core/json.js.map +0 -1
  1229. package/dist/core/likec4.js +0 -489
  1230. package/dist/core/likec4.js.map +0 -1
  1231. package/dist/core/maturity.js +0 -66
  1232. package/dist/core/maturity.js.map +0 -1
  1233. package/dist/core/openapi-merge.js +0 -552
  1234. package/dist/core/openapi-merge.js.map +0 -1
  1235. package/dist/core/openapi.js.map +0 -1
  1236. package/dist/core/openspec-inventory.js +0 -1440
  1237. package/dist/core/openspec-inventory.js.map +0 -1
  1238. package/dist/core/path-safety.js.map +0 -1
  1239. package/dist/core/provenance.js +0 -787
  1240. package/dist/core/provenance.js.map +0 -1
  1241. package/dist/core/records.js.map +0 -1
  1242. package/dist/core/repo.js +0 -438
  1243. package/dist/core/repo.js.map +0 -1
  1244. package/dist/core/report.js +0 -47
  1245. package/dist/core/report.js.map +0 -1
  1246. package/dist/core/spec.js +0 -505
  1247. package/dist/core/spec.js.map +0 -1
  1248. package/dist/core/staging.js +0 -890
  1249. package/dist/core/staging.js.map +0 -1
  1250. package/dist/core/status.js +0 -1132
  1251. package/dist/core/status.js.map +0 -1
  1252. package/dist/core/steps.js +0 -72
  1253. package/dist/core/steps.js.map +0 -1
  1254. package/dist/core/verify.js +0 -807
  1255. package/dist/core/verify.js.map +0 -1
  1256. package/dist/core/version.js.map +0 -1
@@ -0,0 +1,113 @@
1
+ /**
2
+ * The consumer index read AFTER one feature — the documents as that feature's
3
+ * merge would leave them, so a consumer the same feature removes or rewrites
4
+ * stops counting.
5
+ *
6
+ * WHY THE GATE NEEDS IT. The archive gate's question is not "who names this
7
+ * operation today" but "who will still name it once this archive lands", and
8
+ * the two differ by exactly what the feature itself writes. A rename has to
9
+ * restate the requirement that governs the old operation, and a removal whose
10
+ * feature also REMOVES another service's requirement naming it has already
11
+ * retired that consumer — the remedy the refusal itself gives ("retire the
12
+ * requirement that names it"). Read off the living files alone, both were
13
+ * refused for a consumer the same archive deletes: the requirement scan read
14
+ * living spec.md only, so following the remedy inside the feature did not clear
15
+ * the finding (the capability axis's `capability.remove-requirement-realized`
16
+ * has always graded its own join after the merge; this is the contract axes
17
+ * catching up).
18
+ *
19
+ * WHAT A FEATURE CAN EXPRESS, AND WHAT IT CANNOT. Requirements, yes: a spec
20
+ * delta MODIFIES or REMOVES a requirement of any service it carries
21
+ * `specs/<svc>/` for, and the merge is `applyRequirementDelta` — the archive's
22
+ * own function, so the view cannot disagree with what the archive writes. A
23
+ * contract, yes: the ownership check below asks the contract the merge would
24
+ * write. EDGES AND USE-CASE HOPS, NO: the landscape merge only ADDS edges and a
25
+ * feature's flows are create-only, so no `delta.likec4` and no `usecases/`
26
+ * document can take a living edge or hop away. Those are read as they stand —
27
+ * the one way to drop or redraw a living edge is to edit the living map in the
28
+ * same change, and that edit is then simply what the index reads. What the
29
+ * merge CAN change about a living edge is the directory its source resolves
30
+ * to: every `specs/<svc>/` becomes a `services/<svc>/`, and an #external
31
+ * element resolving to one stops producing (`services` below).
32
+ */
33
+ import { existsSync } from "node:fs";
34
+ import { applyRequirementDelta } from "../document/apply.js";
35
+ import { featureSpecPaths } from "../repo/paths.js";
36
+ import { serviceOperationIds } from "../openapi/doc.js";
37
+ export function featureView(scope) {
38
+ const { docsDir, featureDir, context } = scope;
39
+ const deltas = new Map();
40
+ const contracts = new Map();
41
+ return {
42
+ delta: (service, axis) => {
43
+ const key = `${service}\0${axis}`;
44
+ let pending = deltas.get(key);
45
+ if (pending === undefined) {
46
+ const path = featureSpecPaths(featureDir, service)[axis];
47
+ // A delta that does not read is the delta checks' finding to make
48
+ // (`delta.*`); here it credits nothing, which can only keep a consumer
49
+ // counted — the closed direction.
50
+ pending = existsSync(path) ? context.readRequirements(path).catch(() => undefined) : Promise.resolve(undefined);
51
+ deltas.set(key, pending);
52
+ }
53
+ return pending;
54
+ },
55
+ defines: async (service, op) => {
56
+ let pending = contracts.get(service);
57
+ if (pending === undefined) {
58
+ // `serviceOperationIds` is the rule every same-feature contract check
59
+ // reads — living upserts minus removals, removals first — so the
60
+ // ownership question cannot disagree with E1 about what the merge
61
+ // leaves defined.
62
+ pending = existsSync(featureSpecPaths(featureDir, service).openapi)
63
+ ? serviceOperationIds(docsDir, service, featureDir, context).then((ids) => new Set(ids))
64
+ : Promise.resolve(undefined);
65
+ contracts.set(service, pending);
66
+ }
67
+ const ids = await pending;
68
+ return ids === undefined ? undefined : ids.has(op);
69
+ },
70
+ services: () => context.featureSpecServices(featureDir),
71
+ };
72
+ }
73
+ /**
74
+ * One spec file's requirements as the merge would leave them — and FAILING
75
+ * CLOSED when the merge would refuse.
76
+ *
77
+ * No delta (or one holding only quoted, BASE requirements) is the living file
78
+ * itself, read directly. That is not an optimisation: `applyRequirementDelta`
79
+ * grades the LIVING file's `Requirement-ID` declarations too, so asking it to
80
+ * apply an empty delta over a living spec with one malformed id threw, and the
81
+ * catch that used to follow answered "no consumers" — a removal of an
82
+ * operation that spec still governed then passed the gate at exit 0, and the
83
+ * next `validate --all` reported `spec-api.op-undefined` (review 2026-10-12,
84
+ * finding 5).
85
+ *
86
+ * A delta the merge refuses is the living file PLUS every requirement the delta
87
+ * ADDS or MODIFIES. Its identity errors already gate (`delta.*`), and nothing it
88
+ * says can land until they are fixed — but "nothing can land" was never a
89
+ * reason to answer "nobody consumes it": the fix that lands next is one of the
90
+ * readings this union covers, so a consumer in any of them still counts. A
91
+ * REMOVED requirement credits nothing on this path, because whether it would
92
+ * select the living one is exactly what the merge could not decide.
93
+ *
94
+ * Untouched requirements come back from the merge as the very objects that went
95
+ * in (`apply.ts` states the identity is load-bearing), which is what tells a
96
+ * living consumer from one this feature wrote.
97
+ */
98
+ export function afterMerge(living, delta) {
99
+ const asLiving = (requirement) => ({ requirement, written: false });
100
+ if (delta === undefined || delta.every((d) => d.kind === "BASE"))
101
+ return living.map(asLiving);
102
+ try {
103
+ const untouched = new Set(living);
104
+ return applyRequirementDelta(living, delta).map((requirement) => ({ requirement, written: !untouched.has(requirement) }));
105
+ }
106
+ catch {
107
+ return [
108
+ ...living.map(asLiving),
109
+ ...delta.filter((d) => d.kind === "ADDED" || d.kind === "MODIFIED").map((requirement) => ({ requirement, written: true })),
110
+ ];
111
+ }
112
+ }
113
+ //# sourceMappingURL=after.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after.js","sourceRoot":"","sources":["../../../src/core/consumers/after.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The consumer index read AFTER one feature — the documents as that feature's\n * merge would leave them, so a consumer the same feature removes or rewrites\n * stops counting.\n *\n * WHY THE GATE NEEDS IT. The archive gate's question is not \"who names this\n * operation today\" but \"who will still name it once this archive lands\", and\n * the two differ by exactly what the feature itself writes. A rename has to\n * restate the requirement that governs the old operation, and a removal whose\n * feature also REMOVES another service's requirement naming it has already\n * retired that consumer — the remedy the refusal itself gives (\"retire the\n * requirement that names it\"). Read off the living files alone, both were\n * refused for a consumer the same archive deletes: the requirement scan read\n * living spec.md only, so following the remedy inside the feature did not clear\n * the finding (the capability axis's `capability.remove-requirement-realized`\n * has always graded its own join after the merge; this is the contract axes\n * catching up).\n *\n * WHAT A FEATURE CAN EXPRESS, AND WHAT IT CANNOT. Requirements, yes: a spec\n * delta MODIFIES or REMOVES a requirement of any service it carries\n * `specs/<svc>/` for, and the merge is `applyRequirementDelta` — the archive's\n * own function, so the view cannot disagree with what the archive writes. A\n * contract, yes: the ownership check below asks the contract the merge would\n * write. EDGES AND USE-CASE HOPS, NO: the landscape merge only ADDS edges and a\n * feature's flows are create-only, so no `delta.likec4` and no `usecases/`\n * document can take a living edge or hop away. Those are read as they stand —\n * the one way to drop or redraw a living edge is to edit the living map in the\n * same change, and that edit is then simply what the index reads. What the\n * merge CAN change about a living edge is the directory its source resolves\n * to: every `specs/<svc>/` becomes a `services/<svc>/`, and an #external\n * element resolving to one stops producing (`services` below).\n */\nimport { existsSync } from \"node:fs\";\nimport { applyRequirementDelta } from \"../document/apply.js\";\nimport type { Requirement } from \"../document/spec.js\";\nimport { featureSpecPaths } from \"../repo/paths.js\";\nimport { serviceOperationIds } from \"../openapi/doc.js\";\nimport type { FleetContext } from \"../fleet-context.js\";\nimport type { DocsDir, FeatureDir } from \"../kernel/ids/dirs.js\";\nimport type { RawServiceId } from \"../kernel/ids/service.js\";\n\n/** The two requirement files a service carries — every consumer scan reads both. */\nexport type SpecAxis = \"spec\" | \"archSpec\";\n\n/** One requirement as the merge would leave it, and whether THIS feature wrote it there. */\nexport interface MergedRequirement {\n requirement: Requirement;\n /** True for a requirement the feature's delta added or rewrote — what lets a finding say whose line it is. */\n written: boolean;\n}\n\n/** What the index asks of the feature it reads after. */\nexport interface FeatureView {\n /** The feature's own requirement delta for one service's spec file, or `undefined` when it carries none (or none that reads). */\n delta(service: RawServiceId, axis: SpecAxis): Promise<Requirement[] | undefined>;\n /** Does `service`'s contract, as this merge leaves it, define `op`? `undefined` when the feature carries no contract delta for it — the living contract answers. */\n defines(service: RawServiceId, op: string): Promise<boolean | undefined>;\n /**\n * The service ids this merge leaves a `services/<id>/` directory for: every\n * `specs/<id>/` the feature carries, which the archive materialises one from\n * (the reason `unknownDeltaServices`, `core/coherence/living.ts`, refuses a\n * stray one). All of them, the ones the gate refuses as unknown or ill-named\n * included: a directory too many can only take an outside producer away,\n * the closed direction, and such a feature does not archive anyway.\n */\n services(): Promise<readonly RawServiceId[]>;\n}\n\n/** The feature whose merge a view reads after. */\nexport interface FeatureScope {\n docsDir: DocsDir;\n featureDir: FeatureDir;\n context: FleetContext;\n}\n\nexport function featureView(scope: FeatureScope): FeatureView {\n const { docsDir, featureDir, context } = scope;\n const deltas = new Map<string, Promise<Requirement[] | undefined>>();\n const contracts = new Map<string, Promise<ReadonlySet<string> | undefined>>();\n return {\n delta: (service, axis) => {\n const key = `${service}\\0${axis}`;\n let pending = deltas.get(key);\n if (pending === undefined) {\n const path = featureSpecPaths(featureDir, service)[axis];\n // A delta that does not read is the delta checks' finding to make\n // (`delta.*`); here it credits nothing, which can only keep a consumer\n // counted — the closed direction.\n pending = existsSync(path) ? context.readRequirements(path).catch(() => undefined) : Promise.resolve(undefined);\n deltas.set(key, pending);\n }\n return pending;\n },\n defines: async (service, op) => {\n let pending = contracts.get(service);\n if (pending === undefined) {\n // `serviceOperationIds` is the rule every same-feature contract check\n // reads — living upserts minus removals, removals first — so the\n // ownership question cannot disagree with E1 about what the merge\n // leaves defined.\n pending = existsSync(featureSpecPaths(featureDir, service).openapi)\n ? serviceOperationIds(docsDir, service, featureDir, context).then((ids) => new Set(ids))\n : Promise.resolve(undefined);\n contracts.set(service, pending);\n }\n const ids = await pending;\n return ids === undefined ? undefined : ids.has(op);\n },\n services: () => context.featureSpecServices(featureDir),\n };\n}\n\n/**\n * One spec file's requirements as the merge would leave them — and FAILING\n * CLOSED when the merge would refuse.\n *\n * No delta (or one holding only quoted, BASE requirements) is the living file\n * itself, read directly. That is not an optimisation: `applyRequirementDelta`\n * grades the LIVING file's `Requirement-ID` declarations too, so asking it to\n * apply an empty delta over a living spec with one malformed id threw, and the\n * catch that used to follow answered \"no consumers\" — a removal of an\n * operation that spec still governed then passed the gate at exit 0, and the\n * next `validate --all` reported `spec-api.op-undefined` (review 2026-10-12,\n * finding 5).\n *\n * A delta the merge refuses is the living file PLUS every requirement the delta\n * ADDS or MODIFIES. Its identity errors already gate (`delta.*`), and nothing it\n * says can land until they are fixed — but \"nothing can land\" was never a\n * reason to answer \"nobody consumes it\": the fix that lands next is one of the\n * readings this union covers, so a consumer in any of them still counts. A\n * REMOVED requirement credits nothing on this path, because whether it would\n * select the living one is exactly what the merge could not decide.\n *\n * Untouched requirements come back from the merge as the very objects that went\n * in (`apply.ts` states the identity is load-bearing), which is what tells a\n * living consumer from one this feature wrote.\n */\nexport function afterMerge(living: Requirement[], delta: Requirement[] | undefined): MergedRequirement[] {\n const asLiving = (requirement: Requirement): MergedRequirement => ({ requirement, written: false });\n if (delta === undefined || delta.every((d) => d.kind === \"BASE\")) return living.map(asLiving);\n try {\n const untouched = new Set(living);\n return applyRequirementDelta(living, delta).map((requirement) => ({ requirement, written: !untouched.has(requirement) }));\n } catch {\n return [\n ...living.map(asLiving),\n ...delta.filter((d) => d.kind === \"ADDED\" || d.kind === \"MODIFIED\").map((requirement) => ({ requirement, written: true })),\n ];\n }\n}\n"]}
@@ -0,0 +1,296 @@
1
+ /**
2
+ * THE consumer index: who in the fleet still depends on an operation or a
3
+ * message — the join that turns "an operation left the contract" into "and
4
+ * these named consumers break", and "an operation's shape moved" into "and these
5
+ * are the consumers to check it against".
6
+ *
7
+ * ONE INDEX, FOUR READERS. `loam diff` names the victims of every removal,
8
+ * deprecation and modification since a base ref (`core/diff/semantic.ts`); the
9
+ * coherence gate refuses a feature that takes a consumed operation or message
10
+ * out of the contract (`openapi.remove-op-consumed`, `asyncapi.remove-message-
11
+ * consumed` — `core/coherence/consumed/operations.ts`, `core/coherence/events/events.ts`);
12
+ * and `loam archive` names who an overwrite lands on
13
+ * (`commands/archive/plan/contracts/consumers.ts`). They used to be THREE
14
+ * copies — this module as `core/diff/victims.ts`, `edgeConsumers` /
15
+ * `requirementConsumers` / `governorsAfterMerge` in `core/coherence/lookups.ts`,
16
+ * `messageConsumers` in `core/coherence/events/lookups.ts` — kept "in step by
17
+ * hand", and they were not: the gate read `architecture/landscape.likec4` alone
18
+ * while the diff and the spine read the project, the gate never asked a use
19
+ * case, and the diff excluded an internal edge the gate counted. Rule 13
20
+ * (docs/DESIGN.md) fired at the third copy; this is the extraction it forces.
21
+ *
22
+ * THE SOURCES, per question:
23
+ *
24
+ * - an operation `op` of `provider`: (1) every edge of the `architecture/`
25
+ * PROJECT with `metadata { op }` into the provider (`./current.ts` says why
26
+ * the project and never the one file); (2) other services' requirements —
27
+ * spec.md AND arch.spec.md — whose `Operations:` line names it, unless that
28
+ * service's own contract defines the same id (`ownsOperation` says why);
29
+ * (3) the use-case hops the model attributes to it
30
+ * (`core/usecases/operations.ts`); (4) the provider's OWN spec.md
31
+ * requirements — the file `validate` grades its `Operations:` lines in —
32
+ * and its own internal edges still naming it, filed apart as `own`.
33
+ * - a message `name` of `provider`: `consumes` edges, other services'
34
+ * `Consumes:` lines over both spec files, the use-case hops backed by such an
35
+ * edge, and — as `own` — the provider's own `publishes` edges and
36
+ * `Publishes:` lines over both spec files, which `validate` grades alike.
37
+ *
38
+ * WHY `own` IS ITS OWN LIST. The gate's question is what the merge would leave
39
+ * broken, and the provider's own documents break too: an overwrite carries no
40
+ * removal marker, so nothing made the author restate the provider's requirement
41
+ * still naming the old id, and the next `validate` reported
42
+ * `spec-api.op-undefined` against the provider itself; a message re-keyed or no
43
+ * longer sent left the provider's own `Publishes:` line behind for
44
+ * `spec-event.message-undefined`. So the gate counts `own`. `loam diff` and the
45
+ * archive's overwrite warnings answer a different question — who ELSE breaks —
46
+ * and do not: the rule `usecase.step-unlinked` states, that a service owes no
47
+ * operationId to itself, is why an internal edge stopped keeping every removal
48
+ * `diff.op-removed-consumed` (verification 2026-09-04, R3), and why a hop whose
49
+ * two ends are the provider is never a victim.
50
+ *
51
+ * WHAT A DOUBT IS WORTH. A consumer the index could not check is a typed
52
+ * suspension (`./scan.ts`), never a silent nothing, and the readers weigh the
53
+ * kinds differently: `loam diff` and the overwrite warnings list every one; the
54
+ * gate refuses on a document nobody could read or place — a consumer's, in
55
+ * `suspended`, or the provider's own, in `ownSuspended` — and never on a caller
56
+ * drawn with no op or a contested hop (`documentDoubt` says why).
57
+ *
58
+ * READ AFTER A FEATURE, OR AS IT STANDS. With `afterFeature`, every requirement is read
59
+ * as that feature's merge would leave it (`./after.ts` — a consumer the same
60
+ * feature MODIFIES or REMOVES stops counting, and an unappliable delta fails
61
+ * closed); without it, the living fleet as it stands, which is what the diff and
62
+ * the overwrite warnings ask. Edges and hops read the same either way: no
63
+ * feature can take a living one away — though it can create the directory an
64
+ * #external producer resolves to (`externalProducer` says what that changes).
65
+ *
66
+ * LAZY, AND PAID ONCE PER INVOCATION. The fleet's four documents per service and
67
+ * the project load are behind the first question that needs them, and memoised
68
+ * per FleetContext (`./current.ts`), so a removal-free feature pays for neither
69
+ * and `validate --all` pays once for every feature it grades. Without a
70
+ * context (the archive gate's coherence call) the index reads through one of its
71
+ * own, for its own lifetime.
72
+ */
73
+ import {} from "../c4/likec4.js";
74
+ import { hopsConsuming, hopsExercising } from "../usecases/operations.js";
75
+ import { FleetContext } from "../fleet-context.js";
76
+ import { livingFleet, livingMap } from "./current.js";
77
+ import { afterMerge, featureView } from "./after.js";
78
+ /**
79
+ * Both spec files, for every question about another service — the provider's
80
+ * own lines are read where `validate` grades them (`RequirementRule.ownAxes`).
81
+ * The message half always read both — an
82
+ * outbox requirement in arch.spec.md is the canonical home of a `Publishes:`
83
+ * line, and a scan of spec.md alone answered "nobody consumes it" over the file
84
+ * most authors use. The operation half read spec.md only, because that is
85
+ * where `validate` grades an `Operations:` line; but an arch.spec.md line
86
+ * naming another service's operation is exactly the cross-service dependency
87
+ * `loam dependencies` already reads off both files, and a removal must not
88
+ * read the same line as a dependency there and as nothing here.
89
+ */
90
+ export const REQUIREMENT_AXES = ["spec", "archSpec"];
91
+ /**
92
+ * Does this service's own living contract define `op`? Then an `Operations:`
93
+ * line of its own names ITS operation, not another service's.
94
+ *
95
+ * Two rules say so, one per spec file. In spec.md it is the rule `validate`
96
+ * grades an `Operations:` line by: it resolves against the requirement's own
97
+ * service's contract (`spec-api.op-undefined`, `commands/validate/service/
98
+ * api.ts`), so in a green fleet another service naming the same id there is
99
+ * naming its own. `validate` never grades an arch.spec.md line against a
100
+ * contract; there it is `loam dependencies`' rule — a requirement naming an
101
+ * operation its own service already provides is "not a dependency on
102
+ * anybody" (`core/dependencies/facts.ts`), read off both files. Matching the bare
103
+ * id fleet-wide refused a rename on payment-service because checkout-web's own
104
+ * `capturePayment` requirement shared the name (review 2026-10-12, finding 1) —
105
+ * and shared ids like `healthCheck` or `getStatus` are common across a fleet.
106
+ *
107
+ * A contract that is unreadable or absent proves no ownership, so the line stays
108
+ * a consumer: the closed direction, and the reading every scan here gave before
109
+ * ownership was asked at all.
110
+ */
111
+ export function ownsOperation(state, op) {
112
+ return state.openapi.kind === "read" && state.openapi.value.some((o) => o.id === op);
113
+ }
114
+ const EDGE = (resolve, r) => `edge ${resolve(r.source)} → ${resolve(r.target)}${r.title === undefined ? "" : ` ("${r.title}")`}`;
115
+ /** Entry comparator by map key — deterministic suspension order. */
116
+ const byFirst = (a, b) => (a[0] < b[0] ? -1 : 1);
117
+ export function consumerIndex(request) {
118
+ const { docsDir } = request;
119
+ const context = request.context ?? new FleetContext();
120
+ const after = request.afterFeature === undefined ? undefined : featureView({ docsDir, featureDir: request.afterFeature, context });
121
+ /** One service's requirements on one axis as `after`'s merge would leave them, read once per index. */
122
+ const merged = new Map();
123
+ const requirementsOf = (state, axis) => {
124
+ const key = `${state.id}\0${axis}`;
125
+ let pending = merged.get(key);
126
+ if (pending === undefined) {
127
+ const a = state[axis];
128
+ pending =
129
+ a.kind === "unreadable"
130
+ ? Promise.resolve({ unreadable: a.path })
131
+ : (async () => afterMerge(a.kind === "read" ? a.value : [], await after?.delta(state.id, axis)))();
132
+ merged.set(key, pending);
133
+ }
134
+ return pending;
135
+ };
136
+ const label = (service, m) => m.written
137
+ ? `this feature's ${service} delta requirement '${m.requirement.name}'`
138
+ : `${service}'s living requirement '${m.requirement.name}'`;
139
+ /**
140
+ * The requirement half of one scan, `tupleVisible`'s own discipline applied
141
+ * to victims: an unreadable consumer axis contributes a SUSPENSION, never a
142
+ * silent nothing — "consuming nothing" and "loam refused to read the file"
143
+ * are opposite facts, and collapsing them is how a breaking removal used to
144
+ * grade down to a confident warning. Sorted, so victim order never depends on
145
+ * the enumeration's walk order. A REMOVED requirement governs nothing: the
146
+ * rule `validate` reads living requirements by.
147
+ *
148
+ * The provider's own unreadable axis is NOT a suspension: it is not a
149
+ * consumer anybody else must be warned about, and that file is the provider's
150
+ * own finding (`validate`, and the delta checks when the feature restates it).
151
+ * It is filed as `ownSuspended`, which only the gate reads.
152
+ */
153
+ const scanRequirements = async (rule) => {
154
+ const { services, ambiguous } = await livingFleet(docsDir, context);
155
+ const out = { victims: [], suspended: [], own: [], ownSuspended: [] };
156
+ for (const id of [...services.keys()].sort()) {
157
+ const state = services.get(id);
158
+ const mine = id === rule.provider;
159
+ for (const axis of REQUIREMENT_AXES) {
160
+ if (mine && !rule.ownAxes.includes(axis))
161
+ continue;
162
+ const reqs = await requirementsOf(state, axis);
163
+ if (!Array.isArray(reqs)) {
164
+ if (mine)
165
+ out.ownSuspended.push({ kind: "unreadable", text: `${id} — ${reqs.unreadable} could not be read, so its own requirements could not be scanned` });
166
+ else
167
+ out.suspended.push({ kind: "unreadable", text: `${id} — ${reqs.unreadable} could not be read, so its requirements could not be scanned` });
168
+ continue;
169
+ }
170
+ for (const m of reqs) {
171
+ if (m.requirement.kind === "REMOVED")
172
+ continue;
173
+ if (mine ? rule.own(m.requirement) : await rule.foreign(state, m.requirement)) {
174
+ (mine ? out.own : out.victims).push(label(id, m));
175
+ }
176
+ }
177
+ }
178
+ }
179
+ for (const [id, dirs] of [...ambiguous].sort(byFirst)) {
180
+ const text = `${id} — claimed by ${dirs.join(" and ")}, so its ${id === rule.provider ? "own " : ""}documents could not be scanned`;
181
+ (id === rule.provider ? out.ownSuspended : out.suspended).push({ kind: "ambiguous", text });
182
+ }
183
+ return out;
184
+ };
185
+ /** Ownership as the merge leaves it: the feature's contract for a service it carries one for, the living one otherwise. */
186
+ const owns = async (state, op) => (await after?.defines(state.id, op)) ?? ownsOperation(state, op);
187
+ const opConsumers = async (provider, op) => {
188
+ const map = await livingMap(docsDir, context);
189
+ const edges = [];
190
+ const internal = [];
191
+ const unlinked = [];
192
+ for (const r of map.relationships ?? []) {
193
+ if (map.resolve(r.target) !== provider)
194
+ continue;
195
+ // An edge whose SOURCE resolves to the provider as well is the provider's
196
+ // own internal call — `own`, never a victim (the header says why). The
197
+ // spine still grades it against the contract, so the gate counts it.
198
+ const self = map.resolve(r.source) === provider;
199
+ if (r.op === op) {
200
+ (self ? internal : edges).push(EDGE(map.resolve, r));
201
+ }
202
+ else if (!self && r.op === undefined && r.publishes === undefined && r.consumes === undefined) {
203
+ // A caller drawn with NO op is neither a victim nor proof of absence:
204
+ // it calls the provider, and nobody wrote down which operation.
205
+ // Dropping it silently made every removal on a seeded fleet (`loam
206
+ // seed` draws every edge without an op) read "no current landscape
207
+ // edge names it" while validate warned `spine.op-link-missing` on the
208
+ // very edge. It rides as a suspension — a warning's worth of doubt,
209
+ // never an error, so an op-less map does not turn every removal red:
210
+ // its kind is `unlinked`, which the removal gate does not refuse on
211
+ // (`documentDoubt` in ./scan.ts says which kinds it does, and why).
212
+ // An edge naming a message instead (`publishes`/`consumes`) said what
213
+ // it carries and is the message half's to grade.
214
+ unlinked.push({ kind: "unlinked", text: `${EDGE(map.resolve, r)} has no \`metadata { op }\`, so whether it calls '${op}' is unknown` });
215
+ }
216
+ }
217
+ const reqs = await scanRequirements({
218
+ provider,
219
+ foreign: async (state, r) => r.operations.includes(op) && !(await owns(state, op)),
220
+ own: (r) => r.operations.includes(op),
221
+ // spec.md only: `validate` resolves an `Operations:` line against its
222
+ // own service's contract there (`spec-api.op-undefined`) and never in
223
+ // arch.spec.md, so the provider's arch.spec.md line naming the operation
224
+ // strands nothing — refusing for it turned a removal that archived
225
+ // before the one index into an exit 1 (the contract review, finding 2).
226
+ // Another service's arch.spec.md line still counts: there it is a
227
+ // dependency on this contract, as `loam dependencies` reads it.
228
+ ownAxes: ["spec"],
229
+ });
230
+ // Flows last in each list, deliberately: the edge and the requirement say
231
+ // WHICH document to open, and the flow says what the reader is about to
232
+ // break — so a `details[]` scanned top-down ends on the consequence.
233
+ const hops = hopsExercising(map.useCases, { provider, op });
234
+ return {
235
+ victims: [...edges, ...reqs.victims, ...hops.breaks],
236
+ suspended: [...unlinked, ...reqs.suspended, ...hops.unsure.map((text) => ({ kind: "contested", text }))],
237
+ own: [...internal, ...reqs.own],
238
+ ownSuspended: reqs.ownSuspended,
239
+ };
240
+ };
241
+ const messageConsumers = async (provider, name) => {
242
+ const map = await livingMap(docsDir, context);
243
+ const edges = [];
244
+ const outbound = [];
245
+ for (const r of map.relationships ?? []) {
246
+ // The message join is fleet-global (names are not service-scoped), so
247
+ // every edge naming it counts, whoever its producer is — except one INTO
248
+ // the provider itself: its own consumption leaves in the same change, and
249
+ // counting it would gate every self-consuming producer on its own
250
+ // retirement.
251
+ if (r.consumes === name && map.resolve(r.target) !== provider)
252
+ edges.push(EDGE(map.resolve, r));
253
+ // The provider's OWN `publishes` edge is the op half's internal edge on
254
+ // this axis: the spine grades a publishes edge on its SOURCE
255
+ // (`spine.message-undefined` when the source's contract sends no such
256
+ // message), so once the provider stops sending it the edge strands the
257
+ // provider itself — `own`, which only the gate counts. Collecting the
258
+ // `Publishes:` lines alone let a full retirement archive at exit 0 over
259
+ // a living publishes edge (the one-index review, finding 3). Another
260
+ // service's publishes edge is that service's claim, untouched by this one.
261
+ if (r.publishes === name && map.resolve(r.source) === provider)
262
+ outbound.push(EDGE(map.resolve, r));
263
+ }
264
+ // No ownership rule here, and the asymmetry is the contract's: a consumer
265
+ // declares the message in its OWN contract with `action: receive` — validate
266
+ // requires it to — so its own contract naming the message proves nothing
267
+ // about who sends it. The provider's own `Consumes:` line stays out for the
268
+ // edge's reason above; its own `Publishes:` line is what `own` is for,
269
+ // beside its publishes edges.
270
+ const reqs = await scanRequirements({
271
+ provider,
272
+ foreign: async (_state, r) => r.consumes.includes(name),
273
+ own: (r) => r.publishes.includes(name),
274
+ // Both: `validate` grades a `Publishes:` line in either file
275
+ // (`spec-event.message-undefined`), the outbox requirement in
276
+ // arch.spec.md being its canonical home.
277
+ ownAxes: REQUIREMENT_AXES,
278
+ });
279
+ const hops = hopsConsuming(map.useCases, { provider, name });
280
+ return { victims: [...edges, ...reqs.victims, ...hops], suspended: reqs.suspended, own: [...outbound, ...reqs.own], ownSuspended: reqs.ownSuspended };
281
+ };
282
+ const producers = async (name) => {
283
+ const { services } = await livingFleet(docsDir, context);
284
+ return [...services.keys()].sort().filter((id) => services.get(id).sent.includes(name));
285
+ };
286
+ // One rule per index, built at its first question: over the directories
287
+ // `after`'s merge leaves, or the living ones — never on the shared map memo,
288
+ // which every feature `validate --all` grades reads through one context.
289
+ let outside;
290
+ const externalProducer = async (name) => {
291
+ outside ??= (async () => (await livingMap(docsDir, context)).externalProducerRule((await after?.services()) ?? []))();
292
+ return (await outside)(name);
293
+ };
294
+ return { opConsumers, messageConsumers, producers, externalProducer };
295
+ }
296
+ //# sourceMappingURL=consumers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumers.js","sourceRoot":"","sources":["../../../src/core/consumers/consumers.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * THE consumer index: who in the fleet still depends on an operation or a\n * message — the join that turns \"an operation left the contract\" into \"and\n * these named consumers break\", and \"an operation's shape moved\" into \"and these\n * are the consumers to check it against\".\n *\n * ONE INDEX, FOUR READERS. `loam diff` names the victims of every removal,\n * deprecation and modification since a base ref (`core/diff/semantic.ts`); the\n * coherence gate refuses a feature that takes a consumed operation or message\n * out of the contract (`openapi.remove-op-consumed`, `asyncapi.remove-message-\n * consumed` — `core/coherence/consumed/operations.ts`, `core/coherence/events/events.ts`);\n * and `loam archive` names who an overwrite lands on\n * (`commands/archive/plan/contracts/consumers.ts`). They used to be THREE\n * copies — this module as `core/diff/victims.ts`, `edgeConsumers` /\n * `requirementConsumers` / `governorsAfterMerge` in `core/coherence/lookups.ts`,\n * `messageConsumers` in `core/coherence/events/lookups.ts` — kept \"in step by\n * hand\", and they were not: the gate read `architecture/landscape.likec4` alone\n * while the diff and the spine read the project, the gate never asked a use\n * case, and the diff excluded an internal edge the gate counted. Rule 13\n * (docs/DESIGN.md) fired at the third copy; this is the extraction it forces.\n *\n * THE SOURCES, per question:\n *\n * - an operation `op` of `provider`: (1) every edge of the `architecture/`\n * PROJECT with `metadata { op }` into the provider (`./current.ts` says why\n * the project and never the one file); (2) other services' requirements —\n * spec.md AND arch.spec.md — whose `Operations:` line names it, unless that\n * service's own contract defines the same id (`ownsOperation` says why);\n * (3) the use-case hops the model attributes to it\n * (`core/usecases/operations.ts`); (4) the provider's OWN spec.md\n * requirements — the file `validate` grades its `Operations:` lines in —\n * and its own internal edges still naming it, filed apart as `own`.\n * - a message `name` of `provider`: `consumes` edges, other services'\n * `Consumes:` lines over both spec files, the use-case hops backed by such an\n * edge, and — as `own` — the provider's own `publishes` edges and\n * `Publishes:` lines over both spec files, which `validate` grades alike.\n *\n * WHY `own` IS ITS OWN LIST. The gate's question is what the merge would leave\n * broken, and the provider's own documents break too: an overwrite carries no\n * removal marker, so nothing made the author restate the provider's requirement\n * still naming the old id, and the next `validate` reported\n * `spec-api.op-undefined` against the provider itself; a message re-keyed or no\n * longer sent left the provider's own `Publishes:` line behind for\n * `spec-event.message-undefined`. So the gate counts `own`. `loam diff` and the\n * archive's overwrite warnings answer a different question — who ELSE breaks —\n * and do not: the rule `usecase.step-unlinked` states, that a service owes no\n * operationId to itself, is why an internal edge stopped keeping every removal\n * `diff.op-removed-consumed` (verification 2026-09-04, R3), and why a hop whose\n * two ends are the provider is never a victim.\n *\n * WHAT A DOUBT IS WORTH. A consumer the index could not check is a typed\n * suspension (`./scan.ts`), never a silent nothing, and the readers weigh the\n * kinds differently: `loam diff` and the overwrite warnings list every one; the\n * gate refuses on a document nobody could read or place — a consumer's, in\n * `suspended`, or the provider's own, in `ownSuspended` — and never on a caller\n * drawn with no op or a contested hop (`documentDoubt` says why).\n *\n * READ AFTER A FEATURE, OR AS IT STANDS. With `afterFeature`, every requirement is read\n * as that feature's merge would leave it (`./after.ts` — a consumer the same\n * feature MODIFIES or REMOVES stops counting, and an unappliable delta fails\n * closed); without it, the living fleet as it stands, which is what the diff and\n * the overwrite warnings ask. Edges and hops read the same either way: no\n * feature can take a living one away — though it can create the directory an\n * #external producer resolves to (`externalProducer` says what that changes).\n *\n * LAZY, AND PAID ONCE PER INVOCATION. The fleet's four documents per service and\n * the project load are behind the first question that needs them, and memoised\n * per FleetContext (`./current.ts`), so a removal-free feature pays for neither\n * and `validate --all` pays once for every feature it grades. Without a\n * context (the archive gate's coherence call) the index reads through one of its\n * own, for its own lifetime.\n */\nimport { type Rel } from \"../c4/likec4.js\";\nimport { hopsConsuming, hopsExercising } from \"../usecases/operations.js\";\nimport { FleetContext } from \"../fleet-context.js\";\nimport type { DocsDir, FeatureDir } from \"../kernel/ids/dirs.js\";\nimport type { Requirement } from \"../document/spec.js\";\nimport type { ServiceState } from \"./state.js\";\nimport type { ConsumerScan, Suspension } from \"./scan.js\";\nimport { livingFleet, livingMap } from \"./current.js\";\nimport { afterMerge, featureView, type MergedRequirement, type SpecAxis } from \"./after.js\";\n\n/** One consumer question's answer: the scan, plus what of the provider's own still names it. */\nexport interface Consumers extends ConsumerScan {\n /**\n * The provider's own documents that still name what it is losing — an edge\n * it draws to itself, a requirement of its own. Positive evidence, like\n * `victims`, filed apart because only the gate counts it (the header says why).\n */\n own: string[];\n /**\n * The provider's own documents the scan could not read or place, on the axes\n * `own` reads — the gate's doubt about `own`, as `suspended` is every reader's\n * doubt about `victims`. Filed apart for `own`'s reason: the diff and the\n * overwrite warnings name who ELSE is affected, and the provider's broken file\n * is its own `validate` finding there. The gate refuses on it, because an\n * overwrite carries no REMOVED requirement and that file is where the old id\n * may still be governed.\n */\n ownSuspended: Suspension[];\n}\n\n/** The consumer questions every reader asks. */\nexport interface ConsumerIndex {\n /** Consumers of `provider`'s operation `op`: edges, other services' requirements, use-case hops; inbound op-less edges and contested hops ride as suspensions. */\n opConsumers(provider: string, op: string): Promise<Consumers>;\n /** Consumers of message `name` a `provider` is dropping or changing: consumes-edges (not into the provider), other services' `Consumes:` lines, the hops backed by such an edge; the provider's own publishes edges and `Publishes:` lines ride as `own`. */\n messageConsumers(provider: string, name: string): Promise<Consumers>;\n /**\n * Living services whose asyncapi SENDS `name` — positive evidence only; a\n * message another service still sends is not orphaned by one producer\n * dropping it. Senders, never declarers: a consumer declares the message in\n * its own contract with `action: receive` (validate requires it to), so\n * counting declarations named the consumer as the message's producer —\n * `loam diff` said \"still declared by\" the very service the removal orphaned,\n * while the gate refused for it and the next `validate --all` reported\n * `spine.message-unproduced` there. The rule that check grades by\n * (`commands/validate/service/events/message-producers.ts`).\n *\n * Always the fleet as it stands, even with `afterFeature`: no requirement\n * merge decides who sends, and the contract merge that does is the coherence\n * gate's to simulate. The message gate reads this as the living half of its\n * after-the-merge senders and replaces every service its feature carries an\n * event delta for (`core/coherence/events/events.ts`) — read alone, it would\n * pass a feature retiring a message from both of its senders, each one on the\n * other's living contract.\n */\n producers(name: string): Promise<string[]>;\n /**\n * The #external element whose living `publishes` edge sends `name`, or null —\n * a producer OUTSIDE the fleet, which `producers` never names because no\n * contract of its own exists. Validate counts it (`spine.message-unproduced`\n * stays quiet over it), so the gate and `loam diff` must too: counting fleet\n * senders alone refused a retirement from a message's only fleet sender\n * while an #external element still published it, and `loam diff` called the\n * archived removal `diff.message-removed-consumed`, though the next\n * `validate --all` was clean (the verification of N1–N3, D1). The living\n * map's edge and tag, after a feature as without one: the landscape merge\n * only adds to the map. But NOT the living directories after a feature: its\n * merge creates `services/<id>/` from each `specs/<id>/`, and a directory\n * the element resolves to outranks the tag, so a feature onboarding the\n * outside system as a service takes its producer away\n * (`LivingMap.externalProducerRule` in `./current.ts` says what that cost).\n */\n externalProducer(name: string): Promise<string | null>;\n}\n\n/** Where the index reads, and after what. */\nexport interface ConsumerRequest {\n docsDir: DocsDir;\n /** The invocation's read index. Absent, the index reads through one of its own. */\n context?: FleetContext;\n /** The feature whose merge every requirement is read after (`./after.ts`). Absent: the living fleet as it stands. */\n afterFeature?: FeatureDir;\n}\n\n/**\n * Both spec files, for every question about another service — the provider's\n * own lines are read where `validate` grades them (`RequirementRule.ownAxes`).\n * The message half always read both — an\n * outbox requirement in arch.spec.md is the canonical home of a `Publishes:`\n * line, and a scan of spec.md alone answered \"nobody consumes it\" over the file\n * most authors use. The operation half read spec.md only, because that is\n * where `validate` grades an `Operations:` line; but an arch.spec.md line\n * naming another service's operation is exactly the cross-service dependency\n * `loam dependencies` already reads off both files, and a removal must not\n * read the same line as a dependency there and as nothing here.\n */\nexport const REQUIREMENT_AXES: readonly SpecAxis[] = [\"spec\", \"archSpec\"];\n\n/**\n * Does this service's own living contract define `op`? Then an `Operations:`\n * line of its own names ITS operation, not another service's.\n *\n * Two rules say so, one per spec file. In spec.md it is the rule `validate`\n * grades an `Operations:` line by: it resolves against the requirement's own\n * service's contract (`spec-api.op-undefined`, `commands/validate/service/\n * api.ts`), so in a green fleet another service naming the same id there is\n * naming its own. `validate` never grades an arch.spec.md line against a\n * contract; there it is `loam dependencies`' rule — a requirement naming an\n * operation its own service already provides is \"not a dependency on\n * anybody\" (`core/dependencies/facts.ts`), read off both files. Matching the bare\n * id fleet-wide refused a rename on payment-service because checkout-web's own\n * `capturePayment` requirement shared the name (review 2026-10-12, finding 1) —\n * and shared ids like `healthCheck` or `getStatus` are common across a fleet.\n *\n * A contract that is unreadable or absent proves no ownership, so the line stays\n * a consumer: the closed direction, and the reading every scan here gave before\n * ownership was asked at all.\n */\nexport function ownsOperation(state: ServiceState, op: string): boolean {\n return state.openapi.kind === \"read\" && state.openapi.value.some((o) => o.id === op);\n}\n\nconst EDGE = (resolve: (id: string) => string, r: Rel): string =>\n `edge ${resolve(r.source)} → ${resolve(r.target)}${r.title === undefined ? \"\" : ` (\"${r.title}\")`}`;\n\n/** Entry comparator by map key — deterministic suspension order. */\nconst byFirst = <T>(a: [string, T], b: [string, T]): number => (a[0] < b[0] ? -1 : 1);\n\n/** How one requirement scan decides a hit — for another service, and for the provider itself. */\ninterface RequirementRule {\n provider: string;\n foreign: (state: ServiceState, r: Requirement) => Promise<boolean>;\n own: (r: Requirement) => boolean;\n /**\n * The provider's spec files `own` reads: the ones `validate` grades the line\n * in, since a line it never grades can never be left broken. Other services\n * are read over `REQUIREMENT_AXES` whatever this says.\n */\n ownAxes: readonly SpecAxis[];\n}\n\nexport function consumerIndex(request: ConsumerRequest): ConsumerIndex {\n const { docsDir } = request;\n const context = request.context ?? new FleetContext();\n const after = request.afterFeature === undefined ? undefined : featureView({ docsDir, featureDir: request.afterFeature, context });\n\n /** One service's requirements on one axis as `after`'s merge would leave them, read once per index. */\n const merged = new Map<string, Promise<MergedRequirement[] | { unreadable: string }>>();\n const requirementsOf = (state: ServiceState, axis: SpecAxis): Promise<MergedRequirement[] | { unreadable: string }> => {\n const key = `${state.id}\\0${axis}`;\n let pending = merged.get(key);\n if (pending === undefined) {\n const a = state[axis];\n pending =\n a.kind === \"unreadable\"\n ? Promise.resolve({ unreadable: a.path })\n : (async () => afterMerge(a.kind === \"read\" ? a.value : [], await after?.delta(state.id, axis)))();\n merged.set(key, pending);\n }\n return pending;\n };\n\n const label = (service: string, m: MergedRequirement): string =>\n m.written\n ? `this feature's ${service} delta requirement '${m.requirement.name}'`\n : `${service}'s living requirement '${m.requirement.name}'`;\n\n /**\n * The requirement half of one scan, `tupleVisible`'s own discipline applied\n * to victims: an unreadable consumer axis contributes a SUSPENSION, never a\n * silent nothing — \"consuming nothing\" and \"loam refused to read the file\"\n * are opposite facts, and collapsing them is how a breaking removal used to\n * grade down to a confident warning. Sorted, so victim order never depends on\n * the enumeration's walk order. A REMOVED requirement governs nothing: the\n * rule `validate` reads living requirements by.\n *\n * The provider's own unreadable axis is NOT a suspension: it is not a\n * consumer anybody else must be warned about, and that file is the provider's\n * own finding (`validate`, and the delta checks when the feature restates it).\n * It is filed as `ownSuspended`, which only the gate reads.\n */\n const scanRequirements = async (rule: RequirementRule): Promise<Consumers> => {\n const { services, ambiguous } = await livingFleet(docsDir, context);\n const out: Consumers = { victims: [], suspended: [], own: [], ownSuspended: [] };\n for (const id of [...services.keys()].sort()) {\n const state = services.get(id)!;\n const mine = id === rule.provider;\n for (const axis of REQUIREMENT_AXES) {\n if (mine && !rule.ownAxes.includes(axis)) continue;\n const reqs = await requirementsOf(state, axis);\n if (!Array.isArray(reqs)) {\n if (mine) out.ownSuspended.push({ kind: \"unreadable\", text: `${id} — ${reqs.unreadable} could not be read, so its own requirements could not be scanned` });\n else out.suspended.push({ kind: \"unreadable\", text: `${id} — ${reqs.unreadable} could not be read, so its requirements could not be scanned` });\n continue;\n }\n for (const m of reqs) {\n if (m.requirement.kind === \"REMOVED\") continue;\n if (mine ? rule.own(m.requirement) : await rule.foreign(state, m.requirement)) {\n (mine ? out.own : out.victims).push(label(id, m));\n }\n }\n }\n }\n for (const [id, dirs] of [...ambiguous].sort(byFirst)) {\n const text = `${id} — claimed by ${dirs.join(\" and \")}, so its ${id === rule.provider ? \"own \" : \"\"}documents could not be scanned`;\n (id === rule.provider ? out.ownSuspended : out.suspended).push({ kind: \"ambiguous\", text });\n }\n return out;\n };\n\n /** Ownership as the merge leaves it: the feature's contract for a service it carries one for, the living one otherwise. */\n const owns = async (state: ServiceState, op: string): Promise<boolean> =>\n (await after?.defines(state.id, op)) ?? ownsOperation(state, op);\n\n const opConsumers = async (provider: string, op: string): Promise<Consumers> => {\n const map = await livingMap(docsDir, context);\n const edges: string[] = [];\n const internal: string[] = [];\n const unlinked: Suspension[] = [];\n for (const r of map.relationships ?? []) {\n if (map.resolve(r.target) !== provider) continue;\n // An edge whose SOURCE resolves to the provider as well is the provider's\n // own internal call — `own`, never a victim (the header says why). The\n // spine still grades it against the contract, so the gate counts it.\n const self = map.resolve(r.source) === provider;\n if (r.op === op) {\n (self ? internal : edges).push(EDGE(map.resolve, r));\n } else if (!self && r.op === undefined && r.publishes === undefined && r.consumes === undefined) {\n // A caller drawn with NO op is neither a victim nor proof of absence:\n // it calls the provider, and nobody wrote down which operation.\n // Dropping it silently made every removal on a seeded fleet (`loam\n // seed` draws every edge without an op) read \"no current landscape\n // edge names it\" while validate warned `spine.op-link-missing` on the\n // very edge. It rides as a suspension — a warning's worth of doubt,\n // never an error, so an op-less map does not turn every removal red:\n // its kind is `unlinked`, which the removal gate does not refuse on\n // (`documentDoubt` in ./scan.ts says which kinds it does, and why).\n // An edge naming a message instead (`publishes`/`consumes`) said what\n // it carries and is the message half's to grade.\n unlinked.push({ kind: \"unlinked\", text: `${EDGE(map.resolve, r)} has no \\`metadata { op }\\`, so whether it calls '${op}' is unknown` });\n }\n }\n const reqs = await scanRequirements({\n provider,\n foreign: async (state, r) => r.operations.includes(op) && !(await owns(state, op)),\n own: (r) => r.operations.includes(op),\n // spec.md only: `validate` resolves an `Operations:` line against its\n // own service's contract there (`spec-api.op-undefined`) and never in\n // arch.spec.md, so the provider's arch.spec.md line naming the operation\n // strands nothing — refusing for it turned a removal that archived\n // before the one index into an exit 1 (the contract review, finding 2).\n // Another service's arch.spec.md line still counts: there it is a\n // dependency on this contract, as `loam dependencies` reads it.\n ownAxes: [\"spec\"],\n });\n // Flows last in each list, deliberately: the edge and the requirement say\n // WHICH document to open, and the flow says what the reader is about to\n // break — so a `details[]` scanned top-down ends on the consequence.\n const hops = hopsExercising(map.useCases, { provider, op });\n return {\n victims: [...edges, ...reqs.victims, ...hops.breaks],\n suspended: [...unlinked, ...reqs.suspended, ...hops.unsure.map((text): Suspension => ({ kind: \"contested\", text }))],\n own: [...internal, ...reqs.own],\n ownSuspended: reqs.ownSuspended,\n };\n };\n\n const messageConsumers = async (provider: string, name: string): Promise<Consumers> => {\n const map = await livingMap(docsDir, context);\n const edges: string[] = [];\n const outbound: string[] = [];\n for (const r of map.relationships ?? []) {\n // The message join is fleet-global (names are not service-scoped), so\n // every edge naming it counts, whoever its producer is — except one INTO\n // the provider itself: its own consumption leaves in the same change, and\n // counting it would gate every self-consuming producer on its own\n // retirement.\n if (r.consumes === name && map.resolve(r.target) !== provider) edges.push(EDGE(map.resolve, r));\n // The provider's OWN `publishes` edge is the op half's internal edge on\n // this axis: the spine grades a publishes edge on its SOURCE\n // (`spine.message-undefined` when the source's contract sends no such\n // message), so once the provider stops sending it the edge strands the\n // provider itself — `own`, which only the gate counts. Collecting the\n // `Publishes:` lines alone let a full retirement archive at exit 0 over\n // a living publishes edge (the one-index review, finding 3). Another\n // service's publishes edge is that service's claim, untouched by this one.\n if (r.publishes === name && map.resolve(r.source) === provider) outbound.push(EDGE(map.resolve, r));\n }\n // No ownership rule here, and the asymmetry is the contract's: a consumer\n // declares the message in its OWN contract with `action: receive` — validate\n // requires it to — so its own contract naming the message proves nothing\n // about who sends it. The provider's own `Consumes:` line stays out for the\n // edge's reason above; its own `Publishes:` line is what `own` is for,\n // beside its publishes edges.\n const reqs = await scanRequirements({\n provider,\n foreign: async (_state, r) => r.consumes.includes(name),\n own: (r) => r.publishes.includes(name),\n // Both: `validate` grades a `Publishes:` line in either file\n // (`spec-event.message-undefined`), the outbox requirement in\n // arch.spec.md being its canonical home.\n ownAxes: REQUIREMENT_AXES,\n });\n const hops = hopsConsuming(map.useCases, { provider, name });\n return { victims: [...edges, ...reqs.victims, ...hops], suspended: reqs.suspended, own: [...outbound, ...reqs.own], ownSuspended: reqs.ownSuspended };\n };\n\n const producers = async (name: string): Promise<string[]> => {\n const { services } = await livingFleet(docsDir, context);\n return [...services.keys()].sort().filter((id) => services.get(id)!.sent.includes(name));\n };\n\n // One rule per index, built at its first question: over the directories\n // `after`'s merge leaves, or the living ones — never on the shared map memo,\n // which every feature `validate --all` grades reads through one context.\n let outside: Promise<(name: string) => string | null> | undefined;\n const externalProducer = async (name: string): Promise<string | null> => {\n outside ??= (async () => (await livingMap(docsDir, context)).externalProducerRule((await after?.services()) ?? []))();\n return (await outside)(name);\n };\n\n return { opConsumers, messageConsumers, producers, externalProducer };\n}\n"]}