@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,64 +1,11 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { cn as init_auto_commit, jr as init_errors, xr as FsError } from "./config-yaml-ig8Nwtiw.js";
3
- import { c as PAN_SESSIONS_FILENAME, d as WORKSPACE_RUNTIME_DIRNAME, i as PAN_CONTINUE_FILENAME, n as PAN_CONTEXT_FILENAME, p as init_types, s as PAN_FEEDBACK_DIRNAME, t as LEGACY_WORKSPACE_RUNTIME_DIRNAME, u as PAN_SPEC_FILENAME } from "./types-hraoaQIp.js";
4
- import { C as init_specs, S as getProjectPanPaths } from "./io-DQR9PMgS.js";
2
+ import { Ht as flushAutoCommits, Ut as init_auto_commit, Wt as queueAutoCommit, ir as FsError, mr as init_errors } from "./config-yaml-DySPNmKN.js";
3
+ import { p as init_types } from "./types-hraoaQIp.js";
4
+ import { C as init_specs, F as getReadableWorkspacePanPaths, I as getWorkspacePanPaths, L as init_continue, N as ensureWorkspacePanDir, P as getLegacyWorkspacePanPaths, S as getProjectPanPaths, b as ensurePanDirs } from "./io-C9kF1wtJ.js";
5
5
  import { Effect, FileSystem } from "effect";
6
6
  import { join } from "path";
7
7
  import { existsSync, readFileSync } from "node:fs";
8
8
  import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
9
- //#region ../../lib/pan-dir/continue.ts
10
- function workspacePanPaths(workspacePath) {
11
- const panDir = join(workspacePath, WORKSPACE_RUNTIME_DIRNAME);
12
- return {
13
- panDir,
14
- specPath: join(panDir, PAN_SPEC_FILENAME),
15
- continuePath: join(panDir, PAN_CONTINUE_FILENAME),
16
- sessionsPath: join(panDir, PAN_SESSIONS_FILENAME),
17
- feedbackDir: join(panDir, PAN_FEEDBACK_DIRNAME),
18
- contextPath: join(panDir, PAN_CONTEXT_FILENAME)
19
- };
20
- }
21
- function getWorkspacePanPaths(workspacePath) {
22
- return workspacePanPaths(workspacePath);
23
- }
24
- function getLegacyWorkspacePanPaths(workspacePath) {
25
- const panDir = join(workspacePath, LEGACY_WORKSPACE_RUNTIME_DIRNAME);
26
- return {
27
- panDir,
28
- specPath: join(panDir, PAN_SPEC_FILENAME),
29
- continuePath: join(panDir, PAN_CONTINUE_FILENAME),
30
- sessionsPath: join(panDir, PAN_SESSIONS_FILENAME),
31
- feedbackDir: join(panDir, PAN_FEEDBACK_DIRNAME),
32
- contextPath: join(panDir, PAN_CONTEXT_FILENAME)
33
- };
34
- }
35
- /** Resolve workspace runtime reads to `.overdeck/`, then legacy `.pan/`. */
36
- function getReadableWorkspacePanPaths(workspacePath) {
37
- const canonical = getWorkspacePanPaths(workspacePath);
38
- return existsSync(canonical.panDir) ? canonical : getLegacyWorkspacePanPaths(workspacePath);
39
- }
40
- function ensureWorkspacePanDir(workspacePath) {
41
- return Effect.gen(function* () {
42
- const fs = yield* FileSystem.FileSystem;
43
- const paths = workspacePanPaths(workspacePath);
44
- yield* fs.makeDirectory(paths.panDir, { recursive: true }).pipe(Effect.mapError((cause) => new FsError({
45
- path: paths.panDir,
46
- operation: "makeDirectory",
47
- cause
48
- })));
49
- yield* fs.makeDirectory(paths.feedbackDir, { recursive: true }).pipe(Effect.mapError((cause) => new FsError({
50
- path: paths.feedbackDir,
51
- operation: "makeDirectory",
52
- cause
53
- })));
54
- return paths;
55
- }).pipe(Effect.provide(NodeFileSystem.layer));
56
- }
57
- var init_continue = __esmMin((() => {
58
- init_errors();
59
- init_types();
60
- }));
61
- //#endregion
62
9
  //#region ../../lib/pan-dir/sessions.ts
