@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
@@ -12,7 +12,7 @@ tools:
12
12
 
13
13
  # Overdeck Inspect Agent
14
14
 
15
- Per-item specification verifier. Runs against the scoped diff of a single vBRIEF item.
15
+ Per-item specification verifier. Runs against the scoped diff of a single xBRIEF item.
16
16
 
17
17
  ## Responsibilities
18
18
 
@@ -17,7 +17,7 @@ Merge specialist. Runs after review + test specialists pass and the human clicks
17
17
  4. Re-run verification gates (typecheck, lint, test) after the rebase
18
18
  5. Push the rebased branch
19
19
  6. Run `gh pr merge --squash` to land the PR
20
- 7. Trigger `postMergeLifecycle` cleanup (Docker network/container cleanup, vBRIEF transition to completed/, vBRIEF tasks close)
20
+ 7. Trigger `postMergeLifecycle` cleanup (Docker network/container cleanup, xBRIEF lifecycle completion, task-state finalization)
21
21
 
22
22
  ## Boundaries
23
23
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pan-planning-agent
3
- description: Overdeck planning agent — researches the issue and writes the executable vBRIEF plan. Never writes implementation code.
3
+ description: Overdeck planning agent — researches the issue and writes the executable xBRIEF plan. Never writes implementation code.
4
4
  model: sonnet
5
5
  permissionMode: bypassPermissions
6
6
  effort: high
@@ -13,9 +13,9 @@ Research-only agent that produces an executable plan for an issue. Never writes
13
13
  ## Outputs
14
14
 
15
15
  1. **PRD draft** in `<projectRoot>/.pan/drafts/<ISSUE-ID>.md` if missing (markdown narrative)
