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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (901) hide show
  1. package/CHANGELOG.md +3448 -0
  2. package/COMPARISON.md +91 -3
  3. package/CONTRIBUTING.md +37 -0
  4. package/MIGRATING-from-OpenSpec.md +47 -23
  5. package/QUICKSTART.md +189 -12
  6. package/README.md +274 -65
  7. package/ROADMAP.md +572 -31
  8. package/SCHEMA.md +1709 -155
  9. package/WORKFLOW.md +298 -72
  10. package/dist/cli.js +26 -8
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/adopt/adopt.js +5 -10
  13. package/dist/commands/adopt/adopt.js.map +1 -1
  14. package/dist/commands/adopt/render.js +50 -9
  15. package/dist/commands/adopt/render.js.map +1 -1
  16. package/dist/commands/archive/archive.js +16 -19
  17. package/dist/commands/archive/archive.js.map +1 -1
  18. package/dist/commands/archive/closing.js +42 -0
  19. package/dist/commands/archive/closing.js.map +1 -0
  20. package/dist/commands/archive/plan/contracts/asyncapi.js +36 -42
  21. package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -1
  22. package/dist/commands/archive/plan/contracts/consumers.js +56 -0
  23. package/dist/commands/archive/plan/contracts/consumers.js.map +1 -0
  24. package/dist/commands/archive/plan/contracts/openapi.js +77 -43
  25. package/dist/commands/archive/plan/contracts/openapi.js.map +1 -1
  26. package/dist/commands/archive/plan/contracts/verdict-lines.js +103 -0
  27. package/dist/commands/archive/plan/contracts/verdict-lines.js.map +1 -0
  28. package/dist/commands/archive/plan/document/head.js +151 -0
  29. package/dist/commands/archive/plan/document/head.js.map +1 -0
  30. package/dist/commands/archive/plan/document/links.js +284 -0
  31. package/dist/commands/archive/plan/document/links.js.map +1 -0
  32. package/dist/commands/archive/plan/document/run.js +136 -0
  33. package/dist/commands/archive/plan/document/run.js.map +1 -0
  34. package/dist/commands/archive/plan/gate.js +21 -19
  35. package/dist/commands/archive/plan/gate.js.map +1 -1
  36. package/dist/commands/archive/plan/landscape.js +167 -30
  37. package/dist/commands/archive/plan/landscape.js.map +1 -1
  38. package/dist/commands/archive/plan/model/extending.js +85 -0
  39. package/dist/commands/archive/plan/model/extending.js.map +1 -0
  40. package/dist/commands/archive/plan/refusal.js +14 -19
  41. package/dist/commands/archive/plan/refusal.js.map +1 -1
  42. package/dist/commands/archive/plan/specs.js +137 -56
  43. package/dist/commands/archive/plan/specs.js.map +1 -1
  44. package/dist/commands/archive/plan/state.js +3 -0
  45. package/dist/commands/archive/plan/state.js.map +1 -1
  46. package/dist/commands/archive/run.js +134 -30
  47. package/dist/commands/archive/run.js.map +1 -1
  48. package/dist/commands/archive/shipped.js +49 -0
  49. package/dist/commands/archive/shipped.js.map +1 -0
  50. package/dist/commands/context/context.js +85 -18
  51. package/dist/commands/context/context.js.map +1 -1
  52. package/dist/commands/context/print.js +29 -7
  53. package/dist/commands/context/print.js.map +1 -1
  54. package/dist/commands/delta/delta.js +102 -14
  55. package/dist/commands/delta/delta.js.map +1 -1
  56. package/dist/commands/delta/print.js +17 -1
  57. package/dist/commands/delta/print.js.map +1 -1
  58. package/dist/commands/dependencies.js +3 -7
  59. package/dist/commands/dependencies.js.map +1 -1
  60. package/dist/commands/diff/diff.js +20 -27
  61. package/dist/commands/diff/diff.js.map +1 -1
  62. package/dist/commands/doctor.js +60 -1
  63. package/dist/commands/doctor.js.map +1 -1
  64. package/dist/commands/explain/explain.js +89 -13
  65. package/dist/commands/explain/explain.js.map +1 -1
  66. package/dist/commands/explore.js +16 -10
  67. package/dist/commands/explore.js.map +1 -1
  68. package/dist/commands/gate/gate.js +45 -8
  69. package/dist/commands/gate/gate.js.map +1 -1
  70. package/dist/commands/gate/print.js +15 -3
  71. package/dist/commands/gate/print.js.map +1 -1
  72. package/dist/commands/gherkin/commit.js +13 -54
  73. package/dist/commands/gherkin/commit.js.map +1 -1
  74. package/dist/commands/gherkin/gherkin.js +36 -20
  75. package/dist/commands/gherkin/gherkin.js.map +1 -1
  76. package/dist/commands/gherkin/reconcile.js +10 -13
  77. package/dist/commands/gherkin/reconcile.js.map +1 -1
  78. package/dist/commands/init/first-hour.js +44 -0
  79. package/dist/commands/init/first-hour.js.map +1 -1
  80. package/dist/commands/init/init.js +18 -22
  81. package/dist/commands/init/init.js.map +1 -1
  82. package/dist/commands/list/campaign/campaign.js +4 -6
  83. package/dist/commands/list/campaign/campaign.js.map +1 -1
  84. package/dist/commands/list/json.js +5 -7
  85. package/dist/commands/list/json.js.map +1 -1
  86. package/dist/commands/list/list.js +44 -29
  87. package/dist/commands/list/list.js.map +1 -1
  88. package/dist/commands/list/print.js +52 -9
  89. package/dist/commands/list/print.js.map +1 -1
  90. package/dist/commands/list/suites/suites.js +140 -0
  91. package/dist/commands/list/suites/suites.js.map +1 -0
  92. package/dist/commands/list/views.js +37 -34
  93. package/dist/commands/list/views.js.map +1 -1
  94. package/dist/commands/mcp/dispatch.js +91 -36
  95. package/dist/commands/mcp/dispatch.js.map +1 -1
  96. package/dist/commands/mcp/mcp.js +56 -15
  97. package/dist/commands/mcp/mcp.js.map +1 -1
  98. package/dist/commands/mcp/serve.js.map +1 -1
  99. package/dist/commands/migrate-openspec/materialize/active.js +27 -22
  100. package/dist/commands/migrate-openspec/materialize/active.js.map +1 -1
  101. package/dist/commands/migrate-openspec/materialize/stage.js +4 -3
  102. package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -1
  103. package/dist/commands/migrate-openspec/materialize/target.js +2 -2
  104. package/dist/commands/migrate-openspec/materialize/target.js.map +1 -1
  105. package/dist/commands/migrate-openspec/openspec/decisions.js +9 -14
  106. package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -1
  107. package/dist/commands/migrate-openspec/openspec/error.js +7 -8
  108. package/dist/commands/migrate-openspec/openspec/error.js.map +1 -1
  109. package/dist/commands/migrate-openspec/openspec/mapping.js +1 -9
  110. package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -1
  111. package/dist/commands/migrate-openspec/openspec/paths.js +3 -6
  112. package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -1
  113. package/dist/commands/new/capability-template.js +118 -0
  114. package/dist/commands/new/capability-template.js.map +1 -0
  115. package/dist/commands/new/commit.js +8 -22
  116. package/dist/commands/new/commit.js.map +1 -1
  117. package/dist/commands/new/modifies.js +206 -0
  118. package/dist/commands/new/modifies.js.map +1 -0
  119. package/dist/commands/new/new.js +59 -14
  120. package/dist/commands/new/new.js.map +1 -1
  121. package/dist/commands/new/templates.js +48 -124
  122. package/dist/commands/new/templates.js.map +1 -1
  123. package/dist/commands/open.js +3 -7
  124. package/dist/commands/open.js.map +1 -1
  125. package/dist/commands/policy/gate.js +27 -0
  126. package/dist/commands/policy/gate.js.map +1 -1
  127. package/dist/commands/rebase/plan.js +2 -2
  128. package/dist/commands/rebase/plan.js.map +1 -1
  129. package/dist/commands/rebase/rebase.js +60 -35
  130. package/dist/commands/rebase/rebase.js.map +1 -1
  131. package/dist/commands/seed/commit.js +55 -26
  132. package/dist/commands/seed/commit.js.map +1 -1
  133. package/dist/commands/seed/plan.js +158 -13
  134. package/dist/commands/seed/plan.js.map +1 -1
  135. package/dist/commands/seed/seed.js +13 -11
  136. package/dist/commands/seed/seed.js.map +1 -1
  137. package/dist/commands/show/feature.js +9 -5
  138. package/dist/commands/show/feature.js.map +1 -1
  139. package/dist/commands/show/introduced.js +157 -0
  140. package/dist/commands/show/introduced.js.map +1 -0
  141. package/dist/commands/show/marks.js +35 -6
  142. package/dist/commands/show/marks.js.map +1 -1
  143. package/dist/commands/show/service.js +41 -33
  144. package/dist/commands/show/service.js.map +1 -1
  145. package/dist/commands/show/show.js +17 -7
  146. package/dist/commands/show/show.js.map +1 -1
  147. package/dist/commands/status/fleet-next.js +90 -0
  148. package/dist/commands/status/fleet-next.js.map +1 -0
  149. package/dist/commands/status/json.js +2 -0
  150. package/dist/commands/status/json.js.map +1 -1
  151. package/dist/commands/status/print.js +89 -37
  152. package/dist/commands/status/print.js.map +1 -1
  153. package/dist/commands/status/status.js +3 -7
  154. package/dist/commands/status/status.js.map +1 -1
  155. package/dist/commands/steps/steps.js +103 -23
  156. package/dist/commands/steps/steps.js.map +1 -1
  157. package/dist/commands/subsystem/edit.js +7 -7
  158. package/dist/commands/subsystem/edit.js.map +1 -1
  159. package/dist/commands/subsystem/move.js +106 -46
  160. package/dist/commands/subsystem/move.js.map +1 -1
  161. package/dist/commands/subsystem/query.js +2 -4
  162. package/dist/commands/subsystem/query.js.map +1 -1
  163. package/dist/commands/subsystem/subsystem.js +4 -7
  164. package/dist/commands/subsystem/subsystem.js.map +1 -1
  165. package/dist/commands/subsystem/sync.js +289 -74
  166. package/dist/commands/subsystem/sync.js.map +1 -1
  167. package/dist/commands/subsystem/txn/exclude.js +132 -0
  168. package/dist/commands/subsystem/txn/exclude.js.map +1 -0
  169. package/dist/commands/subsystem/txn/links.js +128 -0
  170. package/dist/commands/subsystem/txn/links.js.map +1 -0
  171. package/dist/commands/subsystem/txn/report.js +174 -0
  172. package/dist/commands/subsystem/txn/report.js.map +1 -0
  173. package/dist/commands/subsystem/txn/txn.js +147 -45
  174. package/dist/commands/subsystem/txn/txn.js.map +1 -1
  175. package/dist/commands/subsystem/txn/views.js +200 -21
  176. package/dist/commands/subsystem/txn/views.js.map +1 -1
  177. package/dist/commands/tasks/actions.js +107 -0
  178. package/dist/commands/tasks/actions.js.map +1 -0
  179. package/dist/commands/tasks/render.js +253 -0
  180. package/dist/commands/tasks/render.js.map +1 -0
  181. package/dist/commands/tasks/tasks.js +119 -0
  182. package/dist/commands/tasks/tasks.js.map +1 -0
  183. package/dist/commands/unarchive/manifest.js +42 -26
  184. package/dist/commands/unarchive/manifest.js.map +1 -1
  185. package/dist/commands/unarchive/restore.js +83 -33
  186. package/dist/commands/unarchive/restore.js.map +1 -1
  187. package/dist/commands/unarchive/unarchive.js +22 -30
  188. package/dist/commands/unarchive/unarchive.js.map +1 -1
  189. package/dist/commands/validate/arch-coverage.js +78 -27
  190. package/dist/commands/validate/arch-coverage.js.map +1 -1
  191. package/dist/commands/validate/checks/fleet-shape.js +34 -126
  192. package/dist/commands/validate/checks/fleet-shape.js.map +1 -1
  193. package/dist/commands/validate/checks/health-deps.js +9 -6
  194. package/dist/commands/validate/checks/health-deps.js.map +1 -1
  195. package/dist/commands/validate/checks/introduced.js +102 -0
  196. package/dist/commands/validate/checks/introduced.js.map +1 -0
  197. package/dist/commands/validate/checks/requirements.js +18 -8
  198. package/dist/commands/validate/checks/requirements.js.map +1 -1
  199. package/dist/commands/validate/checks/sources.js +11 -2
  200. package/dist/commands/validate/checks/sources.js.map +1 -1
  201. package/dist/commands/validate/coverage/covers-after.js +105 -0
  202. package/dist/commands/validate/coverage/covers-after.js.map +1 -0
  203. package/dist/commands/validate/feature.js +26 -20
  204. package/dist/commands/validate/feature.js.map +1 -1
  205. package/dist/commands/validate/fleet/census.js +37 -13
  206. package/dist/commands/validate/fleet/census.js.map +1 -1
  207. package/dist/commands/validate/fleet/landscape.js +144 -126
  208. package/dist/commands/validate/fleet/landscape.js.map +1 -1
  209. package/dist/commands/validate/fleet/load.js +66 -0
  210. package/dist/commands/validate/fleet/load.js.map +1 -1
  211. package/dist/commands/validate/fleet/map/attest.js +98 -0
  212. package/dist/commands/validate/fleet/map/attest.js.map +1 -0
  213. package/dist/commands/validate/fleet/map/bindings.js +107 -0
  214. package/dist/commands/validate/fleet/map/bindings.js.map +1 -0
  215. package/dist/commands/validate/fleet/map/consumers.js +244 -0
  216. package/dist/commands/validate/fleet/map/consumers.js.map +1 -0
  217. package/dist/commands/validate/fleet/map/isolation.js +116 -0
  218. package/dist/commands/validate/fleet/map/isolation.js.map +1 -0
  219. package/dist/commands/validate/fleet/map/usecases.js +54 -0
  220. package/dist/commands/validate/fleet/map/usecases.js.map +1 -0
  221. package/dist/commands/validate/fleet/obligations.js +44 -14
  222. package/dist/commands/validate/fleet/obligations.js.map +1 -1
  223. package/dist/commands/validate/fleet/scorecard/print.js +10 -2
  224. package/dist/commands/validate/fleet/scorecard/print.js.map +1 -1
  225. package/dist/commands/validate/fleet/scorecard/scorecard.js +17 -11
  226. package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -1
  227. package/dist/commands/validate/fleet/usecases/place.js.map +1 -1
  228. package/dist/commands/validate/fleet/views/fleet-project.js +217 -0
  229. package/dist/commands/validate/fleet/views/fleet-project.js.map +1 -0
  230. package/dist/commands/validate/fleet/views/ids.js +50 -15
  231. package/dist/commands/validate/fleet/views/ids.js.map +1 -1
  232. package/dist/commands/validate/fleet/views/projects.js +278 -0
  233. package/dist/commands/validate/fleet/views/projects.js.map +1 -0
  234. package/dist/commands/validate/fleet/views/root-documents.js +83 -0
  235. package/dist/commands/validate/fleet/views/root-documents.js.map +1 -0
  236. package/dist/commands/validate/fleet/views/stale.js +40 -47
  237. package/dist/commands/validate/fleet/views/stale.js.map +1 -1
  238. package/dist/commands/validate/links/corpus.js +1 -4
  239. package/dist/commands/validate/links/corpus.js.map +1 -1
  240. package/dist/commands/validate/links/glossary.js.map +1 -1
  241. package/dist/commands/validate/render/repeats.js +63 -0
  242. package/dist/commands/validate/render/repeats.js.map +1 -0
  243. package/dist/commands/validate/render/rollups.js +115 -0
  244. package/dist/commands/validate/render/rollups.js.map +1 -0
  245. package/dist/commands/validate/render/text.js +199 -0
  246. package/dist/commands/validate/render/text.js.map +1 -0
  247. package/dist/commands/validate/report.js +36 -160
  248. package/dist/commands/validate/report.js.map +1 -1
  249. package/dist/commands/validate/scope.js +113 -0
  250. package/dist/commands/validate/scope.js.map +1 -0
  251. package/dist/commands/validate/service/api.js +21 -107
  252. package/dist/commands/validate/service/api.js.map +1 -1
  253. package/dist/commands/validate/service/contracts/generated.js +134 -0
  254. package/dist/commands/validate/service/contracts/generated.js.map +1 -0
  255. package/dist/commands/validate/service/events/events.js +36 -14
  256. package/dist/commands/validate/service/events/events.js.map +1 -1
  257. package/dist/commands/validate/service/events/message-producers.js +1 -1
  258. package/dist/commands/validate/service/events/message-producers.js.map +1 -1
  259. package/dist/commands/validate/service/evidence-pins.js +56 -10
  260. package/dist/commands/validate/service/evidence-pins.js.map +1 -1
  261. package/dist/commands/validate/service/model/diverged.js +226 -0
  262. package/dist/commands/validate/service/model/diverged.js.map +1 -0
  263. package/dist/commands/validate/service/model/grade.js +163 -0
  264. package/dist/commands/validate/service/model/grade.js.map +1 -0
  265. package/dist/commands/validate/service/service.js +121 -61
  266. package/dist/commands/validate/service/service.js.map +1 -1
  267. package/dist/commands/validate/service/specs.js +88 -28
  268. package/dist/commands/validate/service/specs.js.map +1 -1
  269. package/dist/commands/validate/service/spine.js +38 -3
  270. package/dist/commands/validate/service/spine.js.map +1 -1
  271. package/dist/commands/validate/service/usecases/tags.js +113 -0
  272. package/dist/commands/validate/service/usecases/tags.js.map +1 -0
  273. package/dist/commands/validate/service/usecases/usecases.js +209 -0
  274. package/dist/commands/validate/service/usecases/usecases.js.map +1 -0
  275. package/dist/commands/validate/validate.js +85 -60
  276. package/dist/commands/validate/validate.js.map +1 -1
  277. package/dist/commands/verify/cross/diff.js +2 -6
  278. package/dist/commands/verify/cross/diff.js.map +1 -1
  279. package/dist/commands/verify/evidence/contract.js +1 -1
  280. package/dist/commands/verify/evidence/contract.js.map +1 -1
  281. package/dist/commands/verify/evidence/read.js +12 -3
  282. package/dist/commands/verify/evidence/read.js.map +1 -1
  283. package/dist/commands/verify/frozen.js +45 -23
  284. package/dist/commands/verify/frozen.js.map +1 -1
  285. package/dist/commands/verify/record.js +69 -17
  286. package/dist/commands/verify/record.js.map +1 -1
  287. package/dist/commands/verify/report.js +27 -44
  288. package/dist/commands/verify/report.js.map +1 -1
  289. package/dist/commands/verify/results.js +112 -30
  290. package/dist/commands/verify/results.js.map +1 -1
  291. package/dist/commands/verify/verify.js +55 -52
  292. package/dist/commands/verify/verify.js.map +1 -1
  293. package/dist/commands/vouch/pack/pack.js +2 -2
  294. package/dist/commands/vouch/pack/pack.js.map +1 -1
  295. package/dist/commands/vouch/pack/print.js +1 -6
  296. package/dist/commands/vouch/pack/print.js.map +1 -1
  297. package/dist/commands/vouch/pack/sections.js +1 -2
  298. package/dist/commands/vouch/pack/sections.js.map +1 -1
  299. package/dist/commands/vouch/run.js +26 -81
  300. package/dist/commands/vouch/run.js.map +1 -1
  301. package/dist/commands/vouch/sample/plan.js +20 -34
  302. package/dist/commands/vouch/sample/plan.js.map +1 -1
  303. package/dist/commands/vouch/vet/verify.js +39 -7
  304. package/dist/commands/vouch/vet/verify.js.map +1 -1
  305. package/dist/commands/vouch/vouch.js +10 -17
  306. package/dist/commands/vouch/vouch.js.map +1 -1
  307. package/dist/core/agent/agents-md/command-map.js +81 -106
  308. package/dist/core/agent/agents-md/command-map.js.map +1 -1
  309. package/dist/core/agent/agents-md/map/explain.js +21 -9
  310. package/dist/core/agent/agents-md/map/explain.js.map +1 -1
  311. package/dist/core/agent/agents-md/map/lenses/context.js +17 -8
  312. package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -1
  313. package/dist/core/agent/agents-md/map/lenses/diff.js +33 -20
  314. package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -1
  315. package/dist/core/agent/agents-md/map/lenses/gate.js +13 -5
  316. package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -1
  317. package/dist/core/agent/agents-md/map/mcp.js +10 -7
  318. package/dist/core/agent/agents-md/map/mcp.js.map +1 -1
  319. package/dist/core/agent/agents-md/map/status.js +24 -8
  320. package/dist/core/agent/agents-md/map/status.js.map +1 -1
  321. package/dist/core/agent/agents-md/map/subsystem.js +80 -8
  322. package/dist/core/agent/agents-md/map/subsystem.js.map +1 -1
  323. package/dist/core/agent/agents-md/map/usecases.js +88 -10
  324. package/dist/core/agent/agents-md/map/usecases.js.map +1 -1
  325. package/dist/core/agent/agents-md/refusals.js +49 -22
  326. package/dist/core/agent/agents-md/refusals.js.map +1 -1
  327. package/dist/core/agent/agents-md.js +39 -6
  328. package/dist/core/agent/agents-md.js.map +1 -1
  329. package/dist/core/agent/agents-stamp.js +10 -0
  330. package/dist/core/agent/agents-stamp.js.map +1 -1
  331. package/dist/core/agent/protocol.js +1 -1
  332. package/dist/core/agent/protocol.js.map +1 -1
  333. package/dist/core/agent/scaffold.js +10 -15
  334. package/dist/core/agent/scaffold.js.map +1 -1
  335. package/dist/core/agent/support/report.js +46 -5
  336. package/dist/core/agent/support/report.js.map +1 -1
  337. package/dist/core/agent/tools/dialects.js +1 -0
  338. package/dist/core/agent/tools/dialects.js.map +1 -1
  339. package/dist/core/agent/tools/registry.js +41 -76
  340. package/dist/core/agent/tools/registry.js.map +1 -1
  341. package/dist/core/agent/workflows/adopt.js +158 -11
  342. package/dist/core/agent/workflows/adopt.js.map +1 -1
  343. package/dist/core/agent/workflows/check.js +78 -39
  344. package/dist/core/agent/workflows/check.js.map +1 -1
  345. package/dist/core/agent/workflows/closing.js +88 -27
  346. package/dist/core/agent/workflows/closing.js.map +1 -1
  347. package/dist/core/agent/workflows/feature.js +128 -13
  348. package/dist/core/agent/workflows/feature.js.map +1 -1
  349. package/dist/core/agent/workflows/implement.js +96 -13
  350. package/dist/core/agent/workflows/implement.js.map +1 -1
  351. package/dist/core/agent/workflows/reference/authoring.js +106 -4
  352. package/dist/core/agent/workflows/reference/authoring.js.map +1 -1
  353. package/dist/core/agent/workflows/reference/codes.js +8 -6
  354. package/dist/core/agent/workflows/reference/codes.js.map +1 -1
  355. package/dist/core/agent/workflows/reference/done-check.js +37 -15
  356. package/dist/core/agent/workflows/reference/done-check.js.map +1 -1
  357. package/dist/core/agent/workflows/reference/drawing/drawing.js +253 -0
  358. package/dist/core/agent/workflows/reference/drawing/drawing.js.map +1 -0
  359. package/dist/core/agent/workflows/reference/reference.js +6 -3
  360. package/dist/core/agent/workflows/reference/reference.js.map +1 -1
  361. package/dist/core/agent/workflows/reference/spine.js +68 -27
  362. package/dist/core/agent/workflows/reference/spine.js.map +1 -1
  363. package/dist/core/asyncapi/baseline/plan.js +14 -81
  364. package/dist/core/asyncapi/baseline/plan.js.map +1 -1
  365. package/dist/core/asyncapi/digest.js +30 -25
  366. package/dist/core/asyncapi/digest.js.map +1 -1
  367. package/dist/core/asyncapi/merge/components.js +5 -4
  368. package/dist/core/asyncapi/merge/components.js.map +1 -1
  369. package/dist/core/asyncapi/merge/error.js +7 -2
  370. package/dist/core/asyncapi/merge/error.js.map +1 -1
  371. package/dist/core/asyncapi/merge/markers.js +32 -50
  372. package/dist/core/asyncapi/merge/markers.js.map +1 -1
  373. package/dist/core/asyncapi/merge/merge.js +33 -53
  374. package/dist/core/asyncapi/merge/merge.js.map +1 -1
  375. package/dist/core/asyncapi/merge/pin.js +12 -36
  376. package/dist/core/asyncapi/merge/pin.js.map +1 -1
  377. package/dist/core/asyncapi/model.js.map +1 -1
  378. package/dist/core/asyncapi/read.js +36 -12
  379. package/dist/core/asyncapi/read.js.map +1 -1
  380. package/dist/core/brief/brief.js +96 -36
  381. package/dist/core/brief/brief.js.map +1 -1
  382. package/dist/core/brief/checks.js +138 -3
  383. package/dist/core/brief/checks.js.map +1 -1
  384. package/dist/core/brief/landscape.js +209 -130
  385. package/dist/core/brief/landscape.js.map +1 -1
  386. package/dist/core/brief/map/extend.js +84 -0
  387. package/dist/core/brief/map/extend.js.map +1 -0
  388. package/dist/core/brief/map/owed.js +266 -0
  389. package/dist/core/brief/map/owed.js.map +1 -0
  390. package/dist/core/brief/targets.js +109 -31
  391. package/dist/core/brief/targets.js.map +1 -1
  392. package/dist/core/brief/unchecked.js +14 -3
  393. package/dist/core/brief/unchecked.js.map +1 -1
  394. package/dist/core/c4/arch.js +90 -182
  395. package/dist/core/c4/arch.js.map +1 -1
  396. package/dist/core/c4/direction/direction.js +114 -0
  397. package/dist/core/c4/direction/direction.js.map +1 -0
  398. package/dist/core/c4/likec4.js +169 -14
  399. package/dist/core/c4/likec4.js.map +1 -1
  400. package/dist/core/c4/locate/unlocated.js +150 -0
  401. package/dist/core/c4/locate/unlocated.js.map +1 -0
  402. package/dist/core/c4/parsed/deployment.js +160 -0
  403. package/dist/core/c4/parsed/deployment.js.map +1 -0
  404. package/dist/core/c4/parsed/dynamic-views.js.map +1 -1
  405. package/dist/core/c4/parsed/values.js +54 -1
  406. package/dist/core/c4/parsed/values.js.map +1 -1
  407. package/dist/core/c4/parsed/view-ids.js +39 -1
  408. package/dist/core/c4/parsed/view-ids.js.map +1 -1
  409. package/dist/core/c4/prefetch/fleet.js +134 -0
  410. package/dist/core/c4/prefetch/fleet.js.map +1 -0
  411. package/dist/core/c4/project/architecture.js +123 -7
  412. package/dist/core/c4/project/architecture.js.map +1 -1
  413. package/dist/core/c4/project/batch.js +140 -0
  414. package/dist/core/c4/project/batch.js.map +1 -0
  415. package/dist/core/c4/project/documents.js +43 -12
  416. package/dist/core/c4/project/documents.js.map +1 -1
  417. package/dist/core/c4/project/load.js +79 -43
  418. package/dist/core/c4/project/load.js.map +1 -1
  419. package/dist/core/c4/project/staged.js +277 -0
  420. package/dist/core/c4/project/staged.js.map +1 -0
  421. package/dist/core/c4/resolve/attested.js +0 -0
  422. package/dist/core/c4/resolve/attested.js.map +1 -0
  423. package/dist/core/c4/resolve/external.js +51 -0
  424. package/dist/core/c4/resolve/external.js.map +1 -0
  425. package/dist/core/c4/resolve/service.js +78 -17
  426. package/dist/core/c4/resolve/service.js.map +1 -1
  427. package/dist/core/c4/resolve/steps.js +290 -0
  428. package/dist/core/c4/resolve/steps.js.map +1 -0
  429. package/dist/core/c4/resolve/systems.js +154 -0
  430. package/dist/core/c4/resolve/systems.js.map +1 -0
  431. package/dist/core/c4/root-project/exclude.js +352 -0
  432. package/dist/core/c4/root-project/exclude.js.map +1 -0
  433. package/dist/core/c4/seed/template.js +65 -1
  434. package/dist/core/c4/seed/template.js.map +1 -1
  435. package/dist/core/c4/service-model/created/models.js +96 -0
  436. package/dist/core/c4/service-model/created/models.js.map +1 -0
  437. package/dist/core/c4/service-model/documents.js +47 -0
  438. package/dist/core/c4/service-model/documents.js.map +1 -0
  439. package/dist/core/c4/service-model/fleet/extending.js +82 -0
  440. package/dist/core/c4/service-model/fleet/extending.js.map +1 -0
  441. package/dist/core/c4/service-model/load.js +165 -0
  442. package/dist/core/c4/service-model/load.js.map +1 -0
  443. package/dist/core/c4/service-model/renderer.js +128 -0
  444. package/dist/core/c4/service-model/renderer.js.map +1 -0
  445. package/dist/core/c4/service-model/shape.js +106 -0
  446. package/dist/core/c4/service-model/shape.js.map +1 -0
  447. package/dist/core/c4/service-model/slice.js +188 -0
  448. package/dist/core/c4/service-model/slice.js.map +1 -0
  449. package/dist/core/c4/source-mask.js +297 -10
  450. package/dist/core/c4/source-mask.js.map +1 -1
  451. package/dist/core/c4/source-scan.js +222 -141
  452. package/dist/core/c4/source-scan.js.map +1 -1
  453. package/dist/core/c4/splice/authored-source.js +79 -13
  454. package/dist/core/c4/splice/authored-source.js.map +1 -1
  455. package/dist/core/c4/splice/contract.js +20 -0
  456. package/dist/core/c4/splice/contract.js.map +1 -1
  457. package/dist/core/c4/splice/delta-blocks.js +20 -20
  458. package/dist/core/c4/splice/delta-blocks.js.map +1 -1
  459. package/dist/core/c4/splice/identity/declared.js +87 -0
  460. package/dist/core/c4/splice/identity/declared.js.map +1 -0
  461. package/dist/core/c4/splice/identity/edges.js +37 -0
  462. package/dist/core/c4/splice/identity/edges.js.map +1 -1
  463. package/dist/core/c4/splice/identity/existing.js +80 -0
  464. package/dist/core/c4/splice/identity/existing.js.map +1 -0
  465. package/dist/core/c4/splice/identity/interior.js +80 -0
  466. package/dist/core/c4/splice/identity/interior.js.map +1 -0
  467. package/dist/core/c4/splice/identity/owner.js +50 -0
  468. package/dist/core/c4/splice/identity/owner.js.map +1 -0
  469. package/dist/core/c4/splice/landscape-merge.js +182 -114
  470. package/dist/core/c4/splice/landscape-merge.js.map +1 -1
  471. package/dist/core/c4/splice/model/merge.js +151 -0
  472. package/dist/core/c4/splice/model/merge.js.map +1 -0
  473. package/dist/core/c4/splice/placement.js +160 -56
  474. package/dist/core/c4/splice/placement.js.map +1 -1
  475. package/dist/core/c4/splice/text/spot.js +131 -0
  476. package/dist/core/c4/splice/text/spot.js.map +1 -0
  477. package/dist/core/c4/workspace.js +13 -19
  478. package/dist/core/c4/workspace.js.map +1 -1
  479. package/dist/core/capabilities/capabilities.js +6 -6
  480. package/dist/core/capabilities/capabilities.js.map +1 -1
  481. package/dist/core/capabilities/delta/doc.js +7 -10
  482. package/dist/core/capabilities/delta/doc.js.map +1 -1
  483. package/dist/core/capabilities/delta/uncovered.js +2 -2
  484. package/dist/core/capabilities/delta/uncovered.js.map +1 -1
  485. package/dist/core/capabilities/findings.js +18 -22
  486. package/dist/core/capabilities/findings.js.map +1 -1
  487. package/dist/core/capabilities/realizes/findings.js +12 -19
  488. package/dist/core/capabilities/realizes/findings.js.map +1 -1
  489. package/dist/core/capabilities/realizes/join.js +0 -20
  490. package/dist/core/capabilities/realizes/join.js.map +1 -1
  491. package/dist/core/capabilities/rollup.js +6 -0
  492. package/dist/core/capabilities/rollup.js.map +1 -1
  493. package/dist/core/capabilities/tree.js +6 -28
  494. package/dist/core/capabilities/tree.js.map +1 -1
  495. package/dist/core/capabilities/usecase-join.js +3 -13
  496. package/dist/core/capabilities/usecase-join.js.map +1 -1
  497. package/dist/core/coherence/authoring/scaffold.js +11 -3
  498. package/dist/core/coherence/authoring/scaffold.js.map +1 -1
  499. package/dist/core/coherence/authoring/sentinels.js +2 -1
  500. package/dist/core/coherence/authoring/sentinels.js.map +1 -1
  501. package/dist/core/coherence/calls/called.js +52 -0
  502. package/dist/core/coherence/calls/called.js.map +1 -0
  503. package/dist/core/coherence/coherence.js +103 -22
  504. package/dist/core/coherence/coherence.js.map +1 -1
  505. package/dist/core/coherence/consumed/operations.js +70 -0
  506. package/dist/core/coherence/consumed/operations.js.map +1 -0
  507. package/dist/core/coherence/consumed/refusal.js +38 -0
  508. package/dist/core/coherence/consumed/refusal.js.map +1 -0
  509. package/dist/core/coherence/covers/health.js +85 -0
  510. package/dist/core/coherence/covers/health.js.map +1 -0
  511. package/dist/core/coherence/declared.js +60 -34
  512. package/dist/core/coherence/declared.js.map +1 -1
  513. package/dist/core/coherence/events/declared.js +44 -59
  514. package/dist/core/coherence/events/declared.js.map +1 -1
  515. package/dist/core/coherence/events/events.js +147 -16
  516. package/dist/core/coherence/events/events.js.map +1 -1
  517. package/dist/core/coherence/events/grades.js +31 -8
  518. package/dist/core/coherence/events/grades.js.map +1 -1
  519. package/dist/core/coherence/events/lookups.js +28 -87
  520. package/dist/core/coherence/events/lookups.js.map +1 -1
  521. package/dist/core/coherence/events/produced.js +100 -0
  522. package/dist/core/coherence/events/produced.js.map +1 -0
  523. package/dist/core/coherence/lookups.js +18 -78
  524. package/dist/core/coherence/lookups.js.map +1 -1
  525. package/dist/core/coherence/retired/archived.js +285 -0
  526. package/dist/core/coherence/retired/archived.js.map +1 -0
  527. package/dist/core/coherence/retired/event-pair.js +62 -0
  528. package/dist/core/coherence/retired/event-pair.js.map +1 -0
  529. package/dist/core/coherence/retired/merged.js +79 -0
  530. package/dist/core/coherence/retired/merged.js.map +1 -0
  531. package/dist/core/coherence/retired/retirement.js +49 -0
  532. package/dist/core/coherence/retired/retirement.js.map +1 -0
  533. package/dist/core/coherence/retired/revival/arrivals.js +131 -0
  534. package/dist/core/coherence/retired/revival/arrivals.js.map +1 -0
  535. package/dist/core/coherence/retired/revival/revived.js +297 -0
  536. package/dist/core/coherence/retired/revival/revived.js.map +1 -0
  537. package/dist/core/consumers/after.js +113 -0
  538. package/dist/core/consumers/after.js.map +1 -0
  539. package/dist/core/consumers/consumers.js +296 -0
  540. package/dist/core/consumers/consumers.js.map +1 -0
  541. package/dist/core/consumers/current.js +211 -0
  542. package/dist/core/consumers/current.js.map +1 -0
  543. package/dist/core/consumers/scan.js +46 -0
  544. package/dist/core/consumers/scan.js.map +1 -0
  545. package/dist/core/consumers/state.js +27 -0
  546. package/dist/core/consumers/state.js.map +1 -0
  547. package/dist/core/delta/delta.js +51 -6
  548. package/dist/core/delta/delta.js.map +1 -1
  549. package/dist/core/dependencies/fanin.js +2 -2
  550. package/dist/core/dependencies/fanin.js.map +1 -1
  551. package/dist/core/deployment/delta.js +191 -0
  552. package/dist/core/deployment/delta.js.map +1 -0
  553. package/dist/core/deployment/objects.js +145 -0
  554. package/dist/core/deployment/objects.js.map +1 -0
  555. package/dist/core/diff/base-git.js +94 -12
  556. package/dist/core/diff/base-git.js.map +1 -1
  557. package/dist/core/diff/base-state.js +49 -21
  558. package/dist/core/diff/base-state.js.map +1 -1
  559. package/dist/core/diff/joins.js +136 -0
  560. package/dist/core/diff/joins.js.map +1 -0
  561. package/dist/core/diff/scope/changed-paths.js +22 -6
  562. package/dist/core/diff/scope/changed-paths.js.map +1 -1
  563. package/dist/core/diff/scope/edges.js +82 -0
  564. package/dist/core/diff/scope/edges.js.map +1 -0
  565. package/dist/core/diff/semantic.js +100 -31
  566. package/dist/core/diff/semantic.js.map +1 -1
  567. package/dist/core/docs.js +31 -22
  568. package/dist/core/docs.js.map +1 -1
  569. package/dist/core/doctor/agents.js +34 -18
  570. package/dist/core/doctor/agents.js.map +1 -1
  571. package/dist/core/doctor/config.js +7 -3
  572. package/dist/core/doctor/config.js.map +1 -1
  573. package/dist/core/doctor/doctor.js +91 -11
  574. package/dist/core/doctor/doctor.js.map +1 -1
  575. package/dist/core/doctor/report.js.map +1 -1
  576. package/dist/core/doctor/reports/scan.js +242 -0
  577. package/dist/core/doctor/reports/scan.js.map +1 -0
  578. package/dist/core/document/apply.js +158 -11
  579. package/dist/core/document/apply.js.map +1 -1
  580. package/dist/core/document/frontmatter.js +55 -0
  581. package/dist/core/document/frontmatter.js.map +1 -1
  582. package/dist/core/document/parse.js +29 -6
  583. package/dist/core/document/parse.js.map +1 -1
  584. package/dist/core/document/scenarios.js +17 -0
  585. package/dist/core/document/scenarios.js.map +1 -1
  586. package/dist/core/document/spec.js +4 -11
  587. package/dist/core/document/spec.js.map +1 -1
  588. package/dist/core/envelope/config.js +10 -0
  589. package/dist/core/envelope/config.js.map +1 -1
  590. package/dist/core/envelope/json.js +34 -0
  591. package/dist/core/envelope/json.js.map +1 -1
  592. package/dist/core/explain/families.js +26 -21
  593. package/dist/core/explain/families.js.map +1 -1
  594. package/dist/core/explain/lookup.js +14 -1
  595. package/dist/core/explain/lookup.js.map +1 -1
  596. package/dist/core/explain/refusals.js +5 -5
  597. package/dist/core/explain/refusals.js.map +1 -1
  598. package/dist/core/explain/terms/documents.js +227 -0
  599. package/dist/core/explain/terms/documents.js.map +1 -0
  600. package/dist/core/explain/terms/done-check.js +144 -0
  601. package/dist/core/explain/terms/done-check.js.map +1 -0
  602. package/dist/core/explain/terms/entry.js +14 -0
  603. package/dist/core/explain/terms/entry.js.map +1 -0
  604. package/dist/core/explain/terms/stages.js +71 -0
  605. package/dist/core/explain/terms/stages.js.map +1 -0
  606. package/dist/core/explain/terms/tasks.js +97 -0
  607. package/dist/core/explain/terms/tasks.js.map +1 -0
  608. package/dist/core/explain/terms.js +68 -109
  609. package/dist/core/explain/terms.js.map +1 -1
  610. package/dist/core/explore/explore.js +40 -10
  611. package/dist/core/explore/explore.js.map +1 -1
  612. package/dist/core/fleet-context.js +81 -95
  613. package/dist/core/fleet-context.js.map +1 -1
  614. package/dist/core/gate/checks.js +11 -4
  615. package/dist/core/gate/checks.js.map +1 -1
  616. package/dist/core/gate/partners.js +69 -28
  617. package/dist/core/gate/partners.js.map +1 -1
  618. package/dist/core/gate/report.js.map +1 -1
  619. package/dist/core/gate/verification.js +75 -12
  620. package/dist/core/gate/verification.js.map +1 -1
  621. package/dist/core/gherkin/stale.js +13 -37
  622. package/dist/core/gherkin/stale.js.map +1 -1
  623. package/dist/core/glossary/delta.js +10 -7
  624. package/dist/core/glossary/delta.js.map +1 -1
  625. package/dist/core/glossary/tree.js +6 -19
  626. package/dist/core/glossary/tree.js.map +1 -1
  627. package/dist/core/kernel/concurrency.js +19 -0
  628. package/dist/core/kernel/concurrency.js.map +1 -1
  629. package/dist/core/kernel/ids/fqn/ancestors.js +65 -0
  630. package/dist/core/kernel/ids/fqn/ancestors.js.map +1 -0
  631. package/dist/core/kernel/path-safety.js +38 -0
  632. package/dist/core/kernel/path-safety.js.map +1 -1
  633. package/dist/core/kernel/records.js +11 -0
  634. package/dist/core/kernel/records.js.map +1 -1
  635. package/dist/core/links/backlinks.js +1 -3
  636. package/dist/core/links/backlinks.js.map +1 -1
  637. package/dist/core/links/corpus.js +51 -37
  638. package/dist/core/links/corpus.js.map +1 -1
  639. package/dist/core/links/findings.js.map +1 -1
  640. package/dist/core/links/parse.js +38 -9
  641. package/dist/core/links/parse.js.map +1 -1
  642. package/dist/core/mcp/argv.js +101 -0
  643. package/dist/core/mcp/argv.js.map +1 -1
  644. package/dist/core/mcp/author-tools.js +2 -1
  645. package/dist/core/mcp/author-tools.js.map +1 -1
  646. package/dist/core/mcp/protocol.js +2 -2
  647. package/dist/core/mcp/protocol.js.map +1 -1
  648. package/dist/core/mcp/tools.js +43 -33
  649. package/dist/core/mcp/tools.js.map +1 -1
  650. package/dist/core/openapi/baseline/gate.js +53 -12
  651. package/dist/core/openapi/baseline/gate.js.map +1 -1
  652. package/dist/core/openapi/baseline/plan.js +40 -10
  653. package/dist/core/openapi/baseline/plan.js.map +1 -1
  654. package/dist/core/openapi/baseline/record.js +0 -1
  655. package/dist/core/openapi/baseline/record.js.map +1 -1
  656. package/dist/core/openapi/contract-text.js +33 -0
  657. package/dist/core/openapi/contract-text.js.map +1 -0
  658. package/dist/core/openapi/contract-tree.js +301 -0
  659. package/dist/core/openapi/contract-tree.js.map +1 -0
  660. package/dist/core/openapi/depth.js +38 -24
  661. package/dist/core/openapi/depth.js.map +1 -1
  662. package/dist/core/openapi/digest.js +52 -2
  663. package/dist/core/openapi/digest.js.map +1 -1
  664. package/dist/core/openapi/doc.js +12 -4
  665. package/dist/core/openapi/doc.js.map +1 -1
  666. package/dist/core/openapi/merge/components.js +25 -60
  667. package/dist/core/openapi/merge/components.js.map +1 -1
  668. package/dist/core/openapi/merge/error.js +3 -13
  669. package/dist/core/openapi/merge/error.js.map +1 -1
  670. package/dist/core/openapi/merge/markers.js +26 -30
  671. package/dist/core/openapi/merge/markers.js.map +1 -1
  672. package/dist/core/openapi/merge/merge.js +28 -52
  673. package/dist/core/openapi/merge/merge.js.map +1 -1
  674. package/dist/core/openapi/merge/pin.js +17 -35
  675. package/dist/core/openapi/merge/pin.js.map +1 -1
  676. package/dist/core/openspec/decide/verdict.js.map +1 -1
  677. package/dist/core/openspec/inventory.js +4 -5
  678. package/dist/core/openspec/inventory.js.map +1 -1
  679. package/dist/core/openspec/model/mapping.js +30 -28
  680. package/dist/core/openspec/model/mapping.js.map +1 -1
  681. package/dist/core/openspec/model/model.js +12 -7
  682. package/dist/core/openspec/model/model.js.map +1 -1
  683. package/dist/core/openspec/scan/changes.js +10 -4
  684. package/dist/core/openspec/scan/changes.js.map +1 -1
  685. package/dist/core/openspec/scan/config.js +7 -16
  686. package/dist/core/openspec/scan/config.js.map +1 -1
  687. package/dist/core/openspec/scan/shape.js +63 -19
  688. package/dist/core/openspec/scan/shape.js.map +1 -1
  689. package/dist/core/openspec/scan/walk.js +21 -38
  690. package/dist/core/openspec/scan/walk.js.map +1 -1
  691. package/dist/core/pack/living.js +43 -4
  692. package/dist/core/pack/living.js.map +1 -1
  693. package/dist/core/pack/pack.js +50 -6
  694. package/dist/core/pack/pack.js.map +1 -1
  695. package/dist/core/projection/arch-slice.js +2 -2
  696. package/dist/core/projection/arch-slice.js.map +1 -1
  697. package/dist/core/projection/introduced.js +14 -0
  698. package/dist/core/projection/introduced.js.map +1 -0
  699. package/dist/core/provenance/findings.js +48 -12
  700. package/dist/core/provenance/findings.js.map +1 -1
  701. package/dist/core/provenance/git.js +33 -57
  702. package/dist/core/provenance/git.js.map +1 -1
  703. package/dist/core/provenance/gitq/moves.js +71 -114
  704. package/dist/core/provenance/gitq/moves.js.map +1 -1
  705. package/dist/core/provenance/gitq/vouched-ancestor.js +2 -2
  706. package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -1
  707. package/dist/core/provenance/sources.js +23 -6
  708. package/dist/core/provenance/sources.js.map +1 -1
  709. package/dist/core/provenance/stamp.js +5 -17
  710. package/dist/core/provenance/stamp.js.map +1 -1
  711. package/dist/core/repo/authored/paths.js +18 -0
  712. package/dist/core/repo/authored/paths.js.map +1 -1
  713. package/dist/core/repo/entries.js.map +1 -1
  714. package/dist/core/repo/paths.js +92 -6
  715. package/dist/core/repo/paths.js.map +1 -1
  716. package/dist/core/repo/repo.js +74 -14
  717. package/dist/core/repo/repo.js.map +1 -1
  718. package/dist/core/repo/tree/find.js +12 -3
  719. package/dist/core/repo/tree/find.js.map +1 -1
  720. package/dist/core/repo/tree/fs.js +27 -1
  721. package/dist/core/repo/tree/fs.js.map +1 -1
  722. package/dist/core/repo/tree/render/body.js +258 -0
  723. package/dist/core/repo/tree/render/body.js.map +1 -0
  724. package/dist/core/repo/tree/render/projects.js +182 -0
  725. package/dist/core/repo/tree/render/projects.js.map +1 -0
  726. package/dist/core/repo/tree/render/service/header.js +125 -0
  727. package/dist/core/repo/tree/render/service/header.js.map +1 -0
  728. package/dist/core/repo/tree/render/service/peers.js +28 -0
  729. package/dist/core/repo/tree/render/service/peers.js.map +1 -0
  730. package/dist/core/repo/tree/render/service/view-id.js +67 -0
  731. package/dist/core/repo/tree/render/service/view-id.js.map +1 -0
  732. package/dist/core/repo/tree/render/service/views.js +78 -0
  733. package/dist/core/repo/tree/render/service/views.js.map +1 -0
  734. package/dist/core/repo/tree/render/stale.js +42 -0
  735. package/dist/core/repo/tree/render/stale.js.map +1 -0
  736. package/dist/core/repo/tree/render/text.js +84 -0
  737. package/dist/core/repo/tree/render/text.js.map +1 -0
  738. package/dist/core/repo/tree/render/views.js +293 -0
  739. package/dist/core/repo/tree/render/views.js.map +1 -0
  740. package/dist/core/repo/tree/walk.js +53 -32
  741. package/dist/core/repo/tree/walk.js.map +1 -1
  742. package/dist/core/results.js +47 -12
  743. package/dist/core/results.js.map +1 -1
  744. package/dist/core/scaffold/landscape.js +121 -13
  745. package/dist/core/scaffold/landscape.js.map +1 -1
  746. package/dist/core/scaffold/legacy.js +271 -0
  747. package/dist/core/scaffold/legacy.js.map +1 -0
  748. package/dist/core/staging/commit.js +26 -15
  749. package/dist/core/staging/commit.js.map +1 -1
  750. package/dist/core/staging/lock.js +74 -12
  751. package/dist/core/staging/lock.js.map +1 -1
  752. package/dist/core/staging/recovery/intent.js +2 -5
  753. package/dist/core/staging/recovery/intent.js.map +1 -1
  754. package/dist/core/staging/recovery/recover.js +84 -6
  755. package/dist/core/staging/recovery/recover.js.map +1 -1
  756. package/dist/core/staging/snapshot/manifest.js +188 -0
  757. package/dist/core/staging/snapshot/manifest.js.map +1 -0
  758. package/dist/core/staging/{snapshot.js → snapshot/snapshot.js} +39 -45
  759. package/dist/core/staging/snapshot/snapshot.js.map +1 -0
  760. package/dist/core/staging/txn/forward.js +24 -14
  761. package/dist/core/staging/txn/forward.js.map +1 -1
  762. package/dist/core/staging/writes.js.map +1 -1
  763. package/dist/core/status/actions/execution.js +11 -0
  764. package/dist/core/status/actions/execution.js.map +1 -1
  765. package/dist/core/status/contracts.js +39 -15
  766. package/dist/core/status/contracts.js.map +1 -1
  767. package/dist/core/status/feature/artifacts.js +33 -8
  768. package/dist/core/status/feature/artifacts.js.map +1 -1
  769. package/dist/core/status/feature/feature.js +24 -17
  770. package/dist/core/status/feature/feature.js.map +1 -1
  771. package/dist/core/status/feature/next.js +20 -7
  772. package/dist/core/status/feature/next.js.map +1 -1
  773. package/dist/core/status/feature/words.js +96 -0
  774. package/dist/core/status/feature/words.js.map +1 -0
  775. package/dist/core/status/fleet/fleet.js +43 -14
  776. package/dist/core/status/fleet/fleet.js.map +1 -1
  777. package/dist/core/status/fleet/next.js +153 -58
  778. package/dist/core/status/fleet/next.js.map +1 -1
  779. package/dist/core/status/report.js.map +1 -1
  780. package/dist/core/status/scan.js.map +1 -1
  781. package/dist/core/status/verification.js +30 -15
  782. package/dist/core/status/verification.js.map +1 -1
  783. package/dist/core/tasks/packet.js +199 -0
  784. package/dist/core/tasks/packet.js.map +1 -0
  785. package/dist/core/tasks/record.js +43 -0
  786. package/dist/core/tasks/record.js.map +1 -0
  787. package/dist/core/tasks/sources.js +181 -0
  788. package/dist/core/tasks/sources.js.map +1 -0
  789. package/dist/core/tasks/stamps.js +76 -0
  790. package/dist/core/tasks/stamps.js.map +1 -0
  791. package/dist/core/tasks/unit.js +0 -0
  792. package/dist/core/tasks/unit.js.map +1 -0
  793. package/dist/core/usecases/capability.js +11 -14
  794. package/dist/core/usecases/capability.js.map +1 -1
  795. package/dist/core/usecases/delta/claims.js +31 -7
  796. package/dist/core/usecases/delta/claims.js.map +1 -1
  797. package/dist/core/usecases/delta/flows.js +5 -7
  798. package/dist/core/usecases/delta/flows.js.map +1 -1
  799. package/dist/core/usecases/delta/modified.js +315 -0
  800. package/dist/core/usecases/delta/modified.js.map +1 -0
  801. package/dist/core/usecases/delta/overlay.js +32 -191
  802. package/dist/core/usecases/delta/overlay.js.map +1 -1
  803. package/dist/core/usecases/fleet.js +195 -36
  804. package/dist/core/usecases/fleet.js.map +1 -1
  805. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/capability-tag.js +8 -9
  806. package/dist/core/usecases/grade/capability-tag.js.map +1 -0
  807. package/dist/core/usecases/grade/feature.js +88 -0
  808. package/dist/core/usecases/grade/feature.js.map +1 -0
  809. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/requirement-tag.js +3 -4
  810. package/dist/core/usecases/grade/requirement-tag.js.map +1 -0
  811. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/steps.js +102 -33
  812. package/dist/core/usecases/grade/steps.js.map +1 -0
  813. package/dist/{commands/validate/fleet/usecases → core/usecases/grade}/usecases.js +23 -10
  814. package/dist/core/usecases/grade/usecases.js.map +1 -0
  815. package/dist/core/usecases/operations.js +26 -14
  816. package/dist/core/usecases/operations.js.map +1 -1
  817. package/dist/core/usecases/place.js.map +1 -1
  818. package/dist/core/usecases/service/exclude.js +119 -0
  819. package/dist/core/usecases/service/exclude.js.map +1 -0
  820. package/dist/core/usecases/service/flows.js +164 -0
  821. package/dist/core/usecases/service/flows.js.map +1 -0
  822. package/dist/core/usecases/suites/participants.js +83 -0
  823. package/dist/core/usecases/suites/participants.js.map +1 -0
  824. package/dist/core/usecases/suites/suites.js +45 -0
  825. package/dist/core/usecases/suites/suites.js.map +1 -0
  826. package/dist/core/verify/answers.js +12 -5
  827. package/dist/core/verify/answers.js.map +1 -1
  828. package/dist/core/verify/build.js +102 -82
  829. package/dist/core/verify/build.js.map +1 -1
  830. package/dist/core/verify/checklist.js +70 -12
  831. package/dist/core/verify/checklist.js.map +1 -1
  832. package/dist/core/verify/location.js +67 -0
  833. package/dist/core/verify/location.js.map +1 -0
  834. package/dist/core/verify/pins/lint.js +3 -2
  835. package/dist/core/verify/pins/lint.js.map +1 -1
  836. package/dist/core/verify/pins/pin.js +1 -1
  837. package/dist/core/verify/pins/pin.js.map +1 -1
  838. package/dist/core/verify/read/file.js +224 -0
  839. package/dist/core/verify/read/file.js.map +1 -0
  840. package/dist/core/verify/{file.js → read/shape.js} +16 -104
  841. package/dist/core/verify/read/shape.js.map +1 -0
  842. package/dist/core/verify/read/union.js +105 -0
  843. package/dist/core/verify/read/union.js.map +1 -0
  844. package/dist/core/verify/record.js +35 -12
  845. package/dist/core/verify/record.js.map +1 -1
  846. package/dist/core/verify/store/commit.js +40 -30
  847. package/dist/core/verify/store/commit.js.map +1 -1
  848. package/dist/core/verify/store/render.js +8 -4
  849. package/dist/core/verify/store/render.js.map +1 -1
  850. package/dist/core/vocabulary/issue.js +4 -0
  851. package/dist/core/vocabulary/issue.js.map +1 -1
  852. package/dist/core/vocabulary/maturity.js +75 -4
  853. package/dist/core/vocabulary/maturity.js.map +1 -1
  854. package/dist/core/vocabulary/report.js +16 -1
  855. package/dist/core/vocabulary/report.js.map +1 -1
  856. package/examples/README.md +54 -11
  857. package/examples/docs/architecture/landscape.likec4 +62 -6
  858. package/examples/docs/architecture/services.likec4 +70 -0
  859. package/examples/docs/architecture/subsystems.likec4 +7 -0
  860. package/examples/docs/architecture/usecases/order-notification.likec4 +16 -7
  861. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +11 -8
  862. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +6 -6
  863. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +4 -1
  864. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +13 -10
  865. package/examples/docs/likec4.config.json +0 -1
  866. package/examples/docs/services/checkout-web/model.likec4 +39 -56
  867. package/examples/docs/services/order-service/arch.spec.md +13 -6
  868. package/examples/docs/services/order-service/asyncapi.yaml +3 -2
  869. package/examples/docs/services/order-service/model.likec4 +58 -70
  870. package/examples/docs/services/payment-service/arch.spec.md +7 -4
  871. package/examples/docs/services/payment-service/model.likec4 +38 -37
  872. package/examples/docs/services/platform/identity-service/arch.spec.md +7 -4
  873. package/examples/docs/services/platform/identity-service/model.likec4 +35 -37
  874. package/examples/docs/services/platform/notification-service/asyncapi.yaml +2 -1
  875. package/examples/docs/services/platform/notification-service/health.yaml +8 -3
  876. package/examples/docs/services/platform/notification-service/model.likec4 +43 -64
  877. package/package.json +1 -1
  878. package/dist/commands/validate/checks/vocabulary.js +0 -31
  879. package/dist/commands/validate/checks/vocabulary.js.map +0 -1
  880. package/dist/commands/validate/fleet/usecases/capability-tag.js.map +0 -1
  881. package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +0 -1
  882. package/dist/commands/validate/fleet/usecases/steps.js.map +0 -1
  883. package/dist/commands/validate/fleet/usecases/usecases.js.map +0 -1
  884. package/dist/core/agent/agents-md/artifacts.js +0 -220
  885. package/dist/core/agent/agents-md/artifacts.js.map +0 -1
  886. package/dist/core/agent/agents-md/cycle.js +0 -165
  887. package/dist/core/agent/agents-md/cycle.js.map +0 -1
  888. package/dist/core/agent/agents-md/shipped/archive-gate.js +0 -98
  889. package/dist/core/agent/agents-md/shipped/archive-gate.js.map +0 -1
  890. package/dist/core/agent/agents-md/spine.js +0 -40
  891. package/dist/core/agent/agents-md/spine.js.map +0 -1
  892. package/dist/core/coherence/events/merged.js +0 -40
  893. package/dist/core/coherence/events/merged.js.map +0 -1
  894. package/dist/core/diff/current-state.js +0 -96
  895. package/dist/core/diff/current-state.js.map +0 -1
  896. package/dist/core/diff/victims.js +0 -247
  897. package/dist/core/diff/victims.js.map +0 -1
  898. package/dist/core/repo/tree/views.js +0 -172
  899. package/dist/core/repo/tree/views.js.map +0 -1
  900. package/dist/core/staging/snapshot.js.map +0 -1
  901. package/dist/core/verify/file.js.map +0 -1