63
10
  var init_sessions = __esmMin((() => {
64
11
  init_errors();
@@ -144,6 +91,33 @@ function getDraftsDir(projectRoot) {
144
91
  function getDraftPath(projectRoot, filename) {
145
92
  return join(getDraftsDir(projectRoot), filename);
146
93
  }
94
+ function getIssueDraftPath(projectRoot, issueId) {
95
+ return getDraftPath(projectRoot, `${issueId.toUpperCase()}.md`);
96
+ }
97
+ function writeIssueDraft(projectRoot, issueId, content) {
98
+ return Effect.gen(function* () {
99
+ const fs = yield* FileSystem.FileSystem;
100
+ yield* ensurePanDirs(projectRoot);
101
+ const path = getIssueDraftPath(projectRoot, issueId);
102
+ yield* fs.writeFileString(path, content).pipe(Effect.mapError((cause) => new FsError({
103
+ path,
104
+ operation: "writeFileString",
105
+ cause
106
+ })));
107
+ queueAutoCommit({
108
+ projectRoot,
109
+ paths: [path],
110
+ subject: `chore(state): update PRD draft for ${issueId.toUpperCase()}`
111
+ });
112
+ const flushed = yield* flushAutoCommits(projectRoot);
113
+ if (flushed.errored || flushed.pushed === false) return yield* Effect.fail(new FsError({
114
+ path,
115
+ operation: "pushDraft",
116
+ cause: new Error(flushed.reason ?? "PRD draft commit was not pushed")
117
+ }));
118
+ return path;
119
+ }).pipe(Effect.provide(NodeFileSystem.layer));
120
+ }
147
121
  /**
148
122
  * Sync PRD-first gate predicate (PAN-2234). The surrounding module uses the
149
123
  * Effect FileSystem for read/write/list paths; this predicate is deliberately a
@@ -200,6 +174,52 @@ function checkPrdGateSync(args) {
200
174
  searched
201
175
  };
202
176
  }
177
+ /**
178
+ * Promote a workspace-authored PRD draft to the canonical drafts/ location on
179
+ * the state plane. Planning agents author the PRD at
180
+ * `<workspace>/.pan/drafts/<ISSUE>.md`; the PRD-first gate accepts it there,
181
+ * but the workspace is disposable — without this promotion the PRD is lost on
182
+ * workspace teardown and invisible at the canonical location (the PAN-2858
183
+ * defect). Runs at complete-planning, after the PRD gate.
184
+ *
185
+ * No-loss rule: an existing canonical draft is never overwritten — the
186
+ * canonical copy may carry operator edits the workspace copy predates.
187
+ */
188
+ function promoteWorkspacePrdDraft(args) {
189
+ return Effect.suspend(() => {
190
+ const { projectRoot, workspacePath, issueId } = args;
191
+ const upperFile = `${issueId.toUpperCase()}.md`;
192
+ const lowerFile = `${issueId.toLowerCase()}.md`;
193
+ const draftsDir = getDraftsDir(projectRoot);
194
+ for (const canonical of [join(draftsDir, upperFile), join(draftsDir, lowerFile)]) if (existsSync(canonical)) return Effect.succeed({
195
+ promoted: false,
196
+ reason: "canonical-exists",
197
+ path: canonical
198
+ });
199
+ const wsDrafts = join(workspacePath, ".pan", "drafts");
200
+ const source = [join(wsDrafts, upperFile), join(wsDrafts, lowerFile)].find((p) => existsSync(p));
201
+ if (!source) return Effect.succeed({
202
+ promoted: false,
203
+ reason: "no-workspace-draft"
204
+ });
205
+ let content;
206
+ try {
207
+ content = readFileSync(source, "utf-8");
208
+ } catch (cause) {
209
+ return Effect.fail(new FsError({
210
+ path: source,
211
+ operation: "readFileString",
212
+ cause
213
+ }));
214
+ }
215
+ return writeIssueDraft(projectRoot, issueId, content).pipe(Effect.map((path) => ({
216
+ promoted: true,
217
+ reason: "promoted",
218
+ path,
219
+ source
220
+ })));
221
+ });
222
+ }
203
223
  var init_drafts = __esmMin((() => {
204
224
  init_errors();
205
225
  init_auto_commit();
@@ -255,6 +275,6 @@ var init_pan_dir = __esmMin((() => {
255
275
  init_context();
256
276
  }));
257
277
  //#endregion
258
- export { clearFeedback as a, ensureWorkspacePanDir as c, checkPrdGateSync as i, getReadableWorkspacePanPaths as l, readWorkspaceContext as n, readFeedback as o, writeWorkspaceContext as r, writeFeedback as s, init_pan_dir as t, getWorkspacePanPaths as u };
278
+ export { getDraftPath as a, clearFeedback as c, checkPrdGateSync as i, readFeedback as l, readWorkspaceContext as n, getIssueDraftPath as o, writeWorkspaceContext as r, promoteWorkspacePrdDraft as s, init_pan_dir as t, writeFeedback as u };
259
279
 
260
- //# sourceMappingURL=pan-dir-DOcf6ug3.js.map
280
+ //# sourceMappingURL=pan-dir-B0c3w0Ya.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { ii as init_paths$1, ri as getOverdeckHome } from "./config-yaml-ig8Nwtiw.js";
2
+ import { Br as getOverdeckHome, Vr as init_paths$1 } from "./config-yaml-DySPNmKN.js";
3
3
  import { dirname, isAbsolute, join, relative, resolve } from "path";
4
4
  import { mkdir } from "fs/promises";
5
5
  //#region ../../lib/memory/paths.ts
@@ -62,4 +62,4 @@ var init_paths = __esmMin((() => {
62
62
  //#endregion
63
63
  export { resolveArchiveDir as a, resolveMemoryRoot as c, resolveRagRunsFile as d, resolveStatusFile as f, init_paths as i, resolveObservationsFile as l, ensureDir as n, resolveFtsDbPath as o, resolveSummariesDir as p, ensureParentDir as r, resolveIssueMemoryRoot as s, assertMemorySafeSegment as t, resolvePendingDir as u };
64
64
 
65
- //# sourceMappingURL=paths-DooHpt9p.js.map
65
+ //# sourceMappingURL=paths-D-xWGHdh.js.map
@@ -28,13 +28,13 @@ function classifyIssue(node, lk) {
28
28
  * Routine auto-pickup for WORK: Ready AND Planned AND Released AND not
29
29
  * parked/vetoed/objected/in-flight. The DoR `ready` is the entry gate; `released`
30
30
  * (PAN-2059) is the operator's explicit "go" after reviewing the plan — a Planned
31
- * item is NOT pickable until released, UNLESS auto_pickup_backlog is ON, which
32
- * blanket-releases the whole backlog (vision.mdx). An open `objection` halts pickup
31
+ * item is NOT pickable until released, unless auto_pickup_backlog is ON or active
32
+ * order-book membership supplies the operator release. An open `objection` halts pickup
33
33
  * until the operator overrides or parks. An `epic` is a container, never directly
34
34
  * workable — its children carry the work, so it is excluded regardless of other gates.
35
35
  */
36
- function isAutoPickable(s, autoPickupBacklog = false) {
37
- const released = s.released || autoPickupBacklog;
36
+ function isAutoPickable(s, autoPickupBacklog = false, activeBookMember = false) {
37
+ const released = s.released || autoPickupBacklog || activeBookMember;
38
38
  return s.ready && s.planned && released && !s.parked && !s.vetoed && !s.objection && !s.inPipeline && !s.epic;
39
39
  }
40
40
  function effortOf(size) {
@@ -48,13 +48,13 @@ function pickOrder(a, b) {
48
48
  return a.rank - b.rank;
49
49
  }
50
50
  /** The auto-pickable queue, in pickup order (promoted first, then rank). */
51
- function pickableQueue(nodes, lk, autoPickupBacklog = false) {
51
+ function pickableQueue(nodes, lk, autoPickupBacklog = false, activeBookMembership = /* @__PURE__ */ new Set()) {
52
52
  return nodes.map((n) => ({
53
53
  issue: n.issue,
54
54
  rank: n.rank,
55
55
  size: n.size,
56
56
  state: classifyIssue(n, lk)
57
- })).filter((n) => isAutoPickable(n.state, autoPickupBacklog)).sort((a, b) => pickOrder({
57
+ })).filter((n) => isAutoPickable(n.state, autoPickupBacklog, activeBookMembership.has(n.issue.toUpperCase()))).sort((a, b) => pickOrder({
58
58
  gate: a.state.gate,
59
59
  rank: a.rank
60
60
  }, {
@@ -63,19 +63,19 @@ function pickableQueue(nodes, lk, autoPickupBacklog = false) {
63
63
  }));
64
64
  }
65
65
  /** Batch the pickup queue into waves of up to `n`. */
66
- function computeWaves(nodes, lk, n, autoPickupBacklog = false) {
67
- const q = pickableQueue(nodes, lk, autoPickupBacklog);
66
+ function computeWaves(nodes, lk, n, autoPickupBacklog = false, activeBookMembership = /* @__PURE__ */ new Set()) {
67
+ const q = pickableQueue(nodes, lk, autoPickupBacklog, activeBookMembership);
68
68
  const size = Math.max(1, n);
69
69
  const waves = [];
70
70
  for (let i = 0; i < q.length; i += size) waves.push(q.slice(i, i + size));
71
71
  return waves;
72
72
  }
73
73
  /** Greedy list-schedule of the pickup queue across `n` lanes (block width = effort). */
74
- function computeLanes(nodes, lk, n, autoPickupBacklog = false) {
74
+ function computeLanes(nodes, lk, n, autoPickupBacklog = false, activeBookMembership = /* @__PURE__ */ new Set()) {
75
75
  const lanes = Math.max(1, n);
76
76
  const free = new Array(lanes).fill(0);
77
77
  const blocks = [];
78
- for (const item of pickableQueue(nodes, lk, autoPickupBacklog)) {
78
+ for (const item of pickableQueue(nodes, lk, autoPickupBacklog, activeBookMembership)) {
79
79
  let li = 0;
80
80
  for (let i = 1; i < lanes; i++) if (free[i] < free[li]) li = i;
81
81
  const start = free[li];
@@ -98,10 +98,10 @@ function computeLanes(nodes, lk, n, autoPickupBacklog = false) {
98
98
  * ∪ the auto-pickable issues in the current + next wave (top `2 × n` by pickup order).
99
99
  * Returns the issue ids; the Run completes when all of them reach a terminal state.
100
100
  */
101
- function computeCohort(nodes, lk, n, autoPickupBacklog = false) {
101
+ function computeCohort(nodes, lk, n, autoPickupBacklog = false, activeBookMembership = /* @__PURE__ */ new Set()) {
102
102
  const ids = /* @__PURE__ */ new Set();
103
103
  for (const node of nodes) if (classifyIssue(node, lk).inPipeline) ids.add(node.issue);
104
- for (const item of pickableQueue(nodes, lk, autoPickupBacklog).slice(0, Math.max(1, n) * 2)) ids.add(item.issue);
104
+ for (const item of pickableQueue(nodes, lk, autoPickupBacklog, activeBookMembership).slice(0, Math.max(1, n) * 2)) ids.add(item.issue);
105
105
  return [...ids];
106
106
  }
107
107
  /**
@@ -122,7 +122,7 @@ function selectNeedsPlanning(nodes, lk, opts = {}) {
122
122
  }).sort((a, b) => a.rank - b.rank).slice(0, cap);
123
123
  }
124
124
  /** Aggregate counts for the forecast header / filter bar. */
125
- function computeStats(nodes, lk, autoPickupBacklog = false) {
125
+ function computeStats(nodes, lk, autoPickupBacklog = false, activeBookMembership = /* @__PURE__ */ new Set()) {
126
126
  const stats = {
127
127
  total: nodes.length,
128
128
  inFlight: 0,
@@ -147,9 +147,10 @@ function computeStats(nodes, lk, autoPickupBacklog = false) {
147
147
  if (s.parked) stats.parked++;
148
148
  if (s.vetoed) stats.vetoed++;
149
149
  if (s.blocksMain) stats.blocksMain++;
150
- if (isAutoPickable(s, autoPickupBacklog)) stats.pickable++;
150
+ const activeBookMember = activeBookMembership.has(node.issue.toUpperCase());
151
+ if (isAutoPickable(s, autoPickupBacklog, activeBookMember)) stats.pickable++;
151
152
  if (s.ready && !s.planned && !s.parked && !s.vetoed && !s.objection && !s.inPipeline) stats.needsPlanning++;
152
- if (s.ready && s.planned && !s.released && !s.parked && !s.vetoed && !s.objection && !s.inPipeline) stats.needsRelease++;
153
+ if (s.ready && s.planned && !s.released && !activeBookMember && !s.parked && !s.vetoed && !s.objection && !s.inPipeline) stats.needsRelease++;
153
154
  }
154
155
  return stats;
155
156
  }
@@ -185,4 +186,4 @@ var init_pickup = __esmMin((() => {
185
186
  //#endregion
186
187
  export { selectNeedsPlanning as _, READY_LABEL as a, classifyIssue as c, computeLanes as d, computeStats as f, normalizeGate as g, isAutoPickable as h, PARKED_LABEL as i, computeCohort as l, init_pickup as m, LEGACY_PARKED_LABELS as n, RELEASED_LABEL as o, computeWaves as p, OBJECTION_LABEL as r, VETOED_LABEL as s, BLOCKS_MAIN_LABEL as t, computeEpicGroups as u };
187
188
 
188
- //# sourceMappingURL=pickup-CaskQ7j6.js.map
189
+ //# sourceMappingURL=pickup-DUCLWrJY.js.map
@@ -1,8 +1,11 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { Hn as init_projects, Nn as getIssuePrefix } from "./config-yaml-ig8Nwtiw.js";
3
- import { C as init_specs, w as listSpecs } from "./io-DQR9PMgS.js";
4
- import { O as createSettledTtlPromiseCache, _ as listOpenIssuesWithLabelsPromise, f as init_github_app, h as listIssuesWithAnyLabelPromise, j as withConcurrencyLimitPromise, k as init_concurrency } from "./github-app-CDPtGF7J.js";
5
- import { n as init_label_reconciler, t as STALE_PIPELINE_LABELS } from "./label-reconciler-Df1ZduPH.js";
2
+ import { Tn as init_projects, gn as getIssuePrefix } from "./config-yaml-DySPNmKN.js";
3
+ import { C as init_specs, w as listSpecs } from "./io-C9kF1wtJ.js";
4
+ import { f as init_config, m as loadConfigSync } from "./config-BZ0sHTju.js";
5
+ import { r as init_factory, t as createTracker } from "./factory-CFibJuaw.js";
6
+ import { A as createSettledTtlPromiseCache, N as withConcurrencyLimitPromise, _ as listOpenIssuesWithLabelsPromise, f as init_github_app, h as listIssuesWithAnyLabelPromise, j as init_concurrency } from "./github-app-C3QrAUd0.js";
7
+ import { n as init_label_reconciler, t as STALE_PIPELINE_LABELS } from "./label-reconciler-B4iOAjlC.js";
8
+ import { join } from "node:path";
6
9
  import { Effect } from "effect";
7
10
  import { execFile } from "node:child_process";
8
11
  import { promisify } from "node:util";
@@ -42,17 +45,26 @@ function listOpenPullRequestsSnapshot(owner, repo) {
42
45
  }))));
43
46
  }
44
47
  async function runGitHubGraphql(query) {
45
- const { stdout } = await execFileAsync("gh", [
46
- "api",
47
- "graphql",
48
- "-f",
49
- `query=${query}`
50
- ], {
51
- encoding: "utf-8",
52
- timeout: 3e4,
53
- maxBuffer: 4 * 1024 * 1024
54
- });
55
- return stdout;
48
+ try {
49
+ const { stdout } = await execFileAsync("gh", [
50
+ "api",
51
+ "graphql",
52
+ "-f",
53
+ `query=${query}`
54
+ ], {
55
+ encoding: "utf-8",
56
+ timeout: 3e4,
57
+ maxBuffer: 4 * 1024 * 1024
58
+ });
59
+ return stdout;
60
+ } catch (error) {
61
+ const stdout = error.stdout;
62
+ if (typeof stdout === "string" && stdout.length > 0) try {
63
+ const parsed = JSON.parse(stdout);
64
+ if (parsed.data !== void 0 && parsed.data !== null) return stdout;
65
+ } catch {}
66
+ throw error;
67
+ }
56
68
  }
57
69
  async function listMergedPullRequestHeadsBatched(owner, repo, heads, runGraphql = runGitHubGraphql) {
58
70
  if (heads.length === 0) return [];
@@ -76,9 +88,8 @@ async function listIssueStatesBatched(owner, repo, numbers, runGraphql = runGitH
76
88
  for (const numberChunk of chunksOf(numbers)) {
77
89
  const fields = numberChunk.map((number, index) => `i${index}: issue(number: ${number}) { state }`);
78
90
  const query = `query { repository(owner: ${JSON.stringify(owner)}, name: ${JSON.stringify(repo)}) { ${fields.join(" ")} } }`;
79
- const response = JSON.parse(await runGraphql(query));
80
- const repository = response.data?.repository;
81
- if (response.errors?.length || !repository) throw new Error("Incomplete issue-state GraphQL response");
91
+ const repository = JSON.parse(await runGraphql(query)).data?.repository;
92
+ if (!repository) throw new Error("Incomplete issue-state GraphQL response");
82
93
  for (let index = 0; index < numberChunk.length; index++) {
83
94
  const alias = `i${index}`;
84
95
  if (!Object.prototype.hasOwnProperty.call(repository, alias)) throw new Error(`Missing issue-state alias ${alias}`);
@@ -95,44 +106,111 @@ async function listIssueStatesBatched(owner, repo, numbers, runGraphql = runGitH
95
106
  }
96
107
  return states;
97
108
  }
109
+ function resolveProjectTrackerType(project) {
110
+ if (project.tracker) return project.tracker;
111
+ if (project.rally_project) return "rally";
112
+ if (project.github_repo) return "github";
113
+ if (getIssuePrefix(project)) return "linear";
114
+ if (project.gitlab_repo) return "gitlab";
115
+ throw new Error(`Cannot resolve tracker for ${project.name}`);
116
+ }
117
+ async function listProjectTrackerIssues(project) {
118
+ const issuePrefix = getIssuePrefix(project)?.toUpperCase();
119
+ if (!issuePrefix) throw new Error(`Missing issue_prefix for project ${project.name}`);
120
+ const trackerType = resolveProjectTrackerType(project);
121
+ const trackerConfig = loadConfigSync().trackers[trackerType];
122
+ const tracker = createTracker({
123
+ type: trackerType,
124
+ apiKeyEnv: trackerConfig && "api_key_env" in trackerConfig ? trackerConfig.api_key_env : void 0,
125
+ tokenEnv: trackerConfig && "token_env" in trackerConfig ? trackerConfig.token_env : void 0,
126
+ team: issuePrefix,
127
+ owner: project.github_repo?.split("/")[0],
128
+ repo: project.github_repo?.split("/")[1],
129
+ projectId: project.gitlab_repo,
130
+ server: trackerType === "rally" && trackerConfig && "server" in trackerConfig ? trackerConfig.server : void 0,
131
+ workspace: trackerType === "rally" && trackerConfig && "workspace" in trackerConfig ? trackerConfig.workspace : void 0,
132
+ project: project.rally_project
133
+ });
134
+ return (await Effect.runPromise(tracker.listIssues({
135
+ team: issuePrefix,
136
+ includeClosed: true
137
+ }))).flatMap((issue) => {
138
+ const issueId = issue.ref.toUpperCase();
139
+ if (!issueId.startsWith(`${issuePrefix}-`)) return [];
140
+ return [{
141
+ issueId,
142
+ state: issue.state === "closed" ? "closed" : "open",
143
+ labels: issue.labels
144
+ }];
145
+ });
146
+ }
98
147
  function issueNumber(issueId) {
99
148
  const match = issueId.match(/-(\d+)$/);
100
149
  if (!match) throw new Error(`Cannot derive GitHub issue number from ${issueId}`);
101
150
  return Number(match[1]);
102
151
  }
103
152
  function issueIdFromRef(ref, issuePrefix) {
104
- if (!/(?:^|\/)feature\//.test(ref)) return null;
153
+ if (!/(?:^|\/)(?:feature|strike)\//.test(ref)) return null;
105
154
  const issueId = parseIssueIdFromTextSync(ref);
106
155
  return issueId?.startsWith(`${issuePrefix}-`) ? issueId : null;
107
156
  }
108
- /** Gather all durable pipeline lenses for one GitHub-backed project in batches. */
157
+ function projectRepositories(project) {
158
+ if (!project.workspace?.repos?.length) return [{
159
+ path: project.path,
160
+ defaultBranch: project.workspace?.default_branch ?? "main"
161
+ }];
162
+ return project.workspace.repos.map((repo) => ({
163
+ path: join(project.path, repo.path),
164
+ defaultBranch: repo.default_branch ?? project.workspace?.default_branch ?? "main"
165
+ }));
166
+ }
167
+ /** Gather all durable pipeline lenses for one project in batches. */
109
168
  async function gatherProjectLensSignals(project, deps = defaultDeps) {
110
- if (!project.github_repo) return [];
111
- const [owner, repo] = project.github_repo.split("/");
112
- if (!owner || !repo) throw new Error(`Invalid github_repo for ${project.name}: ${project.github_repo}`);
113
169
  const issuePrefix = getIssuePrefix(project)?.toUpperCase();
114
- if (!issuePrefix) throw new Error(`Missing issue_prefix for GitHub project ${project.name}`);
115
- const [openIssues, phaseLabeledIssues, openPrs, branchRefs, unmergedRefs, specIssueIds] = await Promise.all([
116
- deps.listOpenIssues(owner, repo),
117
- deps.listPhaseLabeledIssues(owner, repo),
118
- deps.listOpenPullRequests(owner, repo),
119
- deps.run("git", [
120
- "for-each-ref",
121
- "--format=%(refname:short)",
122
- "refs/heads/feature/*",
123
- "refs/remotes/origin/feature/*"
124
- ], project.path),
125
- deps.run("git", [
126
- "for-each-ref",
127
- "--no-merged=main",
128
- "--format=%(refname:short)",
129
- "refs/heads/feature/*",
130
- "refs/remotes/origin/feature/*"
131
- ], project.path),
170
+ if (!issuePrefix) throw new Error(`Missing issue_prefix for project ${project.name}`);
171
+ const githubRepository = project.github_repo?.split("/");
172
+ const owner = githubRepository?.[0];
173
+ const repo = githubRepository?.[1];
174
+ if (project.github_repo && (!owner || !repo)) throw new Error(`Invalid github_repo for ${project.name}: ${project.github_repo}`);
175
+ const branchSnapshots = projectRepositories(project).map(async (repository) => {
176
+ const [refs, unmergedRefs, firstParentShas] = await Promise.all([
177
+ deps.run("git", [
178
+ "for-each-ref",
179
+ "--format=%(objectname) %(refname:short)",
180
+ "refs/heads/feature/*",
181
+ "refs/remotes/origin/feature/*",
182
+ "refs/heads/strike/*",
183
+ "refs/remotes/origin/strike/*"
184
+ ], repository.path),
185
+ deps.run("git", [
186
+ "for-each-ref",
187
+ `--no-merged=${repository.defaultBranch}`,
188
+ "--format=%(refname:short)",
189
+ "refs/heads/feature/*",
190
+ "refs/remotes/origin/feature/*",
191
+ "refs/heads/strike/*",
192
+ "refs/remotes/origin/strike/*"
193
+ ], repository.path),
194
+ deps.run("git", [
195
+ "rev-list",
196
+ "--first-parent",
197
+ repository.defaultBranch
198
+ ], repository.path)
199
+ ]);
200
+ return {
201
+ refs,
202
+ unmergedRefs,
203
+ firstParentShas
204
+ };
205
+ });
206
+ const [trackerIssues, openIssues, phaseLabeledIssues, openPrs, branches, specIssueIds] = await Promise.all([
207
+ project.github_repo ? Promise.resolve([]) : deps.listTrackerIssues(project),
208
+ owner && repo ? deps.listOpenIssues(owner, repo) : Promise.resolve([]),
209
+ owner && repo ? deps.listPhaseLabeledIssues(owner, repo) : Promise.resolve([]),
210
+ owner && repo ? deps.listOpenPullRequests(owner, repo) : Promise.resolve([]),
211
+ Promise.all(branchSnapshots),
132
212
  deps.listSpecIssueIds(project.path)
133
213
  ]);
134
- const refs = branchRefs.split("\n").map((ref) => ref.trim()).filter(Boolean);
135
- const unmerged = new Set(unmergedRefs.split("\n").map((ref) => ref.trim()).filter(Boolean));
136
214
  const candidates = /* @__PURE__ */ new Set();
137
215
  const labelsByIssue = /* @__PURE__ */ new Map();
138
216
  const knownStateByIssue = /* @__PURE__ */ new Map();
@@ -141,7 +219,15 @@ async function gatherProjectLensSignals(project, deps = defaultDeps) {
141
219
  const headRefsByIssue = /* @__PURE__ */ new Map();
142
220
  const branchIssues = /* @__PURE__ */ new Set();
143
221
  const unmergedBranchIssues = /* @__PURE__ */ new Set();
222
+ const mergedBranchWorkIssues = /* @__PURE__ */ new Set();
144
223
  const specIssues = new Set(specIssueIds.map((id) => id.toUpperCase()).filter((id) => id.startsWith(`${issuePrefix}-`)));
224
+ for (const issue of trackerIssues) {
225
+ const id = issue.issueId.toUpperCase();
226
+ if (!id.startsWith(`${issuePrefix}-`)) continue;
227
+ labelsByIssue.set(id, issue.labels);
228
+ knownStateByIssue.set(id, issue.state);
229
+ if (issue.state === "open" || STALE_PIPELINE_LABELS.some((label) => issue.labels.includes(label))) candidates.add(id);
230
+ }
145
231
  for (const issue of openIssues) {
146
232
  const id = `${issuePrefix}-${issue.number}`;
147
233
  candidates.add(id);
@@ -155,7 +241,7 @@ async function gatherProjectLensSignals(project, deps = defaultDeps) {
155
241
  knownStateByIssue.set(id, issue.state);
156
242
  }
157
243
  for (const pr of openPrs) {
158
- if (pr.headRepoFullName.toLowerCase() !== `${owner}/${repo}`.toLowerCase()) continue;
244
+ if (!owner || !repo || pr.headRepoFullName.toLowerCase() !== `${owner}/${repo}`.toLowerCase()) continue;
159
245
  const id = issueIdFromRef(pr.headRefName, issuePrefix);
160
246
  if (id) {
161
247
  candidates.add(id);
@@ -163,34 +249,61 @@ async function gatherProjectLensSignals(project, deps = defaultDeps) {
163
249
  headRefsByIssue.set(id, new Set([...headRefsByIssue.get(id) ?? [], pr.headRefName]));
164
250
  }
165
251
  }
166
- for (const ref of refs) {
167
- const id = issueIdFromRef(ref, issuePrefix);
168
- if (id) {
169
- candidates.add(id);
170
- branchIssues.add(id);
171
- const headRef = ref.replace(/^origin\//, "");
172
- headRefsByIssue.set(id, new Set([...headRefsByIssue.get(id) ?? [], headRef]));
173
- if (unmerged.has(ref)) unmergedBranchIssues.add(id);
252
+ for (const snapshot of branches) {
253
+ const refLines = snapshot.refs.split("\n").map((line) => line.trim()).filter(Boolean);
254
+ const unmerged = new Set(snapshot.unmergedRefs.split("\n").map((ref) => ref.trim()).filter(Boolean));
255
+ const firstParentShas = new Set(snapshot.firstParentShas.split("\n").map((sha) => sha.trim()).filter(Boolean));
256
+ for (const line of refLines) {
257
+ const spaceIdx = line.indexOf(" ");
258
+ const tipSha = spaceIdx === -1 ? null : line.slice(0, spaceIdx);
259
+ const ref = spaceIdx === -1 ? line : line.slice(spaceIdx + 1);
260
+ const id = issueIdFromRef(ref, issuePrefix);
261
+ if (id) {
262
+ candidates.add(id);
263
+ branchIssues.add(id);
264
+ const headRef = ref.replace(/^origin\//, "");
265
+ headRefsByIssue.set(id, new Set([...headRefsByIssue.get(id) ?? [], headRef]));
266
+ if (unmerged.has(ref)) unmergedBranchIssues.add(id);
267
+ else if (tipSha && !firstParentShas.has(tipSha)) mergedBranchWorkIssues.add(id);
268
+ }
174
269
  }
175
270
  }
176
271
  for (const id of specIssues) candidates.add(id);
177
- const candidateHeads = [...new Set([...candidates].flatMap((id) => [...headRefsByIssue.get(id) ?? new Set([`feature/${id.toLowerCase()}`])]))];
178
- const mergedHeads = new Set(await deps.listMergedPullRequestHeads(owner, repo, candidateHeads));
179
- for (const [id, heads] of headRefsByIssue) if ([...heads].some((head) => mergedHeads.has(head))) mergedPrIssues.add(id);
180
- for (const id of candidates) if (!headRefsByIssue.has(id) && mergedHeads.has(`feature/${id.toLowerCase()}`)) mergedPrIssues.add(id);
181
- const unknownIssueIds = [...candidates].filter((id) => !knownStateByIssue.has(id));
182
- const issueStates = await deps.listIssueStates(owner, repo, unknownIssueIds.map(issueNumber));
183
- const stateByNumber = new Map(issueStates.map((entry) => [entry.number, entry.state]));
184
- const issueOpen = new Map([...candidates].map((id) => [id, knownStateByIssue.get(id) === "open" || stateByNumber.get(issueNumber(id)) === "open"]));
272
+ if (owner && repo) {
273
+ const unknownIssueIds = [...candidates].filter((id) => !knownStateByIssue.has(id));
274
+ const issueStateCandidates = unknownIssueIds.filter((id) => openPrIssues.has(id) || branchIssues.has(id));
275
+ const issueStateCandidateSet = new Set(issueStateCandidates);
276
+ for (const id of unknownIssueIds) if (!issueStateCandidateSet.has(id)) candidates.delete(id);
277
+ const issueStates = issueStateCandidates.length > 0 ? await deps.listIssueStates(owner, repo, issueStateCandidates.map(issueNumber)) : [];
278
+ const stateByNumber = new Map(issueStates.map((entry) => [entry.number, entry.state]));
279
+ for (const id of issueStateCandidates) {
280
+ const state = stateByNumber.get(issueNumber(id));
281
+ if (state) knownStateByIssue.set(id, state);
282
+ else candidates.delete(id);
283
+ }
284
+ const openCandidates = [...candidates].filter((id) => knownStateByIssue.get(id) === "open");
285
+ const candidateHeads = [...new Set(openCandidates.flatMap((id) => [
286
+ ...headRefsByIssue.get(id) ?? [],
287
+ `feature/${id.toLowerCase()}`,
288
+ `strike/${id.toLowerCase()}`
289
+ ]))];
290
+ const mergedHeads = new Set(await deps.listMergedPullRequestHeads(owner, repo, candidateHeads));
291
+ for (const id of openCandidates) if ([
292
+ ...headRefsByIssue.get(id) ?? [],
293
+ `feature/${id.toLowerCase()}`,
294
+ `strike/${id.toLowerCase()}`
295
+ ].some((head) => mergedHeads.has(head))) mergedPrIssues.add(id);
296
+ }
185
297
  return [...candidates].sort().map((id) => ({
186
298
  issueId: id,
187
- issueOpen: issueOpen.get(id) ?? false,
299
+ issueOpen: knownStateByIssue.get(id) === "open",
188
300
  hasOpenPr: openPrIssues.has(id),
189
301
  hasMergedPr: mergedPrIssues.has(id),
190
302
  hasConventionBranch: branchIssues.has(id),
191
303
  branchUnmerged: unmergedBranchIssues.has(id),
304
+ hasMergedBranchWork: mergedBranchWorkIssues.has(id),
192
305
  phaseLabel: STALE_PIPELINE_LABELS.find((label) => labelsByIssue.get(id)?.includes(label)) ?? null,
193
- hasVbriefSpec: specIssues.has(id),
306
+ hasXbriefSpec: specIssues.has(id),
194
307
  explicitlyReady: labelsByIssue.get(id)?.includes("ready") ?? false
195
308
  }));
196
309
  }
@@ -221,9 +334,11 @@ var init_pipeline_membership_gather = __esmMin((() => {
221
334
  init_github_app();
222
335
  init_concurrency();
223
336
  init_label_reconciler();
337
+ init_config();
224
338
  init_specs();
225
339
  init_projects();
226
340
  init_resource_utils();
341
+ init_factory();
227
342
  execFileAsync = promisify(execFile);
228
343
  GRAPHQL_ALIAS_CHUNK_SIZE = 50;
229
344
  cachedOpenPullRequests = createSettledTtlPromiseCache(3e4);
@@ -233,6 +348,7 @@ var init_pipeline_membership_gather = __esmMin((() => {
233
348
  listOpenPullRequests: listOpenPullRequestsSnapshot,
234
349
  listMergedPullRequestHeads: listMergedPullRequestHeadsBatched,
235
350
  listIssueStates: listIssueStatesBatched,
351
+ listTrackerIssues: listProjectTrackerIssues,
236
352
  listSpecIssueIds: async (projectPath) => (await Effect.runPromise(listSpecs(projectPath))).map((entry) => entry.issueId),
237
353
  run: async (command, args, cwd) => {
238
354
  const { stdout } = await execFileAsync(command, args, {
@@ -285,17 +401,20 @@ function resolvePipelineMembership(s) {
285
401
  }
286
402
  if (s.hasOpenPr) return result("in_flight", "open issue with an open PR — active work");
287
403
  if (s.hasMergedPr) return result("post_merge_limbo", "open issue with a merged PR — merged but never closed out; run close-out");
288
- if (branchLive) return result("planned_backlog", "open issue with an unmerged feature branch but no PR — needs a PR or disposition");
289
- if (s.hasConventionBranch) return result("post_merge_limbo", "open issue whose branch is already in main but with no merged PR — landed via a non-PR path; run close-out");
290
- if (s.hasVbriefSpec) return result("planned_backlog", PLANNED_BACKLOG_SPEC_ONLY_REASON);
404
+ if (branchLive) return result("planned_backlog", "open issue with an unmerged convention branch (feature/ or strike/) but no PR — needs a PR or disposition");
405
+ if (s.hasConventionBranch) {
406
+ if (s.hasMergedBranchWork) return result("post_merge_limbo", "open issue whose branch work is contained in main but with no merged PR — landed via a non-PR path; run close-out");
407
+ return result("planned_backlog", "open issue with a convention branch but no unique commits — created, work not yet landed; needs work or disposition");
408
+ }
409
+ if (s.hasXbriefSpec) return result("planned_backlog", PLANNED_BACKLOG_SPEC_ONLY_REASON);
291
410
  if (s.explicitlyReady) return result("planned_backlog", "open issue carries the explicit ready label — ready to start");
292
411
  return result("clean_terminal", "open issue with no branch and no PR — backlog, never started");
293
412
  }
294
413
  var PLANNED_BACKLOG_SPEC_ONLY_REASON;
295
414
  var init_pipeline_membership = __esmMin((() => {
296
- PLANNED_BACKLOG_SPEC_ONLY_REASON = "open issue with a vBRIEF spec but no branch/PR — planned work whose plan encodes code paths that age; needs starting or re-planning";
415
+ PLANNED_BACKLOG_SPEC_ONLY_REASON = "open issue with an xBRIEF spec but no branch/PR — planned work whose plan encodes code paths that age; needs starting or re-planning";
297
416
  }));
298
417
  //#endregion
299
418
  export { gatherProjectLensSignalsForProjects as a, init_resource_utils as c, gatherProjectLensSignals as i, parseIssueIdFromTextSync as l, init_pipeline_membership as n, init_pipeline_membership_gather as o, resolvePipelineMembership as r, listOpenPullRequestsSnapshot as s, PLANNED_BACKLOG_SPEC_ONLY_REASON as t };
300
419
 
301
- //# sourceMappingURL=pipeline-membership-1LGRjo-k.js.map
420
+ //# sourceMappingURL=pipeline-membership-mY3GprlK.js.map
@@ -1,3 +1,3 @@
1
- import { a as setPipelineHandlerSync, i as setPipelineHandler, n as notifyPipeline, r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-B6FVsYF9.js";
1
+ import { a as setPipelineHandlerSync, i as setPipelineHandler, n as notifyPipeline, r as notifyPipelineSync, t as init_pipeline_notifier } from "./pipeline-notifier-BXkJzDC4.js";
2
2
  init_pipeline_notifier();
3
3
  export { notifyPipeline, notifyPipelineSync, setPipelineHandler, setPipelineHandlerSync };
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin } from "./rolldown-runtime-DNCzzKnI.js";
2
- import { o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-CXsfxslp.js";
2
+ import { o as getInternalTokenSync, s as init_internal_token, t as INTERNAL_TOKEN_HEADER } from "./internal-token-s0-oKybJ.js";
3
3
  import { Effect } from "effect";
4
4
  //#region ../../lib/pipeline-notifier.ts
5
5
  /**
@@ -60,4 +60,4 @@ var init_pipeline_notifier = __esmMin((() => {
60
60
  //#endregion
61
61
  export { setPipelineHandlerSync as a, setPipelineHandler as i, notifyPipeline as n, notifyPipelineSync as r, init_pipeline_notifier as t };
62
62
 
63
- //# sourceMappingURL=pipeline-notifier-B6FVsYF9.js.map
63
+ //# sourceMappingURL=pipeline-notifier-BXkJzDC4.js.map