@overdeck/desktop 0.45.21 → 0.45.23

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 (387) hide show
  1. package/package.json +1 -1
  2. package/server/{acceptance-criteria-CJIFA8Vg.js → acceptance-criteria-DOA0KgXx.js} +5 -5
  3. package/server/{advancing-selfheal-CPOBO5ZS.js → advancing-selfheal-BBu6DSNm.js} +6 -6
  4. package/server/{agent-gc-D6PUckBB.js → agent-gc-BV1q_2EV.js} +4 -4
  5. package/server/agent-state-Bg0lhqwj.js +3 -0
  6. package/server/{agent-state-service-DHwemt96.js → agent-state-service-CnzFKSAQ.js} +1 -1
  7. package/server/{agent-state-service-6MFQqnFy.js → agent-state-service-HoK8U4jW.js} +5 -5
  8. package/server/{agents-DbrHWunF.js → agents-B4Bjbkfv.js} +4 -4
  9. package/server/agents-FlIgQ3ql.js +3 -0
  10. package/server/{archive-planning-BOnwJq8M.js → archive-planning-DYrYojxl.js} +31 -7
  11. package/server/{archive-planning-MPpvQJL4.js → archive-planning-zkJb3BeM.js} +1 -1
  12. package/server/{artifact-index-jobs-BOoySTKD.js → artifact-index-jobs-C-xy7Z5v.js} +2 -2
  13. package/server/{backlog-auto-trigger-BUaFI44J.js → backlog-auto-trigger-GtG71X8H.js} +3 -3
  14. package/server/{behavior-Dg-D8eBG.js → behavior-B_-4EKF3.js} +2 -2
  15. package/server/{briefing-freshness-OouGbJ7d.js → briefing-freshness-DWdW7vUm.js} +2 -2
  16. package/server/{build-info-27NlbKhV.js → build-info-BT096lEl.js} +3 -3
  17. package/server/{build-info-Cv6CI7Gu.js → build-info-DgTqZkL5.js} +1 -1
  18. package/server/{checkpoint-manager-C7mFCY_E.js → checkpoint-manager-B7Bt29J0.js} +1 -1
  19. package/server/{checkpoint-manager-D64fCC4p.js → checkpoint-manager-DDqcGyu8.js} +2 -2
  20. package/server/checkpoint-worker.js +1 -1
  21. package/server/{checkpoints-Vh-J15ge.js → checkpoints-C-AXLfYT.js} +2 -2
  22. package/server/{checkpoints-DwZqT2qQ.js → checkpoints-CpgCjAlN.js} +1 -1
  23. package/server/{claude-hooks-provision-CS5W_dhI.js → claude-hooks-provision-C8wdRnN1.js} +1 -1
  24. package/server/{claude-hooks-provision-BVLGfHrv.js → claude-hooks-provision-but-_qGY.js} +2 -2
  25. package/server/{claude-permissions-C2OrLYKL.js → claude-permissions-H_5wHQZQ.js} +2 -2
  26. package/server/{claude-settings-overlay-DWXjafJh.js → claude-settings-overlay-BTENVmYf.js} +1 -1
  27. package/server/{claude-settings-overlay-DX-fMFpC.js → claude-settings-overlay-CbSz0Dvb.js} +2 -2
  28. package/server/cli-BsVIHwzC.js +3 -0
  29. package/server/{cli-mvpEOb3w.js → cli-vBeXbPrq.js} +9 -9
  30. package/server/{cliproxy-Dvsr4ZkW.js → cliproxy-Bgb2XCqi.js} +2 -2
  31. package/server/{cliproxy-7g1nObvB.js → cliproxy-DW0V86F8.js} +1 -1
  32. package/server/{close-issue-8F6uawYj.js → close-issue-Dn_4c4G8.js} +5 -5
  33. package/server/{closed-issue-reaper-BhV-r-tC.js → closed-issue-reaper-CWpY2uBw.js} +1 -1
  34. package/server/{closed-issue-reaper-BaYQYF6w.js → closed-issue-reaper-hANY_ehE.js} +9 -9
  35. package/server/codex-Dg7Is5yb.js +3 -0
  36. package/server/{codex-D_UBEOwL.js → codex-TmSi-yTv.js} +30 -8
  37. package/server/{codex-parser-BTzlOZiV.js → codex-parser-C4gSH-IR.js} +2 -2
  38. package/server/{config-CrduXs4a.js → config-CCvjQf27.js} +2 -2
  39. package/server/{config-nAB_F-Gp.js → config-DUIhMN_T.js} +1 -1
  40. package/server/{config-G1TOMJZA.js → config-DjLOdbgT.js} +2 -2
  41. package/server/{config-yaml-Ciyp2mYe.js → config-yaml-DvyMuOle.js} +177 -211
  42. package/server/{conflict-gate-BKalpcjL.js → conflict-gate-BSJkNTdp.js} +1 -1
  43. package/server/{conflict-gate-BLUNMs1i.js → conflict-gate-CmrYpa47.js} +3 -3
  44. package/server/{context-layers-YNpf6Q_I.js → context-layers-B3Nt58jl.js} +2 -2
  45. package/server/{context-layers-Cg9ZgVfx.js → context-layers-ZYFcWiyc.js} +3 -3
  46. package/server/{control-settings-D_79A6gp.js → control-settings-aP1ANIlI.js} +4 -4
  47. package/server/{conversation-compaction-DiuZbIUB.js → conversation-compaction-CNbTLB86.js} +8 -8
  48. package/server/{conversation-compaction-CMIeWW4_.js → conversation-compaction-DiG5zWQq.js} +1 -1
  49. package/server/{conversation-service-DQybSPUK.js → conversation-service-Du-MTNpJ.js} +6 -6
  50. package/server/{conversation-service-CWk8mEym.js → conversation-service-Up7FEzIC.js} +1 -1
  51. package/server/{conversations-BJ-t3BRm.js → conversations-6mPANqvL.js} +1 -1
  52. package/server/{conversations-BUgGvqVL.js → conversations-DbOs1e9Q.js} +4 -4
  53. package/server/{cost-jJ2cgDcG.js → cost-CW4WSe72.js} +3 -3
  54. package/server/{cost-Drm7qeD5.js → cost-Ca0YTWDw.js} +18 -2
  55. package/server/{cost-sync-DzHP6zaR.js → cost-sync-C0VdGme1.js} +3 -3
  56. package/server/{dag-DIji6O2b.js → dag-CdOjJVDT.js} +9 -9
  57. package/server/{dangerous-git-ops-BebB-61h.js → dangerous-git-ops-CT-IypG3.js} +1 -1
  58. package/server/dashboard-db-worker.js +7 -7
  59. package/server/{deacon-pleYrvIm.js → deacon-DYSEJb48.js} +3 -3
  60. package/server/{deacon-nudge-log-C5VCKtyi.js → deacon-nudge-log-Bjg8U4Y9.js} +3 -3
  61. package/server/{deacon-1s7bM5zn.js → deacon-pRnyD5w9.js} +1133 -474
  62. package/server/deacon-swarm-9jRLS5Ke.js +2 -0
  63. package/server/{deacon-swarm-DmA3rJ7k.js → deacon-swarm-DftYRDo8.js} +17 -17
  64. package/server/deacon.js +8 -8
  65. package/server/{deploy-patrol-DmM6F-yw.js → deploy-patrol-Bjsho_ha.js} +136 -19
  66. package/server/{deploy-window-ClLq1RYf.js → deploy-window-CM6W1-c6.js} +1 -1
  67. package/server/{deploy-window-jw4S_Y-c.js → deploy-window-DeP_OIRk.js} +77 -10
  68. package/server/{dev-supervisor-Do2Stz49.js → dev-supervisor-BpMoHlkR.js} +2 -2
  69. package/server/{devcontainer-renderer-D8ylupco.js → devcontainer-renderer-CtUgrVKW.js} +3 -3
  70. package/server/dist-Bd3vn0Hw.js +3 -0
  71. package/server/{dist-yfR7G1BL.js → dist-DyRx4cI7.js} +1 -1
  72. package/server/{docker-ClwPQaba.js → docker-BK7HIcBj.js} +2 -2
  73. package/server/{dod-BLphkhjs.js → dod-BrSfUHm0.js} +1 -1
  74. package/server/{ensure-devcontainer-BA3bICoY.js → ensure-devcontainer-DRqaAkBR.js} +1 -1
  75. package/server/{ensure-devcontainer-CFpQatOc.js → ensure-devcontainer-DseivYEy.js} +4 -4
  76. package/server/{esm-shims-BZw-fTQ6.js → esm-shims-CbI3BVkl.js} +1 -1
  77. package/server/{event-store-DABarGNz.js → event-store-Cr5PQwFC.js} +1 -1
  78. package/server/{event-store-BVnON3vf.js → event-store-tdiY5eDZ.js} +3 -3
  79. package/server/{events-CmERlnwn.js → events-CC1dgUpx.js} +3 -3
  80. package/server/{events-LGeUehYW.js → events-CvvGK6LT.js} +1 -1
  81. package/server/{factory-CQNprtHe.js → factory-CynerjXO.js} +50 -13
  82. package/server/{feature-registry-population-D9Z3tYSa.js → feature-registry-population-B0pmAz0a.js} +4 -4
  83. package/server/{feature-registry-storage-BWymOgXE.js → feature-registry-storage-_wUBRD3J.js} +2 -2
  84. package/server/{features--fOza5g5.js → features-Dhxz-wLc.js} +2 -2
  85. package/server/{feedback-target-Dqik2WTe.js → feedback-target-CPS15Vte.js} +7 -7
  86. package/server/{feedback-target-Dn9vfPpz.js → feedback-target-iygZwmMc.js} +1 -1
  87. package/server/{feedback-writer-Wlq5-qgS.js → feedback-writer-C9b6ccN1.js} +6 -5
  88. package/server/{feedback-writer-DDQNV8uc.js → feedback-writer-qmiMbqTZ.js} +1 -1
  89. package/server/{flywheel-Q-38YhZG.js → flywheel-DMCUzDWg.js} +1 -1
  90. package/server/{flywheel-1Wd8WDlh.js → flywheel-DSSpWmqF.js} +13 -13
  91. package/server/{flywheel-DPUc8r3V.js → flywheel-DcBkQvgE.js} +14 -14
  92. package/server/{flywheel-merge-order-CeBuX0EJ.js → flywheel-merge-order-C-6zRLvM.js} +1 -1
  93. package/server/{flywheel-merge-order-4SqOXFAr.js → flywheel-merge-order-DxbQKE1d.js} +8 -8
  94. package/server/forge-B-ZWyTRm.js +2 -0
  95. package/server/{forge-DBbDpiYc.js → forge-Ch9gCFod.js} +2 -2
  96. package/server/{from-hh6vTBGl.js → from-CJ_aH5jD.js} +1 -1
  97. package/server/{fts-db-6ponMie2.js → fts-db-CKgg0VKg.js} +2 -2
  98. package/server/{fts-operations-KIRK165y.js → fts-operations-BrL_VTRr.js} +2 -2
  99. package/server/git-utils-BVa07a4a.js +198 -0
  100. package/server/{git-utils-DmF5xkj8.js → git-utils-Dry_Ka_D.js} +1 -1
  101. package/server/{github-app-B3yfECo8.js → github-app-CMBdIFBQ.js} +11 -3
  102. package/server/{github-app-CeSVFL6C.js → github-app-CPfoFAdV.js} +1 -1
  103. package/server/{github-client-Dslipypz.js → github-client--XVlDpwM.js} +2 -2
  104. package/server/{github-client-4A6FgA8O.js → github-client-B4QsdE-X.js} +1 -1
  105. package/server/{github-pr-lookup-DBP0YHMr.js → github-pr-lookup-BRbDW-qk.js} +2 -2
  106. package/server/harness-binary-CVio2m-u.js +106 -0
  107. package/server/{harness-resolve-BGpO-OVM.js → harness-resolve-qHJBhy3Z.js} +9 -15
  108. package/server/{health-events-CZGZ5I-A.js → health-events-C9B8y1Hm.js} +2 -2
  109. package/server/{health-events-CnwV_SSz.js → health-events-CpfvuVmm.js} +1 -1
  110. package/server/{hooks-CoNscX84.js → hooks-DUXw8A0-.js} +2 -2
  111. package/server/{hooks-DvX33gY_.js → hooks-ltecuFqZ.js} +1 -1
  112. package/server/{hume-DSJt5eA_.js → hume-BEq0bUDg.js} +2 -2
  113. package/server/hume-B_DbflNM.js +3 -0
  114. package/server/{idle-stack-reaper-5DVRoY6P.js → idle-stack-reaper-D7w9t3fE.js} +1 -1
  115. package/server/{idle-stack-reaper-BfL8HqYy.js → idle-stack-reaper-w1ISSlhs.js} +2 -2
  116. package/server/{in-flight-guard-tVGiI5ee.js → in-flight-guard-aQ1IxeI3.js} +2 -2
  117. package/server/{infra-DN2wSxle.js → infra-CzaSOgul.js} +4 -4
  118. package/server/{injection-DtlT8Akv.js → injection-DZ0PfYa4.js} +7 -7
  119. package/server/{injection-DK9zh_HL.js → injection-oNZeoDhL.js} +1 -1
  120. package/server/{inspect-agent-DKByUS_F.js → inspect-agent-DJKLWcVT.js} +15 -11
  121. package/server/inspect-agent-ch-F-5Ci.js +2 -0
  122. package/server/{internal-token-DhfFiwW7.js → internal-token-Bb4XeV2x.js} +2 -2
  123. package/server/{internal-token-7bYL5v6K.js → internal-token-DXdfprGr.js} +1 -1
  124. package/server/{io-BiM-7Zsx.js → io-B3_AHDfr.js} +160 -184
  125. package/server/{issue-closed-Dfw3QDyZ.js → issue-closed-zhdvQicO.js} +7 -7
  126. package/server/{issue-lifecycle-B7HZWnTA.js → issue-lifecycle-CreaCkjW.js} +22 -22
  127. package/server/{issue-lifecycle-ytsEdDlK.js → issue-lifecycle-Dy4vd0Oa.js} +1 -1
  128. package/server/{issue-service-singleton-CPESc4Or.js → issue-service-singleton-B5ushCvE.js} +8 -8
  129. package/server/{issue-service-singleton-D5EB5eYr.js → issue-service-singleton-DabvBWUp.js} +1 -1
  130. package/server/{issues-XYtFMxrH.js → issues-B6ToV6x1.js} +2 -2
  131. package/server/{jsonl-parser-DJV2eZUP.js → jsonl-parser-Dhflo1SH.js} +3 -3
  132. package/server/{label-cleanup-CJ4m8iRU.js → label-cleanup-BKPJm4Hv.js} +3 -3
  133. package/server/{label-reconciler-CNf3Ylm3.js → label-reconciler-DdWbHEBu.js} +4 -4
  134. package/server/{launcher-generator-5DJRiovn.js → launcher-generator-CHVm7bGT.js} +10 -9
  135. package/server/{layers-cZx7ibtV.js → layers-DzxSTGNA.js} +2 -2
  136. package/server/lifecycle-DfeyBDwA.js +121 -0
  137. package/server/lifecycle-io-Bsnr2K4F.js +3 -0
  138. package/server/{lifecycle-io-DMurK4oM.js → lifecycle-io-D8iNBcux.js} +37 -37
  139. package/server/{lifecycle-CE7619Xw.js → lifecycle-sycO16hj.js} +6 -6
  140. package/server/{linear-client-BLyN-NiP.js → linear-client-D4zqMnX7.js} +2 -2
  141. package/server/{linear-client-Bj1l4FOA.js → linear-client-DqhDQO9k.js} +1 -1
  142. package/server/memory-fts-worker.js +1 -1
  143. package/server/{merge-hSC2BENe.js → merge-C_ZEhbqI.js} +3 -3
  144. package/server/{merge-CwX2_AWm.js → merge-DK23JEdS.js} +1 -1
  145. package/server/{merge-agent-CnORPiri.js → merge-agent-BQM3a8z5.js} +1 -1
  146. package/server/{merge-agent-DnBsms_V.js → merge-agent-XrB80vfT.js} +369 -213
  147. package/server/{merge-batch-C2w2U2eK.js → merge-batch-Bwoyr8Je.js} +1 -1
  148. package/server/{merge-blockers-DhRgh76x.js → merge-blockers-BsFjGrQ8.js} +2 -2
  149. package/server/merge-ops-DlB1IM0Y.js +2 -0
  150. package/server/{merge-rebase-CE-ZyOMY.js → merge-rebase-C1KIVr0s.js} +2 -2
  151. package/server/{merge-set-D7YNU1ZB.js → merge-set-DLz0MkGT.js} +3 -3
  152. package/server/{merge-set-DHkzPCJU.js → merge-set-DnSYdBEp.js} +1 -1
  153. package/server/{merge-sync-De1FYva5.js → merge-sync-DZ9dojJn.js} +2 -2
  154. package/server/{merge-sync-CpGA9Kg7.js → merge-sync-SSv3E-pl.js} +1 -1
  155. package/server/{merge-train-SvkRJZ-k.js → merge-train-DxDfBTjr.js} +3 -3
  156. package/server/{merge-train-deps-CECJTElu.js → merge-train-deps-CyYQUksx.js} +4 -4
  157. package/server/{merge-verification-B3meGcXF.js → merge-verification-CSizH3HY.js} +4 -4
  158. package/server/{multipart-parser-ByTMgYV5.js → multipart-parser-Dt8YPN5S.js} +2 -2
  159. package/server/{no-resume-mode-BnInAFKs.js → no-resume-mode-Cx3K0hHi.js} +11 -8
  160. package/server/node_modules/.package-lock.json +5 -5
  161. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/README.md +3 -3
  162. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.d.ts.map +1 -1
  163. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js +2 -2
  164. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/dist/NodeChildProcessSpawner.js.map +1 -1
  165. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +5 -5
  166. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/src/NodeChildProcessSpawner.ts +6 -8
  167. package/server/{orphan-proposed-reconciler-CAfuWTA1.js → orphan-proposed-reconciler-BTkDrl4R.js} +1 -1
  168. package/server/{orphan-proposed-reconciler-AxAGUouN.js → orphan-proposed-reconciler-neK8dHQk.js} +23 -14
  169. package/server/package-lock.json +6 -6
  170. package/server/package.json +1 -1
  171. package/server/{pan-dir-Rw17YjT1.js → pan-dir-DeVUgwA7.js} +78 -58
  172. package/server/{paths-FP8v3lTz.js → paths-_zEts6wc.js} +2 -2
  173. package/server/{pickup-xi3KTLaJ.js → pickup-Dd0Znxxy.js} +2 -2
  174. package/server/{pipeline-membership-BtKMNY7v.js → pipeline-membership-0HaEGDlH.js} +190 -68
  175. package/server/{pipeline-notifier-dQ-U4NSb.js → pipeline-notifier-6iCJplFZ.js} +1 -1
  176. package/server/{pipeline-notifier-BM2HLF7B.js → pipeline-notifier-D0ykk59O.js} +2 -2
  177. package/server/{project-pipelines-B59NfN44.js → project-pipelines-2sK1apsO.js} +2 -2
  178. package/server/projects-9SkRpES9.js +3 -0
  179. package/server/{prompts-CbqaVjbe.js → prompts-Dp4Tpk39.js} +2 -2
  180. package/server/providers-DKkBXhxU.js +3 -0
  181. package/server/{providers-d3pwXGVE.js → providers-DV7ec8l7.js} +7 -7
  182. package/server/public/assets/{chunk-BO2N2NFS-BxYSL7J-.js → chunk-BO2N2NFS-CltymLRg.js} +4 -4
  183. package/server/public/assets/{diagram-OG6HWLK6-C_F9Q2as.js → diagram-OG6HWLK6-D2f6pjgA.js} +1 -1
  184. package/server/public/assets/{dist-DQNg4CiF.js → dist-BWR4qFiV.js} +1 -1
  185. package/server/public/assets/{dist-CLSlc6cV.js → dist-DEmlBBNQ.js} +3 -3
  186. package/server/public/assets/{ganttDiagram-6RSMTGT7-Cq0my-0C.js → ganttDiagram-6RSMTGT7-DnfiViPK.js} +1 -1
  187. package/server/public/assets/{highlighted-body-OFNGDK62-eZC03dGh.js → highlighted-body-OFNGDK62-B8Wrmj9H.js} +1 -1
  188. package/server/public/assets/index-CUr1xv8w.css +1 -0
  189. package/server/public/assets/{index-SLYGA8AQ.js → index-CsSuZQBI.js} +148 -145
  190. package/server/public/assets/{linear-6Fi3qnGg.js → linear-C9zFQpkX.js} +1 -1
  191. package/server/public/assets/mermaid-GHXKKRXX-BUAB8hqt.js +1 -0
  192. package/server/public/assets/{pieDiagram-4H26LBE5-Dpmc6xsv.js → pieDiagram-4H26LBE5-lR8H7Yjd.js} +1 -1
  193. package/server/public/assets/{prod-ojHllFvN.js → prod-B1jCQihw.js} +4 -4
  194. package/server/public/assets/{quadrantDiagram-W4KKPZXB-Ulr9gON5.js → quadrantDiagram-W4KKPZXB-CVQ2guem.js} +1 -1
  195. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CwdHGXfL.js → sankeyDiagram-5OEKKPKP-eD1RB4gm.js} +1 -1
  196. package/server/public/assets/{xychartDiagram-2RQKCTM6-r-bEDzJh.js → xychartDiagram-2RQKCTM6-ChEC6dQn.js} +1 -1
  197. package/server/public/index.html +54 -10
  198. package/server/{pull-requests-D3N6HQzI.js → pull-requests--Ib2jTgy.js} +1 -1
  199. package/server/{pull-requests-CjjPj7v6.js → pull-requests-CXIhdCYD.js} +13 -11
  200. package/server/{queries-B5hl7lMQ.js → queries-6d7Cdtm7.js} +723 -110
  201. package/server/{rally-Dp0Gb1DN.js → rally-B708-nZn.js} +3 -3
  202. package/server/{rally-api-DGaFz5L5.js → rally-api-nY0ZANw3.js} +2 -2
  203. package/server/{rally-api-CKr0O4DJ.js → rally-api-yjQ0TfHd.js} +1 -1
  204. package/server/{rally-client-SVbjGvqj.js → rally-client-B1EJhfV0.js} +4 -4
  205. package/server/{rally-client-Cqf6EX_r.js → rally-client-CULK2XAY.js} +1 -1
  206. package/server/rally-njs_mJrt.js +3 -0
  207. package/server/reap-terminal-sessions-MWnqdLCJ.js +4 -0
  208. package/server/{reap-terminal-sessions-CjqRAGw7.js → reap-terminal-sessions-N3BTkmX_.js} +11 -28
  209. package/server/{rebuild-stack-DHqCLvLX.js → rebuild-stack-Dp4eLkt4.js} +6 -6
  210. package/server/{rebuild-stack-DjdpALr1.js → rebuild-stack-kA7XngID.js} +1 -1
  211. package/server/{reconstruct-cache-BqrCQt0o.js → reconstruct-cache-uWbZfjms.js} +6 -6
  212. package/server/record-t6V-3Dcj.js +3 -0
  213. package/server/{record-update-BlB8mpKO.js → record-update-DACtKh6_.js} +1 -1
  214. package/server/record-update-Dq0t2uBG.js +310 -0
  215. package/server/{recovery-trip-l1Hsi37x.js → recovery-trip-BJtIQuag.js} +2 -2
  216. package/server/{release-engine-CSI4K6Oj.js → release-engine-DZpmGGzb.js} +5 -5
  217. package/server/{release-set-BywwggrE.js → release-set-hnXd_kga.js} +3 -3
  218. package/server/{remote-DYziAkiZ.js → remote-4tiENDaI.js} +3 -3
  219. package/server/{remote-cnoeuDWn.js → remote-Br-ZWVIP.js} +3 -3
  220. package/server/{remote-agents-BNORDWAX.js → remote-agents-CRCg1L4H.js} +1 -1
  221. package/server/{remote-agents-CZ2rc8I0.js → remote-agents-nmty1mLu.js} +6 -6
  222. package/server/{remote-completion-W67FNQ-A.js → remote-completion-BbWNd10K.js} +13 -13
  223. package/server/resume-CcKqnTvE.js +3 -0
  224. package/server/{review-agent-CSswH985.js → review-agent-DJRO8EG8.js} +1 -1
  225. package/server/{review-agent-CqSqSHkU.js → review-agent-sKkE1FEL.js} +23 -23
  226. package/server/{review-artifacts-BBgnd5df.js → review-artifacts-BLbSC4ke.js} +5 -5
  227. package/server/{review-context-Ctp9BdNJ.js → review-context-BgX3lcCx.js} +9 -9
  228. package/server/{review-status-CCgPVK1h.js → review-status-A7quS5KJ.js} +56 -39
  229. package/server/review-status-C6n6-9f_.js +3 -0
  230. package/server/{review-status-enrichment-DtDRGpst.js → review-status-enrichment-tbOn_A_u.js} +3 -3
  231. package/server/review-status-source-CxuEjLGg.js +39 -0
  232. package/server/{review-status-sync-jnLgd04F.js → review-status-sync-BhSQ0d0l.js} +2 -2
  233. package/server/{review-status-sync-C792ksoJ.js → review-status-sync-To3-iS-N.js} +1 -1
  234. package/server/{review-verdict-feedback-D5lW0o3k.js → review-verdict-feedback-C1Kg8n7t.js} +1 -1
  235. package/server/{review-verdict-feedback-CMsIpTpy.js → review-verdict-feedback-CTRNtzXO.js} +7 -7
  236. package/server/{rollup-B3kQmNpl.js → rollup-B53Y81xK.js} +1 -1
  237. package/server/{rollup-CLj_AK9f.js → rollup-WA0VD-Rr.js} +8 -8
  238. package/server/{scanner-C4NeC4FE.js → scanner-D2743cp8.js} +11 -7
  239. package/server/{sequence-io-Ce-6grIY.js → sequence-io-Cg0zYj_E.js} +4 -4
  240. package/server/{sequencer-agent-Bpz0yGmG.js → sequencer-agent-BGY8gjg-.js} +5 -5
  241. package/server/server.js +1348 -963
  242. package/server/{service-CqAY8Kmk.js → service-DCpB_SGd.js} +154 -51
  243. package/server/{session-fork-uNo4rMRA.js → session-fork-BQ8_6H32.js} +2 -2
  244. package/server/{session-history-DUehL3KN.js → session-history-CVZDpS3c.js} +4 -4
  245. package/server/{settings-DP2OYLXL.js → settings-BZ5m1UCl.js} +3 -3
  246. package/server/settings-D0OSwos5.js +2 -0
  247. package/server/{settings-D9grjmaP.js → settings-ylxwqwQG.js} +2 -2
  248. package/server/{shadow-engineering-Bi_oIMtF.js → shadow-engineering-BlxG6Xye.js} +3 -3
  249. package/server/{shadow-state-CDxEuPlE.js → shadow-state-C2_epgx2.js} +1 -1
  250. package/server/{shadow-state-a_ztFBJe.js → shadow-state-Dh-HzF2J.js} +2 -2
  251. package/server/{shadow-utils-CyOg6_Xq.js → shadow-utils-4bvjn9b3.js} +2 -2
  252. package/server/{ship-log-DDcueaIR.js → ship-log-ClSMIzZX.js} +1 -1
  253. package/server/{smart-compaction-C1_VVLEd.js → smart-compaction-CHIxLr_d.js} +1 -1
  254. package/server/{smart-compaction--Oj65Uov.js → smart-compaction-r4pHQBIr.js} +7 -7
  255. package/server/{spawn-planning-session-AiUSsBnH.js → spawn-planning-session-DWAorh2B.js} +25 -20
  256. package/server/{spawn-planning-session-LFtK2QCE.js → spawn-planning-session-KC_UduxD.js} +1 -1
  257. package/server/{specialist-completion-qOgqdqXH.js → specialist-completion-BXhav38U.js} +1 -1
  258. package/server/{specialist-context-gjj8Z4Ii.js → specialist-context-DtrYvGJ-.js} +5 -5
  259. package/server/{specialist-handoff-logger-BsBNvVZv.js → specialist-handoff-logger-C45ouoZ6.js} +2 -2
  260. package/server/{specialist-logs-CSLtvPx6.js → specialist-logs-DJ3RzKxW.js} +3 -3
  261. package/server/{specialists-D0VBf8g_.js → specialists-D5fRZXmN.js} +1 -1
  262. package/server/specialists-DVj0hvaL.js +3 -0
  263. package/server/{specialists-CYRwELzc.js → specialists-DyFeedjn.js} +66 -76
  264. package/server/{specialists-DAegTvRt.js → specialists-JVO00bs7.js} +374 -220
  265. package/server/specs-nN45DG2X.js +3 -0
  266. package/server/{src-OLoJhUiJ.js → src-CG9mCkP6.js} +6 -6
  267. package/server/{src-BqTcrfO_.js → src-CMTQGyCK.js} +3 -3
  268. package/server/{src-Dpq1yFIl.js → src-U7_kTPEE.js} +338 -4
  269. package/server/{stack-health-I713ELld.js → stack-health-Df0YEZKa.js} +1 -1
  270. package/server/{stack-health-DV_f-lK0.js → stack-health-puygdaMd.js} +2 -2
  271. package/server/{stale-task-claims-CQSKZVq0.js → stale-task-claims-BbFwCTb0.js} +4 -4
  272. package/server/{staleness-BbsGxmF2.js → staleness-Bpy41ngS.js} +15 -3
  273. package/server/{staleness-zGp4P1hd.js → staleness-Cbl_w4Bw.js} +1 -1
  274. package/server/{state-home-DixkE-up.js → state-home-CIGjwNfJ.js} +119 -54
  275. package/server/state-migrate-Dkzaxvny.js +487 -0
  276. package/server/{stuck-remediation-BWkK_O7A.js → stuck-remediation-CzEov_fq.js} +27 -21
  277. package/server/{stuck-remediation-CTPRC2S5.js → stuck-remediation-sY_MHHgQ.js} +1 -1
  278. package/server/{substrate-bug-weights-service-DXd0ID83.js → substrate-bug-weights-service-BH66lhm7.js} +3 -3
  279. package/server/{summary-fork-CdLn8Chr.js → summary-fork-D8bXjCr7.js} +2 -2
  280. package/server/{summary-fork-f3DpgjXh.js → summary-fork-DHhJIsAL.js} +8 -8
  281. package/server/{supervisor-Ch8CDuoF.js → supervisor-BO-Zk_h-.js} +3 -3
  282. package/server/supervisor-BPy-o1A8.js +2 -0
  283. package/server/{swarm-readiness-C9P2iPap.js → swarm-readiness-CQ_fwUWF.js} +4 -4
  284. package/server/{system-prerequisites-DkoQBn1q.js → system-prerequisites-Bza0ffAh.js} +24 -44
  285. package/server/{teardown-workspace-D-5yMyit.js → teardown-workspace-CEgauF4U.js} +15 -15
  286. package/server/{test-agent-queue-BwpUpu-o.js → test-agent-queue-DXDt0Xa-.js} +7 -7
  287. package/server/{test-verdict-BRiSu7eW.js → test-verdict-CmUBK5cT.js} +1 -1
  288. package/server/{test-verdict-BQ1yx7d4.js → test-verdict-DFjjIHR5.js} +1 -1
  289. package/server/{tldr-daemon-DjxP5g6Y.js → tldr-daemon-BDtLOIlO.js} +2 -2
  290. package/server/{tldr-daemon-BJA7TkqS.js → tldr-daemon-DL566HbH.js} +1 -1
  291. package/server/tmux-DoThH6aj.js +3 -0
  292. package/server/{tmux-y1blSxks.js → tmux-ftABRAmc.js} +76 -44
  293. package/server/{token-LUrbM9sU.js → token-CsOhvw42.js} +2 -2
  294. package/server/{token-util-BZaDAQ8S.js → token-util-CTmczIfW.js} +1 -1
  295. package/server/token-util-DrHg8abn.js +3 -0
  296. package/server/{tracker-config-DSFZBdXP.js → tracker-config-B4itFzDo.js} +2 -2
  297. package/server/{tracker-utils-WtP_V-yn.js → tracker-utils-BePq_oj-.js} +1 -1
  298. package/server/{tracker-utils-DiceZN3a.js → tracker-utils-tnxxqROg.js} +2 -2
  299. package/server/{traefik-connect-BXqfOP4-.js → traefik-connect-m73vGebA.js} +1 -1
  300. package/server/{tunnel-DTng1rfQ.js → tunnel-B2vxjx_b.js} +3 -3
  301. package/server/{tunnel-WcJImbAC.js → tunnel-Cgj-IGIl.js} +1 -1
  302. package/server/{types-BjaZ1oqH.js → types-BBNjPcqU.js} +1 -1
  303. package/server/{types-DqeBMmJN.js → types-hraoaQIp.js} +1 -1
  304. package/server/{uat-train-BpLnp7Cx.js → uat-train-CuEn0t9M.js} +28 -28
  305. package/server/{uat-train-Wismge7h.js → uat-train-cKfM-_WW.js} +1 -1
  306. package/server/{validation-BA4e5EGm.js → validation-B5JxoPUS.js} +259 -9
  307. package/server/{validation-CUWamZ4X.js → validation-CIi6pnI2.js} +1 -1
  308. package/server/{verification-artifact-Dr_0g9nb.js → verification-artifact-BcnIbigL.js} +1 -1
  309. package/server/{verification-artifact-CrbI4tJE.js → verification-artifact-C-lIHfUa.js} +1 -1
  310. package/server/{verification-runner-gAzh3cVD.js → verification-runner-Br0S_Ous.js} +103 -37
  311. package/server/{verification-runner-Dcksl_P-.js → verification-runner-CDj4lD4t.js} +1 -1
  312. package/server/{vtt-parser-3VZKsmSm.js → vtt-parser-DKpNNW5i.js} +1 -1
  313. package/server/{work-agent-prompt-ULdcANl5.js → work-agent-prompt-Yb2bd3Fq.js} +16 -15
  314. package/server/{workflows-B8ROFlfw.js → workflows-C9WmILql.js} +39 -77
  315. package/server/workflows-D90rMOya.js +2 -0
  316. package/server/{workspace-DhTDA8nB.js → workspace-BVl4rihN.js} +3 -3
  317. package/server/{workspace-DSjUJaJN.js → workspace-DuUdndHe.js} +1 -1
  318. package/server/{workspace-config-BAAsAv-o.js → workspace-config-cEGcO6UT.js} +1 -1
  319. package/server/{workspace-manager-CcujONCR.js → workspace-manager-ZTdJAy9M.js} +1 -1
  320. package/server/{workspace-manager-DsN52IMG.js → workspace-manager-hLUv3ADC.js} +23 -16
  321. package/server/{workspace-metadata-DIL5_U4c.js → workspace-metadata-CskwzzhL.js} +2 -2
  322. package/server/{workspace-metadata-CftOpNLs.js → workspace-metadata-DNpMixRq.js} +1 -1
  323. package/server/{workspaces-Dmlh1YXm.js → workspaces-hWvy9eKs.js} +276 -110
  324. package/sync-sources/agents/pan-inspect-agent.md +1 -1
  325. package/sync-sources/agents/pan-merge-agent.md +1 -1
  326. package/sync-sources/agents/pan-planning-agent.md +4 -4
  327. package/sync-sources/agents/pan-work-agent.md +1 -1
  328. package/sync-sources/dev-skills/pan-commit/SKILL.md +1 -1
  329. package/sync-sources/dev-skills/test-specialist-workflow/SKILL.md +1 -1
  330. package/sync-sources/hooks/record-cost-event.js +363 -71
  331. package/sync-sources/hooks/session-start-hook +7 -0
  332. package/sync-sources/hooks/work-agent-stop-hook +1 -1
  333. package/sync-sources/rules/per-bead-durability.md +1 -1
  334. package/sync-sources/rules/prd-authoring.md +1 -1
  335. package/sync-sources/skills/feature-work/SKILL.md +1 -1
  336. package/sync-sources/skills/pan/SKILL.md +2 -2
  337. package/sync-sources/skills/pan-admin-config/SKILL.md +1 -0
  338. package/sync-sources/skills/pan-approve/SKILL.md +1 -1
  339. package/sync-sources/skills/pan-close/SKILL.md +1 -1
  340. package/sync-sources/skills/pan-doctor/SKILL.md +1 -1
  341. package/sync-sources/skills/pan-new-project/SKILL.md +9 -11
  342. package/sync-sources/skills/pan-oversee/SKILL.md +5 -5
  343. package/sync-sources/skills/pan-plan/SKILL.md +6 -6
  344. package/sync-sources/skills/pan-quickstart/SKILL.md +1 -1
  345. package/sync-sources/skills/pan-recap/SKILL.md +2 -2
  346. package/sync-sources/skills/pan-review/SKILL.md +1 -1
  347. package/sync-sources/skills/pan-start/SKILL.md +26 -3
  348. package/sync-sources/skills/pan-swarm/SKILL.md +1 -1
  349. package/sync-sources/skills/pan-sync/SKILL.md +1 -1
  350. package/sync-sources/skills/pan-task/SKILL.md +2 -2
  351. package/sync-sources/skills/pan-wipe/SKILL.md +2 -2
  352. package/sync-sources/skills/pipeline-list/SKILL.md +1 -1
  353. package/sync-sources/skills/pipeline-status/SKILL.md +2 -2
  354. package/sync-sources/skills/plan/SKILL.md +11 -11
  355. package/sync-sources/skills/write-vbrief/SKILL.md +7 -282
  356. package/sync-sources/skills/write-xbrief/SKILL.md +295 -0
  357. package/sync-sources/templates/claude-md/sections/warnings.md +1 -1
  358. package/server/agent-state-BV_6RHnO.js +0 -3
  359. package/server/agents-Czz6R57Z.js +0 -3
  360. package/server/cli-ChErG518.js +0 -3
  361. package/server/codex-BBeZ8c3s.js +0 -3
  362. package/server/deacon-swarm-uudlSCLM.js +0 -2
  363. package/server/dist-BEDL2alY.js +0 -3
  364. package/server/forge-DbhJyH6u.js +0 -2
  365. package/server/git-utils-Bkxzr1Xf.js +0 -129
  366. package/server/hume-BrA1tUuk.js +0 -3
  367. package/server/inspect-agent-CyXNo9fM.js +0 -2
  368. package/server/lifecycle-io-CUpsxG0p.js +0 -3
  369. package/server/merge-ops-BpTtuO8x.js +0 -2
  370. package/server/projects-IRHJIPYC.js +0 -3
  371. package/server/providers-BqCdTryq.js +0 -3
  372. package/server/public/assets/index-C6NLz_1S.css +0 -1
  373. package/server/public/assets/mermaid-GHXKKRXX-BNwFoQsf.js +0 -1
  374. package/server/rally-DGimSRBQ.js +0 -3
  375. package/server/reap-terminal-sessions-C1mfzoZo.js +0 -3
  376. package/server/record-update-RviRDSNs.js +0 -168
  377. package/server/record-us0YECMO.js +0 -3
  378. package/server/resume-OyN3dEXE.js +0 -3
  379. package/server/review-status-DXeqFpk5.js +0 -3
  380. package/server/settings-BaPXXJsT.js +0 -2
  381. package/server/specialists-C6WkeKFK.js +0 -3
  382. package/server/specs-BsNcum0h.js +0 -3
  383. package/server/state-migrate-_zJJ6XKE.js +0 -362
  384. package/server/supervisor-Qy1QecAs.js +0 -2
  385. package/server/tmux-HQLgwo_C.js +0 -3
  386. package/server/token-util-Cg-QnowA.js +0 -3
  387. package/server/workflows-C5c-RPsY.js +0 -2