@@ -18,6 +18,7 @@ loam archive FEAT-112 --dry-run # an operation being retired, writing nothing
18
18
  loam verify FEAT-088 # a shipped feature's done-check: attested
19
19
  loam verify FEAT-120 # …and its pair, the same check: verified
20
20
  loam dependencies # the active-feature graph
21
+ loam list suites # which services each test suite needs up
21
22
  ```
22
23
 
23
24
  Working on loam itself and running from source, use `npx tsx ../../src/cli.ts <args>` in place of
@@ -58,6 +59,18 @@ GROUP and earns no finding. Each requirement in both files is a promise a custom
58
59
  names no service, and carries a `Requirement-ID:` — required here, unlike in a service spec, because
59
60
  these documents outlive every service that realizes them.
60
61
 
62
+ **One journey in two suites.** The same use case also carries `#suite-smoke` and
63
+ `#suite-notifications`, both declared in the landscape's `specification` block, so `loam list
64
+ suites` has a real answer: each suite needs `checkout-web`, `order-service` and
65
+ `notification-service` up — the union of the journey's participants, resolved through the same
66
+ element→service join the step grades use (notification-service is found through its filing under
67
+ `platform/`, because the answer is ids, never paths). Two participants resolve to no service and are
68
+ NAMED rather than dropped: `customer`, who drives the flow, and `kafka.orderEvents`, which is
69
+ `#external` through its `topic` kind and wants a double on the test stand. One journey in both
70
+ suites is the point of the tag: a directory could file it in only one. The suite tags change
71
+ nothing `validate` says here — the view was already graded through its `#cap-` tag — but on a view
72
+ carrying ONLY `#suite-` tags they are the opt-in, and its hops are graded like any other use case's.
73
+
61
74
  **Two glossary terms**, `glossary/order.md` and the nested `glossary/payments/authorization.md`,
