@overdeck/desktop 0.45.16 → 0.45.19

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 (365) hide show
  1. package/dist-electron/main.js +149 -158
  2. package/dist-electron/main.js.map +1 -1
  3. package/dist-electron/preload.js +17 -2
  4. package/dist-electron/preload.js.map +1 -1
  5. package/package.json +5 -4
  6. package/server/acceptance-criteria-DQqRIuQ-.js +62 -0
  7. package/server/{advancing-selfheal-DJYAvGv-.js → advancing-selfheal-BYidNkmp.js} +6 -6
  8. package/server/{agent-gc-D0wDIeV1.js → agent-gc-ClNQLl_V.js} +3 -3
  9. package/server/agent-state-BMrpX7kU.js +3 -0
  10. package/server/{agent-state-service-DFslS5go.js → agent-state-service-BpAKmodj.js} +5 -5
  11. package/server/{agent-state-service-CZrayD_G.js → agent-state-service-CC9NMIWn.js} +1 -1
  12. package/server/{briefing-freshness-DESTCWo-.js → agents--ljN-wVY.js} +5 -131
  13. package/server/agents-DAUyr_Z1.js +3 -0
  14. package/server/{archive-planning-CoyIbgGK.js → archive-planning-2w8WQaeJ.js} +1 -1
  15. package/server/{archive-planning-CbghE9-o.js → archive-planning-BW3te5Vw.js} +5 -10
  16. package/server/{artifact-index-jobs-CcSrUoSE.js → artifact-index-jobs-DFO3eceF.js} +2 -2
  17. package/server/{backlog-auto-trigger-BfgDsII0.js → backlog-auto-trigger-DECBMxLq.js} +2 -2
  18. package/server/{behavior-BTpYbAv4.js → behavior-CWqNMqE5.js} +2 -2
  19. package/server/briefing-freshness-B1delh4l.js +131 -0
  20. package/server/{checkpoint-manager-DWSXooZV.js → checkpoint-manager-CjLY6A4r.js} +1 -1
  21. package/server/{checkpoint-manager-BwFdegJF.js → checkpoint-manager-D6_71Rpb.js} +3 -3
  22. package/server/checkpoint-worker.js +1 -1
  23. package/server/{checkpoints-BtUonbs3.js → checkpoints-BYrLxVle.js} +2 -2
  24. package/server/{checkpoints-fjadfOKF.js → checkpoints-xSuv4v4I.js} +1 -1
  25. package/server/{claude-hooks-provision-DiK62u0k.js → claude-hooks-provision-DL6yfJB_.js} +1 -1
  26. package/server/{claude-hooks-provision-DAtxutOs.js → claude-hooks-provision-DvfVZbbT.js} +2 -2
  27. package/server/{claude-permissions-CThLgf8d.js → claude-permissions-CcncrTNF.js} +2 -2
  28. package/server/{claude-settings-overlay-BF9MPIwx.js → claude-settings-overlay-1IfYetv2.js} +2 -2
  29. package/server/{claude-settings-overlay-Dx_Uqcmv.js → claude-settings-overlay-Ca3LXjAC.js} +1 -1
  30. package/server/cli-BxZHwgRK.js +3 -0
  31. package/server/{cli-ByKIIMfT.js → cli-DGZWYXio.js} +9 -9
  32. package/server/{cliproxy-B4c1BUvs.js → cliproxy-Dw42Xy3t.js} +2 -2
  33. package/server/{cliproxy-C_GuT5DU.js → cliproxy-DziJLbfo.js} +1 -1
  34. package/server/{close-issue-BOuLKr6e.js → close-issue-DEGjxifn.js} +5 -5
  35. package/server/{closed-issue-reaper-DCAYzNXW.js → closed-issue-reaper-BsJ3JqQy.js} +9 -9
  36. package/server/{closed-issue-reaper-CksfuiFD.js → closed-issue-reaper-CNr7X4MB.js} +1 -1
  37. package/server/codex-C8OlW-dN.js +3 -0
  38. package/server/{codex-BbqIRZjd.js → codex-D5RyWzNL.js} +43 -18
  39. package/server/{codex-parser-mFYZh8vR.js → codex-parser-BRxvUkk8.js} +2 -2
  40. package/server/{config-Dj6N8EP9.js → config-CQ2u44iP.js} +1 -1
  41. package/server/{config-DVLdmnMJ.js → config-Cntj_tFu.js} +2 -2
  42. package/server/{config-yaml-cNOZcEww.js → config-yaml-BQs6GbD_.js} +75 -74
  43. package/server/{conflict-gate-CuXUv-bP.js → conflict-gate-BE6JdfkO.js} +1 -1
  44. package/server/{conflict-gate-BMKm_5DV.js → conflict-gate-DdfwKgy0.js} +3 -3
  45. package/server/{context-layers-c0JqYHcS.js → context-layers-DFucrVVG.js} +17 -3
  46. package/server/{context-layers-CeAwSYNt.js → context-layers-DO0Eyq2E.js} +2 -2
  47. package/server/{control-settings-D4EFsRBd.js → control-settings-bxOCLsuE.js} +4 -4
  48. package/server/{conversation-compaction-BCggyih4.js → conversation-compaction-Dq6MfZdL.js} +8 -8
  49. package/server/{conversation-compaction-kHVfVRg3.js → conversation-compaction-lSlUb-cU.js} +1 -1
  50. package/server/{conversation-service-BTzObqGi.js → conversation-service-BVt4MQ1_.js} +1 -1
  51. package/server/{conversation-service-B8LFQQm1.js → conversation-service-TZsQjkjT.js} +6 -6
  52. package/server/{conversations-B-lcHv-5.js → conversations-CxOWHNzv.js} +4 -4
  53. package/server/{conversations-BM7zlXjr.js → conversations-DaF6elGK.js} +1 -1
  54. package/server/{cost-BcpRQ-7o.js → cost-Dlh0IEiv.js} +3 -3
  55. package/server/{cost-D9kPIY_5.js → cost-oinpUqvE.js} +2 -2
  56. package/server/{cost-sync-DF6odxK9.js → cost-sync-CVIAsrhB.js} +3 -3
  57. package/server/{dag-DKI3sOmX.js → dag-ClFr7Bah.js} +7 -243
  58. package/server/{dangerous-git-ops-Bn18PEcN.js → dangerous-git-ops-q5OPtXMd.js} +1 -1
  59. package/server/dashboard-db-worker.js +6 -6
  60. package/server/{deacon-DONuopff.js → deacon-B8ygB3e8.js} +3 -3
  61. package/server/{deacon-DdARMjZq.js → deacon-D2-xTesT.js} +233 -162
  62. package/server/{deacon-nudge-log-B-naf89q.js → deacon-nudge-log-ilDfxrhK.js} +1 -1
  63. package/server/deacon-swarm-1vPLuj_l.js +2 -0
  64. package/server/{deacon-swarm-BNGkmYR_.js → deacon-swarm-yWKQhxiX.js} +298 -72
  65. package/server/deacon.js +14 -7
  66. package/server/{devcontainer-renderer-C-34Sxyz.js → devcontainer-renderer-xPhZHCrx.js} +3 -3
  67. package/server/{dist-BMXvKiZP.js → dist-BwlEiLCU.js} +1 -1
  68. package/server/dist-Bx4KkgYL.js +3 -0
  69. package/server/{dist-src-BgGUblXg.js → dist-src-BE0Denfs.js} +1 -1
  70. package/server/{docker-apZ9pBYw.js → docker-DPEglAwA.js} +2 -2
  71. package/server/{ensure-devcontainer-Bqi1EF1P.js → ensure-devcontainer-SzSvEdKq.js} +4 -4
  72. package/server/{ensure-devcontainer-Dq3KoOIl.js → ensure-devcontainer-wU3ym1b5.js} +1 -1
  73. package/server/{esm-shims-BEjvINX3.js → esm-shims-Cso7IGBC.js} +1 -1
  74. package/server/{event-store-CqDgfbAs.js → event-store-BZoXexYS.js} +1 -1
  75. package/server/{event-store-D89fMfXS.js → event-store-D4s6eQ6o.js} +3 -3
  76. package/server/{events-rIGncmP1.js → events-Bn-wdUBF.js} +1 -1
  77. package/server/{events-S_C0pvl6.js → events-D1hMLl2a.js} +3 -3
  78. package/server/{factory-DV18m0rc.js → factory-ltWnu0V_.js} +20 -17
  79. package/server/{feature-registry-population-CqZSnqQi.js → feature-registry-population-xj-J1Wm7.js} +4 -4
  80. package/server/{feature-registry-storage-BeXmNBwK.js → feature-registry-storage-CQZukiLm.js} +2 -2
  81. package/server/{features-u5XeMaOK.js → features-Dyqi6N8f.js} +2 -2
  82. package/server/{feedback-target-DDG1PWl3.js → feedback-target-Ba0zhSYI.js} +1 -1
  83. package/server/{feedback-target-CwyWf0Dg.js → feedback-target-Chd5dm-Q.js} +9 -7
  84. package/server/{feedback-writer-BsJiw5aT.js → feedback-writer-BtaoJGl2.js} +1 -1
  85. package/server/{feedback-writer-D20HSXre.js → feedback-writer-BujzReaQ.js} +4 -4
  86. package/server/{flywheel-Dczmgchd.js → flywheel-FTInS73X.js} +15 -28
  87. package/server/{flywheel-RCnHAgc4.js → flywheel-bTImiVrk.js} +1 -1
  88. package/server/{flywheel-merge-order-CtCYsFJP.js → flywheel-merge-order-DuenRJLZ.js} +6 -6
  89. package/server/{flywheel-merge-order-DEtEd3aK.js → flywheel-merge-order-O5Zu8iPw.js} +1 -1
  90. package/server/{flywheel-9Y1X7IM-.js → flywheel-rmYbW-lh.js} +13 -13
  91. package/server/{forge-DFDThFil.js → forge-OWm99lie.js} +22 -12
  92. package/server/forge-x5lszTd0.js +2 -0
  93. package/server/{from-NSJypkI8.js → from-B2tOYhYV.js} +1 -1
  94. package/server/{fts-db-C5A_TTOM.js → fts-db-BRfS5ukG.js} +2 -2
  95. package/server/{fts-operations-DvCSimfU.js → fts-operations-L5sNLoHl.js} +2 -2
  96. package/server/{git-utils-C0neHvQx.js → git-utils-BIEzv2Zp.js} +1 -1
  97. package/server/{git-utils-Dr0L7mFk.js → git-utils-CP-bg-aM.js} +2 -2
  98. package/server/{github-app-u9-SX7Gc.js → github-app-CRUIvHuM.js} +8 -3
  99. package/server/{github-app-Bwt9lK4A.js → github-app-Dtn4ib6M.js} +1 -1
  100. package/server/{github-client-Btyy3uan.js → github-client-CWEFlCqL.js} +3 -3
  101. package/server/{github-client-Do3k-N1W.js → github-client-DSVv6wX8.js} +1 -1
  102. package/server/{github-pr-lookup-DOF1U2WW.js → github-pr-lookup-D6CS9vtG.js} +2 -2
  103. package/server/{harness-resolve-C6g2R0Cd.js → harness-resolve-ScD6rV47.js} +3 -3
  104. package/server/{health-events-Bos3sk5g.js → health-events-DbcJmYmd.js} +1 -1
  105. package/server/{health-events-B4u-2a9m.js → health-events-Dm1Vcvqe.js} +2 -2
  106. package/server/{hooks-uEr8WTx_.js → hooks-B6gaI6Kg.js} +1 -1
  107. package/server/{hooks-BCoOjL_R.js → hooks-VXuCnzCv.js} +3 -3
  108. package/server/hume-B4seN95Y.js +3 -0
  109. package/server/{hume-BqxYKbUf.js → hume-BRhNKyXQ.js} +2 -2
  110. package/server/{idle-stack-reaper-H0W6XtHh.js → idle-stack-reaper-Gv32ZCrQ.js} +1 -1
  111. package/server/{idle-stack-reaper-DbZ8ukMd.js → idle-stack-reaper-po700Lfg.js} +2 -2
  112. package/server/{infra-Ba9mS6e6.js → infra-DYwIXlK5.js} +9 -4
  113. package/server/{injection-C1DKXeIZ.js → injection-CTfFnpsG.js} +1 -1
  114. package/server/{injection-yrMBxzVq.js → injection-DPsUoCJp.js} +7 -7
  115. package/server/inspect-agent-B25IP-0O.js +2 -0
  116. package/server/{inspect-agent-B-mnb4uh.js → inspect-agent-CLkwfLRx.js} +35 -67
  117. package/server/{internal-token-BtqSbKTx.js → internal-token--50JhWP7.js} +2 -2
  118. package/server/{internal-token-BPYEaXFh.js → internal-token-BOgxXMGy.js} +1 -1
  119. package/server/{io-VEGSAqsd.js → io-Cv9xQTks.js} +36 -43
  120. package/server/{issue-closed-BxcePXL-.js → issue-closed-CyqtoFUj.js} +41 -6
  121. package/server/{issue-lifecycle-CdMUauyb.js → issue-lifecycle-Cm7ydBGK.js} +1 -1
  122. package/server/{issue-lifecycle--8MRxrG1.js → issue-lifecycle-DR6n40bh.js} +22 -37
  123. package/server/{issue-service-singleton-MZsDhAob.js → issue-service-singleton--LQ5c2zT.js} +1 -1
  124. package/server/{issue-service-singleton-CkTUI-eu.js → issue-service-singleton-DKKPneH4.js} +29 -29
  125. package/server/{issues-CBAsuoAO.js → issues-Cr-BLFLO.js} +2 -2
  126. package/server/{jsonl-parser-BUW5_sSK.js → jsonl-parser-Bp_xCkX4.js} +3 -3
  127. package/server/{label-cleanup-htK6fBRU.js → label-cleanup-BbLy2FZe.js} +3 -3
  128. package/server/{state-home-CEvD_v5F.js → launcher-generator-C-FU4PNT.js} +7 -127
  129. package/server/{layers-jjL16At6.js → layers-C-6lBDUE.js} +2 -2
  130. package/server/lifecycle-Bmw8yU_A.js +12 -0
  131. package/server/{lifecycle-io-DXv8Utct.js → lifecycle-io-B150XprC.js} +1 -1
  132. package/server/{lifecycle-io-IehcRt2v.js → lifecycle-io-Dcu-_ktz.js} +4 -4
  133. package/server/{linear-client-D9cSQfvD.js → linear-client-BHjs0luk.js} +3 -3
  134. package/server/{linear-client-By7hjwuN.js → linear-client-s65LNmlG.js} +1 -1
  135. package/server/memory-fts-worker.js +1 -1
  136. package/server/{merge-BLcEZNXz.js → merge-CM8swd2V.js} +1 -1
  137. package/server/{merge-BN8FGJ2q.js → merge-CS0b-E3u.js} +3 -3
  138. package/server/{merge-agent-B3u2szOL.js → merge-agent-Bu1hw9cz.js} +64 -51
  139. package/server/{merge-agent-ejC7Wos8.js → merge-agent-D6LRIW63.js} +1 -1
  140. package/server/{merge-batch-DyqlgYGp.js → merge-batch-Bv6Z5K2H.js} +1 -1
  141. package/server/{merge-blockers-cq-aS2KG.js → merge-blockers-Dt43hJiW.js} +2 -2
  142. package/server/merge-ops-DwYi3U_x.js +2 -0
  143. package/server/{merge-rebase-Dl7yIxtV.js → merge-rebase-B3vQcTq1.js} +2 -2
  144. package/server/{merge-set-Dy0D0r3i.js → merge-set-BMEGEKQg.js} +1 -1
  145. package/server/{merge-set-CZ9Nbay0.js → merge-set-Pe3spe8k.js} +3 -3
  146. package/server/{merge-sync-CG9kDCdT.js → merge-sync-CpxFRIQ7.js} +1 -1
  147. package/server/{merge-sync-D7jWLgCC.js → merge-sync-STpg1hk3.js} +2 -2
  148. package/server/{merge-train-CH33XJOH.js → merge-train-DLw2hDk0.js} +3 -3
  149. package/server/{merge-train-deps-JoVdGnOg.js → merge-train-deps-BlCGLqwy.js} +4 -4
  150. package/server/{merge-verification-D4wTChdX.js → merge-verification-C4WMP40D.js} +4 -4
  151. package/server/{multipart-parser-Csn8U-K9.js → multipart-parser-9DhuAkPd.js} +2 -2
  152. package/server/node_modules/.package-lock.json +11 -11
  153. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  154. package/server/node_modules/toml/README.md +54 -0
  155. package/server/node_modules/toml/index.d.ts +42 -1
  156. package/server/node_modules/toml/index.js +3 -3
  157. package/server/node_modules/toml/lib/compiler.js +35 -3
  158. package/server/node_modules/toml/lib/parser.js +224 -143
  159. package/server/node_modules/toml/package.json +3 -1
  160. package/server/node_modules/ws/lib/receiver.js +15 -32
  161. package/server/node_modules/ws/lib/websocket-server.js +4 -4
  162. package/server/node_modules/ws/lib/websocket.js +4 -4
  163. package/server/node_modules/ws/package.json +5 -1
  164. package/server/{orphan-proposed-reconciler-BIcNu4tl.js → orphan-proposed-reconciler-eetUXmmt.js} +1 -1
  165. package/server/{orphan-proposed-reconciler-DI_IS1p_.js → orphan-proposed-reconciler-k9eydM1E.js} +14 -24
  166. package/server/package-lock.json +12 -12
  167. package/server/package.json +1 -1
  168. package/server/{pan-dir-CQIfKG8c.js → pan-dir-D3vABXMs.js} +4 -4
  169. package/server/{paths-Blj6A9AJ.js → paths-DIoslfsu.js} +2 -2
  170. package/server/{pipeline-notifier-BH4PAi-w.js → pipeline-notifier-Bgidcelx.js} +1 -1
  171. package/server/{pipeline-notifier-D_WYtEwl.js → pipeline-notifier-CuBONomU.js} +2 -2
  172. package/server/{project-pipelines-jMTitpeO.js → project-pipelines-B9b_JVTS.js} +2 -2
  173. package/server/projects-DxMUi2eI.js +3 -0
  174. package/server/{prompts-B3njaImU.js → prompts-CY1xnHS-.js} +2 -2
  175. package/server/{providers-DnPxkHoG.js → providers-B7BNcK_j.js} +1 -1
  176. package/server/{providers-BbEyFhPX.js → providers-CAlK2If5.js} +7 -7
  177. package/server/public/assets/{chunk-BO2N2NFS-3qh9TUJi.js → chunk-BO2N2NFS-DzKZyoKY.js} +4 -4
  178. package/server/public/assets/{diagram-OG6HWLK6-D8UVTPj7.js → diagram-OG6HWLK6-Cx8mWUb8.js} +1 -1
  179. package/server/public/assets/{dist-BvLLn1YC.js → dist-BqccLhaw.js} +3 -3
  180. package/server/public/assets/{dist-CyubL7Wj.js → dist-rC3nAs_O.js} +1 -1
  181. package/server/public/assets/{ganttDiagram-6RSMTGT7-BI4E1LbQ.js → ganttDiagram-6RSMTGT7-DLYPLf5T.js} +1 -1
  182. package/server/public/assets/{highlighted-body-OFNGDK62-D_bapWkF.js → highlighted-body-OFNGDK62-D4DqixbV.js} +1 -1
  183. package/server/public/assets/index-CPcysUHk.js +796 -0
  184. package/server/public/assets/index-H5M0yhM4.css +1 -0
  185. package/server/public/assets/{linear-CEdobObr.js → linear-yqcXkDfj.js} +1 -1
  186. package/server/public/assets/mermaid-GHXKKRXX-CWdZ_heB.js +1 -0
  187. package/server/public/assets/{pieDiagram-4H26LBE5-DT79L01f.js → pieDiagram-4H26LBE5-DhraIOaV.js} +1 -1
  188. package/server/public/assets/{prod-CR_K2DFV.js → prod-DKUunUdN.js} +4 -4
  189. package/server/public/assets/{quadrantDiagram-W4KKPZXB-BEkKXXrL.js → quadrantDiagram-W4KKPZXB-DPiRcToa.js} +1 -1
  190. package/server/public/assets/{sankeyDiagram-5OEKKPKP-BxSCqn-j.js → sankeyDiagram-5OEKKPKP-3An5HNkZ.js} +1 -1
  191. package/server/public/assets/{xychartDiagram-2RQKCTM6-DicwJGG_.js → xychartDiagram-2RQKCTM6-lbEOjfqQ.js} +1 -1
  192. package/server/public/index.html +2 -2
  193. package/server/{pull-requests-43LPDfM8.js → pull-requests-Cs4VLxiY.js} +1 -1
  194. package/server/{pull-requests-DyUkQl4W.js → pull-requests-CxfrQiWX.js} +3 -3
  195. package/server/{agents-B9GwfCyp.js → queries-srgusoi8.js} +710 -325
  196. package/server/{rally-BtWjybOa.js → rally-AKkjuGdi.js} +3 -3
  197. package/server/rally-BOza5j3_.js +3 -0
  198. package/server/{rally-api-B-osULNL.js → rally-api-BGxATnyr.js} +2 -2
  199. package/server/{rally-api-B-YA_oXx.js → rally-api-Dbqw1YW9.js} +1 -1
  200. package/server/{rally-client-CzFymP7P.js → rally-client-B1U5ewpO.js} +1 -1
  201. package/server/{rally-client-sErNQBO0.js → rally-client-D8h73ei_.js} +5 -5
  202. package/server/{reap-terminal-sessions-DnDQ7pf9.js → reap-terminal-sessions-BR39qflC.js} +1 -1
  203. package/server/{reap-terminal-sessions-2s-fvilz.js → reap-terminal-sessions-CFkuquQj.js} +1 -1
  204. package/server/{rebuild-stack-CoU-HqZj.js → rebuild-stack-BYdtwS6f.js} +5 -5
  205. package/server/{rebuild-stack-nGD_nPZo.js → rebuild-stack-Dsm9WjKv.js} +1 -1
  206. package/server/{reconstruct-cache-Wj8GrYB0.js → reconstruct-cache-D7oM1lNv.js} +6 -6
  207. package/server/record-BeXdn9Ue.js +3 -0
  208. package/server/record-update-Cb_pPM-F.js +168 -0
  209. package/server/record-update-KFiISAmu.js +3 -0
  210. package/server/recovery-trip-DwbsONZf.js +44 -0
  211. package/server/{release-engine-CBLQXDlH.js → release-engine-CAai5W0V.js} +5 -5
  212. package/server/{release-set-BNiqi7hy.js → release-set-vNEAfyDH.js} +3 -3
  213. package/server/{remote-DW_TWQnr.js → remote-8HlOfuF1.js} +3 -3
  214. package/server/{remote-DcO9An_f.js → remote-RQMKOL_R.js} +3 -3
  215. package/server/{remote-agents-C4cyxHQS.js → remote-agents-C4a4DdTj.js} +6 -33
  216. package/server/{remote-agents-Cv-U-_V8.js → remote-agents-_Z1SAaSK.js} +1 -1
  217. package/server/{remote-completion-PhXGGFQy.js → remote-completion-CH3igKY8.js} +13 -13
  218. package/server/resume-Cr34JAXO.js +3 -0
  219. package/server/{review-agent-Dn-yn7Zj.js → review-agent-CQ7oRh_G.js} +31 -23
  220. package/server/{review-agent-u5q3ip7H.js → review-agent-CUVj54v0.js} +1 -1
  221. package/server/{review-artifacts-D4T04aYI.js → review-artifacts-CC3yGv7o.js} +5 -19
  222. package/server/{review-context-Rc0VDLG_.js → review-context-BuxaAgAd.js} +8 -8
  223. package/server/{review-monitor-BC--miCO.js → review-monitor-uogOppaW.js} +2 -2
  224. package/server/{review-status-CG0iDuWa.js → review-status-BoJdyvUQ.js} +1 -1
  225. package/server/{review-status-Dc1l4dVz.js → review-status-By86XA6Z.js} +38 -62
  226. package/server/{review-status-enrichment-C1a1OG_1.js → review-status-enrichment-CRQAO27G.js} +3 -3
  227. package/server/{review-status-sync-CfSixhhX.js → review-status-sync-BI4WhUkF.js} +1 -1
  228. package/server/{review-status-sync-CAr-hfnJ.js → review-status-sync-DUQmrLkK.js} +2 -2
  229. package/server/{review-verdict-feedback-CVDbIDBe.js → review-verdict-feedback-BNcGkBRD.js} +8 -8
  230. package/server/{review-verdict-feedback-D2Q960wX.js → review-verdict-feedback-CWz9_9Kp.js} +1 -1
  231. package/server/{rollup-CakjztPl.js → rollup-B-K6PCbm.js} +1 -1
  232. package/server/{rollup-DctoIu-A.js → rollup-CqiFgtBp.js} +8 -8
  233. package/server/{scanner-BTM1jc_u.js → scanner-BZmDUjyD.js} +7 -7
  234. package/server/{sequence-io-pnoIDGv4.js → sequence-io-BuUx1ZAY.js} +4 -4
  235. package/server/{sequencer-agent-9Soi-WL-.js → sequencer-agent-2uWOA_BC.js} +6 -17
  236. package/server/server.js +4700 -4096
  237. package/server/{service-DfTVoqJg.js → service-COB19Uhm.js} +116 -90
  238. package/server/{session-fork-C4jAFHj8.js → session-fork-D18TscUZ.js} +2 -2
  239. package/server/{session-history-DanhhiCw.js → session-history-DbWnzfo-.js} +4 -4
  240. package/server/settings-C3w2std9.js +2 -0
  241. package/server/{settings-Cuc12oP_.js → settings-CFEdfovT.js} +2 -2
  242. package/server/{settings-DfT3f86D.js → settings-DNPAf2X_.js} +3 -3
  243. package/server/{shadow-engineering-bKuKTCn-.js → shadow-engineering-D8xTtraU.js} +3 -3
  244. package/server/{shadow-state-DJz6_pb_.js → shadow-state-CTgub0ME.js} +2 -2
  245. package/server/{shadow-state-CVHpRWlb.js → shadow-state-fRDYhcyx.js} +1 -1
  246. package/server/shadow-utils-DqMLnRgQ.js +39 -0
  247. package/server/{ship-log-CwqPFfqx.js → ship-log-BRQQi2lU.js} +1 -1
  248. package/server/{smart-compaction-B4KlpZGN.js → smart-compaction-CL6yaFpc.js} +1 -1
  249. package/server/{smart-compaction-CiWfGfRZ.js → smart-compaction-CsJDKM-N.js} +7 -7
  250. package/server/{spawn-planning-session-D5N3RuLG.js → spawn-planning-session-C_wIQ-Zg.js} +1 -1
  251. package/server/{spawn-planning-session-CU-DwyDl.js → spawn-planning-session-D0-NlNK1.js} +16 -16
  252. package/server/{specialist-completion-CJcv-NXH.js → specialist-completion-pJtESo7m.js} +1 -1
  253. package/server/{specialist-context-B2HlbNxS.js → specialist-context-DXj5Itg8.js} +5 -5
  254. package/server/{specialist-handoff-logger-CQyF1ygu.js → specialist-handoff-logger-BFH-IB0n.js} +2 -2
  255. package/server/{specialist-logs-CdcUpfjj.js → specialist-logs-B-rldhNg.js} +3 -3
  256. package/server/{specialists-CFgw_0Q6.js → specialists-C6-b3YZb.js} +161 -448
  257. package/server/{specialists-D7AcFi1u.js → specialists-CI_eqHAz.js} +1 -1
  258. package/server/{specialists-CwzFdapR.js → specialists-Dp8ABxVh.js} +18 -18
  259. package/server/{specialists-k22_Btaq.js → specialists-Hq3EojmD.js} +1 -1
  260. package/server/specs-DPGNVh51.js +3 -0
  261. package/server/{src-B4TTzNSr.js → src-By3D85Ry.js} +6 -1
  262. package/server/{src-BvpMg4EB.js → src-CqyFg52C.js} +5 -5
  263. package/server/{src-D4YUZrwR.js → src-DhxM-eCb.js} +6 -6
  264. package/server/{stack-health-DVN7zRnL.js → stack-health-Bxt-oGE6.js} +1 -1
  265. package/server/{stack-health-CSgcYcr8.js → stack-health-FtNYSTCS.js} +2 -2
  266. package/server/stale-task-claims-DnCHCATD.js +69 -0
  267. package/server/state-home-BzzKVh_C.js +213 -0
  268. package/server/{state-mapping-C13UaCL7.js → state-mapping-Ci0pkac4.js} +1 -1
  269. package/server/state-migrate-BS4IybIS.js +362 -0
  270. package/server/{stuck-remediation-nTIvhGOR.js → stuck-remediation-CTNT4LUC.js} +1 -1
  271. package/server/{stuck-remediation-CxsyxwFO.js → stuck-remediation-DbwhGg3g.js} +36 -41
  272. package/server/{summary-fork-CnRMPCYd.js → summary-fork-CloCB8dV.js} +2 -2
  273. package/server/{summary-fork-gKSoFAnK.js → summary-fork-DaCs0tCq.js} +8 -8
  274. package/server/supervisor/{paths-3R6b989k.js → paths-C1yU0jq4.js} +5 -3
  275. package/server/supervisor/pty-supervisor.js +2 -2
  276. package/server/supervisor/{pty-token-CScQ32Rj.js → pty-token-CSryb8Mb.js} +2 -2
  277. package/server/{supervisor-CZMs8s0M.js → supervisor-CRED6PD6.js} +2 -2
  278. package/server/supervisor-DHwuClN_.js +2 -0
  279. package/server/{swarm-readiness-h6-pwY8w.js → swarm-readiness-CEOrP9rE.js} +3 -3
  280. package/server/{system-prerequisites-DZZTi2G6.js → system-prerequisites-Bz6KdkFJ.js} +1 -13
  281. package/server/{teardown-workspace-B4D-oCVg.js → teardown-workspace-Ckn7HGhp.js} +14 -71
  282. package/server/{test-agent-queue-CnuYku4B.js → test-agent-queue-C8lE8r2j.js} +5 -5
  283. package/server/{tldr-daemon-CgZQ3jmZ.js → tldr-daemon-BE5rqR90.js} +1 -1
  284. package/server/{tldr-daemon-CuA8hz21.js → tldr-daemon-CGwDr28O.js} +2 -2
  285. package/server/{tmux-C3g9VFcg.js → tmux-C3X2XmV0.js} +92 -4
  286. package/server/tmux-DNaD06Gc.js +3 -0
  287. package/server/{token-g_sJ19g3.js → token-Dsa-i36o.js} +2 -2
  288. package/server/{token-util-DiwnnbJo.js → token-util-BWNpH96m.js} +1 -1
  289. package/server/token-util-DRt0j2nQ.js +3 -0
  290. package/server/{tracker-config-dQxC15vH.js → tracker-config-5Cabf1MU.js} +2 -2
  291. package/server/{tracker-utils--z8FLSWn.js → tracker-utils-Cl-Eaqrv.js} +2 -2
  292. package/server/{tracker-utils-DkKyRT0H.js → tracker-utils-FexeJhyf.js} +1 -1
  293. package/server/{tunnel-CN2px87h.js → tunnel-D4px7sKc.js} +1 -1
  294. package/server/{tunnel-BpWZs0Jy.js → tunnel-KId6Z59z.js} +3 -3
  295. package/server/typed-errors-CH4roFIj.js +3 -0
  296. package/server/{typed-errors-sLpGfegz.js → typed-errors-n_Tnb4Fh.js} +3 -4
  297. package/server/{types-BLS_Zbmd.js → types-DOjWNv3Z.js} +1 -1
  298. package/server/{types-tlXf80x3.js → types-DXBMm4mX.js} +1 -1
  299. package/server/{uat-train-BRo6DM7p.js → uat-train-B16skN7L.js} +24 -25
  300. package/server/{uat-train-utGVmqdm.js → uat-train-BBMrnecu.js} +1 -1
  301. package/server/validation-Zc4kAmqa.js +3 -0
  302. package/server/{validation-CsPVsoA0.js → validation-xAD7y5vW.js} +70 -23
  303. package/server/verification-artifact-DK1xb1zG.js +56 -0
  304. package/server/verification-artifact-JD_edpZ9.js +2 -0
  305. package/server/{verification-runner-CMT5WRMS.js → verification-runner-32y8NRfL.js} +338 -58
  306. package/server/verification-runner-DAat1p1u.js +2 -0
  307. package/server/{vtt-parser-C_XPlifj.js → vtt-parser-QnRfcjiU.js} +1 -1
  308. package/server/{work-agent-prompt-ZTAb2Hyf.js → work-agent-prompt-S3Fe1kpV.js} +12 -88
  309. package/server/{workflows-CXRwhw_o.js → workflows-BNvk5gbE.js} +17 -24
  310. package/server/workflows-Cw2-a_hn.js +2 -0
  311. package/server/{workspace-CNfuj1-5.js → workspace-BhUnCpcq.js} +3 -3
  312. package/server/{workspace-9UEsKuiP.js → workspace-C-gP6JAz.js} +1 -1
  313. package/server/{workspace-config-ChWOECy0.js → workspace-config-C77NKnsV.js} +1 -1
  314. package/server/{workspace-manager-D8AByFIT.js → workspace-manager-BKiMmb0c.js} +23 -48
  315. package/server/{workspace-manager-BO-6k3sP.js → workspace-manager-DD6PDqV8.js} +1 -1
  316. package/server/{workspace-metadata-CvC268MN.js → workspace-metadata-Cnq0snrf.js} +2 -2
  317. package/server/{workspace-metadata-DZiJtnuF.js → workspace-metadata-D5gNR61G.js} +1 -1
  318. package/server/{workspaces-D-uIoqbg.js → workspaces-DiAwBsb9.js} +182 -152
  319. package/sync-sources/hooks/codex-notify-hook +64 -8
  320. package/sync-sources/hooks/record-cost-event.js +1110 -37
  321. package/sync-sources/hooks/record-cost-event.js.map +1 -1
  322. package/sync-sources/hooks/statusline.sh +2 -2
  323. package/sync-sources/hooks/work-agent-stop-hook +1 -2
  324. package/server/acceptance-criteria-BZ_nQS1f.js +0 -33
  325. package/server/agent-state-lGvgPP4m.js +0 -3
  326. package/server/agents-CEcaxSkR.js +0 -3
  327. package/server/auto-commit-IW-eik_b.js +0 -3
  328. package/server/bd-process-lock-XAXAet9O.js +0 -390
  329. package/server/beads-B1u04n3o.js +0 -2
  330. package/server/beads-BeSMEjGT.js +0 -649
  331. package/server/beads-query-Dl4FhT8J.js +0 -95
  332. package/server/beads-restore-BUItPOjI.js +0 -23
  333. package/server/cli-D9cUTbBr.js +0 -3
  334. package/server/codex-BYPz6ZdF.js +0 -3
  335. package/server/compact-beads-CyJtoXJi.js +0 -94
  336. package/server/compact-beads-N00E4EVa.js +0 -3
  337. package/server/deacon-swarm-CvdFekIO.js +0 -2
  338. package/server/dist-BNwrgsUO.js +0 -3
  339. package/server/export-BJHSVwKP.js +0 -87
  340. package/server/forge-8y6aEPTB.js +0 -2
  341. package/server/hume-CerGi2RH.js +0 -3
  342. package/server/inspect-agent-CWkeAB7J.js +0 -2
  343. package/server/lifecycle-Ck2UR27D.js +0 -14
  344. package/server/merge-ops-CFkQtXEj.js +0 -2
  345. package/server/projects-CrBE6IhN.js +0 -3
  346. package/server/public/assets/index-BAZxZ-8I.js +0 -796
  347. package/server/public/assets/index-FBG3JBfq.css +0 -1
  348. package/server/public/assets/mermaid-GHXKKRXX-BYP8MI37.js +0 -1
  349. package/server/rally-oggyp4cs.js +0 -3
  350. package/server/record-lEYK__LD.js +0 -3
  351. package/server/recovery-trip-BT7nb9OV.js +0 -98
  352. package/server/resolver-C7dLn8OK.js +0 -158
  353. package/server/resume-BYZBIab-.js +0 -3
  354. package/server/settings-Cy7SCFO9.js +0 -2
  355. package/server/specs-RzcDgozr.js +0 -3
  356. package/server/supervisor-CfX192ma.js +0 -2
  357. package/server/tmux-By8E_Yv_.js +0 -3
  358. package/server/token-util-C9u4An3K.js +0 -3
  359. package/server/tracker-config-BzfVj41Z.js +0 -3
  360. package/server/typed-errors-CrN1AByg.js +0 -3
  361. package/server/validation-Dq_wwcw3.js +0 -3
  362. package/server/verification-runner-D0Uh-9jc.js +0 -2
  363. package/server/workflows-BLwxUMP7.js +0 -2
  364. package/server/writer-BUweuRPx.js +0 -3
  365. package/server/writer-CrP2xuBn.js +0 -251
