@overdeck/desktop 0.45.22 → 0.45.24

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 (429) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +2 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-BH7ac_1G.js → acceptance-criteria-DDCnXF58.js} +5 -5
  4. package/server/{advancing-selfheal-cSvXNZLZ.js → advancing-selfheal-BVwW4qRn.js} +6 -6
  5. package/server/{agent-gc-Dj2gncak.js → agent-gc-CHcnvonI.js} +4 -4
  6. package/server/agent-state-Bc3tzUC8.js +3 -0
  7. package/server/{agent-state-service-DistflNn.js → agent-state-service-BsgWxZuB.js} +5 -5
  8. package/server/{agent-state-service-CsQ07Pxe.js → agent-state-service-D5UGKIJL.js} +1 -1
  9. package/server/{agents-DXdHmRTC.js → agents-EbI0zCJl.js} +4 -4
  10. package/server/agents-wi9NWzs2.js +3 -0
  11. package/server/{archive-planning-Cp_DC1j-.js → archive-planning-BZDgzoEj.js} +1 -1
  12. package/server/{archive-planning-BvDuWNMo.js → archive-planning-Du25Jtst.js} +30 -6
  13. package/server/{artifact-index-jobs-CDBFL4OU.js → artifact-index-jobs-CbEDfCDu.js} +2 -2
  14. package/server/assemble-J2ZZ2C15.js +339 -0
  15. package/server/{backlog-auto-trigger-DmA1IbYf.js → backlog-auto-trigger-2R2jog7n.js} +3 -3
  16. package/server/{behavior-CGj16clS.js → behavior-B3exJ42O.js} +2 -2
  17. package/server/{briefing-freshness-C12WgkaB.js → briefing-freshness-D1wzUIWv.js} +2 -2
  18. package/server/{build-info-BRpqQvNd.js → build-info-CZk_TITh.js} +1 -1
  19. package/server/{build-info-NU3KbXYw.js → build-info-Ie_D0_BT.js} +3 -3
  20. package/server/{checkpoint-manager-CTPjAmtH.js → checkpoint-manager-BI1Wxoku.js} +2 -2
  21. package/server/{checkpoint-manager-rOgT98WY.js → checkpoint-manager-DwbQoqrC.js} +1 -1
  22. package/server/checkpoint-worker.js +1 -1
  23. package/server/{checkpoints-B5jFNi2G.js → checkpoints-BJIs5QIA.js} +1 -1
  24. package/server/{checkpoints-BJum14fs.js → checkpoints-CQB1h765.js} +2 -2
  25. package/server/{claude-hooks-provision-BhwWK-TQ.js → claude-hooks-provision-8Ngo8TpT.js} +1 -1
  26. package/server/{claude-hooks-provision-D7p5WcKZ.js → claude-hooks-provision-D8GXF3_s.js} +2 -2
  27. package/server/{claude-permissions-nSFKH78M.js → claude-permissions-DNWEVV6z.js} +2 -2
  28. package/server/{claude-settings-overlay-BI_UIke0.js → claude-settings-overlay-CEdaqpWI.js} +2 -2
  29. package/server/{claude-settings-overlay-DHBwjS1X.js → claude-settings-overlay-DWy-Bb4Y.js} +1 -1
  30. package/server/cli-B86rejVV.js +3 -0
  31. package/server/{cli-CbKNkFE5.js → cli-RoOx5DUf.js} +9 -9
  32. package/server/{cliproxy-Brf_5MuG.js → cliproxy-C8a1vtTU.js} +2 -2
  33. package/server/{cliproxy-bONZDBbC.js → cliproxy-fHfIeiGd.js} +1 -1
  34. package/server/{close-issue-CxReRxIc.js → close-issue-DoOifFIK.js} +5 -5
  35. package/server/{closed-issue-reaper-CQ3kqha7.js → closed-issue-reaper-Bk3SU4RC.js} +9 -9
  36. package/server/{closed-issue-reaper-DXP2Xyv3.js → closed-issue-reaper-CktPXo8m.js} +1 -1
  37. package/server/{codex-CbmztVcc.js → codex-BZXGhUVB.js} +27 -8
  38. package/server/codex-GcHuUF-k.js +3 -0
  39. package/server/{codex-parser-jl8AeAmB.js → codex-parser-CFZ1_1Jl.js} +2 -2
  40. package/server/{config-q4Gvd8dq.js → config-BZ0sHTju.js} +2 -2
  41. package/server/{config-DeTsoZdR.js → config-CKxYiCmX.js} +2 -2
  42. package/server/{config-BJKocXKd.js → config-DzV30TOm.js} +1 -1
  43. package/server/{config-yaml-ig8Nwtiw.js → config-yaml-DySPNmKN.js} +77 -194
  44. package/server/{conflict-gate-CFqPVxEg.js → conflict-gate-BaCVrH-N.js} +3 -3
  45. package/server/{conflict-gate-CHU9K1vU.js → conflict-gate-BhAY7TUd.js} +1 -1
  46. package/server/context-layers-BrPmE__h.js +4 -0
  47. package/server/context-layers-igZ4FI4_.js +37 -0
  48. package/server/{control-settings-D_odMIaC.js → control-settings-BQp7_4uD.js} +4 -4
  49. package/server/{conversation-compaction-B6YSRLda.js → conversation-compaction-CgrR8YYp.js} +8 -8
  50. package/server/{conversation-compaction-CN4-5YYt.js → conversation-compaction-eQB5CkOe.js} +1 -1
  51. package/server/{conversation-service-Dq33SYEj.js → conversation-service-BLd3MYsG.js} +1 -1
  52. package/server/{conversation-service-C3avRVEr.js → conversation-service-DPJ71F33.js} +329 -19
  53. package/server/{conversations-bYpM9-kZ.js → conversations-6AfUfbwc.js} +5 -5
  54. package/server/{conversations-H9if0bCQ.js → conversations-CAsJF9kh.js} +1 -1
  55. package/server/{cost-Codk1pc2.js → cost-B2ddP6wq.js} +18 -2
  56. package/server/{cost-wH46-WsJ.js → cost-R-m6Yi-W.js} +3 -3
  57. package/server/{cost-sync-D_cre6WM.js → cost-sync-BsN6ER0n.js} +3 -3
  58. package/server/{dag-CJpgf9A3.js → dag-B1ucnjDU.js} +9 -9
  59. package/server/{dangerous-git-ops-D6AF-Hg_.js → dangerous-git-ops-BXqeWVSf.js} +1 -1
  60. package/server/dashboard-db-worker.js +7 -7
  61. package/server/{deacon-CkT_kznS.js → deacon-CU_cAYSR.js} +406 -607
  62. package/server/{deacon-B8HbQdqU.js → deacon-kiQrb4ZT.js} +3 -3
  63. package/server/{deacon-nudge-log-D6K9K-rE.js → deacon-nudge-log-6wVqAaqz.js} +3 -3
  64. package/server/{deacon-swarm-BryRr6AO.js → deacon-swarm-BXZZ1Z2-.js} +17 -17
  65. package/server/deacon-swarm-C-GwfjJy.js +2 -0
  66. package/server/deacon.js +8 -8
  67. package/server/{deploy-patrol-1IrZxicY.js → deploy-patrol-AiFoP8dw.js} +136 -19
  68. package/server/{deploy-window-wDf4UgHt.js → deploy-window-C3F-tihF.js} +77 -10
  69. package/server/{deploy-window-7ZYHh7Zp.js → deploy-window-DkZraDyj.js} +1 -1
  70. package/server/{dev-supervisor-C7p9kEpc.js → dev-supervisor-bcOWqdQE.js} +2 -2
  71. package/server/{devcontainer-renderer-CNmQy0pL.js → devcontainer-renderer-_d6XhyND.js} +3 -3
  72. package/server/dist-Bzy0y69j.js +3 -0
  73. package/server/{dist-D-Ed5yVw.js → dist-Cb_0uvpS.js} +1 -1
  74. package/server/{docker-BCZ89M9X.js → docker-DcMTFTUC.js} +2 -2
  75. package/server/{dod-DbJLYcHv.js → dod-C6n9RV3G.js} +1 -1
  76. package/server/{ensure-devcontainer-Cs6W9Yzj.js → ensure-devcontainer-BZgOhRo7.js} +1 -1
  77. package/server/{ensure-devcontainer-V5JWaAva.js → ensure-devcontainer-DNi-ono3.js} +4 -4
  78. package/server/{esm-shims-dTeNdq7X.js → esm-shims-OSHAYaS1.js} +1 -1
  79. package/server/{event-store-TnWdydfB.js → event-store-CQL6NeqB.js} +3 -3
  80. package/server/{event-store-CpBGsO6_.js → event-store-EV2cMiXj.js} +1 -1
  81. package/server/{events-Dsuv6qyB.js → events-BTdrdEq8.js} +1 -1
  82. package/server/{events-DSUdR-04.js → events-DTfAe4My.js} +3 -3
  83. package/server/{factory-BMrK4TrE.js → factory-CFibJuaw.js} +50 -13
  84. package/server/{feature-registry-population-B-CI9hgE.js → feature-registry-population-DKZFMbFt.js} +4 -4
  85. package/server/{feature-registry-storage-B972ph_A.js → feature-registry-storage-BdPuLcBX.js} +2 -2
  86. package/server/{features-Bc-Bmiye.js → features-ez2271oH.js} +2 -2
  87. package/server/{feedback-target-DZ-iAnAa.js → feedback-target-7mqqwrX6.js} +7 -7
  88. package/server/{feedback-target-DS6NUuSs.js → feedback-target-CoFDHiM8.js} +1 -1
  89. package/server/{feedback-writer-BXP6g75N.js → feedback-writer-CY5L1lB7.js} +6 -5
  90. package/server/{feedback-writer-Bx5z11mF.js → feedback-writer-D3a22RCd.js} +1 -1
  91. package/server/flywheel-DHrgCphM.js +1084 -0
  92. package/server/flywheel-DzGtWnJ1.js +477 -0
  93. package/server/flywheel-SVF02Jpq.js +2 -0
  94. package/server/{flywheel-merge-order-CTgHeg-W.js → flywheel-merge-order-UU0tiUld.js} +10 -9
  95. package/server/{flywheel-merge-order-CNKAY489.js → flywheel-merge-order-UUcsCDb6.js} +1 -1
  96. package/server/{forge-B1S_KZv4.js → forge-CNFnyqps.js} +2 -2
  97. package/server/forge-DXnS_YFH.js +2 -0
  98. package/server/{from-DpwQ-sc3.js → from-kNxT0bZC.js} +1 -1
  99. package/server/{fts-db-DmAcuCkV.js → fts-db-CE46vDkZ.js} +2 -2
  100. package/server/{fts-operations-7d_RkmWp.js → fts-operations-CqY6zl-i.js} +2 -2
  101. package/server/{git-utils-Cc3FHDKd.js → git-utils-CRw2zLPC.js} +68 -3
  102. package/server/git-utils-D0_yhCgF.js +3 -0
  103. package/server/{github-app-CDPtGF7J.js → github-app-C3QrAUd0.js} +27 -8
  104. package/server/{github-app-CU14oYzP.js → github-app-ClZ2lk8D.js} +1 -1
  105. package/server/{github-client-XjTJbBm7.js → github-client-BnIsSrEN.js} +2 -2
  106. package/server/{github-client-CwBZZ3t7.js → github-client-DfQYVUaw.js} +1 -1
  107. package/server/{github-pr-lookup-CFGeVhqv.js → github-pr-lookup-D16NGsSO.js} +2 -2
  108. package/server/{harness-binary-B2CTcD84.js → harness-binary-DPUi-Pv8.js} +32 -6
  109. package/server/{harness-resolve-D5FVQTmy.js → harness-resolve-3lNZkyT4.js} +18 -9
  110. package/server/{health-events-DREeevle.js → health-events-BBcTYQKU.js} +2 -2
  111. package/server/{health-events-C1whmd58.js → health-events-BDOHby5Q.js} +1 -1
  112. package/server/{hooks-yxRsjk-z.js → hooks-CKZgXlJb.js} +2 -2
  113. package/server/{hooks-B-HItBiS.js → hooks-DPVX1rwQ.js} +1 -1
  114. package/server/{hume-Dz_OymXE.js → hume-Cz8igP9E.js} +2 -2
  115. package/server/hume-ccTf4wTX.js +3 -0
  116. package/server/{idle-stack-reaper-DrCv0OAG.js → idle-stack-reaper-CuLF0j2H.js} +1 -1
  117. package/server/{idle-stack-reaper-Yf34xXxY.js → idle-stack-reaper-DDIRwxUY.js} +2 -2
  118. package/server/{in-flight-guard-BoWm66Kh.js → in-flight-guard-CAAkqPLu.js} +2 -2
  119. package/server/{infra-D4iNWMA5.js → infra-BEqFxlJc.js} +14 -4
  120. package/server/{injection-D7T75Pye.js → injection-C8aiVJrF.js} +191 -183
  121. package/server/{injection-BVNa4MQW.js → injection-CPUIqNhI.js} +1 -1
  122. package/server/{inspect-agent-BXCgNeZ4.js → inspect-agent-BLuJ1AkT.js} +137 -81
  123. package/server/inspect-agent-Brtz0URj.js +2 -0
  124. package/server/{internal-token-C9DdEOKY.js → internal-token-BrcU6qfe.js} +1 -1
  125. package/server/{internal-token-CXsfxslp.js → internal-token-s0-oKybJ.js} +2 -2
  126. package/server/{io-DQR9PMgS.js → io-C9kF1wtJ.js} +160 -184
  127. package/server/{issue-closed-DtmJM0D0.js → issue-closed-CDJk4pIp.js} +7 -7
  128. package/server/{issue-lifecycle-8PSS9Anq.js → issue-lifecycle-B8sZHVHh.js} +1 -1
  129. package/server/{issue-lifecycle-CeyW_HoD.js → issue-lifecycle-ojZAzDBP.js} +22 -22
  130. package/server/{issue-service-singleton-DBZabEl7.js → issue-service-singleton-BvJ09SaR.js} +1 -1
  131. package/server/{issue-service-singleton-D_RVYBuL.js → issue-service-singleton-Yx5DdmVJ.js} +8 -8
  132. package/server/{issues-pDW9VUNz.js → issues-BMmP_77e.js} +2 -2
  133. package/server/{jsonl-parser-C3HVNR5d.js → jsonl-parser-BXSlHwEh.js} +3 -3
  134. package/server/{label-cleanup-DPwiZlWo.js → label-cleanup-B0UJwnv5.js} +3 -3
  135. package/server/{label-reconciler-Df1ZduPH.js → label-reconciler-B4iOAjlC.js} +4 -4
  136. package/server/{launcher-generator-COgR2By1.js → launcher-generator-BBWG_SiS.js} +105 -10
  137. package/server/{lifecycle-io-taIb0PoH.js → lifecycle-io-BREGpnLk.js} +37 -37
  138. package/server/lifecycle-io-DPo7x11I.js +3 -0
  139. package/server/{lifecycle-CtPDcZ9u.js → lifecycle-xmBfK2GJ.js} +6 -6
  140. package/server/lifecycle-yPd___5E.js +121 -0
  141. package/server/{linear-client-DsFkIxee.js → linear-client-BsuUvkdA.js} +2 -2
  142. package/server/{linear-client-YwZMDIwQ.js → linear-client-CTskEeT_.js} +1 -1
  143. package/server/memory-fts-worker.js +1 -1
  144. package/server/{merge-BwsyNRJV.js → merge-B1DiziGU.js} +1 -1
  145. package/server/{merge-C1t-bspg.js → merge-CefQNAnq.js} +3 -3
  146. package/server/{merge-agent-DDiIjzk-.js → merge-agent-4WOWlSYA.js} +28 -28
  147. package/server/{merge-agent-B-SnXOoc.js → merge-agent-CKkgIBPB.js} +1 -1
  148. package/server/{merge-batch-Byt-QnEl.js → merge-batch-ClFn2T-y.js} +1 -1
  149. package/server/merge-ops-CR44oU9-.js +2 -0
  150. package/server/{merge-rebase-Cm6fXaZN.js → merge-rebase-BfaTyXsw.js} +2 -2
  151. package/server/merge-set-DJ8-UErs.js +83 -0
  152. package/server/{merge-set-6LEglm6o.js → merge-set-bUqbm3yc.js} +1 -1
  153. package/server/{merge-sync-B95_4in_.js → merge-sync-BJYeOODr.js} +1 -1
  154. package/server/{merge-sync-Do8_q32h.js → merge-sync-VPV28g0g.js} +2 -2
  155. package/server/{merge-train-CKana8EH.js → merge-train-CHopycP0.js} +3 -3
  156. package/server/{merge-train-deps-BgmqwIfA.js → merge-train-deps-D1cOZzy2.js} +4 -4
  157. package/server/{merge-verification-CqnUzGEK.js → merge-verification-BkaOqPsw.js} +4 -4
  158. package/server/{multipart-parser-tdOQDJ3o.js → multipart-parser-duPAfSBw.js} +2 -2
  159. package/server/{no-resume-mode-BWOSZjWd.js → no-resume-mode-Nw29vaFb.js} +11 -8
  160. package/server/node_modules/.package-lock.json +8 -8
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  162. package/server/node_modules/undici/README.md +5 -0
  163. package/server/node_modules/undici/docs/docs/api/Client.md +4 -0
  164. package/server/node_modules/undici/docs/docs/api/Dispatcher.md +6 -0
  165. package/server/node_modules/undici/docs/docs/api/Interceptors.md +59 -0
  166. package/server/node_modules/undici/docs/docs/api/MockAgent.md +27 -0
  167. package/server/node_modules/undici/docs/docs/api/MockPool.md +28 -1
  168. package/server/node_modules/undici/docs/docs/index.md +5 -0
  169. package/server/node_modules/undici/lib/core/request.js +1 -1
  170. package/server/node_modules/undici/lib/core/util.js +6 -1
  171. package/server/node_modules/undici/lib/dispatcher/agent.js +3 -3
  172. package/server/node_modules/undici/lib/dispatcher/client-h1.js +31 -6
  173. package/server/node_modules/undici/lib/dispatcher/client-h2.js +34 -43
  174. package/server/node_modules/undici/lib/handler/cache-handler.js +93 -5
  175. package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +10 -0
  176. package/server/node_modules/undici/lib/handler/redirect-handler.js +5 -2
  177. package/server/node_modules/undici/lib/handler/retry-handler.js +6 -4
  178. package/server/node_modules/undici/lib/interceptor/cache.js +21 -4
  179. package/server/node_modules/undici/lib/interceptor/decompress.js +4 -0
  180. package/server/node_modules/undici/lib/mock/mock-interceptor.js +25 -7
  181. package/server/node_modules/undici/lib/mock/mock-utils.js +39 -10
  182. package/server/node_modules/undici/lib/util/cache.js +49 -7
  183. package/server/node_modules/undici/lib/web/fetch/body.js +2 -1
  184. package/server/node_modules/undici/lib/web/fetch/response.js +1 -3
  185. package/server/node_modules/undici/package.json +2 -2
  186. package/server/node_modules/undici/types/client.d.ts +2 -2
  187. package/server/node_modules/undici/types/dispatcher.d.ts +3 -3
  188. package/server/node_modules/undici/types/mock-interceptor.d.ts +5 -1
  189. package/server/{orphan-proposed-reconciler-xklgvNA7.js → orphan-proposed-reconciler-BvKkWMJQ.js} +15 -13
  190. package/server/{orphan-proposed-reconciler-DSvsJ5M7.js → orphan-proposed-reconciler-CTSGcK8p.js} +1 -1
  191. package/server/package-lock.json +9 -9
  192. package/server/package.json +1 -1
  193. package/server/{pan-dir-DOcf6ug3.js → pan-dir-B0c3w0Ya.js} +78 -58
  194. package/server/{paths-DooHpt9p.js → paths-D-xWGHdh.js} +2 -2
  195. package/server/{pickup-CaskQ7j6.js → pickup-DUCLWrJY.js} +17 -16
  196. package/server/{pipeline-membership-1LGRjo-k.js → pipeline-membership-mY3GprlK.js} +186 -67
  197. package/server/{pipeline-notifier-CZsrU_nj.js → pipeline-notifier-BJr8gQX6.js} +1 -1
  198. package/server/{pipeline-notifier-B6FVsYF9.js → pipeline-notifier-BXkJzDC4.js} +2 -2
  199. package/server/{project-pipelines-CtNG_rvs.js → project-pipelines-C0MWUeCU.js} +2 -2
  200. package/server/project-repos-B6GycDh9.js +94 -0
  201. package/server/project-repos-DXKQsc_m.js +3 -0
  202. package/server/projects-vjjcmiN8.js +3 -0
  203. package/server/{prompts-EvhMeeHG.js → prompts-DxzFXuLl.js} +2 -2
  204. package/server/{providers-BDDPULlp.js → providers-qQAwGQDW.js} +7 -7
  205. package/server/{providers-DNSQqy2V.js → providers-u4Ga0jOr.js} +1 -1
  206. package/server/public/assets/{chunk-BO2N2NFS-sym_ufXe.js → chunk-BO2N2NFS-BamJdinX.js} +4 -4
  207. package/server/public/assets/{diagram-OG6HWLK6-CQJPBNBu.js → diagram-OG6HWLK6-DfOB8-w4.js} +1 -1
  208. package/server/public/assets/{dist-DukGS2YZ.js → dist-ByIuzMQW.js} +3 -3
  209. package/server/public/assets/{dist-Bio7THQU.js → dist-D7zYSEA6.js} +1 -1
  210. package/server/public/assets/{ganttDiagram-6RSMTGT7-D4lWwte3.js → ganttDiagram-6RSMTGT7-EdmRyXL3.js} +1 -1
  211. package/server/public/assets/{highlighted-body-OFNGDK62-CaLboCt5.js → highlighted-body-OFNGDK62-MerOfTX8.js} +1 -1
  212. package/server/public/assets/{index-Bwejq-5s.js → index-CWeMerGO.js} +147 -144
  213. package/server/public/assets/index-CenuJ3Cw.css +1 -0
  214. package/server/public/assets/{linear-qUWmMZ-c.js → linear-BBbArIcK.js} +1 -1
  215. package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +1 -0
  216. package/server/public/assets/{pieDiagram-4H26LBE5-C4zYulEm.js → pieDiagram-4H26LBE5-BKIddiJN.js} +1 -1
  217. package/server/public/assets/{prod-C8VtLuWC.js → prod-B8vYiu52.js} +4 -4
  218. package/server/public/assets/{quadrantDiagram-W4KKPZXB-qP04zyZC.js → quadrantDiagram-W4KKPZXB-D6RtoULk.js} +1 -1
  219. package/server/public/assets/{sankeyDiagram-5OEKKPKP-eMPTX_cG.js → sankeyDiagram-5OEKKPKP-CLrCedZX.js} +1 -1
  220. package/server/public/assets/{xychartDiagram-2RQKCTM6-Dme1PIt6.js → xychartDiagram-2RQKCTM6-hznR8DYl.js} +1 -1
  221. package/server/public/index.html +2 -2
  222. package/server/{pull-requests-By_BteaL.js → pull-requests-7N8WKseP.js} +1 -1
  223. package/server/{pull-requests-8z2N1UOV.js → pull-requests-_lHueOHW.js} +13 -11
  224. package/server/{queries-ZABd5aXP.js → queries-CjNIf-Ub.js} +1200 -201
  225. package/server/{rally-i_goYmiA.js → rally-CyWT_lNO.js} +3 -3
  226. package/server/{rally-api-DqKqIMNR.js → rally-api-C8e_1JRi.js} +2 -2
  227. package/server/{rally-api-xHazRk0d.js → rally-api-ClOSd-Tt.js} +1 -1
  228. package/server/{rally-client-COYz1vYR.js → rally-client-lc-nokqr.js} +4 -4
  229. package/server/{rally-client-CGWEHaPd.js → rally-client-sgtVqzNU.js} +1 -1
  230. package/server/rally-zhhtXuDP.js +3 -0
  231. package/server/{reap-terminal-sessions-CaMkFOIH.js → reap-terminal-sessions-7KeHv1R1.js} +1 -1
  232. package/server/{reap-terminal-sessions-DG9eiMVz.js → reap-terminal-sessions-BtHPo6Xc.js} +1 -1
  233. package/server/rebuild-stack-CFvcBHsS.js +4 -0
  234. package/server/{rebuild-stack-JUm0jqYP.js → rebuild-stack-lwtsW0GO.js} +26 -35
  235. package/server/{reconstruct-cache-wU79aCee.js → reconstruct-cache-C3Ui7ojV.js} +6 -6
  236. package/server/record-CN0pj4_5.js +3 -0
  237. package/server/{record-update-D3N6WMFR.js → record-update-bLJxAXH4.js} +1 -1
  238. package/server/record-update-dE1Aw83j.js +310 -0
  239. package/server/{recovery-trip-DkzJSej9.js → recovery-trip-BvRWfUXM.js} +2 -2
  240. package/server/{release-engine-DMINVN8S.js → release-engine-Cx48W7z8.js} +5 -5
  241. package/server/{release-set-DeUSOEHy.js → release-set-CQfuN9-v.js} +3 -3
  242. package/server/{remote-b-c5bOce.js → remote-C_2hasl7.js} +3 -3
  243. package/server/{remote-Dr5kGYSZ.js → remote-ChgimyYa.js} +3 -3
  244. package/server/{remote-agents-Ct_WOyke.js → remote-agents-By1ige5O.js} +6 -6
  245. package/server/{remote-agents-D6O_zETW.js → remote-agents-CA3Ihlxj.js} +1 -1
  246. package/server/{remote-completion-Dca3hAaa.js → remote-completion-fVe9e_3u.js} +12 -12
  247. package/server/resume-BFv1PGpA.js +3 -0
  248. package/server/{review-agent-CThvgK2r.js → review-agent-CIGOQYBD.js} +29 -25
  249. package/server/{review-agent-CCum8sGe.js → review-agent-DNboMyW4.js} +1 -1
  250. package/server/{review-artifacts-CXywD0F2.js → review-artifacts-nRDPuMxd.js} +5 -5
  251. package/server/{review-context-OYfKUprb.js → review-context-2uj-YQ8J.js} +70 -26
  252. package/server/review-status-btEYlaxA.js +3 -0
  253. package/server/{review-status-enrichment-crNAtIpL.js → review-status-enrichment-Dci-ZwEt.js} +3 -3
  254. package/server/{review-status-DFRjDFef.js → review-status-kZj_KyCk.js} +77 -28
  255. package/server/{review-status-sync-DpAMD_WO.js → review-status-sync-BTOpxtTC.js} +10 -5
  256. package/server/{review-status-sync-D60PJWNL.js → review-status-sync-DSDK3OMy.js} +1 -1
  257. package/server/{review-verdict-feedback-CpUZl5aE.js → review-verdict-feedback-CCjVA7Uk.js} +6 -6
  258. package/server/{review-verdict-feedback-JImjut0z.js → review-verdict-feedback-CTd4QMBu.js} +1 -1
  259. package/server/{rollup-CZ02qgxk.js → rollup-BKQC7jp4.js} +1 -1
  260. package/server/{rollup-SyuF09e4.js → rollup-FGsKki9R.js} +8 -8
  261. package/server/{scanner-Br0Z5S6R.js → scanner-CnqEZeDy.js} +45 -14
  262. package/server/{sequence-io-fxU0DlwW.js → sequence-io-D909zgeH.js} +4 -4
  263. package/server/{sequencer-agent-B5YC5XVP.js → sequencer-agent-CzkcK6P5.js} +5 -5
  264. package/server/server.js +2961 -919
  265. package/server/{service-Bagb90KZ.js → service-CLeAoU6G.js} +55 -54
  266. package/server/{session-fork-BqQxd-V6.js → session-fork-CHI1XvL9.js} +2 -2
  267. package/server/{session-history-XdS0JKp3.js → session-history-BT3IvqhC.js} +4 -4
  268. package/server/settings-66A6uvIA.js +2 -0
  269. package/server/{settings-BNbocWOg.js → settings-BTMvpNFU.js} +3 -3
  270. package/server/{settings-uLc6DEYI.js → settings-C0zgxOGf.js} +2 -2
  271. package/server/{shadow-engineering-D4X_s3fA.js → shadow-engineering-BJfgm-hX.js} +2 -2
  272. package/server/{shadow-state-C_NkP-sa.js → shadow-state-7a-524T8.js} +2 -2
  273. package/server/{shadow-state-CbvsN3qG.js → shadow-state-DnDyjujH.js} +1 -1
  274. package/server/{shadow-utils-CYMRPeRT.js → shadow-utils-Db3oroFG.js} +2 -2
  275. package/server/{ship-log-__QtAFXG.js → ship-log-D9MlVzYU.js} +1 -1
  276. package/server/{smart-compaction-jdMkG1vo.js → smart-compaction-CV2ukKND.js} +1 -1
  277. package/server/{smart-compaction-CLZOWin1.js → smart-compaction-KCYScAU1.js} +7 -7
  278. package/server/{spawn-planning-session-D5OXo8pT.js → spawn-planning-session-DKpdFyOC.js} +35 -27
  279. package/server/{spawn-planning-session-8D6mE033.js → spawn-planning-session-qUC2VWu3.js} +1 -1
  280. package/server/{specialist-completion-CqmduO92.js → specialist-completion-Ky9wCDpb.js} +1 -1
  281. package/server/{specialist-context-CJ-QjFR-.js → specialist-context-Bn3dCGS2.js} +5 -5
  282. package/server/{specialist-handoff-logger-Dnjlwt7g.js → specialist-handoff-logger-CMEwYxa2.js} +2 -2
  283. package/server/{specialist-logs-CQnKzuZs.js → specialist-logs-C5p8G7tx.js} +3 -3
  284. package/server/{specialists-Bg9v4z3F.js → specialists-CC4r-c2s.js} +1015 -460
  285. package/server/{specialists-D0gGXMZx.js → specialists-CShuVGWT.js} +1 -1
  286. package/server/specialists-DM6bWjsi.js +3 -0
  287. package/server/{specialists-CwZHb5cb.js → specialists-jiuuyVkp.js} +66 -74
  288. package/server/specs-C8Wsn2XO.js +3 -0
  289. package/server/{src-BMMoA_ba.js → src-CXmtj0im.js} +6 -6
  290. package/server/{src-Bqdtd6po.js → src-CdmnTM2m.js} +5 -5
  291. package/server/{src-k039WVYY.js → src-DtcUOZCq.js} +112 -18
  292. package/server/stack-health-Bn3o8FBX.js +3 -0
  293. package/server/{stack-health-C-ifC7b0.js → stack-health-DxSdG9cW.js} +63 -9
  294. package/server/{stale-task-claims-L7pJkQFL.js → stale-task-claims-KJKxxiiQ.js} +4 -4
  295. package/server/{staleness-_Tr-GwdA.js → staleness-CT34nwr9.js} +1 -1
  296. package/server/{staleness-BID1BKdr.js → staleness-DPm7ClwA.js} +15 -3
  297. package/server/{state-home-CONQvZR0.js → state-home-Cn_Qu8IX.js} +96 -44
  298. package/server/{state-migrate-BeBW0KXA.js → state-migrate-BGg2ZaOt.js} +12 -3
  299. package/server/{stuck-remediation-CKnIryGT.js → stuck-remediation-DYuPRYYw.js} +307 -26
  300. package/server/{stuck-remediation-CsGD5Ksb.js → stuck-remediation-s9_2qfi6.js} +1 -1
  301. package/server/{substrate-bug-weights-service-CpIZILj9.js → substrate-bug-weights-service-B-FwCs5V.js} +3 -3
  302. package/server/{summary-fork-bX6ax6X7.js → summary-fork-D1RAk9rJ.js} +78 -12
  303. package/server/{summary-fork-agEMsPSo.js → summary-fork-DpcxN9tf.js} +2 -2
  304. package/server/supervisor/{injection-budget-C1iPirFS.js → injection-budget-Csw5tqfJ.js} +2 -41
  305. package/server/supervisor/pty-supervisor.js +2 -1
  306. package/server/supervisor/pty-token-x-ea28Us.js +43 -0
  307. package/server/supervisor-FTJAIsAK.js +2 -0
  308. package/server/{supervisor-Ctt4eRYz.js → supervisor-wM4ooB5O.js} +3 -3
  309. package/server/{swarm-readiness-DdmJVX7y.js → swarm-readiness-DlP_UjHq.js} +4 -4
  310. package/server/{system-prerequisites-DSXBvffY.js → system-prerequisites-DUDj1YHf.js} +56 -29
  311. package/server/{teardown-workspace-DDCf5n-a.js → teardown-workspace-DeTTImn-.js} +15 -15
  312. package/server/{test-agent-queue-BJZ9Nfcc.js → test-agent-queue-MbxX5vqq.js} +7 -7
  313. package/server/{test-verdict-Cp5tljlJ.js → test-verdict-bWYBtqBg.js} +1 -1
  314. package/server/{test-verdict-D_-sXIz_.js → test-verdict-gscuksPv.js} +1 -1
  315. package/server/{tldr-daemon-B8_oT5gx.js → tldr-daemon-BYFkts95.js} +1 -1
  316. package/server/{tldr-daemon-BQFmmFp0.js → tldr-daemon-C-69c3OI.js} +2 -2
  317. package/server/tmux-B6z7h_vZ.js +3 -0
  318. package/server/{tmux-L5LgvGLp.js → tmux-R7N7y-Mh.js} +76 -44
  319. package/server/{token-BkQLy4yS.js → token-BK6t8BIT.js} +2 -2
  320. package/server/token-util-DuPuNriz.js +3 -0
  321. package/server/{token-util-DI8sGlmF.js → token-util-DxXu-vd1.js} +1 -1
  322. package/server/{tracker-config-DdT-nUAM.js → tracker-config-G6latr8C.js} +2 -2
  323. package/server/{tracker-utils-DV3h1FYG.js → tracker-utils-B4ylXZQK.js} +1 -1
  324. package/server/{tracker-utils-CawsPSS2.js → tracker-utils-DHv5pSDT.js} +2 -2
  325. package/server/{traefik-connect-C6mJckNs.js → traefik-connect-Df2uXPsQ.js} +1 -1
  326. package/server/{tunnel-IdK1iTHx.js → tunnel-CDVKJpRv.js} +3 -3
  327. package/server/{tunnel-BIFl98rc.js → tunnel-DGdUkGoZ.js} +1 -1
  328. package/server/{types-7-GnJn0t.js → types-5M0lupud.js} +1 -1
  329. package/server/{uat-train-0Ujk8GCv.js → uat-train-B05BWkp-.js} +1 -1
  330. package/server/{uat-train-j0cPeMSj.js → uat-train-DDSrSoV1.js} +28 -28
  331. package/server/validate-IfDGkaVR.js +177 -0
  332. package/server/{validation-DcAgXTQp.js → validation-CC9OPqJZ.js} +1 -1
  333. package/server/{validation-CabEISJT.js → validation-Dw1pzDzr.js} +259 -9
  334. package/server/{verification-artifact-Ck1tefmz.js → verification-artifact-B3itKTxu.js} +1 -1
  335. package/server/{verification-artifact-BuTA1QbL.js → verification-artifact-TVFSz_q1.js} +1 -1
  336. package/server/{verification-runner-DlJezzef.js → verification-runner-BW4HOKAz.js} +1 -1
  337. package/server/{verification-runner-FiuAZ-H2.js → verification-runner-CkgX6EtI.js} +174 -124
  338. package/server/{vtt-parser-BnRsYzcz.js → vtt-parser-DYPbKcIJ.js} +1 -1
  339. package/server/{work-agent-prompt-DLthEPAq.js → work-agent-prompt-Du8Vh2aJ.js} +13 -13
  340. package/server/workflows-BQu4RFQ-.js +2 -0
  341. package/server/{workflows-BZNNYkGC.js → workflows-mbQzh6mQ.js} +39 -77
  342. package/server/{workspace-3IC-UkAi.js → workspace--8tnhDI0.js} +1 -1
  343. package/server/{workspace-D9ppycdg.js → workspace-BPUws1-_.js} +3 -3
  344. package/server/{workspace-config-Bigl_-Lk.js → workspace-config-CIVWZOQr.js} +1 -1
  345. package/server/{workspace-manager-ClkCIWTe.js → workspace-manager-CBhNdzE4.js} +76 -18
  346. package/server/workspace-manager-CWT55qeI.js +3 -0
  347. package/server/{workspace-metadata-BE0efUv_.js → workspace-metadata-BzHnwwX4.js} +1 -1
  348. package/server/{workspace-metadata-tiSRIWJP.js → workspace-metadata-_WygnyoX.js} +2 -2
  349. package/server/{workspaces-CFPcL0vl.js → workspaces-Do_9J0LQ.js} +309 -124
  350. package/sync-sources/agents/pan-inspect-agent.md +1 -1
  351. package/sync-sources/agents/pan-merge-agent.md +1 -1
  352. package/sync-sources/agents/pan-planning-agent.md +4 -4
  353. package/sync-sources/agents/pan-work-agent.md +1 -1
  354. package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
  355. package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
  356. package/sync-sources/hooks/record-cost-event.js +369 -75
  357. package/sync-sources/hooks/session-start-hook +7 -0
  358. package/sync-sources/hooks/work-agent-stop-hook +1 -1
  359. package/sync-sources/rules/per-bead-durability.md +1 -1
  360. package/sync-sources/rules/prd-authoring.md +1 -1
  361. package/sync-sources/skills/feature-work/SKILL.md +1 -1
  362. package/sync-sources/skills/okf/README.md +11 -3
  363. package/sync-sources/skills/okf/SKILL.md +12 -1
  364. package/sync-sources/skills/okf/docs/USAGE.md +15 -0
  365. package/sync-sources/skills/okf/references/overdeck.md +28 -0
  366. package/sync-sources/skills/pan/SKILL.md +2 -2
  367. package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
  368. package/sync-sources/skills/pan-approve/SKILL.md +1 -1
  369. package/sync-sources/skills/pan-close/SKILL.md +1 -1
  370. package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
  371. package/sync-sources/skills/pan-flywheel/SKILL.md +18 -1
  372. package/sync-sources/skills/pan-knowledge/SKILL.md +10 -0
  373. package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
  374. package/sync-sources/skills/pan-orders/SKILL.md +33 -0
  375. package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
  376. package/sync-sources/skills/pan-plan/SKILL.md +6 -6
  377. package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
  378. package/sync-sources/skills/pan-recap/SKILL.md +2 -2
  379. package/sync-sources/skills/pan-review/SKILL.md +1 -1
  380. package/sync-sources/skills/pan-start/SKILL.md +7 -3
  381. package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
  382. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  383. package/sync-sources/skills/pan-task/SKILL.md +2 -2
  384. package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
  385. package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
  386. package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
  387. package/sync-sources/skills/plan/SKILL.md +11 -11
  388. package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
  389. package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
  390. package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
  391. package/sync-sources/templates/traefik/dynamic/overdeck.yml.template +10 -0
  392. package/server/agent-state-Co5Sy2Fw.js +0 -3
  393. package/server/agents-DyHKlq1I.js +0 -3
  394. package/server/cli-BRORS9qY.js +0 -3
  395. package/server/codex-DNyiQDKW.js +0 -3
  396. package/server/context-layers-15gDOk20.js +0 -165
  397. package/server/context-layers-DlQKkHH2.js +0 -4
  398. package/server/deacon-swarm-CV54eNmU.js +0 -2
  399. package/server/dist-j64RzSrQ.js +0 -3
  400. package/server/flywheel-6WHU4O7A.js +0 -207
  401. package/server/flywheel-COR0mbRI.js +0 -522
  402. package/server/flywheel-Ctr5uuvo.js +0 -2
  403. package/server/forge-B0_opi-V.js +0 -2
  404. package/server/git-utils-CsKGnzFA.js +0 -3
  405. package/server/hume-BmhvfVbV.js +0 -3
  406. package/server/inspect-agent-Dq0z1k3H.js +0 -2
  407. package/server/layers-Cp1To4L8.js +0 -93
  408. package/server/lifecycle-io-DmY2qwCn.js +0 -3
  409. package/server/merge-blockers-BYjeXrVN.js +0 -41
  410. package/server/merge-ops-DwWCkSgo.js +0 -2
  411. package/server/merge-set-DiISXcC-.js +0 -139
  412. package/server/projects-BKkwpH6q.js +0 -3
  413. package/server/public/assets/index-Bdc4V9ba.css +0 -1
  414. package/server/public/assets/mermaid-GHXKKRXX-B5v_r7cI.js +0 -1
  415. package/server/rally-OSJXdiHK.js +0 -3
  416. package/server/rebuild-stack-CKjJAI8L.js +0 -3
  417. package/server/record-rwK-nKv_.js +0 -3
  418. package/server/record-update-Crz74r-6.js +0 -168
  419. package/server/resume-wZZsWtzz.js +0 -3
  420. package/server/review-status-Bnh-rdkY.js +0 -3
  421. package/server/settings-BlUsVaUc.js +0 -2
  422. package/server/specialists-Dqe6_HE5.js +0 -3
  423. package/server/specs-BhOKBzqk.js +0 -3
  424. package/server/stack-health-Bd06frFn.js +0 -3
  425. package/server/supervisor-COVHrBTg.js +0 -2
  426. package/server/tmux-BAvtac_u.js +0 -3
  427. package/server/token-util-BArZLN6w.js +0 -3
  428. package/server/workflows-C4mR0Reb.js +0 -2
  429. package/server/workspace-manager-B1WOfKvB.js +0 -3