62
75
  each cited from the capability documents that use the word. This is the axis's whole mechanism in
63
76
  two files: the citation is an ordinary markdown link, so `loam validate` resolves it like any other
@@ -81,8 +94,9 @@ nowhere, and `obligation.unapplied` is the warning in the table below.
81
94
  **On the event spine the arrow follows the message** — producer → topic for `publishes`, topic →
82
95
  consumer for `consumes` — and that is load-bearing rather than aesthetic. `publishes` binds the
83
96
  edge's source and `consumes` binds its target, so a consume edge drawn the other way round binds to
84
- nothing: the metadata parses, the document validates, and the check silently grades zero edges.
85
- Nothing in loam reports that today, which is why the landscape says so in a comment.
97
+ nothing: the metadata parses, the document validates, and no contract is checked against the link.
98
+ `spine.message-unbound` (warn) is what reports it, on the service at the end the key did not bind;
99
+ SCHEMA.md's *Which way an edge points* lists every reader of the arrow and the drawing each expects.
86
100
 
87
101
  ## Four features, at four points in their life
88
102
 
@@ -94,8 +108,10 @@ for.
94
108
  - **`features/archive/FEAT-088-refunds/`** — shipped, and **`attested`**. It was merged by the real
95
109
  `loam archive`, so its `.loam-before/` snapshot holds the exact bytes the merge overwrote and
