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,79 @@
1
+ import { type Harness, type LaunchResult } from './harness.js';
2
+ /**
3
+ * The SHARED launch-with-optional-watch helper (task `watch-review-session`).
4
+ *
5
+ * This is the ONE codepath both the BUILD launch (`do.ts`'s `runDoAgent`) and the
6
+ * REVIEW launch (`review-gate.ts`'s `harnessReviewGate`) use to run an agent
7
+ * through the harness seam, optionally tailing its pi session `.jsonl` live. It
8
+ * was EXTRACTED from `do.ts` (where the watch wiring — `generateSessionPath` →
9
+ * `SessionTailer` → `start()` → `launchAsync` → `finally stop()`, else sync
10
+ * `launch` — used to live INLINE) so the review path can tail its OWN session
11
+ * without COPYING that block (the run/do duplication anti-pattern; copying would
12
+ * fork the watch wiring into a second implementation, and `run.ts` would become a
13
+ * third). One implementation, two callers.
14
+ *
15
+ * What it owns (the parts that were inline in `do.ts`):
16
+ *
17
+ * - **A known session path per launch**, generated up-front via
18
+ * {@link generateSessionPath} from `sessionId` (+ `sessionsDir`/`dir`), so the
19
+ * tailer follows the EXACT file (no newest-by-mtime guessing). Distinct callers
20
+ * pass distinct `sessionId`s (the build uses the slug; the review uses
21
+ * `<slug>-review`) so their sessions never collide.
22
+ * - **Tail when `watch` is on** (and the harness is a {@link PiHarness}): start a
23
+ * {@link SessionTailer} on that known path, launch NON-BLOCKING via
24
+ * `launchAsync`, and `finally stop()` the tailer (one final drain + the
25
+ * `\u2713 agent finished` line), EXACTLY as the build path did before. A non-pi
26
+ * harness with `watch` on falls through to the sync `launch` (the caller is
27
+ * responsible for rejecting `--watch` on a non-pi harness up-front, as `do`
28
+ * does); this helper degrades safely rather than tailing a log that does not
29
+ * exist.
30
+ * - **OFF the watch path** (or a non-pi harness): a plain synchronous
31
+ * `harness.launch(...)` — BYTE-IDENTICAL to the pre-extraction behaviour, so no
32
+ * tailer is created and the {@link LaunchResult} is unchanged.
33
+ *
34
+ * It is OBSERVABILITY ONLY: the returned {@link LaunchResult} is identical whether
35
+ * or not `watch` is on (the tailer is a pure reader), so it never changes a run's
36
+ * outcome, gate, routing, git, or exit code.
37
+ */
38
+ export interface LaunchWithOptionalWatchInput {
39
+ /** The harness seam to launch through (pi enables the live tail). */
40
+ harness: Harness;
41
+ /** The working directory the agent runs in (the worktree/checkout). */
42
+ dir: string;
43
+ /** The slug being processed (for adapters that name/log per slug). */
44
+ slug: string;
45
+ /** The command the null/shell adapter shells out to (ignored by pi). */
46
+ command: string;
47
+ /** The prompt fed to the agent on stdin. */
48
+ prompt: string;
49
+ /** The model routing intent forwarded to the harness (ADR \u00a713). */
50
+ model?: string;
51
+ /**
52
+ * The human-readable id for the session-FILE stem (made unique per launch
53
+ * inside {@link generateSessionPath}). DISTINCT per caller so two launches in
54
+ * one run never collide: the build passes the slug; the review passes
55
+ * `<slug>-review`.
56
+ */
57
+ sessionId: string;
58
+ /**
59
+ * The HOST-ONLY sessions root (resolved `config.sessionsDir`). `undefined` \u21d2
60
+ * pi's default per-cwd folder for {@link dir} (see {@link generateSessionPath}).
61
+ */
62
+ sessionsDir?: string;
63
+ /** Tail the session `.jsonl` live (pi harness only). */
64
+ watch?: boolean;
65
+ /** Where the tailed high-signal lines are written (defaults to stderr). */
66
+ watchSink?: (line: string) => void;
67
+ /** Emit ANSI colour in the tailed lines (the caller's TTY/`NO_COLOR` decision). */
68
+ color?: boolean;
69
+ /** Environment for the child agent process. */
70
+ env?: NodeJS.ProcessEnv;
71
+ }
72
+ /**
73
+ * Launch the agent through the harness, optionally tailing its pi session log
74
+ * live. Returns the {@link LaunchResult} unchanged on either path (the tailer is
75
+ * a pure observer). See {@link LaunchWithOptionalWatchInput} for the watch-on vs
76
+ * watch-off behaviour (the latter is byte-identical to a plain `harness.launch`).
77
+ */
78
+ export declare function launchWithOptionalWatch(input: LaunchWithOptionalWatchInput): Promise<LaunchResult>;
79
+ //# sourceMappingURL=agent-launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-launch.d.ts","sourceRoot":"","sources":["../src/agent-launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,OAAO,EAAE,KAAK,YAAY,EAAC,MAAM,cAAc,CAAC;AAK7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,WAAW,4BAA4B;IAC5C,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,mFAAmF;IACnF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC5C,KAAK,EAAE,4BAA4B,GACjC,OAAO,CAAC,YAAY,CAAC,CAoDvB"}
@@ -0,0 +1,61 @@
1
+ import { PiHarness } from './pi-harness.js';
2
+ import { SessionTailer } from './watch-session.js';
3
+ import { generateSessionPath } from './session-path.js';
4
+ /**
5
+ * Launch the agent through the harness, optionally tailing its pi session log
6
+ * live. Returns the {@link LaunchResult} unchanged on either path (the tailer is
7
+ * a pure observer). See {@link LaunchWithOptionalWatchInput} for the watch-on vs
8
+ * watch-off behaviour (the latter is byte-identical to a plain `harness.launch`).
9
+ */
10
+ export async function launchWithOptionalWatch(input) {
11
+ const { harness } = input;
12
+ // Generate the full pi session-FILE path ONCE here (caller-generates) so the
13
+ // adapter and the `--watch` tailer cannot disagree, and so the tailer knows it
14
+ // BEFORE pi starts (task `session-path-pi-default`). `sessionsDir` unset \u21d2
15
+ // pi's per-cwd default folder. The non-pi null adapter ignores `session`, but
16
+ // generating it unconditionally keeps ONE path for BOTH the watch and
17
+ // non-watch branches.
18
+ const session = generateSessionPath({
19
+ sessionsDir: input.sessionsDir,
20
+ cwd: input.dir,
21
+ id: input.sessionId,
22
+ });
23
+ // `--watch` (pi only): launch async + tail the KNOWN session .jsonl path
24
+ // concurrently. The caller is responsible for rejecting `--watch` on a non-pi
25
+ // harness up-front (as `do` does); a non-pi harness here falls through to the
26
+ // sync launch below rather than tailing a log that will never exist.
27
+ if (input.watch === true && harness instanceof PiHarness) {
28
+ const tailer = new SessionTailer({
29
+ sessionFile: session,
30
+ color: input.color ?? false,
31
+ sink: input.watchSink,
32
+ });
33
+ tailer.start();
34
+ try {
35
+ return await harness.launchAsync({
36
+ dir: input.dir,
37
+ slug: input.slug,
38
+ command: input.command,
39
+ prompt: input.prompt,
40
+ model: input.model,
41
+ session,
42
+ env: input.env,
43
+ });
44
+ }
45
+ finally {
46
+ // Always release the tailer (one final drain) — even on a launch error —
47
+ // so the observer never outlives the run or leaks a handle.
48
+ await tailer.stop();
49
+ }
50
+ }
51
+ return harness.launch({
52
+ dir: input.dir,
53
+ slug: input.slug,
54
+ command: input.command,
55
+ prompt: input.prompt,
56
+ model: input.model,
57
+ session,
58
+ env: input.env,
59
+ });
60
+ }
61
+ //# sourceMappingURL=agent-launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-launch.js","sourceRoot":"","sources":["../src/agent-launch.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAC,mBAAmB,EAAC,MAAM,mBAAmB,CAAC;AAyEtD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC5C,KAAmC;IAEnC,MAAM,EAAC,OAAO,EAAC,GAAG,KAAK,CAAC;IAExB,6EAA6E;IAC7E,+EAA+E;IAC/E,gFAAgF;IAChF,8EAA8E;IAC9E,sEAAsE;IACtE,sBAAsB;IACtB,MAAM,OAAO,GAAG,mBAAmB,CAAC;QACnC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,EAAE,EAAE,KAAK,CAAC,SAAS;KACnB,CAAC,CAAC;IAEH,yEAAyE;IACzE,8EAA8E;IAC9E,8EAA8E;IAC9E,qEAAqE;IACrE,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,YAAY,SAAS,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAChC,WAAW,EAAE,OAAO;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK;YAC3B,IAAI,EAAE,KAAK,CAAC,SAAS;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACJ,OAAO,MAAM,OAAO,CAAC,WAAW,CAAC;gBAChC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,OAAO;gBACP,GAAG,EAAE,KAAK,CAAC,GAAG;aACd,CAAC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACV,yEAAyE;YACzE,4DAA4D;YAC5D,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;IACF,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;QACrB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO;QACP,GAAG,EAAE,KAAK,CAAC,GAAG;KACd,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * **The build-agent → runner REPORTING CHANNEL** (task `agent-stop-signal`).
3
+ *
4
+ * A build agent reports back to the runner on ONE channel: its FINAL OUTPUT
5
+ * (`LaunchResult.output`, captured as `agent.output`). This module defines the
6
+ * two machine-recognisable verdicts an agent can raise on that channel and the
7
+ * deterministic backstop the runner uses when the agent stopped without one:
8
+ *
9
+ * 1. A HARD **STOP** sentinel ({@link STOP_SENTINEL_OPEN} … {@link
10
+ * STOP_SENTINEL_CLOSE}): the task DRIFTED / is ambiguous / rests on a stale
11
+ * premise, so the agent could not build it. The runner routes the item to
12
+ * `work/needs-attention/` (the agent's reason VERBATIM) and SKIPS the
13
+ * acceptance gate + the Gate-2 review (a clean STOP is not a build that
14
+ * changed nothing). See {@link parseStopSentinel}.
15
+ * 2. A SOFT **`## Decisions`** block ({@link extractDecisionsBlock}): the agent
16
+ * PROCEEDED but made a non-obvious in-scope decision the task did not
17
+ * specify (a cross-task interaction / a new error/refusal / a user-visible
18
+ * default). This does NOT stop the build — it just makes the choice visible
19
+ * for Gate-2 + the human to ratify (it rides the same `agent.output` → PR-body
20
+ * path the propose-mode summary uses).
21
+ *
22
+ * The sentinel form is documented IN-BAND next to the existing "STOP and report"
23
+ * instruction in the CLAIM-PROTOCOL wrapper (`skills/setup/protocol/CLAIM-PROTOCOL.md`)
24
+ * so the agent emits the EXACT shape this module parses — the same "agent edits,
25
+ * runner does git" in-band discipline the rest of the protocol uses.
26
+ */
27
+ /** The exact opening marker line of the STOP sentinel block. */
28
+ export declare const STOP_SENTINEL_OPEN = "=== TASK-STOP ===";
29
+ /** The exact closing marker line of the STOP sentinel block. */
30
+ export declare const STOP_SENTINEL_CLOSE = "=== END TASK-STOP ===";
31
+ /** A parsed STOP verdict raised by the build agent on its output channel. */
32
+ export interface StopSentinel {
33
+ /**
34
+ * The human-readable STOP reason from INSIDE the block (the specific drift
35
+ * report). Recorded VERBATIM as the needs-attention reason. Trimmed; never
36
+ * empty (a sentinel with an empty body still yields a default reason — see
37
+ * {@link parseStopSentinel}).
38
+ */
39
+ reason: string;
40
+ }
41
+ /**
42
+ * Detect the STOP sentinel in an agent's final output and extract its reason.
43
+ *
44
+ * The sentinel is a line `{@link STOP_SENTINEL_OPEN}` followed by the reason prose
45
+ * and a closing `{@link STOP_SENTINEL_CLOSE}` line. The markers must each be on
46
+ * their OWN line (leading/trailing whitespace tolerated) so a passing mention of
47
+ * the marker inside ordinary prose does not trip it. The agent may surround the
48
+ * block with other prose; we read the FIRST complete block.
49
+ *
50
+ * Returns `undefined` when no complete sentinel block is present (the common
51
+ * case: a normal build, a `## Decisions`-only report, or an empty result). When a
52
+ * block is present but its body is empty, the reason degrades to a stable default
53
+ * so the runner still routes honestly.
54
+ */
55
+ export declare function parseStopSentinel(output: string | undefined): StopSentinel | undefined;
56
+ /**
57
+ * Extract the body of the soft `## Decisions` block from an agent's final output:
58
+ * the prose under a `## Decisions` heading, up to the next `## ` heading or EOF,
59
+ * trimmed. Returns `undefined` when the agent reported no such block (the common
60
+ * case). This is purely informational — it NEVER blocks the build; it is surfaced
61
+ * for review (it already rides the `agent.output` → PR-body path; the caller may
62
+ * also fold it into the review-nits observation).
63
+ */
64
+ export declare function extractDecisionsBlock(output: string | undefined): string | undefined;
65
+ /**
66
+ * The DETERMINISTIC backstop for the STOP sentinel: did the agent leave NO source
67
+ * change at all? An `agent.ok` run that changed NOTHING is NEVER a successful
68
+ * build — treat it as an implicit STOP/no-op and route to needs-attention WITHOUT
69
+ * paying for the gate + Gate-2, even when the agent stopped without (or with a
70
+ * malformed) sentinel.
71
+ *
72
+ * The check has TWO independent signals; the build is empty IFF BOTH say "no
73
+ * source change":
74
+ *
75
+ * 1. **The WORKING TREE** (the primary signal, the common FRESH-build path). At
76
+ * this point in the pipeline (after the agent returns, BEFORE the gate /
77
+ * done-move) the runner has committed nothing of the agent's work — for a
78
+ * FRESH build the work branch HEAD is still the CLAIM commit, so the agent's
79
+ * output sits ENTIRELY in the WORKING TREE (tracked modifications OR
80
+ * brand-new untracked files; the agent does no git):
81
+ * - tracked modifications: `git status --porcelain` reports any modified/
82
+ * added/deleted TRACKED path;
83
+ * - untracked files: `--porcelain` also lists `??` untracked paths (a new
84
+ * source file the agent created), which a `git diff` would MISS.
85
+ *
86
+ * 2. **SOURCE COMMITS on the branch ahead of `<arbiter>/main`** (the additional
87
+ * condition that honours a `requeue` CONTINUE-FROM-TIP). The working-tree-only
88
+ * assumption — "HEAD is still the claim commit" — is FALSE for a `requeue`
89
+ * keep+continue: the kept `work/<slug>` branch's prior work is a chain of
90
+ * COMMITTED commits ahead of main, with a legitimately CLEAN working tree.
91
+ * Such a continue is NOT a no-op, so we ALSO ask: does any commit in
92
+ * `git rev-list <arbiter>/main..HEAD` touch a NON-`work/` path? If so the
93
+ * branch carries real source work and the build is NOT empty, even though the
94
+ * current session's working tree is clean.
95
+ *
96
+ * TWO things are filtered out of BOTH signals so they do not read as a build: the
97
+ * `work/` ledger (the runner's own claim move, the ONLY thing in the tree — and
98
+ * the ONLY thing the claim commit touches — on a clean STOP) and the runner's own
99
+ * `.dorfl-job.json` record (a job-worktree leaves one — the SAME line
100
+ * `gc`'s `isWorktreeClean` filters). The build is empty IFF nothing else remains
101
+ * in EITHER signal. Best-effort: a plumbing failure in EITHER check is treated as
102
+ * NON-empty (the safe direction — never short-circuit a genuine build by mistake).
103
+ *
104
+ * `arbiter` (already threaded for call-site symmetry) is used by signal 2 to
105
+ * resolve `<arbiter>/main`; we fetch it first (mirroring the integration band) so
106
+ * the remote-tracking ref exists / is current even in a bare-mirror job worktree.
107
+ */
108
+ export declare function isWorkBranchDiffEmpty(params: {
109
+ cwd: string;
110
+ arbiter: string;
111
+ env?: NodeJS.ProcessEnv;
112
+ }): Promise<boolean>;
113
+ /**
114
+ * The WORKING-TREE-DIRTY predicate (the first half of {@link
115
+ * isWorkBranchDiffEmpty}): does the working tree carry any uncommitted source
116
+ * change — tracked modifications, deletions, OR brand-new untracked files —
117
+ * outside `work/` and outside the runner's `.dorfl-job.json` record?
118
+ *
119
+ * This is a **best-effort** check in the SAFE direction (a git plumbing failure
120
+ * reads as TRUE: "dirty" / "has source") so an unknown can never short-circuit a
121
+ * genuine build by mistake.
122
+ *
123
+ * Two consumers share this seam, so they NEVER drift on what "the agent left
124
+ * uncommitted source work in the tree" means:
125
+ *
126
+ * - {@link isWorkBranchDiffEmpty} (the STOP backstop): empty IFF this is FALSE
127
+ * AND `<arbiter>/main..HEAD` has no source commits.
128
+ *
129
+ * - `complete.ts`'s stranded-done auto-recover gate (task
130
+ * `recover-autodetect-gated-on-nothing-to-commit`): on the autonomous path,
131
+ * `committedRecovery` (the folder-shape stranded-done auto-detect) fires only
132
+ * when this is FALSE. A dirty tree on a done-stranded branch means the agent
133
+ * produced new uncommitted work THIS run (a CONTINUE, not a finished strand),
134
+ * so the recover must NOT mis-fire and silently discard it.
135
+ *
136
+ * DELIBERATELY NOT used at the complete.ts gate point: (1) the core's
137
+ * `nothingStaged` (`git diff --cached --quiet`) — that is INDEX-only and reads
138
+ * empty BEFORE the core's later `git add -A`, so it would miss the agent's
139
+ * unstaged edits; (2) the FULL `isWorkBranchDiffEmpty` — its commits-ahead half
140
+ * is true for a GENUINE FINISHED STRAND too (the kept tip carries source commits
141
+ * ahead of main), which would wrongly block the legitimate recover.
142
+ */
143
+ export declare function hasUncommittedSourceChanges(params: {
144
+ cwd: string;
145
+ env?: NodeJS.ProcessEnv;
146
+ }): Promise<boolean>;
147
+ /** The needs-attention reason for the deterministic empty-diff backstop. */
148
+ export declare function emptyDiffStopReason(slug: string): string;
149
+ //# sourceMappingURL=agent-stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-stop.d.ts","sourceRoot":"","sources":["../src/agent-stop.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,gEAAgE;AAChE,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAE3D,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC5B;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,YAAY,GAAG,SAAS,CAoC1B;AAKD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,GAAG,SAAS,CAwBpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,CAAC,CASnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACzD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BnB;AAgGD,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD"}
@@ -0,0 +1,307 @@
1
+ import { runAsync } from './git.js';
2
+ import { JOB_RECORD_FILENAME } from './workspace.js';
3
+ /**
4
+ * **The build-agent → runner REPORTING CHANNEL** (task `agent-stop-signal`).
5
+ *
6
+ * A build agent reports back to the runner on ONE channel: its FINAL OUTPUT
7
+ * (`LaunchResult.output`, captured as `agent.output`). This module defines the
8
+ * two machine-recognisable verdicts an agent can raise on that channel and the
9
+ * deterministic backstop the runner uses when the agent stopped without one:
10
+ *
11
+ * 1. A HARD **STOP** sentinel ({@link STOP_SENTINEL_OPEN} … {@link
12
+ * STOP_SENTINEL_CLOSE}): the task DRIFTED / is ambiguous / rests on a stale
13
+ * premise, so the agent could not build it. The runner routes the item to
14
+ * `work/needs-attention/` (the agent's reason VERBATIM) and SKIPS the
15
+ * acceptance gate + the Gate-2 review (a clean STOP is not a build that
16
+ * changed nothing). See {@link parseStopSentinel}.
17
+ * 2. A SOFT **`## Decisions`** block ({@link extractDecisionsBlock}): the agent
18
+ * PROCEEDED but made a non-obvious in-scope decision the task did not
19
+ * specify (a cross-task interaction / a new error/refusal / a user-visible
20
+ * default). This does NOT stop the build — it just makes the choice visible
21
+ * for Gate-2 + the human to ratify (it rides the same `agent.output` → PR-body
22
+ * path the propose-mode summary uses).
23
+ *
24
+ * The sentinel form is documented IN-BAND next to the existing "STOP and report"
25
+ * instruction in the CLAIM-PROTOCOL wrapper (`skills/setup/protocol/CLAIM-PROTOCOL.md`)
26
+ * so the agent emits the EXACT shape this module parses — the same "agent edits,
27
+ * runner does git" in-band discipline the rest of the protocol uses.
28
+ */
29
+ /** The exact opening marker line of the STOP sentinel block. */
30
+ export const STOP_SENTINEL_OPEN = '=== TASK-STOP ===';
31
+ /** The exact closing marker line of the STOP sentinel block. */
32
+ export const STOP_SENTINEL_CLOSE = '=== END TASK-STOP ===';
33
+ /**
34
+ * Detect the STOP sentinel in an agent's final output and extract its reason.
35
+ *
36
+ * The sentinel is a line `{@link STOP_SENTINEL_OPEN}` followed by the reason prose
37
+ * and a closing `{@link STOP_SENTINEL_CLOSE}` line. The markers must each be on
38
+ * their OWN line (leading/trailing whitespace tolerated) so a passing mention of
39
+ * the marker inside ordinary prose does not trip it. The agent may surround the
40
+ * block with other prose; we read the FIRST complete block.
41
+ *
42
+ * Returns `undefined` when no complete sentinel block is present (the common
43
+ * case: a normal build, a `## Decisions`-only report, or an empty result). When a
44
+ * block is present but its body is empty, the reason degrades to a stable default
45
+ * so the runner still routes honestly.
46
+ */
47
+ export function parseStopSentinel(output) {
48
+ if (output === undefined || output === '') {
49
+ return undefined;
50
+ }
51
+ const lines = output.replace(/\r\n/g, '\n').split('\n');
52
+ let open = -1;
53
+ for (let i = 0; i < lines.length; i++) {
54
+ if (lines[i].trim() === STOP_SENTINEL_OPEN) {
55
+ open = i;
56
+ break;
57
+ }
58
+ }
59
+ if (open === -1) {
60
+ return undefined;
61
+ }
62
+ let close = -1;
63
+ for (let i = open + 1; i < lines.length; i++) {
64
+ if (lines[i].trim() === STOP_SENTINEL_CLOSE) {
65
+ close = i;
66
+ break;
67
+ }
68
+ }
69
+ if (close === -1) {
70
+ return undefined; // an unterminated marker is not a complete sentinel.
71
+ }
72
+ const reason = lines
73
+ .slice(open + 1, close)
74
+ .join('\n')
75
+ .trim();
76
+ return {
77
+ reason: reason === ''
78
+ ? 'the agent raised a TASK-STOP with no reason (the task could not be ' +
79
+ 'built as written — re-scope or re-claim).'
80
+ : reason,
81
+ };
82
+ }
83
+ /** The heading that opens the soft `## Decisions` block in an agent's output. */
84
+ const DECISIONS_HEADING = '## Decisions';
85
+ /**
86
+ * Extract the body of the soft `## Decisions` block from an agent's final output:
87
+ * the prose under a `## Decisions` heading, up to the next `## ` heading or EOF,
88
+ * trimmed. Returns `undefined` when the agent reported no such block (the common
89
+ * case). This is purely informational — it NEVER blocks the build; it is surfaced
90
+ * for review (it already rides the `agent.output` → PR-body path; the caller may
91
+ * also fold it into the review-nits observation).
92
+ */
93
+ export function extractDecisionsBlock(output) {
94
+ if (output === undefined || output === '') {
95
+ return undefined;
96
+ }
97
+ const lines = output.replace(/\r\n/g, '\n').split('\n');
98
+ let start = -1;
99
+ for (let i = 0; i < lines.length; i++) {
100
+ if (lines[i].trim() === DECISIONS_HEADING) {
101
+ start = i + 1;
102
+ break;
103
+ }
104
+ }
105
+ if (start === -1) {
106
+ return undefined;
107
+ }
108
+ const body = [];
109
+ for (let i = start; i < lines.length; i++) {
110
+ if (/^##\s/.test(lines[i])) {
111
+ break;
112
+ }
113
+ body.push(lines[i]);
114
+ }
115
+ const text = body.join('\n').trim();
116
+ return text === '' ? undefined : text;
117
+ }
118
+ /**
119
+ * The DETERMINISTIC backstop for the STOP sentinel: did the agent leave NO source
120
+ * change at all? An `agent.ok` run that changed NOTHING is NEVER a successful
121
+ * build — treat it as an implicit STOP/no-op and route to needs-attention WITHOUT
122
+ * paying for the gate + Gate-2, even when the agent stopped without (or with a
123
+ * malformed) sentinel.
124
+ *
125
+ * The check has TWO independent signals; the build is empty IFF BOTH say "no
126
+ * source change":
127
+ *
128
+ * 1. **The WORKING TREE** (the primary signal, the common FRESH-build path). At
129
+ * this point in the pipeline (after the agent returns, BEFORE the gate /
130
+ * done-move) the runner has committed nothing of the agent's work — for a
131
+ * FRESH build the work branch HEAD is still the CLAIM commit, so the agent's
132
+ * output sits ENTIRELY in the WORKING TREE (tracked modifications OR
133
+ * brand-new untracked files; the agent does no git):
134
+ * - tracked modifications: `git status --porcelain` reports any modified/
135
+ * added/deleted TRACKED path;
136
+ * - untracked files: `--porcelain` also lists `??` untracked paths (a new
137
+ * source file the agent created), which a `git diff` would MISS.
138
+ *
139
+ * 2. **SOURCE COMMITS on the branch ahead of `<arbiter>/main`** (the additional
140
+ * condition that honours a `requeue` CONTINUE-FROM-TIP). The working-tree-only
141
+ * assumption — "HEAD is still the claim commit" — is FALSE for a `requeue`
142
+ * keep+continue: the kept `work/<slug>` branch's prior work is a chain of
143
+ * COMMITTED commits ahead of main, with a legitimately CLEAN working tree.
144
+ * Such a continue is NOT a no-op, so we ALSO ask: does any commit in
145
+ * `git rev-list <arbiter>/main..HEAD` touch a NON-`work/` path? If so the
146
+ * branch carries real source work and the build is NOT empty, even though the
147
+ * current session's working tree is clean.
148
+ *
149
+ * TWO things are filtered out of BOTH signals so they do not read as a build: the
150
+ * `work/` ledger (the runner's own claim move, the ONLY thing in the tree — and
151
+ * the ONLY thing the claim commit touches — on a clean STOP) and the runner's own
152
+ * `.dorfl-job.json` record (a job-worktree leaves one — the SAME line
153
+ * `gc`'s `isWorktreeClean` filters). The build is empty IFF nothing else remains
154
+ * in EITHER signal. Best-effort: a plumbing failure in EITHER check is treated as
155
+ * NON-empty (the safe direction — never short-circuit a genuine build by mistake).
156
+ *
157
+ * `arbiter` (already threaded for call-site symmetry) is used by signal 2 to
158
+ * resolve `<arbiter>/main`; we fetch it first (mirroring the integration band) so
159
+ * the remote-tracking ref exists / is current even in a bare-mirror job worktree.
160
+ */
161
+ export async function isWorkBranchDiffEmpty(params) {
162
+ const { cwd, arbiter, env } = params;
163
+ if (await hasUncommittedSourceChanges({ cwd, env })) {
164
+ return false; // the working tree carries source change ⇒ a real build.
165
+ }
166
+ // Working tree is clean. It is STILL a real build if the branch carries source
167
+ // COMMITS ahead of `<arbiter>/main` (a `requeue` continue-from-tip). Only when
168
+ // there are none is this a genuine no-op.
169
+ return !(await hasSourceCommitsAhead({ cwd, arbiter, env }));
170
+ }
171
+ /**
172
+ * The WORKING-TREE-DIRTY predicate (the first half of {@link
173
+ * isWorkBranchDiffEmpty}): does the working tree carry any uncommitted source
174
+ * change — tracked modifications, deletions, OR brand-new untracked files —
175
+ * outside `work/` and outside the runner's `.dorfl-job.json` record?
176
+ *
177
+ * This is a **best-effort** check in the SAFE direction (a git plumbing failure
178
+ * reads as TRUE: "dirty" / "has source") so an unknown can never short-circuit a
179
+ * genuine build by mistake.
180
+ *
181
+ * Two consumers share this seam, so they NEVER drift on what "the agent left
182
+ * uncommitted source work in the tree" means:
183
+ *
184
+ * - {@link isWorkBranchDiffEmpty} (the STOP backstop): empty IFF this is FALSE
185
+ * AND `<arbiter>/main..HEAD` has no source commits.
186
+ *
187
+ * - `complete.ts`'s stranded-done auto-recover gate (task
188
+ * `recover-autodetect-gated-on-nothing-to-commit`): on the autonomous path,
189
+ * `committedRecovery` (the folder-shape stranded-done auto-detect) fires only
190
+ * when this is FALSE. A dirty tree on a done-stranded branch means the agent
191
+ * produced new uncommitted work THIS run (a CONTINUE, not a finished strand),
192
+ * so the recover must NOT mis-fire and silently discard it.
193
+ *
194
+ * DELIBERATELY NOT used at the complete.ts gate point: (1) the core's
195
+ * `nothingStaged` (`git diff --cached --quiet`) — that is INDEX-only and reads
196
+ * empty BEFORE the core's later `git add -A`, so it would miss the agent's
197
+ * unstaged edits; (2) the FULL `isWorkBranchDiffEmpty` — its commits-ahead half
198
+ * is true for a GENUINE FINISHED STRAND too (the kept tip carries source commits
199
+ * ahead of main), which would wrongly block the legitimate recover.
200
+ */
201
+ export async function hasUncommittedSourceChanges(params) {
202
+ const { cwd, env } = params;
203
+ // Count ANY uncommitted tracked change (mods, deletions, untracked), dropping
204
+ // ONLY the runner's own `.dorfl-job.json` record (a job worktree leaves it).
205
+ //
206
+ // It does NOT exclude `work/`: a `work/` change is frequently the GENUINE
207
+ // DELIVERABLE of a task (extend an idea, transcribe a `## Decisions` block into a
208
+ // done-record, ratify in a protocol doc, author an ADR-note). Excluding `work/`
209
+ // wholesale mis-classified every DOCS-ONLY task as an empty-diff no-op and
210
+ // FALSE-bounced completed, correct work (observation
211
+ // `runner-empty-diff-false-positive-bounces-completed-work-2026-07-09`). The
212
+ // old exclusion existed for a claim BOOKKEEPING commit that touched `work/`
213
+ // only — but the per-item-lock claim writes NOTHING (`claim-cas.ts`: "there is
214
+ // NO claim commit"), so the exclusion now only over-drops real deliverables.
215
+ // Genuine bookkeeping is excluded by TRAILER at the commits-ahead check, not by
216
+ // path here (the working tree carries no bookkeeping — the agent's edits are
217
+ // its deliverable).
218
+ const status = await runAsync('git', ['status', '--porcelain'], cwd, { env });
219
+ if (status.status !== 0) {
220
+ return true; // plumbing error ⇒ treat as DIRTY (the safe direction).
221
+ }
222
+ // Each porcelain line is `XY <path>` (path from column 3).
223
+ const remaining = status.stdout
224
+ .split('\n')
225
+ .map((line) => line.trimEnd())
226
+ .filter((line) => line !== '')
227
+ .filter((line) => line.slice(3).trim() !== JOB_RECORD_FILENAME);
228
+ return remaining.length > 0;
229
+ }
230
+ /**
231
+ * Does the work branch have at least one GENUINE-WORK commit in
232
+ * `<arbiter>/main..HEAD` (a commit that is NOT a runner bookkeeping commit,
233
+ * identified by its `Dorfl-Bookkeeping` trailer)? Fetches `<arbiter>/main` first
234
+ * (mirroring the integration band) so the ref resolves even in a bare-mirror job
235
+ * worktree. Best-effort / SAFE direction: any plumbing failure (the fetch, the
236
+ * rev-list, an unresolvable ref) reads as TRUE ("has source") — the same
237
+ * never-short-circuit-a-genuine-build stance the working-tree check takes, so an
238
+ * unknown can never collapse a real continue-from-tip into a no-op.
239
+ */
240
+ async function hasSourceCommitsAhead(params) {
241
+ const { cwd, arbiter, env } = params;
242
+ // Refresh `<arbiter>/main` so the range resolves (a bare-mirror job worktree
243
+ // has no fetch refspec; a regular clone gets the same harmless explicit ref).
244
+ const fetched = await runAsync('git', [
245
+ 'fetch',
246
+ '--quiet',
247
+ arbiter,
248
+ `+refs/heads/main:refs/remotes/${arbiter}/main`,
249
+ ], cwd, { env });
250
+ if (fetched.status !== 0) {
251
+ return true; // could not refresh the ref ⇒ NON-empty (safe direction).
252
+ }
253
+ // Enumerate the commits in `<arbiter>/main..HEAD` and count those that carry
254
+ // GENUINE work — i.e. NOT a runner BOOKKEEPING commit. A bookkeeping commit is
255
+ // identified by its recorded `Dorfl-Bookkeeping` trailer (task
256
+ // `identify-bookkeeping-commits-by-trailer-not-rendered-todo-text`), NOT by a
257
+ // `work/` path: a `work/` change is frequently the real deliverable of a
258
+ // docs/protocol/observation task, so a path-based `:(exclude)work` here
259
+ // FALSE-bounced completed docs-only work (observation
260
+ // `runner-empty-diff-false-positive-bounces-completed-work-2026-07-09`). Read
261
+ // each commit's sha + bookkeeping trailer via plumbing (NUL-delimited, one
262
+ // record per commit); a commit with a non-empty `Dorfl-Bookkeeping` trailer is
263
+ // bookkeeping and does not count; any other commit is genuine work.
264
+ // Per commit: its sha + its `Dorfl-Bookkeeping` trailer value, NUL-delimited
265
+ // then a record separator, so we can inspect each commit's files too.
266
+ const log = await runAsync('git', [
267
+ 'log',
268
+ '--format=%H%x00%(trailers:key=Dorfl-Bookkeeping,valueonly)%x1e',
269
+ `${arbiter}/main..HEAD`,
270
+ ], cwd, { env });
271
+ if (log.status !== 0) {
272
+ return true; // could not compute the range ⇒ NON-empty (safe direction).
273
+ }
274
+ const records = log.stdout
275
+ .split('\x1e')
276
+ .map((r) => r.trim())
277
+ .filter((r) => r !== '');
278
+ for (const record of records) {
279
+ const [sha, bookkeepingTrailer = ''] = record.split('\0');
280
+ // A bookkeeping-trailered commit is not genuine work.
281
+ if (bookkeepingTrailer.trim() !== '') {
282
+ continue;
283
+ }
284
+ // A commit whose ONLY touched path is the runner's own job-record is
285
+ // bookkeeping too (no trailer, but not the agent's deliverable).
286
+ const files = await runAsync('git', ['show', '--name-only', '--format=', sha], cwd, { env });
287
+ const touched = files.status === 0
288
+ ? files.stdout
289
+ .split('\n')
290
+ .map((p) => p.trim())
291
+ .filter((p) => p !== '')
292
+ : [];
293
+ const jobRecordOnly = touched.length > 0 && touched.every((p) => p === JOB_RECORD_FILENAME);
294
+ if (jobRecordOnly) {
295
+ continue;
296
+ }
297
+ // A non-bookkeeping commit that touches real files ⇒ genuine work.
298
+ return true;
299
+ }
300
+ return false;
301
+ }
302
+ /** The needs-attention reason for the deterministic empty-diff backstop. */
303
+ export function emptyDiffStopReason(slug) {
304
+ return (`the agent produced no source change building '${slug}' (empty diff vs the ` +
305
+ 'arbiter main); treating as a no-op/stop — re-scope or re-claim.');
306
+ }
307
+ //# sourceMappingURL=agent-stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-stop.js","sourceRoot":"","sources":["../src/agent-stop.ts"],"names":[],"mappings":"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"}