@@ -1,22 +1,22 @@
1
- import { Hn as init_projects, fr as init_issue_id, ii as init_paths, jr as init_errors, kn as findProjectByPathSync, mn as init_state_plane, nr as resolveProjectFromIssueSync, oi as packageRoot, ri as getOverdeckHome } from "./config-yaml-ig8Nwtiw.js";
2
- import { c as init_review_status, f as markWorkspaceStuck, s as getReviewStatusSync, y as setReviewStatusSync } from "./review-status-DFRjDFef.js";
3
- import { $ as stopAgent, Kn as setAgentPaused, L as messageAgent, s as init_agents } from "./queries-ZABd5aXP.js";
4
- import { n as init_tracker_utils } from "./tracker-utils-CawsPSS2.js";
1
+ import { Br as getOverdeckHome, Tn as init_projects, Ur as packageRoot, Vr as init_paths, Yn as init_issue_id, Yt as init_state_plane, fn as findProjectByPathSync, mr as init_errors, zn as resolveProjectFromIssueSync } from "./config-yaml-DySPNmKN.js";
2
+ import { b as setReviewStatusSync, c as getReviewStatusSync, l as init_review_status, p as markWorkspaceStuck } from "./review-status-kZj_KyCk.js";
3
+ import { X as messageAgent, b as init_agents, ft as stopAgent, ur as setAgentPaused } from "./queries-CjNIf-Ub.js";
4
+ import { n as init_tracker_utils } from "./tracker-utils-DHv5pSDT.js";
5
5
  import { i as readReviewStatusMap, n as init_review_status_source } from "./review-status-source-CxuEjLGg.js";