96
110
  `loam unarchive FEAT-088` would put them back. Its `verification.yaml` is the done-check written
97
- down: every claim is confirmed, but the scenario claims rest on an agent's word instead of a
98
- digest-matched test run. loam does not pretend those are the same thing.
111
+ down — recorded all at once, so it is the one file (a feature recorded per service carries one
112
+ `verification/<svc>.yaml` per attesting service instead): every claim is confirmed, but the
113
+ scenario claims rest on an agent's word instead of a digest-matched test run. loam does not
114
+ pretend those are the same thing.
99
115
  - **`features/archive/FEAT-120-refund-notification/`** — shipped, and **`verified`**. The sequel
100
116
  FEAT-088 left open: the money went back and nobody told the customer. It publishes
101
117
  `payment.PaymentRefunded` from payment-service and has notification-service turn it into the
@@ -111,10 +127,10 @@ for.
111
127
  with its own requirements, architecture requirements and contract, a C4 delta that splices a
112
128
  nested element into the living landscape, a `MODIFIED` requirement that **renames its heading**
113
129
  while keeping its `Requirement-ID` — loam's rename mechanism — and an **event-contract delta**
114
- (`specs/payment-service/asyncapi.yaml`): a complete AsyncAPI 3.0 document restating
115
- payment-service's living contract under `loam rebase`-written `x-loam-based-on` pins and adding
116
- one new producer side, so the archive merges the new slots and leaves every pinned quote to the
117
- living contract's own copy.
130
+ (`specs/payment-service/asyncapi.yaml`) that restates payment-service's living contract under
131
+ `loam rebase`-written `x-loam-based-on` pins and adds one new producer side, so the archive merges
132
+ the new slots and leaves every pinned quote to the living contract's own copy. The restatement is
133
+ there to demonstrate the pin; a real delta holds only the slots it adds, changes or removes.
118
134
  - **`features/FEAT-112-retire-order-v1/`** — in flight, and the smallest legal shape: no
