@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,323 @@
1
+ /**
2
+ * The two post-build workflows, paired: the done-check (`loam-verify`) and the
3
+ * merge it precedes (`loam-ship`). One file for two commands because six
4
+ * workflows meet the five-file package cap somewhere, and this is the seam the
5
+ * cycle already has — both describe what happens after the code is built, and
6
+ * each body names the other's refusals (`record-federated`, `not-coherent`).
7
+ */
8
+ export const LOAM_VERIFY = {
9
+ name: "loam-verify",
10
+ description: "Verify a built loam feature against its own promises, claim by claim, with evidence",
11
+ argumentHint: "<FEAT-id>",
12
+ purpose: "Check that the code somebody built is the feature that was designed. loam derives the questions; a test runner and you answer them. loam never reads the service, so a verdict is worth exactly what its evidence is worth.",
13
+ invocation: "loam instructions loam-verify $1",
14
+ placeholders: ["feature"],
15
+ spine: [
16
+ "`loam verify` — the checklist, derived from the feature's own artifacts",
17
+ "run the generated suite with a JSON report: the scenario claims are the runner's to answer, not yours",
18
+ "answer the remaining claims yourself, every one carrying a `file:line` that resolves",
19
+ "record from each affected service's own repository, bound to that service",
20
+ "read the verdict honestly — a scenario confirmed on your word is `attested`, not `verified`",
21
+ ],
22
+ body: `Check that the code somebody just built is the feature that was designed.
23
+
24
+ loam derives the questions; the test runner and you answer them. loam never
25
+ reads the service, so a verdict is worth exactly what its evidence is worth.
26
+
27
+ 1. \`loam verify $1 --json\`. \`claims[]\` is the checklist, derived from the feature's
28
+ own artifacts — one claim per new service, per operation its openapi delta adds,
29
+ per (direction, message) its asyncapi delta newly declares against the living
30
+ contract's send/receive sets (quotes and removals are never questions),
31
+ per tagged edge that names an operation, and per scenario of every changed
32
+ requirement, arch.spec.md deltas included. Each has a stable \`id\` and a
33
+ \`subject\` (the service whose code answers it); a claim that says arch.spec.md
34
+ wants an integration/ops test, not an acceptance test. An ARCHIVED feature returns its record as frozen history instead
35
+ (\`frozen: true\`) and \`--record\` / \`--results\` / \`--contract-results\` /
36
+ \`--diff-answers\` refuse it — \`loam unarchive\` first if the answers really
37
+ must change.
38
+ 2. The \`scenario.tested\` claims are the runner's to answer, not yours. In the
39
+ service's repo, run the generated suite with a JSON report —
40
+ \`npx cucumber-js --format json:report.json\` (cucumber-jvm, behave,
41
+ SpecFlow/Reqnroll, pytest-bdd \`--cucumberjson\` and godog emit the same
42
+ format). The generated scenarios carry \`@loam-digest-…\` tags that ride into
43
+ the report; that digest is the match, and the run must have executed every
44
+ step of the stamped scenario, so never retitle or hand-edit a generated
45
+ scenario to make one pass. A runner with no cucumber formatter answers
46
+ through loam's runner-neutral shape instead, keyed by the same digests:
47
+ \`{"loamScenarioReport": 1, "results": [{"digest": "…", "status": "passed"}]}\`.
48
+ If there is no runnable suite yet you MAY answer them yourself, and the record
49
+ will say so: \`answered_by: agent\` makes the feature **attested**, not verified
50
+ (\`verified: false\`, \`verdict: "attested"\`, the \`verify.scenario-attested\`
51
+ notice, and a \`next.verify-attested\` step in \`loam status\`). Nothing gates on
52
+ it — a legacy service with no suite must still be able to ship — but say so
53
+ when you hand back, and close it with \`--results\` the moment a suite runs.
54
+ \`verify.digest-contested\` (warn) is the case where two services word a
55
+ scenario identically: they share one digest, so no single report can say whose
56
+ suite ran it, and each service must record its own with \`--service\`.
57
+ The \`api.exposes\` claims have a mechanical channel too, when an API
58
+ contract-test suite exists: emit loam's contract-results shape from its
59
+ report — \`{"loamContractReport": 1, "results": [{"operationId": "…",
60
+ "status": "passed"}]}\`, a one-line transform for Specmatic, Pact, Dredd or a
61
+ property harness — and pass \`--contract-results contract.json\` alongside.
62
+ Only a status of exactly \`passed\` confirms the named operation
63
+ (\`answered_by: external-runner\`); anything else, and an operation the report
64
+ never exercised, stays \`unconfirmed\` with the reason, and under the flag the
65
+ report owns every api.exposes claim, so take those out of the answers file.
66
+ 3. Answer every OTHER claim by finding it in the code. Not by reasoning that it
67
+ must be there — by opening the file:
68
+ - \`service.exists\` — the service is deployable: its build, its entry point.
69
+ - \`api.exposes\` — the route handler serving that operationId, not the spec that
70
+ declares it — unless a contract-test report already answered it in step 2.
71
+ - \`event.declares\` — the code that puts the message on the wire (sends) or
72
+ handles it off the wire (receives), not the contract that names it.
73
+ - \`c4.calls\` — the call site in the CALLER.
74
+ 4. Write those answers as JSON — evidence is \`file:line\`, one entry per place it can
75
+ be seen:
76
+ \`\`\`json
77
+ { "answers": [
78
+ { "id": "<claim id>", "verdict": "confirmed", "evidence": ["src/split/Api.ts:42"] },
79
+ { "id": "<claim id>", "verdict": "unconfirmed", "note": "the split service has no entry point yet" }
80
+ ] }
81
+ \`\`\`
82
+ 5. Optional, before recording: cross-examine. Have a SECOND agent answer the
83
+ same checklist blind — a fresh context, given only \`loam verify $1 --json\`
84
+ and the code, never your answers file — then compare the two sets:
85
+
86
+ \`\`\`sh
87
+ loam verify $1 --diff-answers yours.json theirs.json --json
88
+ \`\`\`
89
+
90
+ Both files must answer EVERY claim in the compared scope,
91
+ \`scenario.tested\` included: the diff consults no test report, so this is a
92
+ DIFFERENT file from the one step 6 records under \`--results\` (that one
93
+ must omit the runner's claims; a step-6-shaped file here refuses
94
+ \`answers-mismatch\`). Narrowing with \`--service <id>\` compares one
95
+ service's claims — give the second agent the same lens, or its file will
96
+ not match the compared scope. An archived feature refuses the diff too:
97
+ frozen history has no current checklist. It writes nothing and changes no
98
+ verdict: \`cross.agree-confirmed\` / \`cross.agree-unconfirmed\` rows are the
99
+ cheap-to-skip queue, \`disagreements[]\` (\`cross.disagree\`) is what a human
100
+ reads first, and the \`cross.evidence-disjoint\` notice flags agreements
101
+ citing non-overlapping files — read those second. Agreement between two
102
+ same-model agents is correlated, so it ranks review; it never upgrades
103
+ \`attested\` to \`verified\`. Record only the answer set you stand behind, in
104
+ a separate run.
105
+ 6. Record, **in each affected service's own repository**, one service at a time:
106
+
107
+ \`\`\`sh
108
+ loam verify $1 --service <id> --results report.json [--contract-results contract.json] --record answers.json --json
109
+ \`\`\`
110
+
111
+ \`--service <id>\` narrows the checklist to that service's claims and binds the
112
+ answers to this repository's commit, writing that service's attestation to
113
+ its OWN file, \`features/$1/verification/<id>.yaml\` — the directory is the
114
+ record, and loam adds the files up when it reads. Running it in the next repo
115
+ writes that repo's file and touches no other, so two teams' docs PRs never
116
+ conflict over the record. In a repo whose ./loam.json
117
+ declares a \`service\`, \`--service\` may be omitted — it is substituted, and the
118
+ run still federates. \`--results report.json\` alone is legal when the
119
+ checklist is all scenarios.
120
+
121
+ ⚠ **Never run \`loam verify $1 --record answers.json\` without \`--service\`.**
122
+ That is the legacy all-at-once form: it writes the WHOLE record from one place,
123
+ into the one file \`verification.yaml\`, and over a record that already carries
124
+ other services' attestations it is refused (\`record-federated\`, naming them)
125
+ precisely because it would put one unattested answer set over them. If you
126
+ meet that refusal, re-run with \`--service\`; do not work around it.
127
+
128
+ The other refusals: \`answers-mismatch\` (an id
129
+ nobody asked about, a claim you left out — re-run step 1, the feature moved —
130
+ or an answers entry for a \`scenario.tested\` claim: the runner owns those),
131
+ \`answers-unevidenced\` (a \`confirmed\` with nothing behind it),
132
+ \`answers-unreadable\` (a report or answers file it cannot read),
133
+ \`record-unreadable\` (a record file that exists but cannot be read — broken
134
+ YAML, git conflict markers a merge left, or \`verify.record-miscounted\` when
135
+ its \`summary\` block contradicts its own \`claims[]\`. It is never overwritten,
136
+ and the message names the file and the safe repair: a service's own
137
+ \`verification/<id>.yaml\` holds only that service's word, so that service
138
+ may delete it and record again; the one-file \`verification.yaml\` may hold
139
+ other services' attestations, so it is repaired or restored from version
140
+ control — after a merge, the copy on the branch you merged into — and
141
+ **never deleted**. Never edit the counts to make them agree),
142
+ \`service-mismatch\` (\`--service\` names a service this repo does not declare) and
143
+ \`repository-unavailable\` (\`--service\` from a repo that declares none, or whose
144
+ commit cannot be read — an attestation must be bound to the code it is about).
145
+ 7. Report every \`unconfirmed\` claim and what it would take to close it, and read
146
+ \`discarded\` in the payload: it names every previous answer the new record does
147
+ not carry, and each one is either evidence that went stale or evidence that was
148
+ just dropped. A scenario claim the report failed or missed closes by fixing the
149
+ code and re-running the suite — never by editing the generated .feature. While
150
+ any claim stays unconfirmed or unanswered, \`notices[]\` carries
151
+ \`verify.claims-open\` (warn, gating nothing): the one-line "not a clean
152
+ result" summary with all four counts, so a partial record can never read as a
153
+ finished one from the notice lines alone.
154
+ 8. Reading is safe from anywhere: \`loam verify $1 --service <id> --json\` without
155
+ \`--record\` writes nothing and works from the docs repo too. \`services\` lists
156
+ every subject of the checklist, so it is how you find out which repos still
157
+ owe an attestation, and \`loam status $1 --json\` says the same thing in the
158
+ shape of a next step.
159
+
160
+ Anything you cannot show is \`unconfirmed\` with a note. That is a successful record,
161
+ and it is the useful one: nothing gates on this file, so the only thing it is for is
162
+ telling the next reader the truth. \`loam archive\` will ship the feature either way —
163
+ which is exactly why a \`confirmed\` you cannot back up costs nothing now and misleads
164
+ everyone later.
165
+
166
+ \`loam verify\` — the notice and record codes its reports carry in \`notices[]\`,
167
+ gathered from the steps above; branch on the code, never the prose:
168
+
169
+ | code | what it means | what to do |
170
+ |---|---|---|
171
+ | \`verify.claims-open\` (warn) | a recorded feature still has unconfirmed or unanswered claims — the one-line "not a clean result" summary with all four counts, so a partial record can never read as finished from the notice lines alone; a feature with no record at all never carries it | close each open claim: fix the code and re-run the suite for a failed scenario, re-answer the rest with evidence, then re-record |
172
+ | \`verify.scenario-attested\` (warn) | scenario claims were answered on an agent's word (\`answered_by: agent\`), so the verdict is **attested**, not verified — nothing gates on it, but say so when you hand back | run the generated suite with a JSON report and re-record with \`--results report.json\` the moment a suite exists |
173
+ | \`verify.digest-contested\` (warn) | two or more services word a scenario identically, so they share one \`@loam-digest-…\` tag and no single cucumber report can say whose suite ran it — those scenario claims stay unconfirmed | each service records its own claims from its own repository with \`--service <id>\` |
174
+ | \`verify.operation-contested\` (warn) | two services on the checklist expose the same operationId, so a contract report — which names no service — cannot say whose suite exercised it; those claims stay unconfirmed | each service records its own with \`--service <id>\`, passing its own contract report |
175
+ | \`verify.checklist-forked\` (warn) | one or more services answered a DIFFERENT version of the feature's question set than the one it now asks — each attestation carries the \`checklist\` digest it answered, and the notice names the ones that do not match the current checklist. Measured against the present, not pairwise: services that all attested against a since-rewritten delta agree with each other perfectly and are all stale. Normal mid-rollout, since services attest as they finish. Attestations written before the field existed carry no digest and are never called stale. In a per-service record the answers of the services named do not count until they record again | re-record the services on the older version from their own repositories (\`loam verify <FEAT> --service <id> --record\`) — nothing gates on it |
176
+ | \`verify.record-miscounted\` (error) | a record file whose \`summary\` block contradicts its own \`claims[]\` — neither half can be believed, so the record is refused as unreadable rather than trusted in either direction | a service's own \`verification/<id>.yaml\`: delete it and re-record from that service's repo; the one-file \`verification.yaml\`: restore it from version control, then re-record — never delete it, and never edit the counts by hand |
177
+ | \`verify.evidence-token-missing\` (warn) | a just-confirmed citation's file at the attested commit does not contain the claim's own token (the operationId, message name or edge op) — the evidence may not show what the answer says | re-read that evidence while the answer can still be corrected; verdict-neutral, it gates nothing |
178
+ | \`cross.agree-confirmed\` / \`cross.agree-unconfirmed\` (ok) | a \`--diff-answers\` row where both blind answer sets reach the same verdict — the cheap-to-skip review queue, though same-model agreement is correlated and proves nothing | nothing on its own; record only the answer set you stand behind, in a separate run |
179
+ | \`cross.disagree\` (the rows a human reads first) | a \`--diff-answers\` row where the two blind answer sets contradict each other — one of them is wrong about the code | read both cited evidences and decide; the diff writes nothing and never moves a verdict |
180
+ | \`cross.evidence-disjoint\` (warn) | a \`--diff-answers\` notice: claims BOTH sets confirm while citing non-overlapping files — two yeses that looked at different evidence | read those agreements second, after the disagreements; agreement over disjoint evidence is two guesses, not one proof |
181
+ `,
182
+ };
183
+ export const LOAM_SHIP = {
184
+ name: "loam-ship",
185
+ description: "Archive a finished loam feature — merge its deltas into the living docs",
186
+ argumentHint: "<FEAT-id>",
187
+ purpose: "Merge a shipped feature into the living specs, API and landscape. This is the one command that rewrites the source of truth, so every step before it exists to make the merge reviewable before it runs.",
188
+ invocation: "loam instructions loam-ship $1",
189
+ placeholders: ["feature"],
190
+ spine: [
191
+ "confirm the code is actually built and merged — archiving early makes the docs claim something that does not exist",
192
+ "`loam validate --feature $1` must come back valid; if it says nothing pinned the delta, rebase and re-validate first",
193
+ "`loam archive $1 --dry-run` — read the whole plan and every warning before the merge touches anything",
194
+ "`loam archive $1` for real, and read what it reports it did",
195
+ "every vouched spec on `revouchOwed[]` owes its owner's re-vouch — tell them; it lands in this same PR",
196
+ "`loam unarchive $1` is the undo if the plan turns out to have been wrong",
197
+ ],
198
+ body: `Archive a shipped feature.
199
+
200
+ 1. Confirm the code is actually built and merged. Archiving folds the delta into the
201
+ living docs; doing it early makes the docs claim something that does not exist.
202
+ \`loam status $1 --json\` answers "is this actually finished" in one call, and its
203
+ \`next[]\` names what is outstanding if it is not.
204
+ 2. \`loam validate --feature $1 --json\` — must come back \`valid: true\`.
205
+ If it reports \`delta.baseline-missing\` or \`openapi.baseline-missing\`, run
206
+ \`loam rebase $1\` and re-validate BEFORE going on: those two say nothing has
207
+ pinned what this delta was written against, so the merge cannot tell the text
208
+ you EDITED from the text you merely restated. Both gate the archive — the
209
+ dry run in step 3 refuses on them too — and the only way past without the
210
+ pins is a human's \`--approve\`.
211
+ 3. \`loam archive $1 --dry-run --json\` first. \`plan[]\` is every file the merge would
212
+ write (\`create\` / \`update\`, then the final \`move\` into \`features/archive/\`) —
213
+ including an \`update\` for each of the feature's own documents whose links the
214
+ move re-expresses, at its path before the move, and for each document outside
215
+ the feature (another feature in flight, a living ADR) whose links into it the
216
+ archive rewrites — and none of them are written —
217
+ read it before letting the merge touch the source of truth, and stop if a file
218
+ you did not expect is on it. \`warnings[]\` is what the
219
+ merge will do that is legal but lossy — advisory warnings never block, which is
220
+ exactly why you read them now: \`openapi.op-modified\` means an operation the living
221
+ contract already defines gets overwritten wholesale, and its \`details\` name the
222
+ current consumers that overwrite lands on (\`asyncapi.message-modified\` likewise for
223
+ a message; \`openapi.component-modified\` is the same story for a component the
224
+ merged operations carry, with no consumer list),
225
+ \`service.no-model\` means a service arrives on the map with no directory behind it
226
+ (an error, the one \`validate --all\` will report until \`loam adopt\` writes its
227
+ documents — it never blocks the merge, and the run prints it instead of claiming
228
+ the docs complete; a service whose directory the archive creates and the map
229
+ draws gets an empty extending model instead, and raises nothing), and
230
+ \`delta.added-conflict\`
231
+ means another feature in flight adds the same requirement — the first to archive
232
+ lands it, and the other's archive is then refused (\`delta.added-duplicate\`: its
233
+ ADDED now collides with the living spec) unless a human \`--approve\`s the
234
+ replacement. \`dropped[]\` is what each MODIFIED or REMOVED requirement takes OUT
235
+ of a living document — the scenarios and the \`Covers:\` / \`Operations:\` / … entries
236
+ its new text does not restate. None of it is a warning, and all of it is gone
237
+ after the merge: restate in the delta anything that must survive, then re-run.
238
+ The plan also prints one note per document the merge CREATES, saying whether
239
+ the delta's title and \`## Purpose\` came across. A created document with no
240
+ purpose arrives with no narrative at all. And read what lands verbatim — the
241
+ requirement bodies, scenarios and contract descriptions — for review-time
242
+ wording such as "this delta" or "this feature": in a living document it points
243
+ at a change nobody will remember. Fix both in the delta before the merge
244
+ (\`loam instructions loam-authoring\`, "Writing for a person").
245
+ 4. \`loam archive $1 --json\`. It merges three axes into the living state — requirements
246
+ into \`services/<svc>/spec.md\`, endpoints into \`services/<svc>/openapi.yaml\`,
247
+ elements and edges into \`architecture/landscape.likec4\` and, for an addition nested
248
+ under a service whose model EXTENDS the map, into that
249
+ \`services/<…>/<svc>/model.likec4\` instead — a service the archive creates and
250
+ the merged map draws gets that model too, written empty at \`services/<svc>/model.likec4\` and holding
251
+ whatever the delta drew inside the service; it lands unfiled, and
252
+ \`loam subsystem move <svc> --into <subsystem>\` files it — then moves the feature
253
+ under \`features/archive/\`, whole: its verification record travels with it,
254
+ the per-service \`verification/<id>.yaml\` files and any one-file
255
+ \`verification.yaml\` alike, and \`loam verify $1\` reads it back afterwards as
256
+ frozen history. Verification never gates the archive — an open or missing
257
+ record ships as exactly that. Success is \`ok: true\`; on \`ok: false\`, branch on
258
+ \`error.code\`:
259
+ - \`not-coherent\` — gating coherence issues; \`issues[]\` in the envelope lists them,
260
+ each with \`gates\` and \`overridable\` resolved (advisory warnings do not block).
261
+ Fix the breaches. \`--approve\` overrides the gating issues and is a human's
262
+ call to make, not yours: report the breach and stop. Two codes it does not
263
+ override even then — \`delta.service-id-invalid\` (a \`specs/<svc>/\` name the
264
+ id grammar refuses) and \`c4.service-binding-invalid\` (a \`metadata { service }\`
265
+ binding it refuses, anywhere inside a tagged element's block): each names a
266
+ path the merge would write mechanically, they arrive with
267
+ \`overridable: false\`, and the fix is a rename, never the flag.
268
+ \`openapi.remove-marker-path-level\` arrives
269
+ here too: an \`x-loam-remove\` written beside the methods instead of inside the
270
+ operation retires nothing. So do \`openapi.op-revived\` and
271
+ \`asyncapi.slot-revived\`: the delta spells an operation, slot or message an
272
+ ARCHIVED feature retired, and the merge would put it back. If the delta only
273
+ quoted it, delete the quote; whether the feature brings it back on purpose is
274
+ the human's \`--approve\`, and the archive output then names what came back
275
+ and whose retirement it reverses.
276
+ - \`living-outside-requirements\` — the LIVING spec holds a requirement outside
277
+ \`## Requirements\`, and the merge would duplicate it. Re-home it, then re-run.
278
+ \`--approve\` does not move this one.
279
+ - \`archive-exists\` — \`features/archive/\` already has that directory; a human
280
+ decides what it is.
281
+ - \`merge-failed\` — the merge could not be computed, or failed and was rolled
282
+ back. Either way the living docs are unchanged; fix the reported cause, re-run.
283
+ "Could not resolve reference to RelationshipKind" means the delta draws a
284
+ relationship kind (\`-[publishes]->\`) that the living map's \`specification\`
285
+ does not declare: the archive copies the edge and never the declaration.
286
+ Declare the kind in \`architecture/landscape.likec4\` — it is vocabulary, not
287
+ a feature change — then re-run.
288
+ A file loam cannot decode as UTF-8 refuses here by name rather than being
289
+ rewritten with replacement characters. So does a living document that still
290
+ holds git conflict markers — the \`spec.merge-conflict\` /
291
+ \`landscape.merge-conflict\` findings ride in \`findings[]\`, and \`--approve\`
292
+ does not override them: the loss is mechanical, not a judgment call.
293
+ - \`docs-busy\` — another \`loam archive\` or \`loam unarchive\` holds the docs
294
+ repo's lock. Nothing was read or written; wait for it and re-run once.
295
+ - \`commit-interrupted\` — a previous archive or unarchive was killed mid-commit
296
+ and this run cannot repair it on its own: a half-written file was edited
297
+ since, its pre-image is gone or altered, or \`.loam-commit\` cannot be read.
298
+ Run \`loam doctor\` (\`doctor.commit-interrupted\` / \`doctor.commit-unreadable\`
299
+ name the same state) and hand it to a human — re-running does not help.
300
+ - \`rollback-incomplete\` — the merge failed AND some files could not be restored.
301
+ Stop and hand it to a human; the message lists the files to check.
302
+ 5. Re-vouches are owed. \`revouchOwed[]\` — on the dry run and the real merge alike —
303
+ names every VOUCHED spec the merge moves under its vouch stamp, with the
304
+ document's \`owner\`. \`content.stale\` follows on each, and honestly: the merged
305
+ text is words nobody has yet read against the code. You cannot clear it — a
306
+ vouch is a person's, run in that service's own repo (\`loam vouch --service <id>\`,
307
+ after \`loam vouch --pack --service <id>\` for what to re-read). Name the
308
+ documents and owners in your hand-back, and say the re-vouches belong in the
309
+ SAME PR as this archive: a docs repo gated on
310
+ \`loam validate --all --base <ref> --strict\` keeps the archive's PR red until they
311
+ land. Never edit a stamp by hand to turn it green.
312
+
313
+ Archived by mistake? \`loam unarchive $1\` restores the living docs from the snapshot
314
+ archive left in \`features/archive/$1*/.loam-before/\` and re-opens the feature. Do not
315
+ hand-edit the living docs back instead: the previous text of a \`MODIFIED\` requirement
316
+ is in that snapshot and nowhere else, so anything you write by hand is a guess. It
317
+ refuses under \`snapshot-corrupt\` when a pre-image's bytes no longer match the digest
318
+ the archive recorded — \`--force\` does not override that one, because the damage is
319
+ to the undo itself — and under \`snapshot-missing\` for an archive older than the
320
+ current snapshot format. Both mean version control is the way back.
321
+ `,
322
+ };
323
+ //# sourceMappingURL=closing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing.js","sourceRoot":"","sources":["../../../../src/core/agent/workflows/closing.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,qFAAqF;IACvF,YAAY,EAAE,WAAW;IACzB,OAAO,EACL,6NAA6N;IAC/N,UAAU,EAAE,kCAAkC;IAC9C,YAAY,EAAE,CAAC,SAAS,CAAC;IACzB,KAAK,EAAE;QACL,yEAAyE;QACzE,uGAAuG;QACvG,sFAAsF;QACtF,2EAA2E;QAC3E,6FAA6F;KAC9F;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+JP;CACA,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,yEAAyE;IACtF,YAAY,EAAE,WAAW;IACzB,OAAO,EACL,0MAA0M;IAC5M,UAAU,EAAE,gCAAgC;IAC5C,YAAY,EAAE,CAAC,SAAS,CAAC;IACzB,KAAK,EAAE;QACL,oHAAoH;QACpH,sHAAsH;QACtH,uGAAuG;QACvG,6DAA6D;QAC7D,uGAAuG;QACvG,0EAA0E;KAC3E;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2HP;CACA,CAAC","sourcesContent":["import type { CommandContent } from \"../contract.js\";\n\n/**\n * The two post-build workflows, paired: the done-check (`loam-verify`) and the\n * merge it precedes (`loam-ship`). One file for two commands because six\n * workflows meet the five-file package cap somewhere, and this is the seam the\n * cycle already has — both describe what happens after the code is built, and\n * each body names the other's refusals (`record-federated`, `not-coherent`).\n */\nexport const LOAM_VERIFY: CommandContent = {\n name: \"loam-verify\",\n description:\n \"Verify a built loam feature against its own promises, claim by claim, with evidence\",\n argumentHint: \"<FEAT-id>\",\n purpose:\n \"Check that the code somebody built is the feature that was designed. loam derives the questions; a test runner and you answer them. loam never reads the service, so a verdict is worth exactly what its evidence is worth.\",\n invocation: \"loam instructions loam-verify $1\",\n placeholders: [\"feature\"],\n spine: [\n \"`loam verify` — the checklist, derived from the feature's own artifacts\",\n \"run the generated suite with a JSON report: the scenario claims are the runner's to answer, not yours\",\n \"answer the remaining claims yourself, every one carrying a `file:line` that resolves\",\n \"record from each affected service's own repository, bound to that service\",\n \"read the verdict honestly — a scenario confirmed on your word is `attested`, not `verified`\",\n ],\n body: `Check that the code somebody just built is the feature that was designed.\n\nloam derives the questions; the test runner and you answer them. loam never\nreads the service, so a verdict is worth exactly what its evidence is worth.\n\n1. \\`loam verify $1 --json\\`. \\`claims[]\\` is the checklist, derived from the feature's\n own artifacts — one claim per new service, per operation its openapi delta adds,\n per (direction, message) its asyncapi delta newly declares against the living\n contract's send/receive sets (quotes and removals are never questions),\n per tagged edge that names an operation, and per scenario of every changed\n requirement, arch.spec.md deltas included. Each has a stable \\`id\\` and a\n \\`subject\\` (the service whose code answers it); a claim that says arch.spec.md\n wants an integration/ops test, not an acceptance test. An ARCHIVED feature returns its record as frozen history instead\n (\\`frozen: true\\`) and \\`--record\\` / \\`--results\\` / \\`--contract-results\\` /\n \\`--diff-answers\\` refuse it — \\`loam unarchive\\` first if the answers really\n must change.\n2. The \\`scenario.tested\\` claims are the runner's to answer, not yours. In the\n service's repo, run the generated suite with a JSON report —\n \\`npx cucumber-js --format json:report.json\\` (cucumber-jvm, behave,\n SpecFlow/Reqnroll, pytest-bdd \\`--cucumberjson\\` and godog emit the same\n format). The generated scenarios carry \\`@loam-digest-…\\` tags that ride into\n the report; that digest is the match, and the run must have executed every\n step of the stamped scenario, so never retitle or hand-edit a generated\n scenario to make one pass. A runner with no cucumber formatter answers\n through loam's runner-neutral shape instead, keyed by the same digests:\n \\`{\"loamScenarioReport\": 1, \"results\": [{\"digest\": \"…\", \"status\": \"passed\"}]}\\`.\n If there is no runnable suite yet you MAY answer them yourself, and the record\n will say so: \\`answered_by: agent\\` makes the feature **attested**, not verified\n (\\`verified: false\\`, \\`verdict: \"attested\"\\`, the \\`verify.scenario-attested\\`\n notice, and a \\`next.verify-attested\\` step in \\`loam status\\`). Nothing gates on\n it — a legacy service with no suite must still be able to ship — but say so\n when you hand back, and close it with \\`--results\\` the moment a suite runs.\n \\`verify.digest-contested\\` (warn) is the case where two services word a\n scenario identically: they share one digest, so no single report can say whose\n suite ran it, and each service must record its own with \\`--service\\`.\n The \\`api.exposes\\` claims have a mechanical channel too, when an API\n contract-test suite exists: emit loam's contract-results shape from its\n report — \\`{\"loamContractReport\": 1, \"results\": [{\"operationId\": \"…\",\n \"status\": \"passed\"}]}\\`, a one-line transform for Specmatic, Pact, Dredd or a\n property harness — and pass \\`--contract-results contract.json\\` alongside.\n Only a status of exactly \\`passed\\` confirms the named operation\n (\\`answered_by: external-runner\\`); anything else, and an operation the report\n never exercised, stays \\`unconfirmed\\` with the reason, and under the flag the\n report owns every api.exposes claim, so take those out of the answers file.\n3. Answer every OTHER claim by finding it in the code. Not by reasoning that it\n must be there — by opening the file:\n - \\`service.exists\\` — the service is deployable: its build, its entry point.\n - \\`api.exposes\\` — the route handler serving that operationId, not the spec that\n declares it — unless a contract-test report already answered it in step 2.\n - \\`event.declares\\` — the code that puts the message on the wire (sends) or\n handles it off the wire (receives), not the contract that names it.\n - \\`c4.calls\\` — the call site in the CALLER.\n4. Write those answers as JSON — evidence is \\`file:line\\`, one entry per place it can\n be seen:\n \\`\\`\\`json\n { \"answers\": [\n { \"id\": \"<claim id>\", \"verdict\": \"confirmed\", \"evidence\": [\"src/split/Api.ts:42\"] },\n { \"id\": \"<claim id>\", \"verdict\": \"unconfirmed\", \"note\": \"the split service has no entry point yet\" }\n ] }\n \\`\\`\\`\n5. Optional, before recording: cross-examine. Have a SECOND agent answer the\n same checklist blind — a fresh context, given only \\`loam verify $1 --json\\`\n and the code, never your answers file — then compare the two sets:\n\n \\`\\`\\`sh\n loam verify $1 --diff-answers yours.json theirs.json --json\n \\`\\`\\`\n\n Both files must answer EVERY claim in the compared scope,\n \\`scenario.tested\\` included: the diff consults no test report, so this is a\n DIFFERENT file from the one step 6 records under \\`--results\\` (that one\n must omit the runner's claims; a step-6-shaped file here refuses\n \\`answers-mismatch\\`). Narrowing with \\`--service <id>\\` compares one\n service's claims — give the second agent the same lens, or its file will\n not match the compared scope. An archived feature refuses the diff too:\n frozen history has no current checklist. It writes nothing and changes no\n verdict: \\`cross.agree-confirmed\\` / \\`cross.agree-unconfirmed\\` rows are the\n cheap-to-skip queue, \\`disagreements[]\\` (\\`cross.disagree\\`) is what a human\n reads first, and the \\`cross.evidence-disjoint\\` notice flags agreements\n citing non-overlapping files — read those second. Agreement between two\n same-model agents is correlated, so it ranks review; it never upgrades\n \\`attested\\` to \\`verified\\`. Record only the answer set you stand behind, in\n a separate run.\n6. Record, **in each affected service's own repository**, one service at a time:\n\n \\`\\`\\`sh\n loam verify $1 --service <id> --results report.json [--contract-results contract.json] --record answers.json --json\n \\`\\`\\`\n\n \\`--service <id>\\` narrows the checklist to that service's claims and binds the\n answers to this repository's commit, writing that service's attestation to\n its OWN file, \\`features/$1/verification/<id>.yaml\\` — the directory is the\n record, and loam adds the files up when it reads. Running it in the next repo\n writes that repo's file and touches no other, so two teams' docs PRs never\n conflict over the record. In a repo whose ./loam.json\n declares a \\`service\\`, \\`--service\\` may be omitted — it is substituted, and the\n run still federates. \\`--results report.json\\` alone is legal when the\n checklist is all scenarios.\n\n ⚠ **Never run \\`loam verify $1 --record answers.json\\` without \\`--service\\`.**\n That is the legacy all-at-once form: it writes the WHOLE record from one place,\n into the one file \\`verification.yaml\\`, and over a record that already carries\n other services' attestations it is refused (\\`record-federated\\`, naming them)\n precisely because it would put one unattested answer set over them. If you\n meet that refusal, re-run with \\`--service\\`; do not work around it.\n\n The other refusals: \\`answers-mismatch\\` (an id\n nobody asked about, a claim you left out — re-run step 1, the feature moved —\n or an answers entry for a \\`scenario.tested\\` claim: the runner owns those),\n \\`answers-unevidenced\\` (a \\`confirmed\\` with nothing behind it),\n \\`answers-unreadable\\` (a report or answers file it cannot read),\n \\`record-unreadable\\` (a record file that exists but cannot be read — broken\n YAML, git conflict markers a merge left, or \\`verify.record-miscounted\\` when\n its \\`summary\\` block contradicts its own \\`claims[]\\`. It is never overwritten,\n and the message names the file and the safe repair: a service's own\n \\`verification/<id>.yaml\\` holds only that service's word, so that service\n may delete it and record again; the one-file \\`verification.yaml\\` may hold\n other services' attestations, so it is repaired or restored from version\n control — after a merge, the copy on the branch you merged into — and\n **never deleted**. Never edit the counts to make them agree),\n \\`service-mismatch\\` (\\`--service\\` names a service this repo does not declare) and\n \\`repository-unavailable\\` (\\`--service\\` from a repo that declares none, or whose\n commit cannot be read — an attestation must be bound to the code it is about).\n7. Report every \\`unconfirmed\\` claim and what it would take to close it, and read\n \\`discarded\\` in the payload: it names every previous answer the new record does\n not carry, and each one is either evidence that went stale or evidence that was\n just dropped. A scenario claim the report failed or missed closes by fixing the\n code and re-running the suite — never by editing the generated .feature. While\n any claim stays unconfirmed or unanswered, \\`notices[]\\` carries\n \\`verify.claims-open\\` (warn, gating nothing): the one-line \"not a clean\n result\" summary with all four counts, so a partial record can never read as a\n finished one from the notice lines alone.\n8. Reading is safe from anywhere: \\`loam verify $1 --service <id> --json\\` without\n \\`--record\\` writes nothing and works from the docs repo too. \\`services\\` lists\n every subject of the checklist, so it is how you find out which repos still\n owe an attestation, and \\`loam status $1 --json\\` says the same thing in the\n shape of a next step.\n\nAnything you cannot show is \\`unconfirmed\\` with a note. That is a successful record,\nand it is the useful one: nothing gates on this file, so the only thing it is for is\ntelling the next reader the truth. \\`loam archive\\` will ship the feature either way —\nwhich is exactly why a \\`confirmed\\` you cannot back up costs nothing now and misleads\neveryone later.\n\n\\`loam verify\\` — the notice and record codes its reports carry in \\`notices[]\\`,\ngathered from the steps above; branch on the code, never the prose:\n\n| code | what it means | what to do |\n|---|---|---|\n| \\`verify.claims-open\\` (warn) | a recorded feature still has unconfirmed or unanswered claims — the one-line \"not a clean result\" summary with all four counts, so a partial record can never read as finished from the notice lines alone; a feature with no record at all never carries it | close each open claim: fix the code and re-run the suite for a failed scenario, re-answer the rest with evidence, then re-record |\n| \\`verify.scenario-attested\\` (warn) | scenario claims were answered on an agent's word (\\`answered_by: agent\\`), so the verdict is **attested**, not verified — nothing gates on it, but say so when you hand back | run the generated suite with a JSON report and re-record with \\`--results report.json\\` the moment a suite exists |\n| \\`verify.digest-contested\\` (warn) | two or more services word a scenario identically, so they share one \\`@loam-digest-…\\` tag and no single cucumber report can say whose suite ran it — those scenario claims stay unconfirmed | each service records its own claims from its own repository with \\`--service <id>\\` |\n| \\`verify.operation-contested\\` (warn) | two services on the checklist expose the same operationId, so a contract report — which names no service — cannot say whose suite exercised it; those claims stay unconfirmed | each service records its own with \\`--service <id>\\`, passing its own contract report |\n| \\`verify.checklist-forked\\` (warn) | one or more services answered a DIFFERENT version of the feature's question set than the one it now asks — each attestation carries the \\`checklist\\` digest it answered, and the notice names the ones that do not match the current checklist. Measured against the present, not pairwise: services that all attested against a since-rewritten delta agree with each other perfectly and are all stale. Normal mid-rollout, since services attest as they finish. Attestations written before the field existed carry no digest and are never called stale. In a per-service record the answers of the services named do not count until they record again | re-record the services on the older version from their own repositories (\\`loam verify <FEAT> --service <id> --record\\`) — nothing gates on it |\n| \\`verify.record-miscounted\\` (error) | a record file whose \\`summary\\` block contradicts its own \\`claims[]\\` — neither half can be believed, so the record is refused as unreadable rather than trusted in either direction | a service's own \\`verification/<id>.yaml\\`: delete it and re-record from that service's repo; the one-file \\`verification.yaml\\`: restore it from version control, then re-record — never delete it, and never edit the counts by hand |\n| \\`verify.evidence-token-missing\\` (warn) | a just-confirmed citation's file at the attested commit does not contain the claim's own token (the operationId, message name or edge op) — the evidence may not show what the answer says | re-read that evidence while the answer can still be corrected; verdict-neutral, it gates nothing |\n| \\`cross.agree-confirmed\\` / \\`cross.agree-unconfirmed\\` (ok) | a \\`--diff-answers\\` row where both blind answer sets reach the same verdict — the cheap-to-skip review queue, though same-model agreement is correlated and proves nothing | nothing on its own; record only the answer set you stand behind, in a separate run |\n| \\`cross.disagree\\` (the rows a human reads first) | a \\`--diff-answers\\` row where the two blind answer sets contradict each other — one of them is wrong about the code | read both cited evidences and decide; the diff writes nothing and never moves a verdict |\n| \\`cross.evidence-disjoint\\` (warn) | a \\`--diff-answers\\` notice: claims BOTH sets confirm while citing non-overlapping files — two yeses that looked at different evidence | read those agreements second, after the disagreements; agreement over disjoint evidence is two guesses, not one proof |\n`,\n};\n\nexport const LOAM_SHIP: CommandContent = {\n name: \"loam-ship\",\n description: \"Archive a finished loam feature — merge its deltas into the living docs\",\n argumentHint: \"<FEAT-id>\",\n purpose:\n \"Merge a shipped feature into the living specs, API and landscape. This is the one command that rewrites the source of truth, so every step before it exists to make the merge reviewable before it runs.\",\n invocation: \"loam instructions loam-ship $1\",\n placeholders: [\"feature\"],\n spine: [\n \"confirm the code is actually built and merged — archiving early makes the docs claim something that does not exist\",\n \"`loam validate --feature $1` must come back valid; if it says nothing pinned the delta, rebase and re-validate first\",\n \"`loam archive $1 --dry-run` — read the whole plan and every warning before the merge touches anything\",\n \"`loam archive $1` for real, and read what it reports it did\",\n \"every vouched spec on `revouchOwed[]` owes its owner's re-vouch — tell them; it lands in this same PR\",\n \"`loam unarchive $1` is the undo if the plan turns out to have been wrong\",\n ],\n body: `Archive a shipped feature.\n\n1. Confirm the code is actually built and merged. Archiving folds the delta into the\n living docs; doing it early makes the docs claim something that does not exist.\n \\`loam status $1 --json\\` answers \"is this actually finished\" in one call, and its\n \\`next[]\\` names what is outstanding if it is not.\n2. \\`loam validate --feature $1 --json\\` — must come back \\`valid: true\\`.\n If it reports \\`delta.baseline-missing\\` or \\`openapi.baseline-missing\\`, run\n \\`loam rebase $1\\` and re-validate BEFORE going on: those two say nothing has\n pinned what this delta was written against, so the merge cannot tell the text\n you EDITED from the text you merely restated. Both gate the archive — the\n dry run in step 3 refuses on them too — and the only way past without the\n pins is a human's \\`--approve\\`.\n3. \\`loam archive $1 --dry-run --json\\` first. \\`plan[]\\` is every file the merge would\n write (\\`create\\` / \\`update\\`, then the final \\`move\\` into \\`features/archive/\\`) —\n including an \\`update\\` for each of the feature's own documents whose links the\n move re-expresses, at its path before the move, and for each document outside\n the feature (another feature in flight, a living ADR) whose links into it the\n archive rewrites — and none of them are written —\n read it before letting the merge touch the source of truth, and stop if a file\n you did not expect is on it. \\`warnings[]\\` is what the\n merge will do that is legal but lossy — advisory warnings never block, which is\n exactly why you read them now: \\`openapi.op-modified\\` means an operation the living\n contract already defines gets overwritten wholesale, and its \\`details\\` name the\n current consumers that overwrite lands on (\\`asyncapi.message-modified\\` likewise for\n a message; \\`openapi.component-modified\\` is the same story for a component the\n merged operations carry, with no consumer list),\n \\`service.no-model\\` means a service arrives on the map with no directory behind it\n (an error, the one \\`validate --all\\` will report until \\`loam adopt\\` writes its\n documents — it never blocks the merge, and the run prints it instead of claiming\n the docs complete; a service whose directory the archive creates and the map\n draws gets an empty extending model instead, and raises nothing), and\n \\`delta.added-conflict\\`\n means another feature in flight adds the same requirement — the first to archive\n lands it, and the other's archive is then refused (\\`delta.added-duplicate\\`: its\n ADDED now collides with the living spec) unless a human \\`--approve\\`s the\n replacement. \\`dropped[]\\` is what each MODIFIED or REMOVED requirement takes OUT\n of a living document — the scenarios and the \\`Covers:\\` / \\`Operations:\\` / … entries\n its new text does not restate. None of it is a warning, and all of it is gone\n after the merge: restate in the delta anything that must survive, then re-run.\n The plan also prints one note per document the merge CREATES, saying whether\n the delta's title and \\`## Purpose\\` came across. A created document with no\n purpose arrives with no narrative at all. And read what lands verbatim — the\n requirement bodies, scenarios and contract descriptions — for review-time\n wording such as \"this delta\" or \"this feature\": in a living document it points\n at a change nobody will remember. Fix both in the delta before the merge\n (\\`loam instructions loam-authoring\\`, \"Writing for a person\").\n4. \\`loam archive $1 --json\\`. It merges three axes into the living state — requirements\n into \\`services/<svc>/spec.md\\`, endpoints into \\`services/<svc>/openapi.yaml\\`,\n elements and edges into \\`architecture/landscape.likec4\\` and, for an addition nested\n under a service whose model EXTENDS the map, into that\n \\`services/<…>/<svc>/model.likec4\\` instead — a service the archive creates and\n the merged map draws gets that model too, written empty at \\`services/<svc>/model.likec4\\` and holding\n whatever the delta drew inside the service; it lands unfiled, and\n \\`loam subsystem move <svc> --into <subsystem>\\` files it — then moves the feature\n under \\`features/archive/\\`, whole: its verification record travels with it,\n the per-service \\`verification/<id>.yaml\\` files and any one-file\n \\`verification.yaml\\` alike, and \\`loam verify $1\\` reads it back afterwards as\n frozen history. Verification never gates the archive — an open or missing\n record ships as exactly that. Success is \\`ok: true\\`; on \\`ok: false\\`, branch on\n \\`error.code\\`:\n - \\`not-coherent\\` — gating coherence issues; \\`issues[]\\` in the envelope lists them,\n each with \\`gates\\` and \\`overridable\\` resolved (advisory warnings do not block).\n Fix the breaches. \\`--approve\\` overrides the gating issues and is a human's\n call to make, not yours: report the breach and stop. Two codes it does not\n override even then — \\`delta.service-id-invalid\\` (a \\`specs/<svc>/\\` name the\n id grammar refuses) and \\`c4.service-binding-invalid\\` (a \\`metadata { service }\\`\n binding it refuses, anywhere inside a tagged element's block): each names a\n path the merge would write mechanically, they arrive with\n \\`overridable: false\\`, and the fix is a rename, never the flag.\n \\`openapi.remove-marker-path-level\\` arrives\n here too: an \\`x-loam-remove\\` written beside the methods instead of inside the\n operation retires nothing. So do \\`openapi.op-revived\\` and\n \\`asyncapi.slot-revived\\`: the delta spells an operation, slot or message an\n ARCHIVED feature retired, and the merge would put it back. If the delta only\n quoted it, delete the quote; whether the feature brings it back on purpose is\n the human's \\`--approve\\`, and the archive output then names what came back\n and whose retirement it reverses.\n - \\`living-outside-requirements\\` — the LIVING spec holds a requirement outside\n \\`## Requirements\\`, and the merge would duplicate it. Re-home it, then re-run.\n \\`--approve\\` does not move this one.\n - \\`archive-exists\\` — \\`features/archive/\\` already has that directory; a human\n decides what it is.\n - \\`merge-failed\\` — the merge could not be computed, or failed and was rolled\n back. Either way the living docs are unchanged; fix the reported cause, re-run.\n \"Could not resolve reference to RelationshipKind\" means the delta draws a\n relationship kind (\\`-[publishes]->\\`) that the living map's \\`specification\\`\n does not declare: the archive copies the edge and never the declaration.\n Declare the kind in \\`architecture/landscape.likec4\\` — it is vocabulary, not\n a feature change — then re-run.\n A file loam cannot decode as UTF-8 refuses here by name rather than being\n rewritten with replacement characters. So does a living document that still\n holds git conflict markers — the \\`spec.merge-conflict\\` /\n \\`landscape.merge-conflict\\` findings ride in \\`findings[]\\`, and \\`--approve\\`\n does not override them: the loss is mechanical, not a judgment call.\n - \\`docs-busy\\` — another \\`loam archive\\` or \\`loam unarchive\\` holds the docs\n repo's lock. Nothing was read or written; wait for it and re-run once.\n - \\`commit-interrupted\\` — a previous archive or unarchive was killed mid-commit\n and this run cannot repair it on its own: a half-written file was edited\n since, its pre-image is gone or altered, or \\`.loam-commit\\` cannot be read.\n Run \\`loam doctor\\` (\\`doctor.commit-interrupted\\` / \\`doctor.commit-unreadable\\`\n name the same state) and hand it to a human — re-running does not help.\n - \\`rollback-incomplete\\` — the merge failed AND some files could not be restored.\n Stop and hand it to a human; the message lists the files to check.\n5. Re-vouches are owed. \\`revouchOwed[]\\` — on the dry run and the real merge alike —\n names every VOUCHED spec the merge moves under its vouch stamp, with the\n document's \\`owner\\`. \\`content.stale\\` follows on each, and honestly: the merged\n text is words nobody has yet read against the code. You cannot clear it — a\n vouch is a person's, run in that service's own repo (\\`loam vouch --service <id>\\`,\n after \\`loam vouch --pack --service <id>\\` for what to re-read). Name the\n documents and owners in your hand-back, and say the re-vouches belong in the\n SAME PR as this archive: a docs repo gated on\n \\`loam validate --all --base <ref> --strict\\` keeps the archive's PR red until they\n land. Never edit a stamp by hand to turn it green.\n\nArchived by mistake? \\`loam unarchive $1\\` restores the living docs from the snapshot\narchive left in \\`features/archive/$1*/.loam-before/\\` and re-opens the feature. Do not\nhand-edit the living docs back instead: the previous text of a \\`MODIFIED\\` requirement\nis in that snapshot and nowhere else, so anything you write by hand is a guess. It\nrefuses under \\`snapshot-corrupt\\` when a pre-image's bytes no longer match the digest\nthe archive recorded — \\`--force\\` does not override that one, because the damage is\nto the undo itself — and under \\`snapshot-missing\\` for an archive older than the\ncurrent snapshot format. Both mean version control is the way back.\n`,\n};\n"]}
@@ -0,0 +1,220 @@
1
+ /** Starting a feature: explore, scaffold, author the three axes, rebase, validate. */
2
+ export const LOAM_FEATURE = {
3
+ name: "loam-feature",
4
+ description: "Start a new loam feature — scaffold it, then author the C4 delta and requirement deltas",
5
+ argumentHint: `<FEAT-id> "<title>"`,
6
+ purpose: "Start a feature in the docs repo: decide which services it touches, scaffold it, then author the C4 delta and one requirement delta per service. The `--touches` list is the hardest call in the cycle and nothing downstream catches one that is short by a service.",
7
+ invocation: 'loam instructions loam-feature $1 "$2"',
8
+ // $2 is the feature's human title: any string is a legal one.
9
+ placeholders: ["feature", "free"],
10
+ spine: [
11
+ "decide whether this is a feature at all — a change that touches no requirement, operation or edge needs none",
12
+ "read `AGENTS.md` at the docs repo root — it defines the ID spine everything else depends on",
13
+ "`loam explore` around the services you think are involved: the ring one hop out, and what is already in flight over the same ground",
14
+ "`loam status` / `loam list` / `loam show` — what exists and what is already owed",
15
+ "`loam new` with a `--touches` per service it changes and a `--new-service` per service it introduces",
16
+ "author what the templates left as TODO: intent, the C4 delta, the per-service spec / arch spec / openapi",
17
+ "analyze before you pin — write what the documents leave open under `## Open questions` in intent.md, for a human to answer",
18
+ "`loam rebase` — pin every MODIFIED requirement and every living operation you edited to the version you wrote against",
19
+ "validate the feature, then read `loam dependencies` before anyone starts building",
20
+ ],
21
+ // Step 0 and step 4b are the two this protocol was missing, and neither is
22
+ // graded — on purpose. Step 0 exists because the lightest lane loam has (no
23
+ // feature at all, for a change that moves no requirement, operation or edge)
24
+ // was true and written down nowhere, so the work that is most of a legacy
25
+ // fleet's week either walked the whole feature cycle or routed around loam.
26
+ // Step 4b exists because every check after it is a join between exact
27
+ // tokens: two services that agree on every operationId and disagree on what
28
+ // it means (one confirms a split the other answers 422 for) validate, archive
29
+ // and ship green, and a `Realizes:` whose requirement does not deliver the
30
+ // promise reads as a clean join. Nothing in the binary can read meaning, and
31
+ // a check pretending to would be the false green this tool exists to refuse,
32
+ // so the step asks for questions and leaves the answers to a person.
33
+ body: `Start a new feature in the loam docs repo (its path is \`docsDir\` in ./loam.json).
34
+
35
+ 0. First decide whether this needs a feature at all. A change that touches no
36
+ requirement, no operation and no fleet edge — a refactor, a dependency bump,
37
+ a fix that brings the code back to behaviour the living spec already
38
+ documents — needs NONE: nothing in the docs repo changes, so there is nothing
39
+ to scaffold, pin or archive. It is a code PR in the service repo, then
40
+ \`loam validate --service <id>\` there (the service repo is the only place
41
+ \`sources.stale\` is visible), then \`loam vouch --pack --service <id>\` to
42
+ prepare the re-read the moved sources owe — the vouch itself is a human's.
43
+ If the change alters what a requirement promises, it IS a feature, however
44
+ small: one \`--touches\`, a Why, the ADDED/MODIFIED requirement, and
45
+ \`loam rebase\` for a MODIFIED one — the rest of this page still applies.
46
+ 1. Read \`AGENTS.md\` at the root of the docs repo first — it defines the ID spine
47
+ everything here depends on.
48
+ 2. Understand the current state before proposing a change:
49
+ - \`loam status --json\` — what is already in flight and what it is waiting on.
50
+ Run this FIRST if you joined this repository halfway or lost the session:
51
+ \`next[]\` is ordered and each entry carries the literal command to run, so it
52
+ tells you whether the work is to start $1 at all. \`loam status $1 --json\`
53
+ narrows it to one feature once $1 exists
54
+ - \`loam list --json\` — what services exist, and what documentation they are missing
55
+ - \`loam show <service> --json\` — what a service owns, exposes, and who already calls it
56
+ 2b. \`loam explore <service> --json --as $1\` around every service you believe this
57
+ feature touches. This is the step that decides step 3's \`--touches\` list, and it
58
+ is the only decision in the cycle nothing downstream catches — a list short by one
59
+ service produces a feature that validates, archives and ships with a consumer
60
+ nobody updated. Read four fields:
61
+ - \`neighbours\` — the services one hop out in the fleet map. Weigh each one. loam
62
+ knows they are connected, not whether you change them, and it deliberately
63
+ leaves them OUT of the suggested command line rather than guessing for you
64
+ - \`services[].maturity\` — a service at \`empty\` or \`partial\` has no baseline to
65
+ write a delta against, so the work starts with \`loam adopt --service <id>\`, not
66
+ with this feature
67
+ - \`services[].operations\` — what each already exposes, so an operation you are
68
+ about to "add" that is already there becomes a MODIFIED requirement instead
69
+ - \`overlaps\` — active features already carrying a delta for these services.
70
+ \`loam dependencies --json\` (step 7) then says which must archive first
71
+ \`--op <operationId>\` seeds from an operation when you know the call but not who
72
+ owns it. A seed naming no \`services/<id>/\` is reported in \`unknown\` with the
73
+ closest real ids rather than refused — the feature may be introducing it, and a
74
+ typo looks identical until you read that list. \`scaffold\` is the literal step-3
75
+ command line the seeds imply, with \`--new-service\` where the service does not
76
+ exist yet.
77
+ 3. Scaffold it: \`loam new $1 --title "$2"\`, adding \`--touches <id>\` for every service the
78
+ feature touches and \`--new-service <id>\` for every one it introduces. Every id goes
79
+ through the \`services/<id>/\` grammar, so a typo is refused (\`invalid-option\`)
80
+ rather than scaffolded; a \`--touches\` that matches nothing existing comes back as
81
+ a \`note\` with the close ids, not as a failure — read it, because a \`--touches\`
82
+ naming a service that does not exist is \`delta.service-unknown\` at validate time
83
+ and a phantom \`services/<typo>/\` directory if it ever archives.
84
+ 4. Author what the templates left as TODO. This step is gated, not advisory:
85
+ \`loam archive\` refuses a scaffold nobody edited (\`scaffold.placeholder\`,
86
+ \`intent.empty\`), so the placeholder text cannot reach the living docs.
87
+ - \`intent.md\` — the problem in business terms, in prose; the scaffold's
88
+ comment-only Why/Scope count as unwritten
89
+ - \`delta.likec4\` — new elements and edges, each tagged \`#$1\`; every call edge carries
90
+ \`metadata { op '<operationId>' }\`; replace the scaffolded TODO description on each
91
+ new service. For a requirements-only feature DELETE this
92
+ file: an empty delta is legal, but a scaffold left half-filled is not.
93
+ Draw each edge with its relationship kind (\`-[calls]->\`, \`-[publishes]->\`,
94
+ \`-[delivers]->\`, …), and draw a direction only where the evidence shows
95
+ one: anything else is \`-[connects]->\`. A message runs producer
96
+ \`-[publishes]->\` topic and topic \`-[delivers]->\` consumer, never
97
+ producer \`->\` consumer. A producer outside the fleet is an \`#external\`
98
+ element whose edge carries \`metadata { publishes }\`. Declare every kind
99
+ you draw in the delta's own \`specification\`, and check that the living
100
+ map's declares it too. The archive copies the edge and never the
101
+ declaration, so a kind the map lacks refuses the archive (\`merge-failed\`)
102
+ even though validate and status call the feature ready.
103
+ \`loam instructions loam-drawing\` has the kinds and their styles
104
+ - \`specs/<svc>/spec.md\` — the example requirement ships INSIDE the template's
105
+ comment: copy it out, unindent, one behaviour per requirement, SHALL, at
106
+ least one Given/When/Then scenario; add \`Operations:\` once the operation exists
107
+ - \`specs/<svc>/arch.spec.md\` — the architectural obligations (outbox, retries,
108
+ idempotency, alerts), same grammar; a \`Covers:\` line per requirement naming the
109
+ tagged elements/edges it accounts for, or \`c4.uncovered\` says nothing does.
110
+ Write an edge by its endpoints' service names
111
+ (\`order-service -> payment-service\`), which resolve the same before and
112
+ after the archive
113
+ - write every document for a reviewer who has never seen the code.
114
+ \`intent.md\` gains a \`## How to read this feature\` section, a
115
+ business-requirement coverage table, and \`## Open questions\` as a table
116
+ (ID, question, blocks, owner, current default). Each spec delta opens
117
+ with a plain-language \`## Purpose\`. A long requirement body becomes a
118
+ one-line lead plus one bullet per SHALL sentence. Every abbreviation is
119
+ expanded on first use. "This delta" and "this feature" stay out of
120
+ requirement bodies and contract descriptions, because the archive copies
121
+ those into the living docs. A word the feature brings goes in
122
+ \`glossary/<term>.md\` and a decision in \`adrs/\`, both inside the feature,
123
+ and a cross-service flow in \`usecases/<name>.likec4\`, tagged with a
124
+ \`#cap-\` that resolves. \`loam instructions loam-authoring\`, "Writing
125
+ for a person", has the shapes
126
+ - \`specs/<svc>/openapi.yaml\` — define every operationId the edges reference.
127
+ A self-contained document holding ONLY the operations this feature adds,
128
+ changes or removes — never a copy of the living contract. An operation you
129
+ leave out stays exactly as the living contract has it, and a local \`$ref\`
130
+ (\`#/components/schemas/Order\`) resolves into the living document, so there
131
+ is nothing to restate. Every operation you quote costs a pin, and once a
132
+ parallel feature retires it — or moves it, and you quoted the old
133
+ address — a pinned quote is \`openapi.baseline-invalid\` and
134
+ \`openapi.op-revived\` both, an unpinned one \`openapi.op-revived\` alone
135
+ (\`asyncapi.slot-revived\` on the event axis) — archive refuses either.
136
+ Delete the quote; only a feature that MEANS to bring a retired operation
137
+ back keeps it, and archives past the finding with a human's \`--approve\`
138
+ - \`specs/<svc>/asyncapi.yaml\` — the event axis, only when the feature changes
139
+ what a service puts on or takes off the bus: an AsyncAPI 3.0 document
140
+ holding only the channel, operation and message slots you add, change or
141
+ remove (an edited slot is written out whole), new messages under
142
+ \`components.messages\`, and a \`Publishes:\`/\`Consumes:\` line on each
143
+ requirement that names them. \`loam new\` scaffolds none — an event
144
+ contract is genuinely optional
145
+ - for a service (or capability) this feature CREATES, the delta is the
146
+ living document's first draft, and \`loam archive\` carries only what you
147
+ mark as the document's own: the frontmatter \`owner\`, an H1 that neither
148
+ names $1 nor calls itself a delta (the scaffold's does both — retitle it),
149
+ and a \`## Purpose\` section — put the service's narrative there. Everything
150
+ else in the delta is read as being about the change and stays with it in
151
+ \`features/archive/\`, linked from the new document
152
+ - links: write each one so it resolves where you write it, relative to the
153
+ file. A link into this feature — from its deltas, or from any other
154
+ document whose links validate grades — is re-pointed by \`loam archive\`
155
+ to wherever the file ends up — a term in \`glossary/<term>.md\` at the living glossary,
156
+ anything else (an ADR in \`adrs/\` above all) inside
157
+ \`features/archive/\`, because a feature ADR is never copied into the living
158
+ tree. A decision meant to outlive this change belongs in
159
+ \`architecture/adrs/\` or the service's own \`adrs/\` instead. The same
160
+ holds inside this feature: its own documents (the intent, its ADRs) move
161
+ to \`features/archive/\` with it, and the archive re-expresses their links
162
+ for the move — never write them for the archived location yourself
163
+ 4b. **Analyze before you pin.** Nothing grades this step, which is why it is here:
164
+ every check after it is a join between exact tokens, so two services that
165
+ agree on every operationId and disagree on what it means validate, archive
166
+ and ship green. Read the feature as its reviewer will, before rebase freezes it:
167
+ - \`loam show $1 --json\` — its \`review\` object joins the intent, the C4
168
+ objects, the API/event slices and the dependencies
169
+ - \`loam context <service> --feature $1 --json\` for every service it touches —
170
+ the living requirements verbatim, the edges one hop out, and this delta
171
+ - the \`neighbours\` step 2b's \`loam explore\` reported
172
+ Then write what the documents leave open under \`## Open questions\` in
173
+ \`intent.md\` (the scaffold already carries the heading), one table row per
174
+ question — ID, the question, what it blocks (the requirement id or edge it is
175
+ about), its owner, and the default that gets built if nobody answers:
176
+ - a SHALL two engineers could build two ways — an unstated unit, bound,
177
+ ordering, or an "eventually" with no window
178
+ - a value, limit or window two services state differently (a refund window,
179
+ a rounding rule, a retry budget), and which side refuses when they
180
+ disagree — a caller that accepts what its provider answers 4xx for is a
181
+ contradiction no check can see
182
+ - a \`Realizes:\` line whose requirement does not actually deliver the
183
+ capability promise it names, or a promise this feature changes that no
184
+ realizing requirement keeps
185
+ - per call edge in the delta: the timeout, the retry and what makes it safe
186
+ to repeat, what a partial failure leaves behind, and what compensates it —
187
+ an edge no requirement answers these for is a question, not a default
188
+ - each \`explore\` neighbour outside \`--touches\`: why it is untouched, or that
189
+ it is a candidate — adding one means a \`specs/<svc>/\` delta in this feature,
190
+ because that directory IS the feature's service list
191
+ Ask; do not answer for the author. The default column records what the
192
+ documents imply today, not what you would choose. A human answers by editing the file —
193
+ replacing a question with the decision, or with a change to the delta.
194
+ Nothing is graded: an empty section is legal, and so is an answered one.
195
+ 5. **\`loam rebase $1\`** — the step between authoring and checking, and the one that
196
+ stops two features in flight from silently deleting each other's work. It pins
197
+ every MODIFIED/REMOVED requirement (\`Based-On:\`), and every operation and
198
+ asyncapi channel/operation/message slot the living contract already holds
199
+ (\`x-loam-based-on\`), to the living version you wrote against. What the
200
+ feature ADDS has no living version and takes no pin, so an add-only contract
201
+ delta needs no rebase. Any living operation or slot the delta spells is one
202
+ the merge upserts, so it needs its pin even when you changed one line of it.
203
+ Without the pins, \`delta.baseline-missing\` / \`openapi.baseline-missing\` /
204
+ \`asyncapi.baseline-missing\` GATE
205
+ the archive: before they did, the second feature to archive reverted the
206
+ first — with \`+0 ~1 -0\`, exit 0, and nobody told. Rebase clears them; a
207
+ human's \`--approve\` is the only other way past.
208
+ Restamping is not resolving: if rebase reports a requirement as MOVED, re-read
209
+ the living text and fold in what you still mean BEFORE you ship.
210
+ 6. \`loam validate --feature $1 --json\`. Do not stop while \`valid\` is false.
211
+ 7. \`loam dependencies $1 --json\` before anyone starts building: it says which
212
+ features in flight have to archive first (\`order\`) and which collisions no
213
+ ordering fixes (\`conflicts\`, \`cycles\`). Every conflict it names is one \`loam rebase\`
214
+ cannot fix for you — two intentions have to be merged by people.
215
+
216
+ The operation's three spellings — the edge's \`op\`, the requirement's \`Operations:\`
217
+ line, and the OpenAPI \`operationId\` — must match exactly.
218
+ `,
219
+ };
220
+ //# sourceMappingURL=feature.js.map