dorfl 0.14.2 → 0.15.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 (418) hide show
  1. package/dist/advance-ci-template.d.ts +17 -16
  2. package/dist/advance-ci-template.d.ts.map +1 -1
  3. package/dist/advance-ci-template.js +42 -53
  4. package/dist/advance-ci-template.js.map +1 -1
  5. package/dist/advance-drivers.d.ts +8 -0
  6. package/dist/advance-drivers.d.ts.map +1 -1
  7. package/dist/advance-drivers.js +28 -4
  8. package/dist/advance-drivers.js.map +1 -1
  9. package/dist/advance-isolated.d.ts.map +1 -1
  10. package/dist/advance-isolated.js +3 -2
  11. package/dist/advance-isolated.js.map +1 -1
  12. package/dist/advance-lifecycle-template.d.ts +41 -40
  13. package/dist/advance-lifecycle-template.d.ts.map +1 -1
  14. package/dist/advance-lifecycle-template.js +309 -489
  15. package/dist/advance-lifecycle-template.js.map +1 -1
  16. package/dist/advance-loop-driver.d.ts.map +1 -1
  17. package/dist/advance-loop-driver.js +3 -2
  18. package/dist/advance-loop-driver.js.map +1 -1
  19. package/dist/advance-treeless-publish.d.ts +31 -0
  20. package/dist/advance-treeless-publish.d.ts.map +1 -1
  21. package/dist/advance-treeless-publish.js +40 -0
  22. package/dist/advance-treeless-publish.js.map +1 -1
  23. package/dist/advance.d.ts +63 -3
  24. package/dist/advance.d.ts.map +1 -1
  25. package/dist/advance.js +80 -12
  26. package/dist/advance.js.map +1 -1
  27. package/dist/advancing-lock.d.ts +9 -0
  28. package/dist/advancing-lock.d.ts.map +1 -1
  29. package/dist/advancing-lock.js +21 -1
  30. package/dist/advancing-lock.js.map +1 -1
  31. package/dist/agent-env.d.ts +61 -0
  32. package/dist/agent-env.d.ts.map +1 -0
  33. package/dist/agent-env.js +144 -0
  34. package/dist/agent-env.js.map +1 -0
  35. package/dist/agent-stop.d.ts +35 -0
  36. package/dist/agent-stop.d.ts.map +1 -1
  37. package/dist/agent-stop.js +62 -0
  38. package/dist/agent-stop.js.map +1 -1
  39. package/dist/apply-merge-action.d.ts +76 -34
  40. package/dist/apply-merge-action.d.ts.map +1 -1
  41. package/dist/apply-merge-action.js +339 -129
  42. package/dist/apply-merge-action.js.map +1 -1
  43. package/dist/apply-stuck-action.js +2 -2
  44. package/dist/apply-stuck-action.js.map +1 -1
  45. package/dist/ci-agent-result.d.ts +151 -0
  46. package/dist/ci-agent-result.d.ts.map +1 -0
  47. package/dist/ci-agent-result.js +314 -0
  48. package/dist/ci-agent-result.js.map +1 -0
  49. package/dist/ci-handoff-apply.d.ts +162 -0
  50. package/dist/ci-handoff-apply.d.ts.map +1 -0
  51. package/dist/ci-handoff-apply.js +497 -0
  52. package/dist/ci-handoff-apply.js.map +1 -0
  53. package/dist/ci-handoff-format.d.ts +369 -0
  54. package/dist/ci-handoff-format.d.ts.map +1 -0
  55. package/dist/ci-handoff-format.js +646 -0
  56. package/dist/ci-handoff-format.js.map +1 -0
  57. package/dist/ci-handoff-lfs.d.ts +146 -0
  58. package/dist/ci-handoff-lfs.d.ts.map +1 -0
  59. package/dist/ci-handoff-lfs.js +397 -0
  60. package/dist/ci-handoff-lfs.js.map +1 -0
  61. package/dist/ci-handoff.d.ts +99 -0
  62. package/dist/ci-handoff.d.ts.map +1 -0
  63. package/dist/ci-handoff.js +277 -0
  64. package/dist/ci-handoff.js.map +1 -0
  65. package/dist/ci-lock-outputs.d.ts +93 -0
  66. package/dist/ci-lock-outputs.d.ts.map +1 -0
  67. package/dist/ci-lock-outputs.js +223 -0
  68. package/dist/ci-lock-outputs.js.map +1 -0
  69. package/dist/ci-phase-build.d.ts +178 -0
  70. package/dist/ci-phase-build.d.ts.map +1 -0
  71. package/dist/ci-phase-build.js +989 -0
  72. package/dist/ci-phase-build.js.map +1 -0
  73. package/dist/ci-phase-driver.d.ts +247 -0
  74. package/dist/ci-phase-driver.d.ts.map +1 -0
  75. package/dist/ci-phase-driver.js +370 -0
  76. package/dist/ci-phase-driver.js.map +1 -0
  77. package/dist/ci-phase-intake.d.ts +172 -0
  78. package/dist/ci-phase-intake.d.ts.map +1 -0
  79. package/dist/ci-phase-intake.js +555 -0
  80. package/dist/ci-phase-intake.js.map +1 -0
  81. package/dist/ci-phase-tasking.d.ts +205 -0
  82. package/dist/ci-phase-tasking.d.ts.map +1 -0
  83. package/dist/ci-phase-tasking.js +906 -0
  84. package/dist/ci-phase-tasking.js.map +1 -0
  85. package/dist/ci-phase-treeless.d.ts +224 -0
  86. package/dist/ci-phase-treeless.d.ts.map +1 -0
  87. package/dist/ci-phase-treeless.js +1482 -0
  88. package/dist/ci-phase-treeless.js.map +1 -0
  89. package/dist/ci-read-token.d.ts +47 -0
  90. package/dist/ci-read-token.d.ts.map +1 -0
  91. package/dist/ci-read-token.js +80 -0
  92. package/dist/ci-read-token.js.map +1 -0
  93. package/dist/cli.d.ts.map +1 -1
  94. package/dist/cli.js +447 -22
  95. package/dist/cli.js.map +1 -1
  96. package/dist/close-job-template.d.ts +10 -1
  97. package/dist/close-job-template.d.ts.map +1 -1
  98. package/dist/close-job-template.js +46 -14
  99. package/dist/close-job-template.js.map +1 -1
  100. package/dist/close-job.d.ts +20 -5
  101. package/dist/close-job.d.ts.map +1 -1
  102. package/dist/close-job.js +65 -12
  103. package/dist/close-job.js.map +1 -1
  104. package/dist/complete.d.ts.map +1 -1
  105. package/dist/complete.js +20 -1
  106. package/dist/complete.js.map +1 -1
  107. package/dist/config.d.ts +41 -44
  108. package/dist/config.d.ts.map +1 -1
  109. package/dist/config.js +2 -4
  110. package/dist/config.js.map +1 -1
  111. package/dist/continue-branch.d.ts +63 -15
  112. package/dist/continue-branch.d.ts.map +1 -1
  113. package/dist/continue-branch.js +75 -8
  114. package/dist/continue-branch.js.map +1 -1
  115. package/dist/crashed-run-save.d.ts +73 -0
  116. package/dist/crashed-run-save.d.ts.map +1 -0
  117. package/dist/crashed-run-save.js +86 -0
  118. package/dist/crashed-run-save.js.map +1 -0
  119. package/dist/cwd-section.d.ts.map +1 -1
  120. package/dist/cwd-section.js +10 -2
  121. package/dist/cwd-section.js.map +1 -1
  122. package/dist/decision-engine.d.ts +10 -0
  123. package/dist/decision-engine.d.ts.map +1 -1
  124. package/dist/decision-engine.js.map +1 -1
  125. package/dist/do-config.d.ts +2 -24
  126. package/dist/do-config.d.ts.map +1 -1
  127. package/dist/do-config.js +1 -33
  128. package/dist/do-config.js.map +1 -1
  129. package/dist/do.d.ts +149 -1
  130. package/dist/do.d.ts.map +1 -1
  131. package/dist/do.js +115 -25
  132. package/dist/do.js.map +1 -1
  133. package/dist/dorfl-item-template.d.ts +98 -0
  134. package/dist/dorfl-item-template.d.ts.map +1 -0
  135. package/dist/dorfl-item-template.js +504 -0
  136. package/dist/dorfl-item-template.js.map +1 -0
  137. package/dist/env-config.d.ts.map +1 -1
  138. package/dist/env-config.js +7 -5
  139. package/dist/env-config.js.map +1 -1
  140. package/dist/frontmatter.d.ts +52 -0
  141. package/dist/frontmatter.d.ts.map +1 -1
  142. package/dist/frontmatter.js +136 -2
  143. package/dist/frontmatter.js.map +1 -1
  144. package/dist/gc.d.ts +13 -0
  145. package/dist/gc.d.ts.map +1 -1
  146. package/dist/gc.js +16 -2
  147. package/dist/gc.js.map +1 -1
  148. package/dist/git.d.ts +18 -1
  149. package/dist/git.d.ts.map +1 -1
  150. package/dist/git.js +70 -5
  151. package/dist/git.js.map +1 -1
  152. package/dist/harness.d.ts +44 -5
  153. package/dist/harness.d.ts.map +1 -1
  154. package/dist/harness.js +24 -1
  155. package/dist/harness.js.map +1 -1
  156. package/dist/index.d.ts +11 -4
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +7 -3
  159. package/dist/index.js.map +1 -1
  160. package/dist/install-ci-action-pins.d.ts +123 -0
  161. package/dist/install-ci-action-pins.d.ts.map +1 -0
  162. package/dist/install-ci-action-pins.js +190 -0
  163. package/dist/install-ci-action-pins.js.map +1 -0
  164. package/dist/install-ci-actions-pr-creation.d.ts +70 -0
  165. package/dist/install-ci-actions-pr-creation.d.ts.map +1 -0
  166. package/dist/install-ci-actions-pr-creation.js +106 -0
  167. package/dist/install-ci-actions-pr-creation.js.map +1 -0
  168. package/dist/install-ci-capabilities/dorfl-item.d.ts +12 -0
  169. package/dist/install-ci-capabilities/dorfl-item.d.ts.map +1 -0
  170. package/dist/install-ci-capabilities/dorfl-item.js +26 -0
  171. package/dist/install-ci-capabilities/dorfl-item.js.map +1 -0
  172. package/dist/install-ci-core.d.ts +155 -37
  173. package/dist/install-ci-core.d.ts.map +1 -1
  174. package/dist/install-ci-core.js +304 -200
  175. package/dist/install-ci-core.js.map +1 -1
  176. package/dist/install-ci-github.d.ts +47 -2
  177. package/dist/install-ci-github.d.ts.map +1 -1
  178. package/dist/install-ci-github.js +113 -1
  179. package/dist/install-ci-github.js.map +1 -1
  180. package/dist/install-ci.d.ts +25 -6
  181. package/dist/install-ci.d.ts.map +1 -1
  182. package/dist/install-ci.js +72 -36
  183. package/dist/install-ci.js.map +1 -1
  184. package/dist/intake-marker.d.ts +6 -1
  185. package/dist/intake-marker.d.ts.map +1 -1
  186. package/dist/intake-marker.js.map +1 -1
  187. package/dist/intake-triage.d.ts.map +1 -1
  188. package/dist/intake-triage.js +6 -2
  189. package/dist/intake-triage.js.map +1 -1
  190. package/dist/intake-trigger-template.d.ts +31 -25
  191. package/dist/intake-trigger-template.d.ts.map +1 -1
  192. package/dist/intake-trigger-template.js +107 -292
  193. package/dist/intake-trigger-template.js.map +1 -1
  194. package/dist/intake.d.ts +186 -4
  195. package/dist/intake.d.ts.map +1 -1
  196. package/dist/intake.js +533 -416
  197. package/dist/intake.js.map +1 -1
  198. package/dist/integration-core.d.ts +154 -1
  199. package/dist/integration-core.d.ts.map +1 -1
  200. package/dist/integration-core.js +759 -486
  201. package/dist/integration-core.js.map +1 -1
  202. package/dist/integrator.d.ts +12 -0
  203. package/dist/integrator.d.ts.map +1 -1
  204. package/dist/integrator.js +21 -0
  205. package/dist/integrator.js.map +1 -1
  206. package/dist/isolation.d.ts +12 -2
  207. package/dist/isolation.d.ts.map +1 -1
  208. package/dist/isolation.js +19 -8
  209. package/dist/isolation.js.map +1 -1
  210. package/dist/item-lock.d.ts +93 -11
  211. package/dist/item-lock.d.ts.map +1 -1
  212. package/dist/item-lock.js +233 -65
  213. package/dist/item-lock.js.map +1 -1
  214. package/dist/land-question-residue.d.ts +58 -0
  215. package/dist/land-question-residue.d.ts.map +1 -0
  216. package/dist/land-question-residue.js +95 -0
  217. package/dist/land-question-residue.js.map +1 -0
  218. package/dist/lifecycle-gather.d.ts +16 -0
  219. package/dist/lifecycle-gather.d.ts.map +1 -1
  220. package/dist/lifecycle-gather.js +54 -6
  221. package/dist/lifecycle-gather.js.map +1 -1
  222. package/dist/merge-answer.d.ts +41 -0
  223. package/dist/merge-answer.d.ts.map +1 -0
  224. package/dist/merge-answer.js +60 -0
  225. package/dist/merge-answer.js.map +1 -0
  226. package/dist/merge-question-surfacer.d.ts +105 -30
  227. package/dist/merge-question-surfacer.d.ts.map +1 -1
  228. package/dist/merge-question-surfacer.js +202 -91
  229. package/dist/merge-question-surfacer.js.map +1 -1
  230. package/dist/merge-question-tick.d.ts +64 -0
  231. package/dist/merge-question-tick.d.ts.map +1 -0
  232. package/dist/merge-question-tick.js +96 -0
  233. package/dist/merge-question-tick.js.map +1 -0
  234. package/dist/mint-adr.d.ts.map +1 -1
  235. package/dist/mint-adr.js +20 -2
  236. package/dist/mint-adr.js.map +1 -1
  237. package/dist/needs-attention.d.ts +72 -2
  238. package/dist/needs-attention.d.ts.map +1 -1
  239. package/dist/needs-attention.js +275 -38
  240. package/dist/needs-attention.js.map +1 -1
  241. package/dist/phase-recorder.d.ts +168 -0
  242. package/dist/phase-recorder.d.ts.map +1 -0
  243. package/dist/phase-recorder.js +218 -0
  244. package/dist/phase-recorder.js.map +1 -0
  245. package/dist/phase.d.ts +94 -0
  246. package/dist/phase.d.ts.map +1 -0
  247. package/dist/phase.js +148 -0
  248. package/dist/phase.js.map +1 -0
  249. package/dist/pi-harness.d.ts.map +1 -1
  250. package/dist/pi-harness.js +19 -6
  251. package/dist/pi-harness.js.map +1 -1
  252. package/dist/prepare.d.ts.map +1 -1
  253. package/dist/prepare.js +4 -0
  254. package/dist/prepare.js.map +1 -1
  255. package/dist/prompt.d.ts +4 -0
  256. package/dist/prompt.d.ts.map +1 -1
  257. package/dist/prompt.js +48 -1
  258. package/dist/prompt.js.map +1 -1
  259. package/dist/protocol/CLAIM-PROTOCOL.md +3 -1
  260. package/dist/protocol/WORK-CONTRACT.md +1 -1
  261. package/dist/reap-branches.d.ts +48 -0
  262. package/dist/reap-branches.d.ts.map +1 -1
  263. package/dist/reap-branches.js +64 -0
  264. package/dist/reap-branches.js.map +1 -1
  265. package/dist/ref-write.d.ts +198 -0
  266. package/dist/ref-write.d.ts.map +1 -0
  267. package/dist/ref-write.js +79 -0
  268. package/dist/ref-write.js.map +1 -0
  269. package/dist/repo-config.js +8 -8
  270. package/dist/repo-config.js.map +1 -1
  271. package/dist/repo-mirror.d.ts +36 -0
  272. package/dist/repo-mirror.d.ts.map +1 -1
  273. package/dist/repo-mirror.js +91 -1
  274. package/dist/repo-mirror.js.map +1 -1
  275. package/dist/review-verdict.d.ts +1 -1
  276. package/dist/review-verdict.js +1 -1
  277. package/dist/run.d.ts +7 -1
  278. package/dist/run.d.ts.map +1 -1
  279. package/dist/run.js +28 -4
  280. package/dist/run.js.map +1 -1
  281. package/dist/scan.d.ts +19 -1
  282. package/dist/scan.d.ts.map +1 -1
  283. package/dist/scan.js +21 -8
  284. package/dist/scan.js.map +1 -1
  285. package/dist/sidecar.d.ts +14 -0
  286. package/dist/sidecar.d.ts.map +1 -1
  287. package/dist/sidecar.js +21 -0
  288. package/dist/sidecar.js.map +1 -1
  289. package/dist/single-job-warning.d.ts +63 -0
  290. package/dist/single-job-warning.d.ts.map +1 -0
  291. package/dist/single-job-warning.js +110 -0
  292. package/dist/single-job-warning.js.map +1 -0
  293. package/dist/skills/setup/protocol/CLAIM-PROTOCOL.md +3 -1
  294. package/dist/skills/setup/protocol/WORK-CONTRACT.md +1 -1
  295. package/dist/spec-complete.d.ts +13 -6
  296. package/dist/spec-complete.d.ts.map +1 -1
  297. package/dist/spec-complete.js +23 -11
  298. package/dist/spec-complete.js.map +1 -1
  299. package/dist/start.d.ts.map +1 -1
  300. package/dist/start.js +47 -14
  301. package/dist/start.js.map +1 -1
  302. package/dist/status.d.ts +12 -0
  303. package/dist/status.d.ts.map +1 -1
  304. package/dist/status.js +11 -3
  305. package/dist/status.js.map +1 -1
  306. package/dist/tasking.d.ts +246 -1
  307. package/dist/tasking.d.ts.map +1 -1
  308. package/dist/tasking.js +452 -358
  309. package/dist/tasking.js.map +1 -1
  310. package/dist/triage-persist.d.ts.map +1 -1
  311. package/dist/triage-persist.js +21 -2
  312. package/dist/triage-persist.js.map +1 -1
  313. package/dist/verify-workflow-template.d.ts.map +1 -1
  314. package/dist/verify-workflow-template.js +8 -4
  315. package/dist/verify-workflow-template.js.map +1 -1
  316. package/dist/verify.d.ts.map +1 -1
  317. package/dist/verify.js +4 -0
  318. package/dist/verify.js.map +1 -1
  319. package/dist/watch-session.d.ts +42 -13
  320. package/dist/watch-session.d.ts.map +1 -1
  321. package/dist/watch-session.js +52 -23
  322. package/dist/watch-session.js.map +1 -1
  323. package/dist/work-layout.d.ts +10 -4
  324. package/dist/work-layout.d.ts.map +1 -1
  325. package/dist/work-layout.js +11 -3
  326. package/dist/work-layout.js.map +1 -1
  327. package/dist/workspace.d.ts +65 -4
  328. package/dist/workspace.d.ts.map +1 -1
  329. package/dist/workspace.js +159 -11
  330. package/dist/workspace.js.map +1 -1
  331. package/package.json +1 -1
  332. package/src/advance-ci-template.ts +80 -81
  333. package/src/advance-drivers.ts +45 -6
  334. package/src/advance-isolated.ts +3 -5
  335. package/src/advance-lifecycle-template.ts +375 -538
  336. package/src/advance-loop-driver.ts +3 -5
  337. package/src/advance-treeless-publish.ts +61 -0
  338. package/src/advance.ts +145 -15
  339. package/src/advancing-lock.ts +36 -1
  340. package/src/agent-env.ts +174 -0
  341. package/src/agent-stop.ts +81 -0
  342. package/src/apply-merge-action.ts +401 -154
  343. package/src/apply-stuck-action.ts +2 -2
  344. package/src/ci-agent-result.ts +421 -0
  345. package/src/ci-handoff-apply.ts +737 -0
  346. package/src/ci-handoff-format.ts +926 -0
  347. package/src/ci-handoff-lfs.ts +519 -0
  348. package/src/ci-handoff.ts +392 -0
  349. package/src/ci-lock-outputs.ts +273 -0
  350. package/src/ci-phase-build.ts +1328 -0
  351. package/src/ci-phase-driver.ts +548 -0
  352. package/src/ci-phase-intake.ts +861 -0
  353. package/src/ci-phase-tasking.ts +1255 -0
  354. package/src/ci-phase-treeless.ts +2028 -0
  355. package/src/ci-read-token.ts +90 -0
  356. package/src/cli.ts +591 -29
  357. package/src/close-job-template.ts +52 -15
  358. package/src/close-job.ts +77 -12
  359. package/src/complete.ts +19 -1
  360. package/src/config.ts +43 -48
  361. package/src/continue-branch.ts +121 -16
  362. package/src/crashed-run-save.ts +162 -0
  363. package/src/cwd-section.ts +10 -0
  364. package/src/decision-engine.ts +10 -0
  365. package/src/do-config.ts +2 -57
  366. package/src/do.ts +170 -28
  367. package/src/dorfl-item-template.ts +556 -0
  368. package/src/env-config.ts +7 -5
  369. package/src/frontmatter.ts +155 -2
  370. package/src/gc.ts +27 -2
  371. package/src/git.ts +83 -5
  372. package/src/harness.ts +58 -6
  373. package/src/index.ts +50 -1
  374. package/src/install-ci-action-pins.ts +209 -0
  375. package/src/install-ci-actions-pr-creation.ts +186 -0
  376. package/src/install-ci-capabilities/dorfl-item.ts +33 -0
  377. package/src/install-ci-core.ts +388 -233
  378. package/src/install-ci-github.ts +149 -1
  379. package/src/install-ci.ts +83 -37
  380. package/src/intake-marker.ts +6 -1
  381. package/src/intake-triage.ts +7 -3
  382. package/src/intake-trigger-template.ts +126 -327
  383. package/src/intake.ts +725 -544
  384. package/src/integration-core.ts +975 -523
  385. package/src/integrator.ts +28 -0
  386. package/src/isolation.ts +29 -10
  387. package/src/item-lock.ts +308 -92
  388. package/src/land-question-residue.ts +122 -0
  389. package/src/lifecycle-gather.ts +82 -10
  390. package/src/merge-answer.ts +82 -0
  391. package/src/merge-question-surfacer.ts +320 -112
  392. package/src/merge-question-tick.ts +182 -0
  393. package/src/mint-adr.ts +28 -2
  394. package/src/needs-attention.ts +350 -42
  395. package/src/phase-recorder.ts +350 -0
  396. package/src/phase.ts +177 -0
  397. package/src/pi-harness.ts +25 -5
  398. package/src/prepare.ts +4 -0
  399. package/src/prompt.ts +68 -1
  400. package/src/reap-branches.ts +107 -0
  401. package/src/ref-write.ts +324 -0
  402. package/src/repo-config.ts +8 -8
  403. package/src/repo-mirror.ts +107 -1
  404. package/src/review-verdict.ts +1 -1
  405. package/src/run.ts +47 -6
  406. package/src/scan.ts +37 -7
  407. package/src/sidecar.ts +36 -0
  408. package/src/single-job-warning.ts +135 -0
  409. package/src/spec-complete.ts +36 -14
  410. package/src/start.ts +55 -16
  411. package/src/status.ts +29 -3
  412. package/src/tasking.ts +593 -378
  413. package/src/triage-persist.ts +24 -2
  414. package/src/verify-workflow-template.ts +8 -4
  415. package/src/verify.ts +4 -0
  416. package/src/watch-session.ts +86 -28
  417. package/src/work-layout.ts +11 -3
  418. package/src/workspace.ts +210 -14
