@telora/daemon 0.22.132 → 0.22.136

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 (549) hide show
  1. package/build-info.json +6 -3
  2. package/dist/audit/audit-hooks.d.ts +6 -2
  3. package/dist/audit/audit-hooks.d.ts.map +1 -1
  4. package/dist/audit/audit-hooks.js +12 -5
  5. package/dist/audit/audit-hooks.js.map +1 -1
  6. package/dist/audit/audit-phase.js +1 -1
  7. package/dist/audit/audit-phase.js.map +1 -1
  8. package/dist/backends/index.d.ts.map +1 -1
  9. package/dist/backends/index.js +1 -0
  10. package/dist/backends/index.js.map +1 -1
  11. package/dist/completion/completion-phase-registry.d.ts +4 -0
  12. package/dist/completion/completion-phase-registry.d.ts.map +1 -1
  13. package/dist/completion/completion-phase-registry.js +63 -18
  14. package/dist/completion/completion-phase-registry.js.map +1 -1
  15. package/dist/completion/exit-classification.d.ts.map +1 -1
  16. package/dist/completion/exit-classification.js +1 -0
  17. package/dist/completion/exit-classification.js.map +1 -1
  18. package/dist/completion/review-approved-head-gate.d.ts +53 -0
  19. package/dist/completion/review-approved-head-gate.d.ts.map +1 -0
  20. package/dist/completion/review-approved-head-gate.js +124 -0
  21. package/dist/completion/review-approved-head-gate.js.map +1 -0
  22. package/dist/completion/review-census-record.d.ts +52 -0
  23. package/dist/completion/review-census-record.d.ts.map +1 -0
  24. package/dist/completion/review-census-record.js +145 -0
  25. package/dist/completion/review-census-record.js.map +1 -0
  26. package/dist/completion/review-exit-deps.d.ts +5 -1
  27. package/dist/completion/review-exit-deps.d.ts.map +1 -1
  28. package/dist/completion/review-exit-deps.js +7 -2
  29. package/dist/completion/review-exit-deps.js.map +1 -1
  30. package/dist/completion/review-exit-phase.d.ts.map +1 -1
  31. package/dist/completion/review-exit-phase.js +29 -16
  32. package/dist/completion/review-exit-phase.js.map +1 -1
  33. package/dist/completion/review-exit-progress.d.ts +8 -0
  34. package/dist/completion/review-exit-progress.d.ts.map +1 -1
  35. package/dist/completion/review-exit-progress.js +14 -0
  36. package/dist/completion/review-exit-progress.js.map +1 -1
  37. package/dist/completion/review-exit-shortfall-park.d.ts +14 -0
  38. package/dist/completion/review-exit-shortfall-park.d.ts.map +1 -0
  39. package/dist/completion/review-exit-shortfall-park.js +52 -0
  40. package/dist/completion/review-exit-shortfall-park.js.map +1 -0
  41. package/dist/completion/review-exit-shortfall.js +1 -1
  42. package/dist/completion/review-exit-shortfall.js.map +1 -1
  43. package/dist/completion/review-exit-verdict-gate.d.ts +58 -0
  44. package/dist/completion/review-exit-verdict-gate.d.ts.map +1 -1
  45. package/dist/completion/review-exit-verdict-gate.js +68 -8
  46. package/dist/completion/review-exit-verdict-gate.js.map +1 -1
  47. package/dist/completion/review-next-step.d.ts +15 -3
  48. package/dist/completion/review-next-step.d.ts.map +1 -1
  49. package/dist/completion/review-next-step.js +7 -2
  50. package/dist/completion/review-next-step.js.map +1 -1
  51. package/dist/completion/standing-approval-convergence.d.ts +68 -0
  52. package/dist/completion/standing-approval-convergence.d.ts.map +1 -0
  53. package/dist/completion/standing-approval-convergence.js +230 -0
  54. package/dist/completion/standing-approval-convergence.js.map +1 -0
  55. package/dist/completion/standing-approval-deps.d.ts +5 -0
  56. package/dist/completion/standing-approval-deps.d.ts.map +1 -0
  57. package/dist/completion/standing-approval-deps.js +37 -0
  58. package/dist/completion/standing-approval-deps.js.map +1 -0
  59. package/dist/completion/state-cascade.d.ts +11 -0
  60. package/dist/completion/state-cascade.d.ts.map +1 -1
  61. package/dist/completion/state-cascade.js +40 -1
  62. package/dist/completion/state-cascade.js.map +1 -1
  63. package/dist/completion/team-lifecycle.d.ts +14 -2
  64. package/dist/completion/team-lifecycle.d.ts.map +1 -1
  65. package/dist/completion/team-lifecycle.js +36 -36
  66. package/dist/completion/team-lifecycle.js.map +1 -1
  67. package/dist/completion/terminated-work-reconcile.d.ts +3 -1
  68. package/dist/completion/terminated-work-reconcile.d.ts.map +1 -1
  69. package/dist/completion/terminated-work-reconcile.js +24 -11
  70. package/dist/completion/terminated-work-reconcile.js.map +1 -1
  71. package/dist/delivery/delivery-advance-block.d.ts +6 -0
  72. package/dist/delivery/delivery-advance-block.d.ts.map +1 -1
  73. package/dist/delivery/delivery-advance-block.js +29 -3
  74. package/dist/delivery/delivery-advance-block.js.map +1 -1
  75. package/dist/delivery/delivery-reconciler.d.ts.map +1 -1
  76. package/dist/delivery/delivery-reconciler.js +4 -1
  77. package/dist/delivery/delivery-reconciler.js.map +1 -1
  78. package/dist/delivery/operator-hold.d.ts.map +1 -1
  79. package/dist/delivery/operator-hold.js +3 -1
  80. package/dist/delivery/operator-hold.js.map +1 -1
  81. package/dist/directive/directive-executor.d.ts.map +1 -1
  82. package/dist/directive/directive-executor.js +6 -0
  83. package/dist/directive/directive-executor.js.map +1 -1
  84. package/dist/directive/directive-queue.d.ts +8 -0
  85. package/dist/directive/directive-queue.d.ts.map +1 -1
  86. package/dist/directive/directive-queue.js +20 -0
  87. package/dist/directive/directive-queue.js.map +1 -1
  88. package/dist/directive/phase-sync.d.ts +5 -0
  89. package/dist/directive/phase-sync.d.ts.map +1 -1
  90. package/dist/directive/phase-sync.js +11 -1
  91. package/dist/directive/phase-sync.js.map +1 -1
  92. package/dist/directive/stranded-review-reroute.d.ts +37 -0
  93. package/dist/directive/stranded-review-reroute.d.ts.map +1 -0
  94. package/dist/directive/stranded-review-reroute.js +150 -0
  95. package/dist/directive/stranded-review-reroute.js.map +1 -0
  96. package/dist/focus/focus-engine.d.ts.map +1 -1
  97. package/dist/focus/focus-engine.js +15 -3
  98. package/dist/focus/focus-engine.js.map +1 -1
  99. package/dist/focus/focus-executor.d.ts.map +1 -1
  100. package/dist/focus/focus-executor.js +9 -65
  101. package/dist/focus/focus-executor.js.map +1 -1
  102. package/dist/focus/focus-lifecycle.d.ts +12 -0
  103. package/dist/focus/focus-lifecycle.d.ts.map +1 -1
  104. package/dist/focus/focus-lifecycle.js +66 -37
  105. package/dist/focus/focus-lifecycle.js.map +1 -1
  106. package/dist/focus/focus-phase.d.ts.map +1 -1
  107. package/dist/focus/focus-phase.js +6 -0
  108. package/dist/focus/focus-phase.js.map +1 -1
  109. package/dist/focus/focus-spawn-decision.d.ts.map +1 -1
  110. package/dist/focus/focus-spawn-decision.js +1 -0
  111. package/dist/focus/focus-spawn-decision.js.map +1 -1
  112. package/dist/focus/focus-team-state.d.ts +10 -0
  113. package/dist/focus/focus-team-state.d.ts.map +1 -1
  114. package/dist/focus/focus-team-state.js +19 -1
  115. package/dist/focus/focus-team-state.js.map +1 -1
  116. package/dist/focus/listener-auto-advance.d.ts.map +1 -1
  117. package/dist/focus/listener-auto-advance.js +1 -0
  118. package/dist/focus/listener-auto-advance.js.map +1 -1
  119. package/dist/focus/listener-spawn.d.ts +10 -0
  120. package/dist/focus/listener-spawn.d.ts.map +1 -1
  121. package/dist/focus/listener-spawn.js +46 -4
  122. package/dist/focus/listener-spawn.js.map +1 -1
  123. package/dist/focus/listener-state.d.ts.map +1 -1
  124. package/dist/focus/listener-state.js +11 -1
  125. package/dist/focus/listener-state.js.map +1 -1
  126. package/dist/focus/listener.d.ts +42 -0
  127. package/dist/focus/listener.d.ts.map +1 -1
  128. package/dist/focus/listener.js +62 -33
  129. package/dist/focus/listener.js.map +1 -1
  130. package/dist/focus/pending-review-approved-head.d.ts +41 -0
  131. package/dist/focus/pending-review-approved-head.d.ts.map +1 -0
  132. package/dist/focus/pending-review-approved-head.js +198 -0
  133. package/dist/focus/pending-review-approved-head.js.map +1 -0
  134. package/dist/focus/pending-spawn-pass-deps.d.ts +5 -0
  135. package/dist/focus/pending-spawn-pass-deps.d.ts.map +1 -1
  136. package/dist/focus/pending-spawn-pass-deps.js +2 -1
  137. package/dist/focus/pending-spawn-pass-deps.js.map +1 -1
  138. package/dist/focus/pending-spawn-review-next-step.d.ts.map +1 -1
  139. package/dist/focus/pending-spawn-review-next-step.js +26 -4
  140. package/dist/focus/pending-spawn-review-next-step.js.map +1 -1
  141. package/dist/focus/review-spawn-coverage.d.ts +87 -0
  142. package/dist/focus/review-spawn-coverage.d.ts.map +1 -0
  143. package/dist/focus/review-spawn-coverage.js +104 -0
  144. package/dist/focus/review-spawn-coverage.js.map +1 -0
  145. package/dist/focus/session-health.d.ts +5 -2
  146. package/dist/focus/session-health.d.ts.map +1 -1
  147. package/dist/focus/session-health.js +2 -1
  148. package/dist/focus/session-health.js.map +1 -1
  149. package/dist/focus/session-process-reap.d.ts +50 -0
  150. package/dist/focus/session-process-reap.d.ts.map +1 -0
  151. package/dist/focus/session-process-reap.js +77 -0
  152. package/dist/focus/session-process-reap.js.map +1 -0
  153. package/dist/focus/unchanged-reviewed-head.d.ts +40 -0
  154. package/dist/focus/unchanged-reviewed-head.d.ts.map +1 -0
  155. package/dist/focus/unchanged-reviewed-head.js +84 -0
  156. package/dist/focus/unchanged-reviewed-head.js.map +1 -0
  157. package/dist/focus/verify-open-issues.d.ts +4 -19
  158. package/dist/focus/verify-open-issues.d.ts.map +1 -1
  159. package/dist/focus/verify-open-issues.js +83 -41
  160. package/dist/focus/verify-open-issues.js.map +1 -1
  161. package/dist/git/focus-integration-sync.d.ts +61 -0
  162. package/dist/git/focus-integration-sync.d.ts.map +1 -0
  163. package/dist/git/focus-integration-sync.js +73 -0
  164. package/dist/git/focus-integration-sync.js.map +1 -0
  165. package/dist/git/focus-own-delta.d.ts +38 -0
  166. package/dist/git/focus-own-delta.d.ts.map +1 -0
  167. package/dist/git/focus-own-delta.js +193 -0
  168. package/dist/git/focus-own-delta.js.map +1 -0
  169. package/dist/git/index.d.ts +2 -0
  170. package/dist/git/index.d.ts.map +1 -1
  171. package/dist/git/index.js +4 -0
  172. package/dist/git/index.js.map +1 -1
  173. package/dist/git/merge.d.ts.map +1 -1
  174. package/dist/git/merge.js +11 -1
  175. package/dist/git/merge.js.map +1 -1
  176. package/dist/git/resolution-restore.d.ts +66 -0
  177. package/dist/git/resolution-restore.d.ts.map +1 -0
  178. package/dist/git/resolution-restore.js +331 -0
  179. package/dist/git/resolution-restore.js.map +1 -0
  180. package/dist/loops/engine.d.ts.map +1 -1
  181. package/dist/loops/engine.js.map +1 -1
  182. package/dist/merge/abandoned-merge-recovery.d.ts +72 -0
  183. package/dist/merge/abandoned-merge-recovery.d.ts.map +1 -0
  184. package/dist/merge/abandoned-merge-recovery.js +117 -0
  185. package/dist/merge/abandoned-merge-recovery.js.map +1 -0
  186. package/dist/merge/focus-merge.d.ts +19 -0
  187. package/dist/merge/focus-merge.d.ts.map +1 -1
  188. package/dist/merge/focus-merge.js +136 -99
  189. package/dist/merge/focus-merge.js.map +1 -1
  190. package/dist/merge/merge-back-activity.d.ts +11 -0
  191. package/dist/merge/merge-back-activity.d.ts.map +1 -0
  192. package/dist/merge/merge-back-activity.js +57 -0
  193. package/dist/merge/merge-back-activity.js.map +1 -0
  194. package/dist/merge/merge-back-conflict.d.ts +119 -0
  195. package/dist/merge/merge-back-conflict.d.ts.map +1 -0
  196. package/dist/merge/merge-back-conflict.js +178 -0
  197. package/dist/merge/merge-back-conflict.js.map +1 -0
  198. package/dist/merge/merge-back-followup.d.ts +109 -0
  199. package/dist/merge/merge-back-followup.d.ts.map +1 -0
  200. package/dist/merge/merge-back-followup.js +316 -0
  201. package/dist/merge/merge-back-followup.js.map +1 -0
  202. package/dist/merge/merge-back-loop.d.ts +2 -0
  203. package/dist/merge/merge-back-loop.d.ts.map +1 -1
  204. package/dist/merge/merge-back-loop.js +14 -15
  205. package/dist/merge/merge-back-loop.js.map +1 -1
  206. package/dist/merge/merge-conflict-escalation.d.ts +12 -0
  207. package/dist/merge/merge-conflict-escalation.d.ts.map +1 -1
  208. package/dist/merge/merge-conflict-escalation.js +37 -2
  209. package/dist/merge/merge-conflict-escalation.js.map +1 -1
  210. package/dist/merge/merge-gate-coverage.d.ts.map +1 -1
  211. package/dist/merge/merge-gate-coverage.js +1 -0
  212. package/dist/merge/merge-gate-coverage.js.map +1 -1
  213. package/dist/prompt/prompt-listing.d.ts +5 -0
  214. package/dist/prompt/prompt-listing.d.ts.map +1 -1
  215. package/dist/prompt/prompt-listing.js +35 -0
  216. package/dist/prompt/prompt-listing.js.map +1 -1
  217. package/dist/prompt-sections/routing-decider-sections.d.ts.map +1 -1
  218. package/dist/prompt-sections/routing-decider-sections.js +2 -0
  219. package/dist/prompt-sections/routing-decider-sections.js.map +1 -1
  220. package/dist/prompt-sections/shortfall-park-section.d.ts +43 -0
  221. package/dist/prompt-sections/shortfall-park-section.d.ts.map +1 -0
  222. package/dist/prompt-sections/shortfall-park-section.js +36 -0
  223. package/dist/prompt-sections/shortfall-park-section.js.map +1 -0
  224. package/dist/queries/agent-resolvable-promotion.d.ts +16 -2
  225. package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
  226. package/dist/queries/agent-resolvable-promotion.js +30 -3
  227. package/dist/queries/agent-resolvable-promotion.js.map +1 -1
  228. package/dist/queries/cause-key.d.ts +17 -22
  229. package/dist/queries/cause-key.d.ts.map +1 -1
  230. package/dist/queries/cause-key.js +50 -1
  231. package/dist/queries/cause-key.js.map +1 -1
  232. package/dist/queries/commit-attributions.d.ts +18 -0
  233. package/dist/queries/commit-attributions.d.ts.map +1 -0
  234. package/dist/queries/commit-attributions.js +39 -0
  235. package/dist/queries/commit-attributions.js.map +1 -0
  236. package/dist/queries/deliveries.d.ts.map +1 -1
  237. package/dist/queries/deliveries.js +3 -1
  238. package/dist/queries/deliveries.js.map +1 -1
  239. package/dist/queries/delivery-gate-state.d.ts +21 -5
  240. package/dist/queries/delivery-gate-state.d.ts.map +1 -1
  241. package/dist/queries/delivery-gate-state.js +35 -9
  242. package/dist/queries/delivery-gate-state.js.map +1 -1
  243. package/dist/queries/escalation-consumption.d.ts.map +1 -1
  244. package/dist/queries/escalation-consumption.js +2 -1
  245. package/dist/queries/escalation-consumption.js.map +1 -1
  246. package/dist/queries/escalation-field-bounds.d.ts +48 -0
  247. package/dist/queries/escalation-field-bounds.d.ts.map +1 -0
  248. package/dist/queries/escalation-field-bounds.js +83 -0
  249. package/dist/queries/escalation-field-bounds.js.map +1 -0
  250. package/dist/queries/escalation-refusal.d.ts +88 -0
  251. package/dist/queries/escalation-refusal.d.ts.map +1 -0
  252. package/dist/queries/escalation-refusal.js +217 -0
  253. package/dist/queries/escalation-refusal.js.map +1 -0
  254. package/dist/queries/escalation-suppression.d.ts +6 -0
  255. package/dist/queries/escalation-suppression.d.ts.map +1 -1
  256. package/dist/queries/escalation-suppression.js +4 -13
  257. package/dist/queries/escalation-suppression.js.map +1 -1
  258. package/dist/queries/escalations.d.ts +5 -13
  259. package/dist/queries/escalations.d.ts.map +1 -1
  260. package/dist/queries/escalations.js +25 -30
  261. package/dist/queries/escalations.js.map +1 -1
  262. package/dist/queries/filing-observation.d.ts.map +1 -1
  263. package/dist/queries/filing-observation.js +3 -1
  264. package/dist/queries/filing-observation.js.map +1 -1
  265. package/dist/queries/focus-review-approval.d.ts +2 -0
  266. package/dist/queries/focus-review-approval.d.ts.map +1 -1
  267. package/dist/queries/focus-review-approval.js +7 -2
  268. package/dist/queries/focus-review-approval.js.map +1 -1
  269. package/dist/queries/focuses.d.ts.map +1 -1
  270. package/dist/queries/focuses.js +2 -1
  271. package/dist/queries/focuses.js.map +1 -1
  272. package/dist/queries/incident-correlation.d.ts.map +1 -1
  273. package/dist/queries/incident-correlation.js +4 -1
  274. package/dist/queries/incident-correlation.js.map +1 -1
  275. package/dist/queries/misattributed-commits-record.d.ts +26 -0
  276. package/dist/queries/misattributed-commits-record.d.ts.map +1 -0
  277. package/dist/queries/misattributed-commits-record.js +5 -0
  278. package/dist/queries/misattributed-commits-record.js.map +1 -0
  279. package/dist/queries/reality-tree.d.ts.map +1 -1
  280. package/dist/queries/reality-tree.js +2 -1
  281. package/dist/queries/reality-tree.js.map +1 -1
  282. package/dist/queries/schemas.d.ts +3 -0
  283. package/dist/queries/schemas.d.ts.map +1 -1
  284. package/dist/queries/schemas.js +1 -0
  285. package/dist/queries/schemas.js.map +1 -1
  286. package/dist/queries/shared.js +1 -1
  287. package/dist/queries/shortfall-park-record.d.ts +48 -0
  288. package/dist/queries/shortfall-park-record.d.ts.map +1 -0
  289. package/dist/queries/shortfall-park-record.js +31 -0
  290. package/dist/queries/shortfall-park-record.js.map +1 -0
  291. package/dist/queries/shortfall-rulings.d.ts +71 -0
  292. package/dist/queries/shortfall-rulings.d.ts.map +1 -0
  293. package/dist/queries/shortfall-rulings.js +53 -0
  294. package/dist/queries/shortfall-rulings.js.map +1 -0
  295. package/dist/queries/verification.d.ts +20 -1
  296. package/dist/queries/verification.d.ts.map +1 -1
  297. package/dist/queries/verification.js +48 -8
  298. package/dist/queries/verification.js.map +1 -1
  299. package/dist/resolvers/index.d.ts +2 -2
  300. package/dist/resolvers/index.d.ts.map +1 -1
  301. package/dist/resolvers/index.js +1 -1
  302. package/dist/resolvers/index.js.map +1 -1
  303. package/dist/resolvers/shared/delivery-trailer.d.ts +99 -0
  304. package/dist/resolvers/shared/delivery-trailer.d.ts.map +1 -0
  305. package/dist/resolvers/shared/delivery-trailer.js +103 -0
  306. package/dist/resolvers/shared/delivery-trailer.js.map +1 -0
  307. package/dist/resolvers/shared/git-diff.d.ts +11 -84
  308. package/dist/resolvers/shared/git-diff.d.ts.map +1 -1
  309. package/dist/resolvers/shared/git-diff.js +17 -84
  310. package/dist/resolvers/shared/git-diff.js.map +1 -1
  311. package/dist/resolvers/shared/review-window-commits.d.ts.map +1 -1
  312. package/dist/resolvers/shared/review-window-commits.js +1 -0
  313. package/dist/resolvers/shared/review-window-commits.js.map +1 -1
  314. package/dist/session/session-lineage.d.ts.map +1 -1
  315. package/dist/session/session-lineage.js +1 -0
  316. package/dist/session/session-lineage.js.map +1 -1
  317. package/dist/shell/config.d.ts +2 -1
  318. package/dist/shell/config.d.ts.map +1 -1
  319. package/dist/shell/config.js +21 -4
  320. package/dist/shell/config.js.map +1 -1
  321. package/dist/shell/crash-recovery.d.ts +3 -7
  322. package/dist/shell/crash-recovery.d.ts.map +1 -1
  323. package/dist/shell/crash-recovery.js +28 -31
  324. package/dist/shell/crash-recovery.js.map +1 -1
  325. package/dist/shell/orphan-capture.d.ts +42 -0
  326. package/dist/shell/orphan-capture.d.ts.map +1 -0
  327. package/dist/shell/orphan-capture.js +53 -0
  328. package/dist/shell/orphan-capture.js.map +1 -0
  329. package/dist/shell/worker-pidfile.d.ts +22 -4
  330. package/dist/shell/worker-pidfile.d.ts.map +1 -1
  331. package/dist/shell/worker-pidfile.js +51 -13
  332. package/dist/shell/worker-pidfile.js.map +1 -1
  333. package/dist/spawn/helpers.d.ts +3 -0
  334. package/dist/spawn/helpers.d.ts.map +1 -1
  335. package/dist/spawn/helpers.js +28 -9
  336. package/dist/spawn/helpers.js.map +1 -1
  337. package/dist/spawn/lead-launch.d.ts +34 -0
  338. package/dist/spawn/lead-launch.d.ts.map +1 -0
  339. package/dist/spawn/lead-launch.js +34 -0
  340. package/dist/spawn/lead-launch.js.map +1 -0
  341. package/dist/spawn/lead-process-ownership.d.ts +91 -0
  342. package/dist/spawn/lead-process-ownership.d.ts.map +1 -0
  343. package/dist/spawn/lead-process-ownership.js +120 -0
  344. package/dist/spawn/lead-process-ownership.js.map +1 -0
  345. package/dist/spawn/lifecycle.d.ts +43 -3
  346. package/dist/spawn/lifecycle.d.ts.map +1 -1
  347. package/dist/spawn/lifecycle.js +75 -44
  348. package/dist/spawn/lifecycle.js.map +1 -1
  349. package/dist/spawn/liveness.d.ts.map +1 -1
  350. package/dist/spawn/liveness.js +5 -1
  351. package/dist/spawn/liveness.js.map +1 -1
  352. package/dist/spawn/one-shot-process-ownership.d.ts +48 -0
  353. package/dist/spawn/one-shot-process-ownership.d.ts.map +1 -0
  354. package/dist/spawn/one-shot-process-ownership.js +44 -0
  355. package/dist/spawn/one-shot-process-ownership.js.map +1 -0
  356. package/dist/spawn/process-group-kill.d.ts +79 -0
  357. package/dist/spawn/process-group-kill.d.ts.map +1 -0
  358. package/dist/spawn/process-group-kill.js +210 -0
  359. package/dist/spawn/process-group-kill.js.map +1 -0
  360. package/dist/spawn/process-spawn.d.ts +18 -1
  361. package/dist/spawn/process-spawn.d.ts.map +1 -1
  362. package/dist/spawn/process-spawn.js +51 -20
  363. package/dist/spawn/process-spawn.js.map +1 -1
  364. package/dist/spawn/resolution-budget.d.ts +38 -0
  365. package/dist/spawn/resolution-budget.d.ts.map +1 -0
  366. package/dist/spawn/resolution-budget.js +87 -0
  367. package/dist/spawn/resolution-budget.js.map +1 -0
  368. package/dist/spawn/review-hold-park.d.ts.map +1 -1
  369. package/dist/spawn/review-hold-park.js +37 -5
  370. package/dist/spawn/review-hold-park.js.map +1 -1
  371. package/dist/spawn/spawn-cooldown.d.ts.map +1 -1
  372. package/dist/spawn/spawn-cooldown.js +9 -0
  373. package/dist/spawn/spawn-cooldown.js.map +1 -1
  374. package/dist/spawn/untracked-lead-sweep.d.ts +29 -0
  375. package/dist/spawn/untracked-lead-sweep.d.ts.map +1 -0
  376. package/dist/spawn/untracked-lead-sweep.js +100 -0
  377. package/dist/spawn/untracked-lead-sweep.js.map +1 -0
  378. package/dist/spawn/worker-registry.d.ts.map +1 -1
  379. package/dist/spawn/worker-registry.js +4 -1
  380. package/dist/spawn/worker-registry.js.map +1 -1
  381. package/dist/spawn/worktree-session.d.ts.map +1 -1
  382. package/dist/spawn/worktree-session.js +8 -6
  383. package/dist/spawn/worktree-session.js.map +1 -1
  384. package/dist/testing/fixtures/exit-capture-verify.d.ts +41 -0
  385. package/dist/testing/fixtures/exit-capture-verify.d.ts.map +1 -0
  386. package/dist/testing/fixtures/exit-capture-verify.js +152 -0
  387. package/dist/testing/fixtures/exit-capture-verify.js.map +1 -0
  388. package/dist/testing/fixtures/index.js +1 -1
  389. package/dist/testing/fixtures/pending-spawn-world.d.ts +7 -0
  390. package/dist/testing/fixtures/pending-spawn-world.d.ts.map +1 -1
  391. package/dist/testing/fixtures/pending-spawn-world.js +21 -1
  392. package/dist/testing/fixtures/pending-spawn-world.js.map +1 -1
  393. package/dist/testing/fixtures/stubborn-lead-process.d.ts +22 -0
  394. package/dist/testing/fixtures/stubborn-lead-process.d.ts.map +1 -0
  395. package/dist/testing/fixtures/stubborn-lead-process.js +68 -0
  396. package/dist/testing/fixtures/stubborn-lead-process.js.map +1 -0
  397. package/dist/types/config.d.ts +13 -0
  398. package/dist/types/config.d.ts.map +1 -1
  399. package/dist/types/focus.d.ts +7 -0
  400. package/dist/types/focus.d.ts.map +1 -1
  401. package/dist/types/index.js +1 -1
  402. package/dist/verify/commit-verdict-record.d.ts +13 -3
  403. package/dist/verify/commit-verdict-record.d.ts.map +1 -1
  404. package/dist/verify/commit-verdict-record.js +45 -25
  405. package/dist/verify/commit-verdict-record.js.map +1 -1
  406. package/dist/verify/credit-rearm.d.ts +18 -0
  407. package/dist/verify/credit-rearm.d.ts.map +1 -0
  408. package/dist/verify/credit-rearm.js +69 -0
  409. package/dist/verify/credit-rearm.js.map +1 -0
  410. package/dist/verify/delivery-commit-set.d.ts +10 -0
  411. package/dist/verify/delivery-commit-set.d.ts.map +1 -0
  412. package/dist/verify/delivery-commit-set.js +82 -0
  413. package/dist/verify/delivery-commit-set.js.map +1 -0
  414. package/dist/verify/explicit-rearm.d.ts.map +1 -1
  415. package/dist/verify/explicit-rearm.js +2 -0
  416. package/dist/verify/explicit-rearm.js.map +1 -1
  417. package/dist/verify/failure-signature.d.ts.map +1 -1
  418. package/dist/verify/failure-signature.js +1 -0
  419. package/dist/verify/failure-signature.js.map +1 -1
  420. package/dist/verify/gate-run-registry.d.ts.map +1 -1
  421. package/dist/verify/gate-run-registry.js +3 -0
  422. package/dist/verify/gate-run-registry.js.map +1 -1
  423. package/dist/verify/injection-stamp.d.ts +29 -0
  424. package/dist/verify/injection-stamp.d.ts.map +1 -0
  425. package/dist/verify/injection-stamp.js +139 -0
  426. package/dist/verify/injection-stamp.js.map +1 -0
  427. package/dist/verify/misattributed-commits-read.d.ts +31 -0
  428. package/dist/verify/misattributed-commits-read.d.ts.map +1 -0
  429. package/dist/verify/misattributed-commits-read.js +47 -0
  430. package/dist/verify/misattributed-commits-read.js.map +1 -0
  431. package/dist/verify/misattributed-commits.d.ts +52 -0
  432. package/dist/verify/misattributed-commits.d.ts.map +1 -0
  433. package/dist/verify/misattributed-commits.js +148 -0
  434. package/dist/verify/misattributed-commits.js.map +1 -0
  435. package/dist/verify/no-own-delta-verdict.d.ts +47 -0
  436. package/dist/verify/no-own-delta-verdict.d.ts.map +1 -0
  437. package/dist/verify/no-own-delta-verdict.js +74 -0
  438. package/dist/verify/no-own-delta-verdict.js.map +1 -0
  439. package/dist/verify/shortfall-park-escalation.d.ts +41 -0
  440. package/dist/verify/shortfall-park-escalation.d.ts.map +1 -0
  441. package/dist/verify/shortfall-park-escalation.js +177 -0
  442. package/dist/verify/shortfall-park-escalation.js.map +1 -0
  443. package/dist/verify/shortfall-park.d.ts +109 -0
  444. package/dist/verify/shortfall-park.d.ts.map +1 -0
  445. package/dist/verify/shortfall-park.js +208 -0
  446. package/dist/verify/shortfall-park.js.map +1 -0
  447. package/dist/verify/shortfall-repeat.d.ts +47 -16
  448. package/dist/verify/shortfall-repeat.d.ts.map +1 -1
  449. package/dist/verify/shortfall-repeat.js +77 -23
  450. package/dist/verify/shortfall-repeat.js.map +1 -1
  451. package/dist/verify/shortfall-rulings.d.ts +106 -0
  452. package/dist/verify/shortfall-rulings.d.ts.map +1 -0
  453. package/dist/verify/shortfall-rulings.js +118 -0
  454. package/dist/verify/shortfall-rulings.js.map +1 -0
  455. package/dist/verify/stall-detectors.d.ts.map +1 -1
  456. package/dist/verify/stall-detectors.js +10 -4
  457. package/dist/verify/stall-detectors.js.map +1 -1
  458. package/dist/verify/verification-attribution-base.d.ts +26 -0
  459. package/dist/verify/verification-attribution-base.d.ts.map +1 -0
  460. package/dist/verify/verification-attribution-base.js +127 -0
  461. package/dist/verify/verification-attribution-base.js.map +1 -0
  462. package/dist/verify/verification-attribution-deps.d.ts +32 -0
  463. package/dist/verify/verification-attribution-deps.d.ts.map +1 -0
  464. package/dist/verify/verification-attribution-deps.js +209 -0
  465. package/dist/verify/verification-attribution-deps.js.map +1 -0
  466. package/dist/verify/verification-baseline.d.ts +6 -0
  467. package/dist/verify/verification-baseline.d.ts.map +1 -1
  468. package/dist/verify/verification-baseline.js +27 -11
  469. package/dist/verify/verification-baseline.js.map +1 -1
  470. package/dist/verify/verification-commit-sharing.d.ts.map +1 -1
  471. package/dist/verify/verification-commit-sharing.js +30 -8
  472. package/dist/verify/verification-commit-sharing.js.map +1 -1
  473. package/dist/verify/verification-config.d.ts.map +1 -1
  474. package/dist/verify/verification-config.js +2 -0
  475. package/dist/verify/verification-config.js.map +1 -1
  476. package/dist/verify/verification-default-on.d.ts +3 -0
  477. package/dist/verify/verification-default-on.d.ts.map +1 -1
  478. package/dist/verify/verification-default-on.js +5 -1
  479. package/dist/verify/verification-default-on.js.map +1 -1
  480. package/dist/verify/verification-deps-default.d.ts.map +1 -1
  481. package/dist/verify/verification-deps-default.js +61 -120
  482. package/dist/verify/verification-deps-default.js.map +1 -1
  483. package/dist/verify/verification-deps.d.ts +26 -4
  484. package/dist/verify/verification-deps.d.ts.map +1 -1
  485. package/dist/verify/verification-deterministic.d.ts +15 -0
  486. package/dist/verify/verification-deterministic.d.ts.map +1 -1
  487. package/dist/verify/verification-deterministic.js +1 -12
  488. package/dist/verify/verification-deterministic.js.map +1 -1
  489. package/dist/verify/verification-engine.d.ts +9 -6
  490. package/dist/verify/verification-engine.d.ts.map +1 -1
  491. package/dist/verify/verification-engine.js +43 -62
  492. package/dist/verify/verification-engine.js.map +1 -1
  493. package/dist/verify/verification-evidence-unavailable-feedback.d.ts +2 -1
  494. package/dist/verify/verification-evidence-unavailable-feedback.d.ts.map +1 -1
  495. package/dist/verify/verification-evidence-unavailable-feedback.js +19 -1
  496. package/dist/verify/verification-evidence-unavailable-feedback.js.map +1 -1
  497. package/dist/verify/verification-failure-parser.d.ts +57 -1
  498. package/dist/verify/verification-failure-parser.d.ts.map +1 -1
  499. package/dist/verify/verification-failure-parser.js +116 -10
  500. package/dist/verify/verification-failure-parser.js.map +1 -1
  501. package/dist/verify/verification-feedback.d.ts +60 -43
  502. package/dist/verify/verification-feedback.d.ts.map +1 -1
  503. package/dist/verify/verification-feedback.js +115 -120
  504. package/dist/verify/verification-feedback.js.map +1 -1
  505. package/dist/verify/verification-history-reset.d.ts +2 -1
  506. package/dist/verify/verification-history-reset.d.ts.map +1 -1
  507. package/dist/verify/verification-history-reset.js +4 -2
  508. package/dist/verify/verification-history-reset.js.map +1 -1
  509. package/dist/verify/verification-rework-issue.d.ts +87 -0
  510. package/dist/verify/verification-rework-issue.d.ts.map +1 -0
  511. package/dist/verify/verification-rework-issue.js +212 -0
  512. package/dist/verify/verification-rework-issue.js.map +1 -0
  513. package/dist/verify/verification-rework-messages.d.ts.map +1 -1
  514. package/dist/verify/verification-rework-messages.js +10 -0
  515. package/dist/verify/verification-rework-messages.js.map +1 -1
  516. package/dist/verify/verify-gate-stall.d.ts +2 -0
  517. package/dist/verify/verify-gate-stall.d.ts.map +1 -1
  518. package/dist/verify/verify-gate-stall.js +35 -9
  519. package/dist/verify/verify-gate-stall.js.map +1 -1
  520. package/dist/verify/verify-restatement.d.ts.map +1 -1
  521. package/dist/verify/verify-restatement.js +9 -2
  522. package/dist/verify/verify-restatement.js.map +1 -1
  523. package/dist/worktree/capture-attribution-read.d.ts +47 -0
  524. package/dist/worktree/capture-attribution-read.d.ts.map +1 -0
  525. package/dist/worktree/capture-attribution-read.js +98 -0
  526. package/dist/worktree/capture-attribution-read.js.map +1 -0
  527. package/dist/worktree/capture-attribution.d.ts +26 -0
  528. package/dist/worktree/capture-attribution.d.ts.map +1 -0
  529. package/dist/worktree/capture-attribution.js +111 -0
  530. package/dist/worktree/capture-attribution.js.map +1 -0
  531. package/dist/worktree/index.d.ts.map +1 -1
  532. package/dist/worktree/index.js +2 -1
  533. package/dist/worktree/index.js.map +1 -1
  534. package/dist/worktree/provision.d.ts.map +1 -1
  535. package/dist/worktree/provision.js +23 -6
  536. package/dist/worktree/provision.js.map +1 -1
  537. package/dist/worktree/safety.d.ts +14 -4
  538. package/dist/worktree/safety.d.ts.map +1 -1
  539. package/dist/worktree/safety.js +37 -7
  540. package/dist/worktree/safety.js.map +1 -1
  541. package/dist/worktree/scratch-guard.d.ts +53 -2
  542. package/dist/worktree/scratch-guard.d.ts.map +1 -1
  543. package/dist/worktree/scratch-guard.js +115 -30
  544. package/dist/worktree/scratch-guard.js.map +1 -1
  545. package/dist/worktree/unmerged-capture-escalation.d.ts +52 -0
  546. package/dist/worktree/unmerged-capture-escalation.d.ts.map +1 -0
  547. package/dist/worktree/unmerged-capture-escalation.js +64 -0
  548. package/dist/worktree/unmerged-capture-escalation.js.map +1 -0
  549. package/package.json +2 -2