6
- import { m as readWorkspacePlanSync, o as init_io, t as VBriefMergeConflictError, v as init_types, y as subItemsOf } from "./io-DQR9PMgS.js";
7
- import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-BXP6g75N.js";
8
- import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-DZ-iAnAa.js";
9
- import { n as init_shadow_utils } from "./shadow-utils-CYMRPeRT.js";
10
- import { i as runQualityGates, n as init_validation, t as DEFAULT_GATES } from "./validation-CabEISJT.js";
11
- import { r as writeVerificationArtifact, t as readVerificationArtifact } from "./verification-artifact-BuTA1QbL.js";
12
- import { n as getVBriefACStatusSync } from "./acceptance-criteria-BH7ac_1G.js";
6
+ import { c as resolveWorkspaceRepoRootsSync, r as init_project_repos } from "./project-repos-B6GycDh9.js";
7
+ import { o as init_lifecycle, s as isXBriefFilename } from "./lifecycle-yPd___5E.js";
8
+ import { m as readWorkspacePlanSync, o as init_io, t as XBriefMergeConflictError, v as init_types, y as subItemsOf } from "./io-C9kF1wtJ.js";
9
+ import { a as writeFeedbackFile, i as init_feedback_writer } from "./feedback-writer-CY5L1lB7.js";
10
+ import { n as resolveIssueFeedbackTarget, r as surfaceIssueFeedbackNeedsYou, t as init_feedback_target } from "./feedback-target-7mqqwrX6.js";
11
+ import { n as init_shadow_utils } from "./shadow-utils-Db3oroFG.js";
12
+ import { i as runQualityGates, n as init_validation, t as DEFAULT_GATES } from "./validation-Dw1pzDzr.js";
13
+ import { r as writeVerificationArtifact, t as readVerificationArtifact } from "./verification-artifact-TVFSz_q1.js";
14
+ import { n as getXBriefACStatusSync } from "./acceptance-criteria-DDCnXF58.js";
13
15
  import { join } from "node:path";