@@ -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);
@@ -32263,7 +32360,196 @@ function getOverdeckDatabasePath() {
32263
32360
  return join$1(getOverdeckHome(), "overdeck.db");
32264
32361
  }
32265
32362
  //#endregion
32363
+ //#region ../../src/lib/overdeck/schema-audit.ts
32364
+ const EMPTY_TOP_UP_EXPECTATIONS = {
32365
+ columns: [],
32366
+ indexes: []
32367
+ };
32368
+ function splitTableDefinitions(body) {
32369
+ const definitions = [];
32370
+ let start = 0;
32371
+ let depth = 0;
32372
+ let quote = null;
32373
+ for (let index = 0; index < body.length; index += 1) {
32374
+ const character = body[index];
32375
+ if (quote) {
32376
+ if (character === quote && body[index - 1] !== "\\") quote = null;
32377
+ continue;
32378
+ }
32379
+ if (character === "'" || character === "\"" || character === "`") {
32380
+ quote = character;
32381
+ continue;
32382
+ }
32383
+ if (character === "(") depth += 1;
32384
+ if (character === ")") depth -= 1;
32385
+ if (character === "," && depth === 0) {
32386
+ definitions.push(body.slice(start, index).trim());
32387
+ start = index + 1;
32388
+ }
32389
+ }
32390
+ definitions.push(body.slice(start).trim());
32391
+ return definitions.filter(Boolean);
32392
+ }
32393
+ function parseOverdeckSchemaExpectations(migrationSql, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
32394
+ const tables = /* @__PURE__ */ new Map();
32395
+ const indexes = /* @__PURE__ */ new Set();
32396
+ for (const statement of migrationSql.split("--> statement-breakpoint")) {
32397
+ const trimmed = statement.trim();
32398
+ const tableMatch = trimmed.match(/^CREATE TABLE(?: IF NOT EXISTS)?\s+`([^`]+)`\s*\(([\s\S]*)\)\s*;?$/i);
32399
+ if (tableMatch) {
32400
+ const [, tableName, body] = tableMatch;
32401
+ const columns = /* @__PURE__ */ new Set();
32402
+ for (const definition of splitTableDefinitions(body)) {
32403
+ const columnMatch = definition.match(/^`([^`]+)`\s+/);
32404
+ if (columnMatch) columns.add(columnMatch[1]);
32405
+ }
32406
+ tables.set(tableName, columns);
32407
+ continue;
32408
+ }
32409
+ const indexMatch = trimmed.match(/^CREATE (?:UNIQUE )?INDEX(?: IF NOT EXISTS)?\s+`([^`]+)`\s+ON\s+`[^`]+`/i);
32410
+ if (indexMatch) indexes.add(indexMatch[1]);
32411
+ }
32412
+ for (const { table, column } of topUps.columns) {
32413
+ const columns = tables.get(table) ?? /* @__PURE__ */ new Set();
32414
+ columns.add(column);
32415
+ tables.set(table, columns);
32416
+ }
32417
+ for (const index of topUps.indexes) indexes.add(index);
32418
+ return {
32419
+ tables,
32420
+ indexes
32421
+ };
32422
+ }
32423
+ function readOverdeckSchemaExpectationsSync(topUps = EMPTY_TOP_UP_EXPECTATIONS) {
32424
+ return parseOverdeckSchemaExpectations(readFileSync$1(OVERDECK_MIGRATION_PATH, "utf8"), topUps);
32425
+ }
32426
+ function quoteIdentifier(identifier) {
32427
+ return `"${identifier.replaceAll("\"", "\"\"")}"`;
32428
+ }
32429
+ function auditOverdeckSchemaSync(db, topUps = EMPTY_TOP_UP_EXPECTATIONS) {
32430
+ const expected = readOverdeckSchemaExpectationsSync(topUps);
32431
+ const artifacts = db.prepare(`
32432
+ SELECT type, name
32433
+ FROM sqlite_master
32434
+ WHERE type IN ('table', 'index')
32435
+ AND name NOT LIKE 'sqlite_%'
32436
+ `).all();
32437
+ const actualTables = new Set(artifacts.filter((artifact) => artifact.type === "table").map((artifact) => artifact.name));
32438
+ const actualIndexes = new Set(artifacts.filter((artifact) => artifact.type === "index").map((artifact) => artifact.name));
32439
+ const missingTables = [...expected.tables.keys()].filter((table) => !actualTables.has(table)).sort();
32440
+ const missingIndexes = [...expected.indexes].filter((index) => !actualIndexes.has(index)).sort();
32441
+ const missingColumns = [];
32442
+ for (const [table, expectedColumns] of expected.tables) {
32443
+ if (!actualTables.has(table)) continue;
32444
+ const actualColumns = new Set(db.prepare(`PRAGMA table_info(${quoteIdentifier(table)})`).all().map((column) => column.name));
32445
+ for (const column of expectedColumns) if (!actualColumns.has(column)) missingColumns.push({
32446
+ table,
32447
+ column
32448
+ });
32449
+ }
32450
+ missingColumns.sort((left, right) => left.table === right.table ? left.column.localeCompare(right.column) : left.table.localeCompare(right.table));
32451
+ return {
32452
+ missingTables,
32453
+ missingIndexes,
32454
+ missingColumns
32455
+ };
32456
+ }
32457
+ //#endregion
32266
32458
  //#region ../../src/lib/overdeck/infra.ts