@@ -1,18 +1,187 @@
1
- import { Fn as init_projects, Sn as findProjectByPathSync } from "./config-yaml-cNOZcEww.js";
2
- import { c as init_review_status, f as markWorkspaceStuck, s as getReviewStatusSync, y as setReviewStatusSync } from "./review-status-Dc1l4dVz.js";
3
- import { K as stopAgent, Yn as setAgentPaused, j as messageAgent, t as init_agents } from "./agents-B9GwfCyp.js";
4
- import { o as init_io, t as VBriefMergeConflictError } from "./io-VEGSAqsd.js";
5
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-D20HSXre.js";
6
- import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-CwyWf0Dg.js";
7
- import { a as getVBriefACStatusSync } from "./beads-BeSMEjGT.js";
8
- import { n as init_validation, r as runQualityGates, t as DEFAULT_GATES } from "./validation-CsPVsoA0.js";
9
- import { Effect } from "effect";
1
+ import { Fn as init_projects, Jr as getOverdeckHome, Sn as findProjectByPathSync, Sr as init_errors, Yr as init_paths, Zr as packageRoot, cn as init_state_plane, qn as resolveProjectFromIssueSync, rr as init_issue_id } from "./config-yaml-BQs6GbD_.js";
2
+ import { C as init_review_status_source, c as init_review_status, f as markWorkspaceStuck, s as getReviewStatusSync, w as readReviewStatusMap, y as setReviewStatusSync } from "./review-status-By86XA6Z.js";
3
+ import { L as messageAgent, Q as stopAgent, Xn as setAgentPaused, s as init_agents } from "./queries-srgusoi8.js";
4
+ import { n as init_tracker_utils } from "./tracker-utils-Cl-Eaqrv.js";
5
+ import { m as readWorkspacePlanSync, o as init_io, t as VBriefMergeConflictError, v as init_types, y as subItemsOf } from "./io-Cv9xQTks.js";
6
+ import { n as init_shadow_utils } from "./shadow-utils-DqMLnRgQ.js";
7
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-BujzReaQ.js";
8
+ import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-Chd5dm-Q.js";
9
+ import { i as runQualityGates, n as init_validation, t as DEFAULT_GATES } from "./validation-xAD7y5vW.js";
10
+ import { r as writeVerificationArtifact, t as readVerificationArtifact } from "./verification-artifact-DK1xb1zG.js";
11
+ import { n as getVBriefACStatusSync } from "./acceptance-criteria-DQqRIuQ-.js";
12
+ import { join } from "node:path";
13
+ import { Data, Effect } from "effect";
10
14
  import { existsSync } from "fs";