@@ -0,0 +1,124 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/completion/review-approved-head-gate.test.ts,
3
+ // packages/daemon/src/integration/approved-head-gate-failure-respawn-regression.test.ts,
4
+ // packages/daemon/src/integration/approved-head-hold-release-regression.test.ts,
5
+ // packages/daemon/src/integration/fully-merged-focus-sibling-red-scenario.test.ts,
6
+ // packages/daemon/src/integration/shortfall-ruling-disposes-proposals-regression.test.ts,
7
+ // packages/daemon/src/integration/standing-approval-release-regression.test.ts
8
+ // PINNED-BY-END
9
+ /**
10
+ * Review runs once per distinct focus head: an unchanged head since the focus's
11
+ * current approval draws no new review window.
12
+ *
13
+ * checkAutoReview (state-cascade.ts) opens the review window when a focus
14
+ * converges on verify. Its only in-memory backoff is a signature over the delivery
15
+ * aggregate (status, updated_at, merge commit, git state) -- and a verify delivery
16
+ * held by a repeating shortfall has its gate_state rewritten every pass, which
17
+ * bumps updated_at and invalidates that signature. Each rewrite re-opened the
18
+ * window at the SAME focus head, a review team spawned, and it approved the same
19
+ * commit again: daemon 0.22.132 stamped 9 approvals in ~40 minutes at one
20
+ * reviewedSha.
21
+ *
22
+ * The approval that makes a re-review pointless is the one the merge gate already
23
+ * reads (queries/focus-review-approval.ts readLatestApprovedReviewSha): the newest
24
+ * CURRENT approval -- an approved focus_reviews row or a recorded clean
25
+ * full-coverage auto-approval (completion/review-auto-approval-record.ts) -- which
26
+ * a newer gaps_found review of the same commit revokes. The head is the focus
27
+ * branch tip a review spawn would pin as its coverage anchor (focus-executor.ts
28
+ * captureReviewSpawnCoverage resolves the branch ref; a review spawn skips the
29
+ * rebase, and worktrees share the repo's refs).
30
+ *
31
+ * So the window is declined only when the head and the current approval are both
32
+ * KNOWN and name the same commit. A new commit on the focus, a newer gaps_found at
33
+ * that commit (approval revoked -> null), or no approval at all leaves review
34
+ * eligible exactly as before.
35
+ *
36
+ * FAILS OPEN: an unresolvable head, an unreadable review history, or a thrown read
37
+ * lets the window open. A missed skip costs one review pass; a false skip would
38
+ * strand a verify delivery that still needs its verdict.
39
+ *
40
+ * NO SAME-HEAD EXCEPTION: a verify delivery that becomes closable at the approved
41
+ * head with no new commit (a ruling released its shortfall park and verify then
42
+ * passed) does NOT re-open the window -- that re-ran review and stamped another
43
+ * approval of the unchanged commit. It converges on the STANDING approval instead
44
+ * (completion/standing-approval-convergence.ts), through the review exit's own
45
+ * holds, with no review run and no approval written.
46
+ *
47
+ * @module completion/review-approved-head-gate
48
+ */
49
+ import { resolveRef as defaultResolveRef } from '../git/index.js';
50
+ import { readLatestApprovedReviewSha, sameCommit } from '../queries/focus-review-approval.js';
51
+ import { listReviewAutoApprovals } from './review-auto-approval-record.js';
52
+ import { isForeignOnlyExtension } from '../git/focus-own-delta.js';
53
+ import { getFocusDeliveries } from '../queries/focuses.js';
54
+ import { createLogger } from '../shell/log.js';
55
+ const log = createLogger({ module: 'state-cascade' });
56
+ /**
57
+ * The production ownership proof: `repoPath` is the product checkout (its HEAD is
58
+ * not the focus branch), so provenance is read from the NAMED focus branch, with the
59
+ * focus's delivery ids from `listDeliveryIds` (the product-api by default).
60
+ */
61
+ export function makeHeadAddsNoOwnWork(listDeliveryIds = async (focusId) => (await getFocusDeliveries(focusId)).map((d) => d.id)) {
62
+ return async (target, approved, head) => isForeignOnlyExtension(target.repoPath, target.integrationBranch, approved, head, new Set(await listDeliveryIds(target.focusId)), { focusBranch: target.branchName ?? undefined });
63
+ }
64
+ const defaultReadDeps = {
65
+ resolveRef: defaultResolveRef,
66
+ readApprovedReviewSha: (target) => readLatestApprovedReviewSha(target.focusId, {
67
+ autoApprovals: listReviewAutoApprovals(target.productId, target.focusId),
68
+ }),
69
+ addsNoOwnWork: makeHeadAddsNoOwnWork(),
70
+ };
71
+ /**
72
+ * Read the focus head and its current approval. The approval is read only once
73
+ * the head resolves (with no head there is nothing to compare, so the product-api
74
+ * call is skipped). Throws when the approval read throws.
75
+ */
76
+ export async function readReviewHeadApproval(target, deps = defaultReadDeps) {
77
+ const headSha = target.branchName ? deps.resolveRef(target.repoPath, target.branchName) : null;
78
+ if (!headSha)
79
+ return { headSha: null, approvedSha: null };
80
+ const approvedSha = await deps.readApprovedReviewSha(target);
81
+ const { integrationBranch } = target;
82
+ if (approvedSha && integrationBranch && deps.addsNoOwnWork && !sameCommit(headSha, approvedSha)) {
83
+ // A focus whose commits are all on integration, moved past its approved commit
84
+ // only by other foci's commits, has no own work to review: its OWN head is the
85
+ // approved commit. Unprovable (or a failed read) keeps the branch tip.
86
+ const noOwnWork = await deps.addsNoOwnWork({ ...target, integrationBranch }, approvedSha, headSha).catch(() => false);
87
+ if (noOwnWork) {
88
+ log.info(`[state-cascade] Focus ${target.focusId}: head ${headSha.slice(0, 12)} adds only other foci's commits (already on ` +
89
+ `integration) to its approved commit ${approvedSha.slice(0, 12)} -- read as that approved head, no review over them`);
90
+ return { headSha: approvedSha, approvedSha };
91
+ }
92
+ }
93
+ return { headSha, approvedSha };
94
+ }
95
+ /** Whether the focus head is the commit its current approval already judged. Pure. */
96
+ export function isHeadAlreadyApproved(read) {
97
+ return read.headSha !== null && read.approvedSha !== null && sameCommit(read.headSha, read.approvedSha);
98
+ }
99
+ /**
100
+ * Whether checkAutoReview must decline to open the review window because the focus
101
+ * head is unchanged since its current approval. Logs the decline (info). Fails
102
+ * OPEN: an absent reader, an unknown head or approval, or a thrown read returns
103
+ * false (a thrown read is logged at warn).
104
+ */
105
+ export async function declinesReviewAtApprovedHead(focusId, read) {
106
+ if (!read)
107
+ return false;
108
+ let result;
109
+ try {
110
+ result = await read(focusId);
111
+ }
112
+ catch (err) {
113
+ log.warn(`[state-cascade] Could not read the approved review head for focus ${focusId}; ` +
114
+ `opening the review window as before: ${err.message}`);
115
+ return false;
116
+ }
117
+ if (!isHeadAlreadyApproved(result))
118
+ return false;
119
+ log.info(`[state-cascade] Not opening a review window on focus ${focusId}: its head ` +
120
+ `${(result.headSha ?? '').slice(0, 12)} is the commit its current approval already judged ` +
121
+ `-- review runs once per distinct focus head.`);
122
+ return true;
123
+ }
124
+ //# sourceMappingURL=review-approved-head-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-approved-head-gate.js","sourceRoot":"","sources":["../../src/completion/review-approved-head-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /** A delivery a census saw in verify. */
2
+ export interface CensusDelivery {
3
+ id: string;
4
+ iterationCount: number;
5
+ }
6
+ /** One review exit's census of a focus commit. */
7
+ export interface ReviewCensus {
8
+ productId: string;
9
+ focusId: string;
10
+ /** The commit the review covered (its spawn tip, else its exit tip). */
11
+ sha: string;
12
+ sessionId: string;
13
+ /** Whether the exit's own verdict approved `sha` (an approved report, or a clean full-coverage inspected exit). */
14
+ approving: boolean;
15
+ /** The deliveries in verify when the exit ran, each with its re-code iteration count then. */
16
+ verifyDeliveries: CensusDelivery[];
17
+ recordedAt: string;
18
+ }
19
+ /** Record a census atomically, replacing the commit's previous one. Best-effort: false (and logged) on a malformed sha or a failed write. */
20
+ export declare function writeReviewCensus(census: ReviewCensus, dir?: string): boolean;
21
+ /** Every census recorded for the focus, newest first. Empty when none can be read: a missing census covers nothing. */
22
+ export declare function listReviewCensuses(productId: string, focusId: string, dir?: string): ReviewCensus[];
23
+ /** The review-exit facts a census is taken from (a structural slice of the exit's params + derived evidence). */
24
+ export interface ReviewExitCensusInput {
25
+ productId: string;
26
+ focusId: string;
27
+ sessionId: string;
28
+ sessionType: 'coding' | 'review';
29
+ succeeded: boolean;
30
+ reviewInspected?: boolean;
31
+ windowOpen: boolean;
32
+ coveredSha: string | null;
33
+ coverageComplete: boolean;
34
+ reportExists: boolean;
35
+ reviewOutcome: 'approved' | 'gaps_found' | null;
36
+ deliveries: ReadonlyArray<{
37
+ id: string;
38
+ executionStatus?: string | null;
39
+ iterationCount?: number | null;
40
+ }>;
41
+ }
42
+ /**
43
+ * Take the census of a review exit (see the module header). Only a REVIEW session
44
+ * exiting with its window open and a known covered commit judges anything; any
45
+ * other exit records nothing. The exit approves the commit when its report says
46
+ * approved, or when it is a clean (no report), succeeded, inspected,
47
+ * coverage-complete review -- the two shapes that approve a commit
48
+ * (queries/focus-review-approval.ts). No-op without a writer (a partial test deps
49
+ * object). Never throws.
50
+ */
51
+ export declare function recordReviewExitCensus(write: ((census: ReviewCensus) => boolean) | undefined, input: ReviewExitCensusInput): void;
52
+ //# sourceMappingURL=review-census-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-census-record.d.ts","sourceRoot":"","sources":["../../src/completion/review-census-record.ts"],"names":[],"mappings":"AAkDA,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,mHAAmH;IACnH,SAAS,EAAE,OAAO,CAAC;IACnB,8FAA8F;IAC9F,gBAAgB,EAAE,cAAc,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;CACpB;AA8BD,6IAA6I;AAC7I,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,GAAE,MAAoB,GAAG,OAAO,CAa1F;AAED,uHAAuH;AACvH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAoB,GAAG,YAAY,EAAE,CAkBhH;AAED,iHAAiH;AACjH,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;IAChD,UAAU,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC5G;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,GAAG,SAAS,EACtD,KAAK,EAAE,qBAAqB,GAC3B,IAAI,CAkBN"}
@@ -0,0 +1,145 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/completion/standing-approval-convergence.test.ts,
3
+ // packages/daemon/src/focus/unchanged-reviewed-head.test.ts,
4
+ // packages/daemon/src/integration/approved-head-hold-release-regression.test.ts,
5
+ // packages/daemon/src/integration/failed-verdict-review-exit-respawn-regression.test.ts,
6
+ // packages/daemon/src/integration/failed-verdict-review-loop-regression.test.ts,
7
+ // packages/daemon/src/integration/shortfall-ruling-disposes-proposals-regression.test.ts,
8
+ // packages/daemon/src/integration/standing-approval-release-regression.test.ts
9
+ // PINNED-BY-END
10
+ /**
11
+ * Which verify deliveries a review exit saw at the commit it covered, and whether
12
+ * that exit's own verdict approved the commit -- recorded durably.
13
+ *
14
+ * Review runs once per distinct focus head (completion/review-approved-head-gate.ts),
15
+ * so a verify delivery that becomes closable at an ALREADY-APPROVED head (a ruling
16
+ * released its shortfall park and verify then passed, with no new commit) converges
17
+ * on the standing approval instead of drawing another review
18
+ * (completion/standing-approval-convergence.ts). That is honest only for a delivery
19
+ * the approving review actually judged. The approval read names a commit, not the
20
+ * deliveries it judged, and no delivery read carries when it reached verify -- so a
21
+ * delivery that reached verify AFTER the approval at the same head (work that
22
+ * committed nothing) would be indistinguishable from one the review held. This
23
+ * record is the distinguishing fact: the review exit writes the verify deliveries
24
+ * it saw (with each one's re-code iteration count), the commit it covered and
25
+ * whether its verdict approved that commit. The iteration count is what makes the
26
+ * census about THAT pass of the delivery: org_nodes.iteration_count climbs on every
27
+ * verify_failed re-code cycle, so a delivery the exit (or anything after it) sent
28
+ * back to coding returns to verify with a different count and is no longer covered.
29
+ *
30
+ * One file per (product, focus, sha) under the global state dir, written atomically
31
+ * (temp + rename) and OVERWRITTEN by each later review exit covering the same
32
+ * commit: only the newest exit's census speaks for the commit, so a gaps_found exit
33
+ * after an approving one withdraws it, and a re-approval that no longer saw a
34
+ * delivery in verify does not carry an older census for it. A record that is
35
+ * missing, unreadable or malformed covers nothing (the convergence leaves the
36
+ * delivery in verify -- the safe direction). Host-local like the auto-approval
37
+ * record (completion/review-auto-approval-record.ts).
38
+ *
39
+ * @module completion/review-census-record
40
+ */
41
+ import { DELIVERY_STATUS } from '@telora/daemon-core';
42
+ import { mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
43
+ import { resolve } from 'node:path';
44
+ import { resolveGlobalStateDir } from '../shell/daemon-process.js';
45
+ import { createLogger } from '../shell/log.js';
46
+ const log = createLogger({ module: 'focus-executor' });
47
+ const SHA_RE = /^[0-9a-f]{7,64}$/i;
48
+ function censusDir() {
49
+ return resolve(resolveGlobalStateDir(), 'review-census');
50
+ }
51
+ function filePrefix(productId, focusId) {
52
+ return `${productId}-${focusId}-`.replace(/[^a-zA-Z0-9._-]/g, '_');
53
+ }
54
+ function isCensusDelivery(raw) {
55
+ if (typeof raw !== 'object' || raw === null)
56
+ return false;
57
+ const r = raw;
58
+ return typeof r.id === 'string' && typeof r.iterationCount === 'number' && Number.isInteger(r.iterationCount);
59
+ }
60
+ function parseCensus(raw) {
61
+ if (typeof raw !== 'object' || raw === null)
62
+ return null;
63
+ const r = raw;
64
+ if (typeof r.productId !== 'string' || typeof r.focusId !== 'string' || typeof r.sessionId !== 'string')
65
+ return null;
66
+ if (typeof r.sha !== 'string' || !SHA_RE.test(r.sha) || typeof r.approving !== 'boolean' || typeof r.recordedAt !== 'string')
67
+ return null;
68
+ if (!Array.isArray(r.verifyDeliveries) || !r.verifyDeliveries.every(isCensusDelivery))
69
+ return null;
70
+ return {
71
+ productId: r.productId, focusId: r.focusId, sha: r.sha, sessionId: r.sessionId,
72
+ approving: r.approving, verifyDeliveries: r.verifyDeliveries, recordedAt: r.recordedAt,
73
+ };
74
+ }
75
+ /** Record a census atomically, replacing the commit's previous one. Best-effort: false (and logged) on a malformed sha or a failed write. */
76
+ export function writeReviewCensus(census, dir = censusDir()) {
77
+ if (!SHA_RE.test(census.sha))
78
+ return false;
79
+ const path = resolve(dir, `${filePrefix(census.productId, census.focusId)}${census.sha.replace(/[^a-zA-Z0-9]/g, '_')}.json`);
80
+ const tmp = `${path}.${process.pid}.tmp`;
81
+ try {
82
+ mkdirSync(dir, { recursive: true });
83
+ writeFileSync(tmp, JSON.stringify(census, null, 2), { mode: 0o600 });
84
+ renameSync(tmp, path);
85
+ return true;
86
+ }
87
+ catch (err) {
88
+ log.warn(`[focus-executor] failed to record the review census of ${census.focusId}@${census.sha.slice(0, 8)}: ${err.message}`);
89
+ return false;
90
+ }
91
+ }
92
+ /** Every census recorded for the focus, newest first. Empty when none can be read: a missing census covers nothing. */
93
+ export function listReviewCensuses(productId, focusId, dir = censusDir()) {
94
+ const prefix = filePrefix(productId, focusId);
95
+ let names;
96
+ try {
97
+ names = readdirSync(dir).filter((name) => name.startsWith(prefix) && name.endsWith('.json'));
98
+ }
99
+ catch {
100
+ return [];
101
+ }
102
+ const censuses = [];
103
+ for (const name of names) {
104
+ try {
105
+ const parsed = parseCensus(JSON.parse(readFileSync(resolve(dir, name), 'utf8')));
106
+ if (parsed && parsed.productId === productId && parsed.focusId === focusId)
107
+ censuses.push(parsed);
108
+ }
109
+ catch {
110
+ // Unreadable or malformed: covers nothing.
111
+ }
112
+ }
113
+ return censuses.sort((a, b) => Date.parse(b.recordedAt) - Date.parse(a.recordedAt));
114
+ }
115
+ /**
116
+ * Take the census of a review exit (see the module header). Only a REVIEW session
117
+ * exiting with its window open and a known covered commit judges anything; any
118
+ * other exit records nothing. The exit approves the commit when its report says
119
+ * approved, or when it is a clean (no report), succeeded, inspected,
120
+ * coverage-complete review -- the two shapes that approve a commit
121
+ * (queries/focus-review-approval.ts). No-op without a writer (a partial test deps
122
+ * object). Never throws.
123
+ */
124
+ export function recordReviewExitCensus(write, input) {
125
+ if (!write || input.sessionType !== 'review' || !input.windowOpen || !input.coveredSha)
126
+ return;
127
+ const cleanApproval = !input.reportExists && input.succeeded && input.reviewInspected !== false && input.coverageComplete;
128
+ try {
129
+ write({
130
+ productId: input.productId,
131
+ focusId: input.focusId,
132
+ sha: input.coveredSha,
133
+ sessionId: input.sessionId,
134
+ approving: input.reviewOutcome === 'approved' || cleanApproval,
135
+ verifyDeliveries: input.deliveries
136
+ .filter((d) => d.executionStatus === DELIVERY_STATUS.VERIFY)
137
+ .map((d) => ({ id: d.id, iterationCount: d.iterationCount ?? 0 })),
138
+ recordedAt: new Date().toISOString(),
139
+ });
140
+ }
141
+ catch (err) {
142
+ log.warn(`[focus-executor] review census not recorded for ${input.focusId}: ${err.message}`);
143
+ }
144
+ }
145
+ //# sourceMappingURL=review-census-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-census-record.js","sourceRoot":"","sources":["../../src/completion/review-census-record.ts"],"names":[],"mappings":"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"}
@@ -21,8 +21,9 @@ import { getDeliveryIssues, rehomeIssueToDelivery } from '../queries/issues.js';
21
21
  import { createEscalation, hasOpenFocusEscalation, hasOpenEscalationForDelivery } from '../queries/escalations.js';
22
22
  import { findOpenOperatorHoldForDelivery } from '../queries/holds.js';
23
23
  import { listOpenShortfallProposalIds } from '../queries/reality-tree.js';
24
- import type { CommitVerdictGateDeps } from './review-exit-verdict-gate.js';
24
+ import type { CommitVerdictGateDeps, FailedGateVerdict } from './review-exit-verdict-gate.js';
25
25
  import { type ReviewAutoApproval } from './review-auto-approval-record.js';
26
+ import { type ReviewCensus } from './review-census-record.js';
26
27
  /**
27
28
  * Dependencies for runReviewExitHandler. Defaults to real implementations;
28
29
  * overridable in tests via the optional `deps` argument.
@@ -36,7 +37,10 @@ export interface ReviewExitDeps {
36
37
  updateDeliveryStatus: typeof updateDeliveryStatus;
37
38
  markDeliveryAutoApproved: typeof markDeliveryAutoApproved;
38
39
  recordReviewAutoApproval?: (approval: ReviewAutoApproval) => boolean;
40
+ recordReviewCensus?: (census: ReviewCensus) => boolean;
39
41
  clearReviewRequestedAt: typeof clearReviewRequestedAt;
42
+ fileReworkForFailedVerdict?: (focusId: string, verdict: FailedGateVerdict) => Promise<number>;
43
+ clearPendingReviewDirective?: (focusId: string) => boolean;
40
44
  setReviewedThroughSha: typeof setReviewedThroughSha;
41
45
  setReviewCycleCount?: typeof setReviewCycleCount;
42
46
  resolveReviewCycleCap?: typeof resolveReviewCycleCap;
@@ -1 +1 @@
1
- {"version":3,"file":"review-exit-deps.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-exit-deps.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
- // Pinned by: none -- no test imports this module directly (baselined; see lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/integration/failed-verdict-review-exit-respawn-regression.test.ts
3
3
  // PINNED-BY-END
4
4
  /**
5
5
  * Dependency contract + default wiring for the review-exit phase.
@@ -17,7 +17,7 @@ import { updateDeliveryStatus, markDeliveryAutoApproved, getDeliveryContext, get
17
17
  import { getFocusWorktree } from '../focus/focus-worktree-state.js';
18
18
  import { blameLineCommits, listReviewWindowCommits } from '../resolvers/shared/review-window-commits.js';
19
19
  import { getActiveFocuses } from '../queries/focus-discovery.js';
20
- import { hasPendingSpawnDirective } from '../directive/directive-queue.js';
20
+ import { clearPendingReviewDirective, hasPendingSpawnDirective } from '../directive/directive-queue.js';
21
21
  import { emitLoopTrigger } from '../loops/index.js';
22
22
  import { getFocusDeliveries, getFocusIssues, clearReviewRequestedAt, setReviewedThroughSha, setReviewCycleCount, setReviewHandoffCount, getFocusReviewReportForSession, getFocusReviewFiledIssueIds, } from '../queries/focuses.js';
23
23
  import { resolveReviewCycleCap, resolveReviewHandoffCap } from '../verify/stall-detector-config.js';
@@ -27,6 +27,8 @@ import { findOpenOperatorHoldForDelivery } from '../queries/holds.js';
27
27
  import { listOpenShortfallProposalIds } from '../queries/reality-tree.js';
28
28
  import { commitGateSeams } from '../verify/commit-gate-configured.js';
29
29
  import { writeReviewAutoApproval } from './review-auto-approval-record.js';
30
+ import { writeReviewCensus } from './review-census-record.js';
31
+ import { fileReworkForFailedVerdict } from '../verify/verification-rework-issue.js';
30
32
  export const defaultReviewExitDeps = {
31
33
  getActiveFocuses,
32
34
  getFocusDeliveries,
@@ -36,7 +38,10 @@ export const defaultReviewExitDeps = {
36
38
  updateDeliveryStatus,
37
39
  markDeliveryAutoApproved,
38
40
  recordReviewAutoApproval: (approval) => writeReviewAutoApproval(approval),
41
+ recordReviewCensus: (census) => writeReviewCensus(census),
39
42
  clearReviewRequestedAt,
43
+ fileReworkForFailedVerdict: (focusId, verdict) => fileReworkForFailedVerdict(focusId, verdict),
44
+ clearPendingReviewDirective,
40
45
  setReviewedThroughSha,
41
46
  setReviewCycleCount,
42
47
  resolveReviewCycleCap,
@@ -1 +1 @@
1
- {"version":3,"file":"review-exit-deps.js","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review-exit-deps.js","sourceRoot":"","sources":["../../src/completion/review-exit-deps.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"review-exit-phase.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-phase.ts"],"names":[],"mappings":"AA+CA,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAMD,OAAO,EACL,iCAAiC,EACjC,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,gGAAgG;AAChG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMnE;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,cAAsC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA6lBf"}
1
+ {"version":3,"file":"review-exit-phase.d.ts","sourceRoot":"","sources":["../../src/completion/review-exit-phase.ts"],"names":[],"mappings":"AAiDA,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;;;;;;OAUG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAMD,OAAO,EACL,iCAAiC,EACjC,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,gGAAgG;AAChG,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMnE;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,cAAsC,GAC3C,OAAO,CAAC,IAAI,CAAC,CA8lBf"}
@@ -1,5 +1,5 @@
1
1
  // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
- // Pinned by: 29 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/completion/review-exit-phase.ts
2
+ // Pinned by: 34 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/completion/review-exit-phase.ts
3
3
  // PINNED-BY-END
4
4
  /**
5
5
  * Review-exit phase of the team completion flow.
@@ -22,12 +22,14 @@ import { resolveShortfallHold, writeShortfallGateState, describeShortfallHold, }
22
22
  import { recordReviewCycleAndMaybeHold } from './review-cycle-cap.js';
23
23
  import { fileCoverageIncompleteEscalation, fileGapsWithoutIssueEscalation, fileMissingReportNotice, recordHandoffAndMaybeTerminate, } from './review-exit-escalations.js';
24
24
  import { forceFullPassReviewFocuses, recordBelowCoverageDrift, resetCoverageDriftState } from './coverage-drift-state.js';
25
- import { resolveReviewCycleProgress, emitReviewCompleted } from './review-exit-progress.js';
26
- import { holdForCommitVerdict, logCommitVerdictHeldExit, reviewReworkGateState } from './review-exit-verdict-gate.js';
25
+ import { resolveReviewCycleProgress, emitReviewCompleted, logLeftInVerifyWithoutSignal } from './review-exit-progress.js';
26
+ import { closeFailedVerdictExit, holdForCommitVerdict, logCommitVerdictHeldExit, reviewReworkGateState } from './review-exit-verdict-gate.js';
27
+ import { refusesReworkOnShortfallPark, logShortfallParkedExit } from './review-exit-shortfall-park.js';
27
28
  import { resolveGapsAttribution } from './review-exit-attribution.js';
28
29
  import { resolveOutsideWindowFindings, rehomeOutsideWindowFindings } from './review-exit-rehoming.js';
29
30
  import { scopeReviewEvidenceToOwnWork } from './review-exit-foreign-findings.js';
30
31
  import { gatherReviewExitEvidence } from './review-exit-evidence.js';
32
+ import { recordReviewExitCensus } from './review-census-record.js';
31
33
  import { createLogger } from '../shell/log.js';
32
34
  import { defaultReviewExitDeps } from './review-exit-deps.js';
33
35
  const log = createLogger({ module: 'focus-executor' });
@@ -170,6 +172,8 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
170
172
  // team that left pre-existing open work behind no longer needs the review
171
173
  // agent to file fresh defects before the loop can correct itself.
172
174
  const reviewDeliveries = await deps.getFocusDeliveries(focusId);
175
+ // Which verify deliveries this review saw at the commit it covered (review-census-record.ts): the standing-approval convergence reads it.
176
+ recordReviewExitCensus(deps.recordReviewCensus, { ...params, windowOpen, coveredSha, coverageComplete, reportExists, reviewOutcome, deliveries: reviewDeliveries });
173
177
  // Judge only THIS focus's work: a blocking finding about another focus's commit (by Telora-Delivery
174
178
  // trailer) is moved to its owner and leaves the target sets; an all-foreign gaps_found verdict resolves
175
179
  // (not 'unresolvable'), so the in-verify delivery converges on merit (review-exit-foreign-findings.ts).
@@ -205,6 +209,9 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
205
209
  // Set when a delivery's done / verify_failed route is held on the gate verdict for the
206
210
  // commit it judges (review-exit-verdict-gate.ts). Keeps the review window open.
207
211
  let verdictHeldAny = false;
212
+ let verdictFailed = null; // held on a verdict to come / on a FAILED one
213
+ // Set when a verify delivery's verify_failed route is refused by a shortfall park (review-exit-shortfall-park.ts).
214
+ let parkedAny = false;
208
215
  // attributionResolvable (scoped above): whether the gaps_found verdict resolved
209
216
  // to ANY delivery (or only to relocated foreign findings). When false, every
210
217
  // delivery reads 'unresolvable' -- absence of attribution holds toward intent.
@@ -318,12 +325,19 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
318
325
  continue;
319
326
  }
320
327
  }
328
+ if (isVerify && target === DELIVERY_STATUS.VERIFY_FAILED && refusesReworkOnShortfallPark(d)) {
329
+ parkedAny = true;
330
+ continue;
331
+ }
321
332
  // Commit-verdict gate (review-exit-verdict-gate.ts): done where a done write follows; a verify delivery's verify_failed.
322
333
  const verdictGatedRoute = target === DELIVERY_STATUS.DONE ? (shortfallsClear && (reportExists || coverageComplete) ? 'done' : null)
323
334
  : isVerify && target === DELIVERY_STATUS.VERIFY_FAILED ? 'verify_failed' : null;
324
335
  const verdictGate = verdictGatedRoute ? await holdForCommitVerdict(deps, params, current, d, verdictGatedRoute) : null;
325
336
  if (verdictGate?.held) {
326
- verdictHeldAny = true;
337
+ if (verdictGate.failed !== undefined)
338
+ verdictFailed = verdictGate;
339
+ else
340
+ verdictHeldAny = true;
327
341
  continue;
328
342
  }
329
343
  if (target === DELIVERY_STATUS.VERIFY_FAILED) {
@@ -398,14 +412,8 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
398
412
  }
399
413
  }
400
414
  else {
401
- // No signal to auto-approve. This exit leaves review_requested_at set, and
402
- // checkAutoReview is suppressed while it is set -- so auto-review re-arms
403
- // only when the window CLOSES (review_complete or the silence/staleness deadline).
404
- const reason = sessionType !== 'review'
405
- ? `${sessionType} session exited (not eligible for auto-approve)`
406
- : 'review session did not succeed';
407
- log.info(`[focus-executor] Delivery "${d.name}" left in verify: ${reason} ` +
408
- `(verify-cycling; review_requested_at still set -> auto-review suppressed until the window closes).`);
415
+ // No signal to auto-approve; the window stays set (review-exit-progress.ts logLeftInVerifyWithoutSignal).
416
+ logLeftInVerifyWithoutSignal(d.name, sessionType);
409
417
  }
410
418
  }
411
419
  catch (err) {
@@ -422,6 +430,8 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
422
430
  // reportExists=true, and that notice requires !reportExists, so the two can
423
431
  // never double-fire for one exit.
424
432
  const gapsWithoutIssue = reviewOutcome === 'gaps_found' && !hasBlockingIssueEvidence;
433
+ if (verdictFailed)
434
+ await closeFailedVerdictExit(deps, params, verdictFailed, verdictHeldAny);
425
435
  if (routedAny) {
426
436
  // A delivery held on its gate verdict still owns this window: the release replay converges it.
427
437
  if (!verdictHeldAny)
@@ -496,9 +506,12 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
496
506
  gapsWithoutIssue, reportExists, hasBlockingIssueEvidence, sessionType, succeeded, reviewInspected,
497
507
  });
498
508
  }
499
- else if (verdictHeldAny) {
500
- // Ahead of the hand-off bound: a gate run, not an incoming team, owns this wait -- never a hand-off.
501
- logCommitVerdictHeldExit(focusName);
509
+ else if (verdictHeldAny || parkedAny || verdictFailed) {
510
+ // Ahead of the hand-off bound: a gate run or a verify re-judgement, not an incoming team, owns this wait.
511
+ if (verdictHeldAny)
512
+ logCommitVerdictHeldExit(focusName);
513
+ else if (parkedAny)
514
+ logShortfallParkedExit(focusName);
502
515
  }
503
516
  else if (deps.hasPendingSpawnDirective(focusId)) {
504
517
  // Nothing routed AND a spawn directive is pending: the team was torn down
@@ -626,7 +639,7 @@ export async function runReviewExitHandler(params, deps = defaultReviewExitDeps)
626
639
  // converged focus carries no pending operator rows (the 2026-09-10 stranded
627
640
  // review-family rows and the 2026-09-09 team_failure-after-last-delivery row).
628
641
  if (convergedAny && !anyReopenedToVerifyFailed && !operatorHeldAny &&
629
- !externalHeldAny && !shortfallHold && !belowCoverageHold && !verdictHeldAny &&
642
+ !externalHeldAny && !shortfallHold && !belowCoverageHold && !verdictHeldAny && !verdictFailed &&
630
643
  deps.resolveConvergedFocusEscalations &&
631
644
  reviewDeliveries.every(d => d.executionStatus === DELIVERY_STATUS.DONE ||
632
645
  d.executionStatus === DELIVERY_STATUS.CANCELLED ||