32459
+ /**
32460
+ * Runtime infrastructure for the canonical overdeck.db cache.
32461
+ * Schema top-ups tolerate idempotency errors, log unexpected failures without
32462
+ * blocking boot, and getOverdeckDatabaseSync follows them with a report-only
32463
+ * schema audit that warns about drift without mutating the database.
32464
+ */
32465
+ const OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS = {
32466
+ columns: [
32467
+ {
32468
+ table: "discovered_sessions",
32469
+ column: "harness"
32470
+ },
32471
+ {
32472
+ table: "flywheel_substrate_bugs",
32473
+ column: "affected_criteria"
32474
+ },
32475
+ {
32476
+ table: "review_status",
32477
+ column: "release_status"
32478
+ },
32479
+ {
32480
+ table: "review_status",
32481
+ column: "release_notes"
32482
+ },
32483
+ {
32484
+ table: "review_status",
32485
+ column: "inspect_owner_session"
32486
+ },
32487
+ {
32488
+ table: "review_status",
32489
+ column: "strike_ready_head"
32490
+ },
32491
+ {
32492
+ table: "review_status",
32493
+ column: "strike_ready_at"
32494
+ },
32495
+ {
32496
+ table: "review_status",
32497
+ column: "strike_landing_state"
32498
+ },
32499
+ {
32500
+ table: "review_status",
32501
+ column: "strike_recovery_count"
32502
+ },
32503
+ {
32504
+ table: "review_status",
32505
+ column: "strike_landing_attempts"
32506
+ },
32507
+ {
32508
+ table: "agents",
32509
+ column: "yielded_by_scheduler"
32510
+ },
32511
+ {
32512
+ table: "agents",
32513
+ column: "review_discovery_pending"
32514
+ },
32515
+ {
32516
+ table: "agents",
32517
+ column: "review_context_manifest_path"
32518
+ },
32519
+ {
32520
+ table: "agents",
32521
+ column: "review_discovery_ready_at"
32522
+ },
32523
+ {
32524
+ table: "agents",
32525
+ column: "review_convoy_forked_at"
32526
+ },
32527
+ {
32528
+ table: "agents",
32529
+ column: "review_fork_cache_checked"
32530
+ },
32531
+ {
32532
+ table: "agents",
32533
+ column: "review_forked_from_parent"
32534
+ },
32535
+ {
32536
+ table: "agents",
32537
+ column: "yielded_at"
32538
+ },
32539
+ {
32540
+ table: "agents",
32541
+ column: "last_yield_resume_at"
32542
+ }
32543
+ ],
32544
+ indexes: [
32545
+ "cost_session_id_idx",
32546
+ "idx_cost_agent_id",
32547
+ "idx_cost_issue_upper",
32548
+ "release_sets_project_idx",
32549
+ "release_set_components_issue_component_idx",
32550
+ "release_set_components_issue_order_idx"
32551
+ ]
32552
+ };
32267
32553
  const overdeckEvents = sqliteTable("events", {
32268
32554
  sequence: integer("sequence").primaryKey({ autoIncrement: true }),
32269
32555
  type: text("type").notNull(),
@@ -32282,56 +32568,50 @@ function runOverdeckMigrationSync(db) {
32282
32568
  }
32283
32569
  }
32284
32570
  /**
32571
+ * Run one idempotent schema top-up without hiding unexpected SQLite failures.
32572
+ * Only duplicate DDL is silent; missing tables and other failures are logged so
32573
+ * schema drift remains observable without blocking later top-ups or startup.
32574
+ */
32575
+ function runSchemaTopUp(db, statement) {
32576
+ try {
32577
+ db.exec(statement);
32578
+ } catch (error) {
32579
+ const message = error instanceof Error ? error.message : String(error);
32580
+ if (/duplicate column name|already exists/i.test(message)) return;
32581
+ console.error(`[schema] top-up failed: ${statement}\n${message}`);
32582
+ }
32583
+ }
32584
+ /**
32285
32585
  * Idempotent schema top-ups for databases created before a field/index existed
32286
32586
  * in the init migration. The init migration only runs on a fresh database.
32287
32587
  * PAN-2220: the conversation ledger-cost query joins cost_events on session_id;
32288
32588
  * without this index SQLite builds an automatic index on every query (~76ms → 7ms).
32289
32589
  */
32290
32590
  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 {}
32591
+ runSchemaTopUp(db, "ALTER TABLE `discovered_sessions` ADD COLUMN `harness` text");
32592
+ runSchemaTopUp(db, "UPDATE `discovered_sessions` SET `harness` = 'claude-code' WHERE `harness` IS NULL");
32593
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_status` text");
32594
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `release_notes` text");
32595
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `inspect_owner_session` text");
32596
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_head` text");
32597
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_ready_at` integer");
32598
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_state` text");
32599
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_recovery_count` integer DEFAULT 0");
32600
+ runSchemaTopUp(db, "ALTER TABLE `review_status` ADD COLUMN `strike_landing_attempts` text");
32303
32601
  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 {}
32602
+ runSchemaTopUp(db, "ALTER TABLE `flywheel_substrate_bugs` ADD COLUMN `affected_criteria` text");
32603
+ runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `cost_session_id_idx` ON `cost_events` (`session_id`)");
32604
+ runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_agent_id` ON `cost_events` (`agent_id`, `ts`)");
32605
+ runSchemaTopUp(db, "CREATE INDEX IF NOT EXISTS `idx_cost_issue_upper` ON `cost_events` (UPPER(`issue_id`))");
32606
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_by_scheduler` integer");
32607
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_pending` integer");
32608
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_context_manifest_path` text");
32609
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_discovery_ready_at` integer");
32610
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_convoy_forked_at` integer");
32611
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_fork_cache_checked` integer");
32612
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `review_forked_from_parent` integer");
32613
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `yielded_at` integer");
32614
+ runSchemaTopUp(db, "ALTER TABLE `agents` ADD COLUMN `last_yield_resume_at` integer");
32335
32615
  }
