approval-md 0.0.1 → 0.1.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 (522) hide show
  1. package/LICENSE +176 -0
  2. package/NOTICE +5 -0
  3. package/README.md +909 -4
  4. package/SPEC.md +445 -32
  5. package/cli.js +29 -3
  6. package/dist/src/adapters/agentmail.js +1200 -0
  7. package/dist/src/adapters/agentmail.js.map +1 -0
  8. package/dist/src/adapters/conformance.js +461 -0
  9. package/dist/src/adapters/conformance.js.map +1 -0
  10. package/dist/src/adapters/contract.js +941 -0
  11. package/dist/src/adapters/contract.js.map +1 -0
  12. package/dist/src/adapters/email.js +749 -0
  13. package/dist/src/adapters/email.js.map +1 -0
  14. package/dist/src/adapters/env-passphrase.js +132 -0
  15. package/dist/src/adapters/env-passphrase.js.map +1 -0
  16. package/dist/src/adapters/registry.js +76 -0
  17. package/dist/src/adapters/registry.js.map +1 -0
  18. package/dist/src/adapters/smtp.js +499 -0
  19. package/dist/src/adapters/smtp.js.map +1 -0
  20. package/dist/src/adapters/vault-provider.js +161 -0
  21. package/dist/src/adapters/vault-provider.js.map +1 -0
  22. package/dist/src/channels/batch.js +121 -0
  23. package/dist/src/channels/batch.js.map +1 -0
  24. package/dist/src/channels/cli.js +468 -0
  25. package/dist/src/channels/cli.js.map +1 -0
  26. package/dist/src/channels/conformance.js +445 -0
  27. package/dist/src/channels/conformance.js.map +1 -0
  28. package/dist/src/channels/contract.js +494 -0
  29. package/dist/src/channels/contract.js.map +1 -0
  30. package/dist/src/channels/payload-view.js +43 -0
  31. package/dist/src/channels/payload-view.js.map +1 -0
  32. package/dist/src/channels/render-queue.js +564 -0
  33. package/dist/src/channels/render-queue.js.map +1 -0
  34. package/dist/src/channels/tagging.js +723 -0
  35. package/dist/src/channels/tagging.js.map +1 -0
  36. package/dist/src/channels/telegram.js +3190 -0
  37. package/dist/src/channels/telegram.js.map +1 -0
  38. package/dist/src/channels/web.js +903 -0
  39. package/dist/src/channels/web.js.map +1 -0
  40. package/dist/src/cli/adapter.js +278 -0
  41. package/dist/src/cli/adapter.js.map +1 -0
  42. package/dist/src/cli/amend.js +2171 -0
  43. package/dist/src/cli/amend.js.map +1 -0
  44. package/dist/src/cli/args.js +86 -0
  45. package/dist/src/cli/args.js.map +1 -0
  46. package/dist/src/cli/attest.js +307 -0
  47. package/dist/src/cli/attest.js.map +1 -0
  48. package/dist/src/cli/audit-card.js +201 -0
  49. package/dist/src/cli/audit-card.js.map +1 -0
  50. package/dist/src/cli/audit.js +460 -0
  51. package/dist/src/cli/audit.js.map +1 -0
  52. package/dist/src/cli/channel-telegram.js +2063 -0
  53. package/dist/src/cli/channel-telegram.js.map +1 -0
  54. package/dist/src/cli/channel-web.js +357 -0
  55. package/dist/src/cli/channel-web.js.map +1 -0
  56. package/dist/src/cli/channel.js +438 -0
  57. package/dist/src/cli/channel.js.map +1 -0
  58. package/dist/src/cli/checkpoint-tap.js +238 -0
  59. package/dist/src/cli/checkpoint-tap.js.map +1 -0
  60. package/dist/src/cli/coverage.js +343 -0
  61. package/dist/src/cli/coverage.js.map +1 -0
  62. package/dist/src/cli/daemon.js +631 -0
  63. package/dist/src/cli/daemon.js.map +1 -0
  64. package/dist/src/cli/doctor.js +2648 -0
  65. package/dist/src/cli/doctor.js.map +1 -0
  66. package/dist/src/cli/env.js +302 -0
  67. package/dist/src/cli/env.js.map +1 -0
  68. package/dist/src/cli/execute.js +1682 -0
  69. package/dist/src/cli/execute.js.map +1 -0
  70. package/dist/src/cli/exit-codes.js +82 -0
  71. package/dist/src/cli/exit-codes.js.map +1 -0
  72. package/dist/src/cli/feedback.js +205 -0
  73. package/dist/src/cli/feedback.js.map +1 -0
  74. package/dist/src/cli/gate-window.js +294 -0
  75. package/dist/src/cli/gate-window.js.map +1 -0
  76. package/dist/src/cli/gate.js +557 -0
  77. package/dist/src/cli/gate.js.map +1 -0
  78. package/dist/src/cli/git-scope.js +295 -0
  79. package/dist/src/cli/git-scope.js.map +1 -0
  80. package/dist/src/cli/gloss-attach.js +107 -0
  81. package/dist/src/cli/gloss-attach.js.map +1 -0
  82. package/dist/src/cli/gloss-codex-child.js +149 -0
  83. package/dist/src/cli/gloss-codex-child.js.map +1 -0
  84. package/dist/src/cli/gloss-codex.js +255 -0
  85. package/dist/src/cli/gloss-codex.js.map +1 -0
  86. package/dist/src/cli/gloss-options.js +79 -0
  87. package/dist/src/cli/gloss-options.js.map +1 -0
  88. package/dist/src/cli/gloss.js +362 -0
  89. package/dist/src/cli/gloss.js.map +1 -0
  90. package/dist/src/cli/help.js +2217 -0
  91. package/dist/src/cli/help.js.map +1 -0
  92. package/dist/src/cli/hook.js +2743 -0
  93. package/dist/src/cli/hook.js.map +1 -0
  94. package/dist/src/cli/import.js +175 -0
  95. package/dist/src/cli/import.js.map +1 -0
  96. package/dist/src/cli/init.js +336 -0
  97. package/dist/src/cli/init.js.map +1 -0
  98. package/dist/src/cli/instructions.js +262 -0
  99. package/dist/src/cli/instructions.js.map +1 -0
  100. package/dist/src/cli/journal.js +238 -0
  101. package/dist/src/cli/journal.js.map +1 -0
  102. package/dist/src/cli/log-advance.js +749 -0
  103. package/dist/src/cli/log-advance.js.map +1 -0
  104. package/dist/src/cli/log-anchor.js +387 -0
  105. package/dist/src/cli/log-anchor.js.map +1 -0
  106. package/dist/src/cli/log-checkpoint.js +128 -0
  107. package/dist/src/cli/log-checkpoint.js.map +1 -0
  108. package/dist/src/cli/log-sync.js +849 -0
  109. package/dist/src/cli/log-sync.js.map +1 -0
  110. package/dist/src/cli/log-verbs.js +354 -0
  111. package/dist/src/cli/log-verbs.js.map +1 -0
  112. package/dist/src/cli/long-help.js +148 -0
  113. package/dist/src/cli/long-help.js.map +1 -0
  114. package/dist/src/cli/main.js +1056 -0
  115. package/dist/src/cli/main.js.map +1 -0
  116. package/dist/src/cli/mcp.js +306 -0
  117. package/dist/src/cli/mcp.js.map +1 -0
  118. package/dist/src/cli/paths.js +79 -0
  119. package/dist/src/cli/paths.js.map +1 -0
  120. package/dist/src/cli/payload.js +253 -0
  121. package/dist/src/cli/payload.js.map +1 -0
  122. package/dist/src/cli/policy.js +229 -0
  123. package/dist/src/cli/policy.js.map +1 -0
  124. package/dist/src/cli/preflight.js +888 -0
  125. package/dist/src/cli/preflight.js.map +1 -0
  126. package/dist/src/cli/progress.js +112 -0
  127. package/dist/src/cli/progress.js.map +1 -0
  128. package/dist/src/cli/prompt.js +312 -0
  129. package/dist/src/cli/prompt.js.map +1 -0
  130. package/dist/src/cli/records.js +66 -0
  131. package/dist/src/cli/records.js.map +1 -0
  132. package/dist/src/cli/render.js +132 -0
  133. package/dist/src/cli/render.js.map +1 -0
  134. package/dist/src/cli/sandbox.js +150 -0
  135. package/dist/src/cli/sandbox.js.map +1 -0
  136. package/dist/src/cli/scaffold.js +137 -0
  137. package/dist/src/cli/scaffold.js.map +1 -0
  138. package/dist/src/cli/setup-adapter.js +475 -0
  139. package/dist/src/cli/setup-adapter.js.map +1 -0
  140. package/dist/src/cli/setup-channel.js +635 -0
  141. package/dist/src/cli/setup-channel.js.map +1 -0
  142. package/dist/src/cli/setup-checkpoint.js +196 -0
  143. package/dist/src/cli/setup-checkpoint.js.map +1 -0
  144. package/dist/src/cli/setup-common.js +376 -0
  145. package/dist/src/cli/setup-common.js.map +1 -0
  146. package/dist/src/cli/setup-flow.js +476 -0
  147. package/dist/src/cli/setup-flow.js.map +1 -0
  148. package/dist/src/cli/setup-service.js +308 -0
  149. package/dist/src/cli/setup-service.js.map +1 -0
  150. package/dist/src/cli/setup.js +473 -0
  151. package/dist/src/cli/setup.js.map +1 -0
  152. package/dist/src/cli/style.js +469 -0
  153. package/dist/src/cli/style.js.map +1 -0
  154. package/dist/src/cli/token.js +274 -0
  155. package/dist/src/cli/token.js.map +1 -0
  156. package/dist/src/cli/up.js +847 -0
  157. package/dist/src/cli/up.js.map +1 -0
  158. package/dist/src/cli/usage.js +91 -0
  159. package/dist/src/cli/usage.js.map +1 -0
  160. package/dist/src/cli/values.js +189 -0
  161. package/dist/src/cli/values.js.map +1 -0
  162. package/dist/src/cli/vault.js +362 -0
  163. package/dist/src/cli/vault.js.map +1 -0
  164. package/dist/src/cli/verb-registry.js +2173 -0
  165. package/dist/src/cli/verb-registry.js.map +1 -0
  166. package/dist/src/cli/wordmark.js +52 -0
  167. package/dist/src/cli/wordmark.js.map +1 -0
  168. package/dist/src/core/advance-cycle.js +200 -0
  169. package/dist/src/core/advance-cycle.js.map +1 -0
  170. package/dist/src/core/agents-md.js +747 -0
  171. package/dist/src/core/agents-md.js.map +1 -0
  172. package/dist/src/core/attest.js +577 -0
  173. package/dist/src/core/attest.js.map +1 -0
  174. package/dist/src/core/audit.js +882 -0
  175. package/dist/src/core/audit.js.map +1 -0
  176. package/dist/src/core/budgets.js +449 -0
  177. package/dist/src/core/budgets.js.map +1 -0
  178. package/dist/src/core/checkpoint.js +738 -0
  179. package/dist/src/core/checkpoint.js.map +1 -0
  180. package/dist/src/core/child-env.js +86 -0
  181. package/dist/src/core/child-env.js.map +1 -0
  182. package/dist/src/core/clock.js +43 -0
  183. package/dist/src/core/clock.js.map +1 -0
  184. package/dist/src/core/command-class.js +2321 -0
  185. package/dist/src/core/command-class.js.map +1 -0
  186. package/dist/src/core/coverage-sources/adapter.js +71 -0
  187. package/dist/src/core/coverage-sources/adapter.js.map +1 -0
  188. package/dist/src/core/coverage-sources/gh.js +136 -0
  189. package/dist/src/core/coverage-sources/gh.js.map +1 -0
  190. package/dist/src/core/coverage-sources/git.js +269 -0
  191. package/dist/src/core/coverage-sources/git.js.map +1 -0
  192. package/dist/src/core/coverage.js +337 -0
  193. package/dist/src/core/coverage.js.map +1 -0
  194. package/dist/src/core/credential-spec.js +23 -0
  195. package/dist/src/core/credential-spec.js.map +1 -0
  196. package/dist/src/core/dark-session.js +714 -0
  197. package/dist/src/core/dark-session.js.map +1 -0
  198. package/dist/src/core/decision-refusal.js +265 -0
  199. package/dist/src/core/decision-refusal.js.map +1 -0
  200. package/dist/src/core/env-file.js +837 -0
  201. package/dist/src/core/env-file.js.map +1 -0
  202. package/dist/src/core/execute.js +1233 -0
  203. package/dist/src/core/execute.js.map +1 -0
  204. package/dist/src/core/frontmatter.js +100 -0
  205. package/dist/src/core/frontmatter.js.map +1 -0
  206. package/dist/src/core/gate-window.js +506 -0
  207. package/dist/src/core/gate-window.js.map +1 -0
  208. package/dist/src/core/gate.js +2947 -0
  209. package/dist/src/core/gate.js.map +1 -0
  210. package/dist/src/core/git-run.js +93 -0
  211. package/dist/src/core/git-run.js.map +1 -0
  212. package/dist/src/core/harness-version.js +210 -0
  213. package/dist/src/core/harness-version.js.map +1 -0
  214. package/dist/src/core/harness-wait.js +58 -0
  215. package/dist/src/core/harness-wait.js.map +1 -0
  216. package/dist/src/core/head-retry.js +121 -0
  217. package/dist/src/core/head-retry.js.map +1 -0
  218. package/dist/src/core/instance.js +319 -0
  219. package/dist/src/core/instance.js.map +1 -0
  220. package/dist/src/core/intake-limits.js +350 -0
  221. package/dist/src/core/intake-limits.js.map +1 -0
  222. package/dist/src/core/jcs.js +132 -0
  223. package/dist/src/core/jcs.js.map +1 -0
  224. package/dist/src/core/journal.js +200 -0
  225. package/dist/src/core/journal.js.map +1 -0
  226. package/dist/src/core/live-draw.js +703 -0
  227. package/dist/src/core/live-draw.js.map +1 -0
  228. package/dist/src/core/log-reconcile.js +136 -0
  229. package/dist/src/core/log-reconcile.js.map +1 -0
  230. package/dist/src/core/log.js +546 -0
  231. package/dist/src/core/log.js.map +1 -0
  232. package/dist/src/core/loop.js +476 -0
  233. package/dist/src/core/loop.js.map +1 -0
  234. package/dist/src/core/md-fence.js +74 -0
  235. package/dist/src/core/md-fence.js.map +1 -0
  236. package/dist/src/core/money.js +195 -0
  237. package/dist/src/core/money.js.map +1 -0
  238. package/dist/src/core/payload-census.js +146 -0
  239. package/dist/src/core/payload-census.js.map +1 -0
  240. package/dist/src/core/payload-store.js +340 -0
  241. package/dist/src/core/payload-store.js.map +1 -0
  242. package/dist/src/core/payload.js +80 -0
  243. package/dist/src/core/payload.js.map +1 -0
  244. package/dist/src/core/policy-diff.js +565 -0
  245. package/dist/src/core/policy-diff.js.map +1 -0
  246. package/dist/src/core/policy-expectations.js +394 -0
  247. package/dist/src/core/policy-expectations.js.map +1 -0
  248. package/dist/src/core/policy-explain.js +230 -0
  249. package/dist/src/core/policy-explain.js.map +1 -0
  250. package/dist/src/core/policy-load.js +524 -0
  251. package/dist/src/core/policy-load.js.map +1 -0
  252. package/dist/src/core/policy-match.js +467 -0
  253. package/dist/src/core/policy-match.js.map +1 -0
  254. package/dist/src/core/policy-proposal.js +458 -0
  255. package/dist/src/core/policy-proposal.js.map +1 -0
  256. package/dist/src/core/prompt-layout.js +422 -0
  257. package/dist/src/core/prompt-layout.js.map +1 -0
  258. package/dist/src/core/protected-path-guard.js +1087 -0
  259. package/dist/src/core/protected-path-guard.js.map +1 -0
  260. package/dist/src/core/registration.js +39 -0
  261. package/dist/src/core/registration.js.map +1 -0
  262. package/dist/src/core/reindex.js +336 -0
  263. package/dist/src/core/reindex.js.map +1 -0
  264. package/dist/src/core/sampler.js +388 -0
  265. package/dist/src/core/sampler.js.map +1 -0
  266. package/dist/src/core/sandbox.js +424 -0
  267. package/dist/src/core/sandbox.js.map +1 -0
  268. package/dist/src/core/seal.js +290 -0
  269. package/dist/src/core/seal.js.map +1 -0
  270. package/dist/src/core/state.js +1009 -0
  271. package/dist/src/core/state.js.map +1 -0
  272. package/dist/src/core/task-file.js +464 -0
  273. package/dist/src/core/task-file.js.map +1 -0
  274. package/dist/src/core/telegram-config.js +114 -0
  275. package/dist/src/core/telegram-config.js.map +1 -0
  276. package/dist/src/core/token.js +578 -0
  277. package/dist/src/core/token.js.map +1 -0
  278. package/dist/src/core/validate.js +0 -0
  279. package/dist/src/core/validate.js.map +1 -0
  280. package/dist/src/core/values.js +153 -0
  281. package/dist/src/core/values.js.map +1 -0
  282. package/dist/src/core/vault.js +612 -0
  283. package/dist/src/core/vault.js.map +1 -0
  284. package/dist/src/core/verified-snapshot.js +506 -0
  285. package/dist/src/core/verified-snapshot.js.map +1 -0
  286. package/dist/src/core/verify.js +549 -0
  287. package/dist/src/core/verify.js.map +1 -0
  288. package/dist/src/core/version.js +9 -0
  289. package/dist/src/core/version.js.map +1 -0
  290. package/dist/src/core/wysiwys.js +728 -0
  291. package/dist/src/core/wysiwys.js.map +1 -0
  292. package/dist/src/daemon/advance-child.js +78 -0
  293. package/dist/src/daemon/advance-child.js.map +1 -0
  294. package/dist/src/daemon/advance.js +849 -0
  295. package/dist/src/daemon/advance.js.map +1 -0
  296. package/dist/src/daemon/audit.js +90 -0
  297. package/dist/src/daemon/audit.js.map +1 -0
  298. package/dist/src/daemon/daemon.js +1988 -0
  299. package/dist/src/daemon/daemon.js.map +1 -0
  300. package/dist/src/daemon/dark-session.js +119 -0
  301. package/dist/src/daemon/dark-session.js.map +1 -0
  302. package/dist/src/daemon/draw-child.js +132 -0
  303. package/dist/src/daemon/draw-child.js.map +1 -0
  304. package/dist/src/daemon/draw.js +458 -0
  305. package/dist/src/daemon/draw.js.map +1 -0
  306. package/dist/src/daemon/git-evidence.js +345 -0
  307. package/dist/src/daemon/git-evidence.js.map +1 -0
  308. package/dist/src/daemon/projection.js +233 -0
  309. package/dist/src/daemon/projection.js.map +1 -0
  310. package/dist/src/daemon/prune.js +376 -0
  311. package/dist/src/daemon/prune.js.map +1 -0
  312. package/dist/src/mcp/http.js +343 -0
  313. package/dist/src/mcp/http.js.map +1 -0
  314. package/dist/src/mcp/server.js +594 -0
  315. package/dist/src/mcp/server.js.map +1 -0
  316. package/docs/cli-reference.md +5363 -0
  317. package/package.json +43 -4
  318. package/schema/.gitkeep +0 -0
  319. package/schema/LICENSE +117 -0
  320. package/schema/envelope.schema.json +137 -0
  321. package/schema/event.schema.json +1810 -0
  322. package/schema/fixtures/envelope/invalid/action-missing-idempotency-key.json +15 -0
  323. package/schema/fixtures/envelope/invalid/action-unknown-class-format.json +14 -0
  324. package/schema/fixtures/envelope/invalid/confidence-out-of-range.json +11 -0
  325. package/schema/fixtures/envelope/invalid/est-cost-bare-number.json +14 -0
  326. package/schema/fixtures/envelope/invalid/est-cost-noncanonical-string.json +14 -0
  327. package/schema/fixtures/envelope/invalid/malformed-assignee.json +10 -0
  328. package/schema/fixtures/envelope/invalid/malformed-created-by.json +7 -0
  329. package/schema/fixtures/envelope/invalid/malformed-max-latency.json +11 -0
  330. package/schema/fixtures/envelope/invalid/malformed-payload-hash.json +14 -0
  331. package/schema/fixtures/envelope/invalid/max-cost-bare-number.json +11 -0
  332. package/schema/fixtures/envelope/invalid/missing-origin.json +3 -0
  333. package/schema/fixtures/envelope/invalid/negative-est-cost.json +14 -0
  334. package/schema/fixtures/envelope/invalid/unknown-state.json +7 -0
  335. package/schema/fixtures/envelope/invalid/unknown-top-level-field.json +8 -0
  336. package/schema/fixtures/envelope/valid/action-payload-hash.json +17 -0
  337. package/schema/fixtures/envelope/valid/actions-without-budget.json +18 -0
  338. package/schema/fixtures/envelope/valid/canonical.json +25 -0
  339. package/schema/fixtures/envelope/valid/minimal.json +7 -0
  340. package/schema/fixtures/envelope/valid/multi-action-executed.json +30 -0
  341. package/schema/fixtures/envelope/valid/record-write-stage.json +22 -0
  342. package/schema/fixtures/event/invalid/approval-granted-agent-actor.json +15 -0
  343. package/schema/fixtures/event/invalid/approval-granted-empty-batch-delivery-id.json +17 -0
  344. package/schema/fixtures/event/invalid/approval-granted-fifth-reaction.json +16 -0
  345. package/schema/fixtures/event/invalid/approval-granted-missing-actor.json +14 -0
  346. package/schema/fixtures/event/invalid/approval-requested-missing-action-key.json +14 -0
  347. package/schema/fixtures/event/invalid/approval-withdrawn-agent-policy-drift.json +15 -0
  348. package/schema/fixtures/event/invalid/approval-withdrawn-missing-reason.json +15 -0
  349. package/schema/fixtures/event/invalid/approval-withdrawn-system-actor.json +15 -0
  350. package/schema/fixtures/event/invalid/audit-decision-refused-human-actor.json +17 -0
  351. package/schema/fixtures/event/invalid/audit-decision-refused-missing-code.json +16 -0
  352. package/schema/fixtures/event/invalid/audit-reviewed-agent-actor.json +15 -0
  353. package/schema/fixtures/event/invalid/audit-reviewed-loved-no-note.json +16 -0
  354. package/schema/fixtures/event/invalid/audit-reviewed-system-actor.json +15 -0
  355. package/schema/fixtures/event/invalid/bad-actor-prefix.json +15 -0
  356. package/schema/fixtures/event/invalid/est-cost-bare-number.json +17 -0
  357. package/schema/fixtures/event/invalid/execution-completed-fabricated-exit-code.json +16 -0
  358. package/schema/fixtures/event/invalid/execution-completed-provider-ref-empty-id.json +18 -0
  359. package/schema/fixtures/event/invalid/execution-completed-provider-ref-extra-field.json +19 -0
  360. package/schema/fixtures/event/invalid/execution-completed-provider-ref-id-not-string.json +18 -0
  361. package/schema/fixtures/event/invalid/execution-completed-provider-ref-missing-adapter.json +17 -0
  362. package/schema/fixtures/event/invalid/execution-failed-open-reported-by.json +16 -0
  363. package/schema/fixtures/event/invalid/execution-indeterminate-open-reason.json +14 -0
  364. package/schema/fixtures/event/invalid/execution-reconciled-agent-actor.json +17 -0
  365. package/schema/fixtures/event/invalid/execution-started-negative-env-stripped.json +16 -0
  366. package/schema/fixtures/event/invalid/gate-bypassed-missing-opened-seq.json +15 -0
  367. package/schema/fixtures/event/invalid/gate-closed-non-integer-opened-seq.json +13 -0
  368. package/schema/fixtures/event/invalid/gate-opened-agent-actor.json +16 -0
  369. package/schema/fixtures/event/invalid/gate-organ-attested-absolute-path.json +14 -0
  370. package/schema/fixtures/event/invalid/gate-organ-attested-agent-actor.json +14 -0
  371. package/schema/fixtures/event/invalid/gate-organ-attested-missing-organ-path.json +13 -0
  372. package/schema/fixtures/event/invalid/harness-unknown-kind.json +18 -0
  373. package/schema/fixtures/event/invalid/harness-version-multiline.json +16 -0
  374. package/schema/fixtures/event/invalid/log-checkpoint-agent-actor.json +17 -0
  375. package/schema/fixtures/event/invalid/log-checkpoint-missing-signature.json +16 -0
  376. package/schema/fixtures/event/invalid/log-checkpoint-short-signed-hash.json +17 -0
  377. package/schema/fixtures/event/invalid/log-checkpoint-unknown-signature-alg.json +17 -0
  378. package/schema/fixtures/event/invalid/malformed-ts.json +15 -0
  379. package/schema/fixtures/event/invalid/missing-alg.json +14 -0
  380. package/schema/fixtures/event/invalid/missing-hash.json +14 -0
  381. package/schema/fixtures/event/invalid/non-integer-seq.json +15 -0
  382. package/schema/fixtures/event/invalid/payload-pruned-human-actor.json +14 -0
  383. package/schema/fixtures/event/invalid/payload-pruned-missing-hash.json +14 -0
  384. package/schema/fixtures/event/invalid/policy-declined-agent-actor.json +15 -0
  385. package/schema/fixtures/event/invalid/policy-proposed-missing-diff.json +19 -0
  386. package/schema/fixtures/event/invalid/policy-proposed-system-actor.json +26 -0
  387. package/schema/fixtures/event/invalid/short-hash.json +15 -0
  388. package/schema/fixtures/event/invalid/unknown-alg.json +15 -0
  389. package/schema/fixtures/event/invalid/unknown-event-type.json +15 -0
  390. package/schema/fixtures/event/invalid/unknown-top-level-field.json +16 -0
  391. package/schema/fixtures/event/valid/approval-expired.json +15 -0
  392. package/schema/fixtures/event/valid/approval-granted-batch.json +19 -0
  393. package/schema/fixtures/event/valid/approval-granted-reaction.json +16 -0
  394. package/schema/fixtures/event/valid/approval-granted.json +15 -0
  395. package/schema/fixtures/event/valid/approval-rejected.json +15 -0
  396. package/schema/fixtures/event/valid/approval-requested.json +19 -0
  397. package/schema/fixtures/event/valid/approval-revoked.json +15 -0
  398. package/schema/fixtures/event/valid/approval-withdrawn-policy-drift.json +17 -0
  399. package/schema/fixtures/event/valid/approval-withdrawn.json +16 -0
  400. package/schema/fixtures/event/valid/audit-decision-refused.json +20 -0
  401. package/schema/fixtures/event/valid/audit-reviewed-reaction.json +17 -0
  402. package/schema/fixtures/event/valid/audit-reviewed.json +15 -0
  403. package/schema/fixtures/event/valid/audit-sampled.json +14 -0
  404. package/schema/fixtures/event/valid/budget-exceeded.json +21 -0
  405. package/schema/fixtures/event/valid/envelope-drift.json +16 -0
  406. package/schema/fixtures/event/valid/execution-completed-harness-report.json +16 -0
  407. package/schema/fixtures/event/valid/execution-completed-provider-ref.json +18 -0
  408. package/schema/fixtures/event/valid/execution-completed.json +15 -0
  409. package/schema/fixtures/event/valid/execution-failed-harness-report.json +16 -0
  410. package/schema/fixtures/event/valid/execution-failed.json +15 -0
  411. package/schema/fixtures/event/valid/execution-indeterminate.json +15 -0
  412. package/schema/fixtures/event/valid/execution-reconciled.json +17 -0
  413. package/schema/fixtures/event/valid/execution-started-env-stripped.json +17 -0
  414. package/schema/fixtures/event/valid/execution-started.json +14 -0
  415. package/schema/fixtures/event/valid/gate-bypassed-harness-version.json +18 -0
  416. package/schema/fixtures/event/valid/gate-bypassed.json +19 -0
  417. package/schema/fixtures/event/valid/gate-closed.json +14 -0
  418. package/schema/fixtures/event/valid/gate-opened.json +16 -0
  419. package/schema/fixtures/event/valid/gate-organ-attested.json +14 -0
  420. package/schema/fixtures/event/valid/genesis-null-prev.json +14 -0
  421. package/schema/fixtures/event/valid/log-checkpoint.json +17 -0
  422. package/schema/fixtures/event/valid/payload-pruned-orphan.json +13 -0
  423. package/schema/fixtures/event/valid/payload-pruned.json +17 -0
  424. package/schema/fixtures/event/valid/policy-declined.json +16 -0
  425. package/schema/fixtures/event/valid/policy-proposed.json +35 -0
  426. package/schema/fixtures/event/valid/policy-updated.json +14 -0
  427. package/schema/fixtures/event/valid/reconciliation-required.json +18 -0
  428. package/schema/fixtures/event/valid/reconciliation-satisfied.json +17 -0
  429. package/schema/fixtures/event/valid/route-accepted.json +15 -0
  430. package/schema/fixtures/event/valid/route-proposed.json +16 -0
  431. package/schema/fixtures/event/valid/spec-example.json +15 -0
  432. package/schema/fixtures/event/valid/task-registered-harness-version.json +23 -0
  433. package/schema/fixtures/event/valid/task-registered.json +14 -0
  434. package/schema/fixtures/hash/known-answer-pre-121.json +74 -0
  435. package/schema/fixtures/hash/known-answer.json +74 -0
  436. package/schema/fixtures/policy/invalid/bad-approval-ttl.json +7 -0
  437. package/schema/fixtures/policy/invalid/bad-web-port.json +4 -0
  438. package/schema/fixtures/policy/invalid/checkpoint-key-not-base64.json +6 -0
  439. package/schema/fixtures/policy/invalid/class-rule-missing-autonomy.json +9 -0
  440. package/schema/fixtures/policy/invalid/empty-class-key.json +6 -0
  441. package/schema/fixtures/policy/invalid/live-rate-on-human-only.json +7 -0
  442. package/schema/fixtures/policy/invalid/malformed-class-key.json +6 -0
  443. package/schema/fixtures/policy/invalid/missing-version.json +8 -0
  444. package/schema/fixtures/policy/invalid/negative-limit.json +9 -0
  445. package/schema/fixtures/policy/invalid/non-numeric-limit.json +9 -0
  446. package/schema/fixtures/policy/invalid/non-positive-max-pending.json +9 -0
  447. package/schema/fixtures/policy/invalid/on-expiry-grant.json +8 -0
  448. package/schema/fixtures/policy/invalid/payload-retention-bare-number.json +4 -0
  449. package/schema/fixtures/policy/invalid/payload-retention-compound.json +4 -0
  450. package/schema/fixtures/policy/invalid/payload-retention-fractional.json +4 -0
  451. package/schema/fixtures/policy/invalid/payload-retention-zero.json +4 -0
  452. package/schema/fixtures/policy/invalid/protected-paths-escape.json +4 -0
  453. package/schema/fixtures/policy/invalid/protected-paths-glob.json +4 -0
  454. package/schema/fixtures/policy/invalid/retro-rate-on-human-only.json +7 -0
  455. package/schema/fixtures/policy/invalid/retro-rate-on-manual.json +7 -0
  456. package/schema/fixtures/policy/invalid/retro-rate-zero.json +7 -0
  457. package/schema/fixtures/policy/invalid/sample-rate-too-high.json +5 -0
  458. package/schema/fixtures/policy/invalid/sampling-secret-env-empty.json +7 -0
  459. package/schema/fixtures/policy/invalid/sampling-secret-env-not-string.json +6 -0
  460. package/schema/fixtures/policy/invalid/skew-tolerance-compound.json +6 -0
  461. package/schema/fixtures/policy/invalid/unknown-autonomy.json +7 -0
  462. package/schema/fixtures/policy/invalid/unknown-class-rule-key.json +6 -0
  463. package/schema/fixtures/policy/invalid/unknown-top-level-key.json +7 -0
  464. package/schema/fixtures/policy/invalid/vault-passphrase-env-empty.json +6 -0
  465. package/schema/fixtures/policy/invalid/vault-passphrase-literal.json +6 -0
  466. package/schema/fixtures/policy/invalid/version-not-string.json +4 -0
  467. package/schema/fixtures/policy/valid/canonical.json +47 -0
  468. package/schema/fixtures/policy/valid/checkpoint-keys.json +18 -0
  469. package/schema/fixtures/policy/valid/class-approvers-limits.json +25 -0
  470. package/schema/fixtures/policy/valid/class-retro-rate.json +17 -0
  471. package/schema/fixtures/policy/valid/global-budgets.json +19 -0
  472. package/schema/fixtures/policy/valid/human-only.json +9 -0
  473. package/schema/fixtures/policy/valid/minimal.json +6 -0
  474. package/schema/fixtures/policy/valid/protected-paths.json +10 -0
  475. package/schema/fixtures/policy/valid/record-namespace.json +13 -0
  476. package/schema/fixtures/policy/valid/request-volume-limits.json +26 -0
  477. package/schema/fixtures/policy/valid/retention-and-sampling-secret.json +16 -0
  478. package/schema/fixtures/policy/valid/skew-tolerance.json +15 -0
  479. package/schema/fixtures/policy/valid/vault-passphrase-env.json +14 -0
  480. package/schema/fixtures/policy/valid/wildcards.json +15 -0
  481. package/schema/fixtures/policy-md/invalid/alias-bomb.md +15 -0
  482. package/schema/fixtures/policy-md/invalid/no-fence.md +7 -0
  483. package/schema/fixtures/policy-md/invalid/protected-route-not-a-subclass.md +16 -0
  484. package/schema/fixtures/policy-md/invalid/schema-invalid-autonomy.md +16 -0
  485. package/schema/fixtures/policy-md/invalid/schema-invalid-read-proof.md +17 -0
  486. package/schema/fixtures/policy-md/invalid/two-fences.md +19 -0
  487. package/schema/fixtures/policy-md/invalid/unclosed-fence.md +11 -0
  488. package/schema/fixtures/policy-md/invalid/wrong-info-string.md +11 -0
  489. package/schema/fixtures/policy-md/invalid/yaml-syntax-error.md +13 -0
  490. package/schema/fixtures/policy-md/precedence/both/APPROVAL.md +7 -0
  491. package/schema/fixtures/policy-md/precedence/both/APPROVALS.md +7 -0
  492. package/schema/fixtures/policy-md/precedence/fallback-only/APPROVALS.md +7 -0
  493. package/schema/fixtures/policy-md/valid/canonical.md +50 -0
  494. package/schema/fixtures/policy-md/valid/daemon-read-proof.md +18 -0
  495. package/schema/fixtures/policy-md/valid/minimal.md +3 -0
  496. package/schema/fixtures/policy-md/valid/prose-lookalikes.md +54 -0
  497. package/schema/fixtures/policy-md/valid/routed-protected-paths.md +49 -0
  498. package/schema/fixtures/policy-md/valid/with-values.md +79 -0
  499. package/schema/fixtures/sample-record/invalid/bad-date-time.json +4 -0
  500. package/schema/fixtures/sample-record/invalid/missing-required-field.json +3 -0
  501. package/schema/fixtures/sample-record/invalid/unknown-top-level-field.json +5 -0
  502. package/schema/fixtures/sample-record/invalid/wrong-type.json +4 -0
  503. package/schema/fixtures/sample-record/valid/minimal.json +4 -0
  504. package/schema/fixtures/sample-record/valid/with-note.json +5 -0
  505. package/schema/fixtures/values/invalid/class-shaped.json +9 -0
  506. package/schema/fixtures/values/invalid/duplicate-entry.json +4 -0
  507. package/schema/fixtures/values/invalid/non-string-item.json +4 -0
  508. package/schema/fixtures/values/invalid/over-cap.json +26 -0
  509. package/schema/fixtures/values/invalid/unknown-key.json +5 -0
  510. package/schema/fixtures/values/invalid/version-string.json +1 -0
  511. package/schema/fixtures/values/valid/empty-lists.json +7 -0
  512. package/schema/fixtures/values/valid/full.json +20 -0
  513. package/schema/fixtures/values/valid/minimal.json +1 -0
  514. package/schema/fixtures/values-md/invalid/schema-invalid.md +62 -0
  515. package/schema/fixtures/values-md/invalid/two-blocks.md +69 -0
  516. package/schema/fixtures/values-md/invalid/unterminated.md +61 -0
  517. package/schema/fixtures/values-md/invalid/yaml-error.md +63 -0
  518. package/schema/fixtures/values-md/valid/absent.md +50 -0
  519. package/schema/fixtures/values-md/valid/with-values.md +79 -0
  520. package/schema/policy.schema.json +481 -0
  521. package/schema/sample-record.schema.json +26 -0
  522. package/schema/values.schema.json +55 -0
