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,298 @@
1
+ import {existsSync, readFileSync} from 'node:fs';
2
+ import {join} from 'node:path';
3
+ import {ledgerRead, type LedgerReadStrategy} from './ledger-read.js';
4
+ import {
5
+ parseSidecar,
6
+ sidecarPathCandidates,
7
+ type SidecarModel,
8
+ } from './sidecar.js';
9
+ import {runAsync} from './git.js';
10
+ import {
11
+ buildLifecyclePools,
12
+ type LifecyclePoolGates,
13
+ type NeedsAnswersCandidate,
14
+ type ObservationCandidate,
15
+ } from './lifecycle-pools.js';
16
+ import type {SelectedLifecyclePools} from './select-priority.js';
17
+
18
+ /**
19
+ * The per-substrate I/O that FEEDS the shared, pure {@link buildLifecyclePools}
20
+ * enumeration (task `advance-autopick-lifecycle-pools`). The ENUMERATION LOGIC
21
+ * (which item becomes triage / surface / apply, the gates, the four-pool order)
22
+ * lives in ONE place ({@link buildLifecyclePools} + {@link selectPrioritised}); this
23
+ * module only reads the inputs that logic needs from each substrate:
24
+ *
25
+ * - IN-PLACE (sync, a working checkout) \u2014 {@link gatherLifecycleInPlace}: reads
26
+ * `work/notes/observations/` + the per-item `work/questions/<type>-<slug>.md` sidecar
27
+ * through the read seam + the filesystem, exactly as the in-place build-pool
28
+ * scan + `readItemSignals` already read in-place.
29
+ * - MIRROR-SIDE (async, a bare hub mirror's committed `main`) \u2014
30
+ * {@link gatherLifecycleMirror}: reads the SAME logical inputs from the mirror's
31
+ * committed tree via `git show` (the sidecar) + the read seam's
32
+ * `resolveMirrorState` (observations + the `needsAnswers` pool), so the
33
+ * two substrates AGREE.
34
+ *
35
+ * Both then call the SAME {@link buildLifecyclePools} \u2014 so the in-place and
36
+ * mirror-side enumerations are ONE unit, not two divergent ones. The gates default
37
+ * BOTH OFF (the interim hardcoded-off; the gate tasks flip them on).
38
+ */
39
+
40
+ /** A `needsAnswers:true` task/spec pulled from the live `work/` state (pre-sidecar). */
41
+ interface BlockedItem {
42
+ namespace: 'task' | 'spec';
43
+ slug: string;
44
+ }
45
+
46
+ /**
47
+ * Read the ACTIVE sidecar for `<namespace>:<slug>` from a WORKING checkout (sync),
48
+ * or `undefined` when none exists. Identity-keyed at `work/questions/<type>-<slug>.md`
49
+ * \u2014 the SAME path `readItemSignals` reads in-place.
50
+ */
51
+ function readSidecarInPlace(
52
+ repoPath: string,
53
+ namespace: 'task' | 'spec' | 'observation',
54
+ slug: string,
55
+ ): SidecarModel | undefined {
56
+ // Probe every candidate path (spec-<slug>.md, then the legacy prd-<slug>.md the
57
+ // migration command has not converted yet) and read the FIRST that exists.
58
+ for (const rel of sidecarPathCandidates(`${namespace}:${slug}`)) {
59
+ const abs = join(repoPath, rel);
60
+ if (existsSync(abs)) {
61
+ return parseSidecar(readFileSync(abs, 'utf8'));
62
+ }
63
+ }
64
+ return undefined;
65
+ }
66
+
67
+ /**
68
+ * Collect every `needsAnswers:true` task (from `work/backlog`) + prd (from
69
+ * `work/prds`) for the in-place repo, through the read seam (the SAME readers the
70
+ * build-pool scan uses). These are the SURFACE/APPLY candidates this task draws
71
+ * into the selection (today they are build/task-INELIGIBLE, so nothing else
72
+ * surfaces them).
73
+ */
74
+ function blockedItemsInPlace(
75
+ read: LedgerReadStrategy,
76
+ repoPath: string,
77
+ surfaceStaging: boolean,
78
+ ): BlockedItem[] {
79
+ const out: BlockedItem[] = [];
80
+ const state = read.resolveLocalState({repoPath});
81
+ for (const item of state.ready) {
82
+ if (item.needsAnswers === true) {
83
+ out.push({namespace: 'task', slug: item.slug});
84
+ }
85
+ }
86
+ const pool = read.resolveSpecPool({repoPath});
87
+ for (const spec of pool.specs) {
88
+ if (spec.needsAnswers === true) {
89
+ out.push({namespace: 'spec', slug: spec.slug});
90
+ }
91
+ }
92
+ // TASKED resting prds (`prds/tasked/`) — enumerated UNCONDITIONALLY (NOT behind
93
+ // `surfaceStaging`), because a prd may legitimately carry `needsAnswers:true`
94
+ // while resting in `prds/tasked/` (WORK-CONTRACT "A PRD that has drifted AFTER
95
+ // it was TASKED"). This is NOT a staging widening: a tasked prd is a durable
96
+ // resting state, like the pool, so it is enumerated like the pool. Routing
97
+ // still respects the gates in `buildLifecyclePools` (an ANSWERED sidecar -> the
98
+ // always-on APPLY pool so the human's answer is never STRANDED; a NO-sidecar
99
+ // tasked prd -> SURFACE, still gated by `surfaceBlockers`). Without this, a
100
+ // tasked prd's answered sidecar is enumerated by no pool and apply never runs
101
+ // on it (observation `tasked-prd-needsanswers-sidecar-stranded-no-apply-pool`).
102
+ for (const spec of read.resolveLocalSpecTasked({repoPath})) {
103
+ if (spec.needsAnswers === true) {
104
+ out.push({namespace: 'spec', slug: spec.slug});
105
+ }
106
+ }
107
+ // SURFACE-on-STAGING widening (prd
108
+ // `staging-surface-and-apply-promote-safety` F2): when `surfaceStaging` is
109
+ // ON, the candidate set ADDITIONALLY enumerates `needsAnswers` items resting
110
+ // in STAGING (`tasks/backlog/` + `prds/proposed/`), so a tasked item
111
+ // surfaces its questions BEFORE the human promotes it. BUILD/claim still
112
+ // reads POOL-only (`scoreItems` over `state.ready`); only the surface polarity
113
+ // widens here.
114
+ if (surfaceStaging) {
115
+ for (const item of read.resolveLocalTaskStaging({repoPath})) {
116
+ if (item.needsAnswers === true) {
117
+ out.push({namespace: 'task', slug: item.slug});
118
+ }
119
+ }
120
+ for (const spec of read.resolveLocalSpecStaging({repoPath})) {
121
+ if (spec.needsAnswers === true) {
122
+ out.push({namespace: 'spec', slug: spec.slug});
123
+ }
124
+ }
125
+ }
126
+ return out;
127
+ }
128
+
129
+ /**
130
+ * Gather + build the lifecycle pools for an IN-PLACE working checkout (sync).
131
+ * Reads `work/notes/observations/` + the per-item sidecar state through the read seam +
132
+ * the filesystem, then hands them to the shared {@link buildLifecyclePools}. The
133
+ * gates default BOTH OFF (the interim hardcoded-off, calm by default).
134
+ */
135
+ export function gatherLifecycleInPlace(input: {
136
+ repoPath: string;
137
+ read?: LedgerReadStrategy;
138
+ gates?: LifecyclePoolGates;
139
+ }): SelectedLifecyclePools {
140
+ const read = input.read ?? ledgerRead;
141
+ const repoPath = input.repoPath;
142
+
143
+ const rawObservations = read.resolveLocalState({repoPath}).observations;
144
+ const observations: ObservationCandidate[] = rawObservations.map((obs) => ({
145
+ slug: obs.slug,
146
+ triaged: obs.triaged,
147
+ sidecar: readSidecarInPlace(repoPath, 'observation', obs.slug),
148
+ }));
149
+ const surfaceStaging = input.gates?.surfaceStaging === true;
150
+ const needsAnswers: NeedsAnswersCandidate[] = blockedItemsInPlace(
151
+ read,
152
+ repoPath,
153
+ surfaceStaging,
154
+ ).map((item) => ({
155
+ repoPath,
156
+ namespace: item.namespace,
157
+ slug: item.slug,
158
+ sidecar: readSidecarInPlace(repoPath, item.namespace, item.slug),
159
+ }));
160
+
161
+ return buildLifecyclePools({
162
+ repoPath,
163
+ observations,
164
+ needsAnswers,
165
+ gates: input.gates,
166
+ });
167
+ }
168
+
169
+ /**
170
+ * Read the ACTIVE sidecar for `<namespace>:<slug>` from a BARE hub mirror's
171
+ * committed `<ref>:work/questions/<type>-<slug>.md` via `git show` (the SAME
172
+ * mechanism the mirror-ref ledger reads use), or `undefined` when none exists.
173
+ */
174
+ async function readSidecarMirror(
175
+ mirrorPath: string,
176
+ ref: string,
177
+ namespace: 'task' | 'spec' | 'observation',
178
+ slug: string,
179
+ env: NodeJS.ProcessEnv | undefined,
180
+ ): Promise<SidecarModel | undefined> {
181
+ // Probe every candidate committed path (spec-<slug>.md, then the legacy
182
+ // prd-<slug>.md the migration command has not converted yet) via `git show`,
183
+ // returning the FIRST that resolves.
184
+ for (const rel of sidecarPathCandidates(`${namespace}:${slug}`)) {
185
+ const object = `${ref}:${rel}`;
186
+ const show = await runAsync('git', ['show', object], mirrorPath, {env});
187
+ if (show.status === 0) {
188
+ return parseSidecar(show.stdout);
189
+ }
190
+ }
191
+ return undefined;
192
+ }
193
+
194
+ /**
195
+ * Gather + build the lifecycle pools for a MIRROR-SIDE bare hub mirror (async).
196
+ * Reads the SAME logical inputs as {@link gatherLifecycleInPlace} \u2014 observations +
197
+ * the `needsAnswers` pool from the mirror's committed `main` (via
198
+ * `resolveMirrorState`), the prd pool via `resolveMirrorSpecPool`, and each item's
199
+ * sidecar via `git show` \u2014 then hands them to the SAME shared
200
+ * {@link buildLifecyclePools}, so the in-place + mirror enumerations AGREE.
201
+ */
202
+ export async function gatherLifecycleMirror(input: {
203
+ mirrorPath: string;
204
+ ref?: string;
205
+ read?: LedgerReadStrategy;
206
+ gates?: LifecyclePoolGates;
207
+ env?: NodeJS.ProcessEnv;
208
+ }): Promise<SelectedLifecyclePools> {
209
+ const read = input.read ?? ledgerRead;
210
+ const mirrorPath = input.mirrorPath;
211
+ const ref = input.ref ?? 'main';
212
+ const env = input.env;
213
+
214
+ const state = await read.resolveMirrorState({mirrorPath, ref, env});
215
+ const specPool = await read.resolveMirrorSpecPool({mirrorPath, ref, env});
216
+ const surfaceStaging = input.gates?.surfaceStaging === true;
217
+ const [taskStaging, specStaging] = surfaceStaging
218
+ ? await Promise.all([
219
+ read.resolveMirrorTaskStaging({mirrorPath, ref, env}),
220
+ read.resolveMirrorSpecStaging({mirrorPath, ref, env}),
221
+ ])
222
+ : [[], []];
223
+
224
+ const blocked: BlockedItem[] = [];
225
+ for (const item of state.ready) {
226
+ if (item.needsAnswers === true) {
227
+ blocked.push({namespace: 'task', slug: item.slug});
228
+ }
229
+ }
230
+ for (const spec of specPool.specs) {
231
+ if (spec.needsAnswers === true) {
232
+ blocked.push({namespace: 'spec', slug: spec.slug});
233
+ }
234
+ }
235
+ // TASKED resting prds (`<ref>:work/prds/tasked/`) — enumerated UNCONDITIONALLY,
236
+ // the mirror-side counterpart of the in-place tasked-prd enumeration above
237
+ // (so a `needsAnswers` tasked prd's answered sidecar is never stranded on the
238
+ // mirror/CI advance path either). Routing still respects the gates.
239
+ const specTasked = await read.resolveMirrorSpecTasked({mirrorPath, ref, env});
240
+ for (const spec of specTasked) {
241
+ if (spec.needsAnswers === true) {
242
+ blocked.push({namespace: 'spec', slug: spec.slug});
243
+ }
244
+ }
245
+ // SURFACE-on-STAGING widening (prd
246
+ // `staging-surface-and-apply-promote-safety` F2): mirror-side counterpart of
247
+ // the in-place widening above — enumerate `needsAnswers` items in
248
+ // STAGING (`tasks/backlog/` + `prds/proposed/`) from the bare mirror's
249
+ // committed `<ref>` tree, so the in-place + mirror surfaces AGREE. The
250
+ // staging reads are skipped entirely when the gate is OFF (no extra git
251
+ // ls-tree work in the legacy mode).
252
+ for (const item of taskStaging) {
253
+ if (item.needsAnswers === true) {
254
+ blocked.push({namespace: 'task', slug: item.slug});
255
+ }
256
+ }
257
+ for (const spec of specStaging) {
258
+ if (spec.needsAnswers === true) {
259
+ blocked.push({namespace: 'spec', slug: spec.slug});
260
+ }
261
+ }
262
+
263
+ const needsAnswers: NeedsAnswersCandidate[] = await Promise.all(
264
+ blocked.map(async (item) => ({
265
+ repoPath: mirrorPath,
266
+ namespace: item.namespace,
267
+ slug: item.slug,
268
+ sidecar: await readSidecarMirror(
269
+ mirrorPath,
270
+ ref,
271
+ item.namespace,
272
+ item.slug,
273
+ env,
274
+ ),
275
+ })),
276
+ );
277
+
278
+ const observations: ObservationCandidate[] = await Promise.all(
279
+ state.observations.map(async (obs) => ({
280
+ slug: obs.slug,
281
+ triaged: obs.triaged,
282
+ sidecar: await readSidecarMirror(
283
+ mirrorPath,
284
+ ref,
285
+ 'observation',
286
+ obs.slug,
287
+ env,
288
+ ),
289
+ })),
290
+ );
291
+
292
+ return buildLifecyclePools({
293
+ repoPath: mirrorPath,
294
+ observations,
295
+ needsAnswers,
296
+ gates: input.gates,
297
+ });
298
+ }
@@ -0,0 +1,250 @@
1
+ import type {SidecarModel} from './sidecar.js';
2
+ import {allAnswered} from './sidecar.js';
3
+ import type {LifecycleSelectedItem} from './select-priority.js';
4
+
5
+ /**
6
+ * The SHARED, PURE enumeration of the advance auto-pick's LIFECYCLE POOLS (task
7
+ * `advance-autopick-lifecycle-pools`) \u2014 the MISSING FOUNDATION a 2026-06-12 review
8
+ * found. Before this, `performAdvanceAuto` (in-place) and `scanMirrorPool`
9
+ * (mirror-side) enumerated ONLY the two BUILD pools (eligible tasks + taskable
10
+ * prds), so a bare / `-n` / loop / CI `advance` could ONLY build tasks + task
11
+ * prds. The lifecycle rungs (triage / surface / apply) were EXPLICIT-INVOCATION-
12
+ * ONLY because NOTHING enumerated observations or `needsAnswers`-blocked items
13
+ * into the selection. This unit closes that gap, at the SELECTION layer ONLY (it
14
+ * does NOT touch the classifier `advance-classify.ts` or the rung bodies \u2014 the
15
+ * tick still re-classifies each selected item and runs the right rung).
16
+ *
17
+ * It is ONE shared unit reused by BOTH the in-place caller (`performAdvanceAuto`)
18
+ * and the mirror-side caller (`scanMirrorPool` \u2192 the loop/CI drivers), NOT two
19
+ * divergent enumerations. The per-substrate I/O (reading `work/notes/observations/` +
20
+ * the per-item sidecar state) is done CALLER-SIDE through the read seam (sync
21
+ * in-place, async mirror-ref) and the already-resolved inputs are handed here \u2014
22
+ * exactly as `taskableSpecs` is fed by each caller. This unit is then pure: no I/O.
23
+ *
24
+ * **Three lifecycle sub-pools, gated by PURPOSE (ADR `ci-config-policy-and-gate-
25
+ * family.md` \u00a74 \u2014 gates govern CREATE only; CONSUME is always-on):**
26
+ *
27
+ * - **triage** \u2014 UNTRIAGED observations (no `triaged:` settled marker). A CREATE
28
+ * act (the bot mints a promote/keep/delete question), so gated by
29
+ * {@link LifecyclePoolGates.triage} (the future `observationTriage` gate).
30
+ * - **surface** \u2014 `needsAnswers`-blocked tasks/prds with NO all-answered sidecar
31
+ * (no sidecar yet, or a still-pending one). A CREATE act (the bot mints the
32
+ * blocker question), so gated by {@link LifecyclePoolGates.surface} (the future
33
+ * `surfaceBlockers` gate). A PENDING sidecar is NOT enumerated (it would only
34
+ * no-op \u2014 leaving it out keeps the pool calm + thrash-free).
35
+ * - **apply** \u2014 `needsAnswers`-blocked items WITH an all-answered sidecar. A
36
+ * CONSUME act (the bot applies the human's committed answer), ALWAYS allowed,
37
+ * never gated \u2014 gating it would STRAND a human's answer (\u00a74's create-vs-consume
38
+ * invariant). So an answered sidecar is selected even with BOTH create-gates
39
+ * off.
40
+ *
41
+ * **INTERIM SAFETY (task `## Decisions`, DECIDED): the create-gates are born
42
+ * OFF.** The gate tasks (`observation-triage-tri-state-gate` /
43
+ * `surface-blockers-gate`) land AFTER this one, so this task must be SAFE
44
+ * STANDALONE: {@link LifecyclePoolGates} default `triage:false` + `surface:false`,
45
+ * so the triage + surface sub-pools contribute NOTHING by default and landing this
46
+ * task alone auto-triages / auto-surfaces NOTHING (it changes no repo's
47
+ * behaviour). The gate tasks REPLACE the hardcoded-off the callers pass with the
48
+ * real `observationTriage` / `surfaceBlockers` config read. The apply sub-pool is
49
+ * NOT gated (consume is always-on), so an answered sidecar always applies.
50
+ */
51
+
52
+ /**
53
+ * The create-side gates for the lifecycle pools (ADR \u00a72/\u00a74). Both default OFF
54
+ * (the calm interim state) \u2014 the gate tasks flip them on by reading
55
+ * `observationTriage` / `surfaceBlockers` from config. `apply` is NOT here: it is
56
+ * the CONSUME phase, ALWAYS allowed (never gated).
57
+ */
58
+ export interface LifecyclePoolGates {
59
+ /**
60
+ * May the TRIAGE sub-pool (untriaged observations) contribute to the selection?
61
+ * Default `false` (the interim hardcoded-off; the `observationTriage` gate
62
+ * replaces this). OFF \u21d2 observations are never auto-selected.
63
+ */
64
+ triage?: boolean;
65
+ /**
66
+ * May the SURFACE sub-pool (`needsAnswers`-blocked, no all-answered sidecar)
67
+ * contribute? Default `false` (the interim hardcoded-off; the `surfaceBlockers`
68
+ * gate replaces this). OFF \u21d2 blocked items are never auto-surfaced.
69
+ */
70
+ surface?: boolean;
71
+ /**
72
+ * Does the SURFACE candidate set widen to include STAGING (`tasks/backlog/` +
73
+ * `prds/proposed/`), or stay POOL-ONLY? This field is CONSUMED BY THE
74
+ * GATHER (`lifecycle-gather.ts`), NOT by {@link buildLifecyclePools} — the
75
+ * builder is pure and only routes already-resolved candidates between surface
76
+ * / apply by sidecar-answered-state. The gather decides WHICH items become
77
+ * candidates in the first place; this gate widens that input set when `true`.
78
+ * Default `false` at THIS library boundary (calm; the CLI threads
79
+ * `config.surfaceStaging` which itself defaults to `true`, so the user-visible
80
+ * default is `true`). Spec `staging-surface-and-apply-promote-safety` F2.
81
+ * BUILD/claim eligibility is UNCHANGED in either mode — staging items stay
82
+ * non-claimable, the trust model is untouched.
83
+ */
84
+ surfaceStaging?: boolean;
85
+ }
86
+
87
+ /**
88
+ * One `needsAnswers`-blocked task/spec candidate for the SURFACE/APPLY sub-pools,
89
+ * before this unit routes it. The caller resolves the item's namespace + slug
90
+ * (from `work/backlog` tasks + `work/specs` specs carrying `needsAnswers:true`) and
91
+ * its ACTIVE sidecar (parsed from `work/questions/<type>-<slug>.md`, or
92
+ * `undefined` when none exists) \u2014 through the read seam (sync in-place / async
93
+ * mirror-ref). This unit then routes it to APPLY (sidecar all-answered, consume,
94
+ * always-on) or SURFACE (no all-answered sidecar, create, gated). PURE: no I/O.
95
+ */
96
+ export interface NeedsAnswersCandidate {
97
+ /** The repo this item lives in (a working checkout in-place, the mirror path remote). */
98
+ repoPath: string;
99
+ /** `'task'` (a `work/backlog/` task) or `'spec'` (a `work/specs/` spec). */
100
+ namespace: 'task' | 'spec';
101
+ /** The bare slug. */
102
+ slug: string;
103
+ /** The parsed ACTIVE sidecar, or `undefined` when none exists yet. */
104
+ sidecar: SidecarModel | undefined;
105
+ }
106
+
107
+ /**
108
+ * One OBSERVATION candidate for the TRIAGE/APPLY sub-pools, resolved through
109
+ * the same read seam as its `needsAnswers` task/spec siblings (task
110
+ * `route-answered-observation-sidecar-to-apply-pool`). The classifier receives
111
+ * a sidecar-aware observation shape so an ANSWERED observation sidecar routes
112
+ * to the always-on APPLY pool (a CONSUME act — the human's answer is never
113
+ * stranded), while a NO/PENDING sidecar UNTRIAGED observation stays a TRIAGE
114
+ * candidate (gated) as today. PURE: the caller resolves the active sidecar (via
115
+ * {@link sidecarPathFor} — the SAME resolver the task/prd `needsAnswers`
116
+ * candidates use); this unit only routes.
117
+ */
118
+ export interface ObservationCandidate {
119
+ /** The observation's identity — its FILENAME slug (never a foreign frontmatter `slug:`). */
120
+ slug: string;
121
+ /**
122
+ * The SETTLED marker (`triaged:` frontmatter): a non-empty value drops the
123
+ * observation out of the TRIAGE pool; `undefined` ⇒ UNTRIAGED. IGNORED for
124
+ * the APPLY routing (an ANSWERED sidecar wins regardless of the marker: a
125
+ * human's answer must never be stranded — task `## Decisions`).
126
+ */
127
+ triaged: string | undefined;
128
+ /** The parsed ACTIVE sidecar (`work/questions/observation-<slug>.md`), or `undefined`. */
129
+ sidecar: SidecarModel | undefined;
130
+ }
131
+
132
+ /** Inputs to {@link buildLifecyclePools}: the raw lifecycle candidates + the gates. */
133
+ export interface LifecyclePoolsInput {
134
+ /** The repo whose lifecycle items these are (carried onto each selected item). */
135
+ repoPath: string;
136
+ /**
137
+ * Every observation in `work/notes/observations/` (the read seam's observation
138
+ * read), each with its resolved active sidecar (task
139
+ * `route-answered-observation-sidecar-to-apply-pool`). This unit routes each
140
+ * to APPLY (sidecar all-answered, consume, always-on) or TRIAGE (untriaged, no
141
+ * all-answered sidecar; create, gated).
142
+ */
143
+ observations: ObservationCandidate[];
144
+ /**
145
+ * Every `needsAnswers:true` task/prd (the create-side blocked items), each
146
+ * with its resolved active sidecar. This unit routes each to SURFACE or APPLY.
147
+ */
148
+ needsAnswers: NeedsAnswersCandidate[];
149
+ /**
150
+ * The create-side gates (default BOTH OFF \u2014 the interim hardcoded-off). The
151
+ * apply sub-pool is never gated.
152
+ */
153
+ gates?: LifecyclePoolGates;
154
+ }
155
+
156
+ /**
157
+ * The three lifecycle sub-pools, each an ordered {@link LifecycleSelectedItem[]}.
158
+ * The caller concatenates them into the overall selection in the four-pool order
159
+ * (see {@link selectPrioritised}); `apply` is consume (always present), `triage` /
160
+ * `surface` are present only when their gate is on.
161
+ */
162
+ export interface LifecyclePools {
163
+ /** `apply` items (answered sidecars; CONSUME, always present). */
164
+ apply: LifecycleSelectedItem[];
165
+ /** `surface` items (blocked, no all-answered sidecar; gated by `gates.surface`). */
166
+ surface: LifecycleSelectedItem[];
167
+ /** `triage` items (untriaged observations; gated by `gates.triage`). */
168
+ triage: LifecycleSelectedItem[];
169
+ }
170
+
171
+ /**
172
+ * Build the three lifecycle sub-pools from the raw candidates + the gates, PURE.
173
+ * Each selected item carries the lifecycle `namespace` discriminator so the
174
+ * driver's per-item dispatch can map it to the right TICK arg (observation \u2192
175
+ * `obs:<slug>`; a blocked task/prd \u2192 `task:`/`prd:<slug>`, which the tick then
176
+ * classifies into surface/apply/no-op). This unit decides WHICH sub-pool each item
177
+ * belongs to (and whether its gate lets it through); the TICK re-classifies and
178
+ * runs the actual rung (the classifier + rung bodies are unchanged).
179
+ *
180
+ * Routing:
181
+ * - an UNTRIAGED observation \u2192 `triage` (gated by `gates.triage`);
182
+ * - a `needsAnswers` item with an ALL-ANSWERED sidecar \u2192 `apply` (always);
183
+ * - a `needsAnswers` item with NO all-answered sidecar \u2192 `surface` (gated by
184
+ * `gates.surface`); a PENDING sidecar is NOT enumerated into either pool (it
185
+ * would only no-op \u2014 leaving it out keeps the pool calm).
186
+ */
187
+ export function buildLifecyclePools(
188
+ input: LifecyclePoolsInput,
189
+ ): LifecyclePools {
190
+ const gates = input.gates ?? {};
191
+ const triageOn = gates.triage === true;
192
+ const surfaceOn = gates.surface === true;
193
+
194
+ // --- observation routing: apply (all-answered sidecar) vs triage (untriaged) ---
195
+ const triage: LifecycleSelectedItem[] = [];
196
+ const apply: LifecycleSelectedItem[] = [];
197
+ for (const obs of input.observations) {
198
+ const answered = obs.sidecar !== undefined && allAnswered(obs.sidecar);
199
+ if (answered) {
200
+ // CONSUME (apply the human's committed answer) — ALWAYS allowed, even
201
+ // with the triage create-gate off (the create-vs-consume invariant, ADR
202
+ // `ci-config-policy-and-gate-family` §4). An answered sidecar wins even
203
+ // when the observation body also carries a `triaged:` marker: a human's
204
+ // answer must never be stranded (task `## Decisions`).
205
+ apply.push({
206
+ repoPath: input.repoPath,
207
+ slug: obs.slug,
208
+ namespace: 'observation',
209
+ });
210
+ } else if (obs.triaged === undefined && triageOn) {
211
+ // CREATE (mint the promote/keep/delete question) — gated by
212
+ // `observationTriage`. An untriaged observation with NO sidecar or a
213
+ // PENDING sidecar is a triage candidate as today.
214
+ triage.push({
215
+ repoPath: input.repoPath,
216
+ slug: obs.slug,
217
+ namespace: 'observation',
218
+ });
219
+ }
220
+ // else: SETTLED (triaged:) with no answered sidecar — NOT enumerated.
221
+ }
222
+
223
+ // --- surface / apply: split `needsAnswers` items by sidecar answered-state ---
224
+ const surface: LifecycleSelectedItem[] = [];
225
+ for (const candidate of input.needsAnswers) {
226
+ const answered =
227
+ candidate.sidecar !== undefined && allAnswered(candidate.sidecar);
228
+ if (answered) {
229
+ // CONSUME (apply the human's committed answer) \u2014 ALWAYS allowed, even with
230
+ // both create-gates off (the create-vs-consume invariant, ADR \u00a74).
231
+ apply.push({
232
+ repoPath: candidate.repoPath,
233
+ slug: candidate.slug,
234
+ namespace: candidate.namespace,
235
+ });
236
+ } else if (candidate.sidecar === undefined && surfaceOn) {
237
+ // CREATE (mint the blocker question) \u2014 gated by `surfaceBlockers`. Only an
238
+ // item with NO sidecar yet is a surface candidate; a PENDING sidecar would
239
+ // only no-op, so it is left OUT of the pool (keeps the selection calm).
240
+ surface.push({
241
+ repoPath: candidate.repoPath,
242
+ slug: candidate.slug,
243
+ namespace: candidate.namespace,
244
+ });
245
+ }
246
+ // else: a PENDING sidecar (exists, not all-answered) \u2014 NOT enumerated.
247
+ }
248
+
249
+ return {apply, surface, triage};
250
+ }