11
- import { basename, dirname, join } from "path";
15
+ import { basename as basename$1, dirname as dirname$1, join as join$1 } from "path";
12
16
  import { homedir } from "os";
17
+ import { closeSync as closeSync$1, existsSync as existsSync$1, mkdirSync as mkdirSync$1, openSync as openSync$1, readFileSync as readFileSync$1, renameSync as renameSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
13
18
  import { readdir } from "fs/promises";
14
- import { exec } from "child_process";
15
- import { promisify } from "util";
19
+ import { exec, spawn } from "node:child_process";
20
+ import { promisify } from "node:util";
21
+ import { exec as exec$1 } from "child_process";
22
+ import { promisify as promisify$1 } from "util";
23
+ //#region ../../lib/cloister/verification-feedback.ts
24
+ init_errors();
25
+ init_review_status_source();
26
+ init_review_status();
27
+ init_validation();
28
+ function buildFinalFailureInstructions(issueId) {
29
+ return `## NEEDS-YOU: Verification stuck
30
+
31
+ Automatic verification paused after repeated failures so it does not keep spending cycles on the same failing gate.
32
+
33
+ Fix every reported failure, commit and push the corrections, then run \`pan done ${issueId} -c "<summary>"\`. That command resets verification and returns the latest commit to the normal review, test, and merge pipeline. If you cannot complete the fixes, report the concrete blocker for operator help.`;
34
+ }
35
+ //#endregion
36
+ //#region ../../lib/cloister/verification-worker-supervisor.ts
37
+ init_paths();
38
+ const POLL_MS = 250;
39
+ const MAX_RUN_MS = 3900 * 1e3;
40
+ function safeIssueId(issueId) {
41
+ return issueId.toLowerCase().replace(/[^a-z0-9-]/g, "-");
42
+ }
43
+ function workerDir(issueId) {
44
+ return join(getOverdeckHome(), "verification-workers", safeIssueId(issueId));
45
+ }
46
+ function statePath(issueId) {
47
+ return join(workerDir(issueId), "state.json");
48
+ }
49
+ function isProcessAlive(pid) {
50
+ try {
51
+ process.kill(pid, 0);
52
+ return true;
53
+ } catch {
54
+ return false;
55
+ }
56
+ }
57
+ function readVerificationWorkerState(issueId) {
58
+ try {
59
+ const parsed = JSON.parse(readFileSync$1(statePath(issueId), "utf8"));
60
+ return parsed.issueId === issueId && Number.isInteger(parsed.pid) ? parsed : null;
61
+ } catch {
62
+ return null;
63
+ }
64
+ }
65
+ function isVerificationWorkerActive(issueId) {
66
+ const state = readVerificationWorkerState(issueId);
67
+ return !!state && isProcessAlive(state.pid) && !existsSync$1(state.resultPath);
68
+ }
69
+ function writeJsonAtomic(path, value) {
70
+ const temp = `${path}.${process.pid}.tmp`;
71
+ writeFileSync$1(temp, `${JSON.stringify(value, null, 2)}\n`);
72
+ renameSync$1(temp, path);
73
+ }
74
+ async function waitForResult(state) {
75
+ const deadline = Date.now() + MAX_RUN_MS;
76
+ while (Date.now() < deadline) {
77
+ if (existsSync$1(state.resultPath)) return JSON.parse(readFileSync$1(state.resultPath, "utf8"));
78
+ if (!isProcessAlive(state.pid)) return {
79
+ outcome: "error",
80
+ message: `Verification worker ${state.pid} exited before writing a result`
81
+ };
82
+ await new Promise((resolve) => setTimeout(resolve, POLL_MS));
83
+ }
84
+ return {
85
+ outcome: "error",
86
+ message: `Verification worker ${state.pid} exceeded ${MAX_RUN_MS}ms`
87
+ };
88
+ }
89
+ async function runSupervisedVerification(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
90
+ const existing = readVerificationWorkerState(issueId);
91
+ if (existing && existing.workspacePath === workspacePath && isProcessAlive(existing.pid) && !existsSync$1(existing.resultPath)) {
92
+ console.log(`[${logPrefix}] Joining live verification worker ${existing.pid} for ${issueId}`);
93
+ return waitForResult(existing);
94
+ }
95
+ const dir = workerDir(issueId);
96
+ mkdirSync$1(dir, { recursive: true });
97
+ const runId = `${Date.now()}-${process.pid}`;
98
+ const resultPath = join(dir, `result-${runId}.json`);
99
+ const logPath = join(dir, `worker-${runId}.log`);
100
+ const workerPath = process.env.OVERDECK_VERIFICATION_WORKER_PATH || join(packageRoot, "dist", "verification-worker.js");
101
+ if (!existsSync$1(workerPath)) return {
102
+ outcome: "error",
103
+ message: `Verification worker bundle missing at ${workerPath}; run npm run build`
104
+ };
105
+ const logFd = openSync$1(logPath, "a");
106
+ const child = spawn(process.execPath, [workerPath, JSON.stringify({
107
+ issueId,
108
+ workspacePath,
109
+ workspaceInfo,
110
+ logPrefix,
111
+ options,
112
+ runId,
113
+ resultPath
114
+ })], {
115
+ detached: true,
116
+ stdio: [
117
+ "ignore",
118
+ logFd,
119
+ logFd
120
+ ],
121
+ env: {
122
+ ...process.env,
123
+ OVERDECK_VERIFICATION_WORKER: "1"
124
+ }
125
+ });
126
+ closeSync$1(logFd);
127
+ if (!child.pid) return {
128
+ outcome: "error",
129
+ message: "Failed to spawn verification worker"
130
+ };
131
+ const state = {
132
+ runId,
133
+ issueId,
134
+ workspacePath,
135
+ pid: child.pid,
136
+ startedAt: (/* @__PURE__ */ new Date()).toISOString(),
137
+ resultPath
138
+ };
139
+ writeJsonAtomic(statePath(issueId), state);
140
+ child.unref();
141
+ console.log(`[${logPrefix}] Verification worker ${child.pid} supervising ${issueId}`);
142
+ return waitForResult(state);
143
+ }
144
+ //#endregion
145
+ //#region ../../lib/work/test-requirement-gate.ts
146
+ init_projects();
147
+ init_state_plane();
148
+ init_types();
149
+ init_io();
150
+ init_agents();
151
+ init_feedback_writer();
152
+ init_feedback_target();
153
+ /**
154
+ * Pure helpers for the PAN-1501 test-requirement gate.
155
+ *
156
+ * The gate detects when an issue's body asks for tests but the feature branch
157
+ * adds no new lines under test files. This module holds the pure functions only;
158
+ * orchestration lives in done-preflight.ts.
159
+ */
160
+ init_issue_id();
161
+ init_shadow_utils();
162
+ init_tracker_utils();
163
+ promisify$1(exec$1);
164
+ Data.TaggedError("TrackerFetchError");
165
+ //#endregion
166
+ //#region ../../lib/work/done-preflight.ts
167
+ init_errors();
168
+ promisify(exec);
169
+ const terminal = new Set(["completed", "cancelled"]);
170
+ function checkIncompletePlanItemsSync(workspacePath) {
171
+ const doc = readWorkspacePlanSync(workspacePath);
172
+ if (!doc) return [" The required vBRIEF checklist is missing or unreadable; return the issue to planning before completion."];
173
+ const incomplete = doc.plan.items.flatMap((item) => {
174
+ const lines = [];
175
+ if (!terminal.has(item.status)) lines.push(` - ${item.id} ${item.title} (${item.status})`);
176
+ for (const child of subItemsOf(item)) if (!terminal.has(child.status)) lines.push(` - ${item.id}.${child.id} ${child.title} (${child.status})`);
177
+ return lines;
178
+ });
179
+ return incomplete.length === 0 ? [] : [` Incomplete plan items (${incomplete.length}):`, ...incomplete];
180
+ }
181
+ async function checkIncompletePlanItemsPromise(workspacePath, _issueId) {
182
+ return checkIncompletePlanItemsSync(workspacePath);
183
+ }
184
+ //#endregion
16
185
  //#region ../../lib/cloister/verification-runner.ts
17
186
  /**
18
187
  * Verification Runner — orchestrates the full verification gate lifecycle.
@@ -23,14 +192,8 @@ import { promisify } from "util";
23
192
  *
24
193
  * Extracted from dashboard/server to be independently testable.
25
194
  */
26
- init_review_status();
27
- init_validation();
28
- init_feedback_writer();
29
- init_feedback_target();
30
- init_agents();
31
- init_projects();
32
195
  init_io();
33
- const execAsync = promisify(exec);
196
+ const execAsync = promisify$1(exec$1);
34
197
  const NO_PROGRESS_REPEAT_THRESHOLD = 2;
35
198
  function isFinalVerificationAttempt(cycleCount) {
36
199
  return cycleCount >= 3;
@@ -42,13 +205,6 @@ function shouldEscalateVerificationFailure(status, failedCheck, cycleCount) {
42
205
  if (isFinalVerificationAttempt(cycleCount)) return true;
43
206
  return cycleCount >= NO_PROGRESS_REPEAT_THRESHOLD && isRepeatFailedCheck(status, failedCheck);
44
207
  }
45
- function buildFinalFailureInstructions(issueId) {
46
- return `## NEEDS-YOU: Verification stuck
47
-
48
- This was the final allowed verification attempt. The work agent is paused so it does not keep spending cycles on the same failing gate.
49
-
50
- An operator needs to inspect ${issueId}, decide whether to fix-forward manually, restart the agent with new instructions, or move the issue through the normal pipeline. Do not re-request review automatically.`;
51
- }
52
208
  function setStateDerivedVerificationFailure(issueId, failedCheck, summary, cycleCount, currentStatus) {
53
209
  setReviewStatusSync(issueId, {
54
210
  verificationStatus: "failed",
@@ -81,10 +237,58 @@ async function escalateVerificationStuck(issueId, failedCheck, cycleCount, summa
81
237
  console.error(`[${logPrefix}] Failed to pause ${agentId} after verification stuck:`, err);
82
238
  }
83
239
  }
240
+ /**
241
+ * Boot reconciliation for interrupted verifications. Live supervised workers
242
+ * survive dashboard restarts and retain ownership of their running status.
243
+ * A running status without a live worker is orphaned, so reset it to pending
244
+ * and finalize the artifact rather than leaving the issue wedged forever.
245
+ */
246
+ function reconcileInterruptedVerifications(logPrefix = "boot-reconciliation") {
247
+ let reset = 0;
248
+ try {
249
+ const statuses = readReviewStatusMap() ?? {};
250
+ for (const [issueId, status] of Object.entries(statuses)) {
251
+ if (status.verificationStatus !== "running") continue;
252
+ if (isVerificationWorkerActive(issueId)) {
253
+ console.log(`[${logPrefix}] preserved live supervised verification for ${issueId}`);
254
+ continue;
255
+ }
256
+ setReviewStatusSync(issueId, {
257
+ verificationStatus: "pending",
258
+ verificationNotes: "The supervised verification worker stopped before recording a result; verification re-runs on the next cycle."
259
+ });
260
+ reset += 1;
261
+ try {
262
+ const resolved = resolveProjectFromIssueSync(issueId);
263
+ const workspacePath = resolved ? join$1(resolved.projectPath, "workspaces", `feature-${issueId.toLowerCase()}`) : null;
264
+ const artifact = workspacePath ? readVerificationArtifact(workspacePath) : null;
265
+ if (workspacePath && artifact?.outcome === "running") writeVerificationArtifact(workspacePath, issueId, [...artifact.gates.map((gate) => ({
266
+ name: gate.name,
267
+ passed: gate.passed,
268
+ required: gate.required,
269
+ output: gate.output ?? "",
270
+ durationMs: gate.durationMs,
271
+ ...gate.error ? { error: gate.error } : {}
272
+ })), {
273
+ name: artifact.currentGate ?? "interrupted",
274
+ passed: false,
275
+ required: true,
276
+ output: "The supervised verification worker stopped unexpectedly before this gate finished.",
277
+ durationMs: 0,
278
+ error: "supervised verification worker stopped unexpectedly"
279
+ }]);
280
+ } catch {}
281
+ console.log(`[${logPrefix}] reset stale running verification for ${issueId} (PAN-2669)`);
282
+ }
283
+ } catch (err) {
284
+ console.warn(`[${logPrefix}] interrupted-verification sweep failed: ${err instanceof Error ? err.message : String(err)}`);
285
+ }
286
+ return reset;
287
+ }
84
288
  async function deliverVerificationFeedback(issueId, message, details, logPrefix) {
85
289
  const target = await resolveIssueFeedbackTarget(issueId);
86
290
  if ("agentId" in target) {
87
- await messageAgent(target.agentId, message);
291
+ await messageAgent(target.agentId, message, "internal", { owesRework: true });
88
292
  console.log(`[${logPrefix}] Sent verification feedback for ${issueId} to ${target.agentId}`);
89
293
  return;
90
294
  }
@@ -94,20 +298,20 @@ async function deliverVerificationFeedback(issueId, message, details, logPrefix)
94
298
  });
95
299
  }
96
300
  async function resolveGitDirs(workspacePath, projectConfig) {
97
- if (!(projectConfig?.workspace?.type === "polyrepo") && existsSync(join(workspacePath, ".git"))) return {
301
+ if (!(projectConfig?.workspace?.type === "polyrepo") && existsSync(join$1(workspacePath, ".git"))) return {
98
302
  gitDirs: [workspacePath],
99
303
  isPolyrepo: false
100
304
  };
101
305
  const gitDirs = [];
102
306
  try {
103
307
  const entries = await readdir(workspacePath, { withFileTypes: true });
104
- for (const entry of entries) if (entry.isDirectory() && !entry.name.startsWith(".") && existsSync(join(workspacePath, entry.name, ".git"))) gitDirs.push(join(workspacePath, entry.name));
308
+ for (const entry of entries) if (entry.isDirectory() && !entry.name.startsWith(".") && existsSync(join$1(workspacePath, entry.name, ".git"))) gitDirs.push(join$1(workspacePath, entry.name));
105
309
  } catch {}
106
310
  if (gitDirs.length > 0) return {
107
311
  gitDirs,
108
312
  isPolyrepo: true
109
313
  };
110
- if (existsSync(join(workspacePath, ".git"))) return {
314
+ if (existsSync(join$1(workspacePath, ".git"))) return {
111
315
  gitDirs: [workspacePath],
112
316
  isPolyrepo: false
113
317
  };
@@ -117,7 +321,7 @@ async function resolveGitDirs(workspacePath, projectConfig) {
117
321
  };
118
322
  }
119
323
  async function syncSingleRepo(gitDir, targetBranch) {
120
- const repoName = basename(gitDir);
324
+ const repoName = basename$1(gitDir);
121
325
  try {
122
326
  await execAsync(`git fetch origin ${targetBranch}`, {
123
327
  cwd: gitDir,
@@ -188,8 +392,8 @@ function getSyncTargetBranch(workspacePath, projectConfig, repoName) {
188
392
  const matchingRepo = projectConfig.workspace?.repos?.find((repo) => repo.name === repoName);
189
393
  return matchingRepo?.pr_target || projectConfig.workspace?.pr_target || matchingRepo?.default_branch || projectConfig.workspace?.default_branch || "main";
190
394
  }
191
- const wsName = basename(workspacePath);
192
- const matchingRepo = projectConfig.workspace?.repos?.find((repo) => repo.name === wsName || basename(repo.path) === wsName);
395
+ const wsName = basename$1(workspacePath);
396
+ const matchingRepo = projectConfig.workspace?.repos?.find((repo) => repo.name === wsName || basename$1(repo.path) === wsName);
193
397
  return matchingRepo?.pr_target || projectConfig.workspace?.pr_target || matchingRepo?.default_branch || projectConfig.workspace?.default_branch || "main";
194
398
  }
195
399
  /**
@@ -201,7 +405,7 @@ function getSyncTargetBranch(workspacePath, projectConfig, repoName) {
201
405
  * sync-sources/, config) counts as content and is NOT flagged.
202
406
  */
203
407
  function changesetHasNoContent(changedFiles) {
204
- return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !f.startsWith(".beads/") && !f.endsWith(".vbrief.json")).length === 0;
408
+ return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !f.endsWith(".vbrief.json")).length === 0;
205
409
  }
206
410
  async function runVerificationForIssuePromise(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
207
411
  const currentStatus = getReviewStatusSync(issueId);
@@ -224,9 +428,9 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
224
428
  else {
225
429
  const syncResults = [];
226
430
  for (const gitDir of gitDirs) {
227
- const repoName = isPolyrepo ? basename(gitDir) : void 0;
431
+ const repoName = isPolyrepo ? basename$1(gitDir) : void 0;
228
432
  const targetBranch = getSyncTargetBranch(workspacePath, projectConfig, repoName);
229
- const displayName = repoName || basename(workspacePath);
433
+ const displayName = repoName || basename$1(workspacePath);
230
434
  console.log(`[${logPrefix}] Syncing ${targetBranch} into ${displayName} for ${issueId}...`);
231
435
  syncResults.push(await syncSingleRepo(gitDir, targetBranch));
232
436
  }
@@ -254,8 +458,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
254
458
  }));
255
459
  if (fileResult.success) {
256
460
  const hasConflicts = failures.some((f) => f.hasConflicts);
257
- const repoList = isPolyrepo ? failures.map((f) => f.repoName).join(", ") : basename(workspacePath);
258
- await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck}${hasConflicts ? " — merge conflicts" : ""} in ${repoList} after ${newCycleCount}/3 attempts.\n\nMUST READ: ${fileResult.filePath}\n\nYou are paused for operator intervention. Do not re-request review automatically.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck}${hasConflicts ? " — merge conflicts" : ""} in ${repoList}.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, fix the sync issues, commit and push every change, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
461
+ const repoList = isPolyrepo ? failures.map((f) => f.repoName).join(", ") : basename$1(workspacePath);
462
+ await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck}${hasConflicts ? " — merge conflicts" : ""} in ${repoList} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck}${hasConflicts ? " — merge conflicts" : ""} in ${repoList}.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, fix the sync issues, commit and push every change, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
259
463
  failedCheck,
260
464
  feedbackPath: fileResult.filePath
261
465
  }, logPrefix);