@@ -0,0 +1,295 @@
1
+ /**
2
+ * The bits of git the CLI needs, run the way `cli/amend.ts` has always run
3
+ * them: `spawnSync`, no shell, and every failure is a value rather than a throw.
4
+ *
5
+ * This module exists because APRV-125 gave a second and a third caller to the
6
+ * primary-checkout resolution APRV-101 wrote for the hook. `approval log sync`
7
+ * and `approval log advance` operate on the committed log, and the committed log
8
+ * has exactly one home: the primary checkout. A copy of `primaryRoot` per caller
9
+ * would be three chances for the three of them to disagree about where that is.
10
+ *
11
+ * Nothing here decides anything. It answers questions about a repository, and
12
+ * the verbs decide what the answers mean.
13
+ */
14
+ import { spawnSync } from "node:child_process";
15
+ import { mkdtempSync, realpathSync, rmSync } from "node:fs";
16
+ import { tmpdir } from "node:os";
17
+ import { basename, dirname, isAbsolute, join, relative, resolve as resolvePathSegments, sep, } from "node:path";
18
+ import { GIT_OUTPUT_LIMIT_BYTES, gh, git } from "../core/git-run.js";
19
+ /**
20
+ * The two runners moved to `core/git-run.ts` in APRV-245 and are re-exported
21
+ * here unchanged. The coverage sources are core code and shell out to git, and
22
+ * core reaching into `src/cli/` for the runner would invert the direction
23
+ * `tests/layering.test.ts` keeps. Every existing caller of `git-scope.ts` is
24
+ * untouched, and there is still one spelling of "run git" in the repository.
25
+ */
26
+ export { GIT_OUTPUT_LIMIT_BYTES, gh, git };
27
+ function absolute(value, cwd) {
28
+ return isAbsolute(value) ? value : resolvePathSegments(cwd, value);
29
+ }
30
+ /** The repository root containing `dir`, or `null` when there is none. */
31
+ export function repoRoot(dir) {
32
+ const result = git(["rev-parse", "--show-toplevel"], dir);
33
+ if (!result.ok)
34
+ return null;
35
+ const root = result.stdout.trim();
36
+ return root.length === 0 ? null : root;
37
+ }
38
+ /**
39
+ * The primary checkout containing `cwd`, or `null` when git cannot say.
40
+ *
41
+ * `git rev-parse --git-common-dir` names the SHARED git directory: in a linked
42
+ * worktree it is the primary checkout's `.git`, in a plain checkout it is this
43
+ * checkout's own (printed as bare `.git` at the top level, absolute from a
44
+ * subdirectory). Either way the primary root is its parent, so a plain checkout
45
+ * resolves to itself.
46
+ *
47
+ * When git is absent, or `cwd` is not a repository at all, this returns `null`.
48
+ * What that means is the caller's business: the hook falls back to `cwd`
49
+ * (APRV-101), and the log verbs refuse, because a log ritual with no repository
50
+ * to run it in has nothing to synchronize.
51
+ */
52
+ export function primaryRoot(cwd) {
53
+ const result = git(["rev-parse", "--git-common-dir"], cwd);
54
+ if (!result.ok)
55
+ return null;
56
+ const common = result.stdout.trim();
57
+ if (common.length === 0)
58
+ return null;
59
+ return dirname(absolute(common, cwd));
60
+ }
61
+ /** `realpathSync` that answers the path itself when the path cannot be resolved. */
62
+ function real(path) {
63
+ try {
64
+ return realpathSync(path);
65
+ }
66
+ catch {
67
+ return path;
68
+ }
69
+ }
70
+ /**
71
+ * The primary checkout, but only when `cwd` is standing in it.
72
+ *
73
+ * A linked worktree's toplevel is the worktree; its common git directory
74
+ * belongs to the primary. So the two agree in the primary checkout and differ
75
+ * in every linked one, which is the whole distinction. Symlinks are resolved on
76
+ * both sides, because `/tmp` is `/private/tmp` on macOS and a checkout reached
77
+ * through one spelling must not read as a different checkout from the other.
78
+ */
79
+ export function primaryCheckout(cwd) {
80
+ const primary = primaryRoot(cwd);
81
+ const top = repoRoot(cwd);
82
+ if (primary === null || top === null) {
83
+ return {
84
+ ok: false,
85
+ reason: "git could not say which repository this directory belongs to",
86
+ worktreeRoot: top,
87
+ primary,
88
+ };
89
+ }
90
+ if (real(primary) !== real(top)) {
91
+ return {
92
+ ok: false,
93
+ reason: `this is the linked worktree ${top}, whose primary checkout is ${primary}`,
94
+ worktreeRoot: top,
95
+ primary,
96
+ };
97
+ }
98
+ return { ok: true, root: top };
99
+ }
100
+ /**
101
+ * `realpathSync` for a path that may not exist yet.
102
+ *
103
+ * The existing part of the path is resolved and the missing tail is appended.
104
+ * A log file that has not been created yet still has to produce the same
105
+ * repo-relative spelling as one that has, or a check would answer differently
106
+ * depending on whether it ran before or after the first append.
107
+ */
108
+ function realish(path) {
109
+ try {
110
+ return realpathSync(path);
111
+ }
112
+ catch {
113
+ const parent = dirname(path);
114
+ if (parent === path)
115
+ return path;
116
+ return join(realish(parent), basename(path));
117
+ }
118
+ }
119
+ /**
120
+ * A repo-relative, forward-slashed path, as git spells one.
121
+ *
122
+ * BOTH sides are resolved through `realpath` first (APRV-210). `git rev-parse
123
+ * --show-toplevel` prints the physical path, so a checkout reached through a
124
+ * symlinked spelling (`/tmp/x` for `/private/tmp/x` on macOS, a symlinked home
125
+ * directory, a bind mount) hands this function a root and a path that live in
126
+ * different spellings of the same place. `relative()` on those two produces a
127
+ * path that climbs out of the repository (`../../private/tmp/…`), git has no
128
+ * blob at `HEAD:<that>`, and the caller concludes the file has never been
129
+ * committed. That is the misread APRV-210 recorded on a log with thousands of
130
+ * committed records.
131
+ */
132
+ export function repoPath(root, path) {
133
+ return relative(realish(root), realish(path)).split(sep).join("/");
134
+ }
135
+ /** The checked-out branch, or `null` on a detached HEAD. */
136
+ export function currentBranch(root) {
137
+ const result = git(["symbolic-ref", "--quiet", "--short", "HEAD"], root);
138
+ if (!result.ok)
139
+ return null;
140
+ const name = result.stdout.trim();
141
+ return name.length === 0 ? null : name;
142
+ }
143
+ /**
144
+ * The bytes of `<rev>:<relative>`, with the reason when there are none.
145
+ *
146
+ * Read as a Buffer, never as text: callers hash and compare these bytes, and an
147
+ * encoding round-trip would silently change what is being compared. That is
148
+ * also why this is `spawnSync` directly rather than {@link git}, which decodes
149
+ * to a string — and why the buffer limit has to be repeated here rather than
150
+ * inherited from the runner.
151
+ */
152
+ export function readBlob(root, rev, relative_) {
153
+ const spec = `${rev}:${relative_}`;
154
+ const result = spawnSync("git", ["show", spec], { cwd: root, maxBuffer: GIT_OUTPUT_LIMIT_BYTES });
155
+ const command = `git show ${spec}`;
156
+ if (result.error !== undefined || result.status === null) {
157
+ return {
158
+ ok: false,
159
+ command,
160
+ status: null,
161
+ detail: result.error === undefined
162
+ ? "git produced no exit status"
163
+ : `git did not complete: ${result.error.message}`,
164
+ };
165
+ }
166
+ if (result.status !== 0) {
167
+ const said = outputLines(result.stderr?.toString("utf8") ?? "").join(" | ");
168
+ return {
169
+ ok: false,
170
+ command,
171
+ status: result.status,
172
+ detail: `git exited ${String(result.status)}${said.length === 0 ? "" : `: ${said}`}`,
173
+ };
174
+ }
175
+ return { ok: true, bytes: result.stdout };
176
+ }
177
+ /**
178
+ * The bytes of `<rev>:<relative>`, or `null` when there are none.
179
+ *
180
+ * The shape every caller predating {@link readBlob} expects. Callers that owe
181
+ * an operator a diagnostic when the read fails should reach for `readBlob`.
182
+ */
183
+ export function showBlob(root, rev, relative_) {
184
+ const read = readBlob(root, rev, relative_);
185
+ return read.ok ? read.bytes : null;
186
+ }
187
+ /** Everything git said about a run, as trimmed non-empty lines. */
188
+ export function outputLines(...texts) {
189
+ return texts
190
+ .join("\n")
191
+ .split("\n")
192
+ .map((line) => line.trim())
193
+ .filter((line) => line.length > 0);
194
+ }
195
+ // ---------------------------------------------------------------------------
196
+ // Basing a ceremony commit on the remote, without checking anything out
197
+ // ---------------------------------------------------------------------------
198
+ /**
199
+ * Fetch one branch from one remote and answer the sha it now points at.
200
+ *
201
+ * The ceremony verbs (`policy amend`, `log advance`) own this step rather than
202
+ * asking the operator to run it first (APRV-203). The failure that made it
203
+ * theirs: a ceremony run in a checkout whose local `main` was behind origin
204
+ * built its commit on the stale tip, so the pull request carried a parent that
205
+ * was missing everything main had merged since, and CI went red for reasons
206
+ * that had nothing to do with the amendment.
207
+ *
208
+ * `FETCH_HEAD` is read rather than `refs/remotes/<remote>/<branch>`, because a
209
+ * fetch of an explicit refspec always writes the former and a repository
210
+ * configured without remote-tracking refs would not have the latter.
211
+ */
212
+ export function fetchBase(root, remote, branch) {
213
+ const fetched = git(["fetch", remote, branch], root);
214
+ if (!fetched.ok) {
215
+ return {
216
+ ok: false,
217
+ message: `\`git fetch ${remote} ${branch}\` failed: ${failureText(fetched)}`,
218
+ quote: outputLines(fetched.stderr, fetched.stdout),
219
+ };
220
+ }
221
+ const resolved = git(["rev-parse", "--verify", "--quiet", "FETCH_HEAD^{commit}"], root);
222
+ const sha = resolved.stdout.trim();
223
+ if (!resolved.ok || sha.length === 0) {
224
+ return {
225
+ ok: false,
226
+ message: `\`git fetch ${remote} ${branch}\` succeeded and named no commit: ${failureText(resolved)}`,
227
+ quote: outputLines(resolved.stderr, resolved.stdout),
228
+ };
229
+ }
230
+ return { ok: true, sha };
231
+ }
232
+ /**
233
+ * Build a commit on `base` carrying the working-tree state of `paths`, without
234
+ * checking anything out (APRV-203).
235
+ *
236
+ * The whole method is one scratch index: `GIT_INDEX_FILE` points at a temporary
237
+ * file, `read-tree` fills it from the base commit's tree, `add -A` lays the
238
+ * named working-tree paths over it, and `write-tree` plus `commit-tree` turn
239
+ * that into an object. HEAD never moves, the operator's index is never read or
240
+ * written, and no file in the working tree is touched — which is what lets a
241
+ * verb that MUST NOT check anything out (a branch switch rewinds `events.jsonl`
242
+ * underneath whatever holds it open) still base its commit on the remote.
243
+ *
244
+ * `unchanged` is the honest answer when the base tree already carries exactly
245
+ * these bytes: there is nothing to commit, and inventing an empty commit would
246
+ * be the verb narrating its own no-op.
247
+ */
248
+ export function commitOnBase(root, request) {
249
+ const scratch = mkdtempSync(join(tmpdir(), "approval-index-"));
250
+ const env = { GIT_INDEX_FILE: join(scratch, "index") };
251
+ const failed = (step, run) => ({
252
+ ok: false,
253
+ step,
254
+ message: `\`${step}\` failed: ${failureText(run)}`,
255
+ quote: outputLines(run.stderr, run.stdout),
256
+ });
257
+ try {
258
+ const read = git(["read-tree", request.base], root, env);
259
+ if (!read.ok)
260
+ return failed(`git read-tree ${request.base}`, read);
261
+ const added = git(["add", "-A", "--", ...request.paths], root, env);
262
+ if (!added.ok)
263
+ return failed("git add", added);
264
+ for (const blob of request.blobs ?? []) {
265
+ const pinned = git(["update-index", "--add", "--cacheinfo", `100644,${blob.sha},${blob.path}`], root, env);
266
+ if (!pinned.ok)
267
+ return failed(`git update-index ${blob.path}`, pinned);
268
+ }
269
+ const tree = git(["write-tree"], root, env);
270
+ if (!tree.ok)
271
+ return failed("git write-tree", tree);
272
+ const treeSha = tree.stdout.trim();
273
+ const baseTree = git(["rev-parse", `${request.base}^{tree}`], root);
274
+ if (baseTree.ok && baseTree.stdout.trim() === treeSha) {
275
+ return { ok: true, sha: null, unchanged: true };
276
+ }
277
+ const commit = git(["commit-tree", treeSha, "-p", request.base, "-m", request.message], root, env);
278
+ if (!commit.ok)
279
+ return failed("git commit-tree", commit);
280
+ const sha = commit.stdout.trim();
281
+ if (sha.length === 0) {
282
+ return { ok: false, step: "git commit-tree", message: "git commit-tree printed no sha", quote: [] };
283
+ }
284
+ return { ok: true, sha, unchanged: false };
285
+ }
286
+ finally {
287
+ rmSync(scratch, { recursive: true, force: true });
288
+ }
289
+ }
290
+ /** The same, folded onto one line for a `--json` message string. */
291
+ export function failureText(run) {
292
+ const lines = outputLines(run.stderr, run.stdout);
293
+ return lines.length === 0 ? "git printed nothing" : lines.join(" | ");
294
+ }
295
+ //# sourceMappingURL=git-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-scope.js","sourceRoot":"","sources":["../../../src/cli/git-scope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Attaching the model gloss to a request, for every channel that renders one
3
+ * (APRV-144, APRV-164, APRV-197).
4
+ *
5
+ * `cli/gloss.ts` decides how a sentence is obtained; this decides which
6
+ * material is worth asking about and where the answer is hung. It lived inside
7
+ * `cli/channel-telegram.ts` until APRV-197, when a second surface needed it:
8
+ * Carter, deciding requests on the CLI channel, read the raw claimed summary
9
+ * and nothing else, because the only code that had ever attached a gloss was
10
+ * the Telegram listener. One reading aid implemented twice would be two reading
11
+ * aids that drift, so the listener and the terminal walker now call the same
12
+ * function over the same payload views.
13
+ *
14
+ * The safety argument is unchanged and belongs here rather than at either call
15
+ * site. This runs at RENDER time, on a `ChannelRequest` the tagger has already
16
+ * finished building: the gate resolved the class, the budgets and the payload
17
+ * binding without this field existing, the payload hash was computed over bytes
18
+ * that do not contain it, and the log will record a decision that never
19
+ * mentions it. Nothing anywhere branches on the content of a gloss; the only
20
+ * thing that turns on it is whether one more line appears.
21
+ *
22
+ * What APRV-197 adds is an {@link GlossOutcome}. Absence used to be silent by
23
+ * design, and that was right for one request and wrong for a thousand: with the
24
+ * timeout set where APRV-144 set it, the subprocess missed EVERY time and the
25
+ * result was indistinguishable from the feature never having shipped. The
26
+ * outcome is returned so a caller can count, and count is all it is for — no
27
+ * caller retries, waits longer, or renders anything different because of it.
28
+ */
29
+ import { changePayloadView, commandPayloadView, emailPayloadFields, } from "../channels/payload-view.js";
30
+ import { claimed } from "../channels/contract.js";
31
+ import { glossAuthor, glossFor, GLOSS_EDIT_INSTRUCTION, GLOSS_EMAIL_INSTRUCTION, GLOSS_INSTRUCTION, } from "./gloss.js";
32
+ /**
33
+ * The request, plus a model's one-sentence gloss of its payload when one can be
34
+ * had.
35
+ *
36
+ * Every payload kind the renderer can read gets one (APRV-164): a command, a
37
+ * file change, an email. The kind is derived exactly as the WYSIWYS rendering
38
+ * derives it, from the structure of the bytes, so the sentence is about the
39
+ * material the approver is being shown and the two can never be about different
40
+ * payloads. An opaque payload gets none.
41
+ *
42
+ * Returns the request UNCHANGED for every flavour of "no answer". Losing the
43
+ * gloss costs one line on a prompt, which is why no failure here is allowed to
44
+ * cost anything more.
45
+ */
46
+ export function attachGloss(request, run) {
47
+ const asked = glossMaterial(request.fullPayload.value?.value);
48
+ if (asked === null)
49
+ return { request, outcome: "opaque" };
50
+ const result = glossFor(asked.instruction, asked.material, run);
51
+ if (result === null)
52
+ return { request, outcome: "absent" };
53
+ return {
54
+ request: { ...request, gloss: claimed(result.text, glossAuthor(result)) },
55
+ outcome: "attached",
56
+ };
57
+ }
58
+ /**
59
+ * The instruction and the material for one payload, or `null` for an opaque one.
60
+ *
61
+ * The material is assembled from the same structural views the canonical
62
+ * rendering is built from, and it is deliberately plain: labelled lines and the
63
+ * text itself, in the order the prompt shows them. Nothing here reads a
64
+ * self-declared kind field, for the reason `core/wysiwys.ts` gives at length —
65
+ * a payload that chose its own presentation would have chosen its own gloss too.
66
+ */
67
+ export function glossMaterial(value) {
68
+ const command = commandPayloadView(value);
69
+ if (command !== null) {
70
+ // Byte for byte what APRV-144 sent: the command alone, under the command
71
+ // instruction. A prompt that drifted here would change a shipped behaviour
72
+ // for no reason beyond the refactor that touched it.
73
+ return { instruction: GLOSS_INSTRUCTION, material: command.command };
74
+ }
75
+ const change = changePayloadView(value);
76
+ if (change !== null) {
77
+ const labels = change.labels.map((field) => `${field.label}: ${field.text}`);
78
+ const body = change.before === null
79
+ ? ["new content:", change.after]
80
+ : ["before:", change.before, "after:", change.after];
81
+ return { instruction: GLOSS_EDIT_INSTRUCTION, material: [...labels, ...body].join("\n") };
82
+ }
83
+ const email = emailPayloadFields(value);
84
+ if (email !== null) {
85
+ return {
86
+ instruction: GLOSS_EMAIL_INSTRUCTION,
87
+ material: email.map((field) => `${field.label}: ${field.text}`).join("\n"),
88
+ };
89
+ }
90
+ return null;
91
+ }
92
+ /**
93
+ * The stderr line that turns chronic silence into a visible fault (APRV-197 #3).
94
+ *
95
+ * One line, at the end of a walk or a dispatch cycle, and only when a model was
96
+ * actually asked and did not answer. It names the ceiling because that is the
97
+ * number an operator can act on, and it says the decision is unaffected because
98
+ * the first thing a reader of an approval tool's stderr needs to know is
99
+ * whether the thing they just approved was compromised by this. It was not:
100
+ * nothing downstream of a gloss exists.
101
+ */
102
+ export function glossAbsenceLine(surface, absent, asked, timeoutMs) {
103
+ return (`approval: ${surface}: ${absent} of ${asked} request(s) got no model gloss ` +
104
+ `(the \`claude -p\` subprocess was missing, failed, or exceeded ${timeoutMs}ms) — ` +
105
+ "the prompts are unaffected; a gloss is a reading aid the runtime never reads\n");
106
+ }
107
+ //# sourceMappingURL=gloss-attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gloss-attach.js","sourceRoot":"","sources":["../../../src/cli/gloss-attach.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Process-group supervisor for the synchronous Codex gloss runner (APRV-254).
3
+ *
4
+ * The public runner waits synchronously because GlossRunner is synchronous.
5
+ * This small child can still supervise Codex asynchronously, which lets it
6
+ * terminate the complete detached process group when the CLI times out or
7
+ * exceeds its output allowance. It never prints stderr or process errors.
8
+ */
9
+ import { spawn } from "node:child_process";
10
+ const OUTPUT_LIMIT_BYTES = 64 * 1024;
11
+ const EXIT_TIMEOUT = 124;
12
+ const EXIT_OUTPUT_LIMIT = 125;
13
+ const EXIT_SPAWN = 126;
14
+ function positiveInteger(raw) {
15
+ if (raw === undefined || !/^\d+$/u.test(raw))
16
+ return null;
17
+ const value = Number(raw);
18
+ return Number.isSafeInteger(value) && value > 0 ? value : null;
19
+ }
20
+ const executable = process.argv[2];
21
+ const timeoutMs = positiveInteger(process.argv[3]);
22
+ const cwd = process.argv[4];
23
+ const instruction = process.argv[5];
24
+ const argsJson = process.argv[6];
25
+ if (executable === undefined ||
26
+ timeoutMs === null ||
27
+ cwd === undefined ||
28
+ instruction === undefined ||
29
+ argsJson === undefined) {
30
+ process.exit(EXIT_SPAWN);
31
+ }
32
+ let prefixArgs;
33
+ try {
34
+ const parsed = JSON.parse(argsJson);
35
+ if (!Array.isArray(parsed) || parsed.some((value) => typeof value !== "string")) {
36
+ process.exit(EXIT_SPAWN);
37
+ }
38
+ prefixArgs = parsed;
39
+ }
40
+ catch {
41
+ process.exit(EXIT_SPAWN);
42
+ }
43
+ let child = null;
44
+ let terminal = false;
45
+ function killTree() {
46
+ const pid = child?.pid;
47
+ if (pid === undefined)
48
+ return;
49
+ try {
50
+ if (process.platform === "win32") {
51
+ const killer = spawn("taskkill", ["/pid", String(pid), "/t", "/f"], {
52
+ stdio: "ignore",
53
+ windowsHide: true,
54
+ });
55
+ killer.unref();
56
+ }
57
+ else {
58
+ process.kill(-pid, "SIGKILL");
59
+ }
60
+ }
61
+ catch {
62
+ try {
63
+ child?.kill("SIGKILL");
64
+ }
65
+ catch {
66
+ // The process has already exited.
67
+ }
68
+ }
69
+ }
70
+ function finish(code) {
71
+ if (terminal)
72
+ return;
73
+ terminal = true;
74
+ clearTimeout(timer);
75
+ if (code !== 0)
76
+ killTree();
77
+ process.exitCode = code;
78
+ }
79
+ process.on("SIGTERM", () => {
80
+ killTree();
81
+ process.exit(EXIT_TIMEOUT);
82
+ });
83
+ process.on("SIGINT", () => {
84
+ killTree();
85
+ process.exit(EXIT_TIMEOUT);
86
+ });
87
+ const chunks = [];
88
+ let outputBytes = 0;
89
+ let overflow = false;
90
+ try {
91
+ child = spawn(executable, [...prefixArgs, instruction], {
92
+ cwd,
93
+ detached: process.platform !== "win32",
94
+ env: process.env,
95
+ stdio: ["pipe", "pipe", "ignore"],
96
+ windowsHide: true,
97
+ });
98
+ }
99
+ catch {
100
+ process.exit(EXIT_SPAWN);
101
+ }
102
+ const timer = setTimeout(() => {
103
+ killTree();
104
+ finish(EXIT_TIMEOUT);
105
+ }, timeoutMs);
106
+ timer.unref();
107
+ child.on("error", () => finish(EXIT_SPAWN));
108
+ child.stdin?.on("error", () => finish(EXIT_SPAWN));
109
+ child.stdout?.on("data", (chunk) => {
110
+ if (overflow)
111
+ return;
112
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
113
+ outputBytes += bytes.byteLength;
114
+ if (outputBytes > OUTPUT_LIMIT_BYTES) {
115
+ overflow = true;
116
+ killTree();
117
+ return;
118
+ }
119
+ chunks.push(bytes);
120
+ });
121
+ child.on("close", (code, signal) => {
122
+ if (terminal)
123
+ return;
124
+ if (overflow) {
125
+ finish(EXIT_OUTPUT_LIMIT);
126
+ return;
127
+ }
128
+ if (signal !== null || code === null) {
129
+ finish(EXIT_SPAWN);
130
+ return;
131
+ }
132
+ if (code !== 0) {
133
+ finish(code > 0 && code < 124 ? code : 123);
134
+ return;
135
+ }
136
+ // A launcher may exit successfully while leaving native descendants alive.
137
+ // The detached group belongs solely to this one-shot invocation.
138
+ killTree();
139
+ const output = Buffer.concat(chunks);
140
+ process.stdout.write(output, (error) => finish(error == null ? 0 : EXIT_SPAWN));
141
+ });
142
+ let input = Buffer.alloc(0);
143
+ process.stdin.on("data", (chunk) => {
144
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
145
+ input = Buffer.concat([input, bytes]);
146
+ });
147
+ process.stdin.on("end", () => child?.stdin?.end(input));
148
+ process.stdin.resume();
149
+ //# sourceMappingURL=gloss-codex-child.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gloss-codex-child.js","sourceRoot":"","sources":["../../../src/cli/gloss-codex-child.ts"],"names":[],"mappings":"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"}