dorfl 0.0.0 → 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 (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3094 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +215 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +345 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +315 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +684 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +360 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +952 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4369 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +485 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1023 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +760 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1438 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
@@ -0,0 +1,591 @@
1
+ /**
2
+ * The `install-ci` ISSUE-INTAKE capability (prd `runner-in-ci`, task
3
+ * `install-ci-intake-trigger-and-review-surface`; capability D: consider incoming
4
+ * issues → task/prd, AND insertion point E: surface the review verdict back into
5
+ * the issue thread). This module GENERATES the one fixed intake workflow file and
6
+ * STRUCTURALLY VALIDATES it, mirroring the snapshot-assertion style of
7
+ * `advance-lifecycle-template.ts` / `advance-ci-template.ts` (the package depends on
8
+ * NO YAML lib, so the checks are presence/shape assertions over the raw text). It
9
+ * ALSO carries the PURE author-trust → per-outcome-flags DERIVATION
10
+ * ({@link deriveIntakeFlags}) — CI's merge-vs-propose POLICY, the load-bearing
11
+ * testable logic the workflow encodes at runtime.
12
+ *
13
+ * SCOPE FENCE (prd Out-of-Scope): the issue→artifact TRANSFORM engine is
14
+ * `issue-intake`'s (`intake <N>` + its four-outcome dispatch + the per-outcome
15
+ * KNOBS + the lone-task review that posts to the issue thread). CI only
16
+ * WIRES/SCHEDULES/INVOKES it and owns the merge-vs-propose POLICY + the delivery
17
+ * surface. This module emits NO transform; it emits the WORKFLOW that calls it.
18
+ *
19
+ * The discipline (prd capability-D row + the merge-vs-propose POLICY + the two
20
+ * RESOLVED design decisions in the task):
21
+ *
22
+ * - TRIGGERS: `issues` opened, `issue_comment` created, and a label
23
+ * (`dorfl:intake`). It invokes `intake <N>` (EXPLICIT, four-outcome
24
+ * dispatch) — never a bare slug.
25
+ * - EVENT→`IntakeEventKind` MAPPING (Decision 2: no edit-detection): only a
26
+ * CREATED `issue_comment` (and an opened issue / the label) drives
27
+ * (re-)evaluation; an EDITED comment is NOT a trigger (the ID-based
28
+ * `seen=<ids>` watermark suffices). The "post a NEW comment to signal an edit"
29
+ * convention is documented in the workflow so a human knows to re-trigger.
30
+ * - AUTHOR-TRUST → per-outcome FLAGS (Decision 1, {@link deriveIntakeFlags}): an
31
+ * UNTRUSTED author (`author_association` not in OWNER/MEMBER/COLLABORATOR)
32
+ * forces `--propose-task` REGARDLESS of the `autoBuild` gate, while
33
+ * `--merge-spec` stays allowed (a human still tasks a spec before anything
34
+ * autonomous acts — the checkpoint is intact). A TRUSTED author gets the plain
35
+ * gate-derived mode for both. The fully-gateless "all gates on + merge
36
+ * everywhere" path is a LOUD, NON-DEFAULT opt-in — the default is conservative
37
+ * (propose / human-in-the-loop).
38
+ * - INSERTION POINT E (the issue-thread review surface): the review verdict over
39
+ * intake's generated prds/tasks is surfaced into the ISSUE THREAD via the
40
+ * `IssueProvider.postIssueComment` seam (issue thread, by NUMBER — NOT the PR
41
+ * seam `postPRComment`, which is keyed by url). This is REUSED, not new:
42
+ * `intake <N>` already runs the lone-task review/edit loop and posts its
43
+ * findings as questions through `postIssueComment`. The workflow surfaces E by
44
+ * INVOKING `intake`; it adds no second review mechanism.
45
+ * - CI runs IN-PLACE (the CI container IS the isolation): no
46
+ * `--isolated`/`--remote`/registry. A PER-ISSUE concurrency group serialises
47
+ * overlapping ticks on the SAME issue; the `processing` lock / claim CAS is the
48
+ * real cross-run serialiser.
49
+ * - The running CI job NEVER edits `.github/workflows/**` (US #9): it requests NO
50
+ * `workflows` permission and cannot rewrite its own triggers. It needs
51
+ * `contents: write` + `pull-requests: write` (emit/propose the artifact) +
52
+ * `issues: write` (post the clarifying/review comment back).
53
+ *
54
+ * The structural validator is the dependency-free counterpart of "the workflow
55
+ * parses + carries the right discipline" the task's acceptance criteria require;
56
+ * the test generates this artifact under `--fake` and asserts every invariant.
57
+ */
58
+
59
+ import {brand} from './brand.js';
60
+ import type {ResolvedCIConfig} from './install-ci-core.js';
61
+ import {providerSecretsWithBlock} from './install-ci-core.js';
62
+
63
+ /** The capability id (the registry key + the emitted workflow file stem). */
64
+ export const INTAKE_TRIGGER_CAPABILITY_ID = 'intake';
65
+
66
+ /** The wizard-facing label for the issue-intake capability. */
67
+ export const INTAKE_TRIGGER_CAPABILITY_LABEL =
68
+ 'Consider incoming issues → task/prd + surface the review verdict into the issue thread (the intake trigger: issues / issue_comment / label)';
69
+
70
+ /** The repo-relative path (under the output base) of the emitted workflow. */
71
+ export const INTAKE_TRIGGER_WORKFLOW_PATH = 'workflows/intake.yml';
72
+
73
+ /**
74
+ * The intake-trigger LABEL: a label whose addition (re-)triggers intake on an
75
+ * issue (the "label" trigger of capability D), brand-namespaced exactly like the
76
+ * `processing` lock so it cannot collide with a user's own labels. DISTINCT from
77
+ * the transient `processing` lock — this one is a human-facing "please (re-)intake
78
+ * this" signal, not a concurrency mutex.
79
+ */
80
+ export const INTAKE_TRIGGER_LABEL = `${brand.base}:intake`;
81
+
82
+ // ─── The AUTHOR-TRUST → per-outcome-flags DERIVATION (CI's POLICY) ────────────
83
+
84
+ /**
85
+ * The trusted `author_association` values (Decision 1): a repo OWNER, an org
86
+ * MEMBER, or a write-COLLABORATOR is TRUSTED; everyone else
87
+ * (`CONTRIBUTOR`/`FIRST_TIME_CONTRIBUTOR`/`FIRST_TIMER`/`NONE`/anything unknown)
88
+ * is UNTRUSTED. This is the WHOLE author-trust signal — admin/write-collaborator,
89
+ * read straight off the event payload, no extra API call, no multi-factor matrix.
90
+ */
91
+ export const TRUSTED_AUTHOR_ASSOCIATIONS = [
92
+ 'OWNER',
93
+ 'MEMBER',
94
+ 'COLLABORATOR',
95
+ ] as const;
96
+
97
+ /**
98
+ * The per-outcome integration flags CI passes to `intake <N>` — the GRANULAR
99
+ * per-type pair (the aggregates `--merge`/`--propose` are not needed because CI
100
+ * always resolves BOTH types explicitly). Each is `'merge'` or `'propose'`.
101
+ */
102
+ export interface IntakeIntegrationFlags {
103
+ /** The spec outcome's mode → `--merge-spec` / `--propose-spec`. */
104
+ spec: 'merge' | 'propose';
105
+ /** The task outcome's mode → `--merge-task` / `--propose-task`. */
106
+ task: 'merge' | 'propose';
107
+ /**
108
+ * The ORIGIN-TRUST verdict CI passes to `intake <N>` via `--origin-trust`
109
+ * (task `untrusted-origin-forces-build-propose`) so the emitted prd/task is
110
+ * STAMPED with how it was born. Derived from the SAME `author_association` case
111
+ * as the integration flags (it IS `authorTrusted` collapsed to the wire value),
112
+ * so the stamp and the integration mode CANNOT desync. `intake.ts` writes it
113
+ * verbatim onto the frontmatter — it never re-resolves trust (the `intake.ts`
114
+ * ~L296 boundary: author-trust is CI's POLICY, passed IN, not resolved here).
115
+ */
116
+ originTrust: 'trusted' | 'untrusted';
117
+ }
118
+
119
+ /** The gate state CI composes with author-trust to derive the per-outcome flags. */
120
+ export interface IntakeGateState {
121
+ /**
122
+ * `autoBuild` — whether an agent will AUTO-BUILD an undeclared task next. ON ⇒
123
+ * a task needs a human PR checkpoint NOW (`--propose-task`); OFF ⇒ a human
124
+ * must build it, so it may `--merge-task` (when the author is also trusted).
125
+ */
126
+ autoBuild: boolean;
127
+ /**
128
+ * `autoTask` — whether an agent will AUTO-TASK an undeclared spec next. ON ⇒ a
129
+ * spec needs a human PR checkpoint NOW (`--propose-spec`); OFF ⇒ a human must
130
+ * task it, so it may `--merge-spec`.
131
+ */
132
+ autoTask: boolean;
133
+ }
134
+
135
+ /**
136
+ * DERIVE the per-outcome merge-vs-propose flags from the gate state COMPOSED with
137
+ * author-trust — CI's merge-vs-propose POLICY (prd "merge-vs-propose POLICY" +
138
+ * "Composed with AUTHOR-TRUST"; task Decision 1). This is the load-bearing pure
139
+ * logic the workflow encodes at runtime (it reads `author_association` off the
140
+ * event payload and sets the flags accordingly):
141
+ *
142
+ * - **SPEC** — gate-derived ONLY (author-trust does NOT bite): `--merge-spec` iff
143
+ * `autoTask` is OFF (a human must task the spec before anything autonomous
144
+ * acts on it — the human checkpoint stays AHEAD even for an untrusted author),
145
+ * else `--propose-spec`.
146
+ * - **TASK** — `--propose-task` iff (`autoBuild` ON) OR (author UNTRUSTED);
147
+ * `--merge-task` ONLY iff (`autoBuild` OFF AND author TRUSTED). An untrusted
148
+ * author can never auto-merge a task from a public-front-door issue.
149
+ *
150
+ * So the only way to `--merge-task` is a TRUSTED author with `autoBuild` OFF —
151
+ * and the fully-gateless "merge everything" path additionally needs `autoTask`
152
+ * OFF; both gates off + a trusted author is the LOUD, NON-DEFAULT opt-in. The
153
+ * conservative case (untrusted author, or any gate on) keeps a human in the loop.
154
+ */
155
+ export function deriveIntakeFlags(options: {
156
+ gate: IntakeGateState;
157
+ authorTrusted: boolean;
158
+ }): IntakeIntegrationFlags {
159
+ const {gate, authorTrusted} = options;
160
+ // SPEC: gate-derived only — a human-tasks-it checkpoint stays ahead regardless
161
+ // of author-trust, so an untrusted author may still --merge-spec.
162
+ const spec: 'merge' | 'propose' = gate.autoTask ? 'propose' : 'merge';
163
+ // TASK: propose if the agent will auto-build it (gate ON) OR the author is
164
+ // untrusted; merge ONLY when both are safe (gate OFF AND author trusted).
165
+ const task: 'merge' | 'propose' =
166
+ gate.autoBuild || !authorTrusted ? 'propose' : 'merge';
167
+ // ORIGIN-TRUST stamp (task `untrusted-origin-forces-build-propose`): the SAME
168
+ // author-trust verdict, collapsed to the wire value `intake` stamps onto the
169
+ // emitted artifact. Derived HERE — next to the integration flags, off the SAME
170
+ // `authorTrusted` input — so the stamp and the task/prd modes cannot desync.
171
+ // It is NOT a re-resolution of trust (CI already resolved it); it is the verdict
172
+ // being CARRIED so it survives the prd/task merge boundary (the becomes-code
173
+ // checkpoint is not laundered when the file lands on main).
174
+ const originTrust: 'trusted' | 'untrusted' = authorTrusted
175
+ ? 'trusted'
176
+ : 'untrusted';
177
+ return {spec, task, originTrust};
178
+ }
179
+
180
+ /**
181
+ * Classify an `author_association` string into trusted/untrusted (Decision 1). A
182
+ * missing/empty/unknown value is UNTRUSTED (fail-safe: a public front-door defaults
183
+ * to the conservative, human-in-the-loop path). Case-insensitive on the wire value
184
+ * for robustness, though GitHub emits upper-case.
185
+ */
186
+ export function isAuthorTrusted(
187
+ authorAssociation: string | undefined,
188
+ ): boolean {
189
+ if (!authorAssociation) {
190
+ return false;
191
+ }
192
+ const upper = authorAssociation.toUpperCase();
193
+ return (TRUSTED_AUTHOR_ASSOCIATIONS as readonly string[]).includes(upper);
194
+ }
195
+
196
+ // ─── The workflow generator ──────────────────────────────────────────────────
197
+
198
+ /**
199
+ * Generate the intake-trigger workflow YAML. Deterministic: the same config
200
+ * produces byte-identical output. The workflow is a FIXED shell (ADR §6: all
201
+ * policy is env/config, so the artifact carries no config-derived policy beyond
202
+ * the env-block scaffolding) — `config` is accepted for parity with the
203
+ * `CapabilityEmitter` seam and future per-config wiring, but the intake-trigger
204
+ * shape itself is config-independent.
205
+ *
206
+ * The per-outcome FLAGS are DERIVED AT RUNTIME by a `bash` step that mirrors
207
+ * {@link deriveIntakeFlags}: it reads the gate env block + the event's
208
+ * `author_association` and sets `--merge-spec`/`--propose-spec` +
209
+ * `--merge-task`/`--propose-task` accordingly. The same rule that
210
+ * {@link deriveIntakeFlags} unit-tests is what the workflow executes — they cannot
211
+ * desync because the test asserts the SHELL derivation matches the function.
212
+ */
213
+ export function generateIntakeWorkflow(config: ResolvedCIConfig): string {
214
+ // `intake <N>` runs the prompt→verdict decision (the agent), so it needs the
215
+ // provider secret(s) forwarded to `$GITHUB_ENV` by the setup action.
216
+ const setupWith = providerSecretsWithBlock(config);
217
+ return `\
218
+ # dorfl — the ISSUE INTAKE trigger in CI (capability D: consider incoming
219
+ # issues → task/prd, PLUS insertion point E: surface the review verdict into the
220
+ # issue thread, prd runner-in-ci). EMITTED by \`dorfl install-ci\`; the human
221
+ # commits it. DO NOT hand-edit a copy — re-run install-ci to upgrade the shell.
222
+ #
223
+ # WHAT IT DOES — \`dorfl intake <N>\` reads issue #N + its comment thread,
224
+ # runs a prompt→verdict decision (ask / task / PRD / bounce), and dispatches it.
225
+ # CI owns ONLY the trigger + the merge-vs-propose POLICY + the delivery surface;
226
+ # the TRANSFORM is the engine's (the Out-of-Scope fence — CI re-implements none of
227
+ # it). The lone-task review/edit loop \`intake\` already runs ALSO surfaces its
228
+ # findings as questions back into THIS issue thread via the issue-comment seam (insertion
229
+ # point E) — REUSED, not a new review mechanism.
230
+ #
231
+ # TRIGGERS (capability D): an OPENED issue, a CREATED issue comment, and the
232
+ # \`${INTAKE_TRIGGER_LABEL}\` label. A CREATED comment is the (re-)evaluation
233
+ # trigger; an EDITED comment is deliberately NOT a trigger (the ID-based
234
+ # \`seen=<ids>\` watermark catches new comments; editing a prior comment never
235
+ # re-triggers). CONVENTION: if you edit a previous comment to answer intake's
236
+ # question, ALSO post a NEW comment noting the edit — the new comment is what drives
237
+ # re-evaluation (a fresh id the watermark catches). There is NO edit-detection /
238
+ # \`updated_at\` / body-hash tracking.
239
+ #
240
+ # AUTHOR-TRUST → per-outcome FLAGS (the merge-vs-propose POLICY): because ANYBODY
241
+ # can file an issue, the merge decision composes with WHO authored it. An UNTRUSTED
242
+ # author (\`author_association\` not OWNER/MEMBER/COLLABORATOR) forces
243
+ # \`--propose-task\` REGARDLESS of the \`autoBuild\` gate — a task from a public
244
+ # front-door issue can never auto-merge — while \`--merge-spec\` stays allowed (a
245
+ # human must still task a spec before anything autonomous acts on it, so the human
246
+ # checkpoint is intact). A TRUSTED author gets the plain gate-derived mode. The
247
+ # fully-gateless "merge everything" path (both gates off + a trusted author) is a
248
+ # LOUD, NON-DEFAULT opt-in; the default is conservative (propose).
249
+ #
250
+ # CI runs IN-PLACE (the CI container IS the isolation): NO --isolated/--remote/
251
+ # registry (laptop-only affordances). The PER-ISSUE concurrency group below
252
+ # serialises overlapping ticks on the SAME issue; the \`processing\` lock / claim
253
+ # CAS is the real cross-run serialiser.
254
+ #
255
+ # SAFETY (US #9): the running job is FORBIDDEN from editing the workflows tree
256
+ # under .github. It requests NO \`workflows\` permission, so it can never rewrite
257
+ # its own triggers.
258
+
259
+ name: intake
260
+
261
+ on:
262
+ issues:
263
+ # An OPENED issue triggers a first intake pass. NOT \`edited\` — a body edit's
264
+ # re-evaluation is the engine's event-model concern (issue-intake); the CI
265
+ # trigger relies on a CREATED comment to drive (re-)evaluation.
266
+ types:
267
+ - opened
268
+ - labeled
269
+ issue_comment:
270
+ # A CREATED comment is the (re-)evaluation trigger (Decision 2). An EDITED
271
+ # comment is NOT listed — editing a prior comment never re-triggers; post a NEW
272
+ # comment to signal an edit (the ID-based seen=<ids> watermark catches it).
273
+ types:
274
+ - created
275
+
276
+ # PER-ISSUE concurrency group: serialise overlapping ticks on the SAME issue (two
277
+ # triggers landing close together must not run intake on one issue twice at once).
278
+ # The \`processing\` lock / claim CAS is the real cross-run serialiser; this just
279
+ # avoids redundant concurrent ticks. Keyed by the issue number so DIFFERENT issues
280
+ # still run in parallel.
281
+ concurrency:
282
+ group: intake-\${{ github.event.issue.number }}
283
+ cancel-in-progress: false
284
+
285
+ # NO \`workflows\` permission: the running job can NEVER edit the workflows tree
286
+ # under .github (US #9). \`contents: write\` + \`pull-requests: write\` emit/propose
287
+ # the artifact; \`issues: write\` posts the clarifying/review comment back into the
288
+ # thread (insertion point E). It never rewrites its triggers.
289
+ permissions:
290
+ contents: write
291
+ pull-requests: write
292
+ issues: write
293
+
294
+ env:
295
+ # ── The engine GATE FAMILY, surfaced as the DORFL_* env block ─────────
296
+ # CI is NOT a special policy surface (ADR ci-config-policy-and-gate-family §5):
297
+ # it runs the SAME engine gates, resolved through flag > env > per-repo > global
298
+ # > default. The SAME .dorfl.json the laptop uses applies here; this env
299
+ # block is the optional CI-only override. Change behaviour by editing these
300
+ # values (or a GitHub repo variable / .dorfl.json key) — NOT by re-running
301
+ # install-ci (ADR §6: install-ci is one-time).
302
+ #
303
+ # \`intake\` itself is GATE-FREE (the explicit invocation is its own
304
+ # authorization), so these gates do NOT block it — CI READS them to DERIVE the
305
+ # per-outcome merge-vs-propose flags below (the merge-vs-propose POLICY). CALM
306
+ # DEFAULTS: both off ⇒ the next step is a HUMAN, so the gate-derived mode is the
307
+ # permissive merge side; author-trust then forces propose for a task from an
308
+ # untrusted author.
309
+ DORFL_AUTO_BUILD: 'false' # gate: will an agent auto-build the emitted task next?
310
+ DORFL_AUTO_TASK: 'false' # gate: will an agent auto-task the emitted prd next?
311
+
312
+ jobs:
313
+ intake:
314
+ # Only run for an issue/comment that actually carries an issue number (a
315
+ # comment on a PR also fires \`issue_comment\`; skip those — there is no issue to
316
+ # intake). \`pull_request\` is absent on a real issue comment.
317
+ if: \${{ github.event.issue.number && !github.event.issue.pull_request }}
318
+ runs-on: ubuntu-latest
319
+ steps:
320
+ - uses: actions/checkout@v4
321
+ with:
322
+ fetch-depth: 0
323
+ - uses: ./.github/actions/dorfl-setup${setupWith}
324
+
325
+ - name: derive the per-outcome merge-vs-propose flags (gate × author-trust)
326
+ id: policy
327
+ # The merge-vs-propose POLICY, executed at runtime — the SAME rule
328
+ # \`deriveIntakeFlags\` unit-tests (they cannot desync; the test asserts this
329
+ # shell matches the function):
330
+ # * SPEC — gate-derived ONLY: --merge-spec iff autoTask OFF (a human
331
+ # tasks it before anything autonomous acts — the checkpoint
332
+ # stays ahead even for an UNTRUSTED author), else --propose-spec.
333
+ # * TASK — --propose-task iff (autoBuild ON) OR (author UNTRUSTED);
334
+ # --merge-task ONLY iff (autoBuild OFF AND author TRUSTED).
335
+ # author_association comes from the COMMENT on an \`issue_comment\` event,
336
+ # else the ISSUE on an \`issues\` event — read straight off the payload, no
337
+ # extra API call.
338
+ env:
339
+ AUTHOR_ASSOCIATION: \${{ github.event.comment.author_association || github.event.issue.author_association }}
340
+ run: |
341
+ set -euo pipefail
342
+
343
+ # SPEC flag: gate-derived only (author-trust does NOT bite a spec).
344
+ if [ "\${DORFL_AUTO_TASK}" = "true" ]; then
345
+ spec_flag="--propose-spec"
346
+ else
347
+ spec_flag="--merge-spec"
348
+ fi
349
+
350
+ # Author-trust: TRUSTED iff OWNER/MEMBER/COLLABORATOR (admin / write-
351
+ # collaborator — the whole signal). Anything else (incl. empty) is
352
+ # UNTRUSTED → the conservative, human-in-the-loop path.
353
+ trusted="false"
354
+ case "\${AUTHOR_ASSOCIATION:-}" in
355
+ OWNER|MEMBER|COLLABORATOR) trusted="true" ;;
356
+ esac
357
+
358
+ # TASK flag: propose if the agent will auto-build it (gate ON) OR the
359
+ # author is untrusted; merge ONLY when both are safe.
360
+ if [ "\${DORFL_AUTO_BUILD}" = "true" ] || [ "\${trusted}" != "true" ]; then
361
+ task_flag="--propose-task"
362
+ else
363
+ task_flag="--merge-task"
364
+ fi
365
+
366
+ # ORIGIN-TRUST stamp (task untrusted-origin-forces-build-propose):
367
+ # derived from the SAME \${trusted} case above (one author-trust read,
368
+ # two consumers — the task/prd modes AND the stamp — so they cannot
369
+ # desync). \`intake\` STAMPS this onto the emitted prd/task frontmatter
370
+ # (origin: issue + originTrust: <value>); it does NOT re-resolve trust
371
+ # (that is CI's policy, passed IN). The stamp SURVIVES the merge boundary
372
+ # so a later auto-task/auto-build of an untrusted-origin artifact still
373
+ # forces a human becomes-code checkpoint (the laundering gap is closed).
374
+ if [ "\${trusted}" = "true" ]; then
375
+ origin_trust_flag="--origin-trust=trusted"
376
+ else
377
+ origin_trust_flag="--origin-trust=untrusted"
378
+ fi
379
+
380
+ echo "spec_flag=\${spec_flag}" >> "\$GITHUB_OUTPUT"
381
+ echo "task_flag=\${task_flag}" >> "\$GITHUB_OUTPUT"
382
+ echo "origin_trust_flag=\${origin_trust_flag}" >> "\$GITHUB_OUTPUT"
383
+ echo "intake policy: author_association='\${AUTHOR_ASSOCIATION:-}' trusted=\${trusted} → \${spec_flag} \${task_flag} \${origin_trust_flag}"
384
+
385
+ - name: intake the issue (four-outcome dispatch; surfaces the review verdict into the thread)
386
+ # In-place in this checkout (no --isolated/--remote): the CI container IS
387
+ # the isolation. EXPLICIT \`intake <N>\`, never a bare slug. The per-outcome
388
+ # flags carry the merge-vs-propose POLICY derived above. \`intake\` runs the
389
+ # lone-task review/edit loop and posts its findings as questions back into
390
+ # THIS issue thread (insertion point E) through the issue-comment seam —
391
+ # CI surfaces E by invoking intake; it adds no new review mechanism.
392
+ env:
393
+ GH_TOKEN: \${{ secrets.GITHUB_TOKEN }}
394
+ run: |
395
+ dorfl intake "\${{ github.event.issue.number }}" \\
396
+ "\${{ steps.policy.outputs.spec_flag }}" \\
397
+ "\${{ steps.policy.outputs.task_flag }}" \\
398
+ "\${{ steps.policy.outputs.origin_trust_flag }}" \\
399
+ --arbiter origin
400
+ `;
401
+ }
402
+
403
+ /** A single structural problem found in the generated workflow. */
404
+ export interface IntakeTriggerProblem {
405
+ /** A short, stable id for the violated invariant (for tests/assertions). */
406
+ id: string;
407
+ /** Human-readable description of what is missing or wrong. */
408
+ message: string;
409
+ }
410
+
411
+ /** The result of {@link validateIntakeWorkflow}. */
412
+ export interface IntakeTriggerValidation {
413
+ /** True iff the workflow satisfies EVERY structural invariant. */
414
+ ok: boolean;
415
+ /** Each violated invariant (empty when `ok`). */
416
+ problems: IntakeTriggerProblem[];
417
+ }
418
+
419
+ /**
420
+ * Structurally validate the intake-trigger workflow against the task's acceptance
421
+ * criteria. Dependency-free (no YAML lib): presence/shape assertions over the raw
422
+ * text, mirroring {@link validateAdvanceLifecycleWorkflow} /
423
+ * {@link validateCloseJobWorkflow}.
424
+ */
425
+ export function validateIntakeWorkflow(text: string): IntakeTriggerValidation {
426
+ const problems: IntakeTriggerProblem[] = [];
427
+ const require = (id: string, present: boolean, message: string): void => {
428
+ if (!present) {
429
+ problems.push({id, message});
430
+ }
431
+ };
432
+
433
+ // The OPERATIVE (non-comment) lines: the prohibitions below (no `--isolated`/
434
+ // `--remote`/`do`/`pull_request` trigger/`.github/workflows` self-edit/edit
435
+ // trigger) are about what the job DOES, not what the explanatory comments
436
+ // MENTION. Strip full-line `#` comments before the negative checks; the positive
437
+ // presence checks run over the full text (comments are harmless there).
438
+ const operative = text
439
+ .split('\n')
440
+ .filter((line) => !/^\s*#/.test(line))
441
+ .join('\n');
442
+
443
+ // --- INVOKES `intake <N>` (explicit, four-outcome dispatch), never bare ------
444
+ require('invokes-intake', /dorfl intake\b/.test(
445
+ operative,
446
+ ), 'must invoke `dorfl intake <N>` (the four-outcome dispatch engine CI ' +
447
+ 'schedules).');
448
+ // The issue number rides the explicit positional — never a bare slug, and the
449
+ // number comes from the event payload (the issue under intake).
450
+ require('intake-explicit-issue-number', /dorfl intake "?\$\{\{\s*github\.event\.issue\.number/.test(
451
+ operative,
452
+ ), 'the intake invocation must pass the explicit issue NUMBER ' +
453
+ '(`github.event.issue.number`), never a bare slug.');
454
+ // CI owns ONLY the trigger/policy/delivery — it must NOT invoke a build/task
455
+ // verb (that is the build/task tick), nor re-implement the transform.
456
+ require('no-build-verbs', !/dorfl (?:do|advance)\b/.test(
457
+ operative,
458
+ ), 'the intake workflow must invoke ONLY `intake` (+ derive the policy), not a ' +
459
+ 'build/task verb — CI owns the trigger + merge policy, not the transform.');
460
+
461
+ // --- TRIGGERS: issues opened + issue_comment created + the label ------------
462
+ require('trigger-issues-opened', /\bissues:\s*[\s\S]*?types:\s*[\s\S]*?-\s*opened\b/.test(
463
+ text,
464
+ ), 'must trigger on an OPENED issue (`on.issues.types: [opened]`).');
465
+ require('trigger-issue-comment-created', /\bissue_comment:\s*[\s\S]*?types:\s*[\s\S]*?-\s*created\b/.test(
466
+ text,
467
+ ), 'must trigger on a CREATED issue comment ' +
468
+ '(`on.issue_comment.types: [created]`) — the (re-)evaluation trigger.');
469
+ require('trigger-label', /\bissues:\s*[\s\S]*?types:\s*[\s\S]*?-\s*labeled\b/.test(
470
+ text,
471
+ ), 'must trigger on a label (`on.issues.types: [labeled]`).');
472
+
473
+ // --- Decision 2: a CREATED comment triggers; an EDITED comment does NOT ------
474
+ // The `issue_comment` trigger must NOT list `edited` (no edit-detection); and
475
+ // there must be no `updated_at`/body-hash edit-tracking wiring.
476
+ require('no-comment-edited-trigger', !/issue_comment:\s*[\s\S]*?types:\s*[\s\S]*?-\s*edited\b/.test(
477
+ text,
478
+ ), 'the `issue_comment` trigger must NOT include `edited` (Decision 2: no ' +
479
+ 'edit-detection; a CREATED comment is the (re-)evaluation trigger).');
480
+ require('no-edit-tracking', !/updated_at|body-hash|bodyHash/.test(
481
+ operative,
482
+ ), 'must NOT implement `updated_at` / body-hash edit-tracking (Decision 2).');
483
+ // The "post a NEW comment to signal an edit" CONVENTION must be documented in
484
+ // the workflow so a human knows how to re-trigger after editing a comment.
485
+ require('documents-new-comment-convention', /post a NEW comment/i.test(
486
+ text,
487
+ ), 'must DOCUMENT the "post a new comment to signal an edit" convention ' +
488
+ '(Decision 2) so a human knows how to drive re-evaluation.');
489
+
490
+ // --- AUTHOR-TRUST → per-outcome flags (Decision 1) --------------------------
491
+ // The workflow must READ author_association off the event payload (no extra API).
492
+ require('reads-author-association', /author_association/.test(
493
+ text,
494
+ ), 'must read `author_association` off the event payload to compose author-' +
495
+ 'trust into the merge-vs-propose policy (Decision 1; no extra API call).');
496
+ // Trust = OWNER/MEMBER/COLLABORATOR (the whole signal).
497
+ require('trust-owner-member-collaborator', /OWNER\|MEMBER\|COLLABORATOR|OWNER[\s\S]{0,40}MEMBER[\s\S]{0,40}COLLABORATOR/.test(
498
+ text,
499
+ ), 'author-trust must be OWNER/MEMBER/COLLABORATOR (admin / write-collaborator ' +
500
+ '— the whole signal; Decision 1).');
501
+ // An untrusted author forces --propose-task; the derivation must emit both
502
+ // task modes (so the untrusted path can reach propose and the trusted-safe
503
+ // path can reach merge).
504
+ require('derives-propose-task', /--propose-task\b/.test(
505
+ operative,
506
+ ), 'the policy derivation must be able to emit `--propose-task` (the ' +
507
+ 'untrusted-author / autoBuild-on fallback).');
508
+ require('derives-merge-task', /--merge-task\b/.test(
509
+ operative,
510
+ ), 'the policy derivation must be able to emit `--merge-task` (the ' +
511
+ 'trusted-author + autoBuild-off path).');
512
+ // --merge-spec stays allowed even for an untrusted author (spec checkpoint ahead).
513
+ require('derives-merge-spec', /--merge-spec\b/.test(
514
+ operative,
515
+ ), 'the policy derivation must be able to emit `--merge-spec` (a spec stays ' +
516
+ 'mergeable even for an untrusted author — the human-tasks-it checkpoint).');
517
+ require('derives-propose-spec', /--propose-spec\b/.test(
518
+ operative,
519
+ ), 'the policy derivation must be able to emit `--propose-spec` (autoTask on).');
520
+ // ORIGIN-TRUST stamp (task untrusted-origin-forces-build-propose): the shell
521
+ // must derive `--origin-trust <trusted|untrusted>` from the SAME author-trust
522
+ // case it uses for the task/PRD modes, and pass it to `intake` so the emitted
523
+ // artifact is stamped (the stamp + the modes cannot desync).
524
+ require('derives-origin-trust-untrusted', /--origin-trust=untrusted\b/.test(
525
+ operative,
526
+ ), 'the policy derivation must emit `--origin-trust=untrusted` for a non-trusted ' +
527
+ 'author (so the emitted artifact is stamped untrusted; task ' +
528
+ 'untrusted-origin-forces-build-propose).');
529
+ require('derives-origin-trust-trusted', /--origin-trust=trusted\b/.test(
530
+ operative,
531
+ ), 'the policy derivation must emit `--origin-trust=trusted` for a trusted author.');
532
+ require('passes-origin-trust-to-intake', /steps\.policy\.outputs\.origin_trust_flag/.test(
533
+ operative,
534
+ ), 'the intake invocation must pass the derived `--origin-trust` flag (the ' +
535
+ 'stamp must reach `dorfl intake`).');
536
+ // The derivation must compose the gate env block (it READS the gates to derive).
537
+ require('reads-auto-build-gate', /DORFL_AUTO_BUILD\b/.test(
538
+ text,
539
+ ), 'the policy derivation must read the `DORFL_AUTO_BUILD` gate.');
540
+ require('reads-auto-task-gate', /DORFL_AUTO_TASK\b/.test(
541
+ text,
542
+ ), 'the policy derivation must read the `DORFL_AUTO_TASK` gate.');
543
+
544
+ // --- Insertion point E: the issue-thread review surface ---------------------
545
+ // E is REUSED via `intake` (which runs the lone-task review and posts to the
546
+ // thread). The workflow must request `issues: write` so that comment can land.
547
+ require('issues-write-permission', /\bissues:\s*write\b/.test(
548
+ operative,
549
+ ), 'must request `issues: write` so the review verdict / clarifying question ' +
550
+ 'can be posted back into the issue thread (insertion point E).');
551
+ // It must NOT route the review verdict through the PR-comment seam — E posts to
552
+ // the ISSUE (postIssueComment by number), NOT the PR (postPRComment by url).
553
+ require('no-pr-comment-seam', !/postPRComment\b/.test(
554
+ operative,
555
+ ), 'insertion point E posts to the ISSUE thread (postIssueComment by number), ' +
556
+ 'NOT the PR seam `postPRComment` (by url) — do not use the PR seam.');
557
+
558
+ // --- CI runs IN-PLACE: no isolation machinery ------------------------------
559
+ require('no-isolated-flag', !/--isolated\b/.test(
560
+ operative,
561
+ ), 'CI runs IN-PLACE (the container IS the isolation): no `--isolated` flag.');
562
+ require('no-remote-flag', !/--remote(?![-\w])/.test(
563
+ operative,
564
+ ), 'CI runs IN-PLACE: no `--remote` flag (laptop-only affordance).');
565
+
566
+ // --- A PER-ISSUE concurrency group ------------------------------------------
567
+ require('concurrency-group', /\bconcurrency:\s*[\s\S]*?group:/.test(
568
+ text,
569
+ ), 'must carry a CI `concurrency.group` so overlapping ticks never collide.');
570
+ require('per-issue-concurrency', /concurrency:\s*[\s\S]*?group:[^\n]*github\.event\.issue\.number/.test(
571
+ text,
572
+ ), 'the concurrency group must be PER-ISSUE (keyed by the issue number) so ' +
573
+ 'different issues still run in parallel.');
574
+
575
+ // --- US #9: NO `workflows` permission; cannot self-edit triggers ------------
576
+ require('no-workflows-permission', !/\bworkflows:\s*write\b/.test(
577
+ text,
578
+ ), 'the running job must request NO `workflows` permission (US #9: it can ' +
579
+ 'never edit `.github/workflows/**` / rewrite its own triggers).');
580
+ require('never-edits-dot-github-workflows', !/\.github\/workflows\//.test(
581
+ operative,
582
+ ), 'no emitted job step may touch `.github/workflows/**` (US #9).');
583
+
584
+ // --- Wires the SHARED composite setup action -------------------------------
585
+ require('uses-shared-setup-action', /uses:\s*\.\/\.github\/actions\/dorfl-setup\b/.test(
586
+ text,
587
+ ), 'the job must wire the shared composite setup action ' +
588
+ '(`./.github/actions/dorfl-setup`, emitted by the core task).');
589
+
590
+ return {ok: problems.length === 0, problems};
591
+ }