@@ -0,0 +1,646 @@
1
+ /**
2
+ * **The CI handoff record: `handoff.json` schema v1 and its intent table**
3
+ * (spec `ci-agent-job-without-write-token`, ADR
4
+ * `ci-agent-job-holds-no-write-token`).
5
+ *
6
+ * In CI every item runs as three jobs: **lock** (write token, no agent),
7
+ * **agent** (read-only token) and **apply** (write token, no agent). The agent
8
+ * job hands its results to the apply job through ONE artifact per item run (the
9
+ * file I/O is `ci-handoff.ts`). Named "CI handoff" to keep it apart from the
10
+ * requeue "handoff note" (`prompt.ts`), an unrelated human-written body section.
11
+ *
12
+ * `handoff.json` is `{schema: 1, item, intent: {kind}, products}`. `intent` is
13
+ * the closed union of the 15 kinds, one per boundary; `products` holds the
14
+ * bounded fields the agent phase produced (texts, verdict enums, booleans).
15
+ *
16
+ * **The security contract is {@link HANDOFF_INTENT_TABLE}.** For every intent
17
+ * it lists what the apply job recomputes from trusted inputs, the ONLY fields
18
+ * it takes from the record, whether a bundle comes with it, and the tail
19
+ * function the apply job resumes at. A field outside a row's `record` column is
20
+ * REJECTED, never ignored, so a record cannot smuggle a target, a mode or a path
21
+ * the apply job must derive itself. Which intents a run may hand over is bounded
22
+ * by its TRUSTED rung (a lock-job output): a surface run cannot hand over
23
+ * `integrate`. Every limit is a constant here, never read from the artifact.
24
+ */
25
+ import { PR_TITLE_MAX } from './integration-core.js';
26
+ import { isSafeSlug } from './slug-safety.js';
27
+ import { parseSlugArg } from './slug-namespace.js';
28
+ /** The only `schema` value this dorfl reads or writes. */
29
+ export const HANDOFF_SCHEMA = 1;
30
+ const MB = 1024 * 1024;
31
+ /**
32
+ * The size limits (spec, "Size limits"), set in code and never read from the
33
+ * artifact. Byte limits are on file sizes; character limits are on JavaScript
34
+ * string length (UTF-16 code units, never fewer than the characters GitHub
35
+ * counts).
36
+ */
37
+ export const HANDOFF_LIMITS = {
38
+ /** Every file of the extracted artifact together. */
39
+ artifactBytes: 200 * MB,
40
+ /** `work.bundle`. */
41
+ bundleBytes: 100 * MB,
42
+ /** One blob inside the bundle (enforced by the bundle content validation). */
43
+ blobBytes: 20 * MB,
44
+ /** Every file under `lfs/` together. */
45
+ lfsBytes: 500 * MB,
46
+ /** `handoff.json`. */
47
+ handoffJsonBytes: 2 * MB,
48
+ /** A PR title (the existing {@link PR_TITLE_MAX}). */
49
+ prTitleChars: PR_TITLE_MAX,
50
+ /** A PR body, and every text posted as one comment (under GitHub's 65,536). */
51
+ commentChars: 60_000,
52
+ /** Each reason or question (and a surfaced question's context and default). */
53
+ reasonChars: 10_000,
54
+ /**
55
+ * A drafted document title (task, spec or ADR `title:`). Not in the spec's
56
+ * list: a single line that becomes frontmatter, so it gets a tight bound.
57
+ */
58
+ documentTitleChars: 200,
59
+ /**
60
+ * A whole document (a candidate task file, a drafted task/spec/ADR body, the
61
+ * trimmed spec body). Not in the spec's list: the largest spec in this repo
62
+ * is about 52,000 characters, so the comment limit would be too tight. All
63
+ * documents together are still bounded by `handoffJsonBytes`.
64
+ */
65
+ documentChars: 200_000,
66
+ };
67
+ let byteLimitsOverride;
68
+ /**
69
+ * The byte limits in force: {@link HANDOFF_LIMITS}, unless a test lowered some
70
+ * of them with {@link setHandoffByteLimitsForTest} (so a size-limit test does
71
+ * not need a 200 MB fixture). Nothing read from an artifact reaches this.
72
+ */
73
+ export function handoffByteLimits() {
74
+ return {
75
+ artifactBytes: HANDOFF_LIMITS.artifactBytes,
76
+ bundleBytes: HANDOFF_LIMITS.bundleBytes,
77
+ blobBytes: HANDOFF_LIMITS.blobBytes,
78
+ lfsBytes: HANDOFF_LIMITS.lfsBytes,
79
+ handoffJsonBytes: HANDOFF_LIMITS.handoffJsonBytes,
80
+ ...byteLimitsOverride,
81
+ };
82
+ }
83
+ /** Lower some byte limits (tests only); `undefined` restores the production values. */
84
+ export function setHandoffByteLimitsForTest(override) {
85
+ byteLimitsOverride = override;
86
+ }
87
+ /** A handoff (or one being written) that breaks one of the rules. */
88
+ export class HandoffRejected extends Error {
89
+ rule;
90
+ constructor(rule, message) {
91
+ super(`handoff rejected (${rule}): ${message}`);
92
+ this.rule = rule;
93
+ this.name = 'HandoffRejected';
94
+ }
95
+ }
96
+ /** Throw a {@link HandoffRejected}. */
97
+ export function rejectHandoff(rule, message) {
98
+ throw new HandoffRejected(rule, message);
99
+ }
100
+ const reject = rejectHandoff;
101
+ // ---------------------------------------------------------------------------
102
+ // Rungs and intent kinds
103
+ // ---------------------------------------------------------------------------
104
+ /**
105
+ * The trusted rung the lock job classified (its `rung` output): the agent
106
+ * rungs of `advance-classify.ts` (`TickRungKind`) plus `intake`. It bounds
107
+ * which intents the run may hand over.
108
+ */
109
+ export const HANDOFF_RUNGS = [
110
+ 'build-task',
111
+ 'task-spec',
112
+ 'surface',
113
+ 'triage-observation',
114
+ 'apply',
115
+ 'intake',
116
+ ];
117
+ /** The 15 intent kinds (spec, "The intent kinds"). */
118
+ export const HANDOFF_INTENT_KINDS = [
119
+ 'integrate',
120
+ 'merge-restale',
121
+ 'needs-attention',
122
+ 'deadline-checkpoint',
123
+ 'stop',
124
+ 'agent-failed',
125
+ 'tasking-land',
126
+ 'tasking-surface',
127
+ 'surface',
128
+ 'triage',
129
+ 'apply-decision',
130
+ 'intake-ask',
131
+ 'intake-bounce',
132
+ 'intake-task',
133
+ 'intake-spec',
134
+ ];
135
+ /** The agent-stop kinds a `stop` carries (`agent-stop.ts` `AgentStopKind`). */
136
+ export const STOP_KINDS = ['sentinel', 'empty-diff'];
137
+ /** The triage gate's dispositions (`keep` is the fall-through to surface). */
138
+ export const TRIAGE_DISPOSITIONS = ['keep', 'duplicate', 'map'];
139
+ /** The agentic apply decision's outcomes (`APPLY_ALLOWED_OUTCOMES`). */
140
+ export const APPLY_DECISION_OUTCOMES = [
141
+ 'task',
142
+ 'spec',
143
+ 'adr',
144
+ 'dispose',
145
+ 'resolve',
146
+ 'ask',
147
+ ];
148
+ /** The task-set review verdict of `tasking-land`. */
149
+ export const REVIEW_VERDICTS = ['approve', 'block'];
150
+ const L = HANDOFF_LIMITS;
151
+ const line = (maxChars, required = true) => ({
152
+ type: 'line',
153
+ maxChars,
154
+ required,
155
+ });
156
+ const text = (maxChars, required = true) => ({
157
+ type: 'text',
158
+ maxChars,
159
+ required,
160
+ });
161
+ const textList = (maxChars, required = true) => ({
162
+ type: 'text-list',
163
+ maxChars,
164
+ required,
165
+ });
166
+ const questionList = (maxChars, required = true) => ({
167
+ type: 'question-list',
168
+ maxChars,
169
+ required,
170
+ });
171
+ const oneOf = (values, required = true) => ({
172
+ type: 'enum',
173
+ values,
174
+ required,
175
+ });
176
+ const docs = () => ({
177
+ type: 'documents',
178
+ maxChars: L.documentChars,
179
+ required: true,
180
+ });
181
+ const NO_BUNDLE = { rule: 'none', carries: 'none' };
182
+ const INTAKE_DOCUMENT_RECOMPUTED = [
183
+ 'issue number',
184
+ 'placement',
185
+ 'origin-trust stamp',
186
+ 'document mode',
187
+ 'seen comment ids',
188
+ 'the slug (derived from the verdict, then checked by slug-safety.ts)',
189
+ ];
190
+ const INTAKE_DOCUMENT_RESUME = 'render the document, switchToWorkBranch, performIntegration, completion comment, label removal';
191
+ /**
192
+ * The intent table, carried from the spec row by row. `integrate` has two rows
193
+ * (build on the `build-task` rung, answered merge on the `apply` rung); the
194
+ * spec's shared `intake-task` / `intake-spec` row is split in two here because
195
+ * only the spec variant carries the two gate booleans.
196
+ */
197
+ export const HANDOFF_INTENT_TABLE = [
198
+ {
199
+ row: 'integrate-build',
200
+ kind: 'integrate',
201
+ rungs: ['build-task'],
202
+ recomputed: [
203
+ 'item',
204
+ 'work branch name',
205
+ 'arbiter',
206
+ 'integration mode (workflow flag, then the untrusted-origin rule on the task at baseSha)',
207
+ 'deleteMergedHead',
208
+ ],
209
+ record: {
210
+ prTitle: line(L.prTitleChars),
211
+ prBody: text(L.commentChars),
212
+ reviewProse: text(L.commentChars, false),
213
+ },
214
+ bundle: { rule: 'required', carries: 'work branch tip (done-move included)' },
215
+ resumesAt: 'the land half of runRebaseToIntegrateTail (the applyCompleteTransition loop), then the review comment, then the lock release',
216
+ },
217
+ {
218
+ row: 'integrate-answered-merge',
219
+ kind: 'integrate',
220
+ rungs: ['apply'],
221
+ recomputed: [
222
+ 'item',
223
+ 'branch',
224
+ 'mode merge',
225
+ 'the answered kind: merge entry read from main',
226
+ ],
227
+ record: {},
228
+ bundle: { rule: 'required', carries: 'rebased tip of work/task-<slug>' },
229
+ resumesAt: 'the same land loop, then applyAnsweredQuestions, the tree-less publish and the release',
230
+ },
231
+ {
232
+ row: 'merge-restale',
233
+ kind: 'merge-restale',
234
+ rungs: ['apply'],
235
+ recomputed: ['item', 'the answered entry'],
236
+ record: {},
237
+ bundle: NO_BUNDLE,
238
+ resumesAt: 'the strictMergeApproval follow-up question and re-pause, publish, release',
239
+ },
240
+ {
241
+ row: 'needs-attention',
242
+ kind: 'needs-attention',
243
+ rungs: ['build-task', 'apply'],
244
+ recomputed: ['item', 'branch', 'sidecar path'],
245
+ record: {
246
+ reason: text(L.reasonChars),
247
+ questions: textList(L.reasonChars, false),
248
+ },
249
+ bundle: { rule: 'optional', carries: 'WIP tip, if any' },
250
+ resumesAt: 'the write half of routeToNeedsAttention (branch push) and the surface (sidecar, needsAnswers: true), then the release',
251
+ },
252
+ {
253
+ row: 'deadline-checkpoint',
254
+ kind: 'deadline-checkpoint',
255
+ rungs: ['build-task'],
256
+ recomputed: ['item', 'branch', 'maxAutoCheckpoints from config at baseSha'],
257
+ record: {},
258
+ bundle: {
259
+ rule: 'required',
260
+ carries: 'WIP tip; the checkpoint count is recounted from the new commits',
261
+ },
262
+ resumesAt: 'the write half of routeDeadlineCheckpoint: branch push, then auto-continue release or surface',
263
+ },
264
+ {
265
+ row: 'stop',
266
+ kind: 'stop',
267
+ rungs: ['build-task'],
268
+ recomputed: ['item', 'branch'],
269
+ record: { reason: text(L.reasonChars), stopKind: oneOf(STOP_KINDS) },
270
+ bundle: { rule: 'optional', carries: 'WIP tip, if any' },
271
+ resumesAt: 'the write half of saveAgentStop',
272
+ },
273
+ {
274
+ row: 'agent-failed',
275
+ kind: 'agent-failed',
276
+ rungs: ['build-task'],
277
+ recomputed: ['item', 'branch'],
278
+ record: { failureDetail: text(L.reasonChars) },
279
+ bundle: { rule: 'optional', carries: 'WIP tip, if any' },
280
+ resumesAt: 'the write half of saveAgentFailure',
281
+ },
282
+ {
283
+ row: 'tasking-land',
284
+ kind: 'tasking-land',
285
+ rungs: ['task-spec'],
286
+ recomputed: [
287
+ 'spec slug',
288
+ 'the spec move to specs/tasked/',
289
+ 'candidate folder (work/tasks/backlog/)',
290
+ 'mode',
291
+ 'the origin stamp and gate keys of the spec at baseSha',
292
+ ],
293
+ record: {
294
+ candidates: docs(),
295
+ prBody: text(L.commentChars),
296
+ reviewVerdict: oneOf(REVIEW_VERDICTS, false),
297
+ reviewProse: text(L.commentChars, false),
298
+ specBody: text(L.documentChars),
299
+ },
300
+ bundle: NO_BUNDLE,
301
+ resumesAt: 'the tasking integrate with the review OFF (it ran in the agent phase), then the release',
302
+ },
303
+ {
304
+ row: 'tasking-surface',
305
+ kind: 'tasking-surface',
306
+ rungs: ['task-spec'],
307
+ recomputed: ['spec slug', 'branch work/spec-<slug>', 'mode'],
308
+ record: {
309
+ candidates: docs(),
310
+ reason: text(L.reasonChars),
311
+ questions: textList(L.reasonChars, false),
312
+ },
313
+ bundle: NO_BUNDLE,
314
+ resumesAt: 'persistTaskingCandidates (commit rebuilt in the apply job), closeRequestOnBranch in propose mode, surfaceTaskingBlock',
315
+ },
316
+ {
317
+ row: 'surface',
318
+ kind: 'surface',
319
+ rungs: ['surface'],
320
+ recomputed: [
321
+ 'item',
322
+ 'item path at baseSha',
323
+ 'sidecar path',
324
+ 'engine-built base questions',
325
+ ],
326
+ record: { questions: questionList(L.reasonChars) },
327
+ bundle: NO_BUNDLE,
328
+ resumesAt: 'persistSurfacedQuestions, publish, release',
329
+ },
330
+ {
331
+ row: 'triage',
332
+ kind: 'triage',
333
+ rungs: ['triage-observation'],
334
+ recomputed: [
335
+ 'item',
336
+ 'the resolved observationTriage gate',
337
+ 'the engine-built triage question',
338
+ 'the note at baseSha',
339
+ ],
340
+ record: {
341
+ disposition: oneOf(TRIAGE_DISPOSITIONS),
342
+ target: { type: 'item-ref', required: false },
343
+ reason: text(L.reasonChars, false),
344
+ questions: questionList(L.reasonChars, false),
345
+ },
346
+ check: (p) => {
347
+ const auto = p.disposition !== 'keep';
348
+ if (auto && p.target === undefined) {
349
+ reject('field', `products.target is required for ${p.disposition}`);
350
+ }
351
+ if (!auto && p.target !== undefined) {
352
+ reject('field', 'products.target is only for duplicate or map');
353
+ }
354
+ if (auto && p.questions !== undefined) {
355
+ reject('field', 'products.questions are only for keep (fall-through)');
356
+ }
357
+ },
358
+ bundle: NO_BUNDLE,
359
+ resumesAt: 'autoDisposition or persistSurfacedQuestions, publish, release (the marker back-fill needs no agent and runs in apply directly)',
360
+ },
361
+ {
362
+ row: 'apply-decision',
363
+ kind: 'apply-decision',
364
+ rungs: ['apply'],
365
+ recomputed: ['item', 'the answered sidecar read from main'],
366
+ record: {
367
+ outcome: oneOf(APPLY_DECISION_OUTCOMES),
368
+ title: line(L.documentTitleChars, false),
369
+ body: text(L.documentChars, false),
370
+ slug: { type: 'slug', required: false },
371
+ reason: text(L.reasonChars, false),
372
+ questions: textList(L.reasonChars, false),
373
+ },
374
+ check: (p) => {
375
+ const mints = ['task', 'spec', 'adr'].includes(p.outcome);
376
+ for (const f of ['title', 'body', 'slug']) {
377
+ if (mints && p[f] === undefined) {
378
+ reject('field', `products.${f} is required for ${p.outcome}`);
379
+ }
380
+ if (!mints && p[f] !== undefined) {
381
+ reject('field', `products.${f} is only for task, spec or adr`);
382
+ }
383
+ }
384
+ const ask = p.outcome === 'ask';
385
+ if (ask && p.questions === undefined) {
386
+ reject('field', 'products.questions is required for ask');
387
+ }
388
+ if (!ask && p.questions !== undefined) {
389
+ reject('field', 'products.questions is only for ask');
390
+ }
391
+ },
392
+ bundle: NO_BUNDLE,
393
+ resumesAt: 'the verdict router (promoteObservation via createItemThroughCas, mintAdr, delete, settle and keep, or append and re-pause), publish, release',
394
+ },
395
+ {
396
+ row: 'intake-ask',
397
+ kind: 'intake-ask',
398
+ rungs: ['intake'],
399
+ recomputed: ['issue number', 'marker', 'seen comment ids (lock output)'],
400
+ record: { question: text(L.reasonChars) },
401
+ bundle: NO_BUNDLE,
402
+ resumesAt: 'dispatchComment, label removal',
403
+ },
404
+ {
405
+ row: 'intake-bounce',
406
+ kind: 'intake-bounce',
407
+ rungs: ['intake'],
408
+ recomputed: ['issue number', 'marker', 'seen comment ids'],
409
+ record: { bounceText: text(L.commentChars) },
410
+ bundle: NO_BUNDLE,
411
+ resumesAt: 'closeIssue with the comment, label removal',
412
+ },
413
+ {
414
+ row: 'intake-task',
415
+ kind: 'intake-task',
416
+ rungs: ['intake'],
417
+ recomputed: INTAKE_DOCUMENT_RECOMPUTED,
418
+ record: {
419
+ title: line(L.documentTitleChars),
420
+ body: text(L.documentChars),
421
+ },
422
+ bundle: NO_BUNDLE,
423
+ resumesAt: INTAKE_DOCUMENT_RESUME,
424
+ },
425
+ {
426
+ row: 'intake-spec',
427
+ kind: 'intake-spec',
428
+ rungs: ['intake'],
429
+ recomputed: INTAKE_DOCUMENT_RECOMPUTED,
430
+ record: {
431
+ title: line(L.documentTitleChars),
432
+ body: text(L.documentChars),
433
+ humanOnly: { type: 'boolean', required: false },
434
+ needsAnswers: { type: 'boolean', required: false },
435
+ },
436
+ bundle: NO_BUNDLE,
437
+ resumesAt: INTAKE_DOCUMENT_RESUME,
438
+ },
439
+ ];
440
+ /** The row for an intent handed over by a run on `rung`, or `undefined`. */
441
+ export function intentRowFor(rung, kind) {
442
+ return HANDOFF_INTENT_TABLE.find((r) => r.kind === kind && r.rungs.includes(rung));
443
+ }
444
+ // ---------------------------------------------------------------------------
445
+ // Item ids and the artifact name
446
+ // ---------------------------------------------------------------------------
447
+ /**
448
+ * The canonical form of a legal item id: `issue:<N>`, or `task:` / `spec:` /
449
+ * `observation:` plus a safe slug. A bare slug is a task and `obs:` an
450
+ * observation, as everywhere else in dorfl (`resolveSidecarIdentity`). Anything
451
+ * else (an issue title, say) throws {@link HandoffRejected} (`item`).
452
+ */
453
+ export function canonicalHandoffItem(item) {
454
+ if (typeof item !== 'string')
455
+ reject('item', 'the item is not a string');
456
+ const issue = /^issue:([1-9][0-9]{0,11})$/.exec(item);
457
+ if (issue)
458
+ return `issue:${issue[1]}`;
459
+ if (item.startsWith('issue:'))
460
+ reject('item', 'not a legal issue item id');
461
+ const parsed = parseSlugArg(item);
462
+ if (!isSafeSlug(parsed.slug))
463
+ reject('item', 'not a legal item id');
464
+ return `${parsed.explicit ?? 'task'}:${parsed.slug}`;
465
+ }
466
+ /** The artifact-name shape {@link handoffName} produces (and only that). */
467
+ export const HANDOFF_NAME_RE = /^dorfl-handoff-(?:task|spec|observation|issue)-[A-Za-z0-9._-]{1,120}-attempt-[1-9][0-9]{0,5}$/;
468
+ /**
469
+ * The artifact name of an item run: `dorfl-handoff-<type>-<slug>-attempt-<N>`,
470
+ * derived by the lock job from the item and `github.run_attempt`. The item id's
471
+ * `:` becomes `-` (artifact names refuse `:`), so the name holds only
472
+ * `[A-Za-z0-9._-]`, which every artifact-name rule accepts. The canonical item
473
+ * type is a fixed word without `-`, so two different items never share a name;
474
+ * the attempt keeps "Re-run all jobs" from colliding with attempt 1's artifact
475
+ * (artifacts belong to the run, not the attempt).
476
+ */
477
+ export function handoffName(item, runAttempt) {
478
+ const canonical = canonicalHandoffItem(item);
479
+ const attempt = typeof runAttempt === 'number' ? String(runAttempt) : runAttempt;
480
+ if (!/^[1-9][0-9]{0,5}$/.test(attempt)) {
481
+ reject('name', 'the run attempt is not a positive integer');
482
+ }
483
+ const name = `dorfl-handoff-${canonical.replace(':', '-')}-attempt-${attempt}`;
484
+ if (!HANDOFF_NAME_RE.test(name))
485
+ reject('name', 'not a legal artifact name');
486
+ return name;
487
+ }
488
+ // ---------------------------------------------------------------------------
489
+ // Validation
490
+ // ---------------------------------------------------------------------------
491
+ /** Control characters other than tab, line feed and carriage return. */
492
+ // eslint-disable-next-line no-control-regex
493
+ const TEXT_CONTROL_RE = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/;
494
+ /** Any control character or line separator (a single-line field). */
495
+ // eslint-disable-next-line no-control-regex
496
+ const LINE_CONTROL_RE = /[\u0000-\u001f\u007f\u2028\u2029]/;
497
+ function isPlainObject(value) {
498
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
499
+ return false;
500
+ }
501
+ const proto = Object.getPrototypeOf(value);
502
+ return proto === Object.prototype || proto === null;
503
+ }
504
+ function checkText(path, value, maxChars, singleLine) {
505
+ if (typeof value !== 'string')
506
+ reject('field', `${path} is not a string`);
507
+ if (value.length > maxChars) {
508
+ reject('limit', `${path} is ${value.length} characters, over the limit of ${maxChars}`);
509
+ }
510
+ if (singleLine && LINE_CONTROL_RE.test(value)) {
511
+ reject('field', `${path} must be one line without control characters`);
512
+ }
513
+ if (!singleLine && TEXT_CONTROL_RE.test(value)) {
514
+ reject('field', `${path} holds a control character`);
515
+ }
516
+ if (singleLine && value.trim() === '')
517
+ reject('field', `${path} is blank`);
518
+ }
519
+ /** The keys a {@link HandoffQuestion} may carry (a closed shape). */
520
+ const QUESTION_KEYS = ['question', 'context', 'default'];
521
+ /** One {@link HandoffQuestionEntry}: a bare question text, or the closed object. */
522
+ function checkQuestion(path, value, maxChars) {
523
+ if (typeof value === 'string') {
524
+ return checkText(path, value, maxChars, false);
525
+ }
526
+ if (!isPlainObject(value)) {
527
+ reject('field', `${path} is neither a question text nor a question object`);
528
+ }
529
+ checkKeys(`${path}.`, value, QUESTION_KEYS);
530
+ if (value.question === undefined) {
531
+ reject('field', `${path}.question is required`);
532
+ }
533
+ for (const key of QUESTION_KEYS) {
534
+ if (value[key] !== undefined) {
535
+ checkText(`${path}.${key}`, value[key], maxChars, false);
536
+ }
537
+ }
538
+ }
539
+ function checkField(path, spec, value) {
540
+ switch (spec.type) {
541
+ case 'line':
542
+ case 'text':
543
+ return checkText(path, value, spec.maxChars, spec.type === 'line');
544
+ case 'text-list':
545
+ if (!Array.isArray(value))
546
+ reject('field', `${path} is not a list`);
547
+ value.forEach((v, i) => checkText(`${path}[${i}]`, v, spec.maxChars, false));
548
+ return;
549
+ case 'question-list':
550
+ if (!Array.isArray(value))
551
+ reject('field', `${path} is not a list`);
552
+ value.forEach((v, i) => checkQuestion(`${path}[${i}]`, v, spec.maxChars));
553
+ return;
554
+ case 'documents':
555
+ if (!isPlainObject(value))
556
+ reject('field', `${path} is not an object`);
557
+ for (const [slug, doc] of Object.entries(value)) {
558
+ if (!isSafeSlug(slug))
559
+ reject('field', `a ${path} key is not a safe slug`);
560
+ checkText(`${path}.${slug}`, doc, spec.maxChars, false);
561
+ }
562
+ return;
563
+ case 'enum':
564
+ if (typeof value !== 'string' || !spec.values.includes(value)) {
565
+ reject('field', `${path} is not one of ${spec.values.join(', ')}`);
566
+ }
567
+ return;
568
+ case 'boolean':
569
+ if (typeof value !== 'boolean') {
570
+ reject('field', `${path} is not a boolean`);
571
+ }
572
+ return;
573
+ case 'slug':
574
+ if (typeof value !== 'string' || !isSafeSlug(value)) {
575
+ reject('field', `${path} is not a safe slug`);
576
+ }
577
+ return;
578
+ case 'item-ref': {
579
+ const m = typeof value === 'string'
580
+ ? /^(?:task|spec|observation):(.*)$/.exec(value)
581
+ : null;
582
+ if (m === null || !isSafeSlug(m[1])) {
583
+ reject('field', `${path} is not a <task|spec|observation>:<slug> item`);
584
+ }
585
+ return;
586
+ }
587
+ }
588
+ }
589
+ function checkKeys(path, obj, allowed) {
590
+ for (const key of Object.keys(obj)) {
591
+ if (!allowed.includes(key)) {
592
+ reject('field', `unknown field ${path}${JSON.stringify(key).slice(0, 80)}`);
593
+ }
594
+ }
595
+ }
596
+ /**
597
+ * Validate a parsed `handoff.json` against the trusted item and rung, and return
598
+ * it typed together with its table row. Rejects an unknown schema, a record for
599
+ * another item, an unknown kind, a kind the rung cannot produce, any field
600
+ * outside the row's `record` column (at every level), a missing required field,
601
+ * a malformed value and any over-limit text.
602
+ */
603
+ export function validateHandoffRecord(value, trust) {
604
+ if (!isPlainObject(value))
605
+ reject('shape', 'handoff.json is not an object');
606
+ if (value.schema !== HANDOFF_SCHEMA) {
607
+ reject('schema', `unknown schema ${JSON.stringify(value.schema)}`);
608
+ }
609
+ checkKeys('', value, ['schema', 'item', 'intent', 'products']);
610
+ const trustedItem = canonicalHandoffItem(trust.item);
611
+ if (value.item !== trustedItem) {
612
+ reject('item', `the record does not name this run's item ${trustedItem}`);
613
+ }
614
+ if (!isPlainObject(value.intent))
615
+ reject('shape', 'intent is not an object');
616
+ checkKeys('intent.', value.intent, ['kind']);
617
+ const kind = value.intent.kind;
618
+ if (typeof kind !== 'string' ||
619
+ !HANDOFF_INTENT_KINDS.includes(kind)) {
620
+ reject('kind', `unknown intent kind ${JSON.stringify(kind).slice(0, 80)}`);
621
+ }
622
+ if (!HANDOFF_RUNGS.includes(trust.rung)) {
623
+ reject('kind-for-rung', `unknown trusted rung ${String(trust.rung)}`);
624
+ }
625
+ const row = intentRowFor(trust.rung, kind);
626
+ if (row === undefined) {
627
+ reject('kind-for-rung', `a ${trust.rung} run cannot hand over ${kind}`);
628
+ }
629
+ if (!isPlainObject(value.products)) {
630
+ reject('shape', 'products is not an object');
631
+ }
632
+ const products = value.products;
633
+ checkKeys('products.', products, Object.keys(row.record));
634
+ for (const [name, spec] of Object.entries(row.record)) {
635
+ const v = products[name];
636
+ if (v === undefined) {
637
+ if (spec.required)
638
+ reject('field', `products.${name} is required`);
639
+ continue;
640
+ }
641
+ checkField(`products.${name}`, spec, v);
642
+ }
643
+ row.check?.(products);
644
+ return { record: value, row };
645
+ }
646
+ //# sourceMappingURL=ci-handoff-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-handoff-format.js","sourceRoot":"","sources":["../src/ci-handoff-format.ts"],"names":[],"mappings":"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"}