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
package/src/scan.ts ADDED
@@ -0,0 +1,611 @@
1
+ import type {Config} from './config.js';
2
+ import type {ConfigOverrideMap} from './config-override.js';
3
+ import {resolveEligibility, type EligibilityResult} from './eligibility.js';
4
+ import {
5
+ ledgerRead,
6
+ type LedgerReadyItem,
7
+ type LedgerSpecPool,
8
+ type LocalLedgerState,
9
+ } from './ledger-read.js';
10
+ import {listMirrors} from './registry.js';
11
+ import {
12
+ fetchMirrorMainOrWarn,
13
+ resolveRepoConfigFromMirror,
14
+ } from './repo-mirror.js';
15
+ import {resolveRepoConfig} from './repo-config.js';
16
+ import {taskableSpecs} from './select-priority.js';
17
+ import {
18
+ lintLocalLedger,
19
+ lintRefLedger,
20
+ type DuplicateSlug,
21
+ } from './ledger-lint.js';
22
+ import {
23
+ gatherLifecycleInPlace,
24
+ gatherLifecycleMirror,
25
+ } from './lifecycle-gather.js';
26
+ import type {LifecyclePoolGates} from './lifecycle-pools.js';
27
+ import {
28
+ heldTaskSlugs,
29
+ listItemLockEntries,
30
+ type LockEntry,
31
+ } from './item-lock.js';
32
+
33
+ /**
34
+ * The CREATE-side lifecycle gates for the propose-matrix lifecycle pool, derived
35
+ * from a repo's resolved config. Maps the config's question-surfacing gate family
36
+ * onto the boolean {@link LifecyclePoolGates} `buildLifecyclePools` takes:
37
+ *
38
+ * - `observationTriage !== 'off'` ⇒ `triage` ON (BOTH `ask` and `auto` enumerate
39
+ * triage candidates into the matrix identically; the ask/auto distinction is a
40
+ * DISPOSITION concern enforced LATER by the triage rung itself, not by whether
41
+ * a leg exists — the matrix only decides "is there a leg at all?").
42
+ * - `surfaceBlockers` ⇒ `surface` ON.
43
+ *
44
+ * `apply` is NOT a gate (CONSUME is always-on; `buildLifecyclePools` enumerates
45
+ * answered sidecars regardless), so a committed answer always applies even with
46
+ * both create-gates calm — the same create-vs-consume invariant the autopick
47
+ * drivers honour (ADR `ci-config-policy-and-gate-family` §4). Reused on BOTH the
48
+ * mirror (`scan`) and in-place (`scanRepoPaths`) substrates so the propose matrix
49
+ * agrees with the `advance -n` / `run` selection.
50
+ */
51
+ export function lifecycleGatesFrom(config: {
52
+ observationTriage: string;
53
+ surfaceBlockers: boolean;
54
+ /**
55
+ * Spec `staging-surface-and-apply-promote-safety` F2 — the gate that widens
56
+ * the SURFACE candidate set into STAGING (`tasks/backlog/` + `prds/proposed/`).
57
+ * Threaded here so the `scan --json` `lifecycle.surface[]` reflects the
58
+ * expanded pool and the CI matrix enumerates staging surface legs. BUILD/claim
59
+ * stays pool-only — only this lifecycle path widens.
60
+ */
61
+ surfaceStaging: boolean;
62
+ }): LifecyclePoolGates {
63
+ return {
64
+ triage: config.observationTriage !== 'off',
65
+ surface: config.surfaceBlockers === true,
66
+ surfaceStaging: config.surfaceStaging === true,
67
+ };
68
+ }
69
+
70
+ /**
71
+ * A lifecycle item as it appears on a {@link RepoReport.lifecycle} sub-pool: the
72
+ * bare `slug` plus, for surface/apply, the `namespace` discriminator the matrix
73
+ * `jq` projects into a `task:`/`spec:`/`observation:` prefix. Triage items carry
74
+ * only `{slug}` — the `obs:` prefix is fixed in the matrix `jq`.
75
+ */
76
+ export interface ScannedTriageItem {
77
+ slug: string;
78
+ }
79
+ /**
80
+ * A surface/apply lifecycle item, with its namespace. SURFACE only ever carries
81
+ * `needsAnswers` task/prd items (an observation with no sidecar goes to `triage`,
82
+ * not `surface`). APPLY, however, ALSO carries an ANSWERED OBSERVATION: since the
83
+ * classifier (`buildLifecyclePools`) routes an observation whose sidecar is
84
+ * all-answered to `apply` (CONSUME, always-on), the projection MUST keep it here
85
+ * so the CI enumerate `jq` (`.namespace + ":" + .slug`) emits an `observation:<slug>`
86
+ * apply leg. Dropping it (the pre-`route-answered-observation-sidecar-to-apply-pool`
87
+ * assumption that apply is task/spec-only) STRANDS every answered observation:
88
+ * gone from `triage` AND absent from `apply`, so CI never schedules it.
89
+ */
90
+ export interface ScannedBlockedItem {
91
+ namespace: 'task' | 'spec' | 'observation';
92
+ slug: string;
93
+ }
94
+
95
+ /**
96
+ * The per-repo LIFECYCLE pool on `scan --json` (the `triage`/`surface`/`apply`
97
+ * companion of `items[]`/`prds[]`), gated by the per-repo question-surfacing
98
+ * config and computed by REUSING `lifecycle-gather.ts` → {@link buildLifecyclePools}
99
+ * (NOT a forked predicate) so it AGREES with the `advance -n` / `run` selection.
100
+ * This is what makes the propose-mode CI matrix enumerate the WHOLE answer-loop —
101
+ * `obs:<slug>` triage legs, `task:`/`spec:<slug>` surface legs (`needsAnswers`, no
102
+ * answered sidecar) AND `task:`/`spec:<slug>` apply legs (`needsAnswers`, answered
103
+ * sidecar) — not only build/task legs
104
+ * (`ci-propose-matrix-enumerates-lifecycle-items`). Inert by default: with
105
+ * `observationTriage:off` + `surfaceBlockers:false` (the calm defaults) triage +
106
+ * surface are empty; apply is the always-on consume pool.
107
+ */
108
+ export interface ScannedLifecycle {
109
+ /** Untriaged observations → `obs:<slug>` legs (gated by `observationTriage`). */
110
+ triage: ScannedTriageItem[];
111
+ /** `needsAnswers` task/prd items with no answered sidecar → surface legs (gated by `surfaceBlockers`). */
112
+ surface: ScannedBlockedItem[];
113
+ /**
114
+ * Items WITH an all-answered sidecar → apply legs (CONSUME, always-on). Carries
115
+ * `needsAnswers` tasks/prds AND answered OBSERVATIONS (namespace `'observation'`),
116
+ * so the matrix `jq` emits `task:`/`spec:`/`observation:` apply legs alike.
117
+ */
118
+ apply: ScannedBlockedItem[];
119
+ }
120
+
121
+ /**
122
+ * One agent-POOL task with its parsed gate/deps, before eligibility resolution.
123
+ * This IS the read seam's resolved pool shape ({@link LedgerReadyItem}); the
124
+ * `Ready` noun follows the agent-pool folder `work/tasks/ready/` (staging is
125
+ * `work/tasks/backlog/`), per ADR `rename-task-pool-folder-todo-to-ready`.
126
+ */
127
+ export type ReadyItem = LedgerReadyItem;
128
+
129
+ /** A pool item plus its resolved eligibility verdict. */
130
+ export interface ScannedItem extends ReadyItem {
131
+ eligibility: EligibilityResult;
132
+ }
133
+
134
+ /**
135
+ * A PRD entry in `scan --json`'s taskable-prd pool — the SAME shape an eligible
136
+ * task carries in `items[]` (a `slug` + an `eligibility.eligible` boolean), so
137
+ * the propose-matrix `jq` filter mirrors the task one: `select(.eligibility.eligible)
138
+ * | "spec:" + .slug`. "Eligible" here means TASKABLE — the per-repo `autoTask`
139
+ * gate + the `humanOnly`/`needsAnswers`/`taskedAfter` predicates of `taskableSpecs`
140
+ * (`autoslice-gate`'s pure predicate). Sits under {@link RepoReport.prds} (and
141
+ * the cwd section's `repo.prds`), DISTINCT from the task-only `items[]` because
142
+ * tasks and prds are different verbs and project to different `task:`/`spec:`
143
+ * prefixes — a discriminator on `items[]` would pollute the surface other readers
144
+ * already consume.
145
+ */
146
+ export interface ScannedSpec {
147
+ slug: string;
148
+ eligibility: {eligible: boolean};
149
+ }
150
+
151
+ /** All scanned pool (`work/tasks/ready/`) items for one participating repo. */
152
+ export interface RepoReport {
153
+ /**
154
+ * The repo identity for this row. In the registry model (`scan`) it is the
155
+ * hub-mirror PATH; for the working-tree scan (`run`, in-place) it is the
156
+ * working checkout path.
157
+ */
158
+ path: string;
159
+ items: ScannedItem[];
160
+ /**
161
+ * The TASKABLE-SPEC pool for this repo (the `specs[]` companion of `items[]`):
162
+ * every spec in `work/prds/ready/` not already in `work/prds/tasked/`, each tagged with
163
+ * `eligibility.eligible` from {@link taskableSpecs} (the SAME `autoslice-gate`
164
+ * predicate the mirror-side pool scan uses — NOT a forked predicate). This is
165
+ * what makes the propose-mode CI matrix enumerate `spec:<slug>` legs for ready
166
+ * ungated prds alongside `task:<slug>` legs for eligible tasks (the
167
+ * `ci-propose-matrix-must-enumerate-sliceable-prds-not-only-slices` task): the
168
+ * propose `enumerate` `jq` unions both pools and emits one matrix leg per item.
169
+ * The `autoTask` gate still BINDS — a repo with `autoTask` off yields an
170
+ * all-`eligible:false` pool (so no `spec:` legs).
171
+ */
172
+ specs: ScannedSpec[];
173
+ /**
174
+ * The per-repo LIFECYCLE pool (the `triage`/`surface`/`apply` companion of
175
+ * `items[]`/`prds[]`): untriaged observations + `needsAnswers` tasks/prds split
176
+ * by sidecar answered-state, gated by this repo's `observationTriage` /
177
+ * `surfaceBlockers` config and computed by REUSING `lifecycle-gather.ts` (NOT a
178
+ * forked predicate). Surfaced on BOTH `repos[]` (mirror) and `cwd.repo`
179
+ * (in-place), the same dual-surface `items`/`prds` use, so the propose-mode CI
180
+ * matrix can enumerate the WHOLE answer-loop
181
+ * (`ci-propose-matrix-enumerates-lifecycle-items`). Inert with the calm-default
182
+ * gates (empty triage/surface; apply is the always-on consume pool).
183
+ */
184
+ lifecycle: ScannedLifecycle;
185
+ /**
186
+ * The one-slug-one-folder LINT result (prd `ledger-integrity` story 3): any
187
+ * slug present in MORE THAN ONE `work/` status folder in THIS repo's ledger.
188
+ * Empty ⇒ a clean ledger. Non-empty ⇒ a corrupt ledger the formatter WARNS
189
+ * about loudly and a human must resolve (never auto-fixed). Derived by listing
190
+ * folder residence, not from any index.
191
+ */
192
+ ledgerDuplicates: DuplicateSlug[];
193
+ /**
194
+ * The PER-ITEM LOCK in-flight view for this repo (prd
195
+ * `ledger-status-per-item-lock-refs` US #8; task
196
+ * `needs-attention-as-stuck-lock-state`): the held lock entries read from the
197
+ * repo's `refs/dorfl/lock/*` refs — `active` holds (in-progress) and
198
+ * `stuck` holds (needs-attention) + reasons. ADDITIVE to the folder-based pool
199
+ * view above (the interim dual-write half; eligibility/selection stay OFFLINE on
200
+ * `main` from the pool `tasks/ready/`, with held slugs SUBTRACTED — this field is the
201
+ * read-only surface, NOT a selection input). Empty on a repo with no held locks
202
+ * or when the lock refs could not be read (best-effort, see
203
+ * {@link listItemLockEntries}). Optional so older literals stay valid.
204
+ */
205
+ lockHeld?: LockEntry[];
206
+ }
207
+
208
+ /** The full cross-repo scan result. */
209
+ export interface ScanReport {
210
+ repos: RepoReport[];
211
+ totalItems: number;
212
+ totalEligible: number;
213
+ }
214
+
215
+ /**
216
+ * Collect the set of slugs present in a repo's `work/done/`. Used to resolve
217
+ * `blockedBy` (per-repo only). Falls back to the filename when an item has no
218
+ * `slug` frontmatter. Resolves THROUGH the read seam's local-tree method
219
+ * ({@link ledgerRead}) — the single insertion point for the `work/` state read.
220
+ */
221
+ export function readDoneSlugs(repoPath: string): Set<string> {
222
+ return ledgerRead.resolveLocalState({repoPath}).doneSlugs;
223
+ }
224
+
225
+ /**
226
+ * Read and parse every `work/tasks/ready/*.md` (the agent POOL) for a repo, sorted
227
+ * by slug. Resolves THROUGH the read seam's local-tree method
228
+ * ({@link ledgerRead}).
229
+ */
230
+ export function readReadyItems(repoPath: string): ReadyItem[] {
231
+ return ledgerRead.resolveLocalState({repoPath}).ready;
232
+ }
233
+
234
+ /**
235
+ * Resolve a per-repo `ScannedItem[]` from an already-resolved `work/` state +
236
+ * the repo's `autoBuild` policy. The shared core of BOTH the registry scan
237
+ * (mirror-ref state) and the working-tree scan (`run`/in-place) — neither learns
238
+ * how the `work/` state was read; they just hand it here. Exported so the
239
+ * MIRROR-SIDE pool scan (`mirror-pool-scan.ts`) scores the bare-mirror task pool
240
+ * through the EXACT same eligibility path as in-place (`do-autopick`), not a fork.
241
+ */
242
+ /**
243
+ * Score a prd pool down to its TASKABLE subset, then label every prd with
244
+ * `eligibility.eligible` (true ⇔ taskable). REUSES {@link taskableSpecs} —
245
+ * the SAME `autoslice-gate` predicate the mirror-side `scanMirrorPool` + the
246
+ * in-place `do-autopick` pool already run — so what is taskable does not
247
+ * fork between the autopick paths and the propose-matrix `scan --json` pool.
248
+ * The `autoTask` gate BINDS through that predicate; a config-less repo with
249
+ * `autoTask` off yields an all-`eligible:false` pool (no `spec:` legs).
250
+ */
251
+ export function scoreSpecs(
252
+ repoPath: string,
253
+ pool: LedgerSpecPool,
254
+ autoTask: boolean,
255
+ ): ScannedSpec[] {
256
+ const taskable = new Set(
257
+ taskableSpecs({
258
+ candidates: pool.specs.map((p) => ({
259
+ repoPath,
260
+ slug: p.slug,
261
+ humanOnly: p.humanOnly,
262
+ needsAnswers: p.needsAnswers,
263
+ taskedAfter: p.taskedAfter,
264
+ })),
265
+ taskedSlugs: pool.taskedSlugs,
266
+ autoTask,
267
+ }).map((p) => p.slug),
268
+ );
269
+ return pool.specs.map((p) => ({
270
+ slug: p.slug,
271
+ eligibility: {eligible: taskable.has(p.slug)},
272
+ }));
273
+ }
274
+
275
+ /**
276
+ * Project the shared {@link buildLifecyclePools} result (via `gatherLifecycle*`)
277
+ * onto the `scan --json` {@link ScannedLifecycle} shape: triage items keep only
278
+ * their `slug` (the `obs:` prefix is fixed in the matrix `jq`), surface/apply keep
279
+ * `{namespace, slug}` so the `jq` projects the right `task:`/`spec:` prefix. NOT a
280
+ * re-enumeration — a pure shape map over the already-gated pools.
281
+ *
282
+ * The pool items' `namespace` is the wider {@link SelectedNamespace}. SURFACE by
283
+ * construction only carries `'task'`/`'prd'` (an observation with no sidecar is a
284
+ * `triage` candidate, never `surface`), so it narrows + drops any non-task/prd
285
+ * defensively. APPLY additionally admits `'observation'` (an answered observation
286
+ * sidecar → apply), and it MUST be kept so the matrix `jq` emits its
287
+ * `observation:<slug>` apply leg — narrowing it away here is exactly what stranded
288
+ * answered observations (present in neither `triage` nor `apply`). Any OTHER
289
+ * namespace is still dropped defensively.
290
+ */
291
+ export function toScannedLifecycle(pools: {
292
+ triage: {slug: string}[];
293
+ surface: {namespace: string; slug: string}[];
294
+ apply: {namespace: string; slug: string}[];
295
+ }): ScannedLifecycle {
296
+ const BLOCKED_NAMESPACES = new Set(['task', 'spec', 'observation']);
297
+ // SURFACE stays task/spec-only; APPLY additionally keeps an answered observation.
298
+ const asBlocked = (
299
+ items: {namespace: string; slug: string}[],
300
+ allowObservation: boolean,
301
+ ): ScannedBlockedItem[] =>
302
+ items
303
+ .filter(
304
+ (i) =>
305
+ i.namespace === 'task' ||
306
+ i.namespace === 'spec' ||
307
+ (allowObservation && i.namespace === 'observation'),
308
+ )
309
+ .filter((i) => BLOCKED_NAMESPACES.has(i.namespace))
310
+ .map((i) => ({
311
+ namespace: i.namespace as 'task' | 'spec' | 'observation',
312
+ slug: i.slug,
313
+ }));
314
+ return {
315
+ triage: pools.triage.map((t) => ({slug: t.slug})),
316
+ surface: asBlocked(pools.surface, false),
317
+ apply: asBlocked(pools.apply, true),
318
+ };
319
+ }
320
+
321
+ export function scoreItems(
322
+ state: Pick<LocalLedgerState, 'ready' | 'doneSlugs'>,
323
+ autoBuild: boolean,
324
+ counts: {totalItems: number; totalEligible: number},
325
+ heldSlugs: Set<string> = new Set(),
326
+ ): ScannedItem[] {
327
+ // HELD-SLUG SUBTRACTION (prd `ledger-status-per-item-lock-refs` US #15; task
328
+ // `claim-acquires-unified-lock-no-body-move`): exclude any pool slug whose
329
+ // per-item lock is currently held — the eligible pool is "in `tasks/ready/` on
330
+ // `main` AND no lock held".
331
+ //
332
+ // LOAD-BEARING since the lock cut-over: the claim NO LONGER moves the body to
333
+ // `in-progress/` (it stays at `tasks/ready/` on `main`, the held lock IS the
334
+ // claim), so this subtraction is the ONLY thing keeping a claimed / in-flight
335
+ // item out of the eligible pool, NOT the redundant belt-and-suspenders it was
336
+ // while the body-move still removed claimed items. An ACTIVE (in-progress) lock
337
+ // is a legitimate, primary claim signal here.
338
+ //
339
+ // FAIL-OPEN CAVEAT (known defect; selection should fail CLOSED): the held set
340
+ // is gathered by the CALLER and is EMPTY when the lock read is
341
+ // unavailable/offline, so a READ FAULT currently degrades to "subtract nothing"
342
+ // and an in-flight item can leak back into the pool (re-claimed → empty diff →
343
+ // spurious `stuck`). Now that the subtraction is load-bearing this is wrong for
344
+ // SELECTION: a failed lock read must not re-make a held item eligible. See the
345
+ // observation/task on fail-closed lock-read for selection.
346
+ return state.ready
347
+ .filter((item) => !heldSlugs.has(item.slug))
348
+ .map((item) => {
349
+ const eligibility = resolveEligibility({
350
+ humanOnly: item.humanOnly,
351
+ needsAnswers: item.needsAnswers,
352
+ blockedBy: item.blockedBy,
353
+ doneSlugs: state.doneSlugs,
354
+ autoBuild,
355
+ });
356
+ counts.totalItems++;
357
+ if (eligibility.eligible) {
358
+ counts.totalEligible++;
359
+ }
360
+ return {...item, eligibility};
361
+ });
362
+ }
363
+
364
+ /**
365
+ * Read-only end-to-end scan over the REGISTRY (ADR §1): enumerate the registered
366
+ * hub mirrors under `<workspacesDir>/repos/`, **fetch each mirror's `main` first**
367
+ * (ADR §5/§6 — the remote is the source of truth in the registry model), then read
368
+ * each one's full `work/` lifecycle from its BARE `main` ref through the read
369
+ * seam's mirror method (mirrors have no working tree — `resolveLocalState`'s
370
+ * `readdirSync` cannot read them), and resolve eligibility per item (autonomy
371
+ * gate + per-repo `blockedBy`). Claims and runs nothing.
372
+ *
373
+ * **Fetch-first, never fatal:** the old "scan is always offline" invariant is
374
+ * RETIRED (it was the roots-local model); `scan` now refreshes each mirror's
375
+ * `main` before reading. A failed fetch (offline, dead arbiter) is NOT an error —
376
+ * it WARNS via `warn` and falls back to that mirror's last-known `main`, so the
377
+ * queue still reports (its freshness = the last successful fetch). This does NOT
378
+ * change the ledger read STRATEGY (`claim-ledger-vs-protected-main.md`): the
379
+ * offline read of `<mirror>/main:work/...` stays the single strategy — `scan`
380
+ * merely ensures that ref is fresh before reading it.
381
+ *
382
+ * Discovery is the registered hub-mirror set, NOT a config `roots` walk (there is
383
+ * no `roots`/`remotes` field). `scan`/`status` share the {@link listMirrors}
384
+ * primitive; the per-repo `work/` read goes through the seam's mirror-ref method.
385
+ *
386
+ * The autonomy gate's `autoBuild` policy is resolved PER REPO. NOTE: a bare
387
+ * mirror has no checked-out `.dorfl.json`, so the per-repo file cannot be
388
+ * read from it — the global/env-resolved policy applies (the per-repo override is
389
+ * a working-checkout concern, served by {@link scanRepoPaths}).
390
+ */
391
+ export async function scan(
392
+ config: Config,
393
+ options: {
394
+ warn?: (message: string) => void;
395
+ env?: NodeJS.ProcessEnv;
396
+ /**
397
+ * The per-machine {@link ConfigOverrideMap} (from `loadConfigOverride`),
398
+ * threaded into the SAME per-repo resolution `do`/`run` use so the override
399
+ * applies to the registry-scan path too (ADR
400
+ * `per-machine-config-override-layer`). Default: empty (no override) —
401
+ * byte-identical to pre-override behaviour.
402
+ */
403
+ override?: ConfigOverrideMap;
404
+ } = {},
405
+ ): Promise<ScanReport> {
406
+ const mirrors = listMirrors({
407
+ workspacesDir: config.workspacesDir,
408
+ env: options.env,
409
+ });
410
+
411
+ const repos: RepoReport[] = [];
412
+ const counts = {totalItems: 0, totalEligible: 0};
413
+
414
+ for (const mirror of mirrors) {
415
+ // Fetch-first (ADR §5/§6): refresh this mirror's `main` so the read below
416
+ // sees the remote truth. Never fatal — a failed fetch WARNS and falls back to
417
+ // the mirror's last-known `main` (the read strategy is unchanged).
418
+ fetchMirrorMainOrWarn({
419
+ mirrorPath: mirror.path,
420
+ warn: options.warn,
421
+ env: options.env,
422
+ });
423
+ // Read the full `work/` lifecycle from the mirror's bare `main` ref through
424
+ // the read seam (git ls-tree/show; NOT a working-tree read).
425
+ const state = await ledgerRead.resolveMirrorState({
426
+ mirrorPath: mirror.path,
427
+ env: options.env,
428
+ });
429
+ const autoBuild = resolveRepoConfig({
430
+ repoPath: mirror.path,
431
+ global: config,
432
+ override: options.override,
433
+ }).config.autoBuild;
434
+ // Held-slug subtraction: a bare hub mirror's arbiter is its `origin`. Reads
435
+ // the lock refs from the mirror's origin; non-fatal (empty set on any fault),
436
+ // so the read-only scan degrades gracefully exactly as its config reads do.
437
+ const heldSlugs = await heldTaskSlugs(mirror.path, 'origin', options.env);
438
+ // The PER-ITEM LOCK in-flight view (prd US #8; task
439
+ // `needs-attention-as-stuck-lock-state`): ADDITIONALLY read the full held
440
+ // lock entries (action × state + reason) from the mirror's lock refs, so the
441
+ // scan surfaces held (in-progress) + stuck (needs-attention) items. Read from
442
+ // the mirror's `origin` (the SAME handle the held-slug subtraction uses);
443
+ // best-effort (empty list on any fault), so the read-only scan degrades
444
+ // gracefully. This is a SURFACE only — eligibility/selection stay offline on
445
+ // `main` (the subtraction above), not gated on this view.
446
+ const lockHeld = await listItemLockEntries(
447
+ mirror.path,
448
+ 'origin',
449
+ options.env,
450
+ );
451
+ // Spec pool — the TASKABLE-PRD companion of the task pool above
452
+ // (`ci-propose-matrix-must-enumerate-sliceable-prds-not-only-slices`). Resolve
453
+ // `autoTask` PER REPO from the mirror's COMMITTED `.dorfl.json`
454
+ // (exactly as the mirror-side pool scan does — NOT forked); a read fault is
455
+ // non-fatal (warn + global fall-back), since `scan` is read-only and must
456
+ // degrade gracefully (ADR §5/§6).
457
+ let repoAutoTask = config.autoTask;
458
+ try {
459
+ repoAutoTask = resolveRepoConfigFromMirror({
460
+ mirrorPath: mirror.path,
461
+ global: config,
462
+ env: options.env,
463
+ override: options.override,
464
+ }).autoTask;
465
+ } catch (err) {
466
+ const reason = err instanceof Error ? err.message : String(err);
467
+ options.warn?.(
468
+ `could not read the target repo's config from ${mirror.path}/main; ` +
469
+ `resolving autoTask from global + default. ${reason}`,
470
+ );
471
+ }
472
+ const specPool = await ledgerRead.resolveMirrorSpecPool({
473
+ mirrorPath: mirror.path,
474
+ env: options.env,
475
+ });
476
+ const specs = scoreSpecs(mirror.path, specPool, repoAutoTask);
477
+ // The per-repo LIFECYCLE pool (`ci-propose-matrix-enumerates-lifecycle-items`),
478
+ // gated by this mirror's question-surfacing config (resolved from its committed
479
+ // `.dorfl.json`, with the same non-fatal global fall-back as `autoTask`
480
+ // above) and computed by REUSING `gatherLifecycleMirror` → `buildLifecyclePools`
481
+ // (NOT a forked predicate), so it AGREES with the `run` selection.
482
+ let repoLifecycleConfig = {
483
+ observationTriage: config.observationTriage as string,
484
+ surfaceBlockers: config.surfaceBlockers,
485
+ surfaceStaging: config.surfaceStaging,
486
+ };
487
+ try {
488
+ const resolved = resolveRepoConfigFromMirror({
489
+ mirrorPath: mirror.path,
490
+ global: config,
491
+ env: options.env,
492
+ override: options.override,
493
+ });
494
+ repoLifecycleConfig = {
495
+ observationTriage: resolved.observationTriage,
496
+ surfaceBlockers: resolved.surfaceBlockers,
497
+ surfaceStaging: resolved.surfaceStaging,
498
+ };
499
+ } catch {
500
+ // Non-fatal: a config read fault already WARNED on the `autoTask` read
501
+ // above; fall back to the global-resolved gates (scan is read-only and must
502
+ // degrade gracefully, ADR §5/§6).
503
+ }
504
+ const lifecycle = toScannedLifecycle(
505
+ await gatherLifecycleMirror({
506
+ mirrorPath: mirror.path,
507
+ gates: lifecycleGatesFrom(repoLifecycleConfig),
508
+ env: options.env,
509
+ }),
510
+ );
511
+ // The one-slug-one-folder LINT (prd story 3): derive any slug residing in >1
512
+ // status folder from the mirror's committed `main` tree (the SAME `ls-tree`
513
+ // read the seam uses), so a corrupt ledger is surfaced LOUDLY by the formatter.
514
+ const ledgerDuplicates = lintRefLedger('main', mirror.path, options.env);
515
+ repos.push({
516
+ path: mirror.path,
517
+ items: scoreItems(state, autoBuild, counts, heldSlugs),
518
+ specs,
519
+ lifecycle,
520
+ ledgerDuplicates,
521
+ lockHeld,
522
+ });
523
+ }
524
+
525
+ return {
526
+ repos,
527
+ totalItems: counts.totalItems,
528
+ totalEligible: counts.totalEligible,
529
+ };
530
+ }
531
+
532
+ /**
533
+ * Read-only scan over an EXPLICIT set of working checkouts, used by the in-place
534
+ * worker paths (`run`) that operate on a real checkout rather than the registry's
535
+ * bare mirrors. This is a working-TREE read (it has nothing to fetch — the
536
+ * checkout IS the local state); the fetch-first contract (ADR §5/§6) applies to
537
+ * the REGISTRY `scan` above, which refreshes each bare mirror before reading.
538
+ * Reads each repo's `work/` via the read seam's local-tree method and honours its
539
+ * per-repo `.dorfl.json` `autoBuild`. The registry `scan` above is the
540
+ * mirror-ref counterpart; this is its working-tree sibling.
541
+ */
542
+ export function scanRepoPaths(
543
+ repoPaths: string[],
544
+ config: Config,
545
+ /**
546
+ * The HELD-SLUG set to SUBTRACT from each repo's pool (`tasks/ready/`) (prd
547
+ * `ledger-status-per-item-lock-refs` US #15). This is a WORKING-TREE, OFFLINE
548
+ * scan (it has no arbiter handle to fetch the lock refs from — that is the
549
+ * registry `scan`'s job), so the held set is supplied by the in-place CALLER
550
+ * (which knows its arbiter) and DEFAULTS to empty: with the body still moving to
551
+ * `in-progress/` on claim the subtraction is redundant-but-harmless, so omitting
552
+ * it preserves the offline read while keeping the seam in place for task #9.
553
+ */
554
+ heldSlugs: Set<string> = new Set(),
555
+ /**
556
+ * The per-machine {@link ConfigOverrideMap} — threaded into the per-repo
557
+ * resolution so the override applies to the in-place scan path too. Default:
558
+ * empty (no override).
559
+ */
560
+ override?: ConfigOverrideMap,
561
+ ): ScanReport {
562
+ const repos: RepoReport[] = [];
563
+ const counts = {totalItems: 0, totalEligible: 0};
564
+
565
+ for (const path of repoPaths) {
566
+ const state = ledgerRead.resolveLocalState({repoPath: path});
567
+ const resolved = resolveRepoConfig({
568
+ repoPath: path,
569
+ global: config,
570
+ override,
571
+ }).config;
572
+ // Spec pool — the TASKABLE-PRD companion of the task pool. Resolve
573
+ // `autoTask` PER REPO from the working-tree `.dorfl.json` (the same
574
+ // way `autoBuild` is resolved); `taskableSpecs` (the SAME `autoslice-gate`
575
+ // predicate the autopick paths run) decides what is taskable — no forked
576
+ // predicate. This is what makes the propose-mode CI matrix enumerate `spec:`
577
+ // legs (see `ci-propose-matrix-must-enumerate-sliceable-prds-not-only-slices`).
578
+ const specPool = ledgerRead.resolveSpecPool({repoPath: path});
579
+ const specs = scoreSpecs(path, specPool, resolved.autoTask);
580
+ // The per-repo LIFECYCLE pool (`ci-propose-matrix-enumerates-lifecycle-items`),
581
+ // gated by this working tree's `observationTriage` / `surfaceBlockers` (resolved
582
+ // the same way as `autoBuild`/`autoTask`) and computed by REUSING
583
+ // `gatherLifecycleInPlace` → `buildLifecyclePools` (NOT a forked predicate). CI
584
+ // runs IN-PLACE, so this is the surface the propose matrix reads.
585
+ const lifecycle = toScannedLifecycle(
586
+ gatherLifecycleInPlace({
587
+ repoPath: path,
588
+ gates: lifecycleGatesFrom({
589
+ observationTriage: resolved.observationTriage,
590
+ surfaceBlockers: resolved.surfaceBlockers,
591
+ surfaceStaging: resolved.surfaceStaging,
592
+ }),
593
+ }),
594
+ );
595
+ // The one-slug-one-folder LINT over THIS working tree's `work/` ledger.
596
+ const ledgerDuplicates = lintLocalLedger(path);
597
+ repos.push({
598
+ path,
599
+ items: scoreItems(state, resolved.autoBuild, counts, heldSlugs),
600
+ specs,
601
+ lifecycle,
602
+ ledgerDuplicates,
603
+ });
604
+ }
605
+
606
+ return {
607
+ repos,
608
+ totalItems: counts.totalItems,
609
+ totalEligible: counts.totalEligible,
610
+ };
611
+ }