@ybotok/loam 0.1.0-beta.3 → 0.2.0-alpha.2

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 (1036) hide show
  1. package/CHANGELOG.md +2635 -86
  2. package/COMPARISON.md +80 -63
  3. package/CONTRIBUTING.md +84 -0
  4. package/MIGRATING-from-OpenSpec.md +213 -54
  5. package/QUICKSTART.md +125 -0
  6. package/README.md +450 -150
  7. package/ROADMAP.md +599 -0
  8. package/SCHEMA.md +2355 -256
  9. package/SECURITY.md +21 -3
  10. package/WORKFLOW.md +701 -0
  11. package/dist/cli.js +113 -19
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/adopt/adopt.js +209 -0
  14. package/dist/commands/adopt/adopt.js.map +1 -0
  15. package/dist/commands/adopt/render.js +268 -0
  16. package/dist/commands/adopt/render.js.map +1 -0
  17. package/dist/commands/archive/archive.js +77 -0
  18. package/dist/commands/archive/archive.js.map +1 -0
  19. package/dist/commands/archive/plan/contracts/asyncapi.js +178 -0
  20. package/dist/commands/archive/plan/contracts/asyncapi.js.map +1 -0
  21. package/dist/commands/archive/plan/contracts/openapi.js +159 -0
  22. package/dist/commands/archive/plan/contracts/openapi.js.map +1 -0
  23. package/dist/commands/archive/plan/gate.js +323 -0
  24. package/dist/commands/archive/plan/gate.js.map +1 -0
  25. package/dist/commands/archive/plan/landscape.js +180 -0
  26. package/dist/commands/archive/plan/landscape.js.map +1 -0
  27. package/dist/commands/archive/plan/refusal.js +111 -0
  28. package/dist/commands/archive/plan/refusal.js.map +1 -0
  29. package/dist/commands/archive/plan/specs.js +237 -0
  30. package/dist/commands/archive/plan/specs.js.map +1 -0
  31. package/dist/commands/archive/plan/state.js +27 -0
  32. package/dist/commands/archive/plan/state.js.map +1 -0
  33. package/dist/commands/archive/run.js +252 -0
  34. package/dist/commands/archive/run.js.map +1 -0
  35. package/dist/commands/context/context.js +99 -0
  36. package/dist/commands/context/context.js.map +1 -0
  37. package/dist/commands/context/print.js +283 -0
  38. package/dist/commands/context/print.js.map +1 -0
  39. package/dist/commands/delta/delta.js +279 -0
  40. package/dist/commands/delta/delta.js.map +1 -0
  41. package/dist/commands/delta/print.js +205 -0
  42. package/dist/commands/delta/print.js.map +1 -0
  43. package/dist/commands/dependencies.js +9 -7
  44. package/dist/commands/dependencies.js.map +1 -1
  45. package/dist/commands/diff/diff.js +93 -0
  46. package/dist/commands/diff/diff.js.map +1 -0
  47. package/dist/commands/diff/print.js +38 -0
  48. package/dist/commands/diff/print.js.map +1 -0
  49. package/dist/commands/doctor.js +5 -4
  50. package/dist/commands/doctor.js.map +1 -1
  51. package/dist/commands/explain/explain.js +151 -0
  52. package/dist/commands/explain/explain.js.map +1 -0
  53. package/dist/commands/explore.js +29 -24
  54. package/dist/commands/explore.js.map +1 -1
  55. package/dist/commands/gate/gate.js +115 -0
  56. package/dist/commands/gate/gate.js.map +1 -0
  57. package/dist/commands/gate/print.js +54 -0
  58. package/dist/commands/gate/print.js.map +1 -0
  59. package/dist/commands/gherkin/commit.js +146 -0
  60. package/dist/commands/gherkin/commit.js.map +1 -0
  61. package/dist/commands/gherkin/gherkin.js +246 -0
  62. package/dist/commands/gherkin/gherkin.js.map +1 -0
  63. package/dist/commands/gherkin/reconcile.js +149 -0
  64. package/dist/commands/gherkin/reconcile.js.map +1 -0
  65. package/dist/commands/gherkin/render.js +77 -0
  66. package/dist/commands/gherkin/render.js.map +1 -0
  67. package/dist/commands/init/example.js +204 -0
  68. package/dist/commands/init/example.js.map +1 -0
  69. package/dist/commands/init/first-hour.js +28 -0
  70. package/dist/commands/init/first-hour.js.map +1 -0
  71. package/dist/commands/{init.js → init/init.js} +146 -71
  72. package/dist/commands/init/init.js.map +1 -0
  73. package/dist/commands/init/mcp.js +131 -0
  74. package/dist/commands/init/mcp.js.map +1 -0
  75. package/dist/commands/init/options.js +78 -0
  76. package/dist/commands/init/options.js.map +1 -0
  77. package/dist/commands/instructions.js +72 -14
  78. package/dist/commands/instructions.js.map +1 -1
  79. package/dist/commands/list/campaign/campaign.js +65 -0
  80. package/dist/commands/list/campaign/campaign.js.map +1 -0
  81. package/dist/commands/list/campaign/owners.js +65 -0
  82. package/dist/commands/list/campaign/owners.js.map +1 -0
  83. package/dist/commands/list/json.js +157 -0
  84. package/dist/commands/list/json.js.map +1 -0
  85. package/dist/commands/list/list.js +343 -0
  86. package/dist/commands/list/list.js.map +1 -0
  87. package/dist/commands/list/print.js +301 -0
  88. package/dist/commands/list/print.js.map +1 -0
  89. package/dist/commands/list/review.js +120 -0
  90. package/dist/commands/list/review.js.map +1 -0
  91. package/dist/commands/list/views.js +105 -0
  92. package/dist/commands/list/views.js.map +1 -0
  93. package/dist/commands/mcp/dispatch.js +183 -0
  94. package/dist/commands/mcp/dispatch.js.map +1 -0
  95. package/dist/commands/mcp/mcp.js +34 -0
  96. package/dist/commands/mcp/mcp.js.map +1 -0
  97. package/dist/commands/mcp/serve.js +55 -0
  98. package/dist/commands/mcp/serve.js.map +1 -0
  99. package/dist/commands/migrate-openspec/materialize/active.js +170 -0
  100. package/dist/commands/migrate-openspec/materialize/active.js.map +1 -0
  101. package/dist/commands/migrate-openspec/materialize/feature.js +41 -0
  102. package/dist/commands/migrate-openspec/materialize/feature.js.map +1 -0
  103. package/dist/commands/migrate-openspec/materialize/living.js +62 -0
  104. package/dist/commands/migrate-openspec/materialize/living.js.map +1 -0
  105. package/dist/commands/migrate-openspec/materialize/stage.js +142 -0
  106. package/dist/commands/migrate-openspec/materialize/stage.js.map +1 -0
  107. package/dist/commands/migrate-openspec/materialize/target.js +219 -0
  108. package/dist/commands/migrate-openspec/materialize/target.js.map +1 -0
  109. package/dist/commands/migrate-openspec/migrate-openspec.js +142 -0
  110. package/dist/commands/migrate-openspec/migrate-openspec.js.map +1 -0
  111. package/dist/commands/migrate-openspec/openspec/decisions.js +91 -0
  112. package/dist/commands/migrate-openspec/openspec/decisions.js.map +1 -0
  113. package/dist/commands/migrate-openspec/openspec/error.js +19 -0
  114. package/dist/commands/migrate-openspec/openspec/error.js.map +1 -0
  115. package/dist/commands/migrate-openspec/openspec/mapping.js +170 -0
  116. package/dist/commands/migrate-openspec/openspec/mapping.js.map +1 -0
  117. package/dist/commands/migrate-openspec/openspec/paths.js +43 -0
  118. package/dist/commands/migrate-openspec/openspec/paths.js.map +1 -0
  119. package/dist/commands/migrate-openspec/openspec/read.js +49 -0
  120. package/dist/commands/migrate-openspec/openspec/read.js.map +1 -0
  121. package/dist/commands/migrate-openspec/print.js +89 -0
  122. package/dist/commands/migrate-openspec/print.js.map +1 -0
  123. package/dist/commands/new/commit.js +76 -0
  124. package/dist/commands/new/commit.js.map +1 -0
  125. package/dist/commands/new/new.js +283 -0
  126. package/dist/commands/new/new.js.map +1 -0
  127. package/dist/commands/new/templates.js +355 -0
  128. package/dist/commands/new/templates.js.map +1 -0
  129. package/dist/commands/open.js +203 -0
  130. package/dist/commands/open.js.map +1 -0
  131. package/dist/commands/policy/format.js +152 -0
  132. package/dist/commands/policy/format.js.map +1 -0
  133. package/dist/commands/{docs-repo-gate.js → policy/gate.js} +11 -11
  134. package/dist/commands/policy/gate.js.map +1 -0
  135. package/dist/commands/rebase/edit.js +106 -0
  136. package/dist/commands/rebase/edit.js.map +1 -0
  137. package/dist/commands/rebase/living.js +185 -0
  138. package/dist/commands/rebase/living.js.map +1 -0
  139. package/dist/commands/rebase/plan.js +245 -0
  140. package/dist/commands/rebase/plan.js.map +1 -0
  141. package/dist/commands/rebase/rebase.js +275 -0
  142. package/dist/commands/rebase/rebase.js.map +1 -0
  143. package/dist/commands/seed/commit.js +192 -0
  144. package/dist/commands/seed/commit.js.map +1 -0
  145. package/dist/commands/seed/plan.js +133 -0
  146. package/dist/commands/seed/plan.js.map +1 -0
  147. package/dist/commands/seed/seed.js +172 -0
  148. package/dist/commands/seed/seed.js.map +1 -0
  149. package/dist/commands/show/feature.js +178 -0
  150. package/dist/commands/show/feature.js.map +1 -0
  151. package/dist/commands/show/marks.js +24 -0
  152. package/dist/commands/show/marks.js.map +1 -0
  153. package/dist/commands/{show.js → show/service.js} +63 -152
  154. package/dist/commands/show/service.js.map +1 -0
  155. package/dist/commands/show/show.js +77 -0
  156. package/dist/commands/show/show.js.map +1 -0
  157. package/dist/commands/status/json.js +45 -0
  158. package/dist/commands/status/json.js.map +1 -0
  159. package/dist/commands/status/print.js +157 -0
  160. package/dist/commands/status/print.js.map +1 -0
  161. package/dist/commands/status/status.js +119 -0
  162. package/dist/commands/status/status.js.map +1 -0
  163. package/dist/commands/steps/steps.js +189 -0
  164. package/dist/commands/steps/steps.js.map +1 -0
  165. package/dist/commands/subsystem/edit.js +192 -0
  166. package/dist/commands/subsystem/edit.js.map +1 -0
  167. package/dist/commands/subsystem/move.js +265 -0
  168. package/dist/commands/subsystem/move.js.map +1 -0
  169. package/dist/commands/subsystem/query.js +115 -0
  170. package/dist/commands/subsystem/query.js.map +1 -0
  171. package/dist/commands/subsystem/subsystem.js +101 -0
  172. package/dist/commands/subsystem/subsystem.js.map +1 -0
  173. package/dist/commands/subsystem/sync.js +103 -0
  174. package/dist/commands/subsystem/sync.js.map +1 -0
  175. package/dist/commands/subsystem/txn/txn.js +94 -0
  176. package/dist/commands/subsystem/txn/txn.js.map +1 -0
  177. package/dist/commands/subsystem/txn/views.js +70 -0
  178. package/dist/commands/subsystem/txn/views.js.map +1 -0
  179. package/dist/commands/unarchive/manifest.js +160 -0
  180. package/dist/commands/unarchive/manifest.js.map +1 -0
  181. package/dist/commands/{unarchive.js → unarchive/restore.js} +47 -160
  182. package/dist/commands/unarchive/restore.js.map +1 -0
  183. package/dist/commands/unarchive/unarchive.js +67 -0
  184. package/dist/commands/unarchive/unarchive.js.map +1 -0
  185. package/dist/commands/validate/arch-coverage.js +204 -0
  186. package/dist/commands/validate/arch-coverage.js.map +1 -0
  187. package/dist/commands/validate/checks/fleet-shape.js +296 -0
  188. package/dist/commands/validate/checks/fleet-shape.js.map +1 -0
  189. package/dist/commands/validate/checks/health-deps.js +55 -0
  190. package/dist/commands/validate/checks/health-deps.js.map +1 -0
  191. package/dist/commands/validate/checks/requirements.js +254 -0
  192. package/dist/commands/validate/checks/requirements.js.map +1 -0
  193. package/dist/commands/validate/checks/sources.js +76 -0
  194. package/dist/commands/validate/checks/sources.js.map +1 -0
  195. package/dist/commands/validate/checks/vocabulary.js +31 -0
  196. package/dist/commands/validate/checks/vocabulary.js.map +1 -0
  197. package/dist/commands/validate/feature.js +216 -0
  198. package/dist/commands/validate/feature.js.map +1 -0
  199. package/dist/commands/validate/fleet/census.js +69 -0
  200. package/dist/commands/validate/fleet/census.js.map +1 -0
  201. package/dist/commands/validate/fleet/kind-tags.js +39 -0
  202. package/dist/commands/validate/fleet/kind-tags.js.map +1 -0
  203. package/dist/commands/validate/fleet/landscape.js +353 -0
  204. package/dist/commands/validate/fleet/landscape.js.map +1 -0
  205. package/dist/commands/validate/fleet/load.js +52 -0
  206. package/dist/commands/validate/fleet/load.js.map +1 -0
  207. package/dist/commands/validate/fleet/obligations.js +270 -0
  208. package/dist/commands/validate/fleet/obligations.js.map +1 -0
  209. package/dist/commands/validate/fleet/scorecard/adoption.js +102 -0
  210. package/dist/commands/validate/fleet/scorecard/adoption.js.map +1 -0
  211. package/dist/commands/validate/fleet/scorecard/contracts.js +98 -0
  212. package/dist/commands/validate/fleet/scorecard/contracts.js.map +1 -0
  213. package/dist/commands/validate/fleet/scorecard/print.js +63 -0
  214. package/dist/commands/validate/fleet/scorecard/print.js.map +1 -0
  215. package/dist/commands/validate/fleet/scorecard/scorecard.js +156 -0
  216. package/dist/commands/validate/fleet/scorecard/scorecard.js.map +1 -0
  217. package/dist/commands/validate/fleet/usecases/capability-tag.js +94 -0
  218. package/dist/commands/validate/fleet/usecases/capability-tag.js.map +1 -0
  219. package/dist/commands/validate/fleet/usecases/place.js +13 -0
  220. package/dist/commands/validate/fleet/usecases/place.js.map +1 -0
  221. package/dist/commands/validate/fleet/usecases/requirement-tag.js +95 -0
  222. package/dist/commands/validate/fleet/usecases/requirement-tag.js.map +1 -0
  223. package/dist/commands/validate/fleet/usecases/steps.js +197 -0
  224. package/dist/commands/validate/fleet/usecases/steps.js.map +1 -0
  225. package/dist/commands/validate/fleet/usecases/usecases.js +99 -0
  226. package/dist/commands/validate/fleet/usecases/usecases.js.map +1 -0
  227. package/dist/commands/validate/fleet/views/ids.js +40 -0
  228. package/dist/commands/validate/fleet/views/ids.js.map +1 -0
  229. package/dist/commands/validate/fleet/views/stale.js +59 -0
  230. package/dist/commands/validate/fleet/views/stale.js.map +1 -0
  231. package/dist/commands/validate/links/corpus.js +92 -0
  232. package/dist/commands/validate/links/corpus.js.map +1 -0
  233. package/dist/commands/validate/links/glossary.js +75 -0
  234. package/dist/commands/validate/links/glossary.js.map +1 -0
  235. package/dist/commands/validate/report.js +269 -0
  236. package/dist/commands/validate/report.js.map +1 -0
  237. package/dist/commands/validate/service/api.js +338 -0
  238. package/dist/commands/validate/service/api.js.map +1 -0
  239. package/dist/commands/validate/service/events/events.js +219 -0
  240. package/dist/commands/validate/service/events/events.js.map +1 -0
  241. package/dist/commands/validate/service/events/message-producers.js +77 -0
  242. package/dist/commands/validate/service/events/message-producers.js.map +1 -0
  243. package/dist/commands/validate/service/evidence-pins.js +131 -0
  244. package/dist/commands/validate/service/evidence-pins.js.map +1 -0
  245. package/dist/commands/validate/service/service.js +251 -0
  246. package/dist/commands/validate/service/service.js.map +1 -0
  247. package/dist/commands/validate/service/specs.js +251 -0
  248. package/dist/commands/validate/service/specs.js.map +1 -0
  249. package/dist/commands/validate/service/spine.js +113 -0
  250. package/dist/commands/validate/service/spine.js.map +1 -0
  251. package/dist/commands/validate/validate.js +338 -0
  252. package/dist/commands/validate/validate.js.map +1 -0
  253. package/dist/commands/verify/cross/diff.js +182 -0
  254. package/dist/commands/verify/cross/diff.js.map +1 -0
  255. package/dist/commands/verify/evidence/contract.js +32 -0
  256. package/dist/commands/verify/evidence/contract.js.map +1 -0
  257. package/dist/commands/verify/evidence/pins.js +52 -0
  258. package/dist/commands/verify/evidence/pins.js.map +1 -0
  259. package/dist/commands/verify/evidence/read.js +72 -0
  260. package/dist/commands/verify/evidence/read.js.map +1 -0
  261. package/dist/commands/verify/frozen.js +241 -0
  262. package/dist/commands/verify/frozen.js.map +1 -0
  263. package/dist/commands/verify/record.js +226 -0
  264. package/dist/commands/verify/record.js.map +1 -0
  265. package/dist/commands/verify/report.js +223 -0
  266. package/dist/commands/verify/report.js.map +1 -0
  267. package/dist/commands/verify/results.js +246 -0
  268. package/dist/commands/verify/results.js.map +1 -0
  269. package/dist/commands/verify/verify.js +217 -0
  270. package/dist/commands/verify/verify.js.map +1 -0
  271. package/dist/commands/vouch/contract.js +11 -0
  272. package/dist/commands/vouch/contract.js.map +1 -0
  273. package/dist/commands/vouch/pack/contract.js +2 -0
  274. package/dist/commands/vouch/pack/contract.js.map +1 -0
  275. package/dist/commands/vouch/pack/pack.js +266 -0
  276. package/dist/commands/vouch/pack/pack.js.map +1 -0
  277. package/dist/commands/vouch/pack/print.js +271 -0
  278. package/dist/commands/vouch/pack/print.js.map +1 -0
  279. package/dist/commands/vouch/pack/sections.js +142 -0
  280. package/dist/commands/vouch/pack/sections.js.map +1 -0
  281. package/dist/commands/vouch/prompt/confirm.js +46 -0
  282. package/dist/commands/vouch/prompt/confirm.js.map +1 -0
  283. package/dist/commands/vouch/report.js +101 -0
  284. package/dist/commands/vouch/report.js.map +1 -0
  285. package/dist/commands/vouch/run.js +285 -0
  286. package/dist/commands/vouch/run.js.map +1 -0
  287. package/dist/commands/vouch/sample/plan.js +125 -0
  288. package/dist/commands/vouch/sample/plan.js.map +1 -0
  289. package/dist/commands/vouch/sample/print.js +109 -0
  290. package/dist/commands/vouch/sample/print.js.map +1 -0
  291. package/dist/commands/vouch/vet/verify.js +123 -0
  292. package/dist/commands/vouch/vet/verify.js.map +1 -0
  293. package/dist/commands/vouch/vouch.js +176 -0
  294. package/dist/commands/vouch/vouch.js.map +1 -0
  295. package/dist/core/agent/agents-md/artifacts.js +220 -0
  296. package/dist/core/agent/agents-md/artifacts.js.map +1 -0
  297. package/dist/core/agent/agents-md/command-map.js +324 -0
  298. package/dist/core/agent/agents-md/command-map.js.map +1 -0
  299. package/dist/core/agent/agents-md/cycle.js +165 -0
  300. package/dist/core/agent/agents-md/cycle.js.map +1 -0
  301. package/dist/core/agent/agents-md/map/explain.js +34 -0
  302. package/dist/core/agent/agents-md/map/explain.js.map +1 -0
  303. package/dist/core/agent/agents-md/map/lenses/context.js +41 -0
  304. package/dist/core/agent/agents-md/map/lenses/context.js.map +1 -0
  305. package/dist/core/agent/agents-md/map/lenses/diff.js +46 -0
  306. package/dist/core/agent/agents-md/map/lenses/diff.js.map +1 -0
  307. package/dist/core/agent/agents-md/map/lenses/gate.js +57 -0
  308. package/dist/core/agent/agents-md/map/lenses/gate.js.map +1 -0
  309. package/dist/core/agent/agents-md/map/mcp.js +41 -0
  310. package/dist/core/agent/agents-md/map/mcp.js.map +1 -0
  311. package/dist/core/agent/agents-md/map/status.js +62 -0
  312. package/dist/core/agent/agents-md/map/status.js.map +1 -0
  313. package/dist/core/agent/agents-md/map/subsystem.js +32 -0
  314. package/dist/core/agent/agents-md/map/subsystem.js.map +1 -0
  315. package/dist/core/agent/agents-md/map/usecases.js +60 -0
  316. package/dist/core/agent/agents-md/map/usecases.js.map +1 -0
  317. package/dist/core/agent/agents-md/refusals.js +246 -0
  318. package/dist/core/agent/agents-md/refusals.js.map +1 -0
  319. package/dist/core/agent/agents-md/shipped/archive-gate.js +98 -0
  320. package/dist/core/agent/agents-md/shipped/archive-gate.js.map +1 -0
  321. package/dist/core/agent/agents-md/spine.js +40 -0
  322. package/dist/core/agent/agents-md/spine.js.map +1 -0
  323. package/dist/core/agent/agents-md.js +170 -0
  324. package/dist/core/agent/agents-md.js.map +1 -0
  325. package/dist/core/{agents-stamp.js → agent/agents-stamp.js} +50 -0
  326. package/dist/core/agent/agents-stamp.js.map +1 -0
  327. package/dist/core/agent/contract.js +2 -0
  328. package/dist/core/agent/contract.js.map +1 -0
  329. package/dist/core/agent/protocol.js +193 -0
  330. package/dist/core/agent/protocol.js.map +1 -0
  331. package/dist/core/agent/scaffold.js +259 -0
  332. package/dist/core/agent/scaffold.js.map +1 -0
  333. package/dist/core/agent/support/report.js +103 -0
  334. package/dist/core/agent/support/report.js.map +1 -0
  335. package/dist/core/agent/tools/dialects.js +150 -0
  336. package/dist/core/agent/tools/dialects.js.map +1 -0
  337. package/dist/core/agent/tools/registry.js +228 -0
  338. package/dist/core/agent/tools/registry.js.map +1 -0
  339. package/dist/core/agent/workflows/adopt.js +133 -0
  340. package/dist/core/agent/workflows/adopt.js.map +1 -0
  341. package/dist/core/agent/workflows/check.js +337 -0
  342. package/dist/core/agent/workflows/check.js.map +1 -0
  343. package/dist/core/agent/workflows/closing.js +262 -0
  344. package/dist/core/agent/workflows/closing.js.map +1 -0
  345. package/dist/core/agent/workflows/feature.js +105 -0
  346. package/dist/core/agent/workflows/feature.js.map +1 -0
  347. package/dist/core/agent/workflows/implement.js +105 -0
  348. package/dist/core/agent/workflows/implement.js.map +1 -0
  349. package/dist/core/agent/workflows/reference/authoring.js +209 -0
  350. package/dist/core/agent/workflows/reference/authoring.js.map +1 -0
  351. package/dist/core/agent/workflows/reference/codes.js +65 -0
  352. package/dist/core/agent/workflows/reference/codes.js.map +1 -0
  353. package/dist/core/agent/workflows/reference/done-check.js +188 -0
  354. package/dist/core/agent/workflows/reference/done-check.js.map +1 -0
  355. package/dist/core/agent/workflows/reference/reference.js +16 -0
  356. package/dist/core/agent/workflows/reference/reference.js.map +1 -0
  357. package/dist/core/agent/workflows/reference/spine.js +297 -0
  358. package/dist/core/agent/workflows/reference/spine.js.map +1 -0
  359. package/dist/core/asyncapi/baseline/plan.js +110 -0
  360. package/dist/core/asyncapi/baseline/plan.js.map +1 -0
  361. package/dist/core/asyncapi/baseline/surfaces.js +54 -0
  362. package/dist/core/asyncapi/baseline/surfaces.js.map +1 -0
  363. package/dist/core/asyncapi/depth.js +164 -0
  364. package/dist/core/asyncapi/depth.js.map +1 -0
  365. package/dist/core/asyncapi/digest.js +141 -0
  366. package/dist/core/asyncapi/digest.js.map +1 -0
  367. package/dist/core/asyncapi/merge/components.js +91 -0
  368. package/dist/core/asyncapi/merge/components.js.map +1 -0
  369. package/dist/core/asyncapi/merge/error.js +33 -0
  370. package/dist/core/asyncapi/merge/error.js.map +1 -0
  371. package/dist/core/asyncapi/merge/markers.js +308 -0
  372. package/dist/core/asyncapi/merge/markers.js.map +1 -0
  373. package/dist/core/asyncapi/merge/merge.js +215 -0
  374. package/dist/core/asyncapi/merge/merge.js.map +1 -0
  375. package/dist/core/asyncapi/merge/pin.js +107 -0
  376. package/dist/core/asyncapi/merge/pin.js.map +1 -0
  377. package/dist/core/asyncapi/model.js +11 -0
  378. package/dist/core/asyncapi/model.js.map +1 -0
  379. package/dist/core/asyncapi/producers.js +50 -0
  380. package/dist/core/asyncapi/producers.js.map +1 -0
  381. package/dist/core/{asyncapi.js → asyncapi/read.js} +95 -109
  382. package/dist/core/asyncapi/read.js.map +1 -0
  383. package/dist/core/brief/brief.js +225 -0
  384. package/dist/core/brief/brief.js.map +1 -0
  385. package/dist/core/brief/checks.js +250 -0
  386. package/dist/core/brief/checks.js.map +1 -0
  387. package/dist/core/brief/landscape.js +194 -0
  388. package/dist/core/brief/landscape.js.map +1 -0
  389. package/dist/core/brief/targets.js +226 -0
  390. package/dist/core/brief/targets.js.map +1 -0
  391. package/dist/core/brief/unchecked.js +48 -0
  392. package/dist/core/brief/unchecked.js.map +1 -0
  393. package/dist/core/c4/arch.js +174 -0
  394. package/dist/core/c4/arch.js.map +1 -0
  395. package/dist/core/c4/likec4.js +90 -0
  396. package/dist/core/c4/likec4.js.map +1 -0
  397. package/dist/core/c4/parsed/deployment.js +158 -0
  398. package/dist/core/c4/parsed/deployment.js.map +1 -0
  399. package/dist/core/c4/parsed/dynamic-views.js +132 -0
  400. package/dist/core/c4/parsed/dynamic-views.js.map +1 -0
  401. package/dist/core/c4/parsed/specification.js +78 -0
  402. package/dist/core/c4/parsed/specification.js.map +1 -0
  403. package/dist/core/c4/parsed/values.js +57 -0
  404. package/dist/core/c4/parsed/values.js.map +1 -0
  405. package/dist/core/c4/parsed/view-ids.js +75 -0
  406. package/dist/core/c4/parsed/view-ids.js.map +1 -0
  407. package/dist/core/c4/project/architecture.js +45 -0
  408. package/dist/core/c4/project/architecture.js.map +1 -0
  409. package/dist/core/c4/project/documents.js +58 -0
  410. package/dist/core/c4/project/documents.js.map +1 -0
  411. package/dist/core/c4/project/load.js +187 -0
  412. package/dist/core/c4/project/load.js.map +1 -0
  413. package/dist/core/c4/project/staged.js +220 -0
  414. package/dist/core/c4/project/staged.js.map +1 -0
  415. package/dist/core/c4/resolve/service.js +159 -0
  416. package/dist/core/c4/resolve/service.js.map +1 -0
  417. package/dist/core/c4/resolve/steps.js +144 -0
  418. package/dist/core/c4/resolve/steps.js.map +1 -0
  419. package/dist/core/c4/seed/fleet-file.js +201 -0
  420. package/dist/core/c4/seed/fleet-file.js.map +1 -0
  421. package/dist/core/c4/seed/items.js +91 -0
  422. package/dist/core/c4/seed/items.js.map +1 -0
  423. package/dist/core/c4/seed/stamp.js +48 -0
  424. package/dist/core/c4/seed/stamp.js.map +1 -0
  425. package/dist/core/c4/seed/template.js +109 -0
  426. package/dist/core/c4/seed/template.js.map +1 -0
  427. package/dist/core/c4/source-mask.js +82 -0
  428. package/dist/core/c4/source-mask.js.map +1 -0
  429. package/dist/core/c4/source-scan.js +227 -0
  430. package/dist/core/c4/source-scan.js.map +1 -0
  431. package/dist/core/c4/splice/authored-source.js +101 -0
  432. package/dist/core/c4/splice/authored-source.js.map +1 -0
  433. package/dist/core/c4/splice/contract.js +10 -0
  434. package/dist/core/c4/splice/contract.js.map +1 -0
  435. package/dist/core/c4/splice/delta-blocks.js +139 -0
  436. package/dist/core/c4/splice/delta-blocks.js.map +1 -0
  437. package/dist/core/c4/splice/identity/edges.js +36 -0
  438. package/dist/core/c4/splice/identity/edges.js.map +1 -0
  439. package/dist/core/c4/splice/landscape-merge.js +269 -0
  440. package/dist/core/c4/splice/landscape-merge.js.map +1 -0
  441. package/dist/core/c4/splice/placement.js +194 -0
  442. package/dist/core/c4/splice/placement.js.map +1 -0
  443. package/dist/core/c4/workspace.js +174 -0
  444. package/dist/core/c4/workspace.js.map +1 -0
  445. package/dist/core/capabilities/authoring/notes.js +141 -0
  446. package/dist/core/capabilities/authoring/notes.js.map +1 -0
  447. package/dist/core/capabilities/capabilities.js +124 -0
  448. package/dist/core/capabilities/capabilities.js.map +1 -0
  449. package/dist/core/capabilities/delta/doc.js +50 -0
  450. package/dist/core/capabilities/delta/doc.js.map +1 -0
  451. package/dist/core/capabilities/delta/overlay.js +129 -0
  452. package/dist/core/capabilities/delta/overlay.js.map +1 -0
  453. package/dist/core/capabilities/delta/summary.js +57 -0
  454. package/dist/core/capabilities/delta/summary.js.map +1 -0
  455. package/dist/core/capabilities/delta/tree.js +43 -0
  456. package/dist/core/capabilities/delta/tree.js.map +1 -0
  457. package/dist/core/capabilities/delta/uncovered.js +222 -0
  458. package/dist/core/capabilities/delta/uncovered.js.map +1 -0
  459. package/dist/core/capabilities/findings.js +342 -0
  460. package/dist/core/capabilities/findings.js.map +1 -0
  461. package/dist/core/capabilities/realizes/findings.js +181 -0
  462. package/dist/core/capabilities/realizes/findings.js.map +1 -0
  463. package/dist/core/capabilities/realizes/join.js +143 -0
  464. package/dist/core/capabilities/realizes/join.js.map +1 -0
  465. package/dist/core/capabilities/rollup.js +199 -0
  466. package/dist/core/capabilities/rollup.js.map +1 -0
  467. package/dist/core/capabilities/tree.js +126 -0
  468. package/dist/core/capabilities/tree.js.map +1 -0
  469. package/dist/core/capabilities/usecase-join.js +277 -0
  470. package/dist/core/capabilities/usecase-join.js.map +1 -0
  471. package/dist/core/coherence/authoring/scaffold.js +177 -0
  472. package/dist/core/coherence/authoring/scaffold.js.map +1 -0
  473. package/dist/core/coherence/authoring/sentinels.js +74 -0
  474. package/dist/core/coherence/authoring/sentinels.js.map +1 -0
  475. package/dist/core/coherence/coherence.js +287 -0
  476. package/dist/core/coherence/coherence.js.map +1 -0
  477. package/dist/core/coherence/declared.js +269 -0
  478. package/dist/core/coherence/declared.js.map +1 -0
  479. package/dist/core/coherence/events/declared.js +206 -0
  480. package/dist/core/coherence/events/declared.js.map +1 -0
  481. package/dist/core/coherence/events/events.js +204 -0
  482. package/dist/core/coherence/events/events.js.map +1 -0
  483. package/dist/core/coherence/events/grades.js +166 -0
  484. package/dist/core/coherence/events/grades.js.map +1 -0
  485. package/dist/core/coherence/events/lookups.js +122 -0
  486. package/dist/core/coherence/events/lookups.js.map +1 -0
  487. package/dist/core/coherence/events/merged.js +40 -0
  488. package/dist/core/coherence/events/merged.js.map +1 -0
  489. package/dist/core/coherence/living.js +198 -0
  490. package/dist/core/coherence/living.js.map +1 -0
  491. package/dist/core/coherence/lookups.js +155 -0
  492. package/dist/core/coherence/lookups.js.map +1 -0
  493. package/dist/core/coherence/pending.js +39 -0
  494. package/dist/core/coherence/pending.js.map +1 -0
  495. package/dist/core/conflict-markers.js +60 -0
  496. package/dist/core/conflict-markers.js.map +1 -0
  497. package/dist/core/delta/claims.js +73 -0
  498. package/dist/core/delta/claims.js.map +1 -0
  499. package/dist/core/delta/delta.js +296 -0
  500. package/dist/core/delta/delta.js.map +1 -0
  501. package/dist/core/delta/document.js +177 -0
  502. package/dist/core/delta/document.js.map +1 -0
  503. package/dist/core/delta/scope.js +48 -0
  504. package/dist/core/delta/scope.js.map +1 -0
  505. package/dist/core/delta/select.js +237 -0
  506. package/dist/core/delta/select.js.map +1 -0
  507. package/dist/core/dependencies/dependencies.js +141 -0
  508. package/dist/core/dependencies/dependencies.js.map +1 -0
  509. package/dist/core/dependencies/facts.js +165 -0
  510. package/dist/core/dependencies/facts.js.map +1 -0
  511. package/dist/core/dependencies/fanin.js +88 -0
  512. package/dist/core/dependencies/fanin.js.map +1 -0
  513. package/dist/core/dependencies/graph.js +106 -0
  514. package/dist/core/dependencies/graph.js.map +1 -0
  515. package/dist/core/deployment/delta.js +188 -0
  516. package/dist/core/deployment/delta.js.map +1 -0
  517. package/dist/core/deployment/objects.js +145 -0
  518. package/dist/core/deployment/objects.js.map +1 -0
  519. package/dist/core/diff/base-git.js +148 -0
  520. package/dist/core/diff/base-git.js.map +1 -0
  521. package/dist/core/diff/base-state.js +209 -0
  522. package/dist/core/diff/base-state.js.map +1 -0
  523. package/dist/core/diff/current-state.js +96 -0
  524. package/dist/core/diff/current-state.js.map +1 -0
  525. package/dist/core/diff/scope/changed-paths.js +188 -0
  526. package/dist/core/diff/scope/changed-paths.js.map +1 -0
  527. package/dist/core/diff/semantic.js +243 -0
  528. package/dist/core/diff/semantic.js.map +1 -0
  529. package/dist/core/diff/victims.js +247 -0
  530. package/dist/core/diff/victims.js.map +1 -0
  531. package/dist/core/docs.js +7 -64
  532. package/dist/core/docs.js.map +1 -1
  533. package/dist/core/doctor/agents.js +222 -0
  534. package/dist/core/doctor/agents.js.map +1 -0
  535. package/dist/core/doctor/config.js +135 -0
  536. package/dist/core/doctor/config.js.map +1 -0
  537. package/dist/core/doctor/doctor.js +275 -0
  538. package/dist/core/doctor/doctor.js.map +1 -0
  539. package/dist/core/doctor/report.js +13 -0
  540. package/dist/core/doctor/report.js.map +1 -0
  541. package/dist/core/doctor/residue.js +110 -0
  542. package/dist/core/doctor/residue.js.map +1 -0
  543. package/dist/core/document/apply.js +77 -0
  544. package/dist/core/document/apply.js.map +1 -0
  545. package/dist/core/{frontmatter.js → document/frontmatter.js} +48 -2
  546. package/dist/core/document/frontmatter.js.map +1 -0
  547. package/dist/core/document/grammar/directives.js +143 -0
  548. package/dist/core/document/grammar/directives.js.map +1 -0
  549. package/dist/core/document/parse.js +263 -0
  550. package/dist/core/document/parse.js.map +1 -0
  551. package/dist/core/document/scenarios.js +221 -0
  552. package/dist/core/document/scenarios.js.map +1 -0
  553. package/dist/core/document/spec.js +241 -0
  554. package/dist/core/document/spec.js.map +1 -0
  555. package/dist/core/{config.js → envelope/config.js} +79 -18
  556. package/dist/core/envelope/config.js.map +1 -0
  557. package/dist/core/envelope/json.js +175 -0
  558. package/dist/core/envelope/json.js.map +1 -0
  559. package/dist/core/{version.js → envelope/version.js} +3 -3
  560. package/dist/core/envelope/version.js.map +1 -0
  561. package/dist/core/explain/families.js +175 -0
  562. package/dist/core/explain/families.js.map +1 -0
  563. package/dist/core/explain/fix-tables.js +178 -0
  564. package/dist/core/explain/fix-tables.js.map +1 -0
  565. package/dist/core/explain/lookup.js +181 -0
  566. package/dist/core/explain/lookup.js.map +1 -0
  567. package/dist/core/explain/refusals.js +49 -0
  568. package/dist/core/explain/refusals.js.map +1 -0
  569. package/dist/core/explain/terms.js +144 -0
  570. package/dist/core/explain/terms.js.map +1 -0
  571. package/dist/core/explore/describe.js +105 -0
  572. package/dist/core/explore/describe.js.map +1 -0
  573. package/dist/core/{explore.js → explore/explore.js} +50 -101
  574. package/dist/core/explore/explore.js.map +1 -0
  575. package/dist/core/fleet-context.js +120 -78
  576. package/dist/core/fleet-context.js.map +1 -1
  577. package/dist/core/gate/checks.js +201 -0
  578. package/dist/core/gate/checks.js.map +1 -0
  579. package/dist/core/gate/partners.js +205 -0
  580. package/dist/core/gate/partners.js.map +1 -0
  581. package/dist/core/gate/report.js +47 -0
  582. package/dist/core/gate/report.js.map +1 -0
  583. package/dist/core/gate/verification.js +113 -0
  584. package/dist/core/gate/verification.js.map +1 -0
  585. package/dist/core/gherkin/digest.js +60 -0
  586. package/dist/core/gherkin/digest.js.map +1 -0
  587. package/dist/core/gherkin/emit.js +177 -0
  588. package/dist/core/gherkin/emit.js.map +1 -0
  589. package/dist/core/gherkin/read.js +76 -0
  590. package/dist/core/gherkin/read.js.map +1 -0
  591. package/dist/core/gherkin/stale.js +234 -0
  592. package/dist/core/gherkin/stale.js.map +1 -0
  593. package/dist/core/gherkin/stamp.js +77 -0
  594. package/dist/core/gherkin/stamp.js.map +1 -0
  595. package/dist/core/gherkin/steps/catalogue.js +154 -0
  596. package/dist/core/gherkin/steps/catalogue.js.map +1 -0
  597. package/dist/core/gherkin/steps/inventory.js +98 -0
  598. package/dist/core/gherkin/steps/inventory.js.map +1 -0
  599. package/dist/core/gherkin/steps/phrase.js +72 -0
  600. package/dist/core/gherkin/steps/phrase.js.map +1 -0
  601. package/dist/core/glossary/delta.js +106 -0
  602. package/dist/core/glossary/delta.js.map +1 -0
  603. package/dist/core/glossary/tree.js +86 -0
  604. package/dist/core/glossary/tree.js.map +1 -0
  605. package/dist/core/kernel/concurrency.js.map +1 -0
  606. package/dist/core/{document-bytes.js → kernel/document-bytes.js} +1 -1
  607. package/dist/core/kernel/document-bytes.js.map +1 -0
  608. package/dist/core/kernel/fences.js +42 -0
  609. package/dist/core/kernel/fences.js.map +1 -0
  610. package/dist/core/kernel/ids/capability.js +72 -0
  611. package/dist/core/kernel/ids/capability.js.map +1 -0
  612. package/dist/core/kernel/ids/dirs.js +33 -0
  613. package/dist/core/kernel/ids/dirs.js.map +1 -0
  614. package/dist/core/kernel/ids/feature.js +75 -0
  615. package/dist/core/kernel/ids/feature.js.map +1 -0
  616. package/dist/core/kernel/ids/service.js +156 -0
  617. package/dist/core/kernel/ids/service.js.map +1 -0
  618. package/dist/core/kernel/ids/subsystem.js +63 -0
  619. package/dist/core/kernel/ids/subsystem.js.map +1 -0
  620. package/dist/core/{path-safety.js → kernel/path-safety.js} +18 -4
  621. package/dist/core/kernel/path-safety.js.map +1 -0
  622. package/dist/core/kernel/records.js.map +1 -0
  623. package/dist/core/links/backlinks.js +68 -0
  624. package/dist/core/links/backlinks.js.map +1 -0
  625. package/dist/core/links/case.js +74 -0
  626. package/dist/core/links/case.js.map +1 -0
  627. package/dist/core/links/corpus.js +104 -0
  628. package/dist/core/links/corpus.js.map +1 -0
  629. package/dist/core/links/findings.js +110 -0
  630. package/dist/core/links/findings.js.map +1 -0
  631. package/dist/core/links/parse.js +236 -0
  632. package/dist/core/links/parse.js.map +1 -0
  633. package/dist/core/mcp/argv.js +111 -0
  634. package/dist/core/mcp/argv.js.map +1 -0
  635. package/dist/core/mcp/author-tools.js +72 -0
  636. package/dist/core/mcp/author-tools.js.map +1 -0
  637. package/dist/core/mcp/framing.js +46 -0
  638. package/dist/core/mcp/framing.js.map +1 -0
  639. package/dist/core/mcp/protocol.js +280 -0
  640. package/dist/core/mcp/protocol.js.map +1 -0
  641. package/dist/core/mcp/tools.js +314 -0
  642. package/dist/core/mcp/tools.js.map +1 -0
  643. package/dist/core/obligations/obligations.js +106 -0
  644. package/dist/core/obligations/obligations.js.map +1 -0
  645. package/dist/core/openapi/baseline/gate.js +166 -0
  646. package/dist/core/openapi/baseline/gate.js.map +1 -0
  647. package/dist/core/openapi/baseline/plan.js +112 -0
  648. package/dist/core/openapi/baseline/plan.js.map +1 -0
  649. package/dist/core/openapi/baseline/record.js +175 -0
  650. package/dist/core/openapi/baseline/record.js.map +1 -0
  651. package/dist/core/openapi/depth.js +122 -0
  652. package/dist/core/openapi/depth.js.map +1 -0
  653. package/dist/core/openapi/digest.js +189 -0
  654. package/dist/core/openapi/digest.js.map +1 -0
  655. package/dist/core/{openapi.js → openapi/doc.js} +44 -106
  656. package/dist/core/openapi/doc.js.map +1 -0
  657. package/dist/core/openapi/merge/components.js +234 -0
  658. package/dist/core/openapi/merge/components.js.map +1 -0
  659. package/dist/core/openapi/merge/error.js +26 -0
  660. package/dist/core/openapi/merge/error.js.map +1 -0
  661. package/dist/core/openapi/merge/markers.js +208 -0
  662. package/dist/core/openapi/merge/markers.js.map +1 -0
  663. package/dist/core/openapi/merge/merge.js +256 -0
  664. package/dist/core/openapi/merge/merge.js.map +1 -0
  665. package/dist/core/openapi/merge/pin.js +128 -0
  666. package/dist/core/openapi/merge/pin.js.map +1 -0
  667. package/dist/core/openspec/decide/capabilities.js +244 -0
  668. package/dist/core/openspec/decide/capabilities.js.map +1 -0
  669. package/dist/core/openspec/decide/dispositions.js +63 -0
  670. package/dist/core/openspec/decide/dispositions.js.map +1 -0
  671. package/dist/core/openspec/decide/renames.js +179 -0
  672. package/dist/core/openspec/decide/renames.js.map +1 -0
  673. package/dist/core/openspec/decide/verdict.js +84 -0
  674. package/dist/core/openspec/decide/verdict.js.map +1 -0
  675. package/dist/core/openspec/inventory.js +221 -0
  676. package/dist/core/openspec/inventory.js.map +1 -0
  677. package/dist/core/openspec/model/mapping.js +76 -0
  678. package/dist/core/openspec/model/mapping.js.map +1 -0
  679. package/dist/core/openspec/model/model.js +65 -0
  680. package/dist/core/openspec/model/model.js.map +1 -0
  681. package/dist/core/openspec/scan/changes.js +235 -0
  682. package/dist/core/openspec/scan/changes.js.map +1 -0
  683. package/dist/core/openspec/scan/config.js +200 -0
  684. package/dist/core/openspec/scan/config.js.map +1 -0
  685. package/dist/core/openspec/scan/shape.js +260 -0
  686. package/dist/core/openspec/scan/shape.js.map +1 -0
  687. package/dist/core/openspec/scan/walk.js +133 -0
  688. package/dist/core/openspec/scan/walk.js.map +1 -0
  689. package/dist/core/openspec/scan/workspace.js +71 -0
  690. package/dist/core/openspec/scan/workspace.js.map +1 -0
  691. package/dist/core/owners/codeowners.js +141 -0
  692. package/dist/core/owners/codeowners.js.map +1 -0
  693. package/dist/core/pack/features.js +120 -0
  694. package/dist/core/pack/features.js.map +1 -0
  695. package/dist/core/pack/joins.js +112 -0
  696. package/dist/core/pack/joins.js.map +1 -0
  697. package/dist/core/pack/living.js +137 -0
  698. package/dist/core/pack/living.js.map +1 -0
  699. package/dist/core/pack/pack.js +76 -0
  700. package/dist/core/pack/pack.js.map +1 -0
  701. package/dist/core/permissions/permissions.js +87 -0
  702. package/dist/core/permissions/permissions.js.map +1 -0
  703. package/dist/core/projection/api.js +84 -0
  704. package/dist/core/projection/api.js.map +1 -0
  705. package/dist/core/projection/arch-slice.js +63 -0
  706. package/dist/core/projection/arch-slice.js.map +1 -0
  707. package/dist/core/projection/events.js +34 -0
  708. package/dist/core/projection/events.js.map +1 -0
  709. package/dist/core/provenance/findings.js +208 -0
  710. package/dist/core/provenance/findings.js.map +1 -0
  711. package/dist/core/provenance/git.js +225 -0
  712. package/dist/core/provenance/git.js.map +1 -0
  713. package/dist/core/provenance/gitq/moves.js +182 -0
  714. package/dist/core/provenance/gitq/moves.js.map +1 -0
  715. package/dist/core/provenance/gitq/vouched-ancestor.js +179 -0
  716. package/dist/core/provenance/gitq/vouched-ancestor.js.map +1 -0
  717. package/dist/core/provenance/sample/scope.js +238 -0
  718. package/dist/core/provenance/sample/scope.js.map +1 -0
  719. package/dist/core/provenance/sample/sections.js +61 -0
  720. package/dist/core/provenance/sample/sections.js.map +1 -0
  721. package/dist/core/provenance/sources.js +263 -0
  722. package/dist/core/provenance/sources.js.map +1 -0
  723. package/dist/core/provenance/stamp.js +232 -0
  724. package/dist/core/provenance/stamp.js.map +1 -0
  725. package/dist/core/provenance/walk.js +157 -0
  726. package/dist/core/provenance/walk.js.map +1 -0
  727. package/dist/core/repo/authored/paths.js +210 -0
  728. package/dist/core/repo/authored/paths.js.map +1 -0
  729. package/dist/core/repo/entries.js +126 -0
  730. package/dist/core/repo/entries.js.map +1 -0
  731. package/dist/core/repo/paths.js +277 -0
  732. package/dist/core/repo/paths.js.map +1 -0
  733. package/dist/core/repo/repo.js +248 -0
  734. package/dist/core/repo/repo.js.map +1 -0
  735. package/dist/core/repo/service-target.js +153 -0
  736. package/dist/core/repo/service-target.js.map +1 -0
  737. package/dist/core/repo/state.js +58 -0
  738. package/dist/core/repo/state.js.map +1 -0
  739. package/dist/core/repo/tree/find.js +52 -0
  740. package/dist/core/repo/tree/find.js.map +1 -0
  741. package/dist/core/repo/tree/fs.js +64 -0
  742. package/dist/core/repo/tree/fs.js.map +1 -0
  743. package/dist/core/repo/tree/marker.js +61 -0
  744. package/dist/core/repo/tree/marker.js.map +1 -0
  745. package/dist/core/repo/tree/views.js +172 -0
  746. package/dist/core/repo/tree/views.js.map +1 -0
  747. package/dist/core/repo/tree/walk.js +234 -0
  748. package/dist/core/repo/tree/walk.js.map +1 -0
  749. package/dist/core/results.js +99 -2
  750. package/dist/core/results.js.map +1 -1
  751. package/dist/core/scaffold/landscape.js +131 -0
  752. package/dist/core/scaffold/landscape.js.map +1 -0
  753. package/dist/core/scaffold/readme.js +84 -0
  754. package/dist/core/scaffold/readme.js.map +1 -0
  755. package/dist/core/staging/commit.js +241 -0
  756. package/dist/core/staging/commit.js.map +1 -0
  757. package/dist/core/staging/interrupted.js +96 -0
  758. package/dist/core/staging/interrupted.js.map +1 -0
  759. package/dist/core/staging/lock.js +206 -0
  760. package/dist/core/staging/lock.js.map +1 -0
  761. package/dist/core/staging/recovery/finding.js +35 -0
  762. package/dist/core/staging/recovery/finding.js.map +1 -0
  763. package/dist/core/staging/recovery/intent.js +98 -0
  764. package/dist/core/staging/recovery/intent.js.map +1 -0
  765. package/dist/core/staging/recovery/recover.js +126 -0
  766. package/dist/core/staging/recovery/recover.js.map +1 -0
  767. package/dist/core/staging/recovery/residue.js +62 -0
  768. package/dist/core/staging/recovery/residue.js.map +1 -0
  769. package/dist/core/staging/snapshot.js +202 -0
  770. package/dist/core/staging/snapshot.js.map +1 -0
  771. package/dist/core/staging/txn/forward.js +171 -0
  772. package/dist/core/staging/txn/forward.js.map +1 -0
  773. package/dist/core/staging/txn/journal.js +139 -0
  774. package/dist/core/staging/txn/journal.js.map +1 -0
  775. package/dist/core/staging/txn/transaction.js +75 -0
  776. package/dist/core/staging/txn/transaction.js.map +1 -0
  777. package/dist/core/staging/writes.js +113 -0
  778. package/dist/core/staging/writes.js.map +1 -0
  779. package/dist/core/status/actions/execution.js +49 -0
  780. package/dist/core/status/actions/execution.js.map +1 -0
  781. package/dist/core/status/contracts.js +102 -0
  782. package/dist/core/status/contracts.js.map +1 -0
  783. package/dist/core/status/feature/artifacts.js +196 -0
  784. package/dist/core/status/feature/artifacts.js.map +1 -0
  785. package/dist/core/status/feature/feature.js +207 -0
  786. package/dist/core/status/feature/feature.js.map +1 -0
  787. package/dist/core/status/feature/next.js +150 -0
  788. package/dist/core/status/feature/next.js.map +1 -0
  789. package/dist/core/status/feature/state.js +21 -0
  790. package/dist/core/status/feature/state.js.map +1 -0
  791. package/dist/core/status/fleet/fleet.js +197 -0
  792. package/dist/core/status/fleet/fleet.js.map +1 -0
  793. package/dist/core/status/fleet/next.js +207 -0
  794. package/dist/core/status/fleet/next.js.map +1 -0
  795. package/dist/core/status/interrupted.js +97 -0
  796. package/dist/core/status/interrupted.js.map +1 -0
  797. package/dist/core/status/report.js +31 -0
  798. package/dist/core/status/report.js.map +1 -0
  799. package/dist/core/status/scan.js +41 -0
  800. package/dist/core/status/scan.js.map +1 -0
  801. package/dist/core/status/verification.js +201 -0
  802. package/dist/core/status/verification.js.map +1 -0
  803. package/dist/core/usecases/capability.js +169 -0
  804. package/dist/core/usecases/capability.js.map +1 -0
  805. package/dist/core/usecases/delta/claims.js +116 -0
  806. package/dist/core/usecases/delta/claims.js.map +1 -0
  807. package/dist/core/usecases/delta/flows.js +103 -0
  808. package/dist/core/usecases/delta/flows.js.map +1 -0
  809. package/dist/core/usecases/delta/overlay.js +72 -0
  810. package/dist/core/usecases/delta/overlay.js.map +1 -0
  811. package/dist/core/usecases/fleet.js +137 -0
  812. package/dist/core/usecases/fleet.js.map +1 -0
  813. package/dist/core/usecases/operations.js +111 -0
  814. package/dist/core/usecases/operations.js.map +1 -0
  815. package/dist/core/usecases/place.js +44 -0
  816. package/dist/core/usecases/place.js.map +1 -0
  817. package/dist/core/usecases/touch.js +101 -0
  818. package/dist/core/usecases/touch.js.map +1 -0
  819. package/dist/core/verify/answers.js +173 -0
  820. package/dist/core/verify/answers.js.map +1 -0
  821. package/dist/core/verify/build.js +150 -0
  822. package/dist/core/verify/build.js.map +1 -0
  823. package/dist/core/verify/checklist.js +201 -0
  824. package/dist/core/verify/checklist.js.map +1 -0
  825. package/dist/core/verify/claims/identity.js +61 -0
  826. package/dist/core/verify/claims/identity.js.map +1 -0
  827. package/dist/core/verify/cross/diff.js +97 -0
  828. package/dist/core/verify/cross/diff.js.map +1 -0
  829. package/dist/core/verify/evidence/contract.js +169 -0
  830. package/dist/core/verify/evidence/contract.js.map +1 -0
  831. package/dist/core/verify/file.js +257 -0
  832. package/dist/core/verify/file.js.map +1 -0
  833. package/dist/core/verify/pins/lint.js +157 -0
  834. package/dist/core/verify/pins/lint.js.map +1 -0
  835. package/dist/core/verify/pins/pin.js +95 -0
  836. package/dist/core/verify/pins/pin.js.map +1 -0
  837. package/dist/core/verify/record.js +142 -0
  838. package/dist/core/verify/record.js.map +1 -0
  839. package/dist/core/verify/store/commit.js +89 -0
  840. package/dist/core/verify/store/commit.js.map +1 -0
  841. package/dist/core/verify/store/render.js +57 -0
  842. package/dist/core/verify/store/render.js.map +1 -0
  843. package/dist/core/vocabulary/health.js +91 -0
  844. package/dist/core/vocabulary/health.js.map +1 -0
  845. package/dist/core/vocabulary/issue.js +58 -0
  846. package/dist/core/vocabulary/issue.js.map +1 -0
  847. package/dist/core/vocabulary/maturity.js +145 -0
  848. package/dist/core/vocabulary/maturity.js.map +1 -0
  849. package/dist/core/{report.js → vocabulary/report.js} +30 -2
  850. package/dist/core/vocabulary/report.js.map +1 -0
  851. package/dist/core/vocabulary/steps.js +266 -0
  852. package/dist/core/vocabulary/steps.js.map +1 -0
  853. package/dist/core/workspace/discover.js +239 -0
  854. package/dist/core/workspace/discover.js.map +1 -0
  855. package/dist/core/workspace/render.js +52 -0
  856. package/dist/core/workspace/render.js.map +1 -0
  857. package/examples/README.md +189 -0
  858. package/examples/docs/architecture/adrs/0001-transactional-outbox.md +33 -0
  859. package/examples/docs/architecture/capabilities.yaml +31 -0
  860. package/examples/docs/architecture/landscape.likec4 +280 -0
  861. package/examples/docs/architecture/obligations.yaml +23 -0
  862. package/examples/docs/architecture/permissions.yaml +50 -0
  863. package/examples/docs/architecture/subsystems.likec4 +11 -0
  864. package/examples/docs/architecture/usecases/order-notification.likec4 +65 -0
  865. package/examples/docs/capabilities/checkout/spec.md +55 -0
  866. package/examples/docs/capabilities/identity/tokens/spec.md +42 -0
  867. package/examples/docs/capabilities/order-notifications/spec.md +43 -0
  868. package/examples/docs/features/FEAT-101-payment-splitting/adrs/0001-dedicated-split-service.md +18 -0
  869. package/examples/docs/features/FEAT-101-payment-splitting/delta.likec4 +94 -0
  870. package/examples/docs/features/FEAT-101-payment-splitting/intent.md +44 -0
  871. package/examples/docs/features/FEAT-101-payment-splitting/specs/checkout-web/spec.md +21 -0
  872. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/asyncapi.yaml +129 -0
  873. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-service/spec.md +36 -0
  874. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/arch.spec.md +40 -0
  875. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/openapi.yaml +116 -0
  876. package/examples/docs/features/FEAT-101-payment-splitting/specs/payment-split-service/spec.md +55 -0
  877. package/examples/docs/features/FEAT-112-retire-order-v1/intent.md +35 -0
  878. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/openapi.yaml +28 -0
  879. package/examples/docs/features/FEAT-112-retire-order-v1/specs/order-service/spec.md +17 -0
  880. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/architecture/landscape.likec4 +253 -0
  881. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/order-service/spec.md +121 -0
  882. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/openapi.yaml +111 -0
  883. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/files/services/payment-service/spec.md +58 -0
  884. package/examples/docs/features/archive/FEAT-088-refunds/.loam-before/manifest.json +32 -0
  885. package/examples/docs/features/archive/FEAT-088-refunds/adrs/0001-refunds-stay-in-payment-service.md +26 -0
  886. package/examples/docs/features/archive/FEAT-088-refunds/delta.likec4 +28 -0
  887. package/examples/docs/features/archive/FEAT-088-refunds/intent.md +26 -0
  888. package/examples/docs/features/archive/FEAT-088-refunds/specs/order-service/spec.md +37 -0
  889. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/openapi.yaml +70 -0
  890. package/examples/docs/features/archive/FEAT-088-refunds/specs/payment-service/spec.md +23 -0
  891. package/examples/docs/features/archive/FEAT-088-refunds/verification.yaml +76 -0
  892. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/architecture/landscape.likec4 +275 -0
  893. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/asyncapi.yaml +96 -0
  894. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/payment-service/spec.md +82 -0
  895. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/asyncapi.yaml +164 -0
  896. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/files/services/platform/notification-service/spec.md +91 -0
  897. package/examples/docs/features/archive/FEAT-120-refund-notification/.loam-before/manifest.json +46 -0
  898. package/examples/docs/features/archive/FEAT-120-refund-notification/delta.likec4 +36 -0
  899. package/examples/docs/features/archive/FEAT-120-refund-notification/intent.md +22 -0
  900. package/examples/docs/features/archive/FEAT-120-refund-notification/scenario-report.json +10 -0
  901. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/asyncapi.yaml +208 -0
  902. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/notification-service/spec.md +24 -0
  903. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/asyncapi.yaml +137 -0
  904. package/examples/docs/features/archive/FEAT-120-refund-notification/specs/payment-service/spec.md +31 -0
  905. package/examples/docs/features/archive/FEAT-120-refund-notification/verification.yaml +84 -0
  906. package/examples/docs/glossary/order.md +15 -0
  907. package/examples/docs/glossary/payments/authorization.md +14 -0
  908. package/examples/docs/likec4.config.json +9 -0
  909. package/examples/docs/loam.json +3 -0
  910. package/examples/docs/services/checkout-web/model.likec4 +109 -0
  911. package/examples/docs/services/checkout-web/spec.md +91 -0
  912. package/examples/docs/services/checkout-web/ui/pages/checkout.page.yaml +40 -0
  913. package/examples/docs/services/checkout-web/ui/pages/order-status.page.yaml +24 -0
  914. package/examples/docs/services/checkout-web/ui/pages/split-payment.page.yaml +26 -0
  915. package/examples/docs/services/order-service/adrs/0001-orchestrated-order-lifecycle.md +52 -0
  916. package/examples/docs/services/order-service/arch.spec.md +127 -0
  917. package/examples/docs/services/order-service/asyncapi.yaml +108 -0
  918. package/examples/docs/services/order-service/health.yaml +57 -0
  919. package/examples/docs/services/order-service/model.likec4 +138 -0
  920. package/examples/docs/services/order-service/openapi.yaml +257 -0
  921. package/examples/docs/services/order-service/runbook.md +62 -0
  922. package/examples/docs/services/order-service/spec.md +134 -0
  923. package/examples/docs/services/payment-service/adrs/0001-payments-outbox.md +18 -0
  924. package/examples/docs/services/payment-service/adrs/0002-idempotency-keys-on-authorization.md +27 -0
  925. package/examples/docs/services/payment-service/arch.spec.md +73 -0
  926. package/examples/docs/services/payment-service/asyncapi.yaml +130 -0
  927. package/examples/docs/services/payment-service/health.yaml +39 -0
  928. package/examples/docs/services/payment-service/model.likec4 +67 -0
  929. package/examples/docs/services/payment-service/openapi.yaml +151 -0
  930. package/examples/docs/services/payment-service/runbook.md +37 -0
  931. package/examples/docs/services/payment-service/spec.md +88 -0
  932. package/examples/docs/services/platform/identity-service/adrs/0001-token-introspection-over-local-validation.md +60 -0
  933. package/examples/docs/services/platform/identity-service/arch.spec.md +117 -0
  934. package/examples/docs/services/platform/identity-service/health.yaml +70 -0
  935. package/examples/docs/services/platform/identity-service/model.likec4 +83 -0
  936. package/examples/docs/services/platform/identity-service/openapi.yaml +197 -0
  937. package/examples/docs/services/platform/identity-service/runbook.md +95 -0
  938. package/examples/docs/services/platform/identity-service/spec.md +119 -0
  939. package/examples/docs/services/platform/notification-service/asyncapi.yaml +199 -0
  940. package/examples/docs/services/platform/notification-service/health.yaml +35 -0
  941. package/examples/docs/services/platform/notification-service/model.likec4 +118 -0
  942. package/examples/docs/services/platform/notification-service/runbook.md +48 -0
  943. package/examples/docs/services/platform/notification-service/spec.md +112 -0
  944. package/examples/docs/services/platform/subsystem.yaml +2 -0
  945. package/examples/fleet.yaml +57 -0
  946. package/package.json +19 -6
  947. package/dist/commands/adopt.js +0 -240
  948. package/dist/commands/adopt.js.map +0 -1
  949. package/dist/commands/archive.js +0 -1313
  950. package/dist/commands/archive.js.map +0 -1
  951. package/dist/commands/delta.js +0 -388
  952. package/dist/commands/delta.js.map +0 -1
  953. package/dist/commands/docs-repo-gate.js.map +0 -1
  954. package/dist/commands/format.js +0 -17
  955. package/dist/commands/format.js.map +0 -1
  956. package/dist/commands/gherkin.js +0 -309
  957. package/dist/commands/gherkin.js.map +0 -1
  958. package/dist/commands/init.js.map +0 -1
  959. package/dist/commands/list.js +0 -295
  960. package/dist/commands/list.js.map +0 -1
  961. package/dist/commands/migrate-openspec.js +0 -950
  962. package/dist/commands/migrate-openspec.js.map +0 -1
  963. package/dist/commands/new.js +0 -413
  964. package/dist/commands/new.js.map +0 -1
  965. package/dist/commands/rebase.js +0 -356
  966. package/dist/commands/rebase.js.map +0 -1
  967. package/dist/commands/show.js.map +0 -1
  968. package/dist/commands/status.js +0 -262
  969. package/dist/commands/status.js.map +0 -1
  970. package/dist/commands/unarchive.js.map +0 -1
  971. package/dist/commands/validate.js +0 -1773
  972. package/dist/commands/validate.js.map +0 -1
  973. package/dist/commands/verify.js +0 -775
  974. package/dist/commands/verify.js.map +0 -1
  975. package/dist/commands/vouch.js +0 -421
  976. package/dist/commands/vouch.js.map +0 -1
  977. package/dist/core/agent.js +0 -2173
  978. package/dist/core/agent.js.map +0 -1
  979. package/dist/core/agents-stamp.js.map +0 -1
  980. package/dist/core/arch.js +0 -130
  981. package/dist/core/arch.js.map +0 -1
  982. package/dist/core/asyncapi.js.map +0 -1
  983. package/dist/core/brief.js +0 -755
  984. package/dist/core/brief.js.map +0 -1
  985. package/dist/core/coherence.js +0 -577
  986. package/dist/core/coherence.js.map +0 -1
  987. package/dist/core/concurrency.js.map +0 -1
  988. package/dist/core/config.js.map +0 -1
  989. package/dist/core/delta.js +0 -476
  990. package/dist/core/delta.js.map +0 -1
  991. package/dist/core/dependencies.js +0 -356
  992. package/dist/core/dependencies.js.map +0 -1
  993. package/dist/core/doctor.js +0 -596
  994. package/dist/core/doctor.js.map +0 -1
  995. package/dist/core/document-bytes.js.map +0 -1
  996. package/dist/core/explore.js.map +0 -1
  997. package/dist/core/frontmatter.js.map +0 -1
  998. package/dist/core/gherkin.js +0 -463
  999. package/dist/core/gherkin.js.map +0 -1
  1000. package/dist/core/health.js +0 -67
  1001. package/dist/core/health.js.map +0 -1
  1002. package/dist/core/ids.js +0 -122
  1003. package/dist/core/ids.js.map +0 -1
  1004. package/dist/core/issue.js +0 -9
  1005. package/dist/core/issue.js.map +0 -1
  1006. package/dist/core/json.js +0 -74
  1007. package/dist/core/json.js.map +0 -1
  1008. package/dist/core/likec4.js +0 -489
  1009. package/dist/core/likec4.js.map +0 -1
  1010. package/dist/core/maturity.js +0 -66
  1011. package/dist/core/maturity.js.map +0 -1
  1012. package/dist/core/openapi-merge.js +0 -552
  1013. package/dist/core/openapi-merge.js.map +0 -1
  1014. package/dist/core/openapi.js.map +0 -1
  1015. package/dist/core/openspec-inventory.js +0 -1440
  1016. package/dist/core/openspec-inventory.js.map +0 -1
  1017. package/dist/core/path-safety.js.map +0 -1
  1018. package/dist/core/provenance.js +0 -787
  1019. package/dist/core/provenance.js.map +0 -1
  1020. package/dist/core/records.js.map +0 -1
  1021. package/dist/core/repo.js +0 -438
  1022. package/dist/core/repo.js.map +0 -1
  1023. package/dist/core/report.js.map +0 -1
  1024. package/dist/core/spec.js +0 -505
  1025. package/dist/core/spec.js.map +0 -1
  1026. package/dist/core/staging.js +0 -890
  1027. package/dist/core/staging.js.map +0 -1
  1028. package/dist/core/status.js +0 -1132
  1029. package/dist/core/status.js.map +0 -1
  1030. package/dist/core/steps.js +0 -72
  1031. package/dist/core/steps.js.map +0 -1
  1032. package/dist/core/verify.js +0 -807
  1033. package/dist/core/verify.js.map +0 -1
  1034. package/dist/core/version.js.map +0 -1
  1035. /package/dist/core/{concurrency.js → kernel/concurrency.js} +0 -0
  1036. /package/dist/core/{records.js → kernel/records.js} +0 -0