14
16
  import { Data, Effect } from "effect";
15
- import { existsSync } from "fs";
16
17
  import { basename as basename$1, dirname as dirname$1, join as join$1 } from "path";
17
18
  import { homedir } from "os";
18
- 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";
19
- import { readdir } from "fs/promises";
19
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, renameSync, writeFileSync } from "node:fs";
20
20
  import { exec, spawn } from "node:child_process";
21
21
  import { promisify } from "node:util";
22
22
  import { exec as exec$1 } from "child_process";
@@ -57,53 +57,80 @@ function isProcessAlive(pid) {
57
57
  }
58
58
  function readVerificationWorkerState(issueId) {
59
59
  try {
60
- const parsed = JSON.parse(readFileSync$1(statePath(issueId), "utf8"));
61
- return parsed.issueId === issueId && Number.isInteger(parsed.pid) ? parsed : null;
60
+ const parsed = JSON.parse(readFileSync(statePath(issueId), "utf8"));
61
+ if (parsed.issueId !== issueId || !Number.isInteger(parsed.pid) || typeof parsed.runId !== "string" || typeof parsed.workspacePath !== "string" || typeof parsed.startedAt !== "string" || typeof parsed.resultPath !== "string") return null;
62
+ return {
63
+ ...parsed,
64
+ runId: parsed.runId,
65
+ issueId,
66
+ workspacePath: parsed.workspacePath,
67
+ pid: parsed.pid,
68
+ startedAt: parsed.startedAt,
69
+ resultPath: parsed.resultPath,
70
+ phase: parsed.phase === "queued" ? "queued" : "running",
71
+ admittedAt: parsed.admittedAt === void 0 ? parsed.startedAt : parsed.admittedAt
72
+ };
62
73
  } catch {
63
74
  return null;
64
75
  }
65
76
  }
