approval-md 0.0.1 → 0.2.0

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 (722) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +5 -0
  3. package/README.md +940 -4
  4. package/SPEC.md +476 -34
  5. package/cli.js +29 -3
  6. package/dist/src/adapters/agentmail.d.ts +426 -0
  7. package/dist/src/adapters/agentmail.js +1200 -0
  8. package/dist/src/adapters/agentmail.js.map +1 -0
  9. package/dist/src/adapters/conformance.d.ts +149 -0
  10. package/dist/src/adapters/conformance.js +461 -0
  11. package/dist/src/adapters/conformance.js.map +1 -0
  12. package/dist/src/adapters/contract.d.ts +628 -0
  13. package/dist/src/adapters/contract.js +1035 -0
  14. package/dist/src/adapters/contract.js.map +1 -0
  15. package/dist/src/adapters/email.d.ts +324 -0
  16. package/dist/src/adapters/email.js +749 -0
  17. package/dist/src/adapters/email.js.map +1 -0
  18. package/dist/src/adapters/env-passphrase.d.ts +93 -0
  19. package/dist/src/adapters/env-passphrase.js +132 -0
  20. package/dist/src/adapters/env-passphrase.js.map +1 -0
  21. package/dist/src/adapters/public.d.ts +11 -0
  22. package/dist/src/adapters/public.js +11 -0
  23. package/dist/src/adapters/public.js.map +1 -0
  24. package/dist/src/adapters/registry.d.ts +59 -0
  25. package/dist/src/adapters/registry.js +77 -0
  26. package/dist/src/adapters/registry.js.map +1 -0
  27. package/dist/src/adapters/smtp.d.ts +213 -0
  28. package/dist/src/adapters/smtp.js +499 -0
  29. package/dist/src/adapters/smtp.js.map +1 -0
  30. package/dist/src/adapters/vault-provider.d.ts +114 -0
  31. package/dist/src/adapters/vault-provider.js +161 -0
  32. package/dist/src/adapters/vault-provider.js.map +1 -0
  33. package/dist/src/adapters/zzz.d.ts +66 -0
  34. package/dist/src/adapters/zzz.js +299 -0
  35. package/dist/src/adapters/zzz.js.map +1 -0
  36. package/dist/src/channels/batch.d.ts +109 -0
  37. package/dist/src/channels/batch.js +121 -0
  38. package/dist/src/channels/batch.js.map +1 -0
  39. package/dist/src/channels/cli.d.ts +193 -0
  40. package/dist/src/channels/cli.js +468 -0
  41. package/dist/src/channels/cli.js.map +1 -0
  42. package/dist/src/channels/conformance.d.ts +92 -0
  43. package/dist/src/channels/conformance.js +445 -0
  44. package/dist/src/channels/conformance.js.map +1 -0
  45. package/dist/src/channels/contract.d.ts +623 -0
  46. package/dist/src/channels/contract.js +494 -0
  47. package/dist/src/channels/contract.js.map +1 -0
  48. package/dist/src/channels/payload-view.d.ts +35 -0
  49. package/dist/src/channels/payload-view.js +43 -0
  50. package/dist/src/channels/payload-view.js.map +1 -0
  51. package/dist/src/channels/render-queue.d.ts +149 -0
  52. package/dist/src/channels/render-queue.js +564 -0
  53. package/dist/src/channels/render-queue.js.map +1 -0
  54. package/dist/src/channels/tagging.d.ts +196 -0
  55. package/dist/src/channels/tagging.js +723 -0
  56. package/dist/src/channels/tagging.js.map +1 -0
  57. package/dist/src/channels/telegram.d.ts +1832 -0
  58. package/dist/src/channels/telegram.js +3190 -0
  59. package/dist/src/channels/telegram.js.map +1 -0
  60. package/dist/src/channels/web.d.ts +341 -0
  61. package/dist/src/channels/web.js +903 -0
  62. package/dist/src/channels/web.js.map +1 -0
  63. package/dist/src/cli/adapter.d.ts +90 -0
  64. package/dist/src/cli/adapter.js +288 -0
  65. package/dist/src/cli/adapter.js.map +1 -0
  66. package/dist/src/cli/amend.d.ts +59 -0
  67. package/dist/src/cli/amend.js +2171 -0
  68. package/dist/src/cli/amend.js.map +1 -0
  69. package/dist/src/cli/args.d.ts +43 -0
  70. package/dist/src/cli/args.js +86 -0
  71. package/dist/src/cli/args.js.map +1 -0
  72. package/dist/src/cli/attest.d.ts +41 -0
  73. package/dist/src/cli/attest.js +307 -0
  74. package/dist/src/cli/attest.js.map +1 -0
  75. package/dist/src/cli/audit-card.d.ts +62 -0
  76. package/dist/src/cli/audit-card.js +201 -0
  77. package/dist/src/cli/audit-card.js.map +1 -0
  78. package/dist/src/cli/audit.d.ts +59 -0
  79. package/dist/src/cli/audit.js +460 -0
  80. package/dist/src/cli/audit.js.map +1 -0
  81. package/dist/src/cli/channel-telegram.d.ts +806 -0
  82. package/dist/src/cli/channel-telegram.js +2063 -0
  83. package/dist/src/cli/channel-telegram.js.map +1 -0
  84. package/dist/src/cli/channel-web.d.ts +131 -0
  85. package/dist/src/cli/channel-web.js +357 -0
  86. package/dist/src/cli/channel-web.js.map +1 -0
  87. package/dist/src/cli/channel.d.ts +71 -0
  88. package/dist/src/cli/channel.js +438 -0
  89. package/dist/src/cli/channel.js.map +1 -0
  90. package/dist/src/cli/checkpoint-tap.d.ts +169 -0
  91. package/dist/src/cli/checkpoint-tap.js +238 -0
  92. package/dist/src/cli/checkpoint-tap.js.map +1 -0
  93. package/dist/src/cli/codex.d.ts +2 -0
  94. package/dist/src/cli/codex.js +172 -0
  95. package/dist/src/cli/codex.js.map +1 -0
  96. package/dist/src/cli/coverage.d.ts +61 -0
  97. package/dist/src/cli/coverage.js +343 -0
  98. package/dist/src/cli/coverage.js.map +1 -0
  99. package/dist/src/cli/daemon.d.ts +120 -0
  100. package/dist/src/cli/daemon.js +631 -0
  101. package/dist/src/cli/daemon.js.map +1 -0
  102. package/dist/src/cli/doctor.d.ts +129 -0
  103. package/dist/src/cli/doctor.js +2762 -0
  104. package/dist/src/cli/doctor.js.map +1 -0
  105. package/dist/src/cli/env.d.ts +65 -0
  106. package/dist/src/cli/env.js +302 -0
  107. package/dist/src/cli/env.js.map +1 -0
  108. package/dist/src/cli/execute.d.ts +202 -0
  109. package/dist/src/cli/execute.js +1682 -0
  110. package/dist/src/cli/execute.js.map +1 -0
  111. package/dist/src/cli/exit-codes.d.ts +73 -0
  112. package/dist/src/cli/exit-codes.js +82 -0
  113. package/dist/src/cli/exit-codes.js.map +1 -0
  114. package/dist/src/cli/feedback.d.ts +60 -0
  115. package/dist/src/cli/feedback.js +205 -0
  116. package/dist/src/cli/feedback.js.map +1 -0
  117. package/dist/src/cli/gate-window.d.ts +40 -0
  118. package/dist/src/cli/gate-window.js +294 -0
  119. package/dist/src/cli/gate-window.js.map +1 -0
  120. package/dist/src/cli/gate.d.ts +68 -0
  121. package/dist/src/cli/gate.js +557 -0
  122. package/dist/src/cli/gate.js.map +1 -0
  123. package/dist/src/cli/git-scope.d.ts +190 -0
  124. package/dist/src/cli/git-scope.js +295 -0
  125. package/dist/src/cli/git-scope.js.map +1 -0
  126. package/dist/src/cli/gloss-attach.d.ts +85 -0
  127. package/dist/src/cli/gloss-attach.js +107 -0
  128. package/dist/src/cli/gloss-attach.js.map +1 -0
  129. package/dist/src/cli/gloss-codex-child.d.ts +9 -0
  130. package/dist/src/cli/gloss-codex-child.js +149 -0
  131. package/dist/src/cli/gloss-codex-child.js.map +1 -0
  132. package/dist/src/cli/gloss-codex.d.ts +24 -0
  133. package/dist/src/cli/gloss-codex.js +255 -0
  134. package/dist/src/cli/gloss-codex.js.map +1 -0
  135. package/dist/src/cli/gloss-options.d.ts +42 -0
  136. package/dist/src/cli/gloss-options.js +79 -0
  137. package/dist/src/cli/gloss-options.js.map +1 -0
  138. package/dist/src/cli/gloss.d.ts +265 -0
  139. package/dist/src/cli/gloss.js +362 -0
  140. package/dist/src/cli/gloss.js.map +1 -0
  141. package/dist/src/cli/help.d.ts +103 -0
  142. package/dist/src/cli/help.js +2339 -0
  143. package/dist/src/cli/help.js.map +1 -0
  144. package/dist/src/cli/hook-codex.d.ts +78 -0
  145. package/dist/src/cli/hook-codex.js +167 -0
  146. package/dist/src/cli/hook-codex.js.map +1 -0
  147. package/dist/src/cli/hook.d.ts +331 -0
  148. package/dist/src/cli/hook.js +2849 -0
  149. package/dist/src/cli/hook.js.map +1 -0
  150. package/dist/src/cli/import.d.ts +35 -0
  151. package/dist/src/cli/import.js +175 -0
  152. package/dist/src/cli/import.js.map +1 -0
  153. package/dist/src/cli/init.d.ts +84 -0
  154. package/dist/src/cli/init.js +336 -0
  155. package/dist/src/cli/init.js.map +1 -0
  156. package/dist/src/cli/instructions.d.ts +23 -0
  157. package/dist/src/cli/instructions.js +262 -0
  158. package/dist/src/cli/instructions.js.map +1 -0
  159. package/dist/src/cli/journal.d.ts +41 -0
  160. package/dist/src/cli/journal.js +238 -0
  161. package/dist/src/cli/journal.js.map +1 -0
  162. package/dist/src/cli/log-advance.d.ts +287 -0
  163. package/dist/src/cli/log-advance.js +840 -0
  164. package/dist/src/cli/log-advance.js.map +1 -0
  165. package/dist/src/cli/log-anchor.d.ts +176 -0
  166. package/dist/src/cli/log-anchor.js +387 -0
  167. package/dist/src/cli/log-anchor.js.map +1 -0
  168. package/dist/src/cli/log-checkpoint.d.ts +22 -0
  169. package/dist/src/cli/log-checkpoint.js +128 -0
  170. package/dist/src/cli/log-checkpoint.js.map +1 -0
  171. package/dist/src/cli/log-sync.d.ts +243 -0
  172. package/dist/src/cli/log-sync.js +849 -0
  173. package/dist/src/cli/log-sync.js.map +1 -0
  174. package/dist/src/cli/log-verbs.d.ts +16 -0
  175. package/dist/src/cli/log-verbs.js +360 -0
  176. package/dist/src/cli/log-verbs.js.map +1 -0
  177. package/dist/src/cli/long-help.d.ts +70 -0
  178. package/dist/src/cli/long-help.js +148 -0
  179. package/dist/src/cli/long-help.js.map +1 -0
  180. package/dist/src/cli/main.d.ts +77 -0
  181. package/dist/src/cli/main.js +1206 -0
  182. package/dist/src/cli/main.js.map +1 -0
  183. package/dist/src/cli/mcp.d.ts +52 -0
  184. package/dist/src/cli/mcp.js +306 -0
  185. package/dist/src/cli/mcp.js.map +1 -0
  186. package/dist/src/cli/paths.d.ts +56 -0
  187. package/dist/src/cli/paths.js +79 -0
  188. package/dist/src/cli/paths.js.map +1 -0
  189. package/dist/src/cli/payload.d.ts +58 -0
  190. package/dist/src/cli/payload.js +253 -0
  191. package/dist/src/cli/payload.js.map +1 -0
  192. package/dist/src/cli/policy.d.ts +43 -0
  193. package/dist/src/cli/policy.js +229 -0
  194. package/dist/src/cli/policy.js.map +1 -0
  195. package/dist/src/cli/preflight.d.ts +363 -0
  196. package/dist/src/cli/preflight.js +1175 -0
  197. package/dist/src/cli/preflight.js.map +1 -0
  198. package/dist/src/cli/progress.d.ts +78 -0
  199. package/dist/src/cli/progress.js +112 -0
  200. package/dist/src/cli/progress.js.map +1 -0
  201. package/dist/src/cli/prompt.d.ts +209 -0
  202. package/dist/src/cli/prompt.js +312 -0
  203. package/dist/src/cli/prompt.js.map +1 -0
  204. package/dist/src/cli/quickstart.d.ts +46 -0
  205. package/dist/src/cli/quickstart.js +297 -0
  206. package/dist/src/cli/quickstart.js.map +1 -0
  207. package/dist/src/cli/records.d.ts +34 -0
  208. package/dist/src/cli/records.js +66 -0
  209. package/dist/src/cli/records.js.map +1 -0
  210. package/dist/src/cli/render.d.ts +22 -0
  211. package/dist/src/cli/render.js +132 -0
  212. package/dist/src/cli/render.js.map +1 -0
  213. package/dist/src/cli/sandbox.d.ts +51 -0
  214. package/dist/src/cli/sandbox.js +150 -0
  215. package/dist/src/cli/sandbox.js.map +1 -0
  216. package/dist/src/cli/scaffold.d.ts +79 -0
  217. package/dist/src/cli/scaffold.js +137 -0
  218. package/dist/src/cli/scaffold.js.map +1 -0
  219. package/dist/src/cli/setup-adapter.d.ts +137 -0
  220. package/dist/src/cli/setup-adapter.js +509 -0
  221. package/dist/src/cli/setup-adapter.js.map +1 -0
  222. package/dist/src/cli/setup-channel.d.ts +117 -0
  223. package/dist/src/cli/setup-channel.js +635 -0
  224. package/dist/src/cli/setup-channel.js.map +1 -0
  225. package/dist/src/cli/setup-checkpoint.d.ts +57 -0
  226. package/dist/src/cli/setup-checkpoint.js +196 -0
  227. package/dist/src/cli/setup-checkpoint.js.map +1 -0
  228. package/dist/src/cli/setup-common.d.ts +275 -0
  229. package/dist/src/cli/setup-common.js +376 -0
  230. package/dist/src/cli/setup-common.js.map +1 -0
  231. package/dist/src/cli/setup-flow.d.ts +287 -0
  232. package/dist/src/cli/setup-flow.js +476 -0
  233. package/dist/src/cli/setup-flow.js.map +1 -0
  234. package/dist/src/cli/setup-service.d.ts +96 -0
  235. package/dist/src/cli/setup-service.js +308 -0
  236. package/dist/src/cli/setup-service.js.map +1 -0
  237. package/dist/src/cli/setup.d.ts +202 -0
  238. package/dist/src/cli/setup.js +473 -0
  239. package/dist/src/cli/setup.js.map +1 -0
  240. package/dist/src/cli/style.d.ts +320 -0
  241. package/dist/src/cli/style.js +469 -0
  242. package/dist/src/cli/style.js.map +1 -0
  243. package/dist/src/cli/token.d.ts +39 -0
  244. package/dist/src/cli/token.js +274 -0
  245. package/dist/src/cli/token.js.map +1 -0
  246. package/dist/src/cli/up.d.ts +155 -0
  247. package/dist/src/cli/up.js +849 -0
  248. package/dist/src/cli/up.js.map +1 -0
  249. package/dist/src/cli/usage.d.ts +37 -0
  250. package/dist/src/cli/usage.js +91 -0
  251. package/dist/src/cli/usage.js.map +1 -0
  252. package/dist/src/cli/values.d.ts +40 -0
  253. package/dist/src/cli/values.js +189 -0
  254. package/dist/src/cli/values.js.map +1 -0
  255. package/dist/src/cli/vault.d.ts +59 -0
  256. package/dist/src/cli/vault.js +362 -0
  257. package/dist/src/cli/vault.js.map +1 -0
  258. package/dist/src/cli/verb-registry.d.ts +76 -0
  259. package/dist/src/cli/verb-registry.js +2341 -0
  260. package/dist/src/cli/verb-registry.js.map +1 -0
  261. package/dist/src/cli/wordmark.d.ts +31 -0
  262. package/dist/src/cli/wordmark.js +52 -0
  263. package/dist/src/cli/wordmark.js.map +1 -0
  264. package/dist/src/codex/doctor.d.ts +13 -0
  265. package/dist/src/codex/doctor.js +41 -0
  266. package/dist/src/codex/doctor.js.map +1 -0
  267. package/dist/src/codex/manifest.d.ts +49 -0
  268. package/dist/src/codex/manifest.js +103 -0
  269. package/dist/src/codex/manifest.js.map +1 -0
  270. package/dist/src/codex/templates.d.ts +41 -0
  271. package/dist/src/codex/templates.js +319 -0
  272. package/dist/src/codex/templates.js.map +1 -0
  273. package/dist/src/codex/trust.d.ts +19 -0
  274. package/dist/src/codex/trust.js +183 -0
  275. package/dist/src/codex/trust.js.map +1 -0
  276. package/dist/src/codex/workspace-plan.d.ts +131 -0
  277. package/dist/src/codex/workspace-plan.js +561 -0
  278. package/dist/src/codex/workspace-plan.js.map +1 -0
  279. package/dist/src/core/actor.d.ts +2 -0
  280. package/dist/src/core/actor.js +5 -0
  281. package/dist/src/core/actor.js.map +1 -0
  282. package/dist/src/core/advance-cycle.d.ts +170 -0
  283. package/dist/src/core/advance-cycle.js +200 -0
  284. package/dist/src/core/advance-cycle.js.map +1 -0
  285. package/dist/src/core/agents-md.d.ts +276 -0
  286. package/dist/src/core/agents-md.js +747 -0
  287. package/dist/src/core/agents-md.js.map +1 -0
  288. package/dist/src/core/apply-patch.d.ts +49 -0
  289. package/dist/src/core/apply-patch.js +266 -0
  290. package/dist/src/core/apply-patch.js.map +1 -0
  291. package/dist/src/core/attest.d.ts +420 -0
  292. package/dist/src/core/attest.js +589 -0
  293. package/dist/src/core/attest.js.map +1 -0
  294. package/dist/src/core/audit.d.ts +492 -0
  295. package/dist/src/core/audit.js +882 -0
  296. package/dist/src/core/audit.js.map +1 -0
  297. package/dist/src/core/budgets.d.ts +238 -0
  298. package/dist/src/core/budgets.js +449 -0
  299. package/dist/src/core/budgets.js.map +1 -0
  300. package/dist/src/core/checkpoint.d.ts +500 -0
  301. package/dist/src/core/checkpoint.js +738 -0
  302. package/dist/src/core/checkpoint.js.map +1 -0
  303. package/dist/src/core/child-env.d.ts +88 -0
  304. package/dist/src/core/child-env.js +86 -0
  305. package/dist/src/core/child-env.js.map +1 -0
  306. package/dist/src/core/clock.d.ts +52 -0
  307. package/dist/src/core/clock.js +43 -0
  308. package/dist/src/core/clock.js.map +1 -0
  309. package/dist/src/core/command-class.d.ts +543 -0
  310. package/dist/src/core/command-class.js +2356 -0
  311. package/dist/src/core/command-class.js.map +1 -0
  312. package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
  313. package/dist/src/core/coverage-sources/adapter.js +71 -0
  314. package/dist/src/core/coverage-sources/adapter.js.map +1 -0
  315. package/dist/src/core/coverage-sources/gh.d.ts +48 -0
  316. package/dist/src/core/coverage-sources/gh.js +136 -0
  317. package/dist/src/core/coverage-sources/gh.js.map +1 -0
  318. package/dist/src/core/coverage-sources/git.d.ts +101 -0
  319. package/dist/src/core/coverage-sources/git.js +269 -0
  320. package/dist/src/core/coverage-sources/git.js.map +1 -0
  321. package/dist/src/core/coverage.d.ts +217 -0
  322. package/dist/src/core/coverage.js +337 -0
  323. package/dist/src/core/coverage.js.map +1 -0
  324. package/dist/src/core/credential-spec.d.ts +72 -0
  325. package/dist/src/core/credential-spec.js +23 -0
  326. package/dist/src/core/credential-spec.js.map +1 -0
  327. package/dist/src/core/dark-session.d.ts +331 -0
  328. package/dist/src/core/dark-session.js +714 -0
  329. package/dist/src/core/dark-session.js.map +1 -0
  330. package/dist/src/core/decision-refusal.d.ts +185 -0
  331. package/dist/src/core/decision-refusal.js +265 -0
  332. package/dist/src/core/decision-refusal.js.map +1 -0
  333. package/dist/src/core/env-file.d.ts +450 -0
  334. package/dist/src/core/env-file.js +837 -0
  335. package/dist/src/core/env-file.js.map +1 -0
  336. package/dist/src/core/execute.d.ts +858 -0
  337. package/dist/src/core/execute.js +1271 -0
  338. package/dist/src/core/execute.js.map +1 -0
  339. package/dist/src/core/frontmatter.d.ts +78 -0
  340. package/dist/src/core/frontmatter.js +100 -0
  341. package/dist/src/core/frontmatter.js.map +1 -0
  342. package/dist/src/core/gate-window.d.ts +312 -0
  343. package/dist/src/core/gate-window.js +506 -0
  344. package/dist/src/core/gate-window.js.map +1 -0
  345. package/dist/src/core/gate.d.ts +1364 -0
  346. package/dist/src/core/gate.js +3002 -0
  347. package/dist/src/core/gate.js.map +1 -0
  348. package/dist/src/core/git-run.d.ts +73 -0
  349. package/dist/src/core/git-run.js +93 -0
  350. package/dist/src/core/git-run.js.map +1 -0
  351. package/dist/src/core/harness-version.d.ts +157 -0
  352. package/dist/src/core/harness-version.js +211 -0
  353. package/dist/src/core/harness-version.js.map +1 -0
  354. package/dist/src/core/harness-wait.d.ts +55 -0
  355. package/dist/src/core/harness-wait.js +58 -0
  356. package/dist/src/core/harness-wait.js.map +1 -0
  357. package/dist/src/core/head-retry.d.ts +107 -0
  358. package/dist/src/core/head-retry.js +121 -0
  359. package/dist/src/core/head-retry.js.map +1 -0
  360. package/dist/src/core/instance.d.ts +253 -0
  361. package/dist/src/core/instance.js +319 -0
  362. package/dist/src/core/instance.js.map +1 -0
  363. package/dist/src/core/intake-limits.d.ts +247 -0
  364. package/dist/src/core/intake-limits.js +350 -0
  365. package/dist/src/core/intake-limits.js.map +1 -0
  366. package/dist/src/core/jcs.d.ts +52 -0
  367. package/dist/src/core/jcs.js +132 -0
  368. package/dist/src/core/jcs.js.map +1 -0
  369. package/dist/src/core/journal.d.ts +144 -0
  370. package/dist/src/core/journal.js +200 -0
  371. package/dist/src/core/journal.js.map +1 -0
  372. package/dist/src/core/live-draw.d.ts +436 -0
  373. package/dist/src/core/live-draw.js +703 -0
  374. package/dist/src/core/live-draw.js.map +1 -0
  375. package/dist/src/core/log-reconcile.d.ts +89 -0
  376. package/dist/src/core/log-reconcile.js +136 -0
  377. package/dist/src/core/log-reconcile.js.map +1 -0
  378. package/dist/src/core/log-subscribe.d.ts +36 -0
  379. package/dist/src/core/log-subscribe.js +162 -0
  380. package/dist/src/core/log-subscribe.js.map +1 -0
  381. package/dist/src/core/log.d.ts +278 -0
  382. package/dist/src/core/log.js +546 -0
  383. package/dist/src/core/log.js.map +1 -0
  384. package/dist/src/core/loop.d.ts +274 -0
  385. package/dist/src/core/loop.js +487 -0
  386. package/dist/src/core/loop.js.map +1 -0
  387. package/dist/src/core/md-fence.d.ts +41 -0
  388. package/dist/src/core/md-fence.js +74 -0
  389. package/dist/src/core/md-fence.js.map +1 -0
  390. package/dist/src/core/money.d.ts +147 -0
  391. package/dist/src/core/money.js +195 -0
  392. package/dist/src/core/money.js.map +1 -0
  393. package/dist/src/core/payload-census.d.ts +74 -0
  394. package/dist/src/core/payload-census.js +146 -0
  395. package/dist/src/core/payload-census.js.map +1 -0
  396. package/dist/src/core/payload-store.d.ts +175 -0
  397. package/dist/src/core/payload-store.js +340 -0
  398. package/dist/src/core/payload-store.js.map +1 -0
  399. package/dist/src/core/payload.d.ts +71 -0
  400. package/dist/src/core/payload.js +80 -0
  401. package/dist/src/core/payload.js.map +1 -0
  402. package/dist/src/core/policy-diff.d.ts +292 -0
  403. package/dist/src/core/policy-diff.js +588 -0
  404. package/dist/src/core/policy-diff.js.map +1 -0
  405. package/dist/src/core/policy-expectations.d.ts +199 -0
  406. package/dist/src/core/policy-expectations.js +394 -0
  407. package/dist/src/core/policy-expectations.js.map +1 -0
  408. package/dist/src/core/policy-explain.d.ts +150 -0
  409. package/dist/src/core/policy-explain.js +258 -0
  410. package/dist/src/core/policy-explain.js.map +1 -0
  411. package/dist/src/core/policy-load.d.ts +527 -0
  412. package/dist/src/core/policy-load.js +536 -0
  413. package/dist/src/core/policy-load.js.map +1 -0
  414. package/dist/src/core/policy-match.d.ts +281 -0
  415. package/dist/src/core/policy-match.js +478 -0
  416. package/dist/src/core/policy-match.js.map +1 -0
  417. package/dist/src/core/policy-proposal.d.ts +265 -0
  418. package/dist/src/core/policy-proposal.js +458 -0
  419. package/dist/src/core/policy-proposal.js.map +1 -0
  420. package/dist/src/core/prompt-layout.d.ts +221 -0
  421. package/dist/src/core/prompt-layout.js +422 -0
  422. package/dist/src/core/prompt-layout.js.map +1 -0
  423. package/dist/src/core/protected-path-guard.d.ts +453 -0
  424. package/dist/src/core/protected-path-guard.js +1566 -0
  425. package/dist/src/core/protected-path-guard.js.map +1 -0
  426. package/dist/src/core/registration.d.ts +25 -0
  427. package/dist/src/core/registration.js +39 -0
  428. package/dist/src/core/registration.js.map +1 -0
  429. package/dist/src/core/reindex.d.ts +99 -0
  430. package/dist/src/core/reindex.js +336 -0
  431. package/dist/src/core/reindex.js.map +1 -0
  432. package/dist/src/core/sampler.d.ts +313 -0
  433. package/dist/src/core/sampler.js +388 -0
  434. package/dist/src/core/sampler.js.map +1 -0
  435. package/dist/src/core/sandbox.d.ts +290 -0
  436. package/dist/src/core/sandbox.js +424 -0
  437. package/dist/src/core/sandbox.js.map +1 -0
  438. package/dist/src/core/seal.d.ts +165 -0
  439. package/dist/src/core/seal.js +290 -0
  440. package/dist/src/core/seal.js.map +1 -0
  441. package/dist/src/core/state.d.ts +505 -0
  442. package/dist/src/core/state.js +1009 -0
  443. package/dist/src/core/state.js.map +1 -0
  444. package/dist/src/core/task-file.d.ts +185 -0
  445. package/dist/src/core/task-file.js +464 -0
  446. package/dist/src/core/task-file.js.map +1 -0
  447. package/dist/src/core/telegram-config.d.ts +93 -0
  448. package/dist/src/core/telegram-config.js +114 -0
  449. package/dist/src/core/telegram-config.js.map +1 -0
  450. package/dist/src/core/token.d.ts +409 -0
  451. package/dist/src/core/token.js +561 -0
  452. package/dist/src/core/token.js.map +1 -0
  453. package/dist/src/core/validate.d.ts +138 -0
  454. package/dist/src/core/validate.js +0 -0
  455. package/dist/src/core/validate.js.map +1 -0
  456. package/dist/src/core/values.d.ts +137 -0
  457. package/dist/src/core/values.js +153 -0
  458. package/dist/src/core/values.js.map +1 -0
  459. package/dist/src/core/vault.d.ts +291 -0
  460. package/dist/src/core/vault.js +612 -0
  461. package/dist/src/core/vault.js.map +1 -0
  462. package/dist/src/core/verified-snapshot.d.ts +204 -0
  463. package/dist/src/core/verified-snapshot.js +506 -0
  464. package/dist/src/core/verified-snapshot.js.map +1 -0
  465. package/dist/src/core/verify.d.ts +336 -0
  466. package/dist/src/core/verify.js +549 -0
  467. package/dist/src/core/verify.js.map +1 -0
  468. package/dist/src/core/version.d.ts +8 -0
  469. package/dist/src/core/version.js +9 -0
  470. package/dist/src/core/version.js.map +1 -0
  471. package/dist/src/core/wysiwys.d.ts +370 -0
  472. package/dist/src/core/wysiwys.js +728 -0
  473. package/dist/src/core/wysiwys.js.map +1 -0
  474. package/dist/src/daemon/advance-child.d.ts +39 -0
  475. package/dist/src/daemon/advance-child.js +78 -0
  476. package/dist/src/daemon/advance-child.js.map +1 -0
  477. package/dist/src/daemon/advance.d.ts +466 -0
  478. package/dist/src/daemon/advance.js +849 -0
  479. package/dist/src/daemon/advance.js.map +1 -0
  480. package/dist/src/daemon/audit.d.ts +87 -0
  481. package/dist/src/daemon/audit.js +90 -0
  482. package/dist/src/daemon/audit.js.map +1 -0
  483. package/dist/src/daemon/daemon.d.ts +1180 -0
  484. package/dist/src/daemon/daemon.js +1988 -0
  485. package/dist/src/daemon/daemon.js.map +1 -0
  486. package/dist/src/daemon/dark-session.d.ts +64 -0
  487. package/dist/src/daemon/dark-session.js +119 -0
  488. package/dist/src/daemon/dark-session.js.map +1 -0
  489. package/dist/src/daemon/draw-child.d.ts +36 -0
  490. package/dist/src/daemon/draw-child.js +132 -0
  491. package/dist/src/daemon/draw-child.js.map +1 -0
  492. package/dist/src/daemon/draw.d.ts +154 -0
  493. package/dist/src/daemon/draw.js +458 -0
  494. package/dist/src/daemon/draw.js.map +1 -0
  495. package/dist/src/daemon/git-evidence.d.ts +173 -0
  496. package/dist/src/daemon/git-evidence.js +345 -0
  497. package/dist/src/daemon/git-evidence.js.map +1 -0
  498. package/dist/src/daemon/projection.d.ts +180 -0
  499. package/dist/src/daemon/projection.js +233 -0
  500. package/dist/src/daemon/projection.js.map +1 -0
  501. package/dist/src/daemon/prune.d.ts +207 -0
  502. package/dist/src/daemon/prune.js +376 -0
  503. package/dist/src/daemon/prune.js.map +1 -0
  504. package/dist/src/mcp/http.d.ts +113 -0
  505. package/dist/src/mcp/http.js +343 -0
  506. package/dist/src/mcp/http.js.map +1 -0
  507. package/dist/src/mcp/server.d.ts +265 -0
  508. package/dist/src/mcp/server.js +602 -0
  509. package/dist/src/mcp/server.js.map +1 -0
  510. package/docs/adapter-api.md +106 -0
  511. package/docs/cli-reference.md +5716 -0
  512. package/docs/codex-enforced-session.md +30 -0
  513. package/package.json +53 -4
  514. package/schema/.gitkeep +0 -0
  515. package/schema/LICENSE +117 -0
  516. package/schema/codex-instance.schema.json +82 -0
  517. package/schema/envelope.schema.json +137 -0
  518. package/schema/event.schema.json +1811 -0
  519. package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
  520. package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
  521. package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
  522. package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
  523. package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
  524. package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
  525. package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
  526. package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
  527. package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
  528. package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
  529. package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
  530. package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
  531. package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
  532. package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
  533. package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
  534. package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
  535. package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
  536. package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
  537. package/schema/fixtures/envelope/valid/canonical.json +25 -0
  538. package/schema/fixtures/envelope/valid/minimal.json +7 -0
  539. package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
  540. package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
  541. package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
  542. package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
  543. package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
  544. package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
  545. package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
  546. package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
  547. package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
  548. package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
  549. package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
  550. package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
  551. package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
  552. package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
  553. package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
  554. package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
  555. package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
  556. package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
  557. package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
  558. package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
  559. package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
  560. package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
  561. package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
  562. package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
  563. package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
  564. package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
  565. package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
  566. package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
  567. package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
  568. package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
  569. package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
  570. package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
  571. package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
  572. package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
  573. package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
  574. package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
  575. package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
  576. package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
  577. package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
  578. package/schema/fixtures/event/invalid/missing-alg.json +14 -0
  579. package/schema/fixtures/event/invalid/missing-hash.json +14 -0
  580. package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
  581. package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
  582. package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
  583. package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
  584. package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
  585. package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
  586. package/schema/fixtures/event/invalid/short-hash.json +15 -0
  587. package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
  588. package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
  589. package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
  590. package/schema/fixtures/event/valid/approval-expired.json +15 -0
  591. package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
  592. package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
  593. package/schema/fixtures/event/valid/approval-granted.json +15 -0
  594. package/schema/fixtures/event/valid/approval-rejected.json +15 -0
  595. package/schema/fixtures/event/valid/approval-requested.json +19 -0
  596. package/schema/fixtures/event/valid/approval-revoked.json +15 -0
  597. package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
  598. package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
  599. package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
  600. package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
  601. package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
  602. package/schema/fixtures/event/valid/audit-sampled.json +14 -0
  603. package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
  604. package/schema/fixtures/event/valid/envelope-drift.json +16 -0
  605. package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
  606. package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
  607. package/schema/fixtures/event/valid/execution-completed.json +15 -0
  608. package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
  609. package/schema/fixtures/event/valid/execution-failed.json +15 -0
  610. package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
  611. package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
  612. package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
  613. package/schema/fixtures/event/valid/execution-started.json +14 -0
  614. package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
  615. package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
  616. package/schema/fixtures/event/valid/gate-closed.json +14 -0
  617. package/schema/fixtures/event/valid/gate-opened.json +16 -0
  618. package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
  619. package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
  620. package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
  621. package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
  622. package/schema/fixtures/event/valid/payload-pruned.json +17 -0
  623. package/schema/fixtures/event/valid/policy-declined.json +16 -0
  624. package/schema/fixtures/event/valid/policy-proposed.json +35 -0
  625. package/schema/fixtures/event/valid/policy-updated.json +14 -0
  626. package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
  627. package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
  628. package/schema/fixtures/event/valid/route-accepted.json +15 -0
  629. package/schema/fixtures/event/valid/route-proposed.json +16 -0
  630. package/schema/fixtures/event/valid/spec-example.json +15 -0
  631. package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
  632. package/schema/fixtures/event/valid/task-registered.json +14 -0
  633. package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
  634. package/schema/fixtures/hash/known-answer.json +74 -0
  635. package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
  636. package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
  637. package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
  638. package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
  639. package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
  640. package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
  641. package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
  642. package/schema/fixtures/policy/invalid/missing-version.json +8 -0
  643. package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
  644. package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
  645. package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
  646. package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
  647. package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
  648. package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
  649. package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
  650. package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
  651. package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
  652. package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
  653. package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
  654. package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
  655. package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
  656. package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
  657. package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
  658. package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
  659. package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
  660. package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
  661. package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
  662. package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
  663. package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
  664. package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
  665. package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
  666. package/schema/fixtures/policy/valid/canonical.json +47 -0
  667. package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
  668. package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
  669. package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
  670. package/schema/fixtures/policy/valid/global-budgets.json +19 -0
  671. package/schema/fixtures/policy/valid/human-only.json +9 -0
  672. package/schema/fixtures/policy/valid/minimal.json +6 -0
  673. package/schema/fixtures/policy/valid/protected-paths.json +10 -0
  674. package/schema/fixtures/policy/valid/record-namespace.json +13 -0
  675. package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
  676. package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
  677. package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
  678. package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
  679. package/schema/fixtures/policy/valid/wildcards.json +15 -0
  680. package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
  681. package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
  682. package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
  683. package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
  684. package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
  685. package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
  686. package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
  687. package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
  688. package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
  689. package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
  690. package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
  691. package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
  692. package/schema/fixtures/policy-md/valid/canonical.md +50 -0
  693. package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
  694. package/schema/fixtures/policy-md/valid/minimal.md +3 -0
  695. package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
  696. package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
  697. package/schema/fixtures/policy-md/valid/with-values.md +79 -0
  698. package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
  699. package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
  700. package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
  701. package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
  702. package/schema/fixtures/sample-record/valid/minimal.json +4 -0
  703. package/schema/fixtures/sample-record/valid/with-note.json +5 -0
  704. package/schema/fixtures/values/invalid/class-shaped.json +9 -0
  705. package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
  706. package/schema/fixtures/values/invalid/non-string-item.json +4 -0
  707. package/schema/fixtures/values/invalid/over-cap.json +26 -0
  708. package/schema/fixtures/values/invalid/unknown-key.json +5 -0
  709. package/schema/fixtures/values/invalid/version-string.json +1 -0
  710. package/schema/fixtures/values/valid/empty-lists.json +7 -0
  711. package/schema/fixtures/values/valid/full.json +20 -0
  712. package/schema/fixtures/values/valid/minimal.json +1 -0
  713. package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
  714. package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
  715. package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
  716. package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
  717. package/schema/fixtures/values-md/valid/absent.md +50 -0
  718. package/schema/fixtures/values-md/valid/with-values.md +79 -0
  719. package/schema/policy.schema.json +501 -0
  720. package/schema/sample-record.schema.json +26 -0
  721. package/schema/values.schema.json +55 -0
  722. package/templates/codex/README.md +9 -0
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Policy PINS: what a policy file is expected to resolve to, as data (APRV-203).
3
+ *
4
+ * The repository's own policy file has always been pinned: the dogfood suite in
5
+ * `tests/` asserts the autonomy and provenance the matcher resolves for every class
6
+ * the policy declares, so an edit that changes what the gate does fails `npm test`
7
+ * rather than being discovered by an agent doing something it should not have been
8
+ * allowed to do. The pins lived inside that test file, which meant the amendment
9
+ * ceremony could not read them: `approval policy amend` would attest, commit and
10
+ * push a policy edit whose pins nobody had updated, and CI found out afterwards.
11
+ *
12
+ * So the pins moved here, to a module the test and the ceremony both import, and
13
+ * `policy amend` runs {@link checkPolicyExpectations} against the AMENDED file
14
+ * before it pushes anything. One home for the pins; two readers.
15
+ *
16
+ * ## Why this module knows about one particular repository
17
+ *
18
+ * These pins are facts about approval.md's own policy, and no other repository's
19
+ * policy has anything to do with them. {@link expectationsFor} therefore answers
20
+ * them only when the policy being amended belongs to the `approval-md` package
21
+ * itself, and answers `null` everywhere else, where the ceremony simply says it
22
+ * has no expectation set to check. A shipped CLI that applied this repository's
23
+ * pins to a user's policy would refuse every amendment they ever made.
24
+ */
25
+ import type { Autonomy, PolicyLoadResult } from "./policy-load.js";
26
+ import { type Provenance } from "./policy-match.js";
27
+ /** One pinned class resolution. */
28
+ export interface PolicyExpectation {
29
+ actionClass: string;
30
+ autonomy: Autonomy;
31
+ provenance: Provenance;
32
+ /** Why this pin reads the way it does. Printed with a failure. */
33
+ note?: string;
34
+ }
35
+ /**
36
+ * The pins for this repository's `APPROVAL.md`.
37
+ *
38
+ * ## What earns a pin (APRV-296)
39
+ *
40
+ * A pin is a class whose LOOSENING is a security regression, so the ceremony
41
+ * refuses before the bytes are attested rather than after CI reads them. Three
42
+ * families qualify and nothing else does: the `human-only` classes, where a
43
+ * looser level would mint agent authority over the gate's own organs; the
44
+ * `manual` classes whose looser level puts an irreversible or third-party
45
+ * effect behind no human; and the fail-closed DEFAULT itself, pinned through
46
+ * classes the policy deliberately does not declare, so a policy that stopped
47
+ * defaulting to `manual` fails here even though every declared class still
48
+ * resolves as written. Each pin's note says which of those it is and what the
49
+ * loosening would cost.
50
+ *
51
+ * Until APRV-296 the list also pinned every OTHER class the policy declared,
52
+ * in both directions, and the 2026-09-07 ceremony is what that cost: a one-line
53
+ * TTL change plus one newly declared class turned into three failed runs,
54
+ * because tuning `vcs.pr.create` or `log.advance` was also a code change to be
55
+ * built before the ceremony would accept it. Those pins protected nothing —
56
+ * loosening a class that is already `autonomous` is not a direction, and the
57
+ * dangerous direction for `vcs.push.main` is held by the irreversibility floor
58
+ * (SPEC.md §7), which `tests/dogfood.test.ts` pins on its own. Every
59
+ * resolution change, pinned or not, still prints in the ceremony's semantic
60
+ * diff and is still attested by a human who read it.
61
+ *
62
+ * A class this list does NOT name is accepted, in the ceremony and in the
63
+ * dogfood suite alike: declaring a new `supervised` or `autonomous` class is a
64
+ * policy amendment and needs no code change. The other direction still fails —
65
+ * a pin naming a class the policy no longer resolves that way is a refusal,
66
+ * which is the whole point of the list.
67
+ */
68
+ export declare const REPO_POLICY_EXPECTATIONS: readonly PolicyExpectation[];
69
+ /**
70
+ * One way the amended policy failed its pins. Machine-readable by `kind`.
71
+ *
72
+ * `unpinned` was a fourth kind until APRV-296, raised when the policy declared
73
+ * a class this list did not name. It is gone with the rule that produced it: a
74
+ * declared class carrying no pin is now accepted, so declaring a `supervised`
75
+ * or `autonomous` class is a policy amendment and not also a code change.
76
+ */
77
+ export interface ExpectationFailure {
78
+ kind: "resolution" | "floor" | "unreachable";
79
+ actionClass: string;
80
+ expected: string;
81
+ actual: string;
82
+ note?: string;
83
+ }
84
+ /**
85
+ * One pin, as the source line a human pastes into {@link REPO_POLICY_EXPECTATIONS}.
86
+ *
87
+ * The single-line form the list already uses for a pin with no note. A pin
88
+ * worth a note gets one from the person who knows why it reads that way, which
89
+ * is not something a resolution can supply — and since APRV-296 every pin in
90
+ * that list is worth a note, because a pin exists only where loosening the
91
+ * class would be a regression and the note is where that argument is written.
92
+ *
93
+ * No refusal prints this line any more. The ceremony used to hand it to an
94
+ * operator whose policy declared an unpinned class; nothing is unpinned now, so
95
+ * this is the spelling a human uses when they decide a NEW class belongs in the
96
+ * safety set. Printed, never applied: no verb in this repository writes the
97
+ * pins file.
98
+ */
99
+ export declare function pinLine(actionClass: string, autonomy: string, provenance: string): string;
100
+ /** One line per failure, in the shape a terminal and a `--json` array share. */
101
+ export declare function describeFailure(failure: ExpectationFailure): string;
102
+ /**
103
+ * Check a loaded policy against its pins.
104
+ *
105
+ * Three ways to fail. A pinned class that no longer resolves as pinned is the
106
+ * one the list exists for: the pins name only classes whose loosening is a
107
+ * regression (APRV-296), so a failure here is a policy that moved one of them.
108
+ * A pinned resolution the irreversibility floor decided is a pin that stopped
109
+ * measuring the rule. And a class the command classifier cannot emit is a
110
+ * policy line that will never fire.
111
+ *
112
+ * What is NOT a failure, since APRV-296: a class the policy declares and this
113
+ * list does not pin. The pins are a safety floor rather than an inventory, and
114
+ * a policy declaring a new `supervised` or `autonomous` class needs no code
115
+ * change to be accepted. The resolution still prints in the ceremony's semantic
116
+ * diff, where a human reads it before attesting.
117
+ */
118
+ export declare function checkPolicyExpectations(load: PolicyLoadResult, expectations: readonly PolicyExpectation[]): {
119
+ ok: boolean;
120
+ failures: ExpectationFailure[];
121
+ };
122
+ /** The name of the module a human edits when a pin has to move. */
123
+ export declare const EXPECTATIONS_MODULE = "src/core/policy-expectations.ts";
124
+ /**
125
+ * The dogfood suite, in source and as the build output that actually runs
126
+ * (APRV-274). Repo-relative, so a caller joins them onto the repository root.
127
+ *
128
+ * Both spellings are needed and they answer different questions. The SOURCE
129
+ * says whether this repository has a dogfood suite at all, which is what keeps
130
+ * the ceremony inert in somebody else's checkout. The BUILT file is what a
131
+ * ceremony runs, and its absence beside a present source is a stale build: the
132
+ * pins the suite would read are the ones in `dist/`, so a ceremony that ran the
133
+ * suite there would be checking the previous edit's pins.
134
+ */
135
+ export declare const DOGFOOD_SUITE_SOURCE = "tests/dogfood.test.ts";
136
+ export declare const DOGFOOD_SUITE_BUILT = "dist/tests/dogfood.test.js";
137
+ /** One pin as the source text spells it: what class, resolving to what. */
138
+ export interface PinSourceEntry {
139
+ actionClass: string;
140
+ /** `autonomy/provenance` as written, or `null` where the text is unreadable. */
141
+ resolution: string | null;
142
+ }
143
+ /**
144
+ * How one class's pin moved between two versions of the pins module.
145
+ *
146
+ * `null` on a side means the class was NOT PINNED in that version, and it is
147
+ * the only thing it means: an entry whose resolution the reader could not make
148
+ * out reads `"unreadable"` there, so "nobody pinned this" and "the pin is
149
+ * written in a shape this reader does not know" never arrive as the same fact.
150
+ */
151
+ export interface PinChange {
152
+ actionClass: string;
153
+ before: string | null;
154
+ after: string | null;
155
+ }
156
+ /**
157
+ * The pins a version of the module TEXT declares (APRV-274).
158
+ *
159
+ * A DISPLAY reader and nothing else. It exists so the amendment ceremony can
160
+ * show what the pins file did between the commit it is built on and the working
161
+ * tree, and the committed side of that comparison is a git blob: TypeScript
162
+ * source, with no build output to import. Nothing here gates anything. The pin
163
+ * check that can refuse a ceremony resolves the COMPILED
164
+ * {@link REPO_POLICY_EXPECTATIONS} against a loaded policy, exactly as it did
165
+ * before this function existed, so a text this reader misreads costs a report
166
+ * line and never a wrong verdict.
167
+ *
168
+ * The read is lexical and SCOPED to the named array literal, which matters:
169
+ * this very module mentions `actionClass` outside the pins (in the failure it
170
+ * builds for a policy that does not parse), and a reader that swept the whole
171
+ * file would report that mention as a pin. Inside the array, entries are split
172
+ * on `actionClass:`, and within one entry the first `autonomy:` and
173
+ * `provenance:` string literals are its resolution. That holds for a list
174
+ * written in the shape this module's own list is written in, where both fields
175
+ * precede the free-text `note`. An entry it cannot read is reported with a
176
+ * `null` resolution rather than dropped, so a pin that moved is never silently
177
+ * absent from the report.
178
+ */
179
+ export declare function readPinSource(text: string, constant?: string): PinSourceEntry[];
180
+ /**
181
+ * How the pins moved from one version of the module text to another, sorted by
182
+ * class so two runs of the same ceremony print the same report.
183
+ *
184
+ * A class pinned twice in one version keeps the FIRST reading, which is what
185
+ * the compiled list resolves to as well: {@link checkPolicyExpectations} walks
186
+ * the array in order and a duplicate cannot change an earlier entry's verdict.
187
+ */
188
+ export declare function diffPinSources(before: string, after: string): PinChange[];
189
+ /** One pin change on one line, for a terminal and for a `--json` array. */
190
+ export declare function describePinChange(change: PinChange): string;
191
+ /**
192
+ * The pins that govern `policyPath`, or `null` when none do.
193
+ *
194
+ * The test is package identity and nothing looser: the nearest `package.json`
195
+ * above the policy file names `approval-md`. A copy of the policy carried into
196
+ * some other repository is not this repository's policy, and a user's own
197
+ * `APPROVAL.md` is nobody's business but theirs.
198
+ */
199
+ export declare function expectationsFor(policyPath: string): readonly PolicyExpectation[] | null;
@@ -0,0 +1,394 @@
1
+ /**
2
+ * Policy PINS: what a policy file is expected to resolve to, as data (APRV-203).
3
+ *
4
+ * The repository's own policy file has always been pinned: the dogfood suite in
5
+ * `tests/` asserts the autonomy and provenance the matcher resolves for every class
6
+ * the policy declares, so an edit that changes what the gate does fails `npm test`
7
+ * rather than being discovered by an agent doing something it should not have been
8
+ * allowed to do. The pins lived inside that test file, which meant the amendment
9
+ * ceremony could not read them: `approval policy amend` would attest, commit and
10
+ * push a policy edit whose pins nobody had updated, and CI found out afterwards.
11
+ *
12
+ * So the pins moved here, to a module the test and the ceremony both import, and
13
+ * `policy amend` runs {@link checkPolicyExpectations} against the AMENDED file
14
+ * before it pushes anything. One home for the pins; two readers.
15
+ *
16
+ * ## Why this module knows about one particular repository
17
+ *
18
+ * These pins are facts about approval.md's own policy, and no other repository's
19
+ * policy has anything to do with them. {@link expectationsFor} therefore answers
20
+ * them only when the policy being amended belongs to the `approval-md` package
21
+ * itself, and answers `null` everywhere else, where the ceremony simply says it
22
+ * has no expectation set to check. A shipped CLI that applied this repository's
23
+ * pins to a user's policy would refuse every amendment they ever made.
24
+ */
25
+ import { readFileSync } from "node:fs";
26
+ import { dirname, join } from "node:path";
27
+ import { emittableClass } from "./command-class.js";
28
+ import { resolve } from "./policy-match.js";
29
+ /**
30
+ * The pins for this repository's `APPROVAL.md`.
31
+ *
32
+ * ## What earns a pin (APRV-296)
33
+ *
34
+ * A pin is a class whose LOOSENING is a security regression, so the ceremony
35
+ * refuses before the bytes are attested rather than after CI reads them. Three
36
+ * families qualify and nothing else does: the `human-only` classes, where a
37
+ * looser level would mint agent authority over the gate's own organs; the
38
+ * `manual` classes whose looser level puts an irreversible or third-party
39
+ * effect behind no human; and the fail-closed DEFAULT itself, pinned through
40
+ * classes the policy deliberately does not declare, so a policy that stopped
41
+ * defaulting to `manual` fails here even though every declared class still
42
+ * resolves as written. Each pin's note says which of those it is and what the
43
+ * loosening would cost.
44
+ *
45
+ * Until APRV-296 the list also pinned every OTHER class the policy declared,
46
+ * in both directions, and the 2026-09-07 ceremony is what that cost: a one-line
47
+ * TTL change plus one newly declared class turned into three failed runs,
48
+ * because tuning `vcs.pr.create` or `log.advance` was also a code change to be
49
+ * built before the ceremony would accept it. Those pins protected nothing —
50
+ * loosening a class that is already `autonomous` is not a direction, and the
51
+ * dangerous direction for `vcs.push.main` is held by the irreversibility floor
52
+ * (SPEC.md §7), which `tests/dogfood.test.ts` pins on its own. Every
53
+ * resolution change, pinned or not, still prints in the ceremony's semantic
54
+ * diff and is still attested by a human who read it.
55
+ *
56
+ * A class this list does NOT name is accepted, in the ceremony and in the
57
+ * dogfood suite alike: declaring a new `supervised` or `autonomous` class is a
58
+ * policy amendment and needs no code change. The other direction still fails —
59
+ * a pin naming a class the policy no longer resolves that way is a refusal,
60
+ * which is the whole point of the list.
61
+ */
62
+ export const REPO_POLICY_EXPECTATIONS = [
63
+ // ---------------------------------------------------------------------
64
+ // human-only — a person acts; no verb mints or withdraws authority
65
+ // (APRV-185); declared at the seq 7355 ceremony. Loosening ANY of these to a
66
+ // level an agent can reach is the regression SPEC.md §11.1 invariant 9
67
+ // forbids: these four are the gate's own organs and the record of what
68
+ // happened, and a policy may not grant an agent authority over them.
69
+ // ---------------------------------------------------------------------
70
+ {
71
+ actionClass: "vcs.history.rewrite",
72
+ autonomy: "human-only",
73
+ provenance: "rule",
74
+ note: "manual until seq 7355; a person rewrites shared history, never an agent. Loosened, an agent could rewrite the history that carries the log's commits, which is the evidence every later verification reads",
75
+ },
76
+ {
77
+ actionClass: "policy.core",
78
+ autonomy: "human-only",
79
+ provenance: "rule",
80
+ note: "APPROVAL.md and .approval/* outside the log; split out of policy.edit by APRV-198 so the 0.1 sample never sits on the gate's own organs. Loosened, an agent could edit the file that decides what agents may do, which is every other control at once",
81
+ },
82
+ {
83
+ actionClass: "log.mutate",
84
+ autonomy: "human-only",
85
+ provenance: "rule",
86
+ note: "any write aimed at .approval/log/ (APRV-198). Loosened, an agent could write the append-only log directly, and the log is the truth every projection and every verdict is rebuilt from",
87
+ },
88
+ {
89
+ actionClass: "account.credential",
90
+ autonomy: "human-only",
91
+ provenance: "rule",
92
+ note: "keychain readers, APPROVAL_*/TELEGRAM_*/VAULT_* probes, vault/keys/env reads (APRV-194). Loosened, an agent could read the channel and vault secrets, and an agent holding the approver's credentials can approve itself",
93
+ },
94
+ // ---------------------------------------------------------------------
95
+ // manual — the classes whose effects leave this repository or cannot be
96
+ // undone. Loosening one moves a human decision into an agent's own hands.
97
+ // ---------------------------------------------------------------------
98
+ {
99
+ actionClass: "deps.add",
100
+ autonomy: "manual",
101
+ provenance: "rule",
102
+ note: "loosened, an agent adds a package this project then runs, in the build and in CI: code nobody here reviewed, reaching the supply chain with no human in the path",
103
+ },
104
+ {
105
+ actionClass: "network.call",
106
+ autonomy: "manual",
107
+ provenance: "rule",
108
+ note: "re-tightened 2026-08-20 (attested seq 293) once APRV-114 taught the classifier that GET-shaped fetches are read.web, so this class now covers only the mutating and ambiguous remainder. Loosened, an agent could write to a third-party system, which is an effect no local revert reaches",
109
+ },
110
+ {
111
+ actionClass: "release.publish",
112
+ autonomy: "manual",
113
+ provenance: "rule",
114
+ note: "loosened, an agent could publish bytes to a public registry under this project's name; a published version is permanent, and users install what it ships",
115
+ },
116
+ {
117
+ actionClass: "policy.edit.ci",
118
+ autonomy: "manual",
119
+ provenance: "rule",
120
+ note: "routed from .github/workflows/ at the 2026-09-06 ceremony (APRV-266): every CI and release-configuration edit is a tap. Loosened, an agent could edit the workflows that are this repository's other enforcement path, including the job that runs this very check",
121
+ },
122
+ {
123
+ actionClass: "files.delete.out_of_scope",
124
+ autonomy: "manual",
125
+ provenance: "rule",
126
+ note: "loosened, an agent could delete files outside its task's stated scope, and a deletion is found by a reader missing something rather than by the gate",
127
+ },
128
+ // ---------------------------------------------------------------------
129
+ // the fail-closed DEFAULT, pinned through classes the policy does not
130
+ // declare. `defaults.autonomy: manual` is asserted directly by the dogfood
131
+ // suite; these three prove the same thing where it actually decides —
132
+ // an action nobody wrote a rule for. Loosening the default is the widest
133
+ // regression this file can catch: it grants every class nobody thought of.
134
+ // ---------------------------------------------------------------------
135
+ {
136
+ actionClass: "communicate.email.external",
137
+ autonomy: "manual",
138
+ provenance: "default",
139
+ note: "undeclared class: the absence of a grant is not a grant. Loosened (a permissive defaults.autonomy, or a wildcard rule that swallowed it), an agent could send mail to a third party under this operator's name without a decision anybody made",
140
+ },
141
+ {
142
+ actionClass: "deps.upgrade",
143
+ autonomy: "manual",
144
+ provenance: "default",
145
+ note: "undeclared, so the manual default holds; since APRV-228 the classifier emits it for the harness self-update verbs (claude/codex/gemini update, uca) as well as npm update. Loosened, an agent could move its own harness version or the dependency tree it runs on, unreviewed; a ceremony that declares the class moves this pin deliberately",
146
+ },
147
+ {
148
+ actionClass: "read",
149
+ autonomy: "manual",
150
+ provenance: "default",
151
+ // SPEC.md §5.2 (amended): a trailing `.*` matches ONE OR MORE segments, so
152
+ // `read.*` is the namespace *under* `read` and does not cover the bare class
153
+ // `read`. A policy wanting the bare class covered must list it as its own
154
+ // rule; the repo policy does not, so `read` falls to the manual default.
155
+ note: "bare namespace is NOT matched by read.* (SPEC.md §5.2). This pin holds the wildcard grammar itself: were `read.*` ever to cover the bare class, every read the classifier could not place would resolve autonomous instead of falling to the manual default",
156
+ },
157
+ ];
158
+ /**
159
+ * One pin, as the source line a human pastes into {@link REPO_POLICY_EXPECTATIONS}.
160
+ *
161
+ * The single-line form the list already uses for a pin with no note. A pin
162
+ * worth a note gets one from the person who knows why it reads that way, which
163
+ * is not something a resolution can supply — and since APRV-296 every pin in
164
+ * that list is worth a note, because a pin exists only where loosening the
165
+ * class would be a regression and the note is where that argument is written.
166
+ *
167
+ * No refusal prints this line any more. The ceremony used to hand it to an
168
+ * operator whose policy declared an unpinned class; nothing is unpinned now, so
169
+ * this is the spelling a human uses when they decide a NEW class belongs in the
170
+ * safety set. Printed, never applied: no verb in this repository writes the
171
+ * pins file.
172
+ */
173
+ export function pinLine(actionClass, autonomy, provenance) {
174
+ return ` { actionClass: ${JSON.stringify(actionClass)}, autonomy: ${JSON.stringify(autonomy)}, provenance: ${JSON.stringify(provenance)} },`;
175
+ }
176
+ /** One line per failure, in the shape a terminal and a `--json` array share. */
177
+ export function describeFailure(failure) {
178
+ return `${failure.actionClass}: expected ${failure.expected}, got ${failure.actual}${failure.note === undefined ? "" : ` (${failure.note})`}`;
179
+ }
180
+ /**
181
+ * Check a loaded policy against its pins.
182
+ *
183
+ * Three ways to fail. A pinned class that no longer resolves as pinned is the
184
+ * one the list exists for: the pins name only classes whose loosening is a
185
+ * regression (APRV-296), so a failure here is a policy that moved one of them.
186
+ * A pinned resolution the irreversibility floor decided is a pin that stopped
187
+ * measuring the rule. And a class the command classifier cannot emit is a
188
+ * policy line that will never fire.
189
+ *
190
+ * What is NOT a failure, since APRV-296: a class the policy declares and this
191
+ * list does not pin. The pins are a safety floor rather than an inventory, and
192
+ * a policy declaring a new `supervised` or `autonomous` class needs no code
193
+ * change to be accepted. The resolution still prints in the ceremony's semantic
194
+ * diff, where a human reads it before attesting.
195
+ */
196
+ export function checkPolicyExpectations(load, expectations) {
197
+ const failures = [];
198
+ if (!load.ok) {
199
+ return {
200
+ ok: false,
201
+ failures: [
202
+ {
203
+ kind: "resolution",
204
+ actionClass: "(the file)",
205
+ expected: "a policy that parses",
206
+ actual: `${load.code}: ${load.message}`,
207
+ },
208
+ ],
209
+ };
210
+ }
211
+ for (const expectation of expectations) {
212
+ const resolution = resolve(load, expectation.actionClass);
213
+ const expected = `${expectation.autonomy}/${expectation.provenance}`;
214
+ const actual = `${resolution.autonomy}/${resolution.provenance}`;
215
+ if (actual !== expected) {
216
+ failures.push({
217
+ kind: "resolution",
218
+ actionClass: expectation.actionClass,
219
+ expected,
220
+ actual,
221
+ ...(expectation.note === undefined ? {} : { note: expectation.note }),
222
+ });
223
+ continue;
224
+ }
225
+ if (resolution.floorApplied) {
226
+ failures.push({
227
+ kind: "floor",
228
+ actionClass: expectation.actionClass,
229
+ expected: "no irreversibility floor on the default path",
230
+ actual: "the floor decided this resolution",
231
+ });
232
+ }
233
+ }
234
+ const declared = Object.keys(load.policy.classes ?? {}).filter((pattern) => !pattern.includes("*"));
235
+ for (const actionClass of declared) {
236
+ // APRV-266: reachability is asked WITH the policy's own `protected_paths`,
237
+ // because a `policy.edit` sub-class is emitted only where an entry routes a
238
+ // path family to it. The question is the one this check always asked —
239
+ // would this line ever fire? — and a routed class nothing routes to still
240
+ // answers no, which is the case worth catching: a `policy.edit.ci` rule
241
+ // whose routing was deleted looks like protection and is not.
242
+ if (!emittableClass(actionClass, load.policy.protected_paths ?? [])) {
243
+ failures.push({
244
+ kind: "unreachable",
245
+ actionClass,
246
+ expected: "a class the command classifier can emit",
247
+ actual: "no rule in src/core/command-class.ts emits it and no protected_paths entry routes to it, so the policy line would never fire",
248
+ });
249
+ }
250
+ }
251
+ return { ok: failures.length === 0, failures };
252
+ }
253
+ /** The name of the module a human edits when a pin has to move. */
254
+ export const EXPECTATIONS_MODULE = "src/core/policy-expectations.ts";
255
+ /**
256
+ * The dogfood suite, in source and as the build output that actually runs
257
+ * (APRV-274). Repo-relative, so a caller joins them onto the repository root.
258
+ *
259
+ * Both spellings are needed and they answer different questions. The SOURCE
260
+ * says whether this repository has a dogfood suite at all, which is what keeps
261
+ * the ceremony inert in somebody else's checkout. The BUILT file is what a
262
+ * ceremony runs, and its absence beside a present source is a stale build: the
263
+ * pins the suite would read are the ones in `dist/`, so a ceremony that ran the
264
+ * suite there would be checking the previous edit's pins.
265
+ */
266
+ export const DOGFOOD_SUITE_SOURCE = "tests/dogfood.test.ts";
267
+ export const DOGFOOD_SUITE_BUILT = "dist/tests/dogfood.test.js";
268
+ /**
269
+ * The body of `const <constant> … = [ … ];` in `text`, or the whole text when
270
+ * no such declaration is there.
271
+ *
272
+ * The scope is what keeps the reader honest about which `actionClass` mentions
273
+ * are pins. The fallback is deliberately permissive rather than empty: this is
274
+ * a display reader over somebody's edited file, and a version whose declaration
275
+ * it cannot find is better reported approximately than reported as no pins at
276
+ * all. A `constant` that is not a plain identifier is refused outright rather
277
+ * than interpolated into a pattern.
278
+ */
279
+ function pinsArrayOf(text, constant) {
280
+ if (!/^[A-Za-z_$][\w$]*$/u.test(constant))
281
+ return text;
282
+ // `const <name>` and not a bare mention: the name appears in prose above the
283
+ // declaration, and a match there would scope the read to a doc comment. The
284
+ // type annotation between the name and the `=` may itself carry brackets
285
+ // (`readonly PolicyExpectation[]`), so only the newline bounds the middle.
286
+ const declared = new RegExp(`\\bconst\\s+${constant}\\b[^=\\n]*=\\s*\\[`, "u").exec(text);
287
+ if (declared === null)
288
+ return text;
289
+ const from = declared.index + declared[0].length;
290
+ const end = text.indexOf("\n];", from);
291
+ return end < 0 ? text.slice(from) : text.slice(from, end);
292
+ }
293
+ /**
294
+ * The pins a version of the module TEXT declares (APRV-274).
295
+ *
296
+ * A DISPLAY reader and nothing else. It exists so the amendment ceremony can
297
+ * show what the pins file did between the commit it is built on and the working
298
+ * tree, and the committed side of that comparison is a git blob: TypeScript
299
+ * source, with no build output to import. Nothing here gates anything. The pin
300
+ * check that can refuse a ceremony resolves the COMPILED
301
+ * {@link REPO_POLICY_EXPECTATIONS} against a loaded policy, exactly as it did
302
+ * before this function existed, so a text this reader misreads costs a report
303
+ * line and never a wrong verdict.
304
+ *
305
+ * The read is lexical and SCOPED to the named array literal, which matters:
306
+ * this very module mentions `actionClass` outside the pins (in the failure it
307
+ * builds for a policy that does not parse), and a reader that swept the whole
308
+ * file would report that mention as a pin. Inside the array, entries are split
309
+ * on `actionClass:`, and within one entry the first `autonomy:` and
310
+ * `provenance:` string literals are its resolution. That holds for a list
311
+ * written in the shape this module's own list is written in, where both fields
312
+ * precede the free-text `note`. An entry it cannot read is reported with a
313
+ * `null` resolution rather than dropped, so a pin that moved is never silently
314
+ * absent from the report.
315
+ */
316
+ export function readPinSource(text, constant = "REPO_POLICY_EXPECTATIONS") {
317
+ const entries = [];
318
+ const scoped = pinsArrayOf(text, constant);
319
+ const boundaries = [...scoped.matchAll(/\bactionClass\s*:\s*"([^"]*)"/gu)];
320
+ for (const [index, boundary] of boundaries.entries()) {
321
+ const actionClass = boundary[1];
322
+ if (actionClass === undefined || actionClass.length === 0)
323
+ continue;
324
+ const from = (boundary.index ?? 0) + boundary[0].length;
325
+ const to = boundaries[index + 1]?.index ?? scoped.length;
326
+ const body = scoped.slice(from, to);
327
+ const autonomy = /\bautonomy\s*:\s*"([^"]*)"/u.exec(body)?.[1];
328
+ const provenance = /\bprovenance\s*:\s*"([^"]*)"/u.exec(body)?.[1];
329
+ entries.push({
330
+ actionClass,
331
+ resolution: autonomy === undefined || provenance === undefined ? null : `${autonomy}/${provenance}`,
332
+ });
333
+ }
334
+ return entries;
335
+ }
336
+ /**
337
+ * How the pins moved from one version of the module text to another, sorted by
338
+ * class so two runs of the same ceremony print the same report.
339
+ *
340
+ * A class pinned twice in one version keeps the FIRST reading, which is what
341
+ * the compiled list resolves to as well: {@link checkPolicyExpectations} walks
342
+ * the array in order and a duplicate cannot change an earlier entry's verdict.
343
+ */
344
+ export function diffPinSources(before, after) {
345
+ const read = (text) => {
346
+ const map = new Map();
347
+ for (const entry of readPinSource(text)) {
348
+ if (!map.has(entry.actionClass))
349
+ map.set(entry.actionClass, entry.resolution ?? "unreadable");
350
+ }
351
+ return map;
352
+ };
353
+ const from = read(before);
354
+ const to = read(after);
355
+ const changes = [];
356
+ for (const actionClass of [...new Set([...from.keys(), ...to.keys()])].sort()) {
357
+ const was = from.get(actionClass) ?? null;
358
+ const now = to.get(actionClass) ?? null;
359
+ if (was === now)
360
+ continue;
361
+ changes.push({ actionClass, before: was, after: now });
362
+ }
363
+ return changes;
364
+ }
365
+ /** One pin change on one line, for a terminal and for a `--json` array. */
366
+ export function describePinChange(change) {
367
+ return `${change.actionClass}: ${change.before ?? "not pinned"} -> ${change.after ?? "not pinned"}`;
368
+ }
369
+ /**
370
+ * The pins that govern `policyPath`, or `null` when none do.
371
+ *
372
+ * The test is package identity and nothing looser: the nearest `package.json`
373
+ * above the policy file names `approval-md`. A copy of the policy carried into
374
+ * some other repository is not this repository's policy, and a user's own
375
+ * `APPROVAL.md` is nobody's business but theirs.
376
+ */
377
+ export function expectationsFor(policyPath) {
378
+ let at = dirname(policyPath);
379
+ for (let depth = 0; depth < 16; depth += 1) {
380
+ try {
381
+ const raw = readFileSync(join(at, "package.json"), "utf8");
382
+ const parsed = JSON.parse(raw);
383
+ return parsed.name === "approval-md" ? REPO_POLICY_EXPECTATIONS : null;
384
+ }
385
+ catch {
386
+ const up = dirname(at);
387
+ if (up === at)
388
+ return null;
389
+ at = up;
390
+ }
391
+ }
392
+ return null;
393
+ }
394
+ //# sourceMappingURL=policy-expectations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-expectations.js","sourceRoot":"","sources":["../../../src/core/policy-expectations.ts"],"names":[],"mappings":"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"}