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