@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"print.js","sourceRoot":"","sources":["../../../../src/commands/vouch/pack/print.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The reading pack's two renderings — the human view in the proposal's order\n * (per axis: the body diff, then the source worklist, then the sections\n * already covered; first vouch: the fleet map's claims, then everything), and\n * the `--json` envelope. `runPack` is the whole command surface of\n * `--pack`: vouch.ts hands over here as soon as the flag combination is\n * legal, so the write path's machinery — identity, prompt, lock, journal —\n * never loads for a run that cannot write. Exit 0 covers every computed pack\n * INCLUDING full-read fallbacks (\"read everything\" is an answer, not a\n * failure); only refusals exit 1.\n */\nimport { emitJson, fail } from \"../../../core/envelope/json.js\";\nimport type { DocsDir } from \"../../../core/kernel/ids/dirs.js\";\nimport type { PathableService } from \"../../../core/kernel/ids/service.js\";\nimport type { LandscapeEdge } from \"../../../core/vocabulary/maturity.js\";\nimport { plural } from \"../../policy/format.js\";\nimport type { PackAxis, PackReport } from \"./contract.js\";\nimport type { PackSample } from \"./sections.js\";\nimport { buildPack } from \"./pack.js\";\n\nexport interface RunPackRequest {\n docsDir: DocsDir;\n service: PathableService;\n repoDir: string;\n json: boolean;\n /** `--sample <n>`: print the reading list for a SAMPLED vouch rather than the whole one. */\n sample?: number;\n}\n\nexport async function runPack(req: RunPackRequest): Promise<void> {\n const outcome = await buildPack({\n docsDir: req.docsDir,\n service: req.service,\n repoDir: req.repoDir,\n ...(req.sample === undefined ? {} : { sample: req.sample }),\n });\n if (!outcome.ok) return fail(req.json, outcome.code, outcome.message);\n if (req.json) {\n emitJson(packPayload(outcome.report));\n return;\n }\n printPack(outcome.report);\n}\n\n/** The additive `--json` shape: `mode: \"pack\"` beside the write path's stamp payload. */\nfunction packPayload(report: PackReport): Record<string, unknown> {\n return {\n command: \"vouch\",\n mode: \"pack\",\n service: report.service,\n packMode: report.packMode,\n pendingCommit: report.pendingCommit,\n spec: axisPayload(report.spec),\n archSpec: report.archSpec === null ? null : axisPayload(report.archSpec),\n ...(report.landscape === null ? {} : { landscape: report.landscape }),\n };\n}\n\n/** One axis, stamp fields under their frontmatter spellings. */\nfunction axisPayload(axis: PackAxis): Record<string, unknown> {\n return {\n path: axis.path,\n file: axis.file,\n ...(axis.vouchedBy === undefined ? {} : { vouched_by: axis.vouchedBy }),\n ...(axis.lastVerified === undefined ? {} : { last_verified: axis.lastVerified }),\n body: axis.body,\n sources: axis.sources,\n skipped: axis.skipped,\n ...(axis.headings === undefined ? {} : { headings: axis.headings }),\n ...(axis.vouchScope === undefined ? {} : { vouchScope: axis.vouchScope }),\n ...(axis.sample === undefined ? {} : { sample: axis.sample }),\n };\n}\n\nfunction printPack(report: PackReport): void {\n // Before anything else: a pack computed over a half-committed docs repo may\n // be describing bytes the next journaled writer will replace, and a person\n // must know that before they spend a read on it.\n if (report.pendingCommit) {\n console.log(\n \"⚠ an interrupted docs-repo commit is pending — what is on disk (this pack included) may \" +\n \"predate it. Any journaled docs-repo writer (`loam vouch`, `loam archive`) rolls it \" +\n \"forward on its next run; re-run --pack after.\\n\",\n );\n }\n if (report.packMode === \"first-vouch\") {\n console.log(`${report.service} first-vouch reading pack — the whole document is the read\\n`);\n printLandscape(report);\n } else {\n console.log(`${report.service} re-vouch reading pack\\n`);\n }\n for (const axis of [report.spec, ...(report.archSpec === null ? [] : [report.archSpec])]) {\n printAxis(axis);\n }\n console.log(\n `\\nWhen the read is done, a person runs \\`loam vouch --service ${report.service}\\` in the service's own repo — the pack stamps nothing.`,\n );\n}\n\n/** The fleet map's claims — first, because the spec's author did not write them. */\nfunction printLandscape(report: PackReport): void {\n if (report.landscape === null) return;\n if (report.landscape.kind === \"silent\") {\n console.log(` ${report.landscape.reason}\\n`);\n return;\n }\n const { inbound, outbound } = report.landscape;\n if (inbound.length === 0 && outbound.length === 0) {\n console.log(` the fleet map draws no edge touching ${report.service}\\n`);\n return;\n }\n console.log(\" what the fleet map says:\");\n for (const edge of inbound) console.log(` ${edgeLine(edge.service, report.service, edge)}`);\n for (const edge of outbound) console.log(` ${edgeLine(report.service, edge.service, edge)}`);\n console.log(\"\");\n}\n\nfunction edgeLine(from: string, to: string, edge: LandscapeEdge): string {\n const label = edge.op !== null ? ` (${edge.op})` : edge.title !== null ? ` — ${edge.title}` : \"\";\n return `${from} -> ${to}${label}`;\n}\n\n/** One axis in the proposal's order: (a) body, (b) source worklist, (c) already covered. */\nfunction printAxis(axis: PackAxis): void {\n console.log(`${axis.path}\\n`);\n printBody(axis);\n printSources(axis);\n printSkipped(axis);\n printSampledStamp(axis);\n printCovered(axis);\n // Under `--sample` the sampled list REPLACES the full heading listing —\n // printing both would make the list a person must not skip look like the\n // one they may. The diff above is never filtered: a sample narrows what the\n // stamp CLAIMS, never what a reader is shown.\n if (axis.sample !== undefined) {\n printSample(axis.sample);\n } else if (axis.headings !== undefined) {\n console.log(` sections to read (${axis.headings.length}):`);\n for (const heading of axis.headings) console.log(` ${heading}`);\n console.log(\"\");\n }\n}\n\n/**\n * The forward sample: exactly what the `--sample <n>` vouch after this pack\n * will stand behind. The consequences are named in one line rather than\n * restated at length — `sample/print.ts` says them in full at the prompt,\n * which is the screen where somebody is about to commit to them.\n */\nfunction printSample(sample: PackSample): void {\n if (sample.covers) {\n console.log(` sampled read: the sample reaches all ${sample.of} section(s) — the vouch after it is an ordinary full one.\\n`);\n return;\n }\n console.log(` sampled read — ${sample.headings.length} of ${sample.of} section(s), seed=${sample.seed}:`);\n console.log(\" the preamble above the first heading — always read, never part of the count\");\n for (const heading of sample.headings) console.log(` ${heading}`);\n console.log(\n `\\n Reading only these is what --sample means, and the stamp will say so: \\`vouch_scope: sampled ` +\n `${sample.headings.length}/${sample.of}\\`, then \\`sources.sampled-vouch\\` until somebody reads the whole document.\\n`,\n );\n}\n\n/**\n * The last vouch's own scope, printed BEFORE the covered list it disqualifies\n * — which sections that person actually read (`sections.ts`'s `priorScope`\n * recomputes them from the stamped seed), and which have now survived a vouch\n * without anybody looking. Where the read set cannot be recomputed, no\n * covered set is named at all: an unreproducible sample licenses nothing.\n */\nfunction printSampledStamp(axis: PackAxis): void {\n const scope = axis.vouchScope;\n if (scope === undefined) return;\n const whose = `${axis.vouchedBy === undefined ? \"\" : ` by ${axis.vouchedBy}`}${axis.lastVerified === undefined ? \"\" : ` on ${axis.lastVerified}`}`;\n console.log(\n scope.scope === null\n ? ` ⚠ the last vouch${whose} carries a vouch_scope this loam cannot read (\\`${scope.stamped}\\`) — graded as ` +\n \"SAMPLED, because an unreadable scope must never be taken for a full read.\"\n : ` ⚠ the last vouch${whose} was SAMPLED: ${scope.scope.sections} of ${scope.scope.of} section(s), ` +\n `seed=${scope.scope.seed}. \"Unchanged since then\" does not mean anybody read it.`,\n );\n if (scope.read === null) {\n console.log(\" which sections it read cannot be recomputed (the body moved, or the scope does not decode), so nothing here is covered.\\n\");\n return;\n }\n console.log(` read at that vouch (${scope.read.length}): ${scope.read.join(\" · \")}`);\n if (scope.unread !== null && scope.unread.length > 0) {\n console.log(` NEVER read by anyone (${scope.unread.length}) — this is the read:`);\n for (const heading of scope.unread) console.log(` ${heading}`);\n }\n console.log(\"\");\n}\n\nfunction printBody(axis: PackAxis): void {\n const since = axis.lastVerified === undefined ? \"the stamp\" : axis.lastVerified;\n switch (axis.body.kind) {\n case \"unchanged\":\n // The qualification is the whole point after a sampled vouch: the text\n // did not move, and most of it was still never read. Saying \"nothing to\n // re-read\" over that would be this feature's worst failure — a partial\n // read reported as a finished one — so the sentence stops at what it\n // can actually claim and hands off to the scope block below.\n console.log(\n axis.vouchScope === undefined\n ? ` body unchanged since ${since} — nothing of the document itself to re-read\\n`\n : ` body unchanged since ${since} — but that vouch was sampled, so \"unchanged\" is not \"read\"\\n`,\n );\n return;\n case \"full-read\":\n console.log(` full read: ${axis.body.reason}\\n`);\n return;\n case \"diff\": {\n // \"The file's diff\", not \"the body's\": a hand edit to the header after\n // the vouch rides along in git's hunks, and promising body-only would\n // make truthful noise read as a bug.\n console.log(\n ` body changed since ${since} — the file's diff from its last vouched state (${axis.body.ancestorCommit.slice(0, 12)}):\\n`,\n );\n console.log(axis.body.diff.trimEnd());\n const { changed, added, removed } = axis.body.sections;\n const summary = [\n ...(changed.length > 0 ? [`changed: ${changed.join(\", \")}`] : []),\n ...(added.length > 0 ? [`added: ${added.join(\", \")}`] : []),\n ...(removed.length > 0 ? [`removed: ${removed.join(\", \")}`] : []),\n ];\n if (summary.length > 0) console.log(`\\n sections ${summary.join(\"; \")}`);\n console.log(\"\");\n return;\n }\n }\n}\n\nfunction printSources(axis: PackAxis): void {\n switch (axis.sources.kind) {\n case \"unchanged\":\n console.log(\" sources unchanged since the stamp\\n\");\n return;\n case \"unvouched\":\n console.log(\" sources carry no sources_digest yet — the vouch will stamp one\\n\");\n return;\n case \"unavailable\":\n console.log(` sources — the re-vouch will refuse until this is fixed:\\n ${axis.sources.reason}\\n`);\n return;\n case \"uncounted\":\n console.log(\n ` sources changed — ${axis.sources.countThen === null ? \"an unknown number of\" : axis.sources.countThen} file(s) at the stamp, ` +\n `${axis.sources.countNow} now, and the stamp cannot name which moved: re-read the sources\\n`,\n );\n return;\n case \"delta\": {\n const { added, changed, removed } = axis.sources;\n const moved = added.length + changed.length + removed.length;\n // movedSources' one-column annotated layout, so a reader who knows the\n // stale finding's shape reads this without learning a second one.\n console.log(` sources — ${moved} path(s) moved since the stamp:`);\n for (const path of added) console.log(` added ${path}`);\n for (const path of changed) console.log(` changed ${path}`);\n for (const path of removed) console.log(` removed ${path}`);\n console.log(\"\");\n return;\n }\n }\n}\n\n/**\n * The hole in the promise, said BEFORE the stamp rather than only on\n * vouch.ts's post-stamp screen: paths under the listed sources the digest\n * will not hash. Same sentence as that screen, so the pre-vouch and\n * post-vouch descriptions of one hole cannot drift apart.\n */\nfunction printSkipped(axis: PackAxis): void {\n if (axis.skipped.length === 0) return;\n console.log(` ⚠ ${plural(axis.skipped.length, \"path\")} under those sources went unhashed — the vouch's digest says nothing about what is behind them:`);\n for (const skip of axis.skipped) console.log(` ${skip.path} — ${skip.reason}`);\n console.log(\"\");\n}\n\n/** (c): what the previous vouch already covers, so the read can stop where it should. */\nfunction printCovered(axis: PackAxis): void {\n if (axis.body.kind !== \"diff\" || axis.body.sections.unchanged.length === 0) return;\n const by = axis.vouchedBy === undefined ? \"\" : ` by ${axis.vouchedBy}`;\n const on = axis.lastVerified === undefined ? \"\" : ` on ${axis.lastVerified}`;\n // The licence to skip rests entirely on somebody having read the section\n // before. A sampled vouch did not read most of them, so after one this list\n // is only \"text that did not move\" — it is still worth printing (a reader\n // wants to know what is stable), but it must not be printed under a heading\n // that says a person covered it.\n console.log(\n axis.vouchScope === undefined\n ? ` unchanged — previously vouched${by}${on}:`\n : ` unchanged since the sampled vouch${by}${on} — text that did not move, NOT a covered list:`,\n );\n for (const heading of axis.body.sections.unchanged) console.log(` ${heading}`);\n console.log(\"\");\n}\n"]}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * The reading pack's section-level derivations: pure text in, lists of
3
+ * headings out. Three of them, and the last two are why a sampled vouch does
4
+ * not quietly weaken this command —
5
+ *
6
+ * - `sectionDelta`, the heading summary printed beside the raw git diff and
7
+ * the source of the "already covered" list;
8
+ * - `forwardSample`, what the next `--sample <n>` vouch will read;
9
+ * - `priorScope`, what the last sampled vouch actually did read, so the
10
+ * covered list cannot count sections nobody opened.
11
+ *
12
+ * It lives in the vouch command package rather than `core/document` because
13
+ * that package sits at its five-file limit and this command package already
14
+ * holds vouch's non-printing logic (`../vet/verify.ts` precedent); the one
15
+ * structural question — what is an H2 heading — is still answered by
16
+ * `core/document/parse.ts`'s `sectionHeadings`, fence- and BOM-aware, so this
17
+ * module can never disagree with the rest of loam about whether a `## ` line
18
+ * inside a code fence is structure.
19
+ */
20
+ import { rawBody } from "../../../core/document/frontmatter.js";
21
+ import { sectionHeadings } from "../../../core/document/parse.js";
22
+ import { splitSections } from "../../../core/provenance/sample/sections.js";
23
+ import { planSample, readVouchScope, sampledSections, scopeText } from "../../../core/provenance/sample/scope.js";
24
+ import { contentDigest } from "../../../core/provenance/stamp.js";
25
+ /** How the delta names the text above the first H2 — a section with no heading to call it by. */
26
+ const PREAMBLE_LABEL = "(before the first heading)";
27
+ /**
28
+ * CRLF/CR to LF, the `core/verify/pins/pin.ts` recipe: the old body comes out
29
+ * of a git blob (LF) while the new one comes off a checkout that may be CRLF,
30
+ * and a comparison that let the line endings vote would report every section
31
+ * changed on exactly the machines whose config differs from the repo's.
32
+ * A pure line-ending change is invisible here — the same cost the pins
33
+ * accept, and for a reading list it is the right one: there is nothing to
34
+ * re-read in a CR.
35
+ */
36
+ function normalized(text) {
37
+ return text.replace(/\r\n|\r/g, "\n");
38
+ }
39
+ /**
40
+ * One body as heading -> section text. The heading LINE is the key and is not
41
+ * part of the value, so a section whose only change is its own heading reads
42
+ * as removed+added — which is what a reader must do about it: find it under
43
+ * its new name. A duplicated heading concatenates its sections under the one
44
+ * key rather than letting the last occurrence shadow the rest: the compare
45
+ * then sees all of the text, so an edit under either twin still reads as
46
+ * changed. Text before the first heading files under PREAMBLE_LABEL when any
47
+ * of it is more than whitespace.
48
+ */
49
+ function sectionMap(body) {
50
+ const text = normalized(body);
51
+ const lines = text.split("\n");
52
+ const headings = sectionHeadings(text);
53
+ const map = new Map();
54
+ const file = (key, segment) => {
55
+ map.set(key, map.has(key) ? `${map.get(key)}\n${segment}` : segment);
56
+ };
57
+ const firstHeadingLine = headings[0]?.line ?? lines.length + 1;
58
+ const preamble = lines.slice(0, firstHeadingLine - 1).join("\n");
59
+ if (preamble.trim() !== "")
60
+ map.set(PREAMBLE_LABEL, preamble);
61
+ headings.forEach((heading, i) => {
62
+ const end = headings[i + 1]?.line ?? lines.length + 1;
63
+ file(heading.text, lines.slice(heading.line, end - 1).join("\n"));
64
+ });
65
+ return map;
66
+ }
67
+ /**
68
+ * What `loam vouch --sample <n>` would read of this file — computed through
69
+ * the same `planSample` the stamp uses, so a pack and the vouch that follows
70
+ * it cannot prescribe different samples of one document. Both digests are the
71
+ * ones the stamp will carry: `contentDigest` survives stamping because the
72
+ * body does, and the sources digest is the vetting's own.
73
+ */
74
+ export function forwardSample(doc) {
75
+ const planned = planSample({
76
+ service: doc.service,
77
+ contentDigest: contentDigest(doc.raw),
78
+ sourcesDigest: doc.sourcesDigest,
79
+ body: rawBody(doc.raw),
80
+ n: doc.n,
81
+ });
82
+ return {
83
+ seed: planned.seed,
84
+ of: planned.of,
85
+ headings: planned.picked.map((section) => section.heading),
86
+ covers: planned.picked.length >= planned.of,
87
+ };
88
+ }
89
+ export function priorScope(fm, vouchedBody) {
90
+ // One reader, `readVouchScope`, decides what "sampled" means — so the pack
91
+ // cannot be the surface that quietly grades a mangled scope as a full vouch
92
+ // while `loam validate` grades it sampled.
93
+ const stamp = readVouchScope(fm);
94
+ if (stamp.kind === "none")
95
+ return null;
96
+ const stamped = scopeText(fm) ?? "";
97
+ const scope = stamp.kind === "sampled" ? stamp.scope : null;
98
+ const blind = { stamped, scope, read: null, unread: null };
99
+ if (scope === null || vouchedBody === null)
100
+ return blind;
101
+ const picked = sampledSections(vouchedBody, scope);
102
+ if (picked === null)
103
+ return blind;
104
+ // Partitioned by LINE, not by heading text: a body with two `## Notes`
105
+ // sections has two units, and matching on the text would report both as
106
+ // read when one was picked — turning a section nobody opened into a covered
107
+ // one, which is the exact misreading this function exists to prevent.
108
+ const read = new Set(picked.map((section) => section.line));
109
+ return {
110
+ stamped,
111
+ scope,
112
+ read: picked.map((section) => section.heading),
113
+ unread: splitSections(vouchedBody)
114
+ .filter((section) => !read.has(section.line))
115
+ .map((section) => section.heading),
116
+ };
117
+ }
118
+ /**
119
+ * Compare two bodies section by section. Exact text per heading after line
120
+ * endings are normalized — no reflow tolerance, because "unchanged" here
121
+ * licenses a person to NOT re-read a section, and the only claim safe to make
122
+ * at that stakes is byte equality.
123
+ */
124
+ export function sectionDelta(oldBody, newBody) {
125
+ const before = sectionMap(oldBody);
126
+ const after = sectionMap(newBody);
127
+ const changed = [];
128
+ const added = [];
129
+ const unchanged = [];
130
+ for (const [heading, text] of after) {
131
+ const prior = before.get(heading);
132
+ if (prior === undefined)
133
+ added.push(heading);
134
+ else if (prior === text)
135
+ unchanged.push(heading);
136
+ else
137
+ changed.push(heading);
138
+ }
139
+ const removed = [...before.keys()].filter((heading) => !after.has(heading));
140
+ return { changed, added, removed, unchanged };
141
+ }
142
+ //# sourceMappingURL=sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.js","sourceRoot":"","sources":["../../../../src/commands/vouch/pack/sections.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The reading pack's section-level derivations: pure text in, lists of\n * headings out. Three of them, and the last two are why a sampled vouch does\n * not quietly weaken this command —\n *\n * - `sectionDelta`, the heading summary printed beside the raw git diff and\n * the source of the \"already covered\" list;\n * - `forwardSample`, what the next `--sample <n>` vouch will read;\n * - `priorScope`, what the last sampled vouch actually did read, so the\n * covered list cannot count sections nobody opened.\n *\n * It lives in the vouch command package rather than `core/document` because\n * that package sits at its five-file limit and this command package already\n * holds vouch's non-printing logic (`../vet/verify.ts` precedent); the one\n * structural question — what is an H2 heading — is still answered by\n * `core/document/parse.ts`'s `sectionHeadings`, fence- and BOM-aware, so this\n * module can never disagree with the rest of loam about whether a `## ` line\n * inside a code fence is structure.\n */\nimport { rawBody, type Frontmatter } from \"../../../core/document/frontmatter.js\";\nimport { sectionHeadings } from \"../../../core/document/parse.js\";\nimport { splitSections } from \"../../../core/provenance/sample/sections.js\";\nimport { planSample, readVouchScope, sampledSections, scopeText, type VouchScope } from \"../../../core/provenance/sample/scope.js\";\nimport { contentDigest } from \"../../../core/provenance/stamp.js\";\n\n/** How the delta names the text above the first H2 — a section with no heading to call it by. */\nconst PREAMBLE_LABEL = \"(before the first heading)\";\n\n/** The four verdicts, each a list of H2 heading lines as the document spells them. */\nexport interface SectionDelta {\n /** Present in both bodies with different text — in the new body's order. */\n changed: string[];\n /** Present only in the new body, in its order. */\n added: string[];\n /** Present only in the old body, in its order. */\n removed: string[];\n /** Present in both with identical text — the \"already covered\" list. */\n unchanged: string[];\n}\n\n/**\n * CRLF/CR to LF, the `core/verify/pins/pin.ts` recipe: the old body comes out\n * of a git blob (LF) while the new one comes off a checkout that may be CRLF,\n * and a comparison that let the line endings vote would report every section\n * changed on exactly the machines whose config differs from the repo's.\n * A pure line-ending change is invisible here — the same cost the pins\n * accept, and for a reading list it is the right one: there is nothing to\n * re-read in a CR.\n */\nfunction normalized(text: string): string {\n return text.replace(/\\r\\n|\\r/g, \"\\n\");\n}\n\n/**\n * One body as heading -> section text. The heading LINE is the key and is not\n * part of the value, so a section whose only change is its own heading reads\n * as removed+added — which is what a reader must do about it: find it under\n * its new name. A duplicated heading concatenates its sections under the one\n * key rather than letting the last occurrence shadow the rest: the compare\n * then sees all of the text, so an edit under either twin still reads as\n * changed. Text before the first heading files under PREAMBLE_LABEL when any\n * of it is more than whitespace.\n */\nfunction sectionMap(body: string): Map<string, string> {\n const text = normalized(body);\n const lines = text.split(\"\\n\");\n const headings = sectionHeadings(text);\n const map = new Map<string, string>();\n const file = (key: string, segment: string): void => {\n map.set(key, map.has(key) ? `${map.get(key)}\\n${segment}` : segment);\n };\n const firstHeadingLine = headings[0]?.line ?? lines.length + 1;\n const preamble = lines.slice(0, firstHeadingLine - 1).join(\"\\n\");\n if (preamble.trim() !== \"\") map.set(PREAMBLE_LABEL, preamble);\n headings.forEach((heading, i) => {\n const end = headings[i + 1]?.line ?? lines.length + 1;\n file(heading.text, lines.slice(heading.line, end - 1).join(\"\\n\"));\n });\n return map;\n}\n\n/** The forward-looking sample: what a `--sample <n>` vouch of this file would cover. */\nexport interface PackSample {\n /** The seed the stamp will carry, derivable now because the body it hashes will not change. */\n seed: string;\n /** Every section the body has. */\n of: number;\n /** The sections to read, in document order. Headings only — the pack does not renumber lines. */\n headings: string[];\n /** True when `<n>` reached every section: the read is the whole file, and no scope is stamped. */\n covers: boolean;\n}\n\n/**\n * What `loam vouch --sample <n>` would read of this file — computed through\n * the same `planSample` the stamp uses, so a pack and the vouch that follows\n * it cannot prescribe different samples of one document. Both digests are the\n * ones the stamp will carry: `contentDigest` survives stamping because the\n * body does, and the sources digest is the vetting's own.\n */\nexport function forwardSample(doc: {\n service: string;\n /** The file as read, frontmatter included — the same string the stamp is applied to. */\n raw: string;\n sourcesDigest: string;\n n: number;\n}): PackSample {\n const planned = planSample({\n service: doc.service,\n contentDigest: contentDigest(doc.raw),\n sourcesDigest: doc.sourcesDigest,\n body: rawBody(doc.raw),\n n: doc.n,\n });\n return {\n seed: planned.seed,\n of: planned.of,\n headings: planned.picked.map((section) => section.heading),\n covers: planned.picked.length >= planned.of,\n };\n}\n\n/**\n * What the LAST vouch actually covered, when it was a sampled one.\n *\n * This is the pack's answer to the one way sampling could quietly undo the\n * whole point of it: the \"already covered\" list licenses a person to NOT\n * re-read a section, on the strength of somebody having read it before. After\n * a sampled vouch that strength is not there — most of those sections were\n * never read by anyone — so the licence has to be withdrawn, and withdrawn\n * with the detail that makes it actionable rather than as a blanket warning.\n *\n * The detail is recomputable because the stamp records the seed: run the same\n * pick over the body that vouch was taken over and you get back the exact\n * list that person was shown. `read` is that list; `unread` is every other\n * section of that body — text that has now survived a vouch without anybody\n * looking at it, which is precisely what a re-voucher most needs to know.\n *\n * Three things come back null-but-still-sampled, and all three fail the same\n * way, closed: a scope that does not decode (mangled by hand), no vouched\n * body to recompute over (the document has changed since the stamp, so the\n * pick cannot be reproduced), and a body whose section count no longer\n * matches what the scope claims. In each case the pack reports the scope and\n * refuses to name a covered set — never the reverse.\n */\nexport interface PackVouchScope {\n /** The `vouch_scope` value as a reader is shown it — verbatim where it is text at all. */\n stamped: string;\n /** Decoded, or null when the field is not one this loam wrote. */\n scope: VouchScope | null;\n /** The headings that vouch read, in document order — null when they cannot be recomputed. */\n read: string[] | null;\n /** The headings it did not read: present at that stamp, and never read by anyone. */\n unread: string[] | null;\n}\n\nexport function priorScope(fm: Frontmatter, vouchedBody: string | null): PackVouchScope | null {\n // One reader, `readVouchScope`, decides what \"sampled\" means — so the pack\n // cannot be the surface that quietly grades a mangled scope as a full vouch\n // while `loam validate` grades it sampled.\n const stamp = readVouchScope(fm);\n if (stamp.kind === \"none\") return null;\n const stamped = scopeText(fm) ?? \"\";\n const scope = stamp.kind === \"sampled\" ? stamp.scope : null;\n const blind: PackVouchScope = { stamped, scope, read: null, unread: null };\n if (scope === null || vouchedBody === null) return blind;\n const picked = sampledSections(vouchedBody, scope);\n if (picked === null) return blind;\n // Partitioned by LINE, not by heading text: a body with two `## Notes`\n // sections has two units, and matching on the text would report both as\n // read when one was picked — turning a section nobody opened into a covered\n // one, which is the exact misreading this function exists to prevent.\n const read = new Set(picked.map((section) => section.line));\n return {\n stamped,\n scope,\n read: picked.map((section) => section.heading),\n unread: splitSections(vouchedBody)\n .filter((section) => !read.has(section.line))\n .map((section) => section.heading),\n };\n}\n\n/**\n * Compare two bodies section by section. Exact text per heading after line\n * endings are normalized — no reflow tolerance, because \"unchanged\" here\n * licenses a person to NOT re-read a section, and the only claim safe to make\n * at that stakes is byte equality.\n */\nexport function sectionDelta(oldBody: string, newBody: string): SectionDelta {\n const before = sectionMap(oldBody);\n const after = sectionMap(newBody);\n const changed: string[] = [];\n const added: string[] = [];\n const unchanged: string[] = [];\n for (const [heading, text] of after) {\n const prior = before.get(heading);\n if (prior === undefined) added.push(heading);\n else if (prior === text) unchanged.push(heading);\n else changed.push(heading);\n }\n const removed = [...before.keys()].filter((heading) => !after.has(heading));\n return { changed, added, removed, unchanged };\n}\n"]}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The one question loam asks a person, and the only thing that may answer it.
3
+ *
4
+ * Its own package for the reason `../vet/verify.ts` is: `vouch.ts` is the flag
5
+ * boundary and is at its line limit, and this is a distinct phase of the run —
6
+ * everything before it decides whether asking is even legal, everything after
7
+ * it writes. A single-file package is the shape that seam has here.
8
+ */
9
+ import { createInterface } from "node:readline/promises";
10
+ import { promptClaim } from "../sample/print.js";
11
+ /**
12
+ * Ask, on a terminal, and answer only on an explicit yes.
13
+ *
14
+ * The question states what is about to be claimed rather than asking for
15
+ * assent to a verb: "vouch?" invites a reflex, and the whole value of this
16
+ * command is that the reflex is the thing being interrupted. Default is no —
17
+ * a bare Enter, a closed stdin and a Ctrl-C all mean the same thing, because
18
+ * the only answer that may stamp a document is one somebody typed.
19
+ *
20
+ * A sampled run asks a NARROWER question, in the sample's own terms: the k
21
+ * sections just listed, what the stamp will say about the rest, and what
22
+ * `loam validate` will report until somebody reads the whole document. Asking
23
+ * "have you read the code?" of a person who was handed four headings would
24
+ * collect assent to a claim nobody made — and the assent is the entire
25
+ * artifact this command produces.
26
+ */
27
+ export async function confirmVouch(prompt) {
28
+ const { service, vouchedBy, docsDir, servicePath, sample } = prompt;
29
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
30
+ try {
31
+ console.log(`\nVouching for '${service}' records that YOU read the code and say ` +
32
+ `${docsDir}/${servicePath}/ describes it.\n` +
33
+ `It will be stamped \`status: verified\`, \`vouched_by: ${vouchedBy}\`.\n` +
34
+ "loam has not checked this and cannot: every other check it runs is internal " +
35
+ "consistency, which well-written prose satisfies on its own.\n" +
36
+ (sample === undefined ? "" : `${promptClaim(sample, service)}\n`));
37
+ const answer = await rl.question(sample === undefined
38
+ ? "Have you read the code? [y/N] "
39
+ : "Have you read the sampled sections and the code? [y/N] ");
40
+ return /^y(es)?$/i.test(answer.trim());
41
+ }
42
+ finally {
43
+ rl.close();
44
+ }
45
+ }
46
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../../../src/commands/vouch/prompt/confirm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAmBjD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAmB;IACpD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACpE,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CACT,mBAAmB,OAAO,2CAA2C;YACnE,GAAG,OAAO,IAAI,WAAW,mBAAmB;YAC5C,0DAA0D,SAAS,OAAO;YAC1E,8EAA8E;YAC9E,+DAA+D;YAC/D,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CACpE,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAC9B,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,yDAAyD,CAC9D,CAAC;QACF,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC","sourcesContent":["/**\n * The one question loam asks a person, and the only thing that may answer it.\n *\n * Its own package for the reason `../vet/verify.ts` is: `vouch.ts` is the flag\n * boundary and is at its line limit, and this is a distinct phase of the run —\n * everything before it decides whether asking is even legal, everything after\n * it writes. A single-file package is the shape that seam has here.\n */\nimport { createInterface } from \"node:readline/promises\";\nimport type { SamplePlan } from \"../sample/plan.js\";\nimport { promptClaim } from \"../sample/print.js\";\n\n/** What the confirmation needs in order to state the claim it is asking about. */\nexport interface VouchPrompt {\n service: string;\n vouchedBy: string;\n docsDir: string;\n /**\n * The service's directory, repo-relative — `services/<subsystem>/…/<id>`, or\n * `services/<id>` unfiled. Passed in rather than joined here: the question\n * names the documents a person is about to put their name to, and naming a\n * directory that does not exist would ask them to vouch for something they\n * cannot open.\n */\n servicePath: string;\n /** Present under `--sample <n>`: the question then names the sections, not the document. */\n sample?: SamplePlan;\n}\n\n/**\n * Ask, on a terminal, and answer only on an explicit yes.\n *\n * The question states what is about to be claimed rather than asking for\n * assent to a verb: \"vouch?\" invites a reflex, and the whole value of this\n * command is that the reflex is the thing being interrupted. Default is no —\n * a bare Enter, a closed stdin and a Ctrl-C all mean the same thing, because\n * the only answer that may stamp a document is one somebody typed.\n *\n * A sampled run asks a NARROWER question, in the sample's own terms: the k\n * sections just listed, what the stamp will say about the rest, and what\n * `loam validate` will report until somebody reads the whole document. Asking\n * \"have you read the code?\" of a person who was handed four headings would\n * collect assent to a claim nobody made — and the assent is the entire\n * artifact this command produces.\n */\nexport async function confirmVouch(prompt: VouchPrompt): Promise<boolean> {\n const { service, vouchedBy, docsDir, servicePath, sample } = prompt;\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n console.log(\n `\\nVouching for '${service}' records that YOU read the code and say ` +\n `${docsDir}/${servicePath}/ describes it.\\n` +\n `It will be stamped \\`status: verified\\`, \\`vouched_by: ${vouchedBy}\\`.\\n` +\n \"loam has not checked this and cannot: every other check it runs is internal \" +\n \"consistency, which well-written prose satisfies on its own.\\n\" +\n (sample === undefined ? \"\" : `${promptClaim(sample, service)}\\n`),\n );\n const answer = await rl.question(\n sample === undefined\n ? \"Have you read the code? [y/N] \"\n : \"Have you read the sampled sections and the code? [y/N] \",\n );\n return /^y(es)?$/i.test(answer.trim());\n } finally {\n rl.close();\n }\n}\n"]}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * What a successful vouch prints: the machine envelope, and the screen the
3
+ * person who just vouched is looking at.
4
+ *
5
+ * Split out of `vouch.ts` when `--sample` arrived and that file reached its
6
+ * line limit, on the phase seam the command already had: everything above it
7
+ * decides whether to write, everything here describes what was written. The
8
+ * two renderings stay in one module because they report the SAME stamp, and
9
+ * the one failure this file exists to prevent is a text screen and a payload
10
+ * that disagree about what a document now says.
11
+ */
12
+ import { emitJson, repoPath } from "../../core/envelope/json.js";
13
+ import { plural, sayRecovered } from "../policy/format.js";
14
+ import { scopeJson } from "./sample/print.js";
15
+ /**
16
+ * The plan entry for one stamped file, joined by FILENAME — never by position.
17
+ * The two axes are stamped by two separate calls, and pairing them by index
18
+ * would hang one file's headings off the other file's scope.
19
+ */
20
+ function plannedAxis(report, spec) {
21
+ return report.sample?.axes.find((axis) => axis.file === spec.file);
22
+ }
23
+ export function emitStampJson(report) {
24
+ const { spec, archSpec: arch } = report.outcome.stamped;
25
+ emitJson({
26
+ command: "vouch",
27
+ service: report.service,
28
+ path: repoPath(report.docsDir, spec.path),
29
+ ...(report.outcome.recovered === null ? {} : { recovered: report.outcome.recovered }),
30
+ status: report.outcome.status,
31
+ last_verified: report.outcome.lastVerified,
32
+ vouched_by: report.outcome.vouchedBy,
33
+ sources: spec.sources,
34
+ sources_digest: spec.digest,
35
+ content_digest: spec.contentDigest,
36
+ files: spec.files,
37
+ skipped: spec.skipped,
38
+ // Additive, and beside `status` rather than inside it: `verified` is a
39
+ // frozen string and a sampled read is a qualification of it, not a fourth
40
+ // status. Null — never omitted — for a file read in full, so a consumer
41
+ // can tell "this loam says it was full" from "this loam has never heard
42
+ // of scopes".
43
+ vouchScope: scopeJson(spec.vouchScope, plannedAxis(report, spec)),
44
+ // The architecture axis, same keys: null when the service has no
45
+ // arch.spec.md, so a consumer can tell "none present" from an older
46
+ // loam that never reported the axis. status/last_verified are not
47
+ // repeated — the vouch is one act, and they hold for every file in it.
48
+ archSpec: arch === null
49
+ ? null
50
+ : {
51
+ path: repoPath(report.docsDir, arch.path),
52
+ sources: arch.sources,
53
+ sources_digest: arch.digest,
54
+ content_digest: arch.contentDigest,
55
+ files: arch.files,
56
+ skipped: arch.skipped,
57
+ // Per file, because the sample is per file: one `--sample 3` run
58
+ // can stamp a sampled spec.md beside a fully-read arch.spec.md,
59
+ // and one scope for the pair would be false about one of them.
60
+ vouchScope: scopeJson(arch.vouchScope, plannedAxis(report, arch)),
61
+ },
62
+ });
63
+ }
64
+ export function printStamp(report) {
65
+ const { outcome, service } = report;
66
+ const { spec, archSpec: arch } = outcome.stamped;
67
+ // spec.md first, arch.spec.md behind it when present — the order the
68
+ // person who vouched reads them in, and the order the axes are declared.
69
+ if (outcome.recovered !== null)
70
+ console.log(`${sayRecovered(outcome.recovered)}\n`);
71
+ for (const [i, s] of [spec, ...(arch === null ? [] : [arch])].entries()) {
72
+ console.log(`${i > 0 ? "\n" : ""}${service} vouched — ${repoPath(report.docsDir, s.path)}\n`);
73
+ console.log(` status ${outcome.status}`);
74
+ console.log(` last_verified ${outcome.lastVerified}`);
75
+ console.log(` vouched_by ${outcome.vouchedBy}`);
76
+ console.log(` sources_digest ${s.digest} (${plural(s.files, "file")} from ${plural(s.sources.length, "source")})`);
77
+ console.log(` content_digest ${s.contentDigest}`);
78
+ // On the same screen as the digests, in the same column, because this is
79
+ // the field that says the promise beside it is partial. A reader who scans
80
+ // the stamp and stops must not be able to miss it.
81
+ if (s.vouchScope !== null) {
82
+ console.log(` vouch_scope sampled ${s.vouchScope.sections}/${s.vouchScope.of} seed=${s.vouchScope.seed} ` +
83
+ `(${plural(s.vouchScope.of - s.vouchScope.sections, "section")} unread)`);
84
+ }
85
+ // Said at the moment of stamping, not only later by `loam validate`:
86
+ // this is the one screen the person who vouched is actually looking at,
87
+ // and what it lists is the part of the tree their promise does not cover.
88
+ if (s.skipped.length > 0) {
89
+ console.log(`\n ⚠ ${plural(s.skipped.length, "path")} under those sources went unhashed:`);
90
+ for (const skip of s.skipped)
91
+ console.log(` ${skip.path} — ${skip.reason}`);
92
+ }
93
+ }
94
+ const sampled = [spec, arch].some((s) => s !== null && s.vouchScope !== null);
95
+ console.log(`\n\`loam validate\` will now say when that code moves out from under the spec — or when the spec moves under its own stamp.`);
96
+ if (sampled) {
97
+ console.log(`It will also report \`sources.sampled-vouch\` for '${service}' until a person vouches for the whole document ` +
98
+ `(\`loam vouch --service ${service}\`, no --sample), which clears the scope.`);
99
+ }
100
+ }
101
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/commands/vouch/report.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * What a successful vouch prints: the machine envelope, and the screen the\n * person who just vouched is looking at.\n *\n * Split out of `vouch.ts` when `--sample` arrived and that file reached its\n * line limit, on the phase seam the command already had: everything above it\n * decides whether to write, everything here describes what was written. The\n * two renderings stay in one module because they report the SAME stamp, and\n * the one failure this file exists to prevent is a text screen and a payload\n * that disagree about what a document now says.\n */\nimport { emitJson, repoPath } from \"../../core/envelope/json.js\";\nimport type { DocsDir } from \"../../core/kernel/ids/dirs.js\";\nimport { plural, sayRecovered } from \"../policy/format.js\";\nimport type { StampedSpec, VouchOutcome } from \"./contract.js\";\nimport type { PlannedAxis, SamplePlan } from \"./sample/plan.js\";\nimport { scopeJson } from \"./sample/print.js\";\n\nexport interface StampReport {\n service: string;\n docsDir: DocsDir;\n /** The successful arm — the only one that has a stamp to describe. */\n outcome: Extract<VouchOutcome, { ok: true }>;\n /** The reading list this run was answered against, when it was a sampled one. */\n sample?: SamplePlan;\n}\n\n/**\n * The plan entry for one stamped file, joined by FILENAME — never by position.\n * The two axes are stamped by two separate calls, and pairing them by index\n * would hang one file's headings off the other file's scope.\n */\nfunction plannedAxis(report: StampReport, spec: StampedSpec): PlannedAxis | undefined {\n return report.sample?.axes.find((axis) => axis.file === spec.file);\n}\n\nexport function emitStampJson(report: StampReport): void {\n const { spec, archSpec: arch } = report.outcome.stamped;\n emitJson({\n command: \"vouch\",\n service: report.service,\n path: repoPath(report.docsDir, spec.path),\n ...(report.outcome.recovered === null ? {} : { recovered: report.outcome.recovered }),\n status: report.outcome.status,\n last_verified: report.outcome.lastVerified,\n vouched_by: report.outcome.vouchedBy,\n sources: spec.sources,\n sources_digest: spec.digest,\n content_digest: spec.contentDigest,\n files: spec.files,\n skipped: spec.skipped,\n // Additive, and beside `status` rather than inside it: `verified` is a\n // frozen string and a sampled read is a qualification of it, not a fourth\n // status. Null — never omitted — for a file read in full, so a consumer\n // can tell \"this loam says it was full\" from \"this loam has never heard\n // of scopes\".\n vouchScope: scopeJson(spec.vouchScope, plannedAxis(report, spec)),\n // The architecture axis, same keys: null when the service has no\n // arch.spec.md, so a consumer can tell \"none present\" from an older\n // loam that never reported the axis. status/last_verified are not\n // repeated — the vouch is one act, and they hold for every file in it.\n archSpec:\n arch === null\n ? null\n : {\n path: repoPath(report.docsDir, arch.path),\n sources: arch.sources,\n sources_digest: arch.digest,\n content_digest: arch.contentDigest,\n files: arch.files,\n skipped: arch.skipped,\n // Per file, because the sample is per file: one `--sample 3` run\n // can stamp a sampled spec.md beside a fully-read arch.spec.md,\n // and one scope for the pair would be false about one of them.\n vouchScope: scopeJson(arch.vouchScope, plannedAxis(report, arch)),\n },\n });\n}\n\nexport function printStamp(report: StampReport): void {\n const { outcome, service } = report;\n const { spec, archSpec: arch } = outcome.stamped;\n // spec.md first, arch.spec.md behind it when present — the order the\n // person who vouched reads them in, and the order the axes are declared.\n if (outcome.recovered !== null) console.log(`${sayRecovered(outcome.recovered)}\\n`);\n for (const [i, s] of [spec, ...(arch === null ? [] : [arch])].entries()) {\n console.log(`${i > 0 ? \"\\n\" : \"\"}${service} vouched — ${repoPath(report.docsDir, s.path)}\\n`);\n console.log(` status ${outcome.status}`);\n console.log(` last_verified ${outcome.lastVerified}`);\n console.log(` vouched_by ${outcome.vouchedBy}`);\n console.log(\n ` sources_digest ${s.digest} (${plural(s.files, \"file\")} from ${plural(s.sources.length, \"source\")})`,\n );\n console.log(` content_digest ${s.contentDigest}`);\n // On the same screen as the digests, in the same column, because this is\n // the field that says the promise beside it is partial. A reader who scans\n // the stamp and stops must not be able to miss it.\n if (s.vouchScope !== null) {\n console.log(\n ` vouch_scope sampled ${s.vouchScope.sections}/${s.vouchScope.of} seed=${s.vouchScope.seed} ` +\n `(${plural(s.vouchScope.of - s.vouchScope.sections, \"section\")} unread)`,\n );\n }\n // Said at the moment of stamping, not only later by `loam validate`:\n // this is the one screen the person who vouched is actually looking at,\n // and what it lists is the part of the tree their promise does not cover.\n if (s.skipped.length > 0) {\n console.log(`\\n ⚠ ${plural(s.skipped.length, \"path\")} under those sources went unhashed:`);\n for (const skip of s.skipped) console.log(` ${skip.path} — ${skip.reason}`);\n }\n }\n const sampled = [spec, arch].some((s) => s !== null && s.vouchScope !== null);\n console.log(\n `\\n\\`loam validate\\` will now say when that code moves out from under the spec — or when the spec moves under its own stamp.`,\n );\n if (sampled) {\n console.log(\n `It will also report \\`sources.sampled-vouch\\` for '${service}' until a person vouches for the whole document ` +\n `(\\`loam vouch --service ${service}\\`, no --sample), which clears the scope.`,\n );\n }\n}\n"]}