66
77
  function isVerificationWorkerActive(issueId) {
67
78
  const state = readVerificationWorkerState(issueId);
68
- return !!state && isProcessAlive(state.pid) && !existsSync$1(state.resultPath);
79
+ return !!state && isProcessAlive(state.pid) && !existsSync(state.resultPath);
69
80
  }
70
81
  function writeJsonAtomic(path, value) {
71
82
  const temp = `${path}.${process.pid}.tmp`;
72
- writeFileSync$1(temp, `${JSON.stringify(value, null, 2)}\n`);
73
- renameSync$1(temp, path);
83
+ writeFileSync(temp, `${JSON.stringify(value, null, 2)}\n`);
84
+ renameSync(temp, path);
85
+ }
86
+ function verificationWorkerDeadline(state) {
87
+ if (!state.admittedAt) return null;
88
+ const admittedAt = Date.parse(state.admittedAt);
89
+ return Number.isFinite(admittedAt) ? admittedAt + MAX_RUN_MS : null;
90
+ }
91
+ function markVerificationWorkerAdmissionPhase(issueId, update) {
92
+ const state = readVerificationWorkerState(issueId);
93
+ if (!state || state.pid !== process.pid) return;
94
+ writeJsonAtomic(statePath(issueId), {
95
+ ...state,
96
+ phase: update.phase,
97
+ admittedAt: state.admittedAt ?? update.admittedAt ?? null,
98
+ currentGate: update.gateName,
99
+ currentAttempt: update.attempt
100
+ });
74
101
  }