@@ -271,7 +475,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
271
475
  };
272
476
  }
273
477
  for (const result of syncResults) {
274
- const displayName = isPolyrepo ? result.repoName : basename(workspacePath);
478
+ const displayName = isPolyrepo ? result.repoName : basename$1(workspacePath);
275
479
  if (result.alreadyUpToDate) console.log(`[${logPrefix}] ${displayName}: Already up to date with ${result.targetBranch}`);
276
480
  else console.log(`[${logPrefix}] ${displayName}: Merged latest ${result.targetBranch}`);
277
481
  }
@@ -279,20 +483,20 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
279
483
  else console.log(`[${logPrefix}] Skipping target-branch sync for ${issueId}; verifying current workspace state`);
280
484
  const gates = projectConfig?.quality_gates && Object.keys(projectConfig.quality_gates).length > 0 ? projectConfig.quality_gates : DEFAULT_GATES;
281
485
  console.log(`[${logPrefix}] Project: ${projectConfig?.name || "NOT FOUND"}, gates: [${Object.keys(gates).join(", ")}], workspace: ${workspacePath}`);
282
- const featureFolder = basename(workspacePath);
486
+ const featureFolder = basename$1(workspacePath);
283
487
  const featureName = featureFolder.replace(/^feature-/, "");
284
- const projectPath = projectConfig?.path || dirname(dirname(workspacePath));
488
+ const projectPath = projectConfig?.path || dirname$1(dirname$1(workspacePath));
285
489
  const domain = projectConfig?.workspace?.dns?.domain || "localhost";