119
135
  `delta.likec4` at all, because retiring an operation moves no boxes. It carries the two halves
120
136
  loam requires together for a removal — a `REMOVED` requirement and an `x-loam-remove: true` marker
@@ -143,12 +159,39 @@ while the other three sit unfiled — the permanent, normal state a partially or
143
159
  in, counted by `loam list` and never a finding. Placement is not identity: both services' specs,
144
160
  contracts and digests are byte-identical to their unfiled days, every command addresses them by bare
145
161
  id, and `architecture/subsystems.likec4` — GENERATED by `loam subsystem sync`, one view per
146
- subsystem, one `include` per line — is the only file the grouping added. Edit the tree with
147
- `loam subsystem move|rename|rm` and the views file travels in the same transaction; edit it by hand
148
- and `validate --all` answers `subsystem.views-stale`. (`order-service` and `payment-service` stay
162
+ subsystem, one `include` per line — is the only file the grouping added. Its sibling
163
+ `architecture/services.likec4` is the other generated views file and owes the grouping nothing: one
164
+ overview view per service the fleet map draws, filed or not, each declared `of` its service's
165
+ element so every other view drills into it, and each titled by its path so the two files fold into
166
+ one folder tree. Edit the tree with
167
+ `loam subsystem move|rename|rm` and both views files travel in the same transaction; edit either by
168
+ hand and `validate --all` answers `subsystem.views-stale`, naming the file that drifted. (`order-service` and `payment-service` stay
149
169
  unfiled deliberately: FEAT-088's committed version-2 snapshot restores them by literal path, and the
150
170
  `loam unarchive FEAT-088` walkthrough must keep working byte-for-byte.)
151
171
 
172
+ **All five models are EXTENDING models, and that is the shape this example teaches.** None of them
173
+ declares a `specification` block, none re-declares a partner, and none has a `likec4.config.json`
174
+ beside it. Each one says what is inside its service with `extend marketplace.<svc> { … }` on the
175
+ element `architecture/landscape.likec4` already binds to its directory, so `kafka`, `stripe`,
176
+ `notification-provider` and every peer service are declared exactly once — in the map — and no two
177
+ documents can disagree about their tags. The root `likec4.config.json` therefore excludes only
178
+ `**/node_modules/**` and `features/**`: `npx likec4 validate examples/docs` names ONE project,
179
+ `fleet`, holding the map and all five models, and needs no `--project` flag. The other shape — a
180
+ model that declares its own `specification` and is parsed alone, which is what every model here was
181
+ before — is still legal and still supported; SCHEMA.md's "Two shapes of a service model" has both,
182
+ the eight grades in its table — seven that came with the pair, plus the one it narrowed
183
+ (`service.likec4-config-missing`, now standalone-only) — and the
184
+ ordered recipe for migrating between them.
185
+
186
+ Two consequences are visible in the tree and worth reading for. Element ids carry their full path,
187
+ so `services/order-service/arch.spec.md` writes `Covers: marketplace.orderService.db` — the
188
+ container has no shorter name, because the model extends an element nested in the `marketplace`
189
+ group. And a cross-boundary call is written **twice** on purpose: container-level in the model
190
+ (`marketplace.notificationService.sender -> notificationProvider`) and service-level in the map
191
+ (`marketplace.notificationService -> notificationProvider`), because every fleet check — the spine,
192
+ `landscape.service-isolated`, the platform census — reads the map alone. ROADMAP.md keeps that
193
+ remainder written down rather than hidden.
194
+
152
195
  Plus one count rather than a finding: `sourcesUnverifiableFromHere: 4`. Four specs name paths in
153
196
  their own service repositories, and this is none of those repositories — the fleet gate reports the
154
197
  blind spot instead of resolving it. Running `loam validate --service <id>` inside each service repo
@@ -8,6 +8,16 @@
8
8
  // service needs a directory (warning). An element is tied to its directory by
9
9
  // `metadata { service '<id>' }`, or by its title when there is no binding.
10
10
  // Systems that are not ours carry #external and are exempt.
11
+ //
12
+ // This file is also the SPECIFICATION every service model borrows. Each
13
+ // `services/<…>/<svc>/model.likec4` here is an EXTENDING model: it declares no
14
+ // kinds and no partners, and says what is inside its service with
15
+ // `extend marketplace.<svc> { … }` on the element below that binds to its
16
+ // directory. The root `likec4.config.json` therefore does NOT exclude
17
+ // `services/**` — the map and every model are ONE LikeC4 project, so an element
18
+ // is declared exactly once and no two documents can disagree about its tags.
19
+ // SCHEMA.md, "Two shapes of a service model", has both shapes and the rule that
20
+ // picks between them; a kind or tag a model needs is added HERE, once.
11
21
  specification {
12
22
  // A grouping element — it stands for no service and owns no directory. The
13
23
  // service checks WALK the tree rather than reading only top-level elements:
@@ -17,10 +27,27 @@ specification {
17
27
  // CONTAINS services rather than being one.
18
28
  element group
19
29
  element softwareSystem
20
- // Declared here because archive SPLICES a delta's additions verbatim: FEAT-101's
21
- // new system carries its `api` container along, and the kind has to be legal in
22
- // THIS document for the merged landscape to parse (archive refuses otherwise).
30
+ // Declared here for the service models, which declare no kinds of their own.
31
+ // FEAT-101's new system draws an `api` container inside it, and archive
32
+ // creates services/payment-split-service/model.likec4 with the service and
33
+ // splices the container in there — never into this file, which holds no
34
+ // service's interior. That model borrows its kinds from this block, so the
35
+ // kind has to be legal HERE for it to parse (archive refuses otherwise).
23
36
  element container
37
+ // Declared here for the SERVICE MODELS, and nothing in this file uses it.
38
+ // This fleet writes every `database` element inside the service that owns it,
39
+ // in a `services/<svc>/model.likec4` under `extend marketplace.<svc>` — a
40
+ // CHOICE this example makes, not a rule loam enforces. Drawing an owned store
41
+ // beside the services is equally first-class and earns no finding; what the
42
+ // placement decides is one thing, and it is a fact about LikeC4: a second
43
+ // service's edge naming `marketplace.<svc>.<store>` resolves only against a
44
+ // declaration the MAP holds, because a per-service project is `architecture/`
45
+ // plus one model. So a store a second consumer will name belongs on the map,
46
+ // and one nobody else reaches may live wherever the team finds it clearest.
47
+ // An extending model declares no kinds of its own, so a kind it needs and
48
+ // this block does not declare is ONE parse error on the model — which is what
49
+ // this line prevents.
50
+ element database
24
51
  element person
25
52
  // A topic is an element, and the kind carries #external rather than each
26
53
  // instance doing it: LikeC4 does NOT inherit tags, so a topic nested inside
@@ -58,6 +85,14 @@ specification {
58
85
  // cannot carry flattened to `-`. Declared here for the same reason — one
59
86
  // specification block serves the whole `architecture/` project.
60
87
  tag req-NOTIFY-ONCE
88
+ // The SUITES a flow runs with — `#suite-<name>` on the view, many-to-many, so
89
+ // the one journey below sits in both. Declared here, like every tag, so a
90
+ // mistyped suite is a parse error rather than a second, empty suite.
91
+ // `loam list suites` answers which services each one needs up: the union of
92
+ // its journeys' participants, plus the ones no services/ directory stands for
93
+ // (the customer who drives it, the #external topic in the middle).
94
+ tag suite-smoke
95
+ tag suite-notifications
61
96
  // An ARCHITECTURAL OBLIGATION, declared in architecture/obligations.yaml and
62
97
  // applied HERE, on the objects it holds for. The decision itself is
63
98
  // architecture/adrs/0001-transactional-outbox.md; this tag is the architect
@@ -137,6 +172,18 @@ model {
137
172
  description 'CRM of record — the fleet reads its events and writes none'
138
173
  }
139
174
 
175
+ // Declared HERE rather than in notification-service's model, and that is the
176
+ // rule an extending model turns on: a system a service reaches is the fleet's
177
+ // element, declared once, and a model that declared its own copy would be
178
+ // `c4.element-unowned` (an extending model may only add elements under the
179
+ // element that resolves to its own service). One consumer, so it never
180
+ // becomes `landscape.platform-candidate`; #external, so no
181
+ // services/notification-provider/ is asked for.
182
+ notificationProvider = softwareSystem 'notification-provider' {
183
+ #external
184
+ description 'Third-party email and SMS gateway — quota-limited, and outside this fleet'
185
+ }
186
+
140
187
  customer -> marketplace.checkoutWeb 'Uses'
141
188
 
142
189
  // The synchronous spine. Every one of these resolves against the TARGET's
@@ -185,6 +232,14 @@ model {
185
232
  // it raises no warning because its title does not claim to be a call into a
186
233
  // fleet service.
187
234
  marketplace.paymentService -> stripe 'Authorizes cards'
235
+ // The second half of the rule the extending shape keeps: the container that
236
+ // really makes the call is drawn in the service's own model
237
+ // (`marketplace.notificationService.sender -> notificationProvider`), and the
238
+ // SERVICE-level twin is drawn here, because every fleet check — the spine,
239
+ // `landscape.service-isolated`, the platform census — reads this file alone.
240
+ // The edge exists twice on purpose; SCHEMA.md says so where it says the map
241
+ // is the one document holding every cross-service edge.
242
+ marketplace.notificationService -> notificationProvider 'Sends email and SMS'
188
243
 
189
244
  // The event spine, the async mirror of `metadata { op }`: the name must be a
190
245
  // message the PRODUCER's own asyncapi.yaml declares an `action: send` for, or
@@ -195,9 +250,10 @@ model {
195
250
  // THE ARROW FOLLOWS THE MESSAGE, and that is load-bearing rather than
196
251
  // aesthetic. `publishes` binds the edge's SOURCE and `consumes` binds its
197
252
  // TARGET, so a consume edge drawn the other way round — `orderService ->
198
- // kafka.paymentEvents` — binds to nothing at all: the metadata parses, the
199
- // document validates, and the check silently grades zero edges. Producer to
200
- // topic, topic to consumer, every time.
253
+ // kafka.paymentEvents` — binds to nothing at all: the metadata parses and the
254
+ // document validates, and all that says so is `spine.message-unbound` (warn)
255
+ // on the service that drew it. Producer to topic, topic to consumer, every
256
+ // time.
201
257
  marketplace.paymentService -> kafka.paymentEvents 'Publishes PaymentAuthorized' {
202
258
  #obl-outbox
203
259
  metadata {
@@ -0,0 +1,70 @@
1
+ // generated by loam — one overview view per service under services/, drawn from the fleet map.
2
+ // Do not edit: `loam subsystem sync` regenerates this file from the directories and the map,
3
+ // and `loam validate --all` reports `subsystem.views-stale` when it drifts.
4
+ // A navigation aid, not the fleet's architecture: author your own diagrams elsewhere.
5
+
6
+ views {
7
+ view service_checkout_2dweb of marketplace.checkoutWeb {
8
+ title 'checkout-web'
9
+ include *
10
+ include customer
11
+ include marketplace.orderService
12
+ include marketplace.paymentService
13
+ exclude * -> *
14
+ include -> marketplace.checkoutWeb
15
+ include marketplace.checkoutWeb ->
16
+ include marketplace.checkoutWeb.* -> marketplace.checkoutWeb.*
17
+ }
18
+
19
+ view service_identity_2dservice of marketplace.identityService {
20
+ title 'Platform / identity-service'
21
+ include *
22
+ include marketplace.orderService
23
+ include marketplace.paymentService
24
+ exclude * -> *
25
+ include -> marketplace.identityService
26
+ include marketplace.identityService ->
27
+ include marketplace.identityService.* -> marketplace.identityService.*
28
+ }
29
+
30
+ view service_notification_2dservice of marketplace.notificationService {
31
+ title 'Platform / notification-service'
32
+ include *
33
+ include kafka.crmEvents
34
+ include kafka.orderEvents
35
+ include kafka.paymentEvents
36
+ include notificationProvider
37
+ exclude * -> *
38
+ include -> marketplace.notificationService
39
+ include marketplace.notificationService ->
40
+ include marketplace.notificationService.* -> marketplace.notificationService.*
41
+ }
42
+
43
+ view service_order_2dservice of marketplace.orderService {
44
+ title 'order-service'
45
+ include *
46
+ include kafka.orderEvents
47
+ include kafka.paymentEvents
48
+ include marketplace.checkoutWeb
49
+ include marketplace.identityService
50
+ include marketplace.paymentService
51
+ exclude * -> *
52
+ include -> marketplace.orderService
53
+ include marketplace.orderService ->
54
+ include marketplace.orderService.* -> marketplace.orderService.*
55
+ }
56
+
57
+ view service_payment_2dservice of marketplace.paymentService {
58
+ title 'payment-service'
59
+ include *
60
+ include kafka.paymentEvents
61
+ include marketplace.checkoutWeb
62
+ include marketplace.identityService
63
+ include marketplace.orderService
64
+ include stripe
65
+ exclude * -> *
66
+ include -> marketplace.paymentService
67
+ include marketplace.paymentService ->
68
+ include marketplace.paymentService.* -> marketplace.paymentService.*
69
+ }
70
+ }
@@ -1,11 +1,18 @@
1
1
  // generated by loam — the subsystem tree under services/, one view per subsystem.
2
2
  // Do not edit: `loam subsystem sync` regenerates this file from the directories,
3
3
  // and `loam validate --all` reports `subsystem.views-stale` when it drifts.
4
+ // A scoping aid, not the fleet's architecture: author your own diagrams elsewhere.
4
5
 
5
6
  views {
6
7
  // services/platform
8
+ // model: no boundary — marketplace also holds services outside this subsystem.
7
9
  view subsystem_platform {
10
+ title 'Platform'
11
+ description 'Cross-cutting identity and messaging'
8
12
  include marketplace.identityService
9
13
  include marketplace.notificationService
14
+
15
+ include marketplace.identityService -> *, * -> marketplace.identityService
16
+ include marketplace.notificationService -> *, * -> marketplace.notificationService
10
17
  }
11
18
  }
@@ -1,8 +1,10 @@
1
1
  // A fleet use case: the ordered hops that fulfil one business capability.
2
2
  //
3
3
  // This file is the whole shape of the axis. A `dynamic view` tagged
4
- // `#cap-<slug>` opts in to grading; an untagged one is somebody's hand-drawn
5
- // diagram and loam never says a word about it. The slug is the capability id
4
+ // `#cap-<slug>` opts in to grading — so does one tagged only `#req-` or only
5
+ // `#suite-<name>`, the suite a journey runs with (`loam list suites`); an
6
+ // untagged one is somebody's hand-drawn diagram and loam never says a word
7
+ // about it. The slug is the capability id
6
8
  // from architecture/capabilities.yaml with every `/` flattened to `-`, because
7
9
  // a LikeC4 tag name cannot carry a slash — `identity/tokens` would be
8
10
  // `#cap-identity-tokens`.
@@ -14,7 +16,10 @@
14
16
  // read as ONE LikeC4 project, so the steps below resolve against the landscape's
15
17
  // elements even though this file declares none — which also means exactly one
16
18
  // file in this directory declares the `specification` block, and it is not this
17
- // one.
19
+ // one. (The renderer's root project is WIDER than what loam grades here: it also
20
+ // holds every `services/<svc>/model.likec4`, because each of them extends the
21
+ // map. A tag declared twice across that whole set is `c4.fleet-project-invalid`,
22
+ // which is why a tag belongs in the landscape's one block.)
18
23
  //
19
24
  // THE TAG MUST BE THE FIRST THING IN THE VIEW BODY. Written after `title` it is
20
25
  // five parse errors, none of which mentions tags. That is the mistake every
@@ -30,7 +35,7 @@
30
35
  // `usecase.step-unlinked` is met except the one that matters, which is that a
31
36
  // person is not a caller. Somebody clicking a button owes no operationId. Delete
32
37
  // that exemption from the checker and this file is what notices: the example
33
- // fleet's warning count moves from eight to nine and test/examples.test.ts
38
+ // fleet's warning count moves from ten to eleven and test/examples.test.ts
34
39
  // fails.
35
40
  //
36
41
  // The hop from checkout-web to order-service is DELIBERATELY NOT DRAWN, and its
@@ -38,14 +43,18 @@
38
43
  // edges for that pair — `Calls createOrder` and `Calls getOrder` — so a step
39
44
  // between those two elements names two operations, and loam refuses to guess
40
45
  // which one the flow exercises: `usecase.step-contested` (warn), listing both
41
- // candidates. That is the check working. The two fixes are the ones the message
42
- // offers: draw the hop between elements that name exactly one operation, or give
43
- // the candidates one operation between them.
46
+ // candidates. That is the check working. The fix is the one the message offers
47
+ // first: say which operation the hop means by opening the step's title with it,
48
+ // then punctuation — `marketplace.checkoutWeb -> marketplace.orderService
49
+ // 'createOrder — creates the order'` — and loam attributes the hop to that edge.
50
+ // (The other fix is to give the candidates one operation between them.)
44
51
 
45
52
  views {
46
53
  dynamic view uc_order_notification {
47
54
  #cap-order-notifications
48
55
  #req-NOTIFY-ONCE
56
+ #suite-smoke
57
+ #suite-notifications
49
58
  title 'Order notification'
50
59
  description 'A placed order reaches the customer as exactly one confirmation'
51
60
 
@@ -1,14 +1,17 @@
1
1
  # The event-contract delta: what FEAT-101 changes about the messages
2
2
  # payment-service puts on the bus.
3
3
  #
4
- # Like the openapi delta, this is a COMPLETE AsyncAPI 3.0 document, not a
5
- # patch: the living contract is restated around the one change. Identity is
6
- # the slot — `channels.<key>`, `operations.<key>`, `components.messages.<key>`
7
- # — and `x-loam-based-on` (written by `loam rebase`, never by hand) is what
8
- # lets the merge tell a restated slot from an edited one: a pinned QUOTE is
9
- # never a merge input, so a change that lands on the living contract after
10
- # this delta was written survives the archive. The new slots below carry no
11
- # pin — there is no living version for them to be based on.
4
+ # A delta needs only the slots it adds, changes or removes — the merge leaves
5
+ # every slot it does not declare exactly as the living contract has it. This
6
+ # one restates the living contract around the change ON PURPOSE, to show what
7
+ # a pin does with a restatement: identity is the slot — `channels.<key>`,
8
+ # `operations.<key>`, `components.messages.<key>` — and `x-loam-based-on`
9
+ # (written by `loam rebase`, never by hand) is what lets the merge tell a
10
+ # restated slot from an edited one: a pinned QUOTE is never a merge input, so
11
+ # a change that lands on the living contract after this delta was written
12
+ # survives the archive. Outside a demonstration, leave quotes out: each one
13
+ # is a pin, and a parallel feature's removal turns it into an error. The new
14
+ # slots below carry no pin — there is no living version for them to be based on.
12
15
  asyncapi: 3.0.0
13
16
  info:
14
17
  title: payment-service events
@@ -1,12 +1,12 @@
1
1
  # API delta for FEAT-101 — payment-split-service (new) gains the split API.
2
2
  # On `loam archive` this folds into services/payment-split-service/openapi.yaml (living).
3
3
  #
4
- # A feature contract is a COMPLETE document, not a patch: the author restates the living
5
- # contract around the slot being changed, and the merge upserts every operation the document
6
- # spells. Both operations here are new, so neither carries an `x-loam-based-on` pin — there is
7
- # no living operation for a pin to be the digest of. On a service that already exists, every
8
- # quoted operation carries one, written by `loam rebase`, and an unpinned restatement is exactly
9
- # the shape that silently reverts whoever landed in between.
4
+ # A feature contract holds only what the feature adds, changes or removes, and the merge upserts
5
+ # every operation it spells. Both operations here are new, like the service, so neither carries
6
+ # an `x-loam-based-on` pin — there is no living operation for a pin to be the digest of. On a
7
+ # service that already exists, an operation the delta edits carries one, written by `loam
8
+ # rebase`; one it would only quote belongs out of the delta, because a restatement is exactly
9
+ # the shape that silently reverts whoever landed in between unless something pins it.
10
10
  openapi: 3.1.0
11
11
  info:
12
12
  title: payment-split-service
@@ -17,10 +17,13 @@
17
17
  # Removal markers carry no baseline pin, unlike the operations a feature edits:
18
18
  # `openapi.remove-target-mismatch` already checks that exact slot, which is the same question a
19
19
  # pin would answer.
20
+ #
21
+ # `info` restates the living contract's. No merge carries `info`, so a value that differs here
22
+ # would be lost at archive — `openapi.info-not-merged` says so in the plan instead of letting it vanish.
20
23
  openapi: 3.1.0
21
24
  info:
22
25
  title: order-service
23
- version: "1.0"
26
+ version: "2.0"
24
27
  paths:
25
28
  /v1/orders:
26
29
  post:
@@ -1,11 +1,12 @@
1
1
  # API delta for FEAT-088 — payment-service gains the refund operation.
2
2
  #
3
- # A feature contract is a COMPLETE document, not a patch, and the merge upserts every operation
4
- # it spells. This one adds an operation that does not exist living, so it carries no
5
- # `x-loam-based-on` pin: a pin is the digest of the LIVING operation, and there is none.
6
- # Restated operations are the ones that need pins — on a service with thirty operations a delta
7
- # quotes twenty-nine of them, and every unpinned quote is a candidate rollback of whoever landed
8
- # in between. `loam rebase` writes them.
3
+ # A feature contract holds only what the feature adds, changes or removes. The merge walks only
4
+ # the paths and methods this document spells, so authorizePayment and capturePayment, which it
5
+ # leaves out, stay exactly as the living contract has them. refundPayment is new, so it carries
6
+ # no `x-loam-based-on` pin: a pin is the digest of the LIVING operation, and there is none. Only
7
+ # an operation the living contract already holds needs one (`loam rebase` writes it), and every
8
+ # such operation quoted without being changed is one more pin and a collision waiting for a
9
+ # parallel feature to edit or remove it.
9
10
  openapi: 3.1.0
10
11
  info:
11
12
  title: payment-service
@@ -51,10 +52,12 @@ components:
51
52
  refundedAt:
52
53
  type: string
53
54
  format: date-time
54
- # Quoted from the living contract unchanged. The merge leaves a component the living
55
- # document already holds IDENTICALLY alone; one it holds DIFFERENTLY is overwritten
56
- # wholesale and reported as `openapi.component-modified`, because components carry no
57
- # baseline pin the way operations do.
55
+ # Quoted from the living contract unchanged, and it did not need to be: the `$ref` to it
56
+ # above resolves into the living document, which already holds Problem. The merge leaves a
57
+ # component the living document holds IDENTICALLY alone; one it holds DIFFERENTLY is
58
+ # overwritten wholesale and reported as `openapi.component-modified`. Components carried no
59
+ # baseline pin when this feature archived; a quote like this one now needs one in the root
60
+ # `x-loam-baselines` record `loam rebase` writes — one more reason to leave it out.
58
61
  Problem:
59
62
  type: object
60
63
  required: [type, title, status]
@@ -3,7 +3,6 @@
3
3
  "title": "Fleet landscape",
4
4
  "exclude": [
5
5
  "**/node_modules/**",
6
- "services/**",
7
6
  "features/**"
8
7
  ]
9
8
  }
@@ -1,27 +1,24 @@
1
- // Per-service C4 for a UI service. A UI is a first-class C4 system: it has
2
- // containers, it has runtime dependencies, and its pages (ui/pages/*.page.yaml)
3
- // hang off the operations the edges below name.
1
+ // checkout-web's own C4 — what is INSIDE the element the fleet map binds to
2
+ // services/checkout-web/. A UI is a first-class C4 system: it has containers, it
3
+ // has runtime dependencies, and its pages (ui/pages/*.page.yaml) hang off the
4
+ // operations the edges below name.
4
5
  //
5
- // Every .likec4 file is parsed ON ITS OWN — loam never concatenates them — so
6
- // this document declares the kinds it uses even though architecture/landscape.likec4
7
- // declares the same ones. Leaving them out here does not inherit, it fails to parse
8
- // (`c4.invalid`, an error), and the spec/API joins that read the model go quiet with it.
9
- specification {
10
- element softwareSystem
11
- element container
12
- element person
13
- }
14
-
6
+ // An EXTENDING model: no `specification` block, no partner copies. The kinds and
7
+ // every element this file points at — `customer`, `marketplace.orderService`,
8
+ // `marketplace.paymentService` — are declared once in
9
+ // architecture/landscape.likec4, and the root `likec4.config.json` does not
10
+ // exclude `services/**`, so the map and every model are read as ONE LikeC4
11
+ // project. `extend` takes the fully-qualified id, because the element is nested
12
+ // in the `marketplace` group.
13
+ //
14
+ // Note what this file does NOT do: it does not declare `customer = person`. The
15
+ // actor is the map's, and the edge below simply points at it. That is the rule
16
+ // the shape turns on — an element declared here outside
17
+ // `marketplace.checkoutWeb` is `c4.element-unowned` — and it is also what stops
18
+ // two documents from holding two different descriptions of the same person.
19
+ // SCHEMA.md, "Two shapes of a service model", has the other shape.
15
20
  model {
16
- // The actor belongs in a UI's own model in a way it does not in a backend's:
17
- // the pages exist for this person, and the flows in ui/pages/ start at them.
18
- // The landscape draws the same customer -> checkout-web edge at fleet scale;
19
- // a person is exempt from the service/directory cross-check either way.
20
- customer = person 'Customer'
21
-
22
- checkoutWeb = softwareSystem 'checkout-web' {
23
- description 'Customer-facing checkout UI'
24
-
21
+ extend marketplace.checkoutWeb {
25
22
  spa = container 'spa' {
26
23
  description 'Checkout SPA — cart, payment and order status pages'
27
24
  technology 'React'
@@ -37,37 +34,21 @@ model {
37
34
  technology 'Node.js'
38
35
  }
39
36
 
40
- customer -> spa 'Buys'
41
37
  spa -> bff 'Calls the checkout BFF'
42
38
  }
43
39
 
44
- // The services this one actually calls. A service model carries everything the
45
- // service touches, cross-boundary included, drawn with the edge the service
46
- // really has — the landscape carries only the boundary crossing (checkout-web ->
47
- // order-service), while the edge below says WHICH container makes the call.
48
- // Without these three edges this file would be two boxes and a hop, and
49
- // `c4.no-relationships` would be right to say a model that reaches nothing is
50
- // almost never true.
51
- orderService = softwareSystem 'order-service' {
52
- description 'Owns the order lifecycle'
53
- // Bind rather than rely on the title. A renamed box silently stops matching
54
- // its directory everywhere the two are joined — in the landscape that costs
55
- // `landscape.binding-unknown` (error) when the id is wrong, and here it is
56
- // what `health.dependency-unmodelled` resolves a declared dependency
57
- // through in the services that have a health.yaml. checkout-web has none:
58
- // a UI is nobody's runtime dependency, so it declares no SLIs, no alerts
59
- // and no dependency graph, and owes no arch.spec.md to cover them.
60
- metadata {
61
- service 'order-service'
62
- }
63
- }
64
- paymentService = softwareSystem 'payment-service' {
65
- description 'Owns payment authorization/capture'
66
- metadata {
67
- service 'payment-service'
68
- }
69
- }
40
+ // The person is the MAP's element and the hop into this UI is drawn from it.
41
+ // The landscape draws the coarser `customer -> marketplace.checkoutWeb` twin
42
+ // at fleet scale; this one says which container the click reaches. A person is
43
+ // exempt from the service/directory cross-check either way.
44
+ customer -> marketplace.checkoutWeb.spa 'Buys'
70
45
 
46
+ // The services this one actually calls, drawn with the edge the service really
47
+ // has — the landscape carries only the boundary crossing (checkout-web ->
48
+ // order-service), while the edges below say WHICH container makes the call.
49
+ // Without them this file would be two boxes and a hop, and `c4.no-relationships`
50
+ // would be right to say a model that reaches nothing is almost never true.
51
+ //
71
52
  // `metadata { op }` is the C4 half of the operation join: the exact
72
53
  // operationId order-service's openapi.yaml declares. What `loam validate`
73
54
  // grades is the LANDSCAPE's twin of each edge below — `spine.op-undefined`
@@ -77,12 +58,12 @@ model {
77
58
  // nothing would catch it if they did. Two calls to one service are two edges,
78
59
  // not one edge with a list — a view has to be able to show that the status
79
60
  // page and the checkout page stand on different operations.
80
- checkoutWeb.bff -> orderService 'Calls createOrder' {
61
+ marketplace.checkoutWeb.bff -> marketplace.orderService 'Calls createOrder' {
81
62
  metadata {
82
63
  op 'createOrder'
83
64
  }
84
65
  }
85
- checkoutWeb.bff -> orderService 'Calls getOrder' {
66
+ marketplace.checkoutWeb.bff -> marketplace.orderService 'Calls getOrder' {
86
67
  metadata {
87
68
  op 'getOrder'
88
69
  }
@@ -94,16 +75,18 @@ model {
94
75
  // for an edge that SAYS it calls something and names no operation, so nothing
95
76
  // can check the call still exists. Free here and one warning there, which is
96
77
  // the asymmetry worth knowing: the fleet map is what the spine reads.
97
- checkoutWeb.spa -> paymentService 'Calls the payment API'
78
+ marketplace.checkoutWeb.spa -> marketplace.paymentService 'Calls the payment API'
98
79
  }
99
80
 
100
81
  // Views are the LikeC4 renderer's, never loam's — no check reads this block.
101
- // Scoped to the system so the page answers "what does the checkout UI stand on"
102
- // rather than redrawing the fleet, which architecture/landscape.likec4 already does.
82
+ // Scoped to the service's element so the page answers "what does the checkout UI
83
+ // stand on" rather than redrawing the fleet, which architecture/landscape.likec4
84
+ // already does. This file is part of the root project: `npx likec4 start` at the
85
+ // docs root draws it, with no per-service project file to write.
103
86
  views {
104
- view checkout_web of checkoutWeb {
87
+ view checkout_web of marketplace.checkoutWeb {
105
88
  title 'checkout-web — containers and the services they call'
106
89
  include *
107
- include orderService, paymentService
90
+ include marketplace.orderService, marketplace.paymentService
108
91
  }
109
92
  }