75
102
  async function waitForResult(state) {
76
- const deadline = Date.now() + MAX_RUN_MS;
77
- while (Date.now() < deadline) {
78
- if (existsSync$1(state.resultPath)) return JSON.parse(readFileSync$1(state.resultPath, "utf8"));
103
+ for (;;) {
104
+ if (existsSync(state.resultPath)) return JSON.parse(readFileSync(state.resultPath, "utf8"));
79
105
  if (!isProcessAlive(state.pid)) return {
80
106
  outcome: "error",
81
107
  message: `Verification worker ${state.pid} exited before writing a result`
82
108
  };
109
+ const deadline = verificationWorkerDeadline(readVerificationWorkerState(state.issueId) ?? state);
110
+ if (deadline !== null && Date.now() >= deadline) return {
111
+ outcome: "error",
112
+ message: `Verification worker ${state.pid} exceeded ${MAX_RUN_MS}ms after CPU admission`
113
+ };
83
114
  await new Promise((resolve) => setTimeout(resolve, POLL_MS));
84
115
  }
85
- return {
86
- outcome: "error",
87
- message: `Verification worker ${state.pid} exceeded ${MAX_RUN_MS}ms`
88
- };
89
116
  }
90
117
  async function runSupervisedVerification(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
91
118
  const existing = readVerificationWorkerState(issueId);
92
- if (existing && existing.workspacePath === workspacePath && isProcessAlive(existing.pid) && !existsSync$1(existing.resultPath)) {
119
+ if (existing && existing.workspacePath === workspacePath && isProcessAlive(existing.pid) && !existsSync(existing.resultPath)) {
93
120
  console.log(`[${logPrefix}] Joining live verification worker ${existing.pid} for ${issueId}`);
94
121
  return waitForResult(existing);
95
122
  }
96
123
  const dir = workerDir(issueId);
97
- mkdirSync$1(dir, { recursive: true });
124
+ mkdirSync(dir, { recursive: true });
98
125
  const runId = `${Date.now()}-${process.pid}`;
99
126
  const resultPath = join(dir, `result-${runId}.json`);
100
127
  const logPath = join(dir, `worker-${runId}.log`);
101
128
  const workerPath = process.env.OVERDECK_VERIFICATION_WORKER_PATH || join(packageRoot, "dist", "verification-worker.js");
102
- if (!existsSync$1(workerPath)) return {
129
+ if (!existsSync(workerPath)) return {
103
130
  outcome: "error",
104
131
  message: `Verification worker bundle missing at ${workerPath}; run npm run build`
105
132
  };
106
- const logFd = openSync$1(logPath, "a");
133
+ const logFd = openSync(logPath, "a");
107
134
  const child = spawn(process.execPath, [workerPath, JSON.stringify({
108
135
  issueId,
109
136
  workspacePath,
@@ -124,7 +151,7 @@ async function runSupervisedVerification(issueId, workspacePath, workspaceInfo,
124
151
  OVERDECK_VERIFICATION_WORKER: "1"
125
152
  }
126
153
  });
127
- closeSync$1(logFd);
154
+ closeSync(logFd);
128
155
  if (!child.pid) return {
129
156
  outcome: "error",
130
157
  message: "Failed to spawn verification worker"
@@ -135,7 +162,9 @@ async function runSupervisedVerification(issueId, workspacePath, workspaceInfo,
135
162
  workspacePath,
136
163
  pid: child.pid,
137
164
  startedAt: (/* @__PURE__ */ new Date()).toISOString(),
138
- resultPath
165
+ resultPath,
166
+ phase: "queued",
167
+ admittedAt: null
139
168
  };
140
169
  writeJsonAtomic(statePath(issueId), state);
141
170
  child.unref();
@@ -146,6 +175,8 @@ async function runSupervisedVerification(issueId, workspacePath, workspaceInfo,
146
175
  //#region ../../lib/work/test-requirement-gate.ts
147
176
  init_projects();
148
177
  init_state_plane();
178
+ init_project_repos();
179
+ init_lifecycle();
149
180
  init_types();
150
181
  init_io();
151
182
  init_agents();
@@ -170,7 +201,7 @@ promisify(exec);
170
201
  const terminal = new Set(["completed", "cancelled"]);
171
202
  function checkIncompletePlanItemsSync(workspacePath) {
172
203
  const doc = readWorkspacePlanSync(workspacePath);
173
- if (!doc) return [" The required vBRIEF checklist is missing or unreadable; return the issue to planning before completion."];
204
+ if (!doc) return [" The required xBRIEF checklist is missing or unreadable; return the issue to planning before completion."];
174
205
  const incomplete = doc.plan.items.flatMap((item) => {
175
206
  const lines = [];
176
207
  if (!terminal.has(item.status)) lines.push(` - ${item.id} ${item.title} (${item.status})`);
@@ -196,6 +227,19 @@ async function checkIncompletePlanItemsPromise(workspacePath, _issueId) {
196
227
  init_io();
197
228
  const execAsync = promisify$1(exec$1);
198
229
  const NO_PROGRESS_REPEAT_THRESHOLD = 2;
230
+ const MERGED_VERIFICATION_REASON = "Merge already landed; verify-on-main owns post-merge validation.";
231
+ function skipMergedVerification(issueId, logPrefix, status = getReviewStatusSync(issueId)) {
232
+ if (status?.mergeStatus !== "merged") return null;
233
+ setReviewStatusSync(issueId, {
234
+ verificationStatus: "skipped",
235
+ verificationNotes: MERGED_VERIFICATION_REASON
236
+ });
237
+ console.log(`[${logPrefix}] Skipping pre-merge verification for ${issueId}: ${MERGED_VERIFICATION_REASON}`);
238
+ return {
239
+ outcome: "skipped",
240
+ reason: MERGED_VERIFICATION_REASON
241
+ };
242
+ }
199
243
  function isFinalVerificationAttempt(cycleCount) {
200
244
  return cycleCount >= 3;
201
245
  }
@@ -222,6 +266,7 @@ function setStateDerivedVerificationFailure(issueId, failedCheck, summary, cycle
222
266
  console.warn(`[verification-runner] ${issueId} review is passed but held by state-derived gate ${failedCheck}: ${summary}`);
223
267
  }
224
268
  async function escalateVerificationStuck(issueId, failedCheck, cycleCount, summary, logPrefix) {
269
+ if (skipMergedVerification(issueId, logPrefix)) return;
225
270
  const agentId = `agent-${issueId.toLowerCase()}`;
226
271
  const reason = `needs-you: verification stuck after ${cycleCount}/3 attempts (${failedCheck})`;
227
272
  markWorkspaceStuck(issueId, "verification_stuck", {
@@ -287,7 +332,9 @@ function reconcileInterruptedVerifications(logPrefix = "boot-reconciliation") {
287
332
  return reset;
288
333
  }
289
334
  async function deliverVerificationFeedback(issueId, message, details, logPrefix) {
335
+ if (skipMergedVerification(issueId, logPrefix)) return;
290
336
  const target = await resolveIssueFeedbackTarget(issueId);
337
+ if (skipMergedVerification(issueId, logPrefix)) return;
291
338
  if ("agentId" in target) {
292
339
  await messageAgent(target.agentId, message, "internal", { owesRework: true });
293
340
  console.log(`[${logPrefix}] Sent verification feedback for ${issueId} to ${target.agentId}`);
@@ -298,29 +345,6 @@ async function deliverVerificationFeedback(issueId, message, details, logPrefix)
298
345
  ...details
299
346
  });
300
347
  }
301
- async function resolveGitDirs(workspacePath, projectConfig) {
302
- if (!(projectConfig?.workspace?.type === "polyrepo") && existsSync(join$1(workspacePath, ".git"))) return {
303
- gitDirs: [workspacePath],
304
- isPolyrepo: false
305
- };
306
- const gitDirs = [];
307
- try {
308
- const entries = await readdir(workspacePath, { withFileTypes: true });
309
- 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));
310
- } catch {}
311
- if (gitDirs.length > 0) return {
312
- gitDirs,
313
- isPolyrepo: true
314
- };
315
- if (existsSync(join$1(workspacePath, ".git"))) return {
316
- gitDirs: [workspacePath],
317
- isPolyrepo: false
318
- };
319
- return {
320
- gitDirs: [],
321
- isPolyrepo: false
322
- };
323
- }
324
348
  async function syncSingleRepo(gitDir, targetBranch) {
325
349
  const repoName = basename$1(gitDir);
326
350
  try {
@@ -399,17 +423,39 @@ function getSyncTargetBranch(workspacePath, projectConfig, repoName) {
399
423
  }
400
424
  /**
401
425
  * PAN-2179: detect a "plan-only" / zombie changeset — one whose only changes are
402
- * pipeline artifacts (.pan/, beads, vbrief) with no actual implementation. A work
426
+ * pipeline artifacts (.pan/, task state, xBRIEF) with no actual implementation. A work
403
427
  * agent that never received its kickoff produces exactly this. The verification
404
428
  * gate uses it to bounce the branch back instead of letting an empty "completion"
405
429
  * advance to review/merge. A legit non-code change (docs, rules under
406
430
  * sync-sources/, config) counts as content and is NOT flagged.
407
431
  */
408
432
  function changesetHasNoContent(changedFiles) {
409
- return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !f.endsWith(".vbrief.json")).length === 0;
433
+ return changedFiles.map((f) => f.trim()).filter(Boolean).filter((f) => !f.startsWith(".pan/") && !isXBriefFilename(f)).length === 0;
434
+ }
435
+ /**
436
+ * Return whether any actual workspace repository contains implementation
437
+ * changes. `undefined` means at least one repo diff failed and no positive
438
+ * evidence was found, so callers must conservatively skip the empty guard.
439
+ */
440
+ async function workspaceChangesetHasContent(issueId, workspacePath) {
441
+ const roots = resolveWorkspaceRepoRootsSync(issueId, workspacePath);
442
+ let diffFailed = false;
443
+ for (const root of roots) try {
444
+ const { stdout } = await execAsync(`git diff --name-only origin/${root.targetBranch}...HEAD`, {
445
+ cwd: root.dir,
446
+ encoding: "utf-8",
447
+ timeout: 15e3
448
+ });
449
+ if (!changesetHasNoContent(stdout.split("\n"))) return true;
450
+ } catch {
451
+ diffFailed = true;
452
+ }
453
+ return diffFailed ? void 0 : false;
410
454
  }
411
455
  async function runVerificationForIssuePromise(issueId, workspacePath, workspaceInfo, logPrefix, options = {}) {
412
456
  const currentStatus = getReviewStatusSync(issueId);
457
+ const mergedOutcome = skipMergedVerification(issueId, logPrefix, currentStatus);
458
+ if (mergedOutcome) return mergedOutcome;
413
459
  const currentCycles = currentStatus?.verificationCycleCount ?? 0;
414
460
  if (currentCycles >= 3) {
415
461
  const reason = `Circuit breaker: ${currentCycles}/3 cycles exceeded — skipping verification`;
@@ -424,17 +470,18 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
424
470
  console.log(`[${logPrefix}] Running verification gate for ${issueId} (attempt ${currentCycles + 1}/3)`);
425
471
  try {
426
472
  const projectConfig = findProjectByPathSync(workspacePath);
427
- const { gitDirs, isPolyrepo } = await resolveGitDirs(workspacePath, projectConfig);
428
- if (options.syncTargetBranch !== false) if (gitDirs.length === 0) console.log(`[${logPrefix}] No git directories found in workspace ${workspacePath} — skipping sync`);
473
+ const repoRoots = resolveWorkspaceRepoRootsSync(issueId, workspacePath);
474
+ const isPolyrepo = repoRoots.some((root) => root.isPolyrepo);
475
+ if (options.syncTargetBranch !== false) if (repoRoots.length === 0) console.log(`[${logPrefix}] No git directories found in workspace ${workspacePath} — skipping sync`);
429
476
  else {
430
477
  const syncResults = [];
431
- for (const gitDir of gitDirs) {
432
- const repoName = isPolyrepo ? basename$1(gitDir) : void 0;
433
- const targetBranch = getSyncTargetBranch(workspacePath, projectConfig, repoName);
434
- const displayName = repoName || basename$1(workspacePath);
435
- console.log(`[${logPrefix}] Syncing ${targetBranch} into ${displayName} for ${issueId}...`);
436
- syncResults.push(await syncSingleRepo(gitDir, targetBranch));
478
+ for (const root of repoRoots) {
479
+ const displayName = (isPolyrepo ? root.repoKey : void 0) || basename$1(workspacePath);
480
+ console.log(`[${logPrefix}] Syncing ${root.targetBranch} into ${displayName} for ${issueId}...`);
481
+ syncResults.push(await syncSingleRepo(root.dir, root.targetBranch));
437
482
  }
483
+ const postSyncMergedOutcome = skipMergedVerification(issueId, logPrefix);
484
+ if (postSyncMergedOutcome) return postSyncMergedOutcome;
438
485
  const failures = syncResults.filter((r) => !r.success);
439
486
  if (failures.length > 0) {
440
487
  const newCycleCount = currentCycles + 1;
@@ -482,13 +529,15 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
482
529
  }
483
530
  }
484
531
  else console.log(`[${logPrefix}] Skipping target-branch sync for ${issueId}; verifying current workspace state`);
532
+ const postSyncMergedOutcome = skipMergedVerification(issueId, logPrefix);
533
+ if (postSyncMergedOutcome) return postSyncMergedOutcome;
485
534
  const gates = projectConfig?.quality_gates && Object.keys(projectConfig.quality_gates).length > 0 ? projectConfig.quality_gates : DEFAULT_GATES;
486
535
  console.log(`[${logPrefix}] Project: ${projectConfig?.name || "NOT FOUND"}, gates: [${Object.keys(gates).join(", ")}], workspace: ${workspacePath}`);
487
536
  const featureFolder = basename$1(workspacePath);
488
537
  const featureName = featureFolder.replace(/^feature-/, "");
489
538
  const projectPath = projectConfig?.path || dirname$1(dirname$1(workspacePath));
490
539
  const domain = projectConfig?.workspace?.dns?.domain || "localhost";
491
- const changedBase = `origin/${getSyncTargetBranch(workspacePath, projectConfig, void 0)}`;
540
+ const changedBase = `origin/${repoRoots[0]?.targetBranch ?? getSyncTargetBranch(workspacePath, projectConfig, void 0)}`;
492
541
  const placeholders = {
493
542
  FEATURE_NAME: featureName,
494
543
  FEATURE_FOLDER: featureFolder,
@@ -545,10 +594,12 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
545
594
  };
546
595
  writeLiveArtifact();
547
596
  const gateResults = await Effect.runPromise(runQualityGates(gates, workspacePath, "pre_push", {
597
+ issueId,
548
598
  isRemote: workspaceInfo.isRemote,
549
599
  vmName: workspaceInfo.vmName,
550
600
  placeholders,
551
601
  ...options.onGateLog ? { onLog: options.onGateLog } : {},
602
+ onAdmissionPhase: (state) => markVerificationWorkerAdmissionPhase(issueId, state),
552
603
  onGateStart: (name) => {
553
604
  liveGateName = name;
554
605
  liveGateTail = "";
@@ -569,6 +620,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
569
620
  writeLiveArtifact();
570
621
  }
571
622
  }));
623
+ const postGateMergedOutcome = skipMergedVerification(issueId, logPrefix);
624
+ if (postGateMergedOutcome) return postGateMergedOutcome;
572
625
  const failedGate = gateResults.find((r) => !r.passed && r.required !== false);
573
626
  if (failedGate?.infraUnavailable) {
574
627
  try {
@@ -580,12 +633,11 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
580
633
  verificationNotes: `Verification deferred: ${failedGate.error}. Workspace stack rebuild triggered; verification re-runs on the next cycle.`
581
634
  });
582
635
  try {
583
- const { rebuildWorkspaceStack } = await import("./rebuild-stack-CKjJAI8L.js");
584
- Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[${logPrefix}] ${issueId} stack rebuild: ${m}`) })).then((r) => {
585
- if (!r.success) console.warn(`[${logPrefix}] Stack rebuild for ${issueId} failed: ${r.error}`);
586
- });
636
+ const { rebuildWorkspaceStack } = await import("./rebuild-stack-CFvcBHsS.js");
637
+ const rebuildResult = await Effect.runPromise(rebuildWorkspaceStack(issueId, { onProgress: (m) => console.log(`[${logPrefix}] ${issueId} stack rebuild: ${m}`) }));
638
+ if (!rebuildResult.success) console.warn(`[${logPrefix}] Stack rebuild for ${issueId} failed: ${rebuildResult.error}`);
587
639
  } catch (err) {
588
- console.warn(`[${logPrefix}] Could not trigger stack rebuild for ${issueId}: ${err instanceof Error ? err.message : String(err)}`);
640
+ console.warn(`[${logPrefix}] Could not settle stack rebuild for ${issueId}: ${err instanceof Error ? err.message : String(err)}`);
589
641
  }
590
642
  return {
591
643
  outcome: "failed",
@@ -640,30 +692,30 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
640
692
  }
641
693
  let acStatus;
642
694
  try {
643
- acStatus = getVBriefACStatusSync(workspacePath);
644
- } catch (vbriefErr) {
645
- if (vbriefErr instanceof VBriefMergeConflictError) {
695
+ acStatus = getXBriefACStatusSync(workspacePath);
696
+ } catch (xbriefErr) {
697
+ if (xbriefErr instanceof XBriefMergeConflictError) {
646
698
  const newCycleCount = currentCycles + 1;
647
699
  const failedCheck = "vbrief-conflicts";
648
- const summary = `vBRIEF spec has unresolved git merge conflict markers. Resolve all conflict markers in the spec file and commit before resubmitting.`;
700
+ const summary = `xBRIEF spec has unresolved git merge conflict markers. Resolve all conflict markers in the spec file and commit before resubmitting.`;
649
701
  setStateDerivedVerificationFailure(issueId, failedCheck, summary, newCycleCount, currentStatus);
650
702
  if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
651
- 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: Fix merge conflicts in vBRIEF spec BEFORE resubmitting\n\n1. Open the vBRIEF spec (on main in .pan/specs/)\n2. Find and resolve all <<<<<<< HEAD / ======= / >>>>>>> conflict markers\n3. Ensure the file is valid JSON (only keep ONE version of each conflicted block)\n4. Commit the fixed file on main\n5. ONLY THEN resubmit: pan review request ${issueId} -m "Resolved spec merge conflict"\n\nDo NOT resubmit until the spec parses cleanly.`;
703
+ 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: Fix merge conflicts in xBRIEF spec BEFORE resubmitting\n\n1. Open the xBRIEF spec (on main in .pan/specs/)\n2. Find and resolve all <<<<<<< HEAD / ======= / >>>>>>> conflict markers\n3. Ensure the file is valid JSON (only keep ONE version of each conflicted block)\n4. Commit the fixed file on main\n5. ONLY THEN resubmit: pan review request ${issueId} -m "Resolved spec merge conflict"\n\nDo NOT resubmit until the spec parses cleanly.`;
652
704
  try {
653
705
  const fileResult = await Effect.runPromise(writeFeedbackFile({
654
706
  issueId,
655
707
  workspacePath,
656
708
  specialist: "verification-gate",
657
709
  outcome: "failed",
658
- summary: `vBRIEF plan has merge conflicts (attempt ${newCycleCount}/3)`,
710
+ summary: `xBRIEF plan has merge conflicts (attempt ${newCycleCount}/3)`,
659
711
  markdownBody: feedbackBody
660
712
  }));
661
- 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.`, {
713
+ 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} — the xBRIEF document 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.`, {
662
714
  failedCheck,
663
715
  feedbackPath: fileResult.filePath
664
716
  }, logPrefix);
665
717
  } catch (feedbackErr) {
666
- console.error(`[${logPrefix}] Failed to write vBRIEF conflict feedback for ${issueId}:`, feedbackErr);
718
+ console.error(`[${logPrefix}] Failed to write xBRIEF conflict feedback for ${issueId}:`, feedbackErr);
667
719
  }
668
720
  return {
669
721
  outcome: "failed",
@@ -672,7 +724,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
672
724
  maxCycles: 3
673
725
  };
674
726
  }
675
- throw vbriefErr;
727
+ throw xbriefErr;
676
728
  }
677
729
  if (acStatus && !acStatus.allCompleted) {
678
730
  const newCycleCount = currentCycles + 1;
@@ -708,7 +760,9 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
708
760
  maxCycles: 3
709
761
  };
710
762
  }
711
- const taskBlockers = await checkIncompletePlanItemsPromise(workspacePath, issueId);
763
+ const taskBlockers = options.skipPlanChecklist ? [] : await checkIncompletePlanItemsPromise(workspacePath, issueId);
764
+ const postChecklistMergedOutcome = skipMergedVerification(issueId, logPrefix);
765
+ if (postChecklistMergedOutcome) return postChecklistMergedOutcome;
712
766
  if (taskBlockers.length > 0) {
713
767
  const newCycleCount = currentCycles + 1;
714
768
  const failedCheck = "incomplete-plan-items";
@@ -740,52 +794,46 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
740
794
  maxCycles: 3
741
795
  };
742
796
  }
743
- try {
744
- const { stdout: changedOut } = await execAsync(`git diff --name-only ${changedBase}...HEAD`, {
745
- cwd: workspacePath,
746
- encoding: "utf-8",
747
- timeout: 15e3
797
+ const changesetHasContent = await workspaceChangesetHasContent(issueId, workspacePath);
798
+ const postDiffMergedOutcome = skipMergedVerification(issueId, logPrefix);
799
+ if (postDiffMergedOutcome) return postDiffMergedOutcome;
800
+ if (changesetHasContent === false) {
801
+ const newCycleCount = currentCycles + 1;
802
+ const failedCheck = "empty-changeset";
803
+ const comparedTargets = repoRoots.map((root) => `${root.repoKey}:origin/${root.targetBranch}`).join(", ");
804
+ const summary = `Branch has no implementation — only pipeline artifacts (.pan/xBRIEF task state) changed across workspace repos vs ${comparedTargets}. The work agent produced no code (likely a kickoff-delivery zombie — PAN-2179).`;
805
+ setReviewStatusSync(issueId, {
806
+ reviewStatus: "pending",
807
+ verificationStatus: "failed",
808
+ verificationNotes: summary,
809
+ verificationCycleCount: newCycleCount,
810
+ verificationMaxCycles: 3
748
811
  });
749
- if (changesetHasNoContent(changedOut.split("\n"))) {
750
- const newCycleCount = currentCycles + 1;
751
- const failedCheck = "empty-changeset";
752
- 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).`;
753
- setReviewStatusSync(issueId, {
754
- reviewStatus: "pending",
755
- verificationStatus: "failed",
756
- verificationNotes: summary,
757
- verificationCycleCount: newCycleCount,
758
- verificationMaxCycles: 3
759
- });
760
- if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
761
- try {
762
- 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.`, {
763
- failedCheck,
764
- changedBase
765
- }, logPrefix);
766
- console.error(`[${logPrefix}] VERIFICATION FAILED for ${issueId}: empty-changeset (no content files vs ${changedBase})`);
767
- } catch (feedbackErr) {
768
- console.error(`[${logPrefix}] Failed to send empty-changeset feedback for ${issueId}:`, feedbackErr);
769
- }
770
- return {
771
- outcome: "failed",
812
+ if (shouldEscalateVerificationFailure(currentStatus, failedCheck, newCycleCount)) await escalateVerificationStuck(issueId, failedCheck, newCycleCount, summary, logPrefix);
813
+ try {
814
+ 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/xBRIEF task state changed across ${comparedTargets}).\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.`, {
772
815
  failedCheck,
773
- cycleCount: newCycleCount,
774
- maxCycles: 3
775
- };
816
+ changedBase: comparedTargets
817
+ }, logPrefix);
818
+ console.error(`[${logPrefix}] VERIFICATION FAILED for ${issueId}: empty-changeset (no content files across ${comparedTargets})`);
819
+ } catch (feedbackErr) {
820
+ console.error(`[${logPrefix}] Failed to send empty-changeset feedback for ${issueId}:`, feedbackErr);
776
821
  }
777
- } catch (diffErr) {
778
- console.warn(`[${logPrefix}] empty-changeset guard skipped (diff failed): ${diffErr.message}`);
822
+ return {
823
+ outcome: "failed",
824
+ failedCheck,
825
+ cycleCount: newCycleCount,
826
+ maxCycles: 3
827
+ };
779
828
  }
829
+ if (changesetHasContent === void 0) console.warn(`[${logPrefix}] empty-changeset guard skipped (one or more repo diffs failed)`);
780
830
  let lastVerifiedCommit;
781
831
  try {
782
- const { stdout } = await execAsync("git rev-parse HEAD", {
783
- cwd: workspacePath,
784
- encoding: "utf-8",
785
- timeout: 5e3
786
- });
787
- lastVerifiedCommit = stdout.trim();
832
+ const { snapshotWorkspaceHeadsPromise } = await import("./git-utils-D0_yhCgF.js");
833
+ lastVerifiedCommit = await snapshotWorkspaceHeadsPromise(issueId, workspacePath);
788
834
  } catch {}
835
+ const prePassMergedOutcome = skipMergedVerification(issueId, logPrefix);
836
+ if (prePassMergedOutcome) return prePassMergedOutcome;
789
837
  setReviewStatusSync(issueId, {
790
838
  verificationStatus: "passed",
791
839
  verificationNotes: void 0,
@@ -797,7 +845,7 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
797
845
  const repo = findProjectByPathSync(workspacePath)?.github_repo;
798
846
  if (!repo || !repo.includes("/")) return;
799
847
  const [owner, name] = repo.split("/");
800
- const { postOverdeckTestsStatus } = await import("./github-app-CU14oYzP.js");
848
+ const { postOverdeckTestsStatus } = await import("./github-app-ClZ2lk8D.js");
801
849
  await postOverdeckTestsStatus(workspacePath, owner, name, "success", "Verification gate passed");
802
850
  } catch (err) {
803
851
  console.warn(`[${logPrefix}] Failed to post overdeck/tests status: ${err.message}`);
@@ -805,6 +853,8 @@ async function runVerificationForIssuePromise(issueId, workspacePath, workspaceI
805
853
  })();
806
854
  return { outcome: "passed" };
807
855
  } catch (verifyErr) {
856
+ const errorMergedOutcome = skipMergedVerification(issueId, logPrefix);
857
+ if (errorMergedOutcome) return errorMergedOutcome;
808
858
  setReviewStatusSync(issueId, {
809
859
  reviewStatus: "pending",
810
860
  verificationStatus: "failed",
@@ -831,6 +881,6 @@ function runVerificationForIssueInProcess(issueId, workspacePath, workspaceInfo,
831
881
  return Effect.promise(() => runVerificationForIssuePromise(issueId, workspacePath, workspaceInfo, logPrefix, options));
832
882
  }
833
883
  //#endregion
834
- export { runVerificationForIssueInProcess as i, reconcileInterruptedVerifications as n, runVerificationForIssue as r, changesetHasNoContent as t };
884
+ export { workspaceChangesetHasContent as a, runVerificationForIssueInProcess as i, reconcileInterruptedVerifications as n, runVerificationForIssue as r, changesetHasNoContent as t };
835
885
 
836
- //# sourceMappingURL=verification-runner-FiuAZ-H2.js.map
886
+ //# sourceMappingURL=verification-runner-CkgX6EtI.js.map
@@ -107,4 +107,4 @@ function consolidateSpeakerCues(cues) {
107
107
  //#endregion
108
108
  export { vttToMarkdown };
109
109
 
110
- //# sourceMappingURL=vtt-parser-BnRsYzcz.js.map
110
+ //# sourceMappingURL=vtt-parser-DYPbKcIJ.js.map
@@ -1,12 +1,12 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Bt as resolveProjectForIssue, Dn as extractTeamPrefix, Hn as init_projects, Mt as getProjectConfigFromWorkspacePath, Nt as init_record, jn as findProjectByTeamSync, t as init_config_yaml, u as isTldrEnabledSync, zt as readRecordContinueViewSync } from "./config-yaml-ig8Nwtiw.js";
3
- import { d as readPlanSync, i as findPlanSync, o as init_io, p as readWorkspacePlan } from "./io-DQR9PMgS.js";
4
- import { f as init_config, m as loadConfigSync } from "./config-q4Gvd8dq.js";
5
- import { i as NotImplementedError, o as init_interface } from "./rally-api-DqKqIMNR.js";
6
- import { n as createTrackerFromConfig, r as init_factory } from "./factory-BMrK4TrE.js";
7
- import { i as createActiveSlice, l as init_dag, o as getDispatchableItems } from "./dag-CJpgf9A3.js";
8
- import { l as getReadableWorkspacePanPaths, n as readWorkspaceContext, o as readFeedback, r as writeWorkspaceContext, t as init_pan_dir } from "./pan-dir-DOcf6ug3.js";
9
- import { n as renderPrompt, t as init_prompts } from "./prompts-EvhMeeHG.js";
2
+ import { Dt as getProjectConfigFromWorkspacePath, Ft as resolveProjectForIssue, Ot as init_record, Pt as readRecordContinueViewSync, Tn as init_projects, mn as findProjectByTeamSync, t as init_config_yaml, u as isTldrEnabledSync, un as extractTeamPrefix } from "./config-yaml-DySPNmKN.js";
3
+ import { F as getReadableWorkspacePanPaths, d as readPlanSync, i as findPlanSync, o as init_io, p as readWorkspacePlan } from "./io-C9kF1wtJ.js";
4
+ import { f as init_config, m as loadConfigSync } from "./config-BZ0sHTju.js";
5
+ import { i as NotImplementedError, o as init_interface } from "./rally-api-C8e_1JRi.js";
6
+ import { n as createTrackerFromConfig, r as init_factory } from "./factory-CFibJuaw.js";
7
+ import { i as createActiveSlice, l as init_dag, o as getDispatchableItems } from "./dag-B1ucnjDU.js";
8
+ import { l as readFeedback, n as readWorkspaceContext, r as writeWorkspaceContext, t as init_pan_dir } from "./pan-dir-B0c3w0Ya.js";
9
+ import { n as renderPrompt, t as init_prompts } from "./prompts-DxzFXuLl.js";
10
10
  import { Effect } from "effect";
11
11
  import { existsSync, readdirSync, statSync } from "fs";
12
12
  import { dirname, join } from "path";
@@ -67,7 +67,7 @@ async function buildActiveSliceContext(workspacePath, issueId) {
67
67
  const normalizedIssueId = (issueId ?? "").toUpperCase();
68
68
  const currentItemIds = doc.plan.items.filter((item) => item.status === "running" || item.id === nextItem.id).map((item) => item.id);
69
69
  return [
70
- "## Active vBRIEF Slice (Canonical Task Graph)",
70
+ "## Active xBRIEF Slice (Canonical Task Graph)",
71
71
  "",
72
72
  createActiveSlice(doc, {
73
73
  issueId: normalizedIssueId,
@@ -76,7 +76,7 @@ async function buildActiveSliceContext(workspacePath, issueId) {
76
76
  synthesisOutputs: void 0
77
77
  }).prompt,
78
78
  "",
79
- "_The merged vBRIEF is the canonical task authority._"
79
+ "_The merged xBRIEF is the canonical task authority._"
80
80
  ].join("\n");
81
81
  } catch {
82
82
  return "";
@@ -295,9 +295,9 @@ async function writeStoryFeatureContext(workspacePath, issueId) {
295
295
  const subItems = item.subItems?.map((s) => ` - ${s.title} (${s.status})`).join("\n") || "";
296
296
  return `- **${item.id}**: ${item.title} (${item.status})${item.narrative?.Action ? `\n - Action: ${item.narrative.Action}` : ""}${subItems ? `\n${subItems}` : ""}`;
297
297
  }).join("\n");
298
- contextContent = `# Feature Context for ${issueId}\n\n**Parent Feature:** ${parentTitle} (${issue.parentRef})\n\n## Plan Narratives\n${narrativeSection || "_No narratives found._"}\n\n## Cross-Story Dependencies\n${edgesSection || "_No dependency edges found._"}\n\n## Related Plan Items\n${itemsSection || "_No plan items found for this story._"}\n\n---\n*Synthesized from parent feature workspace vBRIEF*\n`;
298
+ contextContent = `# Feature Context for ${issueId}\n\n**Parent Feature:** ${parentTitle} (${issue.parentRef})\n\n## Plan Narratives\n${narrativeSection || "_No narratives found._"}\n\n## Cross-Story Dependencies\n${edgesSection || "_No dependency edges found._"}\n\n## Related Plan Items\n${itemsSection || "_No plan items found for this story._"}\n\n---\n*Synthesized from parent feature workspace xBRIEF*\n`;
299
299
  } catch (planErr) {
300
- console.warn(`[writeStoryFeatureContext] Could not read parent workspace vBRIEF: ${planErr instanceof Error ? planErr.message : String(planErr)}`);
300
+ console.warn(`[writeStoryFeatureContext] Could not read parent workspace xBRIEF: ${planErr instanceof Error ? planErr.message : String(planErr)}`);
301
301
  }
302
302
  const parentPanContext = await Effect.runPromise(readWorkspaceContext(parentWorkspace));
303
303
  if (parentPanContext && !contextContent) contextContent = parentPanContext;
@@ -436,4 +436,4 @@ __esmMin((() => {
436
436
  }))();
437
437
  export { buildPolyrepoContext, buildWorkAgentPrompt, extractStitchDesigns, getTrackerContext, readFeatureContext, readPlanningContext, writeStoryFeatureContext };
438
438
 
439
- //# sourceMappingURL=work-agent-prompt-DLthEPAq.js.map
439
+ //# sourceMappingURL=work-agent-prompt-Du8Vh2aJ.js.map
@@ -0,0 +1,2 @@
1
+ import { a as deepWipe, i as closeOut } from "./workflows-mbQzh6mQ.js";
2
+ export { closeOut, deepWipe };