286
490
  const changedBase = `origin/${getSyncTargetBranch(workspacePath, projectConfig, void 0)}`;
287
491
  const placeholders = {
288
492
  FEATURE_NAME: featureName,
289
493
  FEATURE_FOLDER: featureFolder,
290
494
  BRANCH_NAME: `feature/${featureName}`,
291
- COMPOSE_PROJECT: `${basename(projectPath)}-${featureFolder}`,
495
+ COMPOSE_PROJECT: `${basename$1(projectPath)}-${featureFolder}`,
292
496
  DOMAIN: domain,
293
- PROJECT_NAME: basename(projectPath),
497
+ PROJECT_NAME: basename$1(projectPath),
294
498
  PROJECT_PATH: projectPath,
295
- PROJECTS_DIR: dirname(projectPath),
499
+ PROJECTS_DIR: dirname$1(projectPath),
296
500
  WORKSPACE_PATH: workspacePath,
297
501
  HOME: homedir(),
298
502
  CHANGED_BASE: changedBase
@@ -313,7 +517,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
313
517
  }
314
518
  const workspacePackages = projectConfig?.workspace_packages;
315
519
  if (workspacePackages) for (const pkg of workspacePackages) {
316
- const pkgPath = join(workspacePath, pkg.path);
520
+ const pkgPath = join$1(workspacePath, pkg.path);
317
521
  try {
318
522
  console.log(`[${logPrefix}] Building workspace package: ${pkg.path}`);
319
523
  await execAsync(pkg.build_command, {
@@ -326,20 +530,56 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
326
530
  }
327
531
  }
328
532
  } else console.log(`[${logPrefix}] Polyrepo workspace — per-repo dependencies managed by quality gates`);
329
- const failedGate = (await Effect.runPromise(runQualityGates(gates, workspacePath, "pre_push", {
533
+ const liveGateResults = [];
534
+ let liveGateName;
535
+ let liveGateTail = "";
536
+ let lastTailWriteMs = 0;
537
+ const writeLiveArtifact = () => {
538
+ try {
539
+ writeVerificationArtifact(workspacePath, issueId, liveGateResults, {
540
+ currentGate: liveGateName,
541
+ currentGateOutput: liveGateTail || void 0
542
+ });
543
+ } catch {}
544
+ };
545
+ writeLiveArtifact();
546
+ const gateResults = await Effect.runPromise(runQualityGates(gates, workspacePath, "pre_push", {
330
547
  isRemote: workspaceInfo.isRemote,
331
548
  vmName: workspaceInfo.vmName,
332
549
  placeholders,
333
- ...options.onGateLog ? { onLog: options.onGateLog } : {}
334
- }))).find((r) => !r.passed && r.required !== false);
550
+ ...options.onGateLog ? { onLog: options.onGateLog } : {},
551
+ onGateStart: (name) => {
552
+ liveGateName = name;
553
+ liveGateTail = "";
554
+ writeLiveArtifact();
555
+ },
556
+ onGateOutput: (_name, chunk) => {
557
+ liveGateTail = (liveGateTail + chunk.replace(/\u001b\[[0-9;]*[A-Za-z]/g, "")).slice(-4e3);
558
+ const now = Date.now();
559
+ if (now - lastTailWriteMs >= 1e3) {
560
+ lastTailWriteMs = now;
561
+ writeLiveArtifact();
562
+ }
563
+ },
564
+ onGateResult: (result) => {
565
+ liveGateResults.push(result);
566
+ liveGateName = void 0;
567
+ liveGateTail = "";
568
+ writeLiveArtifact();
569
+ }
570
+ }));
571
+ const failedGate = gateResults.find((r) => !r.passed && r.required !== false);
335
572
  if (failedGate?.infraUnavailable) {
573
+ try {
574
+ writeVerificationArtifact(workspacePath, issueId, gateResults);
575
+ } catch {}
336
576
  console.warn(`[${logPrefix}] Gate "${failedGate.name}" could not run for ${issueId}: ${failedGate.error} — triggering workspace stack rebuild, attempt NOT counted (${currentCycles}/3 used)`);
337
577
  setReviewStatusSync(issueId, {
338
578
  verificationStatus: "pending",
339
579
  verificationNotes: `Verification deferred: ${failedGate.error}. Workspace stack rebuild triggered; verification re-runs on the next cycle.`
340
580
  });
341
581
  try {
342
- const { rebuildWorkspaceStack } = await import("./rebuild-stack-nGD_nPZo.js");
582
+ const { rebuildWorkspaceStack } = await import("./rebuild-stack-Dsm9WjKv.js");
343
583
  Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[${logPrefix}] ${issueId} stack rebuild: ${m}`) })).then((r) => {
344
584
  if (!r.success) console.warn(`[${logPrefix}] Stack rebuild for ${issueId} failed: ${r.error}`);
345
585
  });
@@ -353,6 +593,11 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
353
593
  maxCycles: 3
354
594
  };
355
595
  }
596
+ try {
597
+ writeVerificationArtifact(workspacePath, issueId, gateResults);
598
+ } catch (artifactErr) {
599
+ console.warn(`[${logPrefix}] Could not write verification artifact for ${issueId}: ${artifactErr.message}`);
600
+ }
356
601
  if (failedGate) {
357
602
  const newCycleCount = currentCycles + 1;
358
603
  const failedCheck = failedGate.name;
@@ -378,7 +623,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
378
623
  summary: `Verification FAILED at ${failedCheck} (attempt ${newCycleCount}/3)`,
379
624
  markdownBody: feedbackBody
380
625
  }));
381
- if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalate ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts.\n\nMUST READ: ${fileResult.filePath}\n\nYou are paused for operator intervention. Do not re-request review automatically.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck}.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, fix the failing check, commit every change, and invoke /rebase-and-submit. The skill will push and request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
626
+ if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalate ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck}.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, fix the failing check, commit every change, and invoke /rebase-and-submit. The skill will push and request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
382
627
  failedCheck,
383
628
  feedbackPath: fileResult.filePath
384
629
  }, logPrefix);
@@ -412,7 +657,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
412
657
  summary: `vBRIEF plan has merge conflicts (attempt ${newCycleCount}/3)`,
413
658
  markdownBody: feedbackBody
414
659
  }));
415
- if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts.\n\nMUST READ: ${fileResult.filePath}\n\nYou are paused for operator intervention. Do not re-request review automatically.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — plan.vbrief.json has merge conflict markers.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, resolve the merge conflict markers, commit and push the fix, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
660
+ if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — plan.vbrief.json has merge conflict markers.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, resolve the merge conflict markers, commit and push the fix, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
416
661
  failedCheck,
417
662
  feedbackPath: fileResult.filePath
418
663
  }, logPrefix);
@@ -438,7 +683,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
438
683
  const summary = `Acceptance criteria check FAILED — ${acStatus.totalPending}/${acStatus.totalCount} AC incomplete:\n\n${incompleteList}`;
439
684
  setStateDerivedVerificationFailure(issueId, failedCheck, summary, newCycleCount, currentStatus);
440
685
  if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
441
- const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n## REQUIRED: Complete all acceptance criteria BEFORE resubmitting\n\n1. Review the incomplete AC above\n2. Implement the missing requirements and write tests\n3. Close every completed bead with \`pan beads close\` — the canonical writer publishes the close and AC statuses sync automatically; never hand-edit spec files\n4. Commit and push ALL changes\n5. ONLY THEN resubmit: pan review request ${issueId} -m "Completed acceptance criteria"\n\nDo NOT resubmit until all AC are completed.`;
686
+ const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n## REQUIRED: Complete all acceptance criteria BEFORE resubmitting\n\n1. Review the incomplete AC above\n2. Implement the missing requirements and write tests\n3. Close every completed task with \`pan task close\` — the canonical writer publishes the close and AC statuses sync automatically; never hand-edit spec files\n4. Commit and push ALL changes\n5. ONLY THEN resubmit: pan review request ${issueId} -m "Completed acceptance criteria"\n\nDo NOT resubmit until all AC are completed.`;
442
687
  try {
443
688
  const fileResult = await Effect.runPromise(writeFeedbackFile({
444
689
  issueId,
@@ -448,7 +693,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
448
693
  summary: `AC check FAILED — ${acStatus.totalPending}/${acStatus.totalCount} incomplete (attempt ${newCycleCount}/3)`,
449
694
  markdownBody: feedbackBody
450
695
  }));
451
- if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts.\n\nMUST READ: ${fileResult.filePath}\n\nYou are paused for operator intervention. Do not re-request review automatically.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — ${acStatus.totalPending} AC incomplete.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, complete all pending acceptance criteria, commit and push every change, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
696
+ if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — ${acStatus.totalPending} AC incomplete.\n\nMUST READ: ${fileResult.filePath}\n\nUse your Read tool to open this file, read every line, complete all pending acceptance criteria, commit and push every change, then request a new review with pan review request. Do NOT stop at the prompt — keep working until pan review request completes successfully.`, {
452
697
  failedCheck,
453
698
  feedbackPath: fileResult.filePath
454
699
  }, logPrefix);
@@ -462,6 +707,38 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
462
707
  maxCycles: 3
463
708
  };
464
709
  }
710
+ const taskBlockers = await checkIncompletePlanItemsPromise(workspacePath, issueId);
711
+ if (taskBlockers.length > 0) {
712
+ const newCycleCount = currentCycles + 1;
713
+ const failedCheck = "incomplete-plan-items";
714
+ const itemIds = taskBlockers.map((line) => line.match(/^\s+-\s+(\S+)/)?.[1]).filter((id) => Boolean(id));
715
+ const summary = `Checklist completion check FAILED — ${itemIds.length} incomplete item(s) remain:\n\n${taskBlockers.join("\n")}`;
716
+ setStateDerivedVerificationFailure(issueId, failedCheck, summary, newCycleCount, currentStatus);
717
+ if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
718
+ const feedbackBody = shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId} (attempt ${newCycleCount}/3):\n\nFailed check: ${failedCheck}\n\n${summary}\n\nComplete each listed item with \`pan task done ${issueId} <item>\` after committing and pushing its implementation, then resubmit the review request.`;
719
+ try {
720
+ const fileResult = await Effect.runPromise(writeFeedbackFile({
721
+ issueId,
722
+ workspacePath,
723
+ specialist: "verification-gate",
724
+ outcome: "failed",
725
+ summary: `Checklist completion check FAILED — ${itemIds.length} incomplete item(s) remain (attempt ${newCycleCount}/3)`,
726
+ markdownBody: feedbackBody
727
+ }));
728
+ if (fileResult.success) await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after repeated attempts.\n\nMUST READ: ${fileResult.filePath}\n\nFix every reported failure, commit and push the corrections, then run pan done ${issueId} -c "<summary>" to reset verification and return the latest commit to the normal pipeline.` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — ${itemIds.length} incomplete item(s) remain.\n\nMUST READ: ${fileResult.filePath}\n\nRead the file, complete every listed item with pan task after committing and pushing, then request a new review with pan review request.`, {
729
+ failedCheck,
730
+ feedbackPath: fileResult.filePath
731
+ }, logPrefix);
732
+ } catch (feedbackErr) {
733
+ console.error(`[${logPrefix}] Failed to write open-task verification feedback for ${issueId}:`, feedbackErr);
734
+ }
735
+ return {
736
+ outcome: "failed",
737
+ failedCheck,
738
+ cycleCount: newCycleCount,
739
+ maxCycles: 3
740
+ };
741
+ }
465
742
  try {
466
743
  const { stdout: changedOut } = await execAsync(`git diff --name-only ${changedBase}...HEAD`, {
467
744
  cwd: workspacePath,
@@ -471,7 +748,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
471
748
  if (changesetHasNoContent(changedOut.split("\n"))) {
472
749
  const newCycleCount = currentCycles + 1;
473
750
  const failedCheck = "empty-changeset";
474
- const summary = `Branch has no implementation — only pipeline artifacts (.pan/vbrief/beads) changed vs ${changedBase}. The work agent produced no code (likely a kickoff-delivery zombie — PAN-2179).`;
751
+ const summary = `Branch has no implementation — only pipeline artifacts (.pan/vBRIEF task state) changed vs ${changedBase}. The work agent produced no code (likely a kickoff-delivery zombie — PAN-2179).`;
475
752
  setReviewStatusSync(issueId, {
476
753
  reviewStatus: "pending",
477
754
  verificationStatus: "failed",
@@ -481,7 +758,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
481
758
  });
482
759
  if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
483
760
  try {
484
- await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts — branch still has no implementation.\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — your branch contains NO code (only .pan/vbrief/beads changed vs ${changedBase}).\n\nYou must actually implement the issue: read the plan (.pan/spec.vbrief.json + the issue body), write and commit the code, push, then run pan review request. Do NOT stop at the prompt — keep working until pan review request completes.`, {
761
+ await deliverVerificationFeedback(issueId, shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount) ? `VERIFICATION STUCK for ${issueId}.\nFailed check: ${failedCheck} after ${newCycleCount}/3 attempts — branch still has no implementation.\n\n${buildFinalFailureInstructions(issueId)}` : `VERIFICATION FAILED for ${issueId}.\nFailed check: ${failedCheck} — your branch contains NO code (only .pan/vBRIEF task state changed vs ${changedBase}).\n\nYou must actually implement the issue: read the plan (.pan/spec.vbrief.json + the issue body), write and commit the code, push, then run pan review request. Do NOT stop at the prompt — keep working until pan review request completes.`, {
485
762
  failedCheck,
486
763
  changedBase
487
764
  }, logPrefix);
@@ -519,7 +796,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
519
796
  const repo = findProjectByPathSync(workspacePath)?.github_repo;
520
797
  if (!repo || !repo.includes("/")) return;
521
798
  const [owner, name] = repo.split("/");
522
- const { postOverdeckTestsStatus } = await import("./github-app-Bwt9lK4A.js");
799
+ const { postOverdeckTestsStatus } = await import("./github-app-Dtn4ib6M.js");
523
800
  await postOverdeckTestsStatus(workspacePath, owner, name, "success", "Verification gate passed");
524
801
  } catch (err) {
525
802
  console.warn(`[${logPrefix}] Failed to post overdeck/tests status: ${err.message}`);
@@ -547,9 +824,12 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
547
824
  * so the Effect error channel stays empty.
548
825
  */
549
826
  function runVerificationForIssue(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
827
+ return process.env.OVERDECK_VERIFICATION_WORKER === "1" ? runVerificationForIssueInProcess(issueId, workspacePath, workspaceInfo, logPrefix, options) : Effect.promise(() => runSupervisedVerification(issueId, workspacePath, workspaceInfo, logPrefix, options));
828
+ }
829
+ function runVerificationForIssueInProcess(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
550
830
  return Effect.promise(() => runVerificationForIssuePromise(issueId, workspacePath, workspaceInfo, logPrefix, options));
551
831
  }
552
832
  //#endregion
553
- export { runVerificationForIssue as n, changesetHasNoContent as t };
833
+ export { runVerificationForIssueInProcess as i, reconcileInterruptedVerifications as n, runVerificationForIssue as r, changesetHasNoContent as t };
554
834
 
555
- //# sourceMappingURL=verification-runner-CMT5WRMS.js.map
835
+ //# sourceMappingURL=verification-runner-32y8NRfL.js.map
@@ -0,0 +1,2 @@
1
+ import { n as reconcileInterruptedVerifications, r as runVerificationForIssue } from "./verification-runner-32y8NRfL.js";
2
+ export { reconcileInterruptedVerifications, runVerificationForIssue };
@@ -107,4 +107,4 @@ function consolidateSpeakerCues(cues) {
107
107
  //#endregion
108
108
  export { vttToMarkdown };
109
109
 
110
- //# sourceMappingURL=vtt-parser-C_XPlifj.js.map
110
+ //# sourceMappingURL=vtt-parser-QnRfcjiU.js.map