16
- 2. **vBRIEF plan** in `.pan/spec.vbrief.json` (workspace working copy — `plan-finalize` promotes it to main's canonical `.pan/specs/`)
16
+ 2. **xBRIEF plan** in `.pan/spec.vbrief.json` (deliberate legacy-compatible workspace path; `plan-finalize` promotes it to canonical state)
17
17
  3. **Continue context** in `.pan/continue.json` with decisions, hazards, and a clear `resumePoint` for the implementation agent
18
- `pan plan-finalize` stamps the plan and writes the canonical spec to `<projectRoot>/.pan/specs/<YYYY-MM-DD>-<ISSUE>-<slug>.vbrief.json` with `plan.status: "proposed"`. Work agents read the spec from main — item/subItem status changes live in the workspace continue file's `statusOverrides` map, not in the spec itself.
18
+ `pan plan-finalize` stamps the plan and writes the canonical spec to `specs/<YYYY-MM-DD>-<ISSUE>-<slug>.xbrief.json` on `overdeck-state` with `plan.status: "proposed"`. Work agents read the immutable canonical spec through the read door — item/subItem status changes live in the workspace continue file's `statusOverrides` map, not in the spec itself.
19
19
 
20
20
  ## Process
21
21
 
@@ -34,4 +34,4 @@ Status is a JSON field, not a directory. `plan.status` advances `draft → propo
34
34
 
35
35
  - No implementation code. No commits to feature files. The implementation agent does that.
36
36
  - Caveman compression is disabled for this agent — narrative fields in continue.json must remain full prose so crash recovery and downstream specialists have the context they need.
37
- - Planning ends at finalization; implementation agents claim and complete vBRIEF items through `pan task`.
37
+ - Planning ends at finalization; implementation agents claim and complete xBRIEF items through `pan task`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: pan-work-agent
3
- description: Autonomous Overdeck implementation agent — claims vBRIEF items, writes code, commits per item, and signals completion via pan done.
3
+ description: Autonomous Overdeck implementation agent — claims xBRIEF items, writes code, commits per item, and signals completion via pan done.
4
4
  model: sonnet
5
5
  permissionMode: bypassPermissions
6
6
  effort: high
@@ -29,7 +29,7 @@ Current expectations in this repo:
29
29
  - `workspace`
30
30
  - `cli`
31
31
  - `review`
32
- - `vBRIEF tasks`
32
+ - `beads`
33
33
  - `db`
34
34
  - `specialists`
35
35
  - `terminal`
@@ -191,7 +191,7 @@ If merge-agent can't complete:
191
191
  cd ~/Projects/overdeck
192
192
  git status
193
193
 
194
- # If .vBRIEF tasks/ files are modified, that's OK (should be ignored)
194
+ # Workspace `.overdeck/` runtime files are gitignored and should not be staged
195
195
  # Other uncommitted changes need to be committed or stashed
196
196
  ```
197
197
 
@@ -25962,9 +25962,11 @@ function stateMigrationLockPath(projectKey) {
25962
25962
  return join$1(getOverdeckHome(), "locks", "state-migration", `${projectKey}.lock`);
25963
25963
  }
25964
25964
  function isStateMigrationLocked(projectKey) {
25965
+ const path = stateMigrationLockPath(projectKey);
25966
+ mkdirSync$1(dirname$1(path), { recursive: true });
25965
25967
  try {
25966
- closeSync$1(openSync$1(stateMigrationLockPath(projectKey), "wx"));
25967
- rmSync(stateMigrationLockPath(projectKey));
25968
+ closeSync$1(openSync$1(path, "wx"));
25969
+ rmSync(path);
25968
25970
  return false;
25969
25971
  } catch {
25970
25972
  return true;
@@ -26025,7 +26027,9 @@ async function isStatePlaneOnlyDiff(baseSha, tipSha, repoRoot) {
26025
26027
  * sync-state-via-commit shape this helper produces is the substrate for that.
26026
26028
  */
26027
26029
  const spawnerLayer = layer$4.pipe(provide$2(mergeAll(layer$2, layer)));
26030
+ const DEFAULT_STATE_GIT_TIMEOUT_MS = 3e4;
26028
26031
  const DEFAULT_STATE_PUSH_TIMEOUT_MS = 3e4;
26032
+ const DEFAULT_STATE_FLUSH_TIMEOUT_MS = 6e4;
26029
26033
  function parsePositiveInteger(value, fallback) {
26030
26034
  if (!value) return fallback;
26031
26035
  const parsed = Number(value);
@@ -26054,9 +26058,10 @@ function isAutoCommitExcludedPath(relativePath) {
26054
26058
  return false;
26055
26059
  }
26056
26060
  const pending = /* @__PURE__ */ new Map();
26057
- let serializer = Promise.resolve();
26061
+ const active = /* @__PURE__ */ new Map();
26062
+ const serializers = /* @__PURE__ */ new Map();
26058
26063
  /** Run a git subcommand. Fails with GitError on non-zero exit. */
26059
- function runGit(args, cwd) {
26064
+ function runGitRaw(args, cwd) {
26060
26065
  return gen(function* () {
26061
26066
  const handle = yield* make$1("git", [...args], {
26062
26067
  cwd,
@@ -26076,10 +26081,13 @@ function runGit(args, cwd) {
26076
26081
  stderr: stderrBuf.toString("utf-8"),
26077
26082
  exitCode
26078
26083
  };
26079
- }).pipe(scoped, provide(spawnerLayer), catchCause((cause) => fail(causeToGitError(cause, args))));
26084
+ }).pipe(scoped, provide(spawnerLayer));
26085
+ }
26086
+ function runGit(args, cwd) {
26087
+ return runGitWithTimeout(args, cwd, parsePositiveInteger(process.env.OVERDECK_STATE_GIT_TIMEOUT_MS, DEFAULT_STATE_GIT_TIMEOUT_MS));
26080
26088
  }
26081
26089
  function runGitWithTimeout(args, cwd, timeoutMs) {
26082
- return runGit(args, cwd).pipe(timeout(millis(timeoutMs)), catchCause((cause) => fail(causeToGitError(cause, args))));
26090
+ return runGitRaw(args, cwd).pipe(timeout(millis(timeoutMs)), catchCause((cause) => fail(causeToGitError(cause, args))));
26083
26091
  }
26084
26092
  function causeToGitError(cause, args) {
26085
26093
  const squashed = squash(cause);
@@ -26139,31 +26147,120 @@ function queueAutoCommit(opts) {
26139
26147
  });
26140
26148
  }
26141
26149
  /**
26142
- * Force a flush of any pending commits for `projectRoot`. Returns an Effect that
26143
- * resolves after the commit attempt (success or no-op).
26150
+ * Force a flush of every pending or active commit that targets the same Git
26151
+ * checkout as `projectRoot`. Callers may pass either a logical project root or
26152
+ * the effective Git root; the Effect resolves only after every matching writer
26153
+ * has settled.
26144
26154
  */
26145
- function flushAutoCommits(projectRoot) {
26146
- return promise(() => flushPromise(projectRoot));
26155
+ function flushAutoCommits(projectRoot, signal) {
26156
+ return promise(() => flushPromise(projectRoot, signal));
26147
26157
  }
26148
- function flushPromise(projectRoot) {
26149
- const batch = pending.get(projectRoot);
26150
- if (!batch) return Promise.resolve({
26151
- committed: false,
26152
- reason: "no pending"
26153
- });
26154
- clearTimeout(batch.timer);
26155
- return flushInner(projectRoot);
26158
+ function flushPromise(projectRoot, signal) {
26159
+ const gitRoot = pending.get(projectRoot)?.repoRoot ?? active.get(projectRoot)?.gitRoot ?? projectRoot;
26160
+ const matching = /* @__PURE__ */ new Set();
26161
+ for (const [queuedProjectRoot, batch] of pending) {
26162
+ if ((batch.repoRoot ?? queuedProjectRoot) !== gitRoot) continue;
26163
+ clearTimeout(batch.timer);
26164
+ const started = flushInner(queuedProjectRoot);
26165
+ if (started) matching.add(started);
26166
+ }
26167
+ for (const activeFlush of active.values()) if (activeFlush.gitRoot === gitRoot) matching.add(activeFlush);
26168
+ if (matching.size === 0) {
26169
+ signal?.throwIfAborted();
26170
+ return Promise.resolve({
26171
+ committed: false,
26172
+ reason: "no pending"
26173
+ });
26174
+ }
26175
+ return waitForFlushes(gitRoot, [...matching], signal);
26156
26176
  }
26157
26177
  function flushInner(projectRoot) {
26158
26178
  const batch = pending.get(projectRoot);
26159
- if (!batch) return Promise.resolve({
26160
- committed: false,
26161
- reason: "no pending"
26162
- });
26179
+ if (!batch) return active.get(projectRoot);
26163
26180
  pending.delete(projectRoot);
26164
- const task = serializer.then(() => runPromise(doCommit(projectRoot, batch)));
26165
- serializer = task.catch(() => void 0);
26166
- return task;
26181
+ return startSerializedFlush(projectRoot, batch.repoRoot ?? projectRoot, doBoundedCommit(projectRoot, batch));
26182
+ }
26183
+ function startSerializedFlush(projectRoot, gitRoot, operation) {
26184
+ const prior = serializers.get(gitRoot) ?? Promise.resolve();
26185
+ const controller = new AbortController();
26186
+ const promise = prior.then(() => {
26187
+ controller.signal.throwIfAborted();
26188
+ return runPromise(operation, { signal: controller.signal });
26189
+ });
26190
+ const activeFlush = {
26191
+ controller,
26192
+ gitRoot,
26193
+ promise
26194
+ };
26195
+ active.set(projectRoot, activeFlush);
26196
+ const tail = promise.catch(() => void 0);
26197
+ serializers.set(gitRoot, tail);
26198
+ promise.then(() => clearActiveFlush(projectRoot, activeFlush, tail), () => clearActiveFlush(projectRoot, activeFlush, tail));
26199
+ return activeFlush;
26200
+ }
26201
+ async function waitForFlushes(gitRoot, activeFlushes, signal) {
26202
+ const completion = Promise.all(activeFlushes.map((flush) => flush.promise)).then(combineFlushResults);
26203
+ if (!signal) return completion;
26204
+ if (signal.aborted) {
26205
+ await abortAndSettleGitRoot(gitRoot, signal.reason);
26206
+ throw signal.reason;
26207
+ }
26208
+ return new Promise((resolve, reject) => {
26209
+ let completed = false;
26210
+ const onAbort = () => {
26211
+ if (completed) return;
26212
+ completed = true;
26213
+ signal.removeEventListener("abort", onAbort);
26214
+ abortAndSettleGitRoot(gitRoot, signal.reason).then(() => reject(signal.reason), reject);
26215
+ };
26216
+ signal.addEventListener("abort", onAbort, { once: true });
26217
+ completion.then((result) => {
26218
+ if (completed) return;
26219
+ completed = true;
26220
+ signal.removeEventListener("abort", onAbort);
26221
+ resolve(result);
26222
+ }, (error) => {
26223
+ if (completed) return;
26224
+ completed = true;
26225
+ signal.removeEventListener("abort", onAbort);
26226
+ reject(error);
26227
+ });
26228
+ if (signal.aborted) onAbort();
26229
+ });
26230
+ }
26231
+ function combineFlushResults(results) {
26232
+ if (results.length === 1) return results[0];
26233
+ const combined = { committed: results.some((result) => result.committed) };
26234
+ const committed = results.filter((result) => result.committed);
26235
+ if (committed.some((result) => result.pushed === false)) combined.pushed = false;
26236
+ else if (committed.length > 0 && committed.every((result) => result.pushed === true)) combined.pushed = true;
26237
+ if (results.some((result) => result.errored)) combined.errored = true;
26238
+ const reasons = results.flatMap((result) => result.reason ? [result.reason] : []);
26239
+ if (reasons.length > 0) combined.reason = reasons.join("; ");
26240
+ return combined;
26241
+ }
26242
+ async function abortAndSettleGitRoot(gitRoot, reason) {
26243
+ const matching = [...active.values()].filter((flush) => flush.gitRoot === gitRoot);
26244
+ for (const flush of matching) flush.controller.abort(reason);
26245
+ await Promise.allSettled(matching.map((flush) => flush.promise));
26246
+ }
26247
+ function clearActiveFlush(projectRoot, activeFlush, tail) {
26248
+ if (active.get(projectRoot) === activeFlush) active.delete(projectRoot);
26249
+ if (serializers.get(activeFlush.gitRoot) === tail) serializers.delete(activeFlush.gitRoot);
26250
+ }
26251
+ function doBoundedCommit(projectRoot, batch) {
26252
+ return boundStateFlush(doCommit(projectRoot, batch));
26253
+ }
26254
+ function boundStateFlush(operation, timeoutMs = parsePositiveInteger(process.env.OVERDECK_STATE_FLUSH_TIMEOUT_MS, DEFAULT_STATE_FLUSH_TIMEOUT_MS)) {
26255
+ return operation.pipe(timeout(millis(timeoutMs)), catchCause((cause) => {
26256
+ const reason = `state writer timed out after ${timeoutMs / 1e3}s: ${String(squash(cause))}`;
26257
+ console.warn(`[pan-dir/auto-commit] ${reason}`);
26258
+ return succeed({
26259
+ committed: false,
26260
+ errored: true,
26261
+ reason
26262
+ });
26263
+ }));
26167
26264
  }
26168
26265
  function doCommit(projectRoot, batch) {
26169
26266
  const gitRoot = batch.repoRoot ?? projectRoot;
@@ -26443,10 +26540,10 @@ function getIssueRecordBasePath(project, issueId) {
26443
26540
  */
26444
26541
  function preserveCloseOutSync(path, record) {
26445
26542
  const incoming = record.closeOut;
26446
- if (!(!incoming || Object.keys(incoming.usage?.byStage ?? {}).length === 0 && Object.keys(incoming.usage?.totals ?? {}).length === 0 && (incoming.merges ?? []).length === 0) || !existsSync$1(path)) return record;
26543
+ if (!(!incoming || Object.keys(incoming.usage?.byStage ?? {}).length === 0 && Object.keys(incoming.usage?.totals ?? {}).length === 0 && (incoming.merges ?? []).length === 0 && !incoming.dodGate) || !existsSync$1(path)) return record;
26447
26544
  try {
26448
26545
  const disk = JSON.parse(readFileSync$1(path, "utf-8")).closeOut;
26449
- if (disk && (Object.keys(disk.usage?.byStage ?? {}).length > 0 || Object.keys(disk.usage?.totals ?? {}).length > 0 || (disk.merges ?? []).length > 0)) {
26546
+ if (disk && (Object.keys(disk.usage?.byStage ?? {}).length > 0 || Object.keys(disk.usage?.totals ?? {}).length > 0 || (disk.merges ?? []).length > 0 || Boolean(disk.dodGate))) {
26450
26547
  console.warn(`[record] Preserving populated closeOut for ${record.issueId} — incoming write carried an empty closeOut (PAN-2466 guard)`);
26451
26548
  return {
26452
26549
  ...record,
@@ -26490,7 +26587,7 @@ function preserveCorruptRecordSync(path) {
26490
26587
  * renamed file parses as JSON. A mid-write crash can no longer truncate the
26491
26588
  * record in place (rename is atomic); a write that somehow produces unparseable
26492
26589
  * bytes throws instead of leaving a corrupt record for readers to silently
26493
- * fabricate over. Modeled on writePlanFileAtomic (src/lib/vbrief/dag-cli.ts:101).
26590
+ * fabricate over. Modeled on writePlanFileAtomic (src/lib/xbrief/dag-cli.ts:101).
26494
26591
  */
26495
26592
  function writeRecordFileAtomicSync(path, record) {
26496
26593
  preserveCorruptRecordSync(path);
@@ -28024,7 +28121,8 @@ function validateRoleFields(role, roleConfig) {
28024
28121
  if (!Number.isInteger(entry.weight) || entry.weight <= 0) throw new Error(`config.yaml: roles.${role}.model[${i}].weight must be a positive integer`);
28025
28122
  }
28026
28123
  }
28027
- if (roleConfig.harness !== void 0 && roleConfig.harness !== "claude-code" && roleConfig.harness !== "ohmypi" && roleConfig.harness !== "codex") throw new Error(`config.yaml: roles.${role}.harness must be claude-code, ohmypi, or codex`);
28124
+ if (roleConfig.autonomousModel !== void 0 && typeof roleConfig.autonomousModel !== "string") throw new Error(`config.yaml: roles.${role}.autonomousModel must be a scalar model reference`);
28125
+ if (roleConfig.harness !== void 0 && roleConfig.harness !== "claude-code" && roleConfig.harness !== "ohmypi" && roleConfig.harness !== "codex" && roleConfig.harness !== "acp") throw new Error(`config.yaml: roles.${role}.harness must be claude-code, ohmypi, codex, or acp`);
28028
28126
  if (roleConfig.effort !== void 0 && !ROLE_EFFORTS.includes(roleConfig.effort)) throw new Error(`config.yaml: roles.${role}.effort must be one of ${ROLE_EFFORTS.join(", ")}`);
28029
28127
  if (roleConfig.mode !== void 0 && roleConfig.mode !== "quick" && roleConfig.mode !== "full" && roleConfig.mode !== "none") throw new Error(`config.yaml: roles.${role}.mode must be quick, full, or none`);
28030
28128
  if (roleConfig.reReviewScope !== void 0 && roleConfig.reReviewScope !== "all" && roleConfig.reReviewScope !== "changed" && roleConfig.reReviewScope !== "blockers") throw new Error(`config.yaml: roles.${role}.reReviewScope must be all, changed, or blockers`);
@@ -28041,6 +28139,7 @@ function validateRoleModelRefs(config) {
28041
28139
  }
28042
28140
  for (const [role, roleConfig] of Object.entries(config.roles ?? {})) {
28043
28141
  validateRoleFields(role, roleConfig);
28142
+ if (typeof roleConfig.autonomousModel === "string") derefWorkhorse(roleConfig.autonomousModel, config, `roles.${role}.autonomousModel`);
28044
28143
  if (Array.isArray(roleConfig.model)) for (let i = 0; i < roleConfig.model.length; i++) derefWorkhorse(roleConfig.model[i].model, config, `roles.${role}.model[${i}].model`);
28045
28144
  else if (roleConfig.model) {
28046
28145
  const resolvedModel = derefWorkhorse(roleConfig.model, config, `roles.${role}.model`);
@@ -28637,7 +28736,7 @@ const DEFAULT_TIERED_EXECUTION_CONFIG = {
28637
28736
  difficultyToTier: {}
28638
28737
  };
28639
28738
  function isRuntimeName(value) {
28640
- return value === "claude-code" || value === "ohmypi" || value === "codex";
28739
+ return value === "claude-code" || value === "ohmypi" || value === "codex" || value === "acp";
28641
28740
  }
28642
28741
  function isDifficulty(value) {
28643
28742
  return TIERED_EXECUTION_DIFFICULTIES.includes(value);
@@ -28660,7 +28759,7 @@ function knownModelIds() {
28660
28759
  return ids;
28661
28760
  }
28662
28761
  function validateHarness(harness, path) {
28663
- if (!isRuntimeName(harness)) throw new TieredExecutionConfigError(`${path}.harness '${harness}' is unknown; expected claude-code, ohmypi, or codex`);
28762
+ if (!isRuntimeName(harness)) throw new TieredExecutionConfigError(`${path}.harness '${harness}' is unknown; expected claude-code, ohmypi, codex, or acp`);
28664
28763
  }
28665
28764
  function validateModel(model, path) {
28666
28765
  const resolved = resolveModelIdSync(model);
@@ -29191,7 +29290,7 @@ function normalizeProviderConfig(providerConfig, fallbackKey) {
29191
29290
  };
29192
29291
  }
29193
29292
  function validateProviderHarness(provider, harness) {
29194
- if (harness !== void 0 && harness !== "claude-code" && harness !== "ohmypi" && harness !== "codex") throw new Error(`config.yaml: models.providers.${provider}.harness must be claude-code, ohmypi, or codex`);
29293
+ if (harness !== void 0 && harness !== "claude-code" && harness !== "ohmypi" && harness !== "codex" && harness !== "acp") throw new Error(`config.yaml: models.providers.${provider}.harness must be claude-code, ohmypi, codex, or acp`);
29195
29294
  }
29196
29295
  function applyProviderHarness(result, provider, harness) {
29197
29296
  validateProviderHarness(provider, harness);
@@ -32263,7 +32362,196 @@ function getOverdeckDatabasePath() {
32263
32362
  return join$1(getOverdeckHome(), "overdeck.db");
32264
32363
  }
32265
32364
  //#endregion
32365
+ //#region ../../src/lib/overdeck/schema-audit.ts
32366
+ const EMPTY_TOP_UP_EXPECTATIONS = {
32367
+ columns: [],
32368
+ indexes: []
32369
+ };
32370
+ function splitTableDefinitions(body) {
32371
+ const definitions = [];
32372
+ let start = 0;
32373
+ let depth = 0;
32374
+ let quote = null;
32375
+ for (let index = 0; index < body.length; index += 1) {
32376
+ const character = body[index];
32377
+ if (quote) {
32378
+ if (character === quote && body[index - 1] !== "\\") quote = null;
32379
+ continue;
32380
+ }
32381
+ if (character === "'" || character === "\"" || character === "`") {
32382
+ quote = character;
32383
+ continue;
32384
+ }
32385
+ if (character === "(") depth += 1;
32386
+ if (character === ")") depth -= 1;
32387
+ if (character === "," && depth === 0) {
32388
+ definitions.push(body.slice(start, index).trim());
32389
+ start = index + 1;
32390
+ }
32391
+ }
32392
+ definitions.push(body.slice(start).trim());
32393
+ return definitions.filter(Boolean);
32394
+ }
32395
+ function parseOverdeckSchemaExpectations(migrationSql, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
32396
+ const tables = /* @__PURE__ */ new Map();
32397
+ const indexes = /* @__PURE__ */ new Set();
32398
+ for (const statement of migrationSql.split("--> statement-breakpoint")) {
32399
+ const trimmed = statement.trim();
32400
+ const tableMatch = trimmed.match(/^CREATE TABLE(?: IF NOT EXISTS)?\s+`([^`]+)`\s*\(([\s\S]*)\)\s*;?$/i);
32401
+ if (tableMatch) {
32402
+ const [, tableName, body] = tableMatch;
32403
+ const columns = /* @__PURE__ */ new Set();
32404
+ for (const definition of splitTableDefinitions(body)) {
32405
+ const columnMatch = definition.match(/^`([^`]+)`\s+/);
32406
+ if (columnMatch) columns.add(columnMatch[1]);
32407
+ }
32408
+ tables.set(tableName, columns);
32409
+ continue;
32410
+ }
32411
+ const indexMatch = trimmed.match(/^CREATE (?:UNIQUE )?INDEX(?: IF NOT EXISTS)?\s+`([^`]+)`\s+ON\s+`[^`]+`/i);
32412
+ if (indexMatch) indexes.add(indexMatch[1]);
32413
+ }
32414
+ for (const { table, column } of topUps.columns) {
32415
+ const columns = tables.get(table) ?? /* @__PURE__ */ new Set();
32416
+ columns.add(column);
32417
+ tables.set(table, columns);
32418
+ }
32419
+ for (const index of topUps.indexes) indexes.add(index);
32420
+ return {
32421
+ tables,
32422
+ indexes
32423
+ };
32424
+ }
32425
+ function readOverdeckSchemaExpectationsSync(topUps = EMPTY_TOP_UP_EXPECTATIONS) {
32426
+ return parseOverdeckSchemaExpectations(readFileSync$1(OVERDECK_MIGRATION_PATH, "utf8"), topUps);
32427
+ }
32428
+ function quoteIdentifier(identifier) {
32429
+ return `"${identifier.replaceAll("\"", "\"\"")}"`;
32430
+ }
32431
+ function auditOverdeckSchemaSync(db, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
32432
+ const expected = readOverdeckSchemaExpectationsSync(topUps);
32433
+ const artifacts = db.prepare(`
32434
+ SELECT type, name
32435
+ FROM sqlite_master
32436
+ WHERE type IN ('table', 'index')
32437
+ AND name NOT LIKE 'sqlite_%'
32438
+ `).all();
32439
+ const actualTables = new Set(artifacts.filter((artifact) => artifact.type === "table").map((artifact) => artifact.name));
32440
+ const actualIndexes = new Set(artifacts.filter((artifact) => artifact.type === "index").map((artifact) => artifact.name));
32441
+ const missingTables = [...expected.tables.keys()].filter((table) => !actualTables.has(table)).sort();
32442
+ const missingIndexes = [...expected.indexes].filter((index) => !actualIndexes.has(index)).sort();
32443
+ const missingColumns = [];
32444
+ for (const [table, expectedColumns] of expected.tables) {
32445
+ if (!actualTables.has(table)) continue;
32446
+ const actualColumns = new Set(db.prepare(`PRAGMA table_info(${quoteIdentifier(table)})`).all().map((column) => column.name));
32447
+ for (const column of expectedColumns) if (!actualColumns.has(column)) missingColumns.push({
32448
+ table,
32449
+ column
32450
+ });
32451
+ }
32452
+ missingColumns.sort((left, right) => left.table === right.table ? left.column.localeCompare(right.column) : left.table.localeCompare(right.table));
32453
+ return {
32454
+ missingTables,
32455
+ missingIndexes,
32456
+ missingColumns
32457
+ };
32458
+ }
32459
+ //#endregion
32266
32460
  //#region ../../src/lib/overdeck/infra.ts
32461
+ /**
32462
+ * Runtime infrastructure for the canonical overdeck.db cache.
32463
+ * Schema top-ups tolerate idempotency errors, log unexpected failures without
32464
+ * blocking boot, and getOverdeckDatabaseSync follows them with a report-only
32465
+ * schema audit that warns about drift without mutating the database.
32466
+ */
32467
+ const OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS = {
32468
+ columns: [
32469
+ {
32470
+ table: "discovered_sessions",
32471
+ column: "harness"
32472
+ },
32473
+ {
32474
+ table: "flywheel_substrate_bugs",
32475
+ column: "affected_criteria"
32476
+ },
32477
+ {
32478
+ table: "review_status",
32479
+ column: "release_status"
32480
+ },
32481
+ {
32482
+ table: "review_status",
32483
+ column: "release_notes"
32484
+ },
32485
+ {
32486
+ table: "review_status",
32487
+ column: "inspect_owner_session"
32488
+ },
32489
+ {
32490
+ table: "review_status",
32491
+ column: "strike_ready_head"
32492
+ },
32493
+ {
32494
+ table: "review_status",
32495
+ column: "strike_ready_at"
32496
+ },
32497
+ {
32498
+ table: "review_status",
32499
+ column: "strike_landing_state"
32500
+ },
32501
+ {
32502
+ table: "review_status",
32503
+ column: "strike_recovery_count"
32504
+ },
32505
+ {
32506
+ table: "review_status",
32507
+ column: "strike_landing_attempts"
32508
+ },
32509
+ {
32510
+ table: "agents",
32511
+ column: "yielded_by_scheduler"
32512
+ },
32513
+ {
32514
+ table: "agents",
32515
+ column: "review_discovery_pending"
32516
+ },
32517
+ {
32518
+ table: "agents",
32519
+ column: "review_context_manifest_path"
32520
+ },
32521
+ {
32522
+ table: "agents",
32523
+ column: "review_discovery_ready_at"
32524
+ },
32525
+ {
32526
+ table: "agents",
32527
+ column: "review_convoy_forked_at"
32528
+ },
32529
+ {
32530
+ table: "agents",
32531
+ column: "review_fork_cache_checked"
32532
+ },
32533
+ {
32534
+ table: "agents",
32535
+ column: "review_forked_from_parent"
32536
+ },
32537
+ {
32538
+ table: "agents",
32539
+ column: "yielded_at"
32540
+ },
32541
+ {
32542
+ table: "agents",
32543
+ column: "last_yield_resume_at"
32544
+ }
32545
+ ],
32546
+ indexes: [
32547
+ "cost_session_id_idx",
32548
+ "idx_cost_agent_id",
32549
+ "idx_cost_issue_upper",
32550
+ "release_sets_project_idx",
32551
+ "release_set_components_issue_component_idx",
32552
+ "release_set_components_issue_order_idx"
32553
+ ]
32554
+ };
32267
32555
  const overdeckEvents = sqliteTable("events", {
32268
32556
  sequence: integer("sequence").primaryKey({ autoIncrement: true }),
32269
32557
  type: text("type").notNull(),
@@ -32282,56 +32570,50 @@ function runOverdeckMigrationSync(db) {
32282
32570
  }
32283
32571
  }
32284
32572
  /**
32573
+ * Run one idempotent schema top-up without hiding unexpected SQLite failures.
32574
+ * Only duplicate DDL is silent; missing tables and other failures are logged so
32575
+ * schema drift remains observable without blocking later top-ups or startup.
32576
+ */
32577
+ function runSchemaTopUp(db, statement) {
32578
+ try {
32579
+ db.exec(statement);
32580
+ } catch (error) {
32581
+ const message = error instanceof Error ? error.message : String(error);
32582
+ if (/duplicate column name|already exists/i.test(message)) return;
32583
+ console.error(`[schema] top-up failed: ${statement}\n${message}`);
32584
+ }
32585
+ }
32586
+ /**
32285
32587
  * Idempotent schema top-ups for databases created before a field/index existed
32286
32588
  * in the init migration. The init migration only runs on a fresh database.
32287
32589
  * PAN-2220: the conversation ledger-cost query joins cost_events on session_id;
32288
32590
  * without this index SQLite builds an automatic index on every query (~76ms → 7ms).
32289
32591
  */
32290
32592
  function ensureRuntimeIndexesSync(db) {
32291
- try {
32292
- db.exec("ALTER TABLE `discovered_sessions` ADD COLUMN `harness` text");
32293
- } catch {}
32294
- try {
32295
- db.exec("UPDATE `discovered_sessions` SET `harness` = 'claude-code' WHERE `harness` IS NULL");
32296
- } catch {}
32297
- try {
32298
- db.exec("ALTER TABLE `review_status` ADD COLUMN `release_status` text");
32299
- } catch {}
32300
- try {
32301
- db.exec("ALTER TABLE `review_status` ADD COLUMN `release_notes` text");
32302
- } catch {}
32593
+ runSchemaTopUp(db, "ALTER TABLE `discovered_sessions` ADD COLUMN `harness` text");
32594
+ runSchemaTopUp(db, "UPDATE `discovered_sessions` SET `harness` = 'claude-code' WHERE `harness` IS NULL");
32595
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_status` text");
32596
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_notes` text");
32597
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `inspect_owner_session` text");
32598
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_head` text");
32599
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_at` integer");
32600
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_state` text");
32601
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_recovery_count` integer DEFAULT 0");
32602
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_attempts` text");
32303
32603
  ensureReleaseSetTablesSync(db);
32304
- try {
32305
- db.exec("ALTER TABLE `flywheel_substrate_bugs` ADD COLUMN `affected_criteria` text");
32306
- } catch {}
32307
- db.exec("CREATE INDEX IF NOT EXISTS `cost_session_id_idx` ON `cost_events` (`session_id`)");
32308
- try {
32309
- db.exec("ALTER TABLE `agents` ADD COLUMN `yielded_by_scheduler` integer");
32310
- } catch {}
32311
- try {
32312
- db.exec("ALTER TABLE `agents` ADD COLUMN `review_discovery_pending` integer");
32313
- } catch {}
32314
- try {
32315
- db.exec("ALTER TABLE `agents` ADD COLUMN `review_context_manifest_path` text");
32316
- } catch {}
32317
- try {
32318
- db.exec("ALTER TABLE `agents` ADD COLUMN `review_discovery_ready_at` integer");
32319
- } catch {}
32320
- try {
32321
- db.exec("ALTER TABLE `agents` ADD COLUMN `review_convoy_forked_at` integer");
32322
- } catch {}
32323
- try {
32324
- db.exec("ALTER TABLE `agents` ADD COLUMN `review_fork_cache_checked` integer");
32325
- } catch {}
32326
- try {
32327
- db.exec("ALTER TABLE `agents` ADD COLUMN `review_forked_from_parent` integer");
32328
- } catch {}
32329
- try {
32330
- db.exec("ALTER TABLE `agents` ADD COLUMN `yielded_at` integer");
32331
- } catch {}
32332
- try {
32333
- db.exec("ALTER TABLE `agents` ADD COLUMN `last_yield_resume_at` integer");
32334
- } catch {}
32604
+ runSchemaTopUp(db, "ALTER TABLE `flywheel_substrate_bugs` ADD COLUMN `affected_criteria` text");
32605
+ runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `cost_session_id_idx` ON `cost_events` (`session_id`)");
32606
+ runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_agent_id` ON `cost_events` (`agent_id`, `ts`)");
32607
+ runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_issue_upper` ON `cost_events` (UPPER(`issue_id`))");
32608
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_by_scheduler` integer");
32609
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_pending` integer");
32610
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_context_manifest_path` text");
32611
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_ready_at` integer");
32612
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_convoy_forked_at` integer");
32613
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_fork_cache_checked` integer");
32614
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_forked_from_parent` integer");
32615
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_at` integer");
32616
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `last_yield_resume_at` integer");
32335
32617
  }
32336
32618
  /**
32337
32619
  * Idempotent schema top-up for release set tables (PAN-399). Existing overdeck.db
@@ -32373,6 +32655,17 @@ function ensureReleaseSetTablesSync(db) {
32373
32655
  db.exec("CREATE UNIQUE INDEX IF NOT EXISTS `release_set_components_issue_component_idx` ON `release_set_components` (`issue_id`,`component_key`)");
32374
32656
  db.exec("CREATE INDEX IF NOT EXISTS `release_set_components_issue_order_idx` ON `release_set_components` (`issue_id`,`release_order`,`component_key`)");
32375
32657
  }
32658
+ function warnSchemaDriftSync(db) {
32659
+ try {
32660
+ const report = auditOverdeckSchemaSync(db, OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS);
32661
+ for (const table of report.missingTables) console.warn(`[schema-audit] missing table: ${table}`);
32662
+ for (const index of report.missingIndexes) console.warn(`[schema-audit] missing index: ${index}`);
32663
+ for (const { table, column } of report.missingColumns) console.warn(`[schema-audit] missing column: ${table}.${column}`);
32664
+ } catch (error) {
32665
+ const message = error instanceof Error ? error.message : String(error);
32666
+ console.warn(`[schema-audit] audit failed: ${message}`);
32667
+ }
32668
+ }
32376
32669
  function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
32377
32670
  if (overdeckDbSync?.path === dbPath) return overdeckDbSync.db;
32378
32671
  if (overdeckDbSync) {
@@ -32387,6 +32680,7 @@ function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
32387
32680
  db.pragma("synchronous = NORMAL");
32388
32681
  runOverdeckMigrationSync(db);
32389
32682
  ensureRuntimeIndexesSync(db);
32683
+ warnSchemaDriftSync(db);
32390
32684
  overdeckDbSync = {
32391
32685
  path: dbPath,
32392
32686
  db