@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
package/ROADMAP.md ADDED
@@ -0,0 +1,1035 @@
1
+ # Roadmap
2
+
3
+ _Assessed 2026-09-03._
4
+
5
+ This is loam's canonical improvement sequence. It records priorities and exit criteria, not delivery
6
+ dates. An item is complete only when its exit criteria are supported by repeatable evidence; moving
7
+ an item between sections is a product decision, not a wording change.
8
+
9
+ The compatibility boundary remains the one in
10
+ [AGENTS.md](https://github.com/ybotok/loam/blob/main/AGENTS.md): command names and flags, exit
11
+ codes, the JSON envelope, and stable finding codes are public contracts. An improvement that changes
12
+ one of them needs an explicit compatibility decision and a user-visible CHANGELOG entry.
13
+
14
+ ## Current assessment
15
+
16
+ loam is a credible beta with a differentiated core: architecture, requirements, contracts, generated
17
+ acceptance tests, and implementation evidence remain ordinary files in repositories rather than
18
+ state inside a service. The CLI is small enough to audit, and every writer — not only archive — now
19
+ commits through a locked, journaled transaction that a crash cannot leave half-applied.
20
+
21
+ The tree contains **531 TypeScript modules in 166 source packages**, with an acyclic package graph
22
+ checked by
23
+ [scripts/package-graph.mjs](https://github.com/ybotok/loam/blob/main/scripts/package-graph.mjs). The
24
+ CLI exposes **30 commands** from [src/cli.ts](https://github.com/ybotok/loam/blob/main/src/cli.ts),
25
+ and the suite stands at **205 test files**. Those four counts are deliberately stated OUTSIDE the
26
+ dated snapshot below: each derives from the tree in one readdir, so
27
+ [test/docs-facts.test.ts](https://github.com/ybotok/loam/blob/main/test/docs-facts.test.ts) grades
28
+ them live and this paragraph cannot quietly trail the code the way its predecessor did.
29
+
30
+ _Measured 2026-09-07 at `0.2.0-alpha.7`, and dated because neither number has a cheap derivation:_
31
+ lint, typecheck, `npm run arch:check` and `npm run meta:check` green; `npm test` passing
32
+ **3,802/3,802 tests**, with two `skipIf(asRoot)` cases the root gate container cannot run; the
33
+ coverage gate passing with **92.88% statements, 84.83% branches, 97.14% functions, and 94.70%
34
+ lines** against its thresholds of 91 / 82 / 95 / 93; and `npm run release:check` plus
35
+ `npm run test:package` green against the real tarball.
36
+
37
+ Most of that qualification is now closed by observation rather than by code. Measured 2026-09-03 on
38
+ pushed commits: `ci` at `1de7c97` green — `test` on Node 22.22.3 and 24, and the installed-package
39
+ `package` job on ubuntu (both Node lines) and windows — and the `release` workflow on tag
40
+ `v0.2.0-alpha.4` green end to end, `release-gate` (lint, typecheck, coverage, the packed candidate,
41
+ the smoke of that exact candidate, `release:check`) followed by `publish`, which put the tarball on
42
+ npm under the `alpha` dist-tag. What is left is one job: `stability` is SKIPPED on a push — it runs
43
+ on the weekly schedule and on dispatch — so it is still release evidence to collect, even though the
44
+ gate-stress proof passes locally. The runner class recorded on 2026-08-18 is
45
+ still the reading to apply to a red of that shape: a restricted filesystem sandbox that denies `tsx`
46
+ its local IPC socket fails only the
47
+ [test/cli-entry.test.ts](https://github.com/ybotok/loam/blob/main/test/cli-entry.test.ts) cases with
48
+ `listen EPERM` — a runner restriction, not a CLI behavior failure — and a sandbox that denies tmpdir
49
+ writes is the class under which `validate --all`'s batched parse degrades to per-document speed
50
+ without changing a finding.
51
+
52
+ The strongest foundations to preserve are:
53
+
54
+ - **Durable, inspectable source of truth.** The product still has no server, database, or runtime
55
+ network dependency. Its document contract is described in [SCHEMA.md](SCHEMA.md), and only three
56
+ packages are runtime dependencies in [package.json](package.json).
57
+ - **Explicit machine contracts.** The versioned JSON envelope and stable error codes live in
58
+ [src/core/envelope/json.ts](https://github.com/ybotok/loam/blob/main/src/core/envelope/json.ts);
59
+ issue severity, archive gating, and override semantics remain separate in
60
+ [src/core/vocabulary/issue.ts](https://github.com/ybotok/loam/blob/main/src/core/vocabulary/issue.ts).
61
+ [test/codes-drift.test.ts](https://github.com/ybotok/loam/blob/main/test/codes-drift.test.ts) and
62
+ [test/agent-commands-runnable.test.ts](https://github.com/ybotok/loam/blob/main/test/agent-commands-runnable.test.ts)
63
+ protect what agents branch on and what loam tells them to run, and
64
+ [test/docs-facts.test.ts](https://github.com/ybotok/loam/blob/main/test/docs-facts.test.ts) plus
65
+ [test/package-docs.test.ts](https://github.com/ybotok/loam/blob/main/test/package-docs.test.ts)
66
+ hold the shipped prose to the same standard: counted facts derive or carry a date, named codes are
67
+ codes loam emits, links resolve from the tarball, and every documented gap has its owner in this
68
+ file.
69
+ - **One transactional write path.** Archive and unarchive keep their snapshot-backed path across
70
+ [src/commands/archive/run.ts](https://github.com/ybotok/loam/blob/main/src/commands/archive/run.ts)
71
+ and [src/core/staging/](https://github.com/ybotok/loam/tree/main/src/core/staging); every other
72
+ multi-file writer — `new`, `gherkin`, `rebase`, `vouch`, `subsystem move` and `sync` — commits
73
+ through the smaller journaled transaction in
74
+ [src/core/staging/txn/](https://github.com/ybotok/loam/tree/main/src/core/staging/txn), whose
75
+ staged bytes are durable beside their targets so recovery rolls forward, and the verification
76
+ record commits under the same docs lock with a byte-level compare-and-swap. `validate` and
77
+ `doctor` report an interrupted commit until recovery succeeds. This is the model for any future
78
+ writer, not a subsystem to replace.
79
+ - **Path, identity and provenance discipline.** Lexical and real-path containment are centralized in
80
+ [src/core/kernel/path-safety.ts](https://github.com/ybotok/loam/blob/main/src/core/kernel/path-safety.ts);
81
+ validated ids and directories carry branded types constructible only in
82
+ [src/core/kernel/ids/](https://github.com/ybotok/loam/tree/main/src/core/kernel/ids) and consumed
83
+ through [src/core/repo/paths.ts](https://github.com/ybotok/loam/blob/main/src/core/repo/paths.ts),
84
+ with the casts contained by the architecture gate. Verification distinguishes an agent attestation
85
+ from digest-matched test evidence through
86
+ [src/core/verify/](https://github.com/ybotok/loam/tree/main/src/core/verify) and the verification
87
+ record defined in [SCHEMA.md](SCHEMA.md).
88
+ - **Executable architecture.** `npm run arch:check`
89
+ ([scripts/arch-check.mjs](https://github.com/ybotok/loam/blob/main/scripts/arch-check.mjs)) proves
90
+ every invariant [docs/DESIGN.md](https://github.com/ybotok/loam/blob/main/docs/DESIGN.md) and
91
+ [docs/CODE-STYLE.md](https://github.com/ybotok/loam/blob/main/docs/CODE-STYLE.md) state — import
92
+ cycles, the package graph, the core→commands ban, the barrel ban, the console/process boundary,
93
+ child-process bounds, brand-cast containment — each with a negative self-test in
94
+ [test/arch-gate.test.ts](https://github.com/ybotok/loam/blob/main/test/arch-gate.test.ts); the
95
+ 400-line / four-parameter / five-file limits hold with an empty baseline in
96
+ [test/code-limits.test.ts](https://github.com/ybotok/loam/blob/main/test/code-limits.test.ts);
97
+ coverage thresholds are explicit in
98
+ [vitest.config.ts](https://github.com/ybotok/loam/blob/main/vitest.config.ts); and
99
+ [scripts/gate-stress.mjs](https://github.com/ybotok/loam/blob/main/scripts/gate-stress.mjs) makes
100
+ gate stability a classified measurement rather than an impression.
101
+
102
+ ## Now
103
+
104
+ Nothing is queued behind code. Every integrity, enforcement and lifecycle item that preceded this
105
+ has landed (see [Recently landed](#recently-landed)) — the authored business axis, the use-case
106
+ axis, and as of 2026-09-02 the deployment axis, which is the first item this file ever wrote
107
+ directly into this section rather than promoting from [Later](#later--promote-only-from-evidence).
108
+
109
+ ### Release evidence — one job left
110
+
111
+ What is left is the one thing this file cannot close by writing code, and it stays where it is
112
+ rather than being promoted for the shape of it. The installed-package half closed on 2026-09-03:
113
+ the `package` job ran green on a pushed commit across three runner/Node combinations, and the whole
114
+ publication path ran green on tag `v0.2.0-alpha.4`. The CI `stability` job has still to be OBSERVED
115
+ green — it is skipped on a push and runs on the weekly schedule — so it is still release evidence to
116
+ collect, not an improvement to make. `workflow_dispatch` is the way to collect it deliberately
117
+ rather than waiting for Monday.
118
+
119
+ An item returns to this section from [Later](#later--promote-only-from-evidence) when fleet evidence
120
+ names its operator, repeated task, failure mode, frequency, current workaround and measurable
121
+ acceptance criterion — never because this section is empty. An empty `## Now` is a true statement
122
+ about the backlog, and filling it from the candidate list to avoid the appearance of one would be
123
+ exactly the invented need the non-goals forbid.
124
+
125
+ ## Recently landed
126
+
127
+ Closed since the 2026-08-18 assessment, each with the commit or commit range that landed it on
128
+ `main`. [CHANGELOG.md](CHANGELOG.md) is the user-facing record; the full item texts — required
129
+ changes, exit criteria, and what each review surfaced — are in this file's history (`git show
130
+ 5cd3942:ROADMAP.md`). The four 2026-09-03 problem-report entries that follow — the extending model
131
+ and the report ordinal, the pair opening the 2026-09-04 group — landed together in `f751909`, one
132
+ change built as four disjoint workstreams and gated as one; the three before them — the edgeless
133
+ brief, the intra-service use case, and the styling paragraph under the generated views — landed
134
+ together in `0eaa101` the same way.
135
+
136
+ #### The work packet — the verify checklist read forwards
137
+
138
+ **Landed 2026-09-21.** loam could already say what a feature PROMISES (`loam verify`'s checklist)
139
+ and what to BUILD (`loam delta`), and nothing joined the two into the question an agent actually
140
+ opens a session with: which promise is still open, at which step, and what fact closes it. The
141
+ artifact a team reaches for to answer it is a `tasks.md` — the one document this project refuses,
142
+ because a task list authored beside a spec is a second mutable state that drifts the moment the
143
+ spec moves. That refusal (SCHEMA's "Deliberate limits of the workflow surface") is unchanged; what
144
+ this item settles is that the question was never the problem, only the file.
145
+
146
+ **What landed.** A read-only `loam tasks <FEAT> [--service <id>] [--next] [--json]`, and a
147
+ `loam_tasks` MCP tool beside it, projecting one work unit per verify-checklist claim under the
148
+ claim's own id — so the thing to do and the answer that closes it are one identity — plus a unit
149
+ of kind requirement.described for an ADDED or MODIFIED requirement with no scenario at all. Each
150
+ unit reports the step it waits on in `at` (`describe`, `generate`, `implement`, `attested`), and a
151
+ unit is retired by exactly one fact: a claim recorded `confirmed` in a `verification.yaml` that is
152
+ not stale against the current checklist. An agent-attested scenario deliberately stays on the list
153
+ at `attested`. `frontier` is the first ten open units, providers before consumers on the exact token
154
+ join and never on prose, and the order is advice rather than a lock; `--next` is the single leaf
155
+ packet — scenario verbatim, digest, the check that closes it, the follow-up command — that an
156
+ orchestrator hands one coding agent. Nothing is written to disk on any path, and no stable code was
157
+ minted: every fact in the payload is a projection of state other commands already grade. CHANGELOG
158
+ has every flag and payload key; SCHEMA's "The same checklist read forwards" has the unit model and
159
+ the done rule.
160
+
161
+ **Deliberately NOT built, each with its reason.** None of these is a gap nobody noticed.
162
+
163
+ - **`--results` refinement against a live red/green run** — it needs the report readers re-exposed
164
+ read-only, which is a seam rather than a flag.
165
+ - **A status rung for tasks in `loam status`'s `next[]`** — that is a new stable `next.*` code, and
166
+ minting one is a separate decision on a frozen surface.
167
+ - **Removal-direction units** — a retirement's consumers are answered in prose by the consumer
168
+ scans today, and a unit would be a second account of the same walk.
169
+ - **Obligation-coverage units** — `covers()` never checks that a scenario exists, so a unit derived
170
+ from an obligation would assert work nothing grades.
171
+ - **A `size.phrasesOwed` figure from `loam steps`** — the step inventory is a report about a
172
+ service's whole suite, not about one feature's units, and joining them would put a fleet-wide
173
+ number inside a per-feature packet.
174
+ - **A Jira (or any tracker) export protocol** — that is an agent workflow over `--json` and stays
175
+ one: an HTTP call from loam is the network dependency the product does not have.
176
+
177
+ **Exit criteria**, each answerable by one run rather than by a reading: a unit leaves the list only
178
+ when a confirmed claim in a non-stale record retires it, and an attested scenario is still on the
179
+ list at `attested`; the frontier's provider-before-consumer order comes from the exact operation
180
+ token join and from nowhere else; and a run writes no byte and mints no code, so the projection
181
+ cannot be behind the documents it projected.
182
+
183
+ #### One model, many documents — a service model may extend the fleet map
184
+
185
+ **Landed 2026-09-04** in `f751909`, from three problem reports that turned out to be one cause,
186
+ with a fourth landing beside it in the same change. #010 measured the cause: a service model must
187
+ parse alone, so it re-declares its own `specification` and every partner it names — 78 double
188
+ declarations in a 56-service fleet with four services adopted, projected to ~448 at full adoption —
189
+ and the copies had already diverged, `#platform` missing from every copy of the broker and the
190
+ identity provider but the map's, with no finding code for "two documents describe one element
191
+ differently" because no check read two documents together. #009 measured the symptom: 57 flat
192
+ entries in the renderer's project picker, 52 of them a single box, forced by the per-service
193
+ project file `0.2.0-alpha.5` had to write **because** the models could not share a project. #011 is
194
+ the structural proposal, every claim of it executed against copies of `examples/docs`: `extend`
195
+ resolves across documents of one project, a model rewritten that way makes its containers visible
196
+ in the fleet project with one copy of the broker in the whole model, and deleting a model's
197
+ `specification` under the old loader is eleven `c4.invalid` errors — so the change had to be
198
+ loam's, not a convention a repository could adopt. (#012, reports having no ordinal and loam never
199
+ reading `loam-reports/`, landed in the same commit and has its own entry below.)
200
+
201
+ **What landed.** The shape of a model is now read from the file's own grammar — a top-level
202
+ `specification { }` block containing an `element` declaration means STANDALONE, its absence means
203
+ EXTENDING — and each shape gets the grade the other cannot need: `c4.declaration-diverged` for a
204
+ standalone model whose copies of the map's elements disagree with it, `c4.element-unowned` for an
205
+ extending model that declares an element outside its own. Around them, the renderer wiring
206
+ `loam subsystem sync` now owns end to end (`service.likec4-config-stray`, `service.model-excluded`,
207
+ `service.model-unexcluded`, the narrowed `service.likec4-config-missing`, and the root project's
208
+ `exclude` rewritten to cover exactly the models that stand alone), and `c4.fleet-project-invalid`,
209
+ which loads the fleet project the way the renderer builds it and reports what only that load can
210
+ see. `examples/docs` is migrated whole, and its ten deliberate warnings are unchanged. CHANGELOG
211
+ has every code, key and message; SCHEMA's new "Two shapes of a service model" has the rules and the
212
+ migration recipe.
213
+
214
+ **Rejected, each with the reason.** Migrating repositories automatically — the recipe is documented
215
+ and an agent performs it, because a real model's comments are the team's and not loam's to reflow.
216
+ Making the shape a key in `loam.json` or `likec4.config.json` — the file's grammar already decides
217
+ how it can be read, and a key would be a second answer able to disagree with the first. Widening
218
+ loam's fleet map to the renderer's root project — the map is graded as `architecture/` alone so
219
+ that one broken service model cannot blank the fleet's own picture, which is why a cross-service
220
+ flow in `architecture/usecases/` still names service elements and never a container. Retiring the
221
+ standalone shape — it is what lets a service's docs be validated from the service's own repository,
222
+ and a fleet that wants that keeps it, now with a check on the divergence it costs.
223
+
224
+ **The deliberate remainder**, stated so nobody reads it as an oversight. A cross-service call still
225
+ exists TWICE: container-level in the model, service-level in the map (#011's item 6). The spine,
226
+ the platform census and every other fleet check read the map alone, and `landscape.service-isolated`
227
+ remains the nudge that carries an attested call up into it. Thinning the map to elements plus
228
+ cross-service edges is the [Later](#later--promote-only-from-evidence) "Landscape scaling" row, and
229
+ it is what would remove the duplication. Beside it sits #011's item 5, also deliberate: a
230
+ cross-service flow cannot name a container, because loam grades the fleet map as its own document
231
+ set. Revisit that one when a fleet asks for a cross-service flow whose hops are containers — the
232
+ renderer already resolves such a hop, so the ask will be concrete when it arrives.
233
+
234
+ **Verified 2026-09-04**, and three things the verification changed. The report's own "next thing to
235
+ check" was the one that did not compose: `loam archive` spliced a delta's nested additions into the
236
+ fleet map, and the extending model could then never declare them — the service went `c4.invalid`
237
+ (duplicate) the moment it wrote the container the adopt brief prescribed. The merge now ROUTES each
238
+ addition to the document that owns the interior, and proves the merged model parses beside the
239
+ merged map before writing either. Second, the consumer census read `architecture/` alone, so under
240
+ this shape a private store's consuming edges — which live in the models now — counted for nothing:
241
+ `landscape.datastore-private` went silent or named the wrong service, and a nested store two
242
+ services reach was graded nowhere. It reads every extending model's attested calls now, and
243
+ `landscape.datastore-shared` fires for a nested store. (That census still stands; the code named
244
+ here does not — `landscape.datastore-private` was retired on 2026-09-07, because where a store is
245
+ drawn is the team's choice. See the CHANGELOG entry.) Third, the wiring guard this entry landed
246
+ failed open on every root `exclude` spelling except `services/<tree>/**`, `loam subsystem sync`
247
+ never removed the stray per-service project file it told repositories to delete (and that file
248
+ CLAIMS the model, rather than holding nothing as the design note said), and
249
+ `c4.fleet-project-invalid` enumerated three roots rather than the renderer's — a `.likec4` in a
250
+ subsystem directory was in none of them. All three are closed; CHANGELOG's `[Unreleased]` has the
251
+ codes and keys.
252
+
253
+ **The `import` question is answered.** Reports #010 and #011 left open whether LikeC4's
254
+ cross-project `import` could have delivered this without merging the projects. Measured at the
255
+ 1.59.2 pin: an import resolves REFERENCES across projects, and that is all — it carries no
256
+ `specification`, so a kind or tag the other project declares is not usable in this one, and it does
257
+ not support `extend`. A model importing the map could name the map's elements and still not add a
258
+ container to one. So the choice was never between two mechanisms; one project holding both
259
+ documents is what the shape requires.
260
+
261
+ **Known and carried, 2026-09-04.** The second verification round reproduced these and they were
262
+ NOT fixed. Each is written down with the repro that finds it again, so nobody spends a second
263
+ afternoon rediscovering one. They are carried, not closed.
264
+
265
+ - **Only the basename `likec4.config.json` is surveyed.** LikeC4 1.59.2 also accepts `.likec4rc` and
266
+ six other spellings; drop `{"name":"svc-a"}` into `services/svc-a/.likec4rc` on a synced extending
267
+ fleet and `validate --all`, `doctor` and `subsystem sync` all stay green while the renderer loads
268
+ three projects and refuses without `--project`. Carried on scope: the survey, the stray grade and
269
+ `sync`'s delete list are one table, and widening it is the same change as the two rows below —
270
+ worth doing once, together, with the pin's whole name list measured rather than guessed.
271
+ - **A `likec4.config.json` in a SUBSYSTEM directory claims every model beneath it.** Write one at
272
+ `services/platform/likec4.config.json` over three extending models and all three go
273
+ `Could not resolve reference to Element named 'svc_svc_d'` in the renderer, while loam names
274
+ nothing (`sync` → "nothing to write"). Carried on scope, with the row above: the checks look one
275
+ directory deep, at a service, and seeing this needs a walk of the whole docs tree.
276
+ - **`sync` keeps a config beside a model that is GONE, and that leftover project is not harmless.**
277
+ `rm services/svc-c/model.likec4` with its config left behind: loam is green everywhere, and
278
+ `likec4 validate` — and `likec4 build` — at the docs root then need `--project`. The keep is
279
+ deliberate ("that one really is the team's"), but its premise, that an empty nested project is
280
+ invisible to the renderer, is false at the pin. Carried on a design decision pending: deleting a
281
+ file loam never wrote needs a rule about whose file it is, not a bug fix.
282
+ - **`validate --feature` does not preview a merge refusal.** A delta drawing a cross-interior edge,
283
+ or naming a kind the map does not declare, validates clean and then refuses at `archive`
284
+ (`merge-failed`, nothing written). Carried on scope: the preview needs the archive's own merge
285
+ planner run from the validate path, which is a new seam rather than a message.
286
+ - **In the STANDALONE shape a broken UNTAGGED sibling is invisible to loam.** Make one service
287
+ standalone, `subsystem sync`, then write an unresolvable `services/<id>/usecases/plain.likec4`:
288
+ loam prints `c4.valid` and 0 errors while `likec4 validate --project <id> .` is Invalid. The
289
+ extending shape catches the same file through `c4.fleet-project-invalid`. Carried on scope: the
290
+ per-service load reads the model, and reading the standalone project the renderer builds is a
291
+ second loader.
292
+ - **A root `exclude` that no longer covers `features/**` is silent.** Delete that one entry from
293
+ `examples/docs`' config: loam reports 0 errors and `sync` says "nothing to write", while the
294
+ renderer's fleet project is at 346 errors. The scaffold always writes the entry, so this is a
295
+ hand edit, which is why it is carried rather than fixed — on the evidence bar: no repository has
296
+ hit it, and a grade on an entry loam did not write is a policy claim.
297
+ - **A root config the renderer REJECTS is reported only by `sync`'s note.** `"exclude": "services/**"`
298
+ as a string, or an array-valued `include`, is "loaded 0 projects out of 1" — nothing renders — and
299
+ `validate --all` is green; an unparseable file is the same. Carried on scope: loam reads the file
300
+ for one key, and schema-validating somebody else's config is a dependency on the renderer's own
301
+ schema at the pin.
302
+ - **`LivingSlice.landscape.modelled` is `false` where `adopt` says `null`.** Over an
303
+ `architecture/` project that did not parse, `loam context <svc> --json` says `modelled: false` and
304
+ `loam adopt --service <svc> --json` says `modelled: null` about the same tree. Carried on scope:
305
+ the field is typed non-nullable in the pack, so agreeing with `adopt` is a contract change.
306
+ - **`loam show` never mentions graded intra-service flows.** With a healthy `#req-…`-tagged flow
307
+ beside an extending model — `validate --service` prints "· 1 tagged flow(s) graded" — neither
308
+ `loam show <svc>` nor its `--json` names it anywhere. Carried on scope: `show`'s payload is a
309
+ frozen shape and the flow needs a section of its own.
310
+ - **`loam status` never names the isolated state.** `landscape.service-isolated` is a warning
311
+ `validate --all` prints and `status`'s next-action ladder has no rung for. Carried on a design
312
+ decision pending: the ladder is derived from artifact presence and provenance, and a finding-derived
313
+ rung is a different rule for what `next[0]` means.
314
+ - **The first ever container-level flow a FEATURE brings.** A cross-service flow cannot name a
315
+ container, because loam grades the fleet map as its own document set; the renderer already resolves
316
+ such a hop. Carried deliberately — the [Later](#later--promote-only-from-evidence) "Landscape
317
+ scaling" row owns it, and it is promoted when a fleet asks, not before.
318
+
319
+ #### Problem reports carry an ordinal, and loam reads the directory it prescribes
320
+
321
+ **Landed 2026-09-04**, from one problem report (#012). The `loam-report` protocol prescribed a
322
+ directory, a filename shape and a document structure and then stopped: files were named
323
+ `YYYY-MM-DD-<slug>.md` with a numeric suffix only on collision — a collision breaker, not an
324
+ identifier — so in a directory of eleven reports written in two days, none had one, four shared
325
+ their first eleven characters, and the discriminating part of every name sat far to the right of
326
+ what a terminal, a file picker or a chat message shows. There was no field anywhere in the document
327
+ for the one piece of state a report has (three of the eleven were already closed and one superseded,
328
+ all of it living in whoever remembered), and `validate --all`, `doctor`, `status` and `list`
329
+ mentioned `loam-reports` zero times between them. Landed: an unconditional ordinal at the front of
330
+ the name, which is the computation the protocol already described for its suffix applied where it is
331
+ visible; a `Status:` line in the template with a four-value vocabulary a report closes by editing;
332
+ and `loam doctor` reading the directory — total, per-status counts and the next ordinal — as an
333
+ additive `reports` key and one human row. Rejected: a `loam report list` verb (a new command for a
334
+ count `doctor` was already the place for, on a frozen CLI surface); an index file (the workaround
335
+ this replaces — a second place to keep in step, and the reason the state left the files in the first
336
+ place); grading the corpus (an open report is not a defect in the repository holding it, so `doctor`
337
+ reports it as state and `healthy` never moves); parsing past the first word of the status line (the
338
+ rest is prose an author writes for a reader). Cost: one `readdir` and one small read per report on
339
+ every `loam doctor`, and nothing is transmitted — which is the constraint the protocol is built
340
+ around and the reason the whole fix needed no new state.
341
+
342
+ #### The adopt brief on an edgeless landscape element
343
+
344
+ **Landed 2026-09-03**, from one problem report. `loam adopt` decided whether the fleet map still
345
+ owed a service from element EXISTENCE: a bound element with no edge — what
346
+ `loam seed --from fleet.yaml` leaves for every service absent from `calls:` — read as
347
+ `landscape.instruction: null`, no target, `inbound: []`, `outbound: []` in one payload, so an agent
348
+ following the protocol to the letter wrote a validating baseline and never drew one edge, and
349
+ `loam validate --all` stayed green over it. Landed: a fourth landscape state carried by two
350
+ additive keys (`landscape.touched`, and `landscape.attested` — the calls the service's own
351
+ model.likec4 declares across its boundary, derived once in `core/c4/resolve/attested.ts` for the
352
+ brief and the fleet check alike, so the two can never name different edges); a non-null instruction
353
+ in two arms (carry each attested call up as one edge on the existing element, naming the other
354
+ party as the map spells it; or, with nothing attested, draw NOTHING rather than invent — an edgeless
355
+ element that is true is a fact); the landscape target back as an edge-only `edit` whose shape
356
+ refuses a second element; the `EDGELESS` flag in the text view; the evidence-gated
357
+ `landscape.service-isolated` warning under `--all`; and a seventeenth unchecked statement about
358
+ visibility (placeholder tags, curated views, `include *` over a boundary). Rejected: folding the
359
+ state into `landscape.modelled` (an agent told `false` draws a second box); an unconditional "no
360
+ edge touches it" warning (no correct fix for a worker that calls nothing, and every seeded fleet
361
+ red-ish until adoption); grading the SET DIFFERENCE between the attested calls and the drawn edges
362
+ (loam cannot tell a call the map forgot from one the fleet does not draw at its own altitude, so
363
+ the difference reported as an omission is an invented edge with a code beside it — the check stays
364
+ touched/untouched, and the brief says so out loud); a check on placeholder tags or on what a view
365
+ shows (rule 26 — loam never
366
+ computes what a view shows). Cost: one LikeC4 load of `model.likec4`, only in the edgeless state, a
367
+ memo hit under `--all`.
368
+
369
+ **Corrected 2026-09-04** by the verification of this entry: the brief read
370
+ `architecture/landscape.likec4` alone where the fleet check reads the whole `architecture/` project,
371
+ so a fleet keeping a second `model { }` block in a sibling got a brief demanding edges it had
372
+ already drawn while `validate --all` reported `landscape.matched`. Both now read the project.
373
+
374
+ #### A home for an intra-service use case
375
+
376
+ **Landed 2026-09-03.** Measured: `architecture/usecases/` cannot resolve a container (one such file
377
+ is `landscape.invalid` plus a `spine.landscape-invalid` per service), and a view beside the model
378
+ rendered while nothing graded it. Landed: the service's own LikeC4 project as the slot — every
379
+ `.likec4` beside model.likec4 and any tagged view inside it — graded by `validate --service`/`--all`
380
+ with the five existing `usecase.*` codes, `#req-` scoped by the service's own Requirement-IDs,
381
+ `#cap-` refused by placement, a broken sibling one `usecase.flow-invalid` while the model keeps
382
+ grading; plus the tier-2 skip and the fourth `step-unlinked` guard in the shared graders. Rejected:
383
+ a fixed `usecases/` directory alone (the reporter's `views.likec4` would render ungraded),
384
+ `views.likec4` alone (a second file would be invisible), a new code for the broken sibling (nothing
385
+ branches differently), gating the read on `likec4.config.json` (create-only, deletable). Cost: one
386
+ recursive readdir per service; a workspace only where a view in model.likec4 opts in or a sibling
387
+ mentions a reserved prefix anywhere in its bytes — an untagged sibling is never graded, and once
388
+ the workspace is loaded a project that does not read is one `usecase.flow-invalid` whether or not a
389
+ view opted in.
390
+
391
+ #### The service model, renderable from the fleet root
392
+
393
+ **Landed 2026-09-03**, from one problem report. The root `likec4.config.json` that
394
+ `loam init --create` writes excludes `services/**` on purpose — every `model.likec4` declares its
395
+ own `specification` block, and a renderer merging the tree calls each one a duplicate — and the
396
+ cost of that exclusion had gone unstated for a release: the model `loam adopt` spends the most
397
+ effort on was a box with nothing inside it in the renderer opened at the docs root, and the only
398
+ documented path to its containers was one renderer invocation per service directory. The report's
399
+ hand-written workaround, one project file per service, is what this entry makes loam's.
400
+
401
+ **Measured** at the pinned likec4 before a line was written. A `services/<svc>/likec4.config.json`
402
+ is registered as a project of its own even though the root excludes the directory: the workspace
403
+ loads `fleet` plus one project per service with zero errors, the root project sees exactly the
404
+ files it saw before, and each service project carries an auto `index` view of the containers beside
405
+ the authored view. A nested project named `fleet` is silently registered as `fleet-1`. With more
406
+ than one project, `likec4 validate` at the root refuses with `Specify exact project` until given
407
+ `--project`. A nested project holding no `.likec4` file is silently absent from the project list. A
408
+ service model that does not parse breaks only its own project; siblings and `fleet` still compute.
409
+ And the project picker shows `title ?? id`, so the title is what a human reads.
410
+
411
+ **What landed.** `loam subsystem sync` writes the file — create-only, two keys, bytes a function of
412
+ the id alone — beside every service model that has none, once the root project file exists, and
413
+ reports them under an additive `projects` key. `loam validate --all` grades presence with one
414
+ warning per service, `service.likec4-config-missing`, whose fix is `sync`. No new command: the
415
+ [Later](#later--promote-only-from-evidence) Rendering row's evidence bar was met for the SCOPING
416
+ half of its trigger and answered by wiring — one file that tells the renderer where a project is —
417
+ not by a drawing verb; drawing stays LikeC4's, and the row says so now.
418
+
419
+ **Rejected.** A new command, because the report's problem was a missing file, not a missing verb,
420
+ and a verb would have put loam between a team and its renderer for good. The agent writing the file
421
+ from the adopt brief, because a file written by hand per service is the state the report found —
422
+ one of four adopted services had one — and loam already writes the root file and knows every
423
+ service directory. A generated-and-compared file with a `-stale` grade, because the bytes cannot go
424
+ stale and a compare would fight the `title` and styles LikeC4 lets a team add. Grading in `doctor`
425
+ alone, because the gap is per service and `doctor` reports on the repository, not on its services;
426
+ the docs repo's CI runs `validate --all`.
427
+
428
+ **Costs**, each where a user meets it. A repo with adopted services reports one warning per service
429
+ on its first `validate --all` after upgrading, until one `sync`; that `sync` leaves N untracked
430
+ files it does not `git add`; from the first service project on, `likec4 validate` at the docs root
431
+ needs `--project <name>` (`build` and `export` take every project without one — measured); the
432
+ renderer's project list grows by one per adopted service, and a fleet-map box is not a link into
433
+ that project (LikeC4 projects are separate models); and the project name is not injective (an id spelled billing.core beside one spelled
434
+ billing-core, `service-fleet` beside `fleet`), disclosed in SCHEMA rather than escaped away,
435
+ because the picker shows the id.
436
+
437
+ **Superseded for extending models, one day later.** The last of those costs — one picker entry per
438
+ adopted service — is what report #009 measured at 57 entries, and the entry that opens this list is
439
+ what removed its cause rather than its symptom: a model that extends the fleet map shares the root
440
+ project with it, so it is owed no project file and adds no entry, and `loam subsystem sync` writes
441
+ the file only for a model that stands alone. Everything measured here still holds for that shape,
442
+ and is why it is still supported; it is no longer what a new model is written as.
443
+
444
+ #### The generated subsystem views — a label, a boundary, and one reader of the map
445
+
446
+ **Landed 2026-09-03.** Three problem reports from a fleet running loam, one axis. The generated
447
+ `architecture/subsystems.likec4` exists only to be rendered and was the least readable object in a
448
+ docs repo: no `title`, so the renderer showed the hex-escaped view id, and leaf includes only, so a
449
+ fleet drawn as grouped C4 rendered flat. Each view now carries the marker's title (the directory
450
+ name when it has none) and description, and draws a boundary the LANDSCAPE decides: the model's own
451
+ containing element when one holds exactly the members, a `group` mirroring the directory subtree
452
+ when the map nests nothing, and one `// model: no boundary — …` comment when the two disagree.
453
+ That comment is the whole answer to the drift the third report asked about — disclosure in a
454
+ generated artifact, never a finding, because grading placement against the map is the policy the
455
+ tree is defined not to carry. The graded alternative is written down under
456
+ [Later](#later--promote-only-from-evidence) with the evidence bar it has to clear.
457
+
458
+ The hunt found what neither report did: `validate --all` graded that file against the whole
459
+ `architecture/` project while every writer rendered it from `landscape.likec4` alone, so a
460
+ use-case document binding one element could produce a `subsystem.views-stale` that
461
+ `loam subsystem sync` reported as `current` — reproduced on `examples/docs`, and fixed by pointing
462
+ both sides at the same read.
463
+
464
+ **And the repository's palette (2026-09-03).** A generated view can carry no inline `style` rule —
465
+ the file is regenerated wholesale — and the one mechanism LikeC4 gives a view for borrowing a
466
+ repository's styling is a reference to a global style by id, which is a parse error that blanks the
467
+ whole `architecture/` project when nothing declares it. So the convention is one reserved name:
468
+ declare `global { styleGroup subsystems { … } }` anywhere in the `architecture/` project and every
469
+ generated view references it; declare nothing and the file is what it was. Rejected: reading the id
470
+ off a key in `likec4.config.json` (create-only, never re-read, and not a LikeC4 document whose
471
+ contents a parse can check), and "reference the single declared group" (a second group declared for
472
+ a hand-drawn view would silently switch the generated views' styling off and restale the file on a
473
+ change that touched no subsystem). The presence read is a census of the keys of
474
+ `$data.globals.styles`, a declaration read like `specification`; seven tripwire assertions in
475
+ `test/likec4-view-shape.test.ts` pin the shape so a likec4 bump fails there before it reaches a
476
+ generated file.
477
+
478
+ #### The deployment axis — topology joined to requirements
479
+
480
+ **Promoted 2026-09-02, and authored as a feature in loam's own docs repo** rather than as an item
481
+ text here: `meta/docs/features/archive/FEAT-1-the-deployment-axis/`, whose `intent.md` carries the
482
+ four measurements and whose `specs/loam/arch.spec.md` carries the five rules the change establishes,
483
+ each with scenarios. This entry is the decision and the gate; that feature is the specification, and
484
+ the two must not be allowed to become two accounts of the same change.
485
+
486
+ **Landed 2026-09-02, complete.** Every step is in, and step 4 was corrected rather than built
487
+ (below) — the item specified two finding codes that the implementation showed it should not mint.
488
+ FEAT-1 archived once every edge it claimed existed —
489
+ and it archived having been CORRECTED against the tree twice, which is the argument for the route
490
+ rather than a footnote to it: the delta predicted a `core/kernel/` dependency that turned out to be
491
+ type-only (a brand costs an annotation, not an import) and missed `core/coherence/` entirely.
492
+ `npm run meta:check` was red for the whole of the build and went green with the archive, which is
493
+ the axis working rather than a gap in it.
494
+
495
+ The whole change is reviewable as five commits on `feat/deployment-axis`, and the one thing to read
496
+ first is what the implementation taught the plan: two of the codes this item specified were not
497
+ minted, and the reasons are in step 4.
498
+
499
+ **What is wrong today.** A LikeC4 `deployment { }` block is legal in a docs repo and completely
500
+ unread. The parser resolves every `instanceOf` in it — a container renamed out from under a
501
+ deployment node fails the gate as `landscape.invalid` — and after that nothing: no requirement can
502
+ name a node, no report counts one, and the context pack an agent implements from does not mention
503
+ topology at all. Two of the four measurements taken on a copy of `examples/docs` are the reason this
504
+ is an item rather than a wish. A `#obl-` tag on a `deploymentNode` is invisible to
505
+ `validate/fleet/obligations.ts`, which walks the logical model only — the same undeclared tag raises
506
+ `obligation.unknown` on a container and nothing on a datacenter, which is fail-open and a defect on
507
+ its own terms. And `parsedModel().deployment` already returns nodes with their tags, instances
508
+ carrying the id of the logical element each one instances, and relationships carrying metadata, so
509
+ the read costs no second parse, no new file format and no change to the frozen CLI surface.
510
+
511
+ **Required changes**, in the order the dependency graph forces:
512
+
513
+ 1. Walk the deployment model in every `#obl-` grade. Fail-open becomes fail-closed; no new code.
514
+ 2. A fourth `Covers:` entry form, `node:<id>`, with the same prefix accepted on either side of the
515
+ edge form. No new code.
516
+ 3. The parse adapter in `src/core/c4/parsed/`, and the deployment records added to
517
+ `test/likec4-model-parity.test.ts` — a two-stage substitution nothing measures is an assumption.
518
+ `src/core/c4/` holds exactly five files, so this is a sub-package and not a sixth module.
519
+ 4. **No new finding code, and this is a correction the implementation earned.** The item planned
520
+ two. The first, for a tagged node or edge no living arch requirement covers, turned out to be
521
+ `obligation.uncovered` asked of a second model: once step 1 walks the topology, the existing code
522
+ answers it, and a caller acts identically either way — write a `Covers:` line. A second code for
523
+ one question is exactly what the add-a-code checklist refuses. The second, for a container no
524
+ deployment instances, is declined outright: it asserts that everything modelled ought to be
525
+ deployed somewhere, which is a COMPLETENESS claim, and completeness is the one thing
526
+ `src/core/brief/unchecked.ts` says loam never checks. It is the same category error as the
527
+ at-least-two-datacenters rule below, one axis over.
528
+ 5. `features/<FEAT>/deployment/<name>.likec4`, create-only and copied whole — `core/usecases/delta/`
529
+ one axis over. It works because `extend` was measured to resolve across documents of one project,
530
+ so no text splice is needed; `delta-blocks.ts` goes on refusing a `deployment { }` block inside
531
+ `delta.likec4` and its message names the new slot. The collision is on the FILE, never on what is
532
+ inside it: two features may both extend one living region from documents of their own and both
533
+ archive, which is the shape the fleet-wide change actually takes.
534
+
535
+ **Graded against the merge preview**, which shipped one commit behind the slot and is the
536
+ second code, `deployment.doc-invalid` (error, never overridable). This axis needs the post-merge
537
+ corpus more literally than the use-case one: a feature that stands a NEW service up in a cluster
538
+ declares it in `delta.likec4` and instances it in the topology, so the element the document names
539
+ exists only after the merge. The staging that makes that readable moved OUT of
540
+ `core/usecases/delta/overlay.ts` into `core/c4/project/staged.ts` rather than being copied — the
541
+ two axes would have disagreed first about the merge preview, which is the one thing both
542
+ refusals rest on. The extraction dropped `core/usecases/` → `core/kernel/`, which is a one-line
543
+ edge and was edited into the model directly.
544
+ 6. The surfaces: the topology in the context pack (`context --json`'s `living.deployment`), the code
545
+ table `test/codes-drift.test.ts` requires, and one more statement in
546
+ `src/core/brief/unchecked.ts`. `loam explain` needed nothing — it parses the /loam-check fix
547
+ tables at runtime, so the rows added there ARE the entries. The scorecard row the item listed was
548
+ dropped: the fleet scorecard aggregates at the bound `service`, and a topology row there would
549
+ count deployment nodes against a denominator no service owns.
550
+
551
+ **Exit criteria.** Every step above green under the full gate; `covers.unknown` demonstrated firing
552
+ on a covered node that a topology change renamed, which is the acceptance criterion the trigger
553
+ names; the parity suite extended and shown to fail against an un-extended adapter; and
554
+ `test/self-model.test.ts` re-pinned once FEAT-1 archives.
555
+
556
+ **Out of scope, and each refusal is load-bearing.** No reading of Terraform, Helm or cluster state —
557
+ that is the extractor the non-goals forbid. No check that a service is deployed in at least two
558
+ datacenters: it would need `criticality` promoted from prose to a read field, and it would turn
559
+ `architecture/obligations.yaml` into the policy engine that file says in its own words it is not. A
560
+ multi-datacenter rule is an authored requirement whose `Covers:` line names the nodes; loam grades
561
+ the join and never the architecture. And no `environment` concept above LikeC4, because
562
+ `deploymentNode` is that mechanism and the fleet names its own kinds.
563
+
564
+ **The evidence, and its one gap stated plainly.** Operator: a team standing up a standby cluster in
565
+ a second datacenter. Repeated task: keeping RTO/RPO requirements attached to a topology that keeps
566
+ changing. Failure mode: a requirement about replication staying green after the node it described
567
+ was renamed or removed. Frequency: every topology change, which is the cadence a migration runs at.
568
+ Current workaround: a `Covers:` line that resolves to nothing, or no written requirement at all.
569
+ Acceptance criterion: a topology change that orphans a covered requirement is convicted without a
570
+ human noticing it first. **That is one operator, not two.** The maintainer judged the trigger
571
+ sufficient on the same basis recorded for landscape scaling and the authored business axis, and the
572
+ [Later](#later--promote-only-from-evidence) exit criteria are amended below to say so rather than
573
+ leaving the two paragraphs to contradict each other. Steps 1 and 2 do not rest on that judgement at
574
+ all: the first is a fail-open defect and the second is a grammar entry, and neither is a new axis.
575
+
576
+
577
+ - **A feature can bring a use case.** `features/<FEAT>/usecases/<name>.likec4` — a views-only
578
+ document `loam archive` copies into `architecture/usecases/` and `loam unarchive` takes back,
579
+ create-only, refused by `usecase.flow-exists` when the living tree already holds that file. All
580
+ four exit criteria: a `#req-` tag in it resolves against the feature's own capability delta as
581
+ well as the living tree (the both-corpora rule `Realizes:` follows); `capability.uncovered` counts
582
+ a resolved feature-local flow as cover, and its message now names the slot instead of telling an
583
+ author to `--approve` first and tag the flow afterwards; the merge and its undo go through the
584
+ transaction every other axis already uses; and a flow is graded against the map its own merge
585
+ would leave behind, so a hop may name a service the feature's `delta.likec4` adds while a hop
586
+ naming an element the merge does NOT land is `usecase.flow-invalid` — refused at plan time, with
587
+ `--approve` deliberately unable to move it. The design decision worth recording is the one the
588
+ item flagged as open: the overlay is the ARCHIVE'S OWN MERGE PREVIEW, computed with
589
+ `planLandscapeMerge` rather than approximated, so a flow can never be graded against a map the
590
+ merge does not write. `delta.likec4` still refuses a `dynamic view` and the reason is mechanical
591
+ rather than policy — it re-declares the landscape's identifiers and carries its own
592
+ `specification` block, so it cannot be staged beside the map in one LikeC4 project — but its
593
+ message now names the slot that exists.
594
+ - **One predicate answers "is this a use case".** `isUseCase` moved out of
595
+ `core/usecases/fleet.ts`'s private scope, widened to either reserved prefix, and is now the only
596
+ spelling: `validate`'s `gradedViews`, the fleet-flow read behind `capability.requirement-unrealized`,
597
+ and every reader behind `loam diff`, `delta`, `status`, the packs and `list capabilities` take it.
598
+ The byte gate that lets a fleet with no use cases skip the LikeC4 load was widened with it, and
599
+ that half mattered more than the predicate: a fleet whose only flow was `#req-`-tagged declared
600
+ `tag req-…` and no `cap-` anywhere, so the scan answered "no use cases" and nothing loaded the
601
+ project at all. Six tests pin it, each proven to fail against the narrowed predicate.
602
+
603
+ Two of the exit criterion's named readers do NOT show a `#req-`-only view, and the wording was
604
+ wrong rather than the code: `loam explore --capability` seeds through `flowsClaiming`, which
605
+ matches the whole `cap-<slug>` tag, and `list capabilities`' `keptBy` needs exactly one RESOLVED
606
+ `#cap-` scope before a `#req-` tag means anything. A view with no capability tag claims no
607
+ capability — correctly, and in both places. What the widening buys them is that such a view is
608
+ now SEEN: it opts the fleet in, so the flows are read and `useCases.unreadable` answers honestly
609
+ instead of the scan reporting a fleet with no use cases.
610
+ - **A step-definition catalogue.** Decided in writing first, as the item required, and the decision
611
+ is AUTHORED rather than emitted: `services/<svc>/steps.yaml`, a `steps:` list of step texts,
612
+ recording which phrases a team has agreed its suite defines. Four things decided it — loam does not
613
+ read code and must not present a derived thing as truth, so what can honestly be written down is a
614
+ decision and not an observation; `loam steps` needs no service repo to stand in and a catalogue
615
+ beside the code would make it need one; the rule the glossary and capability trees settled puts an
616
+ entry without prose in YAML; and nothing generated may land inside `<gherkinDir>/loam/`, which
617
+ `loam gherkin` owns and overwrites wholesale. `loam steps` now reports written phrases against
618
+ catalogued ones both ways round, so a phrase nobody has defined is distinguishable from one nobody
619
+ has written, and an ABSENT catalogue is distinguishable from an UNREADABLE one — reporting either
620
+ as "nothing catalogued" would print a whole suite as work owed. **The axis carries no stable code
621
+ and `loam validate` never reads it**: a phrase written before its glue is the normal order of work,
622
+ the near-duplicate groups stay a report, and no phrase-similarity finding ships. Entries are step
623
+ TEXTS rather than keys, because the key is loam's own normalisation and asking an author to type
624
+ it would make an internal spelling a hand-written contract.
625
+
626
+ - The authored business axis, end to end: the `capabilities/<cap>/spec.md` tree, `Realizes:` with
627
+ its living pin, the `#req-` flow join, the feature-local delta, the archive gate in both
628
+ directions and `loam new --capability` — `1c5541a`…`0850538`. Every remainder the item listed is
629
+ closed: the flag is registered, `show` and `delta` project a capability delta, and a half-created
630
+ `features/<FEAT>/capabilities/<id>/` is graded. Full item text: `git show ab4c856:ROADMAP.md`.
631
+ - The living `Realizes:` pin and `capability.realizes-stale`, with `loam rebase --living` — the
632
+ product's first standing suspect link over the LIVING corpus, and the answer to the one failure
633
+ class that decayed silently after a successful archive. Every other capability check is an
634
+ existence constraint and goes quiet when a target merely changes.
635
+ - The spine-first first hour: `examples/fleet.yaml`, day zero starting at `loam seed`, and a
636
+ README entry point that reaches a cross-service conviction with no requirement Markdown at all.
637
+ - `contracts.openapi` in `loam.json`: the build's own contract read as a check
638
+ (`openapi.generated-stale`, `contracts.source-missing`, `contracts.source-invalid`). Closes the
639
+ most load-bearing untested premise in SCHEMA — that the committed contract is the one the
640
+ service serves — without becoming a writer or an extractor.
641
+ - `spec.unknown-directive`: the near-miss grammar guard. An unrecognised body-line key is prose,
642
+ so the join it resembles does not exist and every check over it stays green for want of anything
643
+ to fail.
644
+ - `checklist` and `docsCommit` on each attestation, plus `verify.checklist-forked` — a federated
645
+ record can now say WHICH service's answers went stale rather than flagging all or none.
646
+ - Atomic, locked, compare-and-swap verification records — `60f4df6`.
647
+ - Full-gate concurrency stability: the classified stress runner and host probe — `d9b396a`.
648
+ - Crash-consistent multi-file writers: the journaled roll-forward transaction — `88e9026`.
649
+ - Executable architecture invariants: `npm run arch:check` and the brand migration —
650
+ `0106b49`…`9c0f01e`.
651
+ - Baseline semantics for OpenAPI path items and components — `0824b02`…`246a800`.
652
+ - OpenSpec corpus rebaselined at v1.9 beside the historical v1.7 — `9a0c6d7`, `724ab15`.
653
+ - `validate --all` fit for the fleet gate: one LikeC4 workspace, 18.8x — `f66ff56`…`56b031d`.
654
+ - The AsyncAPI feature lifecycle, mirrored axis-for-axis — `c5e205c`…`8837e9b`.
655
+ - Subsystems: a navigable tree under `services/` that no identity depends on — `600a696`…`8aee101`.
656
+ - The capability vocabulary, the requirement join and the `list capabilities` rollup —
657
+ `2bd9400`…`e26ff9f`.
658
+ - Documentation, package-content and link protection — `6ea2a68`…`08330ea`; paper trails `5cd3942`.
659
+ - The domain glossary, and the link check that makes it exact — `bc1b936`…`44a5386`.
660
+ - Architectural obligations: the ADR, the `#obl-` tag and the living `Covers:` index — `0b5fc24`.
661
+
662
+ Honest leftovers. One remains, and it lives outside this repository: the CI `stability` job has
663
+ still to be observed green, which needs a push and then a `workflow_dispatch`.
664
+
665
+ The two merge holes recorded here are closed, and they were not the same defect. On the OpenAPI axis
666
+ the capability existed and was merely unreachable: the merge tested `paths` for absence and answered
667
+ no-op before it had parsed the living document, while the component closure is the last thing it
668
+ runs. It now consults the surface enumeration instead, and a genuinely new component is promoted
669
+ BEFORE the ref fixpoint is seeded rather than after, so its own `$ref`s ride the same sweep.
670
+
671
+ On the event axis the capability did not exist. AsyncAPI had no surface enumeration outside the
672
+ three slots, no root baseline record, and no pin that could reach a `components.schemas` value — the
673
+ event pin is written INTO a slot value, which works because every slot value is a mapping and a JSON
674
+ Schema is not. So closing it was new machinery rather than the same control-flow fix: a
675
+ `core/asyncapi/baseline/` package, a root `x-loam-baselines` record that `loam rebase` writes and
676
+ `stripAsyncapiMarkers` removes on every branch, surface grading folded into the SAME per-service
677
+ unpinned counter rather than a second warning, and one new archive-plan code,
678
+ `asyncapi.component-modified`. The asymmetry is worth recording: two sentences in one bullet
679
+ described one control-flow bug and one absent subsystem, and only tracing the code told them apart.
680
+
681
+ ## Later — promote only from evidence
682
+
683
+ Health composition, built-in rendering, UI generation and landscape decomposition remain candidate
684
+ investments, not promises. Promote one only when fleet evidence names the operator, repeated task,
685
+ failure mode, frequency, current workaround, and measurable acceptance criterion. The authored
686
+ business axis stays listed below because its trigger and its reasoning are the record of how a Later
687
+ item gets promoted — it went from here to `## Now` and from there to
688
+ [Recently landed](#recently-landed), and the trail is the point.
689
+
690
+ - **Health composition:** proceed only if both service-level `health.yaml` and fleet relationships
691
+ are repeatedly being joined by hand and that work causes missed or contradictory checks. The
692
+ result must compose declared signals; it must not infer operational truth from code or monitoring
693
+ systems.
694
+ - **Rendering:** LikeC4 remains the renderer. A loam rendering command needs evidence that
695
+ invocation, scoping, or artifact reproducibility is the recurring problem, and it must stay
696
+ outside validation so view computation cannot slow or change the gate. This item is about
697
+ **drawing**, and LikeC4 keeps that job. Reading a `dynamic view`'s declared steps is not rendering
698
+ and is not this item — see docs/DESIGN.md rule 26. The scoping half of that bar was met and
699
+ answered on 2026-09-03 by the per-service project file `loam subsystem sync` writes (see
700
+ [Recently landed](#recently-landed)) — wiring rather than a verb; drawing stays LikeC4's.
701
+ - **UI generation:** begin with a disposable projection over the stable JSON contract only after CLI
702
+ consumers demonstrate a repeated navigation problem. It must not introduce a second mutable state,
703
+ hidden workflow state, or a required service.
704
+ - **A graded subsystem/model correspondence:** a fleet that draws its landscape as grouped C4 states
705
+ its grouping twice — once as directories under `services/`, once as the nesting of the elements —
706
+ and `loam subsystem move` changes the first while the second stays put. Since 2026-09-02 the
707
+ generated views file DISCLOSES that (the `// model: no boundary — …` line; see
708
+ [SCHEMA.md](SCHEMA.md)), and nothing grades it, because grading placement against the map is the
709
+ policy the tree is defined not to carry. The shape a graded version would take is known and
710
+ measured: an author's opt-in `metadata { subsystem '<name>' }` on the grouping element, read
711
+ through the existing metadata reader, the NAME rather than the path (names are unique in one flat
712
+ namespace and survive a move, which a path binding would not), with the check structurally silent
713
+ for every fleet that never writes one. Promote only on evidence from a second fleet, after living
714
+ with the disclosure — the first report classified itself `inconclusive`, and one fleet is not
715
+ enough to qualify an invariant that says placement is never part of any identity.
716
+ - **A feature brings an intra-service flow.** `features/<FEAT>/specs/<svc>/usecases/<name>.likec4`,
717
+ copied create-only by `loam archive` into `services/<…>/<svc>/usecases/` and taken back by
718
+ `loam unarchive`, graded before the copy against the service's own LikeC4 project with the
719
+ feature's `specs/<svc>/` requirement deltas in `#req-` scope — `usecase.flow-exists` and
720
+ `usecase.flow-invalid` reused, never `--approve`-overridable. Deliberately NOT built with the
721
+ living slot (2026-09-03): the version-3 snapshot manifest already carries an artifact path with a
722
+ directory in it, so nothing about the undo changes when it lands, and no model delta exists to
723
+ preview — what it waits for is one fleet asking for a container-level flow to ship in the same
724
+ change as the `arch.spec.md` requirement it answers. Until then a service-local flow is written
725
+ directly into the service directory in the same pull request, where git produces the conflict;
726
+ building the feature route ahead of that evidence is the invented need the non-goals forbid.
727
+ - **A subsystem-scoped use-case slot.** A flow whose hops all sit inside one subsystem's subtree
728
+ looks like it wants a home between the two that exist — `architecture/usecases/` is the fleet's
729
+ slot, `services/<…>/<svc>/usecases/` is one service's. Deliberately NOT built (2026-09-07), and
730
+ the reason is that the capability is already there: a subsystem-scoped flow IS a fleet use case
731
+ whose hops happen to share a subtree, `architecture/usecases/<name>.likec4` already grades it, and
732
+ its view already folds into the same title-path folders as the generated subsystem view above it.
733
+ A second slot would duplicate the grader, the tag vocabulary and the archive route for no
734
+ capability that does not exist today. Promote only on evidence that a fleet's subsystem flows are
735
+ being lost among its fleet flows in the renderer's view list — which is a naming problem before it
736
+ is a slot problem, and one the title convention answers first.
737
+ - **A flow-untagged check** (it would be spelled usecase.flow-untagged): a `.likec4` beside a
738
+ service's model that mentions a `req-` prefix while no view in that project carries the tag — an
739
+ author who reached for the intra-service use-case axis and missed, whose flow renders and is
740
+ graded by nothing. It grades a view that EXISTS rather than an absence, so docs/DESIGN.md rule 26
741
+ permits it, unlike the service.usecases-missing nobody may ever build. Not built (2026-09-07) for
742
+ a mechanical reason worth stating: `core/brief/checks.ts` sits at 399 of 400 lines inside a
743
+ five-file-capped package, so a new non-ok code forces a split-module commit before any behaviour
744
+ can land, and that split should be chosen for a seam rather than for a code. Promote when a second
745
+ fleet reports a flow that rendered and was graded by nothing.
746
+ - **What the closed `flows-dynamic-views` branch had and main still lacks.** The branch drew
747
+ cross-service journeys as fleet-level dynamic views before main grew its own use-case axis; it was
748
+ closed as superseded on 2026-10-10, its one piece main lacked outright — suites, the participant
749
+ union a test stand needs — was ported onto that axis (`#suite-<name>`, `loam list suites`), and its
750
+ reference implementation stays reachable at the tag `archive/flows-dynamic-views` — commit
751
+ `d90b6f9`, the closed branch's head, which is the name to use where the tag was never fetched
752
+ (`git show d90b6f9:<path>`). Five things remain, and each waits for the same evidence — pilot
753
+ teams actually writing tagged use cases — because each would freeze a code, a grammar or a
754
+ generated file, and the two checks among them are advisory heuristics:
755
+ - **Per-view outcome counting against scenarios** — a view's `alt`/`opt`/`try` arms summed (not
756
+ multiplied) and compared with the scenarios covering it (it would be spelled
757
+ usecase.outcomes-uncovered, warn). `core/c4/parsed/dynamic-views.ts` flattens the block tree
758
+ it would need, and the count says how many outcomes lack a scenario, never which. Waits for
759
+ flows with branches being written and a team asking which outcomes go untested.
760
+ - **A feature-scope warning for a `#FEAT` cross-service edge no journey traverses** (it would be
761
+ spelled usecase.edge-unrepresented, adopt-gated on the fleet having a tagged use case). Main sees
762
+ only the removal direction (`diff.op-removed-consumed`). Waits for a fleet whose journeys are
763
+ kept at all — on one with none it is noise.
764
+ - **`Covers: view:<id>`** — a join from an arch-axis requirement to a journey that needs no
765
+ capability axis. It runs the opposite way to `#req-` (two answers to "what covers this flow"),
766
+ and a bare view id can now be stolen by a service-local view of the same name. Waits for
767
+ evidence that legacy teams will not write `capabilities/` — the one case where main has no way
768
+ to join a cross-service flow to a runner-verified arch-level outcome.
769
+ - **Generated per-suite views** (a `flow-groups.likec4`, a sync verb, a staleness code) —
770
+ rendering only. Waits for a team asking to SEE a suite rather than list it.
771
+ - **Changing an existing journey through a feature** (replace by view id, with a conflict
772
+ warning). Main declined it on purpose — the feature route is create-only and an existing flow is
773
+ edited in the pull request — and it waits for concurrent journey edits conflicting more often
774
+ than review absorbs.
775
+ - **Landscape scaling:** retain one landscape while conflicts are exceptional, and half of what
776
+ this row once asked for arrived on 2026-09-04. Per-service internals now live in
777
+ `services/<svc>/model.likec4` by default: `loam archive` routes a delta's fqn-spelled interior
778
+ into the owning service's extending model, and a team adopting a service adds nothing to
779
+ `architecture/landscape.likec4` but one element and its cross-service edges. The map holds a
780
+ service's interior only where a team puts it on purpose — a store nested under its owner so a
781
+ second service can name it (SCHEMA's "Private stores") — or where a delta spells its parent by
782
+ title rather than by the map's id (the archive's documented remainder). What is
783
+ left is the CROSS-SERVICE EDGE, which still exists twice — container-level in the model,
784
+ service-level in the map — and that duplication is **deliberate**, not a leftover: the spine, the
785
+ platform census, `landscape.service-isolated` and every other fleet check read the map alone,
786
+ which is what lets a fleet answer "who calls this service" from one diffable document without
787
+ parsing sixty. Thinning the map to elements plus cross-service edges means teaching those checks
788
+ to read the edges out of the models that attest them, and paying the blast radius that comes with
789
+ it. If same-service conflicts become routine — the current trigger in [SCHEMA.md](SCHEMA.md) is
790
+ weekly rather than monthly — evaluate that. Migration must
791
+ preserve archive/undo, deterministic resolution, and readable plain files.
792
+ - **Authored business axis — PROMOTED 2026-08-27, and landed in full; see
793
+ [Recently landed](#recently-landed).** The gate asked for evidence of authorship: analyst edits
794
+ appearing in `services/*/spec.md` history, or capability-level requirements accumulating as prose
795
+ that no requirement realizes. The maintainer supplied it as a statement about how his fleet works
796
+ rather than as git history — business does not think in services, and an analyst does not write
797
+ them — and the shape of the hole was verified rather than argued: **every requirement loam knew
798
+ belonged to exactly one service directory**, so an analyst’s whole surface was a declared name in
799
+ `capabilities.yaml` plus an `intent.md` that is archived with its feature. No living
800
+ business-level document existed at any altitude. The full gated text, including the four sub-items
801
+ and the cascade it follows, is in this file’s history (`git show 53c762a:ROADMAP.md`).
802
+
803
+ Exit criteria for promoting a Later item:
804
+
805
+ - Evidence comes from at least two independent operators or fleets, except landscape scaling, the
806
+ authored business axis and — added 2026-09-02 — the deployment axis in [Now](#now), whose recorded
807
+ triggers are sufficient. Three exceptions is where this criterion starts describing the rule
808
+ rather than the exception: the next single-operator promotion has to say why the criterion should
809
+ survive, or retire it.
810
+ - An ADR compares the existing workflow, external tooling, and the smallest loam-owned change.
811
+ - A prototype is measured against a predeclared acceptance criterion and preserves every non-goal
812
+ below.
813
+ - The feature returns to this roadmap under a numbered priority before production implementation
814
+ begins.
815
+
816
+ ## Self-hosting: loam on loam
817
+
818
+ Placed in a section of its own, and the placement is the argument. This is not a `## Now` item, and
819
+ nothing here may be mistaken for one. It is not a "Later" candidate either: promotion
820
+ from that section requires evidence from at least two independent operators or fleets (bar the three
821
+ whose recorded triggers were judged sufficient when they were written), and loam's own repository is
822
+ one operator by construction, so a Later entry could only ever be a permanent exception to the rule
823
+ it sits under. Nor is its value speculative — the trigger below is a defect this repository has
824
+ already produced by hand. As with every other section here, the position implies no schedule.
825
+
826
+ ### Model loam's own architecture in loam
827
+
828
+ loam's architecture is already specified in prose and already executable:
829
+ [docs/DESIGN.md](https://github.com/ybotok/loam/blob/main/docs/DESIGN.md) states it as numbered
830
+ rules, and `npm run arch:check`
831
+ ([scripts/arch-check.mjs](https://github.com/ybotok/loam/blob/main/scripts/arch-check.mjs)) over
832
+ [scripts/package-graph.mjs](https://github.com/ybotok/loam/blob/main/scripts/package-graph.mjs) is
833
+ their proof. That is exactly the shape of an `arch.spec.md` whose requirements carry `Covers:` lines
834
+ onto a LikeC4 model of loam's own package graph — the one axis where loam's subject matter and
835
+ loam's own tree are the same object.
836
+
837
+ The recorded trigger is two defects that reviewers caught **by hand** during the session that
838
+ produced the current `[Unreleased]` [CHANGELOG.md](CHANGELOG.md), both of which a
839
+ `c4.uncovered`-style check convicts mechanically: a package of one file — a `core/review/`, against
840
+ DESIGN's own "a package of one is a directory pretending to be a subject" — and a package-layout
841
+ table that had stopped describing the tree.
842
+
843
+ Both are closed, and the second was worse than the hand check found. Checked 2026-08-27 the table
844
+ was missing four rows; measured 2026-08-29 against the derived graph it was missing **nine**
845
+ (`brief`, `explain`, `glossary`, `links`, `obligations`, `owners`, `provenance`, `scaffold`,
846
+ `usecases`) and carried a false `Depends on` cell in **eleven more** — `core/c4/` claimed to depend
847
+ on nothing while importing `repo` and `kernel`. That is the difference the item was written to buy:
848
+ a hand check finds what a reader happens to look at, and a derived one finds the column nobody
849
+ re-read. DESIGN carries 26 numbered rules under `## Rules`, plus two more in the package-layout
850
+ section.
851
+
852
+ What does not fit is larger, and pretending otherwise would be the failure this document is written
853
+ against. loam is one CLI, not a fleet: there is no service topology, no OpenAPI, no AsyncAPI and no
854
+ authorization vocabulary, so the `operationId` spine, the message spine and `Requires:` have nothing
855
+ to join. Roughly half of `validate`'s checks would be permanently silent, and a check that is silent
856
+ because nothing asked it must never be read as a check that passed. The evidence axis is worse:
857
+ loam's own tests are vitest, not cucumber, so every scenario claim would be `attested` and never
858
+ `verified` — the distinction loam exists to make would be the one property self-hosting does not
859
+ exercise. Building a vitest-to-cucumber-JSON bridge to improve that number is precisely the invented
860
+ need the non-goals below forbid — "an agent-confirmed scenario does not become verified merely to
861
+ make a gate green" — and if such a bridge ever lands it must be because someone's fleet needed it.
862
+
863
+ One layout constraint is settled rather than open. `loam.json` is in
864
+ [.gitignore](https://github.com/ybotok/loam/blob/main/.gitignore) at the root and no root config is
865
+ committed: one there governs every directory beneath it, this whole clone included. The self-docs
866
+ therefore live under a subdirectory carrying its own config — `meta/loam.json` over `meta/docs/` —
867
+ which works because config discovery walks upward from the cwd, and it is the shape
868
+ [`examples/docs/`](https://github.com/ybotok/loam/tree/main/examples/docs) now carries too.
869
+
870
+ **Self-hosting is not external evidence.** A repository maintained solely for loam is one operator
871
+ by construction, so nothing here substitutes for proof from fleets that are not loam's own. That is
872
+ not an obstacle to route around; it is the reason this item is written separately. This buys daily
873
+ pressure on loam's own seams — a different kind of evidence.
874
+
875
+ The recommended first step is the architecture axis only:
876
+
877
+ - `meta/docs/` holding one landscape whose elements are loam's own source packages and whose edges
878
+ are the real import edges
879
+ [scripts/package-graph.mjs](https://github.com/ybotok/loam/blob/main/scripts/package-graph.mjs)
880
+ already computes.
881
+ - One service, `loam`, whose `arch.spec.md` carries DESIGN's numbered rules as requirements with
882
+ `Covers:` lines onto that model.
883
+ - `loam validate --all` running in CI beside `npm run arch:check`, in
884
+ [.github/workflows/ci.yml](https://github.com/ybotok/loam/blob/main/.github/workflows/ci.yml).
885
+
886
+ **Landed.** `meta/docs/` holds a landscape whose 70 containers are the top-level subjects of `src/`
887
+ and whose 403 relationships are the real value imports, and `services/loam/arch.spec.md` carries
888
+ fourteen of DESIGN's numbered rules as requirements with `Covers:` lines onto real model objects.
889
+ `npm run meta:check` runs in CI beside `npm run arch:check`. Each exit criterion, discharged:
890
+
891
+ - **It convicted drift `arch:check` cannot see, and the drift is fixed here.** Nine missing
892
+ package-layout rows and eleven false `Depends on` cells; a DAG-levels table that placed `verify/`
893
+ below `gherkin/`, which it imports; a "7-level DAG" that is ten levels per package and eleven per
894
+ file; DESIGN's register-call sentence reading 27/28 against a tree of 28/29 — **whose pin in
895
+ `test/docs-facts.test.ts` had never once matched**, because it required a literal space where the
896
+ page wraps. That loop now runs over the flattened text and asserts the sentence is present before
897
+ grading it. And two mutual dependencies between top-level subjects that `arch:graph` cannot see at
898
+ all, because it keys on the full relative directory so `core/c4/project` and `core/c4` are
899
+ different nodes: `core/c4` ↔ `core/repo` and `core/repo` ↔ `core/provenance`. Both are hub moves
900
+ under the `git mv`-in-its-own-commit obligation, so they are **qualified rather than broken** —
901
+ DESIGN now names which granularity is checked and by what, and `scripts/self-model.mjs` holds them
902
+ in an `ACCEPTED_CYCLES` baseline that may only shrink. Breaking them is the follow-up.
903
+ - **Nothing exists only to make a check fire, and here are the families that stay silent.**
904
+ `meta/docs` declares no `openapi.yaml`, `asyncapi.yaml`, `permissions.yaml`, `capabilities.yaml`,
905
+ `health.yaml`, no `sources:`, no `dynamic view` and no feature in flight — so `api.*`, `event.*`,
906
+ `spine.*`, `permissions.*`, `capability.*`, `health.*`, `usecase.*`, `obligation.*`, `link.*`,
907
+ `glossary.*`, `delta.*`, `openapi.*`, `asyncapi.*`, `archedge.*` and every `verify`/`vouch` claim
908
+ family are silent because nothing asked them. A green run here is two `ok` findings and two
909
+ `warn`s. It is not a fleet's worth of coverage and must not be read as one; the same list opens
910
+ `services/loam/arch.spec.md`, so a reader of the tree hits it before the requirements.
911
+ - **The CI cost is measured**: `npm run meta:check` is 149/149/159 ms over three runs on the Linux
912
+ gate host — about a fifth of the 671/707 ms `npm run arch:check` it sits beside — plus 1.11 s of
913
+ test time for `test/self-model.test.ts`, which runs in parallel inside the suite.
914
+ - **No root `loam.json` is committed.** `.gitignore`'s pattern was unanchored and so ignored a file
915
+ of that name at ANY depth, `meta/loam.json` included; it is now `/loam.json`, a developer's own
916
+ local pointer at the root is still ignored, and a committed one in a subdirectory is not.
917
+ - **Every scenario claim stays `attested`** — vacuously, and that is worth saying rather than
918
+ ticking. The model produces **zero** claims: claims come from features, and there is no feature.
919
+ Nothing was built to convert one, and nothing could have been.
920
+
921
+ What the axis found about the PRODUCT, which is what it was built to buy:
922
+
923
+ - **A docs repo cannot describe a source tree above its own `loam.json`.** `repoDir` is the cwd only
924
+ when the config's own `service` field matches, and `meta/loam.json` sits below the tree it
925
+ describes, so the only spelling that reaches `src/` is `../src/` — which `sources.path-outside`
926
+ correctly refuses. There is no spelling that works. Provenance is dark, `loam vouch` has nothing
927
+ to stamp, and maturity is capped below `sourced`. That is why the pinned warning count is two.
928
+ - **`c4.uncovered` has no living scope.** It grades only what a FEATURE DELTA introduces, so with no
929
+ feature open, 70 containers and 403 edges raise nothing. `covers.unknown` proves the `Covers:`
930
+ lines resolve and says nothing about what is left over. `obligation.uncovered` is the shape that
931
+ would answer this over a living map; this tree declares no obligations yet.
932
+ - **The fleet scorecard counts service-LEVEL elements**, so a 70-box model reports
933
+ `c4: {elements: 1, covered: 0}` — correct by its own definition and badly misleading here.
934
+ - **`services/core/` + `services/commands/` is unspellable, not merely unwise**: the one flat
935
+ namespace for subsystem names and service ids collides on eleven leaf names. Nesting inside one
936
+ bound system is what keeps `landscape.service-undocumented` correctly quiet, but it means the
937
+ service census answers "1" and every `landscape.*` shape advisory walks a set of one.
938
+ - **`agents.stale` will fire on loam's own docs repo at the next version bump**, because
939
+ `meta/docs/AGENTS.md` carries a generated-by stamp. That is the axis working — daily pressure on a
940
+ seam — and it is now a release-checklist item: re-stamp the file and update the pin.
941
+ `examples/docs` has no `AGENTS.md`, so nothing had ever surfaced this.
942
+ - **And `agents.stale` is graded on the STAMP, not the content**, which the same file then
943
+ demonstrated: `meta/docs/AGENTS.md` was already behind `src/` — by the AsyncAPI and OpenAPI merge
944
+ sections, before this change added two more — and every command reported the repo healthy, because
945
+ the version in the stamp still matched. A docs repo whose `AGENTS.md` was generated by THIS version
946
+ and has since been left behind by a same-version change is silently wrong, and there is no check
947
+ that can see it. The file is regenerated here; what would close it properly is a content digest
948
+ beside the stamp, which is a real design question (an AGENTS.md a fleet has edited by hand is a
949
+ supported state, and a digest would convict it) and is not attempted.
950
+ - **`loam init` writes agent tooling into the cwd**, so a self-model directory inside a repository
951
+ that already has `.claude/` gets a duplicate set. `--no-commands --no-skills` is the escape hatch
952
+ and it works, but "the docs tree" and "this repository's agent tooling" are one command today.
953
+
954
+ ### The forward flow on loam's own repository — TRIED, then ADOPTED
955
+
956
+ Whether loam's own changes go through `loam new`, `loam delta`, `loam archive` and `loam verify` per
957
+ feature was the one question this section left open, because it is a far larger process commitment
958
+ than one modeled axis: it changes how every change to this repository is WRITTEN rather than how one
959
+ property of it is checked. It was first run as an experiment, on a throwaway copy of `meta/`, against
960
+ the use-case work in this same change — and then taken as a decision.
961
+
962
+ **What was adopted, and it is deliberately not "everything through the flow".** The maintenance
963
+ obligations are unconditional and are now in the gate: `npm run meta:check` after any change that
964
+ moves an import between two top-level subjects, and `npm run meta:agents` after any edit to the
965
+ sections that generate a docs repo's `AGENTS.md`. The forward flow itself is for a change somebody
966
+ should be able to read back as a DECISION — a new subject, a seam moved, a rule added to DESIGN —
967
+ and a one-line edge stays a direct edit. `AGENTS.md`'s "The self-model" section states the rule and
968
+ the `self-model` skill carries the commands, the frictions and the silent-check list.
969
+
970
+ **Mechanically it works, end to end and with no special-casing.** `loam new FEAT-1 --touches loam`
971
+ scaffolded the feature; the C4 delta re-declared the four containers its new edges join and tagged
972
+ the edges `#FEAT-1`; the architectural requirement went into `specs/loam/arch.spec.md` as an
973
+ `## ADDED Requirements` delta; `loam validate --feature` passed; `loam archive` merged four
974
+ relationships into the landscape and the requirement into the living `arch.spec.md`. The archived
975
+ result was compared against the same two edits made BY HAND, and the edge sets are identical.
976
+ `npm run meta:check` reports the written model describes the tree either way.
977
+
978
+ **Four things the trial found, and each is the axis earning its keep rather than an obstacle:**
979
+
980
+ - **`loam delta` printed `Covers:` twice.** A directive line is a body line — `core/document/parse.ts`
981
+ keeps it in `text` so a requirement round-trips and its digest stays stable — and the briefing
982
+ printed the body verbatim AND the parsed field underneath. So `Operations:` and `Covers:` showed
983
+ twice while the five directives with no such re-print showed once. Fixed and pinned in this
984
+ change. Nothing had caught it because the human view is asserted almost nowhere and the
985
+ duplication is invisible on a requirement carrying neither line.
986
+ - **The scaffold's delta template assumes a fleet of top-level systems.** It offers
987
+ `x = softwareSystem 'x'` and an edge between two of them; the self-model is 70 nested `container`s
988
+ inside one bound system, so every line of the template has to be deleted and the nesting
989
+ re-declared by hand. Not wrong — the template is written for loam's distributed-system entry
990
+ path — but the first feature in a nested single-boundary model costs a read of
991
+ `landscape.likec4` to find out.
992
+ - **`loam new` scaffolds the BUSINESS axis and the self-model has only the architectural one.**
993
+ `specs/loam/spec.md` arrives and has to be deleted, and `specs/loam/arch.spec.md` written by hand;
994
+ there is no `--arch` to say which axis a feature is about.
995
+ - **The arch-edge coverage line reads `loam → loam` once per edge**, because every edge is between
996
+ two containers inside one bound system. Correct by its own definition, and useless here — the same
997
+ shape as the fleet scorecard reporting `c4: {elements: 1}` over a 70-box model, already recorded
998
+ above.
999
+
1000
+ **What it still cannot buy is the evidence axis, and that is unchanged.** loam's tests are vitest,
1001
+ not cucumber, so `loam verify` would record every scenario claim as `attested` and never `verified`
1002
+ — the distinction loam exists to make is the one property self-hosting does not exercise. Building a
1003
+ vitest-to-cucumber-JSON bridge to improve that number remains the invented need the non-goals forbid.
1004
+
1005
+ The cost was always process rather than capability, and the trial confirmed it: nothing prevents the
1006
+ flow, and the frictions are four rough edges in a scaffold written for a fleet of top-level systems.
1007
+ The decision taken is to pay that cost for changes worth reading back as decisions, and to make the
1008
+ two maintenance obligations unconditional — which is the half that had already been failing silently,
1009
+ twice, before anybody chose anything.
1010
+
1011
+ **One thing this does NOT change.** A repository maintained solely for loam is one operator by
1012
+ construction, so nothing adopted here counts as external evidence for a `## Later` item. That was the
1013
+ reason this section sits apart from the promotion rules, and adopting a process inside it does not
1014
+ move that line.
1015
+
1016
+ ## Non-goals
1017
+
1018
+ - No hosted control plane, server, database, background synchronizer, or network-owned source of
1019
+ truth.
1020
+ - No code extractor or generated architecture presented as truth. Agents may read and propose; loam
1021
+ owns deterministic questions, formats, and checks.
1022
+ - No full OpenSpec clone, bidirectional OpenSpec writer, or claim of compatibility beyond the exact
1023
+ pinned corpus and explicitly supported Markdown grammar.
1024
+ - No replacement for LikeC4's renderer, the forge's ownership/review controls, or a service's
1025
+ contract and test tooling.
1026
+ - No weakening of attested-versus-tested evidence: an agent-confirmed scenario does not become
1027
+ verified merely to make a gate green.
1028
+ - No runtime dependency added to avoid implementing a small invariant with Node and the existing
1029
+ stack.
1030
+ - No workspace split, barrel exports, command-oriented vertical slices, or architectural rewrite for
1031
+ aesthetics. The single binary and acyclic source-package tree remain deliberate.
1032
+ - No silent break to commands, flags, exit codes, JSON envelope fields, stable codes, or the
1033
+ plain-file formats users already commit.
1034
+ - No schedule inferred from section order. Priority says what must become true first; evidence
1035
+ decides when it is true.