package/ROADMAP.md ADDED
@@ -0,0 +1,599 @@
1
+ # Roadmap
2
+
3
+ _Assessed 2026-09-02._
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 **424 TypeScript modules in 129 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 **29 commands** from [src/cli.ts](https://github.com/ybotok/loam/blob/main/src/cli.ts),
25
+ and the suite stands at **157 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-02 at `0.2.0-alpha.2`, 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,399/3,399 tests**, with two `skipIf(asRoot)` cases the root gate container cannot run; the
33
+ coverage gate passing with **92.25% statements, 84.04% branches, 96.62% functions, and 94.18%
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
+ One qualification remains, and it is observation rather than code: nothing has been pushed since the
38
+ CI `stability` job and the tarball-reading package smoke landed, so repeatable CI executions — the
39
+ stability job seen green, and the installed-package smoke run from a pushed commit — are still
40
+ release evidence to collect, even though the gate-stress proof passed locally on its landing tree
41
+ and the smoke passes locally against the real tarball. The runner class recorded on 2026-08-18 is
42
+ still the reading to apply to a red of that shape: a restricted filesystem sandbox that denies `tsx`
43
+ its local IPC socket fails only the
44
+ [test/cli-entry.test.ts](https://github.com/ybotok/loam/blob/main/test/cli-entry.test.ts) cases with
45
+ `listen EPERM` — a runner restriction, not a CLI behavior failure — and a sandbox that denies tmpdir
46
+ writes is the class under which `validate --all`'s batched parse degrades to per-document speed
47
+ without changing a finding.
48
+
49
+ The strongest foundations to preserve are:
50
+
51
+ - **Durable, inspectable source of truth.** The product still has no server, database, or runtime
52
+ network dependency. Its document contract is described in [SCHEMA.md](SCHEMA.md), and only three
53
+ packages are runtime dependencies in [package.json](package.json).
54
+ - **Explicit machine contracts.** The versioned JSON envelope and stable error codes live in
55
+ [src/core/envelope/json.ts](https://github.com/ybotok/loam/blob/main/src/core/envelope/json.ts);
56
+ issue severity, archive gating, and override semantics remain separate in
57
+ [src/core/vocabulary/issue.ts](https://github.com/ybotok/loam/blob/main/src/core/vocabulary/issue.ts).
58
+ [test/codes-drift.test.ts](https://github.com/ybotok/loam/blob/main/test/codes-drift.test.ts) and
59
+ [test/agent-commands-runnable.test.ts](https://github.com/ybotok/loam/blob/main/test/agent-commands-runnable.test.ts)
60
+ protect what agents branch on and what loam tells them to run, and
61
+ [test/docs-facts.test.ts](https://github.com/ybotok/loam/blob/main/test/docs-facts.test.ts) plus
62
+ [test/package-docs.test.ts](https://github.com/ybotok/loam/blob/main/test/package-docs.test.ts)
63
+ hold the shipped prose to the same standard: counted facts derive or carry a date, named codes are
64
+ codes loam emits, links resolve from the tarball, and every documented gap has its owner in this
65
+ file.
66
+ - **One transactional write path.** Archive and unarchive keep their snapshot-backed path across
67
+ [src/commands/archive/run.ts](https://github.com/ybotok/loam/blob/main/src/commands/archive/run.ts)
68
+ and [src/core/staging/](https://github.com/ybotok/loam/tree/main/src/core/staging); every other
69
+ multi-file writer — `new`, `gherkin`, `rebase`, `vouch`, `subsystem move` and `sync` — commits
70
+ through the smaller journaled transaction in
71
+ [src/core/staging/txn/](https://github.com/ybotok/loam/tree/main/src/core/staging/txn), whose
72
+ staged bytes are durable beside their targets so recovery rolls forward, and the verification
73
+ record commits under the same docs lock with a byte-level compare-and-swap. `validate` and
74
+ `doctor` report an interrupted commit until recovery succeeds. This is the model for any future
75
+ writer, not a subsystem to replace.
76
+ - **Path, identity and provenance discipline.** Lexical and real-path containment are centralized in
77
+ [src/core/kernel/path-safety.ts](https://github.com/ybotok/loam/blob/main/src/core/kernel/path-safety.ts);
78
+ validated ids and directories carry branded types constructible only in
79
+ [src/core/kernel/ids/](https://github.com/ybotok/loam/tree/main/src/core/kernel/ids) and consumed
80
+ through [src/core/repo/paths.ts](https://github.com/ybotok/loam/blob/main/src/core/repo/paths.ts),
81
+ with the casts contained by the architecture gate. Verification distinguishes an agent attestation
82
+ from digest-matched test evidence through
83
+ [src/core/verify/](https://github.com/ybotok/loam/tree/main/src/core/verify) and the verification
84
+ record defined in [SCHEMA.md](SCHEMA.md).
85
+ - **Executable architecture.** `npm run arch:check`
86
+ ([scripts/arch-check.mjs](https://github.com/ybotok/loam/blob/main/scripts/arch-check.mjs)) proves
87
+ every invariant [docs/DESIGN.md](https://github.com/ybotok/loam/blob/main/docs/DESIGN.md) and
88
+ [docs/CODE-STYLE.md](https://github.com/ybotok/loam/blob/main/docs/CODE-STYLE.md) state — import
89
+ cycles, the package graph, the core→commands ban, the barrel ban, the console/process boundary,
90
+ child-process bounds, brand-cast containment — each with a negative self-test in
91
+ [test/arch-gate.test.ts](https://github.com/ybotok/loam/blob/main/test/arch-gate.test.ts); the
92
+ 400-line / four-parameter / five-file limits hold with an empty baseline in
93
+ [test/code-limits.test.ts](https://github.com/ybotok/loam/blob/main/test/code-limits.test.ts);
94
+ coverage thresholds are explicit in
95
+ [vitest.config.ts](https://github.com/ybotok/loam/blob/main/vitest.config.ts); and
96
+ [scripts/gate-stress.mjs](https://github.com/ybotok/loam/blob/main/scripts/gate-stress.mjs) makes
97
+ gate stability a classified measurement rather than an impression.
98
+
99
+ ## Now
100
+
101
+ Nothing is queued behind code. Every integrity, enforcement and lifecycle item that preceded this
102
+ has landed (see [Recently landed](#recently-landed)) — the authored business axis, the use-case
103
+ axis, and as of 2026-09-02 the deployment axis, which is the first item this file ever wrote
104
+ directly into this section rather than promoting from [Later](#later--promote-only-from-evidence).
105
+
106
+ ### Release evidence, unchanged
107
+
108
+ What is left is the one thing this file cannot close by writing code, and it stays
109
+ where it is rather than being promoted for the shape of it: the CI `stability` job and the
110
+ installed-package smoke have still to be OBSERVED green from a pushed commit. That is release
111
+ evidence to collect, not an improvement to make.
112
+
113
+ An item returns to this section from [Later](#later--promote-only-from-evidence) when fleet evidence
114
+ names its operator, repeated task, failure mode, frequency, current workaround and measurable
115
+ acceptance criterion — never because this section is empty. An empty `## Now` is a true statement
116
+ about the backlog, and filling it from the candidate list to avoid the appearance of one would be
117
+ exactly the invented need the non-goals forbid.
118
+
119
+ ## Recently landed
120
+
121
+ Closed since the 2026-08-18 assessment, each with the commit or commit range that landed it on
122
+ `main`. [CHANGELOG.md](CHANGELOG.md) is the user-facing record; the full item texts — required
123
+ changes, exit criteria, and what each review surfaced — are in this file's history (`git show
124
+ 5cd3942:ROADMAP.md`). The three use-case entries below carry no range yet: they are green in the
125
+ working tree and not committed, and the range goes in with the commit rather than being guessed at
126
+ here.
127
+
128
+ #### The deployment axis — topology joined to requirements
129
+
130
+ **Promoted 2026-09-02, and authored as a feature in loam's own docs repo** rather than as an item
131
+ text here: `meta/docs/features/archive/FEAT-1-the-deployment-axis/`, whose `intent.md` carries the
132
+ four measurements and whose `specs/loam/arch.spec.md` carries the five rules the change establishes,
133
+ each with scenarios. This entry is the decision and the gate; that feature is the specification, and
134
+ the two must not be allowed to become two accounts of the same change.
135
+
136
+ **Landed 2026-09-02, complete.** Every step is in, and step 4 was corrected rather than built
137
+ (below) — the item specified two finding codes that the implementation showed it should not mint.
138
+ FEAT-1 archived once every edge it claimed existed —
139
+ and it archived having been CORRECTED against the tree twice, which is the argument for the route
140
+ rather than a footnote to it: the delta predicted a `core/kernel/` dependency that turned out to be
141
+ type-only (a brand costs an annotation, not an import) and missed `core/coherence/` entirely.
142
+ `npm run meta:check` was red for the whole of the build and went green with the archive, which is
143
+ the axis working rather than a gap in it.
144
+
145
+ The whole change is reviewable as five commits on `feat/deployment-axis`, and the one thing to read
146
+ first is what the implementation taught the plan: two of the codes this item specified were not
147
+ minted, and the reasons are in step 4.
148
+
149
+ **What is wrong today.** A LikeC4 `deployment { }` block is legal in a docs repo and completely
150
+ unread. The parser resolves every `instanceOf` in it — a container renamed out from under a
151
+ deployment node fails the gate as `landscape.invalid` — and after that nothing: no requirement can
152
+ name a node, no report counts one, and the context pack an agent implements from does not mention
153
+ topology at all. Two of the four measurements taken on a copy of `examples/docs` are the reason this
154
+ is an item rather than a wish. A `#obl-` tag on a `deploymentNode` is invisible to
155
+ `validate/fleet/obligations.ts`, which walks the logical model only — the same undeclared tag raises
156
+ `obligation.unknown` on a container and nothing on a datacenter, which is fail-open and a defect on
157
+ its own terms. And `parsedModel().deployment` already returns nodes with their tags, instances
158
+ carrying the id of the logical element each one instances, and relationships carrying metadata, so
159
+ the read costs no second parse, no new file format and no change to the frozen CLI surface.
160
+
161
+ **Required changes**, in the order the dependency graph forces:
162
+
163
+ 1. Walk the deployment model in every `#obl-` grade. Fail-open becomes fail-closed; no new code.
164
+ 2. A fourth `Covers:` entry form, `node:<id>`, with the same prefix accepted on either side of the
165
+ edge form. No new code.
166
+ 3. The parse adapter in `src/core/c4/parsed/`, and the deployment records added to
167
+ `test/likec4-model-parity.test.ts` — a two-stage substitution nothing measures is an assumption.
168
+ `src/core/c4/` holds exactly five files, so this is a sub-package and not a sixth module.
169
+ 4. **No new finding code, and this is a correction the implementation earned.** The item planned
170
+ two. The first, for a tagged node or edge no living arch requirement covers, turned out to be
171
+ `obligation.uncovered` asked of a second model: once step 1 walks the topology, the existing code
172
+ answers it, and a caller acts identically either way — write a `Covers:` line. A second code for
173
+ one question is exactly what the add-a-code checklist refuses. The second, for a container no
174
+ deployment instances, is declined outright: it asserts that everything modelled ought to be
175
+ deployed somewhere, which is a COMPLETENESS claim, and completeness is the one thing
176
+ `src/core/brief/unchecked.ts` says loam never checks. It is the same category error as the
177
+ at-least-two-datacenters rule below, one axis over.
178
+ 5. `features/<FEAT>/deployment/<name>.likec4`, create-only and copied whole — `core/usecases/delta/`
179
+ one axis over. It works because `extend` was measured to resolve across documents of one project,
180
+ so no text splice is needed; `delta-blocks.ts` goes on refusing a `deployment { }` block inside
181
+ `delta.likec4` and its message names the new slot. The collision is on the FILE, never on what is
182
+ inside it: two features may both extend one living region from documents of their own and both
183
+ archive, which is the shape the fleet-wide change actually takes.
184
+
185
+ **Graded against the merge preview**, which shipped one commit behind the slot and is the
186
+ second code, `deployment.doc-invalid` (error, never overridable). This axis needs the post-merge
187
+ corpus more literally than the use-case one: a feature that stands a NEW service up in a cluster
188
+ declares it in `delta.likec4` and instances it in the topology, so the element the document names
189
+ exists only after the merge. The staging that makes that readable moved OUT of
190
+ `core/usecases/delta/overlay.ts` into `core/c4/project/staged.ts` rather than being copied — the
191
+ two axes would have disagreed first about the merge preview, which is the one thing both
192
+ refusals rest on. The extraction dropped `core/usecases/` → `core/kernel/`, which is a one-line
193
+ edge and was edited into the model directly.
194
+ 6. The surfaces: the topology in the context pack (`context --json`'s `living.deployment`), the code
195
+ table `test/codes-drift.test.ts` requires, and one more statement in
196
+ `src/core/brief/unchecked.ts`. `loam explain` needed nothing — it parses the /loam-check fix
197
+ tables at runtime, so the rows added there ARE the entries. The scorecard row the item listed was
198
+ dropped: the fleet scorecard aggregates at the bound `service`, and a topology row there would
199
+ count deployment nodes against a denominator no service owns.
200
+
201
+ **Exit criteria.** Every step above green under the full gate; `covers.unknown` demonstrated firing
202
+ on a covered node that a topology change renamed, which is the acceptance criterion the trigger
203
+ names; the parity suite extended and shown to fail against an un-extended adapter; and
204
+ `test/self-model.test.ts` re-pinned once FEAT-1 archives.
205
+
206
+ **Out of scope, and each refusal is load-bearing.** No reading of Terraform, Helm or cluster state —
207
+ that is the extractor the non-goals forbid. No check that a service is deployed in at least two
208
+ datacenters: it would need `criticality` promoted from prose to a read field, and it would turn
209
+ `architecture/obligations.yaml` into the policy engine that file says in its own words it is not. A
210
+ multi-datacenter rule is an authored requirement whose `Covers:` line names the nodes; loam grades
211
+ the join and never the architecture. And no `environment` concept above LikeC4, because
212
+ `deploymentNode` is that mechanism and the fleet names its own kinds.
213
+
214
+ **The evidence, and its one gap stated plainly.** Operator: a team standing up a standby cluster in
215
+ a second datacenter. Repeated task: keeping RTO/RPO requirements attached to a topology that keeps
216
+ changing. Failure mode: a requirement about replication staying green after the node it described
217
+ was renamed or removed. Frequency: every topology change, which is the cadence a migration runs at.
218
+ Current workaround: a `Covers:` line that resolves to nothing, or no written requirement at all.
219
+ Acceptance criterion: a topology change that orphans a covered requirement is convicted without a
220
+ human noticing it first. **That is one operator, not two.** The maintainer judged the trigger
221
+ sufficient on the same basis recorded for landscape scaling and the authored business axis, and the
222
+ [Later](#later--promote-only-from-evidence) exit criteria are amended below to say so rather than
223
+ leaving the two paragraphs to contradict each other. Steps 1 and 2 do not rest on that judgement at
224
+ all: the first is a fail-open defect and the second is a grammar entry, and neither is a new axis.
225
+
226
+
227
+ - **A feature can bring a use case.** `features/<FEAT>/usecases/<name>.likec4` — a views-only
228
+ document `loam archive` copies into `architecture/usecases/` and `loam unarchive` takes back,
229
+ create-only, refused by `usecase.flow-exists` when the living tree already holds that file. All
230
+ four exit criteria: a `#req-` tag in it resolves against the feature's own capability delta as
231
+ well as the living tree (the both-corpora rule `Realizes:` follows); `capability.uncovered` counts
232
+ a resolved feature-local flow as cover, and its message now names the slot instead of telling an
233
+ author to `--approve` first and tag the flow afterwards; the merge and its undo go through the
234
+ transaction every other axis already uses; and a flow is graded against the map its own merge
235
+ would leave behind, so a hop may name a service the feature's `delta.likec4` adds while a hop
236
+ naming an element the merge does NOT land is `usecase.flow-invalid` — refused at plan time, with
237
+ `--approve` deliberately unable to move it. The design decision worth recording is the one the
238
+ item flagged as open: the overlay is the ARCHIVE'S OWN MERGE PREVIEW, computed with
239
+ `planLandscapeMerge` rather than approximated, so a flow can never be graded against a map the
240
+ merge does not write. `delta.likec4` still refuses a `dynamic view` and the reason is mechanical
241
+ rather than policy — it re-declares the landscape's identifiers and carries its own
242
+ `specification` block, so it cannot be staged beside the map in one LikeC4 project — but its
243
+ message now names the slot that exists.
244
+ - **One predicate answers "is this a use case".** `isUseCase` moved out of
245
+ `core/usecases/fleet.ts`'s private scope, widened to either reserved prefix, and is now the only
246
+ spelling: `validate`'s `gradedViews`, the fleet-flow read behind `capability.requirement-unrealized`,
247
+ and every reader behind `loam diff`, `delta`, `status`, the packs and `list capabilities` take it.
248
+ The byte gate that lets a fleet with no use cases skip the LikeC4 load was widened with it, and
249
+ that half mattered more than the predicate: a fleet whose only flow was `#req-`-tagged declared
250
+ `tag req-…` and no `cap-` anywhere, so the scan answered "no use cases" and nothing loaded the
251
+ project at all. Six tests pin it, each proven to fail against the narrowed predicate.
252
+
253
+ Two of the exit criterion's named readers do NOT show a `#req-`-only view, and the wording was
254
+ wrong rather than the code: `loam explore --capability` seeds through `flowsClaiming`, which
255
+ matches the whole `cap-<slug>` tag, and `list capabilities`' `keptBy` needs exactly one RESOLVED
256
+ `#cap-` scope before a `#req-` tag means anything. A view with no capability tag claims no
257
+ capability — correctly, and in both places. What the widening buys them is that such a view is
258
+ now SEEN: it opts the fleet in, so the flows are read and `useCases.unreadable` answers honestly
259
+ instead of the scan reporting a fleet with no use cases.
260
+ - **A step-definition catalogue.** Decided in writing first, as the item required, and the decision
261
+ is AUTHORED rather than emitted: `services/<svc>/steps.yaml`, a `steps:` list of step texts,
262
+ recording which phrases a team has agreed its suite defines. Four things decided it — loam does not
263
+ read code and must not present a derived thing as truth, so what can honestly be written down is a
264
+ decision and not an observation; `loam steps` needs no service repo to stand in and a catalogue
265
+ beside the code would make it need one; the rule the glossary and capability trees settled puts an
266
+ entry without prose in YAML; and nothing generated may land inside `<gherkinDir>/loam/`, which
267
+ `loam gherkin` owns and overwrites wholesale. `loam steps` now reports written phrases against
268
+ catalogued ones both ways round, so a phrase nobody has defined is distinguishable from one nobody
269
+ has written, and an ABSENT catalogue is distinguishable from an UNREADABLE one — reporting either
270
+ as "nothing catalogued" would print a whole suite as work owed. **The axis carries no stable code
271
+ and `loam validate` never reads it**: a phrase written before its glue is the normal order of work,
272
+ the near-duplicate groups stay a report, and no phrase-similarity finding ships. Entries are step
273
+ TEXTS rather than keys, because the key is loam's own normalisation and asking an author to type
274
+ it would make an internal spelling a hand-written contract.
275
+
276
+ - The authored business axis, end to end: the `capabilities/<cap>/spec.md` tree, `Realizes:` with
277
+ its living pin, the `#req-` flow join, the feature-local delta, the archive gate in both
278
+ directions and `loam new --capability` — `1c5541a`…`0850538`. Every remainder the item listed is
279
+ closed: the flag is registered, `show` and `delta` project a capability delta, and a half-created
280
+ `features/<FEAT>/capabilities/<id>/` is graded. Full item text: `git show ab4c856:ROADMAP.md`.
281
+ - The living `Realizes:` pin and `capability.realizes-stale`, with `loam rebase --living` — the
282
+ product's first standing suspect link over the LIVING corpus, and the answer to the one failure
283
+ class that decayed silently after a successful archive. Every other capability check is an
284
+ existence constraint and goes quiet when a target merely changes.
285
+ - The spine-first first hour: `examples/fleet.yaml`, day zero starting at `loam seed`, and a
286
+ README entry point that reaches a cross-service conviction with no requirement Markdown at all.
287
+ - `contracts.openapi` in `loam.json`: the build's own contract read as a check
288
+ (`openapi.generated-stale`, `contracts.source-missing`, `contracts.source-invalid`). Closes the
289
+ most load-bearing untested premise in SCHEMA — that the committed contract is the one the
290
+ service serves — without becoming a writer or an extractor.
291
+ - `spec.unknown-directive`: the near-miss grammar guard. An unrecognised body-line key is prose,
292
+ so the join it resembles does not exist and every check over it stays green for want of anything
293
+ to fail.
294
+ - `checklist` and `docsCommit` on each attestation, plus `verify.checklist-forked` — a federated
295
+ record can now say WHICH service's answers went stale rather than flagging all or none.
296
+ - Atomic, locked, compare-and-swap verification records — `60f4df6`.
297
+ - Full-gate concurrency stability: the classified stress runner and host probe — `d9b396a`.
298
+ - Crash-consistent multi-file writers: the journaled roll-forward transaction — `88e9026`.
299
+ - Executable architecture invariants: `npm run arch:check` and the brand migration —
300
+ `0106b49`…`9c0f01e`.
301
+ - Baseline semantics for OpenAPI path items and components — `0824b02`…`246a800`.
302
+ - OpenSpec corpus rebaselined at v1.9 beside the historical v1.7 — `9a0c6d7`, `724ab15`.
303
+ - `validate --all` fit for the fleet gate: one LikeC4 workspace, 18.8x — `f66ff56`…`56b031d`.
304
+ - The AsyncAPI feature lifecycle, mirrored axis-for-axis — `c5e205c`…`8837e9b`.
305
+ - Subsystems: a navigable tree under `services/` that no identity depends on — `600a696`…`8aee101`.
306
+ - The capability vocabulary, the requirement join and the `list capabilities` rollup —
307
+ `2bd9400`…`e26ff9f`.
308
+ - Documentation, package-content and link protection — `6ea2a68`…`08330ea`; paper trails `5cd3942`.
309
+ - The domain glossary, and the link check that makes it exact — `bc1b936`…`44a5386`.
310
+ - Architectural obligations: the ADR, the `#obl-` tag and the living `Covers:` index — `0b5fc24`.
311
+
312
+ Honest leftovers. One remains, and it lives outside this repository: the CI `stability` job has
313
+ still to be observed green, which needs a push and then a `workflow_dispatch`.
314
+
315
+ The two merge holes recorded here are closed, and they were not the same defect. On the OpenAPI axis
316
+ the capability existed and was merely unreachable: the merge tested `paths` for absence and answered
317
+ no-op before it had parsed the living document, while the component closure is the last thing it
318
+ runs. It now consults the surface enumeration instead, and a genuinely new component is promoted
319
+ BEFORE the ref fixpoint is seeded rather than after, so its own `$ref`s ride the same sweep.
320
+
321
+ On the event axis the capability did not exist. AsyncAPI had no surface enumeration outside the
322
+ three slots, no root baseline record, and no pin that could reach a `components.schemas` value — the
323
+ event pin is written INTO a slot value, which works because every slot value is a mapping and a JSON
324
+ Schema is not. So closing it was new machinery rather than the same control-flow fix: a
325
+ `core/asyncapi/baseline/` package, a root `x-loam-baselines` record that `loam rebase` writes and
326
+ `stripAsyncapiMarkers` removes on every branch, surface grading folded into the SAME per-service
327
+ unpinned counter rather than a second warning, and one new archive-plan code,
328
+ `asyncapi.component-modified`. The asymmetry is worth recording: two sentences in one bullet
329
+ described one control-flow bug and one absent subsystem, and only tracing the code told them apart.
330
+
331
+ ## Later — promote only from evidence
332
+
333
+ Health composition, built-in rendering, UI generation and landscape decomposition remain candidate
334
+ investments, not promises. Promote one only when fleet evidence names the operator, repeated task,
335
+ failure mode, frequency, current workaround, and measurable acceptance criterion. The authored
336
+ business axis stays listed below because its trigger and its reasoning are the record of how a Later
337
+ item gets promoted — it went from here to `## Now` and from there to
338
+ [Recently landed](#recently-landed), and the trail is the point.
339
+
340
+ - **Health composition:** proceed only if both service-level `health.yaml` and fleet relationships
341
+ are repeatedly being joined by hand and that work causes missed or contradictory checks. The
342
+ result must compose declared signals; it must not infer operational truth from code or monitoring
343
+ systems.
344
+ - **Rendering:** LikeC4 remains the renderer. A loam rendering command needs evidence that
345
+ invocation, scoping, or artifact reproducibility is the recurring problem, and it must stay
346
+ outside validation so view computation cannot slow or change the gate. This item is about
347
+ **drawing**, and LikeC4 keeps that job. Reading a `dynamic view`'s declared steps is not rendering
348
+ and is not this item — see docs/DESIGN.md rule 26.
349
+ - **UI generation:** begin with a disposable projection over the stable JSON contract only after CLI
350
+ consumers demonstrate a repeated navigation problem. It must not introduce a second mutable state,
351
+ hidden workflow state, or a required service.
352
+ - **Landscape scaling:** retain one landscape while conflicts are exceptional. If same-service
353
+ conflicts become routine — the current trigger in [SCHEMA.md](SCHEMA.md) is weekly rather than
354
+ monthly — evaluate service-owned model files plus a thin global cross-service map. Migration must
355
+ preserve archive/undo, deterministic resolution, and readable plain files.
356
+ - **Authored business axis — PROMOTED 2026-08-27, and landed in full; see
357
+ [Recently landed](#recently-landed).** The gate asked for evidence of authorship: analyst edits
358
+ appearing in `services/*/spec.md` history, or capability-level requirements accumulating as prose
359
+ that no requirement realizes. The maintainer supplied it as a statement about how his fleet works
360
+ rather than as git history — business does not think in services, and an analyst does not write
361
+ them — and the shape of the hole was verified rather than argued: **every requirement loam knew
362
+ belonged to exactly one service directory**, so an analyst’s whole surface was a declared name in
363
+ `capabilities.yaml` plus an `intent.md` that is archived with its feature. No living
364
+ business-level document existed at any altitude. The full gated text, including the four sub-items
365
+ and the cascade it follows, is in this file’s history (`git show 53c762a:ROADMAP.md`).
366
+
367
+ Exit criteria for promoting a Later item:
368
+
369
+ - Evidence comes from at least two independent operators or fleets, except landscape scaling, the
370
+ authored business axis and — added 2026-09-02 — the deployment axis in [Now](#now), whose recorded
371
+ triggers are sufficient. Three exceptions is where this criterion starts describing the rule
372
+ rather than the exception: the next single-operator promotion has to say why the criterion should
373
+ survive, or retire it.
374
+ - An ADR compares the existing workflow, external tooling, and the smallest loam-owned change.
375
+ - A prototype is measured against a predeclared acceptance criterion and preserves every non-goal
376
+ below.
377
+ - The feature returns to this roadmap under a numbered priority before production implementation
378
+ begins.
379
+
380
+ ## Self-hosting: loam on loam
381
+
382
+ Placed in a section of its own, and the placement is the argument. This is not a `## Now` item, and
383
+ nothing here may be mistaken for one. It is not a "Later" candidate either: promotion
384
+ from that section requires evidence from at least two independent operators or fleets (bar the three
385
+ whose recorded triggers were judged sufficient when they were written), and loam's own repository is
386
+ one operator by construction, so a Later entry could only ever be a permanent exception to the rule
387
+ it sits under. Nor is its value speculative — the trigger below is a defect this repository has
388
+ already produced by hand. As with every other section here, the position implies no schedule.
389
+
390
+ ### Model loam's own architecture in loam
391
+
392
+ loam's architecture is already specified in prose and already executable:
393
+ [docs/DESIGN.md](https://github.com/ybotok/loam/blob/main/docs/DESIGN.md) states it as numbered
394
+ rules, and `npm run arch:check`
395
+ ([scripts/arch-check.mjs](https://github.com/ybotok/loam/blob/main/scripts/arch-check.mjs)) over
396
+ [scripts/package-graph.mjs](https://github.com/ybotok/loam/blob/main/scripts/package-graph.mjs) is
397
+ their proof. That is exactly the shape of an `arch.spec.md` whose requirements carry `Covers:` lines
398
+ onto a LikeC4 model of loam's own package graph — the one axis where loam's subject matter and
399
+ loam's own tree are the same object.
400
+
401
+ The recorded trigger is two defects that reviewers caught **by hand** during the session that
402
+ produced the current `[Unreleased]` [CHANGELOG.md](CHANGELOG.md), both of which a
403
+ `c4.uncovered`-style check convicts mechanically: a package of one file — a `core/review/`, against
404
+ DESIGN's own "a package of one is a directory pretending to be a subject" — and a package-layout
405
+ table that had stopped describing the tree.
406
+
407
+ Both are closed, and the second was worse than the hand check found. Checked 2026-08-27 the table
408
+ was missing four rows; measured 2026-08-29 against the derived graph it was missing **nine**
409
+ (`brief`, `explain`, `glossary`, `links`, `obligations`, `owners`, `provenance`, `scaffold`,
410
+ `usecases`) and carried a false `Depends on` cell in **eleven more** — `core/c4/` claimed to depend
411
+ on nothing while importing `repo` and `kernel`. That is the difference the item was written to buy:
412
+ a hand check finds what a reader happens to look at, and a derived one finds the column nobody
413
+ re-read. DESIGN carries 26 numbered rules under `## Rules`, plus two more in the package-layout
414
+ section.
415
+
416
+ What does not fit is larger, and pretending otherwise would be the failure this document is written
417
+ against. loam is one CLI, not a fleet: there is no service topology, no OpenAPI, no AsyncAPI and no
418
+ authorization vocabulary, so the `operationId` spine, the message spine and `Requires:` have nothing
419
+ to join. Roughly half of `validate`'s checks would be permanently silent, and a check that is silent
420
+ because nothing asked it must never be read as a check that passed. The evidence axis is worse:
421
+ loam's own tests are vitest, not cucumber, so every scenario claim would be `attested` and never
422
+ `verified` — the distinction loam exists to make would be the one property self-hosting does not
423
+ exercise. Building a vitest-to-cucumber-JSON bridge to improve that number is precisely the invented
424
+ need the non-goals below forbid — "an agent-confirmed scenario does not become verified merely to
425
+ make a gate green" — and if such a bridge ever lands it must be because someone's fleet needed it.
426
+
427
+ One layout constraint is settled rather than open. `loam.json` is in
428
+ [.gitignore](https://github.com/ybotok/loam/blob/main/.gitignore) at the root and no root config is
429
+ committed: one there governs every directory beneath it, this whole clone included. The self-docs
430
+ therefore live under a subdirectory carrying its own config — `meta/loam.json` over `meta/docs/` —
431
+ which works because config discovery walks upward from the cwd, and it is the shape
432
+ [`examples/docs/`](https://github.com/ybotok/loam/tree/main/examples/docs) now carries too.
433
+
434
+ **Self-hosting is not external evidence.** A repository maintained solely for loam is one operator
435
+ by construction, so nothing here substitutes for proof from fleets that are not loam's own. That is
436
+ not an obstacle to route around; it is the reason this item is written separately. This buys daily
437
+ pressure on loam's own seams — a different kind of evidence.
438
+
439
+ The recommended first step is the architecture axis only:
440
+
441
+ - `meta/docs/` holding one landscape whose elements are loam's own source packages and whose edges
442
+ are the real import edges
443
+ [scripts/package-graph.mjs](https://github.com/ybotok/loam/blob/main/scripts/package-graph.mjs)
444
+ already computes.
445
+ - One service, `loam`, whose `arch.spec.md` carries DESIGN's numbered rules as requirements with
446
+ `Covers:` lines onto that model.
447
+ - `loam validate --all` running in CI beside `npm run arch:check`, in
448
+ [.github/workflows/ci.yml](https://github.com/ybotok/loam/blob/main/.github/workflows/ci.yml).
449
+
450
+ **Landed.** `meta/docs/` holds a landscape whose 70 containers are the top-level subjects of `src/`
451
+ and whose 403 relationships are the real value imports, and `services/loam/arch.spec.md` carries
452
+ fourteen of DESIGN's numbered rules as requirements with `Covers:` lines onto real model objects.
453
+ `npm run meta:check` runs in CI beside `npm run arch:check`. Each exit criterion, discharged:
454
+
455
+ - **It convicted drift `arch:check` cannot see, and the drift is fixed here.** Nine missing
456
+ package-layout rows and eleven false `Depends on` cells; a DAG-levels table that placed `verify/`
457
+ below `gherkin/`, which it imports; a "7-level DAG" that is ten levels per package and eleven per
458
+ file; DESIGN's register-call sentence reading 27/28 against a tree of 28/29 — **whose pin in
459
+ `test/docs-facts.test.ts` had never once matched**, because it required a literal space where the
460
+ page wraps. That loop now runs over the flattened text and asserts the sentence is present before
461
+ grading it. And two mutual dependencies between top-level subjects that `arch:graph` cannot see at
462
+ all, because it keys on the full relative directory so `core/c4/project` and `core/c4` are
463
+ different nodes: `core/c4` ↔ `core/repo` and `core/repo` ↔ `core/provenance`. Both are hub moves
464
+ under the `git mv`-in-its-own-commit obligation, so they are **qualified rather than broken** —
465
+ DESIGN now names which granularity is checked and by what, and `scripts/self-model.mjs` holds them
466
+ in an `ACCEPTED_CYCLES` baseline that may only shrink. Breaking them is the follow-up.
467
+ - **Nothing exists only to make a check fire, and here are the families that stay silent.**
468
+ `meta/docs` declares no `openapi.yaml`, `asyncapi.yaml`, `permissions.yaml`, `capabilities.yaml`,
469
+ `health.yaml`, no `sources:`, no `dynamic view` and no feature in flight — so `api.*`, `event.*`,
470
+ `spine.*`, `permissions.*`, `capability.*`, `health.*`, `usecase.*`, `obligation.*`, `link.*`,
471
+ `glossary.*`, `delta.*`, `openapi.*`, `asyncapi.*`, `archedge.*` and every `verify`/`vouch` claim
472
+ family are silent because nothing asked them. A green run here is two `ok` findings and two
473
+ `warn`s. It is not a fleet's worth of coverage and must not be read as one; the same list opens
474
+ `services/loam/arch.spec.md`, so a reader of the tree hits it before the requirements.
475
+ - **The CI cost is measured**: `npm run meta:check` is 149/149/159 ms over three runs on the Linux
476
+ gate host — about a fifth of the 671/707 ms `npm run arch:check` it sits beside — plus 1.11 s of
477
+ test time for `test/self-model.test.ts`, which runs in parallel inside the suite.
478
+ - **No root `loam.json` is committed.** `.gitignore`'s pattern was unanchored and so ignored a file
479
+ of that name at ANY depth, `meta/loam.json` included; it is now `/loam.json`, a developer's own
480
+ local pointer at the root is still ignored, and a committed one in a subdirectory is not.
481
+ - **Every scenario claim stays `attested`** — vacuously, and that is worth saying rather than
482
+ ticking. The model produces **zero** claims: claims come from features, and there is no feature.
483
+ Nothing was built to convert one, and nothing could have been.
484
+
485
+ What the axis found about the PRODUCT, which is what it was built to buy:
486
+
487
+ - **A docs repo cannot describe a source tree above its own `loam.json`.** `repoDir` is the cwd only
488
+ when the config's own `service` field matches, and `meta/loam.json` sits below the tree it
489
+ describes, so the only spelling that reaches `src/` is `../src/` — which `sources.path-outside`
490
+ correctly refuses. There is no spelling that works. Provenance is dark, `loam vouch` has nothing
491
+ to stamp, and maturity is capped below `sourced`. That is why the pinned warning count is two.
492
+ - **`c4.uncovered` has no living scope.** It grades only what a FEATURE DELTA introduces, so with no
493
+ feature open, 70 containers and 403 edges raise nothing. `covers.unknown` proves the `Covers:`
494
+ lines resolve and says nothing about what is left over. `obligation.uncovered` is the shape that
495
+ would answer this over a living map; this tree declares no obligations yet.
496
+ - **The fleet scorecard counts service-LEVEL elements**, so a 70-box model reports
497
+ `c4: {elements: 1, covered: 0}` — correct by its own definition and badly misleading here.
498
+ - **`services/core/` + `services/commands/` is unspellable, not merely unwise**: the one flat
499
+ namespace for subsystem names and service ids collides on eleven leaf names. Nesting inside one
500
+ bound system is what keeps `landscape.service-undocumented` correctly quiet, but it means the
501
+ service census answers "1" and every `landscape.*` shape advisory walks a set of one.
502
+ - **`agents.stale` will fire on loam's own docs repo at the next version bump**, because
503
+ `meta/docs/AGENTS.md` carries a generated-by stamp. That is the axis working — daily pressure on a
504
+ seam — and it is now a release-checklist item: re-stamp the file and update the pin.
505
+ `examples/docs` has no `AGENTS.md`, so nothing had ever surfaced this.
506
+ - **And `agents.stale` is graded on the STAMP, not the content**, which the same file then
507
+ demonstrated: `meta/docs/AGENTS.md` was already behind `src/` — by the AsyncAPI and OpenAPI merge
508
+ sections, before this change added two more — and every command reported the repo healthy, because
509
+ the version in the stamp still matched. A docs repo whose `AGENTS.md` was generated by THIS version
510
+ and has since been left behind by a same-version change is silently wrong, and there is no check
511
+ that can see it. The file is regenerated here; what would close it properly is a content digest
512
+ beside the stamp, which is a real design question (an AGENTS.md a fleet has edited by hand is a
513
+ supported state, and a digest would convict it) and is not attempted.
514
+ - **`loam init` writes agent tooling into the cwd**, so a self-model directory inside a repository
515
+ that already has `.claude/` gets a duplicate set. `--no-commands --no-skills` is the escape hatch
516
+ and it works, but "the docs tree" and "this repository's agent tooling" are one command today.
517
+
518
+ ### The forward flow on loam's own repository — TRIED, then ADOPTED
519
+
520
+ Whether loam's own changes go through `loam new`, `loam delta`, `loam archive` and `loam verify` per
521
+ feature was the one question this section left open, because it is a far larger process commitment
522
+ than one modeled axis: it changes how every change to this repository is WRITTEN rather than how one
523
+ property of it is checked. It was first run as an experiment, on a throwaway copy of `meta/`, against
524
+ the use-case work in this same change — and then taken as a decision.
525
+
526
+ **What was adopted, and it is deliberately not "everything through the flow".** The maintenance
527
+ obligations are unconditional and are now in the gate: `npm run meta:check` after any change that
528
+ moves an import between two top-level subjects, and `npm run meta:agents` after any edit to the
529
+ sections that generate a docs repo's `AGENTS.md`. The forward flow itself is for a change somebody
530
+ should be able to read back as a DECISION — a new subject, a seam moved, a rule added to DESIGN —
531
+ and a one-line edge stays a direct edit. `AGENTS.md`'s "The self-model" section states the rule and
532
+ the `self-model` skill carries the commands, the frictions and the silent-check list.
533
+
534
+ **Mechanically it works, end to end and with no special-casing.** `loam new FEAT-1 --touches loam`
535
+ scaffolded the feature; the C4 delta re-declared the four containers its new edges join and tagged
536
+ the edges `#FEAT-1`; the architectural requirement went into `specs/loam/arch.spec.md` as an
537
+ `## ADDED Requirements` delta; `loam validate --feature` passed; `loam archive` merged four
538
+ relationships into the landscape and the requirement into the living `arch.spec.md`. The archived
539
+ result was compared against the same two edits made BY HAND, and the edge sets are identical.
540
+ `npm run meta:check` reports the written model describes the tree either way.
541
+
542
+ **Four things the trial found, and each is the axis earning its keep rather than an obstacle:**
543
+
544
+ - **`loam delta` printed `Covers:` twice.** A directive line is a body line — `core/document/parse.ts`
545
+ keeps it in `text` so a requirement round-trips and its digest stays stable — and the briefing
546
+ printed the body verbatim AND the parsed field underneath. So `Operations:` and `Covers:` showed
547
+ twice while the five directives with no such re-print showed once. Fixed and pinned in this
548
+ change. Nothing had caught it because the human view is asserted almost nowhere and the
549
+ duplication is invisible on a requirement carrying neither line.
550
+ - **The scaffold's delta template assumes a fleet of top-level systems.** It offers
551
+ `x = softwareSystem 'x'` and an edge between two of them; the self-model is 70 nested `container`s
552
+ inside one bound system, so every line of the template has to be deleted and the nesting
553
+ re-declared by hand. Not wrong — the template is written for loam's distributed-system entry
554
+ path — but the first feature in a nested single-boundary model costs a read of
555
+ `landscape.likec4` to find out.
556
+ - **`loam new` scaffolds the BUSINESS axis and the self-model has only the architectural one.**
557
+ `specs/loam/spec.md` arrives and has to be deleted, and `specs/loam/arch.spec.md` written by hand;
558
+ there is no `--arch` to say which axis a feature is about.
559
+ - **The arch-edge coverage line reads `loam → loam` once per edge**, because every edge is between
560
+ two containers inside one bound system. Correct by its own definition, and useless here — the same
561
+ shape as the fleet scorecard reporting `c4: {elements: 1}` over a 70-box model, already recorded
562
+ above.
563
+
564
+ **What it still cannot buy is the evidence axis, and that is unchanged.** loam's tests are vitest,
565
+ not cucumber, so `loam verify` would record every scenario claim as `attested` and never `verified`
566
+ — the distinction loam exists to make is the one property self-hosting does not exercise. Building a
567
+ vitest-to-cucumber-JSON bridge to improve that number remains the invented need the non-goals forbid.
568
+
569
+ The cost was always process rather than capability, and the trial confirmed it: nothing prevents the
570
+ flow, and the frictions are four rough edges in a scaffold written for a fleet of top-level systems.
571
+ The decision taken is to pay that cost for changes worth reading back as decisions, and to make the
572
+ two maintenance obligations unconditional — which is the half that had already been failing silently,
573
+ twice, before anybody chose anything.
574
+
575
+ **One thing this does NOT change.** A repository maintained solely for loam is one operator by
576
+ construction, so nothing adopted here counts as external evidence for a `## Later` item. That was the
577
+ reason this section sits apart from the promotion rules, and adopting a process inside it does not
578
+ move that line.
579
+
580
+ ## Non-goals
581
+
582
+ - No hosted control plane, server, database, background synchronizer, or network-owned source of
583
+ truth.
584
+ - No code extractor or generated architecture presented as truth. Agents may read and propose; loam
585
+ owns deterministic questions, formats, and checks.
586
+ - No full OpenSpec clone, bidirectional OpenSpec writer, or claim of compatibility beyond the exact
587
+ pinned corpus and explicitly supported Markdown grammar.
588
+ - No replacement for LikeC4's renderer, the forge's ownership/review controls, or a service's
589
+ contract and test tooling.
590
+ - No weakening of attested-versus-tested evidence: an agent-confirmed scenario does not become
591
+ verified merely to make a gate green.
592
+ - No runtime dependency added to avoid implementing a small invariant with Node and the existing
593
+ stack.
594
+ - No workspace split, barrel exports, command-oriented vertical slices, or architectural rewrite for
595
+ aesthetics. The single binary and acyclic source-package tree remain deliberate.
596
+ - No silent break to commands, flags, exit codes, JSON envelope fields, stable codes, or the
597
+ plain-file formats users already commit.
598
+ - No schedule inferred from section order. Priority says what must become true first; evidence
599
+ decides when it is true.