32336
32616
  /**
32337
32617
  * Idempotent schema top-up for release set tables (PAN-399). Existing overdeck.db
@@ -32373,6 +32653,17 @@ function ensureReleaseSetTablesSync(db) {
32373
32653
  db.exec("CREATE UNIQUE INDEX IF NOT EXISTS `release_set_components_issue_component_idx` ON `release_set_components` (`issue_id`,`component_key`)");
32374
32654
  db.exec("CREATE INDEX IF NOT EXISTS `release_set_components_issue_order_idx` ON `release_set_components` (`issue_id`,`release_order`,`component_key`)");
32375
32655
  }
32656
+ function warnSchemaDriftSync(db) {
32657
+ try {
32658
+ const report = auditOverdeckSchemaSync(db, OVERDECK_SCHEMA_TOP_UP_EXPECTATIONS);
32659
+ for (const table of report.missingTables) console.warn(`[schema-audit] missing table: ${table}`);
32660
+ for (const index of report.missingIndexes) console.warn(`[schema-audit] missing index: ${index}`);
32661
+ for (const { table, column } of report.missingColumns) console.warn(`[schema-audit] missing column: ${table}.${column}`);
32662
+ } catch (error) {
32663
+ const message = error instanceof Error ? error.message : String(error);
32664
+ console.warn(`[schema-audit] audit failed: ${message}`);
32665
+ }
32666
+ }
32376
32667
  function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
32377
32668
  if (overdeckDbSync?.path === dbPath) return overdeckDbSync.db;
32378
32669
  if (overdeckDbSync) {
@@ -32387,6 +32678,7 @@ function getOverdeckDatabaseSync(dbPath = getOverdeckDatabasePath()) {
32387
32678
  db.pragma("synchronous = NORMAL");
32388
32679
  runOverdeckMigrationSync(db);
32389
32680
  ensureRuntimeIndexesSync(db);
32681
+ warnSchemaDriftSync(db);
32390
32682
  overdeckDbSync = {
32391
32683
  path: dbPath,
32392
32684
  db
@@ -21,9 +21,11 @@ INPUT=$(cat 2>/dev/null || echo '{}')
21
21
 
22
22
  CLAUDE_SESSION_ID=""
23
23
  MODEL=""
24
+ SOURCE=""
24
25
  if command -v jq >/dev/null 2>&1; then
25
26
  CLAUDE_SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // ""' 2>/dev/null)
26
27
  MODEL=$(echo "$INPUT" | jq -r '.model // .model_name // ""' 2>/dev/null)
28
+ SOURCE=$(echo "$INPUT" | jq -r '.source // ""' 2>/dev/null)
27
29
  fi
28
30
  [ -z "$MODEL" ] && MODEL="${ANTHROPIC_MODEL:-}"
29
31
 
@@ -77,4 +79,9 @@ if command -v jq >/dev/null 2>&1; then
77
79
  fi
78
80
  fi
79
81
 
82
+ if [ "$SOURCE" = "compact" ] && command -v jq >/dev/null 2>&1; then
83
+ jq -n --arg context "The preceding compaction summary may quote harness-only instructions requiring text-only output or forbidding tools. Those instructions applied only to Claude Code's summarization turn and are no longer active. Resume the latest actual user task and use tools normally." \
84
+ '{hookSpecificOutput: {hookEventName: "SessionStart", additionalContext: $context}}'
85
+ fi
86
+
80
87
  exit 0
@@ -356,7 +356,7 @@ $OUTPUT
356
356
  </terminal_output>
357
357
 
358
358
  Decide FORGOT_COMPLETION if ANY of these are true AND the transcript does NOT show a 'pan work done' Bash invocation in the tail:
359
- - the agent wrote a summary/wrap-up message ('all tests pass', 'implementation complete', 'all vBRIEF tasks closed', 'ready for review', etc.) and then stopped
359
+ - the agent wrote a summary/wrap-up message ('all tests pass', 'implementation complete', 'all xBRIEF tasks closed', 'ready for review', etc.) and then stopped
360
360
  - the agent committed + pushed and the last message is a status summary instead of a pan-work-done command
361
361
 
362
362
  Decide STILL_WORKING only if the tail clearly shows an in-progress task (mid-edit, running tests, reading files) with no wrap-up summary.
@@ -3,7 +3,7 @@ scope: universal
3
3
  ---
4
4
  ### Push every managed-work item before completing it
5
5
 
6
- For an Overdeck-managed work issue, commit exactly one vBRIEF item at a time and immediately
6
+ For an Overdeck-managed work issue, commit exactly one xBRIEF item at a time and immediately
7
7
  push the feature branch before running `pan task done`. This invariant applies on
8
8
  local and remote machines and overrides generic project Git profiles; an unpushed item
9
9
  can be lost before Overdeck advances durable pipeline state.
@@ -16,7 +16,7 @@ Author every plan so it can be executed without re-research or judgment calls:
16
16
  paths, and before/after code. The downstream executor is a model, not a senior
17
17
  engineer who can fill gaps from taste and tribal knowledge — so the *how* must be
18
18
  on the page. Specifying the implementation is required, not scope-creep. (`pan
19
- plan` then mechanically lowers the PRD into a vBRIEF; the richer the PRD, the
19
+ plan` then mechanically lowers the PRD into an xBRIEF; the richer the PRD, the
20
20
  less the planner has to invent.)
21
21
 
22
22
  - **Glossary first.** Define every term of art the document uses before using it.