@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,67 @@
1
+ /**
2
+ * The `loam-codes` reference page: which codes each INVOCATION can raise.
3
+ *
4
+ * The largest of the four pages and the one this migration is mostly about. As
5
+ * a section of AGENTS.md it was 44,433 bytes — 41% of a 109,399-byte file that
6
+ * Codex truncates at 32,768 and Windsurf at 12,000 characters, both silently.
7
+ * It is also the half a reader consults at a moment it can NAME (a run reported
8
+ * something) rather than the half it needs to form a question at all, which is
9
+ * what decided which side of the split it went. ./reference.ts carries the rest
10
+ * of that argument.
11
+ *
12
+ * This module does one thing: it CONCATENATES, in the order ../../agents-md.ts
13
+ * used to. Nothing here reformats a part on the way past, and nothing here is
14
+ * written — every byte comes from ../../agents-md/, which is where the sections
15
+ * already lived and where they stayed. The parts still carry their own trailing
16
+ * newlines and are joined with no separator, so the printed page is the old
17
+ * section byte for byte. That is the assembly contract every part's header
18
+ * points back at: each starts at the first character of its opening line and
19
+ * ends with the newline that closes its last one, or two parts glue onto one
20
+ * line on the printed page.
21
+ *
22
+ * WHAT IS AND IS NOT DUPLICATED. `## Reading loam's output` still exists in
23
+ * AGENTS.md (../../agents-md.ts's ORIENTATION), and it is orientation, not a
24
+ * summary of this page: the envelope's keys, branching on codes rather than
25
+ * prose, severity versus gating, and a pointer here. The per-invocation
26
+ * inventory below appears in exactly one place.
27
+ */
28
+ import { CODE_MAP } from "../../agents-md/command-map.js";
29
+ import { CONTEXT_COMMAND } from "../../agents-md/map/lenses/context.js";
30
+ import { DIFF_COMMAND } from "../../agents-md/map/lenses/diff.js";
31
+ import { GATE_COMMAND } from "../../agents-md/map/lenses/gate.js";
32
+ import { EXPLAIN_COMMAND } from "../../agents-md/map/explain.js";
33
+ import { MCP_COMMAND } from "../../agents-md/map/mcp.js";
34
+ import { SUBSYSTEM_COMMANDS } from "../../agents-md/map/subsystem.js";
35
+ import { USECASE_VIEWS } from "../../agents-md/map/usecases.js";
36
+ import { REFUSALS } from "../../agents-md/refusals.js";
37
+ export const LOAM_CODES = {
38
+ name: "loam-codes",
39
+ description: "Reference: which codes each invocation can raise, command by command",
40
+ // No arguments: one document, printed whole. See ./spine.ts for why the hint
41
+ // is empty rather than a spelled-out "<none>".
42
+ argumentHint: "",
43
+ purpose: "The per-invocation inventory: which findings `validate --service` / `--feature` / `--all`, `status`, `doctor`, `gate`, `context`, `diff`, `explore`, `dependencies`, `rebase`, `seed`, `subsystem` and `mcp` can report, and the refusals the containment surface answers with.",
44
+ invocation: "loam instructions loam-codes",
45
+ placeholders: [],
46
+ // The page carries no `## ` headings — it is one list, and the bullets are
47
+ // the structure. The spine names the invocations it walks instead, which is
48
+ // what a reader is actually looking one of up.
49
+ spine: [
50
+ "validate --service / --feature / --all",
51
+ "status, doctor, rebase, dependencies, explore, seed",
52
+ "context, gate, subsystem, use-case views, diff, explain, mcp",
53
+ "the containment refusals and the OpenSpec migration surface",
54
+ ],
55
+ // CODE_MAP already opens with the page's own "**What this page is.**" and
56
+ // leads with `status`, the orientation command.
57
+ body: CODE_MAP +
58
+ CONTEXT_COMMAND +
59
+ GATE_COMMAND +
60
+ SUBSYSTEM_COMMANDS +
61
+ USECASE_VIEWS +
62
+ DIFF_COMMAND +
63
+ EXPLAIN_COMMAND +
64
+ MCP_COMMAND +
65
+ REFUSALS,
66
+ };
67
+ //# sourceMappingURL=codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../../../../src/core/agent/workflows/reference/codes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAGvD,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,sEAAsE;IACnF,6EAA6E;IAC7E,+CAA+C;IAC/C,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,iRAAiR;IACnR,UAAU,EAAE,8BAA8B;IAC1C,YAAY,EAAE,EAAE;IAChB,2EAA2E;IAC3E,4EAA4E;IAC5E,+CAA+C;IAC/C,KAAK,EAAE;QACL,wCAAwC;QACxC,qDAAqD;QACrD,8DAA8D;QAC9D,6DAA6D;KAC9D;IACD,0EAA0E;IAC1E,gDAAgD;IAChD,IAAI,EACF,QAAQ;QACR,eAAe;QACf,YAAY;QACZ,kBAAkB;QAClB,aAAa;QACb,YAAY;QACZ,eAAe;QACf,WAAW;QACX,QAAQ;CACX,CAAC","sourcesContent":["/**\n * The `loam-codes` reference page: which codes each INVOCATION can raise.\n *\n * The largest of the four pages and the one this migration is mostly about. As\n * a section of AGENTS.md it was 44,433 bytes — 41% of a 109,399-byte file that\n * Codex truncates at 32,768 and Windsurf at 12,000 characters, both silently.\n * It is also the half a reader consults at a moment it can NAME (a run reported\n * something) rather than the half it needs to form a question at all, which is\n * what decided which side of the split it went. ./reference.ts carries the rest\n * of that argument.\n *\n * This module does one thing: it CONCATENATES, in the order ../../agents-md.ts\n * used to. Nothing here reformats a part on the way past, and nothing here is\n * written — every byte comes from ../../agents-md/, which is where the sections\n * already lived and where they stayed. The parts still carry their own trailing\n * newlines and are joined with no separator, so the printed page is the old\n * section byte for byte. That is the assembly contract every part's header\n * points back at: each starts at the first character of its opening line and\n * ends with the newline that closes its last one, or two parts glue onto one\n * line on the printed page.\n *\n * WHAT IS AND IS NOT DUPLICATED. `## Reading loam's output` still exists in\n * AGENTS.md (../../agents-md.ts's ORIENTATION), and it is orientation, not a\n * summary of this page: the envelope's keys, branching on codes rather than\n * prose, severity versus gating, and a pointer here. The per-invocation\n * inventory below appears in exactly one place.\n */\nimport { CODE_MAP } from \"../../agents-md/command-map.js\";\nimport { CONTEXT_COMMAND } from \"../../agents-md/map/lenses/context.js\";\nimport { DIFF_COMMAND } from \"../../agents-md/map/lenses/diff.js\";\nimport { GATE_COMMAND } from \"../../agents-md/map/lenses/gate.js\";\nimport { EXPLAIN_COMMAND } from \"../../agents-md/map/explain.js\";\nimport { MCP_COMMAND } from \"../../agents-md/map/mcp.js\";\nimport { SUBSYSTEM_COMMANDS } from \"../../agents-md/map/subsystem.js\";\nimport { USECASE_VIEWS } from \"../../agents-md/map/usecases.js\";\nimport { REFUSALS } from \"../../agents-md/refusals.js\";\nimport type { CommandContent } from \"../../contract.js\";\n\nexport const LOAM_CODES: CommandContent = {\n name: \"loam-codes\",\n description: \"Reference: which codes each invocation can raise, command by command\",\n // No arguments: one document, printed whole. See ./spine.ts for why the hint\n // is empty rather than a spelled-out \"<none>\".\n argumentHint: \"\",\n purpose:\n \"The per-invocation inventory: which findings `validate --service` / `--feature` / `--all`, `status`, `doctor`, `gate`, `context`, `diff`, `explore`, `dependencies`, `rebase`, `seed`, `subsystem` and `mcp` can report, and the refusals the containment surface answers with.\",\n invocation: \"loam instructions loam-codes\",\n placeholders: [],\n // The page carries no `## ` headings — it is one list, and the bullets are\n // the structure. The spine names the invocations it walks instead, which is\n // what a reader is actually looking one of up.\n spine: [\n \"validate --service / --feature / --all\",\n \"status, doctor, rebase, dependencies, explore, seed\",\n \"context, gate, subsystem, use-case views, diff, explain, mcp\",\n \"the containment refusals and the OpenSpec migration surface\",\n ],\n // CODE_MAP already opens with the page's own \"**What this page is.**\" and\n // leads with `status`, the orientation command.\n body:\n CODE_MAP +\n CONTEXT_COMMAND +\n GATE_COMMAND +\n SUBSYSTEM_COMMANDS +\n USECASE_VIEWS +\n DIFF_COMMAND +\n EXPLAIN_COMMAND +\n MCP_COMMAND +\n REFUSALS,\n};\n"]}
@@ -0,0 +1,210 @@
1
+ export const LOAM_DONE_CHECK = {
2
+ name: "loam-done-check",
3
+ description: "Reference: the done-check — how `loam verify` derives claims, and verified versus attested",
4
+ // No arguments: one document, printed whole. See ./spine.ts for why the hint
5
+ // is empty rather than a spelled-out "<none>".
6
+ argumentHint: "",
7
+ purpose: "What `loam verify` asks, which of the three channels may answer each kind of claim, how a cross-service feature is recorded from each service's own repository, and why an agent's word yields `attested` rather than `verified`.",
8
+ invocation: "loam instructions loam-done-check",
9
+ placeholders: [],
10
+ spine: ["The done-check"],
11
+ body: `The done-check: what \`loam verify\` asks, who may answer it, and what the answer is worth.
12
+
13
+ ## The done-check
14
+
15
+ \`loam verify <FEAT>\` derives a checklist from the feature's own artifacts —
16
+ one claim per new service, per operation the delta adds, per tagged edge that
17
+ names an operation, and per scenario of every changed requirement, arch.spec.md
18
+ deltas included (those claims name their file, and the test they ask for is an
19
+ integration/ops test, not an acceptance test). Each claim has a stable id, so
20
+ two runs are diffable and an answer cannot drift onto a different question.
21
+
22
+ Three answer channels, and they never overlap. The \`scenario.tested\` claims
23
+ are the TEST RUNNER's to answer: run the generated suite and pass its report
24
+ back — cucumber JSON (\`cucumber-js --format json:report.json\`), or loam's own
25
+ runner-neutral shape \`{"loamScenarioReport": 1, "results": [{"digest": "…",
26
+ "status": "passed"}]}\` that any runner can be adapted into, chosen by its
27
+ marker key. The digest is the contract, never the dialect: both read
28
+ \`answered_by: runner\` because both are a real run reporting that digest green,
29
+ so a JUnit or pytest fleet is not held at \`attested\` by a file format —
30
+ \`loam verify <FEAT> --results report.json\`. A claim is confirmed only when a
31
+ report scenario carrying its \`@loam-digest-<16hex>\` tag ran at least one step
32
+ and every step passed — every occurrence, when the report holds a re-run, and
33
+ every before/after hook with it — and, in a cucumber report, ran exactly as
34
+ many steps as the stamped scenario has: a hand-tagged stub is not that
35
+ scenario's run. A failed, undefined, pending or skipped step, a failed hook, a
36
+ step count that differs, or no matching scenario at all, is \`unconfirmed\` with
37
+ the reason. A report that is not JSON (a JUnit XML file) is refused
38
+ \`answers-unreadable\`, naming both shapes. The digest is the only identity: a reworded spec scenario matches
39
+ nothing until the suite is regenerated and re-run. When a report exists,
40
+ ALWAYS pass \`--results\` — under it the runner owns every scenario claim, and
41
+ an answers-file entry for one is refused.
42
+
43
+ The \`api.exposes\` claims have a mechanical channel of their own: an API
44
+ contract-test run, passed back with
45
+ \`loam verify <FEAT> --contract-results contract.json\`. loam accepts one
46
+ shape — its own documented contract-results JSON,
47
+ \`{"loamContractReport": 1, "results": [{"operationId": "createSplit",
48
+ "status": "passed"}]}\` — emitted from your contract tool's report in one
49
+ transform (Specmatic's own coverage JSON is refused by design: its "covered"
50
+ status means exercised, not passed, so reading it would confirm what a red run
51
+ refuted). An entry whose status is exactly \`passed\` confirms the claim whose
52
+ operationId it names — the record says \`answered_by: external-runner\` and the
53
+ views mark the line \`[contract]\` — while a failed or unknown status and an
54
+ operation the report never exercised leave the claim \`unconfirmed\` with the
55
+ reason; entries naming operations outside the checklist are ignored.
56
+ \`verify.operation-contested\` (warn) is \`verify.digest-contested\`'s twin on
57
+ this axis: an operationId is unique per contract document, not per fleet, so
58
+ when two services on the checklist expose the same one, a report entry — which
59
+ names no service — cannot say whose suite exercised it, those claims stay
60
+ unconfirmed, and each service records its own with \`--service\`. Under the
61
+ flag the contract report OWNS every api.exposes claim in scope, so an
62
+ answers-file entry for one is refused (\`answers-mismatch\`), and the record
63
+ pins the file consumed in \`contractReport\` (path, sha256 of the bytes, mtime,
64
+ operation count) exactly as \`report\` pins the cucumber one. The verdict
65
+ ladder does not move: external evidence never answers a \`scenario.tested\`
66
+ claim, so \`attested\` versus \`verified\` still turns on scenario claims
67
+ alone.
68
+
69
+ \`--record\` without \`--results\` is the fallback for a service with no runnable
70
+ suite yet: there your word answers the scenario claims too. It still works, and
71
+ it costs something you must know about. The record says who answered
72
+ (\`answered_by: agent\`), and that answer changes the VERDICT: a feature whose
73
+ scenario claims rest on an agent's word is **attested**, not verified.
74
+ \`verify --json\` reports \`verdict: "attested"\` with \`verified: false\` and an
75
+ \`attested\` count, \`loam status\` marks it and adds a \`next.verify-attested\` step,
76
+ and the notice rides in \`notices[]\` under \`verify.scenario-attested\` (warn —
77
+ nothing gates on it, because a legacy service with no suite must still be able
78
+ to ship). Answer them mechanically the moment a suite runs:
79
+ \`loam verify <FEAT> --results <report.json>\`.
80
+
81
+ A record that leaves any claim unconfirmed or unanswered carries
82
+ \`verify.claims-open\` (warn) in \`notices[]\` — the one-line "not a clean
83
+ result" summary with all four counts, on the read view and the frozen
84
+ post-archive view alike; it gates nothing, and a feature with no record at all
85
+ never carries it, because not-started is not partial.
86
+
87
+ Federated \`--record\` also stamps \`evidence_pins\` on each agent-confirmed
88
+ citation — the cited file's sha256 at the attested commit, the cited line's
89
+ text, and the literal token the claim asserts (operationId, message name, edge
90
+ op). One notice rides beside the stamp: \`verify.evidence-token-missing\` (warn,
91
+ verdict-neutral, gates nothing) says a cited file at the attested commit does
92
+ not contain the claim's token — read that evidence first, while the answer can
93
+ still be corrected. \`loam validate\`, run later in the service's repo,
94
+ re-checks the pins and reports drift under the \`evidence.*\` findings; nothing
95
+ there moves a verdict either.
96
+
97
+ Two more codes belong to the record itself. \`verify.record-miscounted\` (error):
98
+ a record file whose \`summary\` block contradicts its own \`claims[]\` — the
99
+ record is refused as unreadable rather than believed in either half, and the
100
+ repair is never editing the counts: a service's own \`verification/<id>.yaml\`
101
+ is deleted and recorded again by that service, and the one-file
102
+ \`verification.yaml\` is restored from version control and then recorded over.
103
+ \`verify.digest-contested\`
104
+ (warn): two or more services word a scenario identically, so they share one
105
+ \`@loam-digest-…\` tag and no single cucumber report can say whose suite ran it —
106
+ those scenario claims are left unconfirmed, and each service records its own
107
+ from its own repository with \`--service\`.
108
+
109
+ A federated record also says WHAT EACH SERVICE ANSWERED AGAINST. Every
110
+ attestation carries the \`checklist\` digest it answered and, when the docs repo
111
+ is a git checkout, the \`docsCommit\` that checklist was derived from — so the
112
+ record pins both sides, the service repo through \`commit\` and the question set
113
+ through these two. \`verify.checklist-forked\` (warn) is what that buys: it names the
114
+ services whose attestation answers a DIFFERENT checklist than the feature now
115
+ asks, which the record-level \`checklist\` field alone could never show — it
116
+ flagged every service or none, and never said which answers went stale. It is
117
+ measured against the present rather than pairwise between attestations, because
118
+ services that all answered a since-rewritten delta agree with each other and are
119
+ every one of them stale. Differing \`docsCommit\` values are NOT a finding:
120
+ recording a week apart is normal for a feature in flight.
121
+ Normal mid-rollout and it gates nothing; re-record the services on the older
122
+ version from their own repositories. In a record kept as per-service files the
123
+ answers of the services it names do not count until they do: the record
124
+ answers the newest version its files answered, and an answer filed against an
125
+ older one could otherwise fill the slot of the question that replaced it.
126
+ Attestations written before the field existed carry no \`checklist\` and are not
127
+ counted as a third version — silence is not disagreement.
128
+
129
+ A consumed report is written down: \`report\` and \`contractReport\` on the
130
+ record (or on that repository's attestation) each carry the path, a sha256 of
131
+ the bytes, the file's mtime and how much it held — tagged scenarios for the
132
+ one, distinct operationIds for the other. That identifies WHICH file answered
133
+ the claims, and — when the file is committed — that it matches the attested
134
+ commit. It does not prove the file came from executing that commit; no digest
135
+ can.
136
+
137
+ Everything else you answer from the code, and \`--record answers.json\` takes
138
+ those back — into \`features/<FEAT>/verification/<svc>.yaml\` with \`--service\`,
139
+ into the one file \`features/<FEAT>/verification.yaml\` without — and either
140
+ travels into the archive with the feature and reads without loam. Alongside the mechanical
141
+ flags, the answers file must answer exactly the claims no report owns: an
142
+ entry for a report-owned claim is refused (\`answers-mismatch\`), and a
143
+ mechanical flag alone is refused while claims outside its kind are
144
+ outstanding. Every recorded verdict says who answered it
145
+ (\`answered_by: runner | external-runner | agent\`), so a reviewer can tell a
146
+ green run from somebody's word.
147
+
148
+ **A cross-service feature is verified once per service, and the form matters.**
149
+ The claims of one feature belong to several services, and each service's code
150
+ lives in its own repository — so the recording form is federated:
151
+
152
+ \`\`\`sh
153
+ # in EACH affected service's own repo, not in the docs repo:
154
+ loam verify FEAT-101 --service payment-service --results report.json --record answers.json
155
+ # with an API contract suite, its report answers the api.exposes claims too:
156
+ loam verify FEAT-101 --service payment-service --results report.json --contract-results contract.json --record answers.json
157
+ \`\`\`
158
+
159
+ \`--service <id>\` narrows the checklist to that service's claims and binds the
160
+ answers to this repository's commit, producing that service's **attestation**
161
+ as a file of its own, \`features/<FEAT>/verification/<id>.yaml\`. The directory
162
+ is the record: loam adds the files up when it reads, and the verdict and
163
+ counts are computed from them, never stored. Re-running it in the next repo
164
+ writes that repo's file and touches no other — which is why two teams'
165
+ attestations on two docs-repo branches merge cleanly, where one shared file
166
+ conflicted every time. A one-file federated \`verification.yaml\` written
167
+ before the directory is still read; a service that records again supersedes
168
+ its share of it, and the file goes once every service it names has its own.
169
+ Omitting
170
+ \`--service\` in a repo whose \`loam.json\` declares one substitutes it, so the
171
+ short form is safe there; a \`--service\` naming a service this repo does not
172
+ declare is refused (\`service-mismatch\`), and \`--service\` from a repo that
173
+ declares none is refused (\`repository-unavailable\`) — an attestation has to be
174
+ bound to the code it is about.
175
+
176
+ ⚠ **The legacy all-at-once form \`loam verify <FEAT> --record answers.json\` with
177
+ no \`--service\` writes the whole record from one place.** Over a record that
178
+ already carries other services' attestations it is refused outright
179
+ (\`record-federated\`, naming the attestors) rather than merged or migrated — the
180
+ alternative was one repo silently erasing nine others' evidence. Use it only for
181
+ a single-service feature that has never been recorded federated. A record file
182
+ that exists but cannot be read — broken YAML, git conflict markers, a miscount
183
+ — is \`record-unreadable\`: it is never overwritten and never reported as "no
184
+ record", and the message names the file and the repair that is safe for it. A
185
+ service's own \`verification/<id>.yaml\` holds only that service's word, so that
186
+ service may delete it and record again; the one-file \`verification.yaml\` may
187
+ hold other services' attestations, so it is restored from version control
188
+ (after a merge, the copy on the branch you merged into) and never deleted.
189
+
190
+ Reading is not writing: \`loam verify <FEAT> --service <id>\` **without**
191
+ \`--record\` is a pure lens on the checklist. A read-only verify checklist needs no
192
+ binding and works from the docs repo, or from anywhere else — the refusals above
193
+ are about WRITING an attestation, and only about that. Every run lists all
194
+ subjects in \`services\`, and a recorded run reports in \`discarded\` every previous
195
+ answer the new record does not carry.
196
+
197
+ It refuses an answer set that does not answer the current checklist: an id that
198
+ is not on it (\`answers-mismatch\`), a claim with no answer (same), or a
199
+ \`confirmed\` with no evidence (\`answers-unevidenced\`). Evidence is \`file:line\`.
200
+ A claim you cannot show is \`unconfirmed\` with a note saying why — that is a
201
+ successful record, and it is more useful to the next reader than a yes.
202
+
203
+ **Nothing gates on it.** \`loam archive\` will ship an unverified feature. That
204
+ is deliberate: coherence is something loam computed from the documents, and a
205
+ verdict is your word about code loam never read. A gate in front of shipping
206
+ would only teach everyone that the cheapest way past it is to say yes. The
207
+ record is for the reviewer who comes later, so leave it true.
208
+ `,
209
+ };
210
+ //# sourceMappingURL=done-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"done-check.js","sourceRoot":"","sources":["../../../../../src/core/agent/workflows/reference/done-check.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,eAAe,GAAmB;IAC7C,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,4FAA4F;IAC9F,6EAA6E;IAC7E,+CAA+C;IAC/C,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,mOAAmO;IACrO,UAAU,EAAE,mCAAmC;IAC/C,YAAY,EAAE,EAAE;IAChB,KAAK,EAAE,CAAC,gBAAgB,CAAC;IACzB,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqMP;CACA,CAAC","sourcesContent":["/**\n * The `loam-done-check` reference page: how `loam verify` derives its claims,\n * who may answer them, and what separates **verified** from **attested**.\n *\n * It is the longest single section the corpus had after the code inventory —\n * three answer channels, the federated recording form, the evidence pins and\n * the six codes the record itself can carry — and every word of it is read at\n * one moment in the cycle, step 7. AGENTS.md's own step 7 names this page.\n *\n * The text is the AGENTS.md section verbatim. See ./reference.ts for why the\n * four pages exist and what was traded for them.\n */\nimport type { CommandContent } from \"../../contract.js\";\n\nexport const LOAM_DONE_CHECK: CommandContent = {\n name: \"loam-done-check\",\n description:\n \"Reference: the done-check — how `loam verify` derives claims, and verified versus attested\",\n // No arguments: one document, printed whole. See ./spine.ts for why the hint\n // is empty rather than a spelled-out \"<none>\".\n argumentHint: \"\",\n purpose:\n \"What `loam verify` asks, which of the three channels may answer each kind of claim, how a cross-service feature is recorded from each service's own repository, and why an agent's word yields `attested` rather than `verified`.\",\n invocation: \"loam instructions loam-done-check\",\n placeholders: [],\n spine: [\"The done-check\"],\n body: `The done-check: what \\`loam verify\\` asks, who may answer it, and what the answer is worth.\n\n## The done-check\n\n\\`loam verify <FEAT>\\` derives a checklist from the feature's own artifacts —\none claim per new service, per operation the delta adds, per tagged edge that\nnames an operation, and per scenario of every changed requirement, arch.spec.md\ndeltas included (those claims name their file, and the test they ask for is an\nintegration/ops test, not an acceptance test). Each claim has a stable id, so\ntwo runs are diffable and an answer cannot drift onto a different question.\n\nThree answer channels, and they never overlap. The \\`scenario.tested\\` claims\nare the TEST RUNNER's to answer: run the generated suite and pass its report\nback — cucumber JSON (\\`cucumber-js --format json:report.json\\`), or loam's own\nrunner-neutral shape \\`{\"loamScenarioReport\": 1, \"results\": [{\"digest\": \"…\",\n\"status\": \"passed\"}]}\\` that any runner can be adapted into, chosen by its\nmarker key. The digest is the contract, never the dialect: both read\n\\`answered_by: runner\\` because both are a real run reporting that digest green,\nso a JUnit or pytest fleet is not held at \\`attested\\` by a file format —\n\\`loam verify <FEAT> --results report.json\\`. A claim is confirmed only when a\nreport scenario carrying its \\`@loam-digest-<16hex>\\` tag ran at least one step\nand every step passed — every occurrence, when the report holds a re-run, and\nevery before/after hook with it — and, in a cucumber report, ran exactly as\nmany steps as the stamped scenario has: a hand-tagged stub is not that\nscenario's run. A failed, undefined, pending or skipped step, a failed hook, a\nstep count that differs, or no matching scenario at all, is \\`unconfirmed\\` with\nthe reason. A report that is not JSON (a JUnit XML file) is refused\n\\`answers-unreadable\\`, naming both shapes. The digest is the only identity: a reworded spec scenario matches\nnothing until the suite is regenerated and re-run. When a report exists,\nALWAYS pass \\`--results\\` — under it the runner owns every scenario claim, and\nan answers-file entry for one is refused.\n\nThe \\`api.exposes\\` claims have a mechanical channel of their own: an API\ncontract-test run, passed back with\n\\`loam verify <FEAT> --contract-results contract.json\\`. loam accepts one\nshape — its own documented contract-results JSON,\n\\`{\"loamContractReport\": 1, \"results\": [{\"operationId\": \"createSplit\",\n\"status\": \"passed\"}]}\\` — emitted from your contract tool's report in one\ntransform (Specmatic's own coverage JSON is refused by design: its \"covered\"\nstatus means exercised, not passed, so reading it would confirm what a red run\nrefuted). An entry whose status is exactly \\`passed\\` confirms the claim whose\noperationId it names — the record says \\`answered_by: external-runner\\` and the\nviews mark the line \\`[contract]\\` — while a failed or unknown status and an\noperation the report never exercised leave the claim \\`unconfirmed\\` with the\nreason; entries naming operations outside the checklist are ignored.\n\\`verify.operation-contested\\` (warn) is \\`verify.digest-contested\\`'s twin on\nthis axis: an operationId is unique per contract document, not per fleet, so\nwhen two services on the checklist expose the same one, a report entry — which\nnames no service — cannot say whose suite exercised it, those claims stay\nunconfirmed, and each service records its own with \\`--service\\`. Under the\nflag the contract report OWNS every api.exposes claim in scope, so an\nanswers-file entry for one is refused (\\`answers-mismatch\\`), and the record\npins the file consumed in \\`contractReport\\` (path, sha256 of the bytes, mtime,\noperation count) exactly as \\`report\\` pins the cucumber one. The verdict\nladder does not move: external evidence never answers a \\`scenario.tested\\`\nclaim, so \\`attested\\` versus \\`verified\\` still turns on scenario claims\nalone.\n\n\\`--record\\` without \\`--results\\` is the fallback for a service with no runnable\nsuite yet: there your word answers the scenario claims too. It still works, and\nit costs something you must know about. The record says who answered\n(\\`answered_by: agent\\`), and that answer changes the VERDICT: a feature whose\nscenario claims rest on an agent's word is **attested**, not verified.\n\\`verify --json\\` reports \\`verdict: \"attested\"\\` with \\`verified: false\\` and an\n\\`attested\\` count, \\`loam status\\` marks it and adds a \\`next.verify-attested\\` step,\nand the notice rides in \\`notices[]\\` under \\`verify.scenario-attested\\` (warn —\nnothing gates on it, because a legacy service with no suite must still be able\nto ship). Answer them mechanically the moment a suite runs:\n\\`loam verify <FEAT> --results <report.json>\\`.\n\nA record that leaves any claim unconfirmed or unanswered carries\n\\`verify.claims-open\\` (warn) in \\`notices[]\\` — the one-line \"not a clean\nresult\" summary with all four counts, on the read view and the frozen\npost-archive view alike; it gates nothing, and a feature with no record at all\nnever carries it, because not-started is not partial.\n\nFederated \\`--record\\` also stamps \\`evidence_pins\\` on each agent-confirmed\ncitation — the cited file's sha256 at the attested commit, the cited line's\ntext, and the literal token the claim asserts (operationId, message name, edge\nop). One notice rides beside the stamp: \\`verify.evidence-token-missing\\` (warn,\nverdict-neutral, gates nothing) says a cited file at the attested commit does\nnot contain the claim's token — read that evidence first, while the answer can\nstill be corrected. \\`loam validate\\`, run later in the service's repo,\nre-checks the pins and reports drift under the \\`evidence.*\\` findings; nothing\nthere moves a verdict either.\n\nTwo more codes belong to the record itself. \\`verify.record-miscounted\\` (error):\na record file whose \\`summary\\` block contradicts its own \\`claims[]\\` — the\nrecord is refused as unreadable rather than believed in either half, and the\nrepair is never editing the counts: a service's own \\`verification/<id>.yaml\\`\nis deleted and recorded again by that service, and the one-file\n\\`verification.yaml\\` is restored from version control and then recorded over.\n\\`verify.digest-contested\\`\n(warn): two or more services word a scenario identically, so they share one\n\\`@loam-digest-…\\` tag and no single cucumber report can say whose suite ran it —\nthose scenario claims are left unconfirmed, and each service records its own\nfrom its own repository with \\`--service\\`.\n\nA federated record also says WHAT EACH SERVICE ANSWERED AGAINST. Every\nattestation carries the \\`checklist\\` digest it answered and, when the docs repo\nis a git checkout, the \\`docsCommit\\` that checklist was derived from — so the\nrecord pins both sides, the service repo through \\`commit\\` and the question set\nthrough these two. \\`verify.checklist-forked\\` (warn) is what that buys: it names the\nservices whose attestation answers a DIFFERENT checklist than the feature now\nasks, which the record-level \\`checklist\\` field alone could never show — it\nflagged every service or none, and never said which answers went stale. It is\nmeasured against the present rather than pairwise between attestations, because\nservices that all answered a since-rewritten delta agree with each other and are\nevery one of them stale. Differing \\`docsCommit\\` values are NOT a finding:\nrecording a week apart is normal for a feature in flight.\nNormal mid-rollout and it gates nothing; re-record the services on the older\nversion from their own repositories. In a record kept as per-service files the\nanswers of the services it names do not count until they do: the record\nanswers the newest version its files answered, and an answer filed against an\nolder one could otherwise fill the slot of the question that replaced it.\nAttestations written before the field existed carry no \\`checklist\\` and are not\ncounted as a third version — silence is not disagreement.\n\nA consumed report is written down: \\`report\\` and \\`contractReport\\` on the\nrecord (or on that repository's attestation) each carry the path, a sha256 of\nthe bytes, the file's mtime and how much it held — tagged scenarios for the\none, distinct operationIds for the other. That identifies WHICH file answered\nthe claims, and — when the file is committed — that it matches the attested\ncommit. It does not prove the file came from executing that commit; no digest\ncan.\n\nEverything else you answer from the code, and \\`--record answers.json\\` takes\nthose back — into \\`features/<FEAT>/verification/<svc>.yaml\\` with \\`--service\\`,\ninto the one file \\`features/<FEAT>/verification.yaml\\` without — and either\ntravels into the archive with the feature and reads without loam. Alongside the mechanical\nflags, the answers file must answer exactly the claims no report owns: an\nentry for a report-owned claim is refused (\\`answers-mismatch\\`), and a\nmechanical flag alone is refused while claims outside its kind are\noutstanding. Every recorded verdict says who answered it\n(\\`answered_by: runner | external-runner | agent\\`), so a reviewer can tell a\ngreen run from somebody's word.\n\n**A cross-service feature is verified once per service, and the form matters.**\nThe claims of one feature belong to several services, and each service's code\nlives in its own repository — so the recording form is federated:\n\n\\`\\`\\`sh\n# in EACH affected service's own repo, not in the docs repo:\nloam verify FEAT-101 --service payment-service --results report.json --record answers.json\n# with an API contract suite, its report answers the api.exposes claims too:\nloam verify FEAT-101 --service payment-service --results report.json --contract-results contract.json --record answers.json\n\\`\\`\\`\n\n\\`--service <id>\\` narrows the checklist to that service's claims and binds the\nanswers to this repository's commit, producing that service's **attestation**\nas a file of its own, \\`features/<FEAT>/verification/<id>.yaml\\`. The directory\nis the record: loam adds the files up when it reads, and the verdict and\ncounts are computed from them, never stored. Re-running it in the next repo\nwrites that repo's file and touches no other — which is why two teams'\nattestations on two docs-repo branches merge cleanly, where one shared file\nconflicted every time. A one-file federated \\`verification.yaml\\` written\nbefore the directory is still read; a service that records again supersedes\nits share of it, and the file goes once every service it names has its own.\nOmitting\n\\`--service\\` in a repo whose \\`loam.json\\` declares one substitutes it, so the\nshort form is safe there; a \\`--service\\` naming a service this repo does not\ndeclare is refused (\\`service-mismatch\\`), and \\`--service\\` from a repo that\ndeclares none is refused (\\`repository-unavailable\\`) — an attestation has to be\nbound to the code it is about.\n\n⚠ **The legacy all-at-once form \\`loam verify <FEAT> --record answers.json\\` with\nno \\`--service\\` writes the whole record from one place.** Over a record that\nalready carries other services' attestations it is refused outright\n(\\`record-federated\\`, naming the attestors) rather than merged or migrated — the\nalternative was one repo silently erasing nine others' evidence. Use it only for\na single-service feature that has never been recorded federated. A record file\nthat exists but cannot be read — broken YAML, git conflict markers, a miscount\n— is \\`record-unreadable\\`: it is never overwritten and never reported as \"no\nrecord\", and the message names the file and the repair that is safe for it. A\nservice's own \\`verification/<id>.yaml\\` holds only that service's word, so that\nservice may delete it and record again; the one-file \\`verification.yaml\\` may\nhold other services' attestations, so it is restored from version control\n(after a merge, the copy on the branch you merged into) and never deleted.\n\nReading is not writing: \\`loam verify <FEAT> --service <id>\\` **without**\n\\`--record\\` is a pure lens on the checklist. A read-only verify checklist needs no\nbinding and works from the docs repo, or from anywhere else — the refusals above\nare about WRITING an attestation, and only about that. Every run lists all\nsubjects in \\`services\\`, and a recorded run reports in \\`discarded\\` every previous\nanswer the new record does not carry.\n\nIt refuses an answer set that does not answer the current checklist: an id that\nis not on it (\\`answers-mismatch\\`), a claim with no answer (same), or a\n\\`confirmed\\` with no evidence (\\`answers-unevidenced\\`). Evidence is \\`file:line\\`.\nA claim you cannot show is \\`unconfirmed\\` with a note saying why — that is a\nsuccessful record, and it is more useful to the next reader than a yes.\n\n**Nothing gates on it.** \\`loam archive\\` will ship an unverified feature. That\nis deliberate: coherence is something loam computed from the documents, and a\nverdict is your word about code loam never read. A gate in front of shipping\nwould only teach everyone that the cheapest way past it is to say yes. The\nrecord is for the reviewer who comes later, so leave it true.\n`,\n};\n"]}
@@ -0,0 +1,253 @@
1
+ export const LOAM_DRAWING = {
2
+ name: "loam-drawing",
3
+ description: "Reference: drawing the map so a person can read it — relationship kinds and which way each arrow points, the legend, overview views",
4
+ // A reference page takes no arguments: see ../spine.ts for why the hint is
5
+ // empty rather than a spelled-out "<none>".
6
+ argumentHint: "",
7
+ purpose: "How to draw the C4 model so the picture reads: one relationship kind per kind of traffic and an arrow only where evidence gives one, a legend drawn from real edges, and overview views that each answer one question at one altitude.",
8
+ invocation: "loam instructions loam-drawing",
9
+ placeholders: [],
10
+ spine: [
11
+ "Which way an arrow points — the relationship kinds",
12
+ "The legend",
13
+ "Overview views that read",
14
+ "A feature's message flows",
15
+ ],
16
+ body: `Drawing the fleet so that a person can read it: one relationship kind per kind of traffic, an arrow only where evidence gives one, a legend, and overview views that each answer one question.
17
+
18
+ Nothing on this page is graded. loam reads elements and relationships, never a
19
+ view, and no check reads a relationship's kind — so a map can validate clean
20
+ and still be a wall of tiny boxes joined by gray lines. Every spelling below was
21
+ measured at the LikeC4 1.59.2 pin loam ships.
22
+
23
+ ## Which way an arrow points — the relationship kinds
24
+
25
+ A plain \`->\` says only that two things are connected. A fleet drawn from
26
+ deployment configuration, which says nothing more than that, ends with every
27
+ arrow pointing into the broker and the stores. So give every relationship ONE
28
+ kind, and give each kind one meaning:
29
+
30
+ - \`publishes\` — producer \`->\` topic, with \`metadata { publishes '<message>' }\`:
31
+ the producer puts the message on the topic.
32
+ - \`delivers\` — topic \`->\` consumer, with \`metadata { consumes '<message>' }\`:
33
+ the broker hands the message to the consumer.
34
+ - \`reads\` — service \`->\` store, its head drawn at the SERVICE end (a tail
35
+ arrow): data flows out of the store into the service.
36
+ - \`writes\` — service \`->\` store, its head at the store: data lands in the store.
37
+ - \`readsWrites\` — service \`->\` store, heads at both ends: both.
38
+ - \`calls\` — caller \`->\` provider, with \`metadata { op '<operationId>' }\`: a
39
+ synchronous request.
40
+ - \`connects\` — gray, dashed, no arrowhead: a connection whose direction nobody
41
+ has established yet.
42
+
43
+ For the store kinds the arrowhead is where the data lands, and putting it there
44
+ is the style's job, never the arrow's: a store edge is ALWAYS written
45
+ service \`->\` store, and a read gets its head at the service end from the
46
+ \`reads\` style. Never flip a store edge to show a read. \`Covers:\` names an
47
+ edge as \`a -> b\`, review order reads a plain edge's source as depending on its
48
+ target, and the consumer census behind \`landscape.datastore-shared\` reads both
49
+ directions only for an element whose kind is \`database\`, \`queue\`, \`topic\`,
50
+ \`cache\` or \`bucket\` — a store drawn as any other kind has a service for a
51
+ consumer only when the store is the edge's TARGET. SCHEMA.md, "Which way an edge
52
+ points", lists every reader.
53
+
54
+ **Never guess a direction.** Give an edge a direction only from evidence:
55
+
56
+ - the service's code: the client that sends, the listener that receives, the
57
+ repository that writes;
58
+ - a configuration name that says which side the service is on —
59
+ \`*_PRODUCER_*\`, \`*_CONSUMER_*\`, a consumer-group id;
60
+ - the service's own \`asyncapi.yaml\`: \`action: send\` publishes,
61
+ \`action: receive\` consumes.
62
+
63
+ Configuration that lists a broker address or a database URL says only that the
64
+ two are connected: draw that as \`connects\`. A \`connects\` edge is an honest
65
+ placeholder, not a defect, and adopting the service from its code is what turns
66
+ it into a real kind (\`loam instructions loam-adopt <id>\`, step 3). A guessed
67
+ \`publishes\` is worse than a \`connects\`: it reads exactly like a right one, it
68
+ binds the event spine, and nobody goes back to check it.
69
+
70
+ Declare the kinds once, in \`architecture/landscape.likec4\`'s own
71
+ \`specification\` block, where every extending model borrows them:
72
+
73
+ specification {
74
+ relationship publishes {
75
+ color amber
76
+ line solid
77
+ head normal
78
+ }
79
+ relationship delivers {
80
+ color amber
81
+ line solid
82
+ head normal
83
+ }
84
+ relationship reads {
85
+ color green
86
+ head none
87
+ tail normal
88
+ }
89
+ relationship writes {
90
+ color green
91
+ head normal
92
+ }
93
+ relationship readsWrites {
94
+ color green
95
+ head normal
96
+ tail normal
97
+ }
98
+ relationship calls {
99
+ color secondary
100
+ line solid
101
+ head normal
102
+ }
103
+ relationship connects {
104
+ color gray
105
+ line dashed
106
+ head none
107
+ tail odot
108
+ }
109
+ }
110
+
111
+ Then name the kind in brackets on each edge:
112
+
113
+ marketplace.checkoutWeb -[calls]-> marketplace.orderService 'createOrder' {
114
+ metadata { op 'createOrder' }
115
+ }
116
+ marketplace.orderService -[publishes]-> kafka.orderEvents 'OrderPlaced' {
117
+ metadata { publishes 'order.OrderPlaced' }
118
+ }
119
+ kafka.orderEvents -[delivers]-> marketplace.paymentService 'OrderPlaced' {
120
+ metadata { consumes 'order.OrderPlaced' }
121
+ }
122
+ marketplace.paymentService -[reads]-> marketplace.ordersDb 'order totals'
123
+ marketplace.orderService -[connects]-> kafka 'broker address in its deployment config'
124
+
125
+ A store a service owns and nests INSIDE its own element cannot take an edge from
126
+ that element: LikeC4 refuses a relationship between a parent and its child
127
+ ("Invalid parent-child relationship"). Draw that edge from the container that
128
+ does the work, in the service's own model
129
+ (\`marketplace.orderService.api -[readsWrites]-> marketplace.orderService.db\`),
130
+ or draw the store beside the service.
131
+
132
+ A feature's \`delta.likec4\` parses on its own, so it declares every kind it
133
+ draws in its own \`specification\` block too. **The living map must declare that
134
+ kind BEFORE the feature archives.** \`loam archive\` copies the edge into
135
+ \`architecture/landscape.likec4\` as written and never copies a declaration.
136
+ When the map lacks the kind, the merged map does not parse and the archive
137
+ refuses with \`merge-failed\` ("Could not resolve reference to
138
+ RelationshipKind"), while \`loam validate --feature\` and \`loam status\` still
139
+ called the feature ready. A kind is vocabulary, not a change, so adding it to the
140
+ map's \`specification\` is an ordinary edit to the living map, made in its own
141
+ change.
142
+
143
+ Two spellings to avoid:
144
+
145
+ - **Never put a tag on a kind** (\`relationship publishes { #async }\`). LikeC4
146
+ copies a kind's tags onto every edge of that kind. A \`#<FEAT>\` there makes
147
+ every such edge in the delta part of the change, context included, and an
148
+ \`#obl-\` tag there claims the obligation for every edge of that kind. Tag the
149
+ edge instead.
150
+ - **Never use the dotted form** (\`orderService .publishes kafka.orderEvents\`).
151
+ LikeC4 reads it, but not every loam reader does: \`loam validate --base\` scans
152
+ an extending model without the map's kinds and does not see such an edge.
153
+ Write \`-[publishes]->\`.
154
+
155
+ \`connects\` carries \`tail odot\` on purpose. An edge with no arrowhead at either
156
+ end is laid out with \`constraint=false\` and \`minlen=0\`, and enough of them
157
+ collapse a view into one band. The small circle at the source keeps the edge in
158
+ the layout without claiming a direction.
159
+
160
+ The kind is the picture and the metadata is the join. \`metadata { op }\`,
161
+ \`publishes\` and \`consumes\` are what loam grades (\`loam instructions loam-spine\`).
162
+ A kind changes no grade, so a kind with no metadata beside it is a drawing that
163
+ nothing checks.
164
+
165
+ ## The legend
166
+
167
+ Add a \`legend\` view to \`architecture/landscape.likec4\` that draws ONE real
168
+ edge of each kind the map uses. Use real services, a real topic and a real store,
169
+ so that a reader learns the colours from the fleet itself. Name each edge by
170
+ both of its endpoints:
171
+
172
+ view legend {
173
+ title 'Fleet / 0 · Legend'
174
+ include marketplace.checkoutWeb -> marketplace.orderService
175
+ include marketplace.orderService -> kafka.orderEvents
176
+ include kafka.orderEvents -> marketplace.paymentService
177
+ include marketplace.paymentService -> marketplace.ordersDb
178
+ }
179
+
180
+ A view can name only elements the model declares, so the legend is written once
181
+ the map has real edges of each kind, and it gains a line when the map gains a
182
+ kind. \`loam init\` cannot scaffold one, because an empty map has nothing to draw.
183
+
184
+ ## Overview views that read
185
+
186
+ A view is a picture for one reader with one question. Every rule below comes
187
+ from an overview that drew the whole fleet and so showed nothing:
188
+
189
+ - **One question per view, at one altitude.** "Who publishes to the broker?" is
190
+ one view, and "who calls whom" is another. A fleet overview draws subsystem
191
+ boxes, not services: the generated \`architecture/subsystems.likec4\` and
192
+ \`architecture/services.likec4\` views are the drill-down. Aim for at most
193
+ about 20 nodes and 25 drawn lines.
194
+ - **Filter by ONE kind, and say it positively.** A view above service altitude
195
+ merges every relationship between two boxes into one drawn line. When those
196
+ relationships are of different kinds, LikeC4 falls back to the default gray
197
+ and the line says nothing. \`where kind is publishes\` keeps the line amber;
198
+ \`where kind is not calls\` and \`where kind is publishes or kind is connects\`
199
+ still merge into gray.
200
+ - **Know the form that draws nothing.** Where \`fleet\`'s children are subsystem
201
+ groups, \`include fleet.* -> * where kind is publishes\` renders an EMPTY view,
202
+ with no error. Use a unary form, a named target or a tag target instead:
203
+
204
+ include fleet.* -> where kind is publishes
205
+ include fleet.* -> element.tag = #broker where kind is publishes
206
+ include kafka -> fleet.* where kind is delivers
207
+ include -> fleet.* where kind is delivers
208
+
209
+ - **Prefer relationship rules to element lists.** An element included directly
210
+ brings every relationship between it and the others: \`include fleet.orders, kafka\`
211
+ draws one merged gray line, where
212
+ \`include fleet.orders -> where kind is publishes\` draws one amber line.
213
+ - **Lay out rows with \`rank\`.** \`rank source { … }\`, \`rank same { … }\` and
214
+ \`rank sink { … }\` put nodes in rows, and the braces are required. A
215
+ \`rank source\` row whose nodes' edges all point INTO them is ignored, so a row
216
+ of consumers belongs at \`sink\`.
217
+ - **Give a direction-less edge a marker.** An edge with no arrowhead at either
218
+ end is laid out unconstrained and collapses the view into one band, so give it
219
+ \`tail odot\`, as the \`connects\` style above does.
220
+ - **Titles make folders.** LikeC4 splits a title on \`/\` into browser folders
221
+ and lists sub-folders before views, so number the views you want read in
222
+ order: \`title 'Fleet / 1 · Who publishes'\`.
223
+ - **Never author \`view … of\` a subsystem or service element.** The generated
224
+ views own that drill-down, and an authored one in a file that sorts before
225
+ them — \`landscape.likec4\` does — takes the click from every other view that
226
+ draws the element.
227
+ - **No \`xs\` nodes across a whole fleet, and no \`include parent.**\` with
228
+ excludes.** Together they drew a 68-node band at 2.5 pixels per label, a view
229
+ nobody can read.
230
+
231
+ ## A feature's message flows
232
+
233
+ A feature delta draws a message the way the map does: through the broker. Write
234
+ \`orderService -[publishes]-> kafka.orderEvents\` and
235
+ \`kafka.orderEvents -[delivers]-> notificationService\`, never
236
+ \`orderService -> notificationService\` for an event. A direct edge reads as a
237
+ call, sits outside the event spine, and draws a second picture of the topic the
238
+ map already draws. Point at the topic the living map nests in the broker, leave
239
+ that context untagged, and tag only the edges the feature adds.
240
+
241
+ A producer outside the fleet is an \`#external\` element, and the edge it
242
+ publishes on carries the metadata (\`loam instructions loam-spine\`, "A message
243
+ produced outside the fleet", has the full join):
244
+
245
+ crm = softwareSystem 'crm' {
246
+ #external
247
+ }
248
+ crm -[publishes]-> kafka.crmEvents 'CustomerUpdated' {
249
+ metadata { publishes 'crm.CustomerUpdated' }
250
+ }
251
+ `,
252
+ };
253
+ //# sourceMappingURL=drawing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawing.js","sourceRoot":"","sources":["../../../../../../src/core/agent/workflows/reference/drawing/drawing.ts"],"names":[],"mappings":"AA6BA,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,qIAAqI;IACvI,2EAA2E;IAC3E,4CAA4C;IAC5C,YAAY,EAAE,EAAE;IAChB,OAAO,EACL,wOAAwO;IAC1O,UAAU,EAAE,gCAAgC;IAC5C,YAAY,EAAE,EAAE;IAChB,KAAK,EAAE;QACL,oDAAoD;QACpD,YAAY;QACZ,0BAA0B;QAC1B,2BAA2B;KAC5B;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2OP;CACA,CAAC","sourcesContent":["/**\n * The `loam-drawing` reference page: how to draw the C4 model so that a person\n * can read the picture — one relationship kind per kind of traffic, an arrow\n * that points where the evidence says, a legend, and overview views that each\n * answer one question.\n *\n * WHY A PAGE. A large real fleet was drawn by agents following loam's pages,\n * and every document validated while the pictures were unreadable: every arrow\n * pointed into the broker and the stores (deployment configuration says only\n * that two things are connected, and the agents turned that into a direction),\n * the overview views were walls of tiny boxes, and the lines were the default\n * gray because LikeC4 merges relationships of different kinds into one line\n * with no style. Nothing loam grades could have caught any of it — loam reads\n * elements and relationships and never a view, and no check reads a\n * relationship's KIND — so the only place the lesson can live is the text an\n * agent reads before it draws. That text is consulted at a moment the agent\n * can name (\"I am drawing an edge\", \"I am writing a view\"), which is the split\n * rule in ../reference.ts: a reference page, not AGENTS.md.\n *\n * WHY ITS OWN PACKAGE. ../ sits at the five-file cap, and this page is a\n * subject of its own rather than a section of an existing one: loam-spine says\n * which joins the metadata makes, and this page says how the picture is drawn\n * around them. Every LikeC4 spelling below was measured at the 1.59.2 pin\n * (`likec4 validate`, `export json`, `gen dot`) on a neutral fleet shaped like\n * examples/docs — never on the fleet the lesson came from, which is\n * confidential and must not reach this repository in any form.\n */\nimport type { CommandContent } from \"../../../contract.js\";\n\nexport const LOAM_DRAWING: CommandContent = {\n name: \"loam-drawing\",\n description:\n \"Reference: drawing the map so a person can read it — relationship kinds and which way each arrow points, the legend, overview views\",\n // A reference page takes no arguments: see ../spine.ts for why the hint is\n // empty rather than a spelled-out \"<none>\".\n argumentHint: \"\",\n purpose:\n \"How to draw the C4 model so the picture reads: one relationship kind per kind of traffic and an arrow only where evidence gives one, a legend drawn from real edges, and overview views that each answer one question at one altitude.\",\n invocation: \"loam instructions loam-drawing\",\n placeholders: [],\n spine: [\n \"Which way an arrow points — the relationship kinds\",\n \"The legend\",\n \"Overview views that read\",\n \"A feature's message flows\",\n ],\n body: `Drawing the fleet so that a person can read it: one relationship kind per kind of traffic, an arrow only where evidence gives one, a legend, and overview views that each answer one question.\n\nNothing on this page is graded. loam reads elements and relationships, never a\nview, and no check reads a relationship's kind — so a map can validate clean\nand still be a wall of tiny boxes joined by gray lines. Every spelling below was\nmeasured at the LikeC4 1.59.2 pin loam ships.\n\n## Which way an arrow points — the relationship kinds\n\nA plain \\`->\\` says only that two things are connected. A fleet drawn from\ndeployment configuration, which says nothing more than that, ends with every\narrow pointing into the broker and the stores. So give every relationship ONE\nkind, and give each kind one meaning:\n\n- \\`publishes\\` — producer \\`->\\` topic, with \\`metadata { publishes '<message>' }\\`:\n the producer puts the message on the topic.\n- \\`delivers\\` — topic \\`->\\` consumer, with \\`metadata { consumes '<message>' }\\`:\n the broker hands the message to the consumer.\n- \\`reads\\` — service \\`->\\` store, its head drawn at the SERVICE end (a tail\n arrow): data flows out of the store into the service.\n- \\`writes\\` — service \\`->\\` store, its head at the store: data lands in the store.\n- \\`readsWrites\\` — service \\`->\\` store, heads at both ends: both.\n- \\`calls\\` — caller \\`->\\` provider, with \\`metadata { op '<operationId>' }\\`: a\n synchronous request.\n- \\`connects\\` — gray, dashed, no arrowhead: a connection whose direction nobody\n has established yet.\n\nFor the store kinds the arrowhead is where the data lands, and putting it there\nis the style's job, never the arrow's: a store edge is ALWAYS written\nservice \\`->\\` store, and a read gets its head at the service end from the\n\\`reads\\` style. Never flip a store edge to show a read. \\`Covers:\\` names an\nedge as \\`a -> b\\`, review order reads a plain edge's source as depending on its\ntarget, and the consumer census behind \\`landscape.datastore-shared\\` reads both\ndirections only for an element whose kind is \\`database\\`, \\`queue\\`, \\`topic\\`,\n\\`cache\\` or \\`bucket\\` — a store drawn as any other kind has a service for a\nconsumer only when the store is the edge's TARGET. SCHEMA.md, \"Which way an edge\npoints\", lists every reader.\n\n**Never guess a direction.** Give an edge a direction only from evidence:\n\n- the service's code: the client that sends, the listener that receives, the\n repository that writes;\n- a configuration name that says which side the service is on —\n \\`*_PRODUCER_*\\`, \\`*_CONSUMER_*\\`, a consumer-group id;\n- the service's own \\`asyncapi.yaml\\`: \\`action: send\\` publishes,\n \\`action: receive\\` consumes.\n\nConfiguration that lists a broker address or a database URL says only that the\ntwo are connected: draw that as \\`connects\\`. A \\`connects\\` edge is an honest\nplaceholder, not a defect, and adopting the service from its code is what turns\nit into a real kind (\\`loam instructions loam-adopt <id>\\`, step 3). A guessed\n\\`publishes\\` is worse than a \\`connects\\`: it reads exactly like a right one, it\nbinds the event spine, and nobody goes back to check it.\n\nDeclare the kinds once, in \\`architecture/landscape.likec4\\`'s own\n\\`specification\\` block, where every extending model borrows them:\n\n specification {\n relationship publishes {\n color amber\n line solid\n head normal\n }\n relationship delivers {\n color amber\n line solid\n head normal\n }\n relationship reads {\n color green\n head none\n tail normal\n }\n relationship writes {\n color green\n head normal\n }\n relationship readsWrites {\n color green\n head normal\n tail normal\n }\n relationship calls {\n color secondary\n line solid\n head normal\n }\n relationship connects {\n color gray\n line dashed\n head none\n tail odot\n }\n }\n\nThen name the kind in brackets on each edge:\n\n marketplace.checkoutWeb -[calls]-> marketplace.orderService 'createOrder' {\n metadata { op 'createOrder' }\n }\n marketplace.orderService -[publishes]-> kafka.orderEvents 'OrderPlaced' {\n metadata { publishes 'order.OrderPlaced' }\n }\n kafka.orderEvents -[delivers]-> marketplace.paymentService 'OrderPlaced' {\n metadata { consumes 'order.OrderPlaced' }\n }\n marketplace.paymentService -[reads]-> marketplace.ordersDb 'order totals'\n marketplace.orderService -[connects]-> kafka 'broker address in its deployment config'\n\nA store a service owns and nests INSIDE its own element cannot take an edge from\nthat element: LikeC4 refuses a relationship between a parent and its child\n(\"Invalid parent-child relationship\"). Draw that edge from the container that\ndoes the work, in the service's own model\n(\\`marketplace.orderService.api -[readsWrites]-> marketplace.orderService.db\\`),\nor draw the store beside the service.\n\nA feature's \\`delta.likec4\\` parses on its own, so it declares every kind it\ndraws in its own \\`specification\\` block too. **The living map must declare that\nkind BEFORE the feature archives.** \\`loam archive\\` copies the edge into\n\\`architecture/landscape.likec4\\` as written and never copies a declaration.\nWhen the map lacks the kind, the merged map does not parse and the archive\nrefuses with \\`merge-failed\\` (\"Could not resolve reference to\nRelationshipKind\"), while \\`loam validate --feature\\` and \\`loam status\\` still\ncalled the feature ready. A kind is vocabulary, not a change, so adding it to the\nmap's \\`specification\\` is an ordinary edit to the living map, made in its own\nchange.\n\nTwo spellings to avoid:\n\n- **Never put a tag on a kind** (\\`relationship publishes { #async }\\`). LikeC4\n copies a kind's tags onto every edge of that kind. A \\`#<FEAT>\\` there makes\n every such edge in the delta part of the change, context included, and an\n \\`#obl-\\` tag there claims the obligation for every edge of that kind. Tag the\n edge instead.\n- **Never use the dotted form** (\\`orderService .publishes kafka.orderEvents\\`).\n LikeC4 reads it, but not every loam reader does: \\`loam validate --base\\` scans\n an extending model without the map's kinds and does not see such an edge.\n Write \\`-[publishes]->\\`.\n\n\\`connects\\` carries \\`tail odot\\` on purpose. An edge with no arrowhead at either\nend is laid out with \\`constraint=false\\` and \\`minlen=0\\`, and enough of them\ncollapse a view into one band. The small circle at the source keeps the edge in\nthe layout without claiming a direction.\n\nThe kind is the picture and the metadata is the join. \\`metadata { op }\\`,\n\\`publishes\\` and \\`consumes\\` are what loam grades (\\`loam instructions loam-spine\\`).\nA kind changes no grade, so a kind with no metadata beside it is a drawing that\nnothing checks.\n\n## The legend\n\nAdd a \\`legend\\` view to \\`architecture/landscape.likec4\\` that draws ONE real\nedge of each kind the map uses. Use real services, a real topic and a real store,\nso that a reader learns the colours from the fleet itself. Name each edge by\nboth of its endpoints:\n\n view legend {\n title 'Fleet / 0 · Legend'\n include marketplace.checkoutWeb -> marketplace.orderService\n include marketplace.orderService -> kafka.orderEvents\n include kafka.orderEvents -> marketplace.paymentService\n include marketplace.paymentService -> marketplace.ordersDb\n }\n\nA view can name only elements the model declares, so the legend is written once\nthe map has real edges of each kind, and it gains a line when the map gains a\nkind. \\`loam init\\` cannot scaffold one, because an empty map has nothing to draw.\n\n## Overview views that read\n\nA view is a picture for one reader with one question. Every rule below comes\nfrom an overview that drew the whole fleet and so showed nothing:\n\n- **One question per view, at one altitude.** \"Who publishes to the broker?\" is\n one view, and \"who calls whom\" is another. A fleet overview draws subsystem\n boxes, not services: the generated \\`architecture/subsystems.likec4\\` and\n \\`architecture/services.likec4\\` views are the drill-down. Aim for at most\n about 20 nodes and 25 drawn lines.\n- **Filter by ONE kind, and say it positively.** A view above service altitude\n merges every relationship between two boxes into one drawn line. When those\n relationships are of different kinds, LikeC4 falls back to the default gray\n and the line says nothing. \\`where kind is publishes\\` keeps the line amber;\n \\`where kind is not calls\\` and \\`where kind is publishes or kind is connects\\`\n still merge into gray.\n- **Know the form that draws nothing.** Where \\`fleet\\`'s children are subsystem\n groups, \\`include fleet.* -> * where kind is publishes\\` renders an EMPTY view,\n with no error. Use a unary form, a named target or a tag target instead:\n\n include fleet.* -> where kind is publishes\n include fleet.* -> element.tag = #broker where kind is publishes\n include kafka -> fleet.* where kind is delivers\n include -> fleet.* where kind is delivers\n\n- **Prefer relationship rules to element lists.** An element included directly\n brings every relationship between it and the others: \\`include fleet.orders, kafka\\`\n draws one merged gray line, where\n \\`include fleet.orders -> where kind is publishes\\` draws one amber line.\n- **Lay out rows with \\`rank\\`.** \\`rank source { … }\\`, \\`rank same { … }\\` and\n \\`rank sink { … }\\` put nodes in rows, and the braces are required. A\n \\`rank source\\` row whose nodes' edges all point INTO them is ignored, so a row\n of consumers belongs at \\`sink\\`.\n- **Give a direction-less edge a marker.** An edge with no arrowhead at either\n end is laid out unconstrained and collapses the view into one band, so give it\n \\`tail odot\\`, as the \\`connects\\` style above does.\n- **Titles make folders.** LikeC4 splits a title on \\`/\\` into browser folders\n and lists sub-folders before views, so number the views you want read in\n order: \\`title 'Fleet / 1 · Who publishes'\\`.\n- **Never author \\`view … of\\` a subsystem or service element.** The generated\n views own that drill-down, and an authored one in a file that sorts before\n them — \\`landscape.likec4\\` does — takes the click from every other view that\n draws the element.\n- **No \\`xs\\` nodes across a whole fleet, and no \\`include parent.**\\` with\n excludes.** Together they drew a 68-node band at 2.5 pixels per label, a view\n nobody can read.\n\n## A feature's message flows\n\nA feature delta draws a message the way the map does: through the broker. Write\n\\`orderService -[publishes]-> kafka.orderEvents\\` and\n\\`kafka.orderEvents -[delivers]-> notificationService\\`, never\n\\`orderService -> notificationService\\` for an event. A direct edge reads as a\ncall, sits outside the event spine, and draws a second picture of the topic the\nmap already draws. Point at the topic the living map nests in the broker, leave\nthat context untagged, and tag only the edges the feature adds.\n\nA producer outside the fleet is an \\`#external\\` element, and the edge it\npublishes on carries the metadata (\\`loam instructions loam-spine\\`, \"A message\nproduced outside the fleet\", has the full join):\n\n crm = softwareSystem 'crm' {\n #external\n }\n crm -[publishes]-> kafka.crmEvents 'CustomerUpdated' {\n metadata { publishes 'crm.CustomerUpdated' }\n }\n`,\n};\n"]}
@@ -0,0 +1,19 @@
1
+ import { LOAM_AUTHORING } from "./authoring.js";
2
+ import { LOAM_CODES } from "./codes.js";
3
+ import { LOAM_DONE_CHECK } from "./done-check.js";
4
+ import { LOAM_DRAWING } from "./drawing/drawing.js";
5
+ import { LOAM_SPINE } from "./spine.js";
6
+ /**
7
+ * The five pages, in the order AGENTS.md's own index names them. The first four
8
+ * stand in the order their sections stood in the document they left, so a
9
+ * reader who knew the file finds them where they were. The drawing page comes
10
+ * last because it never stood there.
11
+ */
12
+ export const REFERENCES = [
13
+ LOAM_CODES,
14
+ LOAM_SPINE,
15
+ LOAM_AUTHORING,
16
+ LOAM_DONE_CHECK,
17
+ LOAM_DRAWING,
18
+ ];
19
+ //# sourceMappingURL=reference.js.map