@overdeck/desktop 0.45.24 → 0.46.0

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 (511) hide show
  1. package/drizzle/overdeck/0000_overdeck_init.sql +32 -0
  2. package/package.json +1 -1
  3. package/server/{acceptance-criteria-DDCnXF58.js → acceptance-criteria-CCwFGICj.js} +2 -2
  4. package/server/activity-logger-CMthG6Vd.js +3 -0
  5. package/server/{activity-logger-DDlOIAML.js → activity-logger-CyteR4JO.js} +24 -13
  6. package/server/{advancing-selfheal-BVwW4qRn.js → advancing-selfheal-De1L-Sb4.js} +6 -6
  7. package/server/{agent-gc-CHcnvonI.js → agent-gc-CBULruzm.js} +5 -5
  8. package/server/agent-state-VQk8fY9F.js +3 -0
  9. package/server/{agent-state-service-BsgWxZuB.js → agent-state-service-BlnSkRFA.js} +5 -5
  10. package/server/{agent-state-service-D5UGKIJL.js → agent-state-service-hZpxIw1E.js} +1 -1
  11. package/server/agents-BKKkxKgK.js +3 -0
  12. package/server/{agents-EbI0zCJl.js → agents-C5rWYhb6.js} +4 -4
  13. package/server/archive-planning-0FJ6Xd3b.js +2 -0
  14. package/server/{archive-planning-Du25Jtst.js → archive-planning-C0lAbNB_.js} +16 -24
  15. package/server/{artifact-index-jobs-CbEDfCDu.js → artifact-index-jobs-ug6ZxIP5.js} +2 -2
  16. package/server/{assemble-J2ZZ2C15.js → assemble-DnffNpOo.js} +2 -2
  17. package/server/{backlog-auto-trigger-2R2jog7n.js → backlog-auto-trigger-Dh-i9PQf.js} +3 -3
  18. package/server/{behavior-B3exJ42O.js → behavior-CfIg6pKp.js} +2 -2
  19. package/server/bridge-pool-patrol-CUFmjVDN.js +136 -0
  20. package/server/{briefing-freshness-D1wzUIWv.js → briefing-freshness-DHmCSLar.js} +2 -2
  21. package/server/{build-info-CZk_TITh.js → build-info-BP160gU7.js} +1 -1
  22. package/server/{build-info-Ie_D0_BT.js → build-info-CuFfxZxp.js} +5 -3
  23. package/server/{checkpoint-manager-BI1Wxoku.js → checkpoint-manager-DEWD82qK.js} +2 -2
  24. package/server/{checkpoint-manager-DwbQoqrC.js → checkpoint-manager-Dxh0FYsv.js} +1 -1
  25. package/server/checkpoint-worker.js +1 -1
  26. package/server/{checkpoints-CQB1h765.js → checkpoints-CZvbtLnr.js} +2 -2
  27. package/server/{checkpoints-BJIs5QIA.js → checkpoints-DMTgXuLG.js} +1 -1
  28. package/server/{claude-hooks-provision-8Ngo8TpT.js → claude-hooks-provision-CN-xo-do.js} +1 -1
  29. package/server/{claude-hooks-provision-D8GXF3_s.js → claude-hooks-provision-fvy4RD2b.js} +13 -2
  30. package/server/{claude-permissions-DNWEVV6z.js → claude-permissions-CN0cSCPp.js} +2 -2
  31. package/server/{claude-settings-overlay-CEdaqpWI.js → claude-settings-overlay-CJn35FHQ.js} +2 -2
  32. package/server/{claude-settings-overlay-DWy-Bb4Y.js → claude-settings-overlay-Dabi9slj.js} +1 -1
  33. package/server/cli-DmXETsw-.js +3 -0
  34. package/server/{cli-RoOx5DUf.js → cli-oCWYA1pE.js} +9 -9
  35. package/server/{cliproxy-C8a1vtTU.js → cliproxy-C8mB3KuB.js} +2 -2
  36. package/server/{cliproxy-fHfIeiGd.js → cliproxy-PGwTX_o8.js} +1 -1
  37. package/server/{close-issue-DoOifFIK.js → close-issue-D5MF5GqF.js} +5 -5
  38. package/server/{closed-issue-reaper-CktPXo8m.js → closed-issue-reaper-CJ24u0Zt.js} +1 -1
  39. package/server/{closed-issue-reaper-Bk3SU4RC.js → closed-issue-reaper-Cltx86x5.js} +37 -16
  40. package/server/{codex-GcHuUF-k.js → codex-BdEsUFWh.js} +1 -1
  41. package/server/{codex-BZXGhUVB.js → codex-Drlf5Xhf.js} +36 -7
  42. package/server/{codex-parser-CFZ1_1Jl.js → codex-parser-DpB89Vqa.js} +2 -2
  43. package/server/compaction-continuation-K2AxQX4H.js +200 -0
  44. package/server/{config-CKxYiCmX.js → config-B2IMcBxx.js} +4 -3
  45. package/server/{config-DzV30TOm.js → config-DV-grfQc.js} +1 -1
  46. package/server/{config-BZ0sHTju.js → config-Dr3pW6w6.js} +2 -2
  47. package/server/{config-yaml-DySPNmKN.js → config-yaml-CmOPzmBb.js} +268 -14
  48. package/server/{conflict-gate-BaCVrH-N.js → conflict-gate-B9cN3SBi.js} +4 -4
  49. package/server/{conflict-gate-BhAY7TUd.js → conflict-gate-Dh754uyA.js} +1 -1
  50. package/server/{context-layers-BrPmE__h.js → context-layers-D6LZo3l1.js} +2 -2
  51. package/server/{context-layers-igZ4FI4_.js → context-layers-dR5YxHYB.js} +3 -3
  52. package/server/{control-settings-BQp7_4uD.js → control-settings-C7DUehE1.js} +49 -19
  53. package/server/{conversation-compaction-CgrR8YYp.js → conversation-compaction-BoqdDXWF.js} +8 -8
  54. package/server/{conversation-compaction-eQB5CkOe.js → conversation-compaction-Dj4FAKoZ.js} +1 -1
  55. package/server/{conversation-service-DPJ71F33.js → conversation-service-5aCnq1zR.js} +8 -7
  56. package/server/conversation-service-BCxl4f8Z.js +3 -0
  57. package/server/{conversations-6AfUfbwc.js → conversations-BUpYsOZg.js} +4 -4
  58. package/server/{conversations-CAsJF9kh.js → conversations-C34dyIb9.js} +1 -1
  59. package/server/{cost-B2ddP6wq.js → cost-Bgcub5kW.js} +12 -2
  60. package/server/{cost-R-m6Yi-W.js → cost-CvxRrucd.js} +3 -3
  61. package/server/{cost-sync-BsN6ER0n.js → cost-sync-Dv3LUaNW.js} +3 -3
  62. package/server/{dag-B1ucnjDU.js → dag-ombYYt4s.js} +2 -2
  63. package/server/{dangerous-git-ops-BXqeWVSf.js → dangerous-git-ops-BcJPC5Rr.js} +1 -1
  64. package/server/dashboard-db-worker.js +7 -7
  65. package/server/deacon-DrXqT9LQ.js +4 -0
  66. package/server/{deacon-CU_cAYSR.js → deacon-hi9KLPLT.js} +2933 -2704
  67. package/server/{deacon-nudge-log-6wVqAaqz.js → deacon-nudge-log-BNBebzeL.js} +3 -3
  68. package/server/deacon-pending-lifecycle-Cpk0k7Hi.js +33 -0
  69. package/server/{deacon-swarm-BXZZ1Z2-.js → deacon-swarm-DBxUaO-A.js} +13 -13
  70. package/server/deacon-swarm-I2JfX5Tg.js +2 -0
  71. package/server/deacon.js +14 -19
  72. package/server/dead-end-trip-CQcP70ND.js +13 -0
  73. package/server/delivery-Da0zEMY4.js +3 -0
  74. package/server/{deploy-patrol-AiFoP8dw.js → deploy-patrol-Df-Tmaq0.js} +69 -18
  75. package/server/deploy-queue-9SrhZR63.js +3 -0
  76. package/server/deploy-queue-UjKGYsDe.js +169 -0
  77. package/server/deploy-window-jOiPRHL0.js +3 -0
  78. package/server/{deploy-window-C3F-tihF.js → deploy-window-rpqpWqHA.js} +40 -16
  79. package/server/{dev-supervisor-bcOWqdQE.js → dev-supervisor-CC46Ig8q.js} +2 -2
  80. package/server/{devcontainer-renderer-_d6XhyND.js → devcontainer-renderer-68CSCRnu.js} +3 -3
  81. package/server/{dist-Cb_0uvpS.js → dist-CJy72uEg.js} +1 -1
  82. package/server/dist-DSlxIU1H.js +3 -0
  83. package/server/{dist-src-BSoS7mkd.js → dist-src-Bik83hFi.js} +1 -1
  84. package/server/docker-BMVTSFL5.js +3 -0
  85. package/server/{docker-DcMTFTUC.js → docker-Dam7mbIB.js} +2 -2
  86. package/server/{dod-C6n9RV3G.js → dod-Dar-yheg.js} +8 -4
  87. package/server/durable-review-pipeline-CGZ5QBxh.js +17 -0
  88. package/server/durable-review-pipeline-jpgCJZFp.js +3 -0
  89. package/server/{ensure-devcontainer-DNi-ono3.js → ensure-devcontainer-B057YA81.js} +4 -4
  90. package/server/{ensure-devcontainer-BZgOhRo7.js → ensure-devcontainer-C98V8yW-.js} +1 -1
  91. package/server/{esm-shims-OSHAYaS1.js → esm-shims-Br9BPdkR.js} +1 -1
  92. package/server/{event-store-EV2cMiXj.js → event-store-ELqkVOn0.js} +1 -1
  93. package/server/{event-store-CQL6NeqB.js → event-store-zY5MJHgF.js} +23 -4
  94. package/server/{events-BTdrdEq8.js → events-D6pyqhzM.js} +1 -1
  95. package/server/{events-DTfAe4My.js → events-D9PR1IC0.js} +3 -3
  96. package/server/{factory-CFibJuaw.js → factory-CRoOpGsF.js} +5 -5
  97. package/server/{feature-registry-population-DKZFMbFt.js → feature-registry-population--YUXU999.js} +4 -4
  98. package/server/{feature-registry-storage-BdPuLcBX.js → feature-registry-storage-BORBTo0y.js} +2 -2
  99. package/server/{features-ez2271oH.js → features--nFkJY8v.js} +2 -2
  100. package/server/{feedback-target-CoFDHiM8.js → feedback-target-C0ZzyHvU.js} +1 -1
  101. package/server/{feedback-target-7mqqwrX6.js → feedback-target-Dt9BsapX.js} +8 -8
  102. package/server/{feedback-writer-CY5L1lB7.js → feedback-writer-BG0RUZiu.js} +5 -5
  103. package/server/{feedback-writer-D3a22RCd.js → feedback-writer-D1fm-5Z8.js} +1 -1
  104. package/server/{flywheel-SVF02Jpq.js → flywheel-BekukH4i.js} +1 -1
  105. package/server/{flywheel-DHrgCphM.js → flywheel-BiT3odRb.js} +23 -15
  106. package/server/{flywheel-DzGtWnJ1.js → flywheel-CLVB55Be.js} +16 -15
  107. package/server/flywheel-merge-order-BJv1DZz1.js +462 -0
  108. package/server/flywheel-merge-order-BKw9o6ku.js +2 -0
  109. package/server/forge-CZbSg6Ds.js +383 -0
  110. package/server/forge-DK3blQb_.js +3 -0
  111. package/server/{from-kNxT0bZC.js → from-D_4_dk7i.js} +1 -1
  112. package/server/{fts-db-CE46vDkZ.js → fts-db-BeOomFa-.js} +2 -2
  113. package/server/{fts-operations-CqY6zl-i.js → fts-operations-BdewJ_g9.js} +2 -2
  114. package/server/git-utils-CI6cwyyC.js +3 -0
  115. package/server/{git-utils-CRw2zLPC.js → git-utils-ameCgDdy.js} +30 -5
  116. package/server/{github-app-C3QrAUd0.js → github-app-CQ1Lo6LA.js} +3 -3
  117. package/server/{github-app-ClZ2lk8D.js → github-app-DtAsvwzK.js} +1 -1
  118. package/server/{github-client-BnIsSrEN.js → github-client-BfyDxuRN.js} +2 -2
  119. package/server/{github-client-DfQYVUaw.js → github-client-Cj0yl_07.js} +1 -1
  120. package/server/github-pr-lookup-BDq6Wznz.js +58 -0
  121. package/server/{harness-binary-DPUi-Pv8.js → harness-binary-DqkftwTb.js} +2 -2
  122. package/server/{harness-resolve-3lNZkyT4.js → harness-resolve-CqMqM1Mb.js} +4 -4
  123. package/server/{health-events-BBcTYQKU.js → health-events-CazRxJUS.js} +2 -2
  124. package/server/{health-events-BDOHby5Q.js → health-events-_xfTaOUs.js} +1 -1
  125. package/server/{hooks-CKZgXlJb.js → hooks-BO3QT1sn.js} +2 -2
  126. package/server/{hooks-DPVX1rwQ.js → hooks-BnJsxlSq.js} +1 -1
  127. package/server/{hume-Cz8igP9E.js → hume-CDYJxqx-.js} +2 -2
  128. package/server/hume-Dq--7rOQ.js +3 -0
  129. package/server/{idle-stack-reaper-CuLF0j2H.js → idle-stack-reaper-BYqERdkE.js} +1 -1
  130. package/server/{idle-stack-reaper-DDIRwxUY.js → idle-stack-reaper-CnGx_PO_.js} +99 -6
  131. package/server/in-flight-guard-Bq3epG58.js +45 -0
  132. package/server/{infra-BEqFxlJc.js → infra-BjuxvjdS.js} +70 -5
  133. package/server/{injection-CPUIqNhI.js → injection-DZxlV2al.js} +1 -1
  134. package/server/{injection-C8aiVJrF.js → injection-UCf8EsjX.js} +7 -7
  135. package/server/{inspect-agent-BLuJ1AkT.js → inspect-agent-6kylZnrm.js} +26 -25
  136. package/server/inspect-agent-BVwDrVrz.js +2 -0
  137. package/server/{internal-token-s0-oKybJ.js → internal-token-DvMTQSOS.js} +2 -2
  138. package/server/{internal-token-BrcU6qfe.js → internal-token-M9omeXM1.js} +1 -1
  139. package/server/{io-C9kF1wtJ.js → io-VHvc0Ssp.js} +43 -26
  140. package/server/{issue-closed-CDJk4pIp.js → issue-closed-B6KJkmHZ.js} +7 -7
  141. package/server/{issue-lifecycle-B8sZHVHh.js → issue-lifecycle-9gk3fnXN.js} +1 -1
  142. package/server/{issue-lifecycle-ojZAzDBP.js → issue-lifecycle-C4Zj0WmE.js} +34 -28
  143. package/server/{issue-service-singleton-Yx5DdmVJ.js → issue-service-singleton-DmCh7EHj.js} +10 -10
  144. package/server/{issue-service-singleton-BvJ09SaR.js → issue-service-singleton-PMx8F1jr.js} +1 -1
  145. package/server/{issues-BMmP_77e.js → issues-CgnQ1OGQ.js} +2 -2
  146. package/server/{jsonl-parser-BXSlHwEh.js → jsonl-parser-DJOH_O-w.js} +5 -4
  147. package/server/{label-cleanup-B0UJwnv5.js → label-cleanup-Dv7AV_R1.js} +3 -3
  148. package/server/{label-reconciler-B4iOAjlC.js → label-reconciler--F85rufp.js} +4 -4
  149. package/server/{lifecycle-yPd___5E.js → lifecycle-CTdOWYMi.js} +2 -2
  150. package/server/{lifecycle-xmBfK2GJ.js → lifecycle-DDN8ApVY.js} +6 -7
  151. package/server/{lifecycle-io-BREGpnLk.js → lifecycle-io-D-lGdzK3.js} +5 -5
  152. package/server/{lifecycle-io-DPo7x11I.js → lifecycle-io-D_zTLvP1.js} +1 -1
  153. package/server/{linear-client-BsuUvkdA.js → linear-client-BQU36QqE.js} +2 -2
  154. package/server/{linear-client-CTskEeT_.js → linear-client-CY4O_Tu3.js} +1 -1
  155. package/server/linear-mcp-auth-BnU4TYfY.js +280 -0
  156. package/server/linear-mcp-auth-NYBq_oHZ.js +2 -0
  157. package/server/memory-fts-worker.js +1 -1
  158. package/server/{merge-CefQNAnq.js → merge-Bpx4jjht.js} +13 -11
  159. package/server/{merge-agent-4WOWlSYA.js → merge-agent-DdMVSV2Y.js} +233 -83
  160. package/server/{merge-agent-CKkgIBPB.js → merge-agent-DrXa1CpW.js} +1 -1
  161. package/server/{merge-batch-ClFn2T-y.js → merge-batch-C5q1c1GX.js} +1 -1
  162. package/server/merge-completeness-BMm8tMyZ.js +277 -0
  163. package/server/merge-completeness-D0ljXbk3.js +3 -0
  164. package/server/{merge-B1DiziGU.js → merge-idOG--29.js} +1 -1
  165. package/server/merge-ops-DdpTiEMt.js +2 -0
  166. package/server/merge-rebase-DGQpYJU3.js +2 -0
  167. package/server/{merge-rebase-BfaTyXsw.js → merge-rebase-xLnMlw5h.js} +3 -3
  168. package/server/{merge-set-DJ8-UErs.js → merge-set-DH7ot3yz.js} +11 -5
  169. package/server/merge-set-DzsOTBg5.js +3 -0
  170. package/server/{merge-sync-VPV28g0g.js → merge-sync-CQ-LgZ1_.js} +406 -153
  171. package/server/merge-sync-Ca7F5JnQ.js +3 -0
  172. package/server/{merge-train-CHopycP0.js → merge-train-DTEMyIu4.js} +18 -8
  173. package/server/{merge-train-deps-D1cOZzy2.js → merge-train-deps-CNPJzepw.js} +4 -4
  174. package/server/merge-verification-x3JO8Dtz.js +220 -0
  175. package/server/merged-docker-cleanup-worker-CTpC27Bs.js +107 -0
  176. package/server/merged-docker-cleanup-worker-Cdi9apm-.js +3 -0
  177. package/server/{multipart-parser-duPAfSBw.js → multipart-parser-IMSBfePV.js} +2 -2
  178. package/server/{no-resume-mode-Nw29vaFb.js → no-resume-mode-C5ULAXwO.js} +1 -1
  179. package/server/node_modules/.package-lock.json +27 -27
  180. package/server/node_modules/@effect/platform-node/node_modules/@effect/platform-node-shared/package.json +3 -3
  181. package/server/node_modules/@google-cloud/common/package.json +2 -2
  182. package/server/node_modules/gaxios/build/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  183. package/server/node_modules/gaxios/build/esm/tsconfig.tsbuildinfo +1 -1
  184. package/server/node_modules/gaxios/package.json +1 -1
  185. package/server/node_modules/google-auth-library/build/src/auth/googleauth.js +24 -19
  186. package/server/node_modules/google-auth-library/package.json +1 -1
  187. package/server/node_modules/google-gax/build/protos/google/api/auth.proto +2 -1
  188. package/server/node_modules/google-gax/build/protos/google/api/backend.proto +12 -1
  189. package/server/node_modules/google-gax/build/protos/google/api/billing.proto +1 -1
  190. package/server/node_modules/google-gax/build/protos/google/api/client.proto +165 -53
  191. package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1/resources.proto +1 -1
  192. package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/quota_adjuster_settings.proto +7 -3
  193. package/server/node_modules/google-gax/build/protos/google/api/cloudquotas/v1beta/resources.proto +1 -1
  194. package/server/node_modules/google-gax/build/protos/google/api/config_change.proto +1 -1
  195. package/server/node_modules/google-gax/build/protos/google/api/context.proto +1 -1
  196. package/server/node_modules/google-gax/build/protos/google/api/control.proto +3 -3
  197. package/server/node_modules/google-gax/build/protos/google/api/distribution.proto +1 -1
  198. package/server/node_modules/google-gax/build/protos/google/api/documentation.proto +1 -1
  199. package/server/node_modules/google-gax/build/protos/google/api/endpoint.proto +1 -1
  200. package/server/node_modules/google-gax/build/protos/google/api/error_reason.proto +186 -1
  201. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/checked.proto +31 -3
  202. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/eval.proto +8 -9
  203. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/explain.proto +1 -2
  204. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/syntax.proto +20 -22
  205. package/server/node_modules/google-gax/build/protos/google/api/expr/v1alpha1/value.proto +2 -3
  206. package/server/node_modules/google-gax/build/protos/google/api/field_behavior.proto +1 -1
  207. package/server/node_modules/google-gax/build/protos/google/api/field_info.proto +1 -1
  208. package/server/node_modules/google-gax/build/protos/google/api/http.proto +1 -1
  209. package/server/node_modules/google-gax/build/protos/google/api/httpbody.proto +1 -1
  210. package/server/node_modules/google-gax/build/protos/google/api/label.proto +1 -1
  211. package/server/node_modules/google-gax/build/protos/google/api/launch_stage.proto +1 -1
  212. package/server/node_modules/google-gax/build/protos/google/api/log.proto +1 -1
  213. package/server/node_modules/google-gax/build/protos/google/api/logging.proto +1 -1
  214. package/server/node_modules/google-gax/build/protos/google/api/metric.proto +1 -1
  215. package/server/node_modules/google-gax/build/protos/google/api/monitored_resource.proto +1 -1
  216. package/server/node_modules/google-gax/build/protos/google/api/monitoring.proto +1 -1
  217. package/server/node_modules/google-gax/build/protos/google/api/policy.proto +1 -1
  218. package/server/node_modules/google-gax/build/protos/google/api/quota.proto +1 -1
  219. package/server/node_modules/google-gax/build/protos/google/api/resource.proto +1 -1
  220. package/server/node_modules/google-gax/build/protos/google/api/routing.proto +8 -4
  221. package/server/node_modules/google-gax/build/protos/google/api/service.proto +2 -3
  222. package/server/node_modules/google-gax/build/protos/google/api/source_info.proto +1 -1
  223. package/server/node_modules/google-gax/build/protos/google/api/system_parameter.proto +1 -1
  224. package/server/node_modules/google-gax/build/protos/google/api/usage.proto +7 -27
  225. package/server/node_modules/google-gax/build/protos/google/api/visibility.proto +1 -1
  226. package/server/node_modules/google-gax/build/protos/google/longrunning/operations.proto +20 -1
  227. package/server/node_modules/google-gax/build/protos/google/protobuf/any.proto +52 -108
  228. package/server/node_modules/google-gax/build/protos/google/protobuf/compiler/ruby/ruby_generated_code.proto +2 -0
  229. package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_features.proto +21 -1
  230. package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_file_options.proto +24 -0
  231. package/server/node_modules/google-gax/build/protos/google/protobuf/cpp_options.proto +15 -0
  232. package/server/node_modules/google-gax/build/protos/google/protobuf/descriptor.proto +118 -30
  233. package/server/node_modules/google-gax/build/protos/google/protobuf/field_mask.proto +16 -18
  234. package/server/node_modules/google-gax/build/protos/google/protobuf/internal_options.proto +8 -1
  235. package/server/node_modules/google-gax/build/protos/google/protobuf/json/json_enumval_custom_string.proto +26 -0
  236. package/server/node_modules/google-gax/build/protos/google/protobuf/json_enumvalue_options.proto +29 -0
  237. package/server/node_modules/google-gax/build/protos/google/protobuf/json_options.proto +14 -0
  238. package/server/node_modules/google-gax/build/protos/google/protobuf/struct.proto +38 -22
  239. package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/forced_micro_string.proto +3 -0
  240. package/server/node_modules/google-gax/build/protos/google/protobuf/test_protos/repeated_field_proxy_import_message.proto +14 -0
  241. package/server/node_modules/google-gax/build/protos/google/protobuf/timestamp.proto +9 -8
  242. package/server/node_modules/google-gax/build/protos/google/protobuf/util/json_format_proto3.proto +18 -0
  243. package/server/node_modules/google-gax/build/protos/google/rpc/code.proto +1 -1
  244. package/server/node_modules/google-gax/build/protos/google/rpc/context/attribute_context.proto +7 -2
  245. package/server/node_modules/google-gax/build/protos/google/rpc/context/audit_context.proto +1 -1
  246. package/server/node_modules/google-gax/build/protos/google/rpc/error_details.proto +5 -5
  247. package/server/node_modules/google-gax/build/protos/google/rpc/http.proto +1 -1
  248. package/server/node_modules/google-gax/build/protos/google/rpc/status.proto +1 -2
  249. package/server/node_modules/google-gax/build/protos/google/type/calendar_period.proto +1 -1
  250. package/server/node_modules/google-gax/build/protos/google/type/color.proto +9 -10
  251. package/server/node_modules/google-gax/build/protos/google/type/date.proto +11 -9
  252. package/server/node_modules/google-gax/build/protos/google/type/datetime.proto +17 -17
  253. package/server/node_modules/google-gax/build/protos/google/type/dayofweek.proto +1 -1
  254. package/server/node_modules/google-gax/build/protos/google/type/decimal.proto +11 -13
  255. package/server/node_modules/google-gax/build/protos/google/type/expr.proto +1 -1
  256. package/server/node_modules/google-gax/build/protos/google/type/fraction.proto +1 -1
  257. package/server/node_modules/google-gax/build/protos/google/type/interval.proto +1 -2
  258. package/server/node_modules/google-gax/build/protos/google/type/latlng.proto +4 -5
  259. package/server/node_modules/google-gax/build/protos/google/type/localized_text.proto +3 -3
  260. package/server/node_modules/google-gax/build/protos/google/type/money.proto +1 -2
  261. package/server/node_modules/google-gax/build/protos/google/type/month.proto +1 -1
  262. package/server/node_modules/google-gax/build/protos/google/type/phone_number.proto +20 -15
  263. package/server/node_modules/google-gax/build/protos/google/type/postal_address.proto +39 -39
  264. package/server/node_modules/google-gax/build/protos/google/type/quaternion.proto +4 -4
  265. package/server/node_modules/google-gax/build/protos/google/type/timeofday.proto +11 -8
  266. package/server/node_modules/google-gax/package.json +5 -5
  267. package/server/node_modules/retry-request/package.json +4 -4
  268. package/server/node_modules/teeny-request/package.json +5 -5
  269. package/server/node_modules/undici/lib/cache/memory-cache-store.js +54 -9
  270. package/server/node_modules/undici/lib/cache/sqlite-cache-store.js +7 -1
  271. package/server/node_modules/undici/lib/core/request.js +12 -1
  272. package/server/node_modules/undici/lib/dispatcher/client-h1.js +11 -2
  273. package/server/node_modules/undici/lib/global.js +36 -16
  274. package/server/node_modules/undici/lib/handler/cache-handler.js +236 -116
  275. package/server/node_modules/undici/lib/handler/cache-revalidation-handler.js +3 -3
  276. package/server/node_modules/undici/lib/handler/retry-handler.js +24 -0
  277. package/server/node_modules/undici/lib/interceptor/cache.js +152 -62
  278. package/server/node_modules/undici/lib/interceptor/decompress.js +5 -2
  279. package/server/node_modules/undici/lib/util/cache.js +328 -66
  280. package/server/node_modules/undici/lib/util/date.js +23 -6
  281. package/server/node_modules/undici/lib/web/cookies/util.js +78 -8
  282. package/server/node_modules/undici/package.json +1 -1
  283. package/server/{orphan-proposed-reconciler-CTSGcK8p.js → orphan-proposed-reconciler-CWmOdM9-.js} +1 -1
  284. package/server/{orphan-proposed-reconciler-BvKkWMJQ.js → orphan-proposed-reconciler-Dg6U4ADZ.js} +24 -15
  285. package/server/package-lock.json +28 -28
  286. package/server/package.json +1 -1
  287. package/server/{pan-dir-B0c3w0Ya.js → pan-dir-ubraCiUg.js} +24 -10
  288. package/server/{paths-D-xWGHdh.js → paths-cXmOwSbh.js} +2 -2
  289. package/server/pending-lifecycle-claim-DEteYdS9.js +110 -0
  290. package/server/{pickup-DUCLWrJY.js → pickup-D8xtG1J2.js} +1 -1
  291. package/server/pipeline-membership-BGSvkT2M.js +3 -0
  292. package/server/pipeline-membership-CrAPLYtf.js +57 -0
  293. package/server/{pipeline-membership-mY3GprlK.js → pipeline-membership-gather-CET40frr.js} +177 -109
  294. package/server/pipeline-membership-gather-DTfcgxLl.js +3 -0
  295. package/server/{pipeline-notifier-BXkJzDC4.js → pipeline-notifier-BuQ0e4hF.js} +2 -2
  296. package/server/{pipeline-notifier-BJr8gQX6.js → pipeline-notifier-ImNXknf0.js} +1 -1
  297. package/server/post-merge-lifecycle-worker-DbO10pum.js +50 -0
  298. package/server/{project-pipelines-C0MWUeCU.js → project-pipelines-Bim6bThI.js} +2 -2
  299. package/server/{project-repos-B6GycDh9.js → project-repos-C0nuoBGv.js} +7 -3
  300. package/server/project-repos-CRE6Ykow.js +3 -0
  301. package/server/projects-B03Wr-xc.js +3 -0
  302. package/server/{prompts-DxzFXuLl.js → prompts-BEx08AIu.js} +2 -2
  303. package/server/{providers-u4Ga0jOr.js → providers-D7IluJe0.js} +1 -1
  304. package/server/{providers-qQAwGQDW.js → providers-evXhiQeg.js} +7 -7
  305. package/server/public/assets/{chunk-BO2N2NFS-BamJdinX.js → chunk-BO2N2NFS-D1s4-Sqp.js} +4 -4
  306. package/server/public/assets/{diagram-OG6HWLK6-DfOB8-w4.js → diagram-OG6HWLK6-1gdMoSF7.js} +1 -1
  307. package/server/public/assets/{dist-D7zYSEA6.js → dist-CxAOHbil.js} +1 -1
  308. package/server/public/assets/{dist-ByIuzMQW.js → dist-DqDRYW6P.js} +3 -3
  309. package/server/public/assets/{ganttDiagram-6RSMTGT7-EdmRyXL3.js → ganttDiagram-6RSMTGT7-BYex-Ec7.js} +1 -1
  310. package/server/public/assets/{highlighted-body-OFNGDK62-MerOfTX8.js → highlighted-body-OFNGDK62-DlVkiG0S.js} +1 -1
  311. package/server/public/assets/index-Cc7cnFC4.css +1 -0
  312. package/server/public/assets/index-K0hAYCgV.js +807 -0
  313. package/server/public/assets/{linear-BBbArIcK.js → linear-B4cuEFmO.js} +1 -1
  314. package/server/public/assets/mermaid-GHXKKRXX-DyDHFXHV.js +1 -0
  315. package/server/public/assets/{pieDiagram-4H26LBE5-BKIddiJN.js → pieDiagram-4H26LBE5-CBHNBIJQ.js} +1 -1
  316. package/server/public/assets/{prod-B8vYiu52.js → prod-CN2nHBvX.js} +4 -4
  317. package/server/public/assets/{quadrantDiagram-W4KKPZXB-D6RtoULk.js → quadrantDiagram-W4KKPZXB-Bom87VOQ.js} +1 -1
  318. package/server/public/assets/{sankeyDiagram-5OEKKPKP-CLrCedZX.js → sankeyDiagram-5OEKKPKP-UrBeyLxk.js} +1 -1
  319. package/server/public/assets/{xychartDiagram-2RQKCTM6-hznR8DYl.js → xychartDiagram-2RQKCTM6-DhkbrIxR.js} +1 -1
  320. package/server/public/index.html +2 -2
  321. package/server/{pull-requests-7N8WKseP.js → pull-requests-Cv7LxzUN.js} +1 -1
  322. package/server/{pull-requests-_lHueOHW.js → pull-requests-DHWiKxo7.js} +19 -10
  323. package/server/{queries-CjNIf-Ub.js → queries-DHJm7bTd.js} +631 -110
  324. package/server/{rally-CyWT_lNO.js → rally-B71M9f4o.js} +3 -3
  325. package/server/rally-YDjU513q.js +3 -0
  326. package/server/{rally-api-ClOSd-Tt.js → rally-api-D5uXN08-.js} +1 -1
  327. package/server/{rally-api-C8e_1JRi.js → rally-api-Dkqmok65.js} +2 -2
  328. package/server/{rally-client-lc-nokqr.js → rally-client-Bfqm6XI4.js} +4 -4
  329. package/server/{rally-client-sgtVqzNU.js → rally-client-CxsA6ExK.js} +1 -1
  330. package/server/{reap-terminal-sessions-7KeHv1R1.js → reap-terminal-sessions-BQ23nriz.js} +2 -2
  331. package/server/{reap-terminal-sessions-BtHPo6Xc.js → reap-terminal-sessions-CvmwaqKv.js} +2 -2
  332. package/server/{rebuild-stack-lwtsW0GO.js → rebuild-stack-0EEYReVZ.js} +16 -7
  333. package/server/{rebuild-stack-CFvcBHsS.js → rebuild-stack-qeRqHZxH.js} +2 -2
  334. package/server/{reconstruct-cache-C3Ui7ojV.js → reconstruct-cache-BbYFsqLa.js} +7 -6
  335. package/server/record-CtroO946.js +3 -0
  336. package/server/record-update-DH6dLJID.js +3 -0
  337. package/server/{record-update-dE1Aw83j.js → record-update-Z0QCxmMp.js} +124 -34
  338. package/server/{recovery-trip-BvRWfUXM.js → recovery-trip-eJe26h-f.js} +2 -2
  339. package/server/{release-engine-Cx48W7z8.js → release-engine-lPUp-MTd.js} +5 -5
  340. package/server/{release-set-CQfuN9-v.js → release-set-BwGeyZKX.js} +3 -3
  341. package/server/{remote-C_2hasl7.js → remote-BCd02Es1.js} +3 -3
  342. package/server/{remote-ChgimyYa.js → remote-CVGUhXMV.js} +3 -3
  343. package/server/{remote-agents-CA3Ihlxj.js → remote-agents-C1bssi41.js} +2 -2
  344. package/server/{remote-agents-By1ige5O.js → remote-agents-C_VxssLU.js} +300 -46
  345. package/server/{remote-completion-fVe9e_3u.js → remote-completion-DAB0P706.js} +12 -12
  346. package/server/resume-u9byntrq.js +3 -0
  347. package/server/{review-agent-DNboMyW4.js → review-agent-CD4RCI0Y.js} +1 -1
  348. package/server/{review-agent-CIGOQYBD.js → review-agent-CHhI66UP.js} +60 -47
  349. package/server/{review-artifacts-nRDPuMxd.js → review-artifacts-DSMRIfuJ.js} +7 -6
  350. package/server/{review-context-2uj-YQ8J.js → review-context-oFuBbiEE.js} +8 -8
  351. package/server/{in-flight-guard-CAAkqPLu.js → review-convoy-liveness-CpzrcJ5F.js} +3 -44
  352. package/server/review-status-BZH8h-6W.js +3 -0
  353. package/server/review-status-emit-CUExtHd5.js +50 -0
  354. package/server/{review-status-enrichment-Dci-ZwEt.js → review-status-enrichment-QV_hQkgS.js} +4 -4
  355. package/server/{review-status-source-CxuEjLGg.js → review-status-source-CpvJnvnQ.js} +24 -3
  356. package/server/review-status-source-ylw5QZUR.js +3 -0
  357. package/server/{review-status-sync-BTOpxtTC.js → review-status-sync-483sujRo.js} +2 -2
  358. package/server/{review-status-sync-DSDK3OMy.js → review-status-sync-NaWvI9Xf.js} +1 -1
  359. package/server/review-status-yljtTd-q.js +7521 -0
  360. package/server/{review-verdict-feedback-CTd4QMBu.js → review-verdict-feedback-BPDn4li_.js} +1 -1
  361. package/server/{review-verdict-feedback-CCjVA7Uk.js → review-verdict-feedback-CELeUinh.js} +48 -8
  362. package/server/{rollup-FGsKki9R.js → rollup-DTNvelz9.js} +8 -8
  363. package/server/{rollup-BKQC7jp4.js → rollup-DYZfq1c4.js} +1 -1
  364. package/server/{scanner-CnqEZeDy.js → scanner-CV35oSn4.js} +8 -7
  365. package/server/{sequence-io-D909zgeH.js → sequence-io-DF_8iuhV.js} +4 -4
  366. package/server/{sequencer-agent-CzkcK6P5.js → sequencer-agent-B2WeCtGi.js} +5 -5
  367. package/server/server.js +1952 -578
  368. package/server/{service-CLeAoU6G.js → service-Br9rpBNA.js} +81 -64
  369. package/server/{session-fork-CHI1XvL9.js → session-fork-D0LY152N.js} +2 -2
  370. package/server/{session-history-BT3IvqhC.js → session-history-BUyK29eq.js} +4 -4
  371. package/server/{settings-BTMvpNFU.js → settings-Bse1Pdcj.js} +3 -3
  372. package/server/settings-CdvIF84R.js +2 -0
  373. package/server/{settings-C0zgxOGf.js → settings-CvVGqNEs.js} +3 -2
  374. package/server/{shadow-engineering-BJfgm-hX.js → shadow-engineering-BWLa8ODz.js} +2 -2
  375. package/server/{shadow-state-7a-524T8.js → shadow-state-B4fpKxOO.js} +2 -2
  376. package/server/{shadow-state-DnDyjujH.js → shadow-state-FV6PHfEW.js} +1 -1
  377. package/server/{shadow-utils-Db3oroFG.js → shadow-utils-D7asqxOZ.js} +2 -2
  378. package/server/{ship-log-D9MlVzYU.js → ship-log-xplJ8t75.js} +1 -1
  379. package/server/{smart-compaction-CV2ukKND.js → smart-compaction-CPp2Ykf6.js} +1 -1
  380. package/server/{smart-compaction-KCYScAU1.js → smart-compaction-D3U_79f-.js} +8 -7
  381. package/server/{spawn-planning-session-qUC2VWu3.js → spawn-planning-session-1nFi3gfk.js} +1 -1
  382. package/server/{spawn-planning-session-DKpdFyOC.js → spawn-planning-session-DGfZ5B8D.js} +17 -17
  383. package/server/{specialist-completion-Ky9wCDpb.js → specialist-completion-Br48eiDP.js} +1 -1
  384. package/server/{specialist-context-Bn3dCGS2.js → specialist-context-cVbGnTa3.js} +5 -5
  385. package/server/{specialist-handoff-logger-CMEwYxa2.js → specialist-handoff-logger-DK-GTz4s.js} +2 -2
  386. package/server/{specialist-logs-C5p8G7tx.js → specialist-logs-Cl5-hqT8.js} +3 -3
  387. package/server/{specialists-CC4r-c2s.js → specialists-CNfYO3G2.js} +975 -227
  388. package/server/{specialists-jiuuyVkp.js → specialists-Cicieuzu.js} +18 -18
  389. package/server/{specialists-CShuVGWT.js → specialists-JHsdU3pA.js} +1 -1
  390. package/server/{specialists-DM6bWjsi.js → specialists-Tdezg_6N.js} +1 -1
  391. package/server/specs-Bt7WJDoC.js +3 -0
  392. package/server/src-CRmCHlma.js +11408 -0
  393. package/server/{src-CXmtj0im.js → src-Ck028hjO.js} +6 -6
  394. package/server/{src-CdmnTM2m.js → src-UWcGe0Ix.js} +3 -3
  395. package/server/{stack-health-Bn3o8FBX.js → stack-health-CJLMrLBl.js} +1 -1
  396. package/server/{stack-health-DxSdG9cW.js → stack-health-DqSqx0zv.js} +7 -5
  397. package/server/{stale-task-claims-KJKxxiiQ.js → stale-task-claims-CYFOUNlT.js} +4 -4
  398. package/server/{staleness-CT34nwr9.js → staleness-BQ-0gMYK.js} +1 -1
  399. package/server/{staleness-DPm7ClwA.js → staleness-D47CUJok.js} +1 -1
  400. package/server/{state-home-Cn_Qu8IX.js → state-home-BYV7qZTW.js} +2 -2
  401. package/server/{state-mapping-BL_-3Yt8.js → state-mapping-BVldLhBf.js} +1 -1
  402. package/server/{state-migrate-BGg2ZaOt.js → state-migrate-CvvBtS0Y.js} +4 -4
  403. package/server/{stuck-remediation-s9_2qfi6.js → stuck-remediation-Wt0UVvu1.js} +1 -1
  404. package/server/{stuck-remediation-DYuPRYYw.js → stuck-remediation-mkLC6G_t.js} +79 -22
  405. package/server/{substrate-bug-weights-service-B-FwCs5V.js → substrate-bug-weights-service-XfLAKnmK.js} +3 -3
  406. package/server/{summary-fork-DpcxN9tf.js → summary-fork-CD7GOts0.js} +2 -2
  407. package/server/{summary-fork-D1RAk9rJ.js → summary-fork-xiXBnWG9.js} +8 -8
  408. package/server/supervisor/{injection-budget-Csw5tqfJ.js → injection-budget-B5SbvDx2.js} +1 -1
  409. package/server/supervisor/{paths-DehGY2Fj.js → paths-K3noE4N_.js} +1 -1
  410. package/server/supervisor/pty-supervisor.js +49 -3
  411. package/server/supervisor/{pty-token-x-ea28Us.js → pty-token-B7lp0ElT.js} +2 -2
  412. package/server/{supervisor-wM4ooB5O.js → supervisor-DL788vos.js} +3 -3
  413. package/server/supervisor-UWiQNK-y.js +2 -0
  414. package/server/{swarm-readiness-DlP_UjHq.js → swarm-readiness-BV14DF5N.js} +3 -3
  415. package/server/{system-prerequisites-DUDj1YHf.js → system-prerequisites-pdWG6ZQs.js} +2 -2
  416. package/server/{teardown-workspace-DeTTImn-.js → teardown-workspace-l2F4_zim.js} +15 -16
  417. package/server/{test-agent-queue-MbxX5vqq.js → test-agent-queue-qakFIIGz.js} +6 -6
  418. package/server/{test-verdict-bWYBtqBg.js → test-verdict-BJYDggMm.js} +1 -1
  419. package/server/{test-verdict-gscuksPv.js → test-verdict-Gw-btEfb.js} +1 -1
  420. package/server/{tldr-daemon-BYFkts95.js → tldr-daemon-BKOYB616.js} +1 -1
  421. package/server/{tldr-daemon-C-69c3OI.js → tldr-daemon-CBaWkV9k.js} +2 -2
  422. package/server/{tmux-R7N7y-Mh.js → tmux-B1Wbxz5o.js} +3 -3
  423. package/server/{tmux-B6z7h_vZ.js → tmux-DQ6jB76i.js} +1 -1
  424. package/server/{launcher-generator-BBWG_SiS.js → tmux-dedup-DbN6MGzM.js} +428 -9
  425. package/server/{token-BK6t8BIT.js → token-Cxbk023d.js} +2 -2
  426. package/server/{token-util-DxXu-vd1.js → token-util-CLq2MmQt.js} +1 -1
  427. package/server/token-util-zlz9U0ki.js +3 -0
  428. package/server/{tracker-config-G6latr8C.js → tracker-config-DZ8Zn2nQ.js} +2 -2
  429. package/server/{tracker-utils-DHv5pSDT.js → tracker-utils-L0FKtjq2.js} +3 -3
  430. package/server/{traefik-connect-Df2uXPsQ.js → traefik-connect-bNX6jKkb.js} +1 -1
  431. package/server/{tunnel-CDVKJpRv.js → tunnel-BAm1XgjG.js} +3 -3
  432. package/server/{tunnel-DGdUkGoZ.js → tunnel-CjSnHdTc.js} +1 -1
  433. package/server/{types-5M0lupud.js → types-q67TYYg5.js} +1 -1
  434. package/server/uat-promote-verification-CKB9ZrKC.js +92 -0
  435. package/server/uat-train-Cu-4nvbf.js +2 -0
  436. package/server/uat-train-D5UjcyAa.js +0 -0
  437. package/server/{validate-IfDGkaVR.js → validate-Cxsx5Uz1.js} +8 -6
  438. package/server/{validation-CC9OPqJZ.js → validation-DEaTZafj.js} +1 -1
  439. package/server/{validation-Dw1pzDzr.js → validation-VZgJxmqc.js} +4 -4
  440. package/server/{verification-artifact-B3itKTxu.js → verification-artifact-C85cRTc_.js} +1 -1
  441. package/server/{verification-artifact-TVFSz_q1.js → verification-artifact-g3yuxQDL.js} +1 -1
  442. package/server/{verification-runner-BW4HOKAz.js → verification-runner-DlZI8yhw.js} +1 -1
  443. package/server/{verification-runner-CkgX6EtI.js → verification-runner-KDZIsBj4.js} +40 -18
  444. package/server/{vtt-parser-DYPbKcIJ.js → vtt-parser-Jr94BF3Y.js} +1 -1
  445. package/server/{work-agent-prompt-Du8Vh2aJ.js → work-agent-prompt-C-vuP3_J.js} +20 -9
  446. package/server/workflows-CHrx_hcW.js +2 -0
  447. package/server/{workflows-mbQzh6mQ.js → workflows-D0oip4eV.js} +161 -78
  448. package/server/{workspace--8tnhDI0.js → workspace-BqFg__wH.js} +1 -1
  449. package/server/{workspace-BPUws1-_.js → workspace-C0fH3aek.js} +3 -3
  450. package/server/workspace-anchor-drift-B4gMRHl4.js +3 -0
  451. package/server/workspace-anchor-drift-CZKofakh.js +224 -0
  452. package/server/{workspace-config-CIVWZOQr.js → workspace-config-B123aZl-.js} +1 -1
  453. package/server/workspace-manager-CDTKjjdU.js +3 -0
  454. package/server/{workspace-manager-CBhNdzE4.js → workspace-manager-CwO-Hek7.js} +156 -117
  455. package/server/{workspace-metadata-_WygnyoX.js → workspace-metadata-CQv00QwK.js} +2 -2
  456. package/server/{workspace-metadata-BzHnwwX4.js → workspace-metadata-D4M8BM4W.js} +1 -1
  457. package/server/{workspaces-Do_9J0LQ.js → workspaces-j1e_6aAT.js} +719 -292
  458. package/sync-sources/dev-skills/pan-dashboard-restart/SKILL.md +34 -10
  459. package/sync-sources/hooks/linear-mcp-auth-hook +97 -0
  460. package/sync-sources/rules/ask-user-question-self-contained.md +9 -0
  461. package/sync-sources/skills/pan-close/SKILL.md +5 -3
  462. package/sync-sources/skills/pan-peer-review/SKILL.md +195 -0
  463. package/sync-sources/skills/pan-reload/SKILL.md +3 -3
  464. package/sync-sources/skills/pan-restart/SKILL.md +5 -4
  465. package/sync-sources/skills/pan-review/SKILL.md +7 -1
  466. package/sync-sources/skills/pan-sync-main/SKILL.md +9 -8
  467. package/sync-sources/skills/pipeline-status/SKILL.md +10 -1
  468. package/sync-sources/skills/workspace-add-repo/SKILL.md +16 -1
  469. package/server/activity-logger-OEUBdfZ8.js +0 -3
  470. package/server/agent-state-Bc3tzUC8.js +0 -3
  471. package/server/agents-wi9NWzs2.js +0 -3
  472. package/server/archive-planning-BZDgzoEj.js +0 -3
  473. package/server/cli-B86rejVV.js +0 -3
  474. package/server/conversation-service-BLd3MYsG.js +0 -3
  475. package/server/deacon-kiQrb4ZT.js +0 -4
  476. package/server/deacon-swarm-C-GwfjJy.js +0 -2
  477. package/server/deploy-window-DkZraDyj.js +0 -3
  478. package/server/dist-Bzy0y69j.js +0 -3
  479. package/server/flywheel-merge-order-UU0tiUld.js +0 -245
  480. package/server/flywheel-merge-order-UUcsCDb6.js +0 -2
  481. package/server/forge-CNFnyqps.js +0 -270
  482. package/server/forge-DXnS_YFH.js +0 -2
  483. package/server/git-utils-D0_yhCgF.js +0 -3
  484. package/server/github-pr-lookup-D16NGsSO.js +0 -44
  485. package/server/hume-ccTf4wTX.js +0 -3
  486. package/server/inspect-agent-Brtz0URj.js +0 -2
  487. package/server/merge-ops-CR44oU9-.js +0 -2
  488. package/server/merge-set-bUqbm3yc.js +0 -3
  489. package/server/merge-sync-BJYeOODr.js +0 -3
  490. package/server/merge-verification-BkaOqPsw.js +0 -124
  491. package/server/project-repos-DXKQsc_m.js +0 -3
  492. package/server/projects-vjjcmiN8.js +0 -3
  493. package/server/public/assets/index-CWeMerGO.js +0 -804
  494. package/server/public/assets/index-CenuJ3Cw.css +0 -1
  495. package/server/public/assets/mermaid-GHXKKRXX-CpPWAFwE.js +0 -1
  496. package/server/rally-zhhtXuDP.js +0 -3
  497. package/server/record-CN0pj4_5.js +0 -3
  498. package/server/record-update-bLJxAXH4.js +0 -3
  499. package/server/resume-BFv1PGpA.js +0 -3
  500. package/server/review-status-btEYlaxA.js +0 -3
  501. package/server/review-status-kZj_KyCk.js +0 -1470
  502. package/server/settings-66A6uvIA.js +0 -2
  503. package/server/specs-C8Wsn2XO.js +0 -3
  504. package/server/src-DtcUOZCq.js +0 -4826
  505. package/server/supervisor-FTJAIsAK.js +0 -2
  506. package/server/token-util-DuPuNriz.js +0 -3
  507. package/server/tracker-utils-B4ylXZQK.js +0 -3
  508. package/server/uat-train-B05BWkp-.js +0 -2
  509. package/server/uat-train-DDSrSoV1.js +0 -2152
  510. package/server/workflows-BQu4RFQ-.js +0 -2
  511. package/server/workspace-manager-CWT55qeI.js +0 -3
@@ -16,10 +16,12 @@ allowed-tools:
16
16
  - Read
17
17
  ---
18
18
 
19
- # Overdeck Dashboard Restart (production-safe, detached)
19
+ # Overdeck Dashboard Restart (production-safe)
20
20
 
21
21
  The dashboard the browser talks to is the **pre-built `dist/dashboard/server.js` running under Node 22**, started from the **primary repo checkout** (NOT a `workspaces/feature-*` copy). It serves both the built frontend and the API on one port. **Never** run the production server via `npm run dev`, `tsx`, `vite`, or Bun — that violates the dashboard-node22-only rule (node-pty native addon + circular ESM). `pan dev` is the *development* path (vite HMR for the frontend + Node server); `pan up` is the *production* path.
22
22
 
23
+ The **supervisor sidecar** (`overdeck-supervisor.service`, port 3012) owns the dashboard lifecycle: it health-checks the server and respawns it as a systemd unit with the full env from `config.yaml`. Restart **through** it (`POST :3012/restart-dashboard`) — a manually spawned server is a duplicate it will replace, and racing it costs minutes of churn. The manual detached start below is the fallback for when the supervisor itself is down, and it must carry the Traefik env block (gotcha 7).
24
+
23
25
  ## When to use this skill
24
26
 
25
27
  `pan up` / `pan restart` is the normal path. Reach for this manual procedure **only** when:
@@ -35,33 +37,53 @@ The dashboard the browser talks to is the **pre-built `dist/dashboard/server.js`
35
37
  3. **Exactly ONE server.** Two servers = two deacons racing the same `~/.overdeck` state (the duel), and the PAN-1625 janitor reaps/churns extras. A single port-owner is left alone.
36
38
  4. **Work-agent tmux sessions survive a dashboard restart** — they are separate processes on the `overdeck` socket. Restarting the dashboard does NOT kill agents; the new deacon reconciles them as running.
37
39
  5. **Run from the primary repo**, not a workspace. If `readlink /proc/<pid>/cwd` is a `workspaces/feature-*` path, a workspace dashboard hijacked the port — kill it and restart from the primary checkout.
40
+ 6. **The supervisor sidecar owns the dashboard lifecycle.** `overdeck-supervisor.service` (port 3012) health-checks the dashboard and respawns it as a systemd unit with the full env from `config.yaml`. A manual server you spawn yourself is a duplicate it will replace — so restart THROUGH the supervisor (below) instead of racing it, and never kill a systemd-parented server that carries `OVERDECK_TRAEFIK_*` env: that is the supervisor's correctly-configured replacement, not a stray.
41
+ 7. **A bare `node dist/dashboard/server.js` launch 403s the domain on dists without the config fallback.** `getTrustedOrigins()` reads the launch env; no `OVERDECK_TRAEFIK_*` → only loopback is trusted → `/ws/*` 403s `https://overdeck.localhost` → the dashboard hangs on "Reconnecting to the dashboard…" while `localhost:3011` works. `/api/health` returns 200 the whole time because it does no origin validation. Newer dists fall back to `config.yaml` (commit `e86d125071`), but always launch WITH the env block below — it costs nothing and works on every dist.
38
42
 
39
43
  ## Procedure
40
44
 
41
45
  ```bash
42
46
  cd ~/Projects/overdeck # the PRIMARY checkout
43
47
 
48
+ # 0. Domain comes from config.yaml — the same source pan up / the supervisor use
49
+ DOMAIN=$(awk '/^traefik:/{f=1} f && /^ domain:/{print $2; exit}' ~/.overdeck/config.yaml)
50
+ DOMAIN=${DOMAIN:-overdeck.localhost}
51
+
44
52
  # 1. Rebuild ONLY if you changed server/lib source (the Node 22 dist is what runs)
45
53
  npm run build
46
54
 
47
- # 2. Find the live dashboard port + PID, kill by EXPLICIT PID (never pkill -f self-matching)
48
- PORT_LINE=$(ss -ltnp 2>/dev/null | grep -E ':(3010|3011|3012)\b' | grep node | head -1)
49
- OLD=$(echo "$PORT_LINE" | grep -oE 'pid=[0-9]+' | head -1 | cut -d= -f2)
50
- echo "current server: pid=$OLD"
55
+ # 2. PREFERRED: restart through the supervisor (it owns the lifecycle, sets the
56
+ # correct env from config.yaml, and systemd-manages the result). Skip to step 3
57
+ # only when port 3012 refuses connections.
58
+ curl -s -X POST http://127.0.0.1:3012/restart-dashboard # → 202 Accepted
59
+
60
+ # 3. Supervisor down? Manual detached start — WITH the Traefik env block (gotcha 7).
61
+ # Kill the old server by EXPLICIT PID (never pkill -f self-matching).
62
+ OLD=$(ss -ltnp 2>/dev/null | grep -E ':3011\b' | grep node | grep -oE 'pid=[0-9]+' | head -1 | cut -d= -f2)
51
63
  [ -n "$OLD" ] && kill -TERM "$OLD"
52
64
  for i in $(seq 1 15); do { [ -n "$OLD" ] && kill -0 "$OLD" 2>/dev/null; } && sleep 1 || break; done
53
65
  { [ -n "$OLD" ] && kill -0 "$OLD" 2>/dev/null; } && kill -9 "$OLD"
54
66
 
55
- # 3. Start ONE fully-detached server (survives the shell; not a child of any wrapper).
56
- # PORT is inherited from the environment; set it explicitly if you need a specific port.
57
- setsid bash -c 'exec node dist/dashboard/server.js' > /tmp/pan-dash.log 2>&1 < /dev/null &
67
+ setsid env \
68
+ DASHBOARD_URL="https://${DOMAIN}" OVERDECK_TRAEFIK_ENABLED=1 \
69
+ OVERDECK_TRAEFIK_DOMAIN="${DOMAIN}" OVERDECK_TRUSTED_ORIGINS="https://${DOMAIN}" \
70
+ DASHBOARD_PORT=3010 API_PORT=3011 PORT=3011 OVERDECK_MODE=production \
71
+ bash -c 'exec node dist/dashboard/server.js' > /tmp/pan-dash.log 2>&1 < /dev/null &
58
72
 
59
- # 4. Verify health (Traefik routes overdeck.localhost -> the API port)
73
+ # 4. Verify health AND the WebSocket origin path. /api/health does no origin
74
+ # validation — it returns 200 even while /ws/* 403s the domain (gotcha 7).
75
+ # The WS check is the only one that proves the browser can actually connect.
60
76
  for i in $(seq 1 40); do
61
- code=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 3 https://overdeck.localhost/api/health 2>/dev/null)
77
+ code=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 3 "https://${DOMAIN}/api/health" 2>/dev/null)
62
78
  [ "$code" = 200 ] && { echo "healthy after ${i}s"; break; }
63
79
  sleep 1
64
80
  done
81
+ ws=$(curl -sk -o /dev/null -w '%{http_code}' --http1.1 --max-time 5 \
82
+ -H "Origin: https://${DOMAIN}" -H "Connection: Upgrade" -H "Upgrade: websocket" \
83
+ -H "Sec-WebSocket-Version: 13" -H "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==" \
84
+ "https://${DOMAIN}/ws/rpc")
85
+ [ "$ws" = 101 ] && echo "WS origin OK" \
86
+ || echo "WS origin FAILED (got $ws) — server does not trust the domain; relaunch with the env block (or a dist with the config fallback)"
65
87
 
66
88
  # 5. Confirm SINGLE instance, correct dist path (primary repo, not a workspace)
67
89
  ss -ltnp 2>/dev/null | grep -E ':(3010|3011)\b'
@@ -79,6 +101,7 @@ readlink -f /proc/$NEW/cwd # must be the primary repo path
79
101
  ## Verify success
80
102
 
81
103
  - `overdeck.localhost/api/health` returns `{"status":"ok"}` and `curl http://localhost:<port>/api/health` returns 200.
104
+ - **The WebSocket origin check returns 101** (procedure step 4). Health alone is not success — a server missing its Traefik env is healthy on `/api/health` and dead to the browser at the same time.
82
105
  - Exactly one **host-level** `node dist/dashboard/server.js` process; its `/proc/<pid>/cwd` is the primary repo.
83
106
  **Do not count workspace-container servers.** Each running workspace devcontainer has its own `server` service whose `dist/dashboard/server.js` process is visible in host `ps` — those are legitimate read/UI peers (cwd `/workspaces/overdeck`, parent `containerd-shim`, `OVERDECK_DISABLE_DEACON=1`), NOT duplicate dashboards and NOT a single-deacon hazard. Seeing N+1 server processes with N containers up is the healthy state. Container-aware census:
84
107
  ```bash
@@ -89,6 +112,7 @@ readlink -f /proc/$NEW/cwd # must be the primary repo path
89
112
  done
90
113
  ```
91
114
  Exactly one `HOST` line, with cwd = the primary repo, is success. Multiple `HOST` lines = a real orphan (the deacon's orphan-server reaper, PAN-1625, will also catch it).
115
+ - **Do not kill the supervisor's server.** If a HOST server is parented to systemd and its env contains `OVERDECK_TRAEFIK_DOMAIN`, it is the supervisor's correctly-configured managed instance (gotcha 6). If you spawned a manual server and then see a second one appear, kill YOURS (the one without the Traefik env), never the supervisor's.
92
116
  - Agent tmux sessions (`tmux -L overdeck list-sessions`) are intact.
93
117
  - The deacon log (`/tmp/pan-dash.log` or the dashboard log) shows a single `Deacon started` and patrols advancing — no `received SIGTERM` loop.
94
118
 
@@ -0,0 +1,97 @@
1
+ #!/bin/bash
2
+ # PostToolUse + PostToolUseFailure hook for structured Linear MCP OAuth
3
+ # intervention events (PAN-2997). Registered with matcher mcp__linear__.* for
4
+ # both hook events: PostToolUse fires after a tool call SUCCEEDS, while a
5
+ # failed MCP call — the motivating OAuth-expired case — fires
6
+ # PostToolUseFailure with a top-level `error` field and no tool_response.
7
+ #
8
+ # Never breaks Claude Code: every failure exits 0 silently.
9
+
10
+ set +e
11
+
12
+ INPUT=$(cat 2>/dev/null || echo '{}')
13
+ command -v jq >/dev/null 2>&1 || exit 0
14
+
15
+ TOOL_NAME=$(printf '%s' "$INPUT" | jq -r '.tool_name // ""' 2>/dev/null)
16
+ [[ "$TOOL_NAME" == mcp__linear__* ]] || exit 0
17
+
18
+ EVENT_NAME=$(printf '%s' "$INPUT" | jq -r '.hook_event_name // "PostToolUse"' 2>/dev/null)
19
+
20
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
21
+ # shellcheck source=pan-hook-lib.sh
22
+ . "$SCRIPT_DIR/pan-hook-lib.sh" 2>/dev/null || exit 0
23
+ declare -f pan_resolve_agent_id >/dev/null 2>&1 || exit 0
24
+ pan_resolve_agent_id || exit 0
25
+ declare -f pan_emit_event >/dev/null 2>&1 || exit 0
26
+
27
+ MARKER_DIR="${OVERDECK_HOME:-$HOME/.overdeck}/agents/$AGENT_ID"
28
+ MARKER="$MARKER_DIR/linear-mcp-auth-pending"
29
+
30
+ # Auth-failure classifier. The 401 alternative requires a non-identifier
31
+ # boundary on both sides so ordinary Linear data (MIN-401, "AUR-4015") can
32
+ # never match; prose phrases are matched as words.
33
+ is_auth_error_text() {
34
+ printf '%s' "$1" | grep -Eiq 'requires authentication|not authenticated|unauthorized|(^|[^0-9A-Za-z-])401([^0-9]|$)'
35
+ }
36
+
37
+ emit_required() {
38
+ local auth_url="$1"
39
+ local body
40
+ body=$(jq -n --arg authUrl "$auth_url" '{
41
+ kind: "linear_mcp_auth_required",
42
+ authUrl: (if $authUrl == "" then null else $authUrl end)
43
+ }' 2>/dev/null) || return 0
44
+ pan_emit_event "$AGENT_ID" "$body" >/dev/null 2>&1 || true
45
+ mkdir -p "$MARKER_DIR" 2>/dev/null || true
46
+ : > "$MARKER" 2>/dev/null || true
47
+ }
48
+
49
+ emit_healthy_if_pending() {
50
+ [ -f "$MARKER" ] || return 0
51
+ local body
52
+ body=$(jq -n '{kind: "linear_mcp_auth_healthy"}' 2>/dev/null) || return 0
53
+ pan_emit_event "$AGENT_ID" "$body" >/dev/null 2>&1 || true
54
+ rm -f "$MARKER" 2>/dev/null || true
55
+ }
56
+
57
+ if [ "$EVENT_NAME" = "PostToolUseFailure" ]; then
58
+ # Documented failure-event shape: top-level `error`, no tool_response.
59
+ ERROR_TEXT=$(printf '%s' "$INPUT" | jq -r '.error // ""' 2>/dev/null)
60
+ if is_auth_error_text "$ERROR_TEXT"; then
61
+ emit_required ''
62
+ fi
63
+ exit 0
64
+ fi
65
+
66
+ # PostToolUse — successful tool call.
67
+ RESPONSE=$(printf '%s' "$INPUT" | jq -r '
68
+ (.tool_response // .tool_result // "")
69
+ | if type == "string" then . else tojson end
70
+ ' 2>/dev/null)
71
+ [ -n "$RESPONSE" ] || RESPONSE=''
72
+
73
+ if [ "$TOOL_NAME" = 'mcp__linear__authenticate' ]; then
74
+ AUTH_URL=$(printf '%s\n' "$RESPONSE" \
75
+ | grep -Eo 'https://linear\.app/oauth/authorize[^"[:space:]<>]*' 2>/dev/null \
76
+ | sed -n '1p')
77
+ emit_required "$AUTH_URL"
78
+ exit 0
79
+ fi
80
+
81
+ # An MCP server can report a failure inside a successful hook event as an
82
+ # error-shaped payload (isError: true, or an `error` member). Only those
83
+ # payloads are auth-classified — ordinary successful result data (issue
84
+ # identifiers like MIN-401, titles mentioning 401s or "unauthorized") never
85
+ # reaches this check and simply clears any pending intervention below.
86
+ ERROR_SHAPED=$(printf '%s' "$INPUT" | jq -r '
87
+ (.tool_response // .tool_result // {})
88
+ | if type == "object" and ((.isError == true) or (.error != null)) then "yes" else "" end
89
+ ' 2>/dev/null)
90
+
91
+ if [ -n "$ERROR_SHAPED" ] && is_auth_error_text "$RESPONSE"; then
92
+ emit_required ''
93
+ exit 0
94
+ fi
95
+
96
+ emit_healthy_if_pending
97
+ exit 0
@@ -0,0 +1,9 @@
1
+ ---
2
+ scope: universal
3
+ ---
4
+ ### Make every AskUserQuestion prompt self-contained
5
+
6
+ Every AskUserQuestion must stand alone because the operator may answer from a
7
+ dashboard dialog without the preceding transcript. State the situation in one
8
+ or two sentences, ask for the decision in plain language, and describe each
9
+ option by the consequence of choosing it rather than by a label alone.
@@ -35,15 +35,17 @@ Each overridable row has one explicit acceptance flag:
35
35
  ```text
36
36
  --accept-review Row 1: review passed
37
37
  --accept-tests Row 2: tests passed
38
- --accept-verification Row 3: branch verification passed at lastVerifiedCommit
38
+ --accept-verification Row 3: branch verification passed
39
39
  --accept-merged Row 4: PR merged on the forge
40
40
  --accept-post-merge Row 5: post-merge lifecycle completed
41
41
  --accept-main-verify Row 6: merge commit verified on main
42
42
  --accept-deploy Row 7: live dashboard build includes the merge
43
43
  ```
44
44
 
45
- An acceptance records the flag, operator/agent identity, and timestamp in the
46
- issue close-out record. Use it only when the missing evidence is understood:
45
+ An acceptance records the flag, operator identity, and timestamp in the issue
46
+ close-out record. The autonomous flywheel may run a clean close-out, but it cannot
47
+ use `--accept-*`; an operator must apply every override after reviewing the miss.
48
+ Use an override only when the missing evidence is understood:
47
49
 
48
50
  ```bash
49
51
  pan close PAN-1234 --force
@@ -0,0 +1,195 @@
1
+ ---
2
+ name: pan-peer-review
3
+ description: "Workflow: spawn an independent adversarial reviewer on a different model to verify or refute your own findings. EXPENSIVE — invoke only when the operator explicitly asks for a peer/second-opinion review."
4
+ triggers:
5
+ - peer review my findings
6
+ - get independent feedback
7
+ - second opinion from another model
8
+ - have another model review this
9
+ - adversarial review of my analysis
10
+ allowed-tools:
11
+ - Bash
12
+ - Read
13
+ - Write
14
+ ---
15
+
16
+ # pan peer-review — independent second opinion from another model
17
+
18
+ Spawn a conversation on a **different model family** to adversarially verify or
19
+ refute an analysis you produced, then read its findings back. Use it when a
20
+ conclusion is expensive to get wrong: a root-cause diagnosis about to become a
21
+ PRD, a refactor plan, a security claim, a "this is safe to merge" call.
22
+
23
+ ## ⚠️ Operator-invoked only — never launch this on your own initiative
24
+
25
+ **Do not start a peer review because you think your work would benefit from
26
+ one.** A peer review spawns a second full agent that reads source, burns a
27
+ frontier-model context, and runs for many minutes. That cost is the operator's
28
+ call, not yours.
29
+
30
+ Launch only when the operator explicitly asks — "get a second opinion", "run
31
+ this by another model", "have K3 review it", "peer review this". If you believe
32
+ a review is warranted and they have not asked, say so in one sentence and let
33
+ them decide.
34
+
35
+ Corollary: never chain reviews. One reviewer, one pass. If the reviewer
36
+ disagrees with you, bring the disagreement back to the operator rather than
37
+ spawning a third model to break the tie.
38
+
39
+ ## Why a different model, and what "independent" buys you
40
+
41
+ A reviewer on the same model as the author tends to agree — it reconstructs the
42
+ same reasoning from the same priors. The value comes from a different family
43
+ reading the same source: Opus/Fable reviewing GPT work, K3 reviewing Claude
44
+ work, GPT reviewing Claude work.
45
+
46
+ Pick the reviewer by contrast with whoever produced the analysis:
47
+
48
+ | Author | Good reviewer |
49
+ | --- | --- |
50
+ | Claude (Opus/Fable/Sonnet) | `k3` (Kimi), `gpt-5.6-sol` |
51
+ | GPT | `claude-opus-5`, `k3` |
52
+ | Kimi | `claude-opus-5`, `gpt-5.6-sol` |
53
+
54
+ Never pass `--harness`. Harness routing is config-owned and the operator sets it
55
+ deliberately; `--model` is the only routing flag this workflow uses, and only
56
+ because the operator asked for a specific reviewer.
57
+
58
+ Leave reasoning effort alone. It inherits `high`, which is the right tier —
59
+ never raise it to `xhigh`/`max` for a review.
60
+
61
+ ## The workflow
62
+
63
+ ### 1. Write the brief to a file — never into the focus
64
+
65
+ The `pan handoff` focus is hard-capped at 500 characters. A real review brief is
66
+ thousands. Write it to a file in the reviewer's future cwd and let the focus
67
+ point at it.
68
+
69
+ A brief that produces a useful review has these parts:
70
+
71
+ - **Adversarial framing, stated first.** "Assume each claim may be wrong. A
72
+ claim that survives refutation is worth more than agreement. Do not soften
73
+ findings to be agreeable." Without this you get a politeness echo.
74
+ - **Read-only rules.** No edits to source, no commits, no `pan` commands, no
75
+ POST/DELETE. The reviewer writes exactly one file: its findings.
76
+ - **A glossary** of every term of art before you use it — the reviewer has none
77
+ of your conversation's context.
78
+ - **Absolute paths for evidence outside the worktree** — live workspaces, logs,
79
+ config, API endpoints. The reviewer cannot find them otherwise.
80
+ - **Each claim stated separately**, with the exact file:line it rests on, the
81
+ evidence you used, and the fix you propose.
82
+ - **Per-claim questions that invite refutation** — "does the fix actually
83
+ terminate the loop?", "what is the blast radius?", "would this regress the
84
+ monorepo path?". Generic "please review" produces generic output.
85
+ - **Cross-cutting questions**, including at least one that asks for things you
86
+ did *not* find: "search for every other site with this pattern and report any
87
+ beyond the ones named here."
88
+ - **An explicit output contract** — a verdict vocabulary (CONFIRMED /
89
+ PARTIALLY CONFIRMED / REFUTED / CANNOT VERIFY), where to write findings, and
90
+ a request to also summarize in-conversation.
91
+
92
+ ### 2. Create a detached worktree
93
+
94
+ The reviewer needs the source, isolated from your working tree. Spawned agents
95
+ must never get the primary worktree as their cwd.
96
+
97
+ ```bash
98
+ git worktree add --detach /home/eltmon/Projects/hoff-<slug> main
99
+ ```
100
+
101
+ `--detach` is required: a plain `git worktree add <path> main` fails with
102
+ `fatal: 'main' is already used by worktree at ...` whenever main is checked out
103
+ somewhere, which on a dev machine is always. Detached HEAD is correct here —
104
+ the reviewer never commits.
105
+
106
+ Then write the brief into that worktree.
107
+
108
+ ### 3. Launch the handoff
109
+
110
+ ```bash
111
+ pan handoff --model <reviewer-model> --cwd /home/eltmon/Projects/hoff-<slug> self \
112
+ "Read REVIEW-BRIEF.md in your cwd FIRST and follow it exactly. You are an INDEPENDENT ADVERSARIAL reviewer — verify or refute each claim against real source and critique each proposed fix. Read-only. Write findings to FEEDBACK-<model>.md."
113
+ ```
114
+
115
+ `self` must come before the focus text. Omitting it makes the CLI read your
116
+ focus as a conversation name and fail with `Conversation not found`.
117
+
118
+ **The command can exceed a two-minute tool timeout while the handoff document is
119
+ authored — that is normal and does not mean it failed.** Either run it with
120
+ `run_in_background: true`, or let it time out and verify the spawn afterwards:
121
+
122
+ ```bash
123
+ tmux -L overdeck list-sessions | grep conv-
124
+ ```
125
+
126
+ ### 4. Correct the frame — the step everyone skips
127
+
128
+ `pan handoff` seeds the new conversation with an **authored handoff document
129
+ describing your session's state and open work**. It does not deliver your focus
130
+ as an instruction. The reviewer therefore wakes up believing it is *you,
131
+ continuing your work* — and if your open-work list said "launch a peer review",
132
+ it will try to launch one, recursively.
133
+
134
+ Check what it actually received before assuming it is reviewing:
135
+
136
+ ```bash
137
+ tmux -L overdeck capture-pane -t <conv-id> -p -S -30
138
+ ```
139
+
140
+ If it is acting as a continuation rather than as a reviewer, correct it with
141
+ `pan tell` (never raw tmux keystroke injection):
142
+
143
+ ```bash
144
+ pan tell <conv-id> "STOP. You are NOT continuing that conversation's work. You ARE the independent reviewer it wanted to spawn. Read <brief path> and follow it exactly. Read-only. Begin now."
145
+ ```
146
+
147
+ Budget for this step every time. Treat the handoff document as context the
148
+ reviewer happens to have, and your `pan tell` as the actual task assignment.
149
+
150
+ ### 5. Wait on the artifact, not the pane
151
+
152
+ Poll for the findings file rather than watching output scroll:
153
+
154
+ ```bash
155
+ until [ -s /home/eltmon/Projects/hoff-<slug>/FEEDBACK-<model>.md ]; do sleep 20; done
156
+ ```
157
+
158
+ Run that in the background so you can keep working.
159
+
160
+ ### 6. Read the findings critically, then report
161
+
162
+ The reviewer is not an oracle. Treat REFUTED verdicts as claims to check, the
163
+ same way you asked it to treat yours — a reviewer that misreads a call site can
164
+ be confidently wrong. Verify anything that would change what you do next.
165
+
166
+ Report back to the operator with: what the reviewer confirmed, what it refuted
167
+ and whether you agree, what it found that you missed, and where you still
168
+ disagree after checking. Never launder its output as consensus.
169
+
170
+ ### 7. Clean up
171
+
172
+ ```bash
173
+ git worktree remove /home/eltmon/Projects/hoff-<slug>
174
+ ```
175
+
176
+ Keep the findings file if it is going into an issue or PRD — copy it out before
177
+ removing the worktree.
178
+
179
+ ## Failure modes and what they mean
180
+
181
+ | Symptom | Cause | Fix |
182
+ | --- | --- | --- |
183
+ | `fatal: 'main' is already used by worktree at ...` | `git worktree add` without `--detach` | Add `--detach` |
184
+ | `Conversation not found` | Focus text passed without `self` first | `pan handoff ... self "<focus>"` |
185
+ | `Focus is N characters — the limit is 500`, no conversation created | Brief crammed into the focus | Put the brief in a file, point the focus at it |
186
+ | Handoff command times out at 2 minutes | Handoff document authoring is slow | Normal — verify the spawn with `tmux -L overdeck list-sessions` |
187
+ | Reviewer starts doing your open-work list, or tries to spawn its own review | It received the handoff doc, not your focus | `pan tell` it the real task (step 4) |
188
+ | Reviewer agrees with everything | Brief lacked adversarial framing, or reviewer shares the author's model family | Rewrite the framing; pick a different family |
189
+ | `state.json has no issueId` on `pan tell` | Informational — conversations have no issue | Ignore; the message still delivers |
190
+
191
+ ## Related
192
+
193
+ - `/pan-handoff` — the underlying command and its full semantics
194
+ - `/pan-code-review` — reviewing a *diff*; this skill reviews an *analysis*
195
+ - `/pan-tell` — the sanctioned way to message a running conversation
@@ -11,17 +11,17 @@ Use this after code changes that should run in the local Overdeck dashboard.
11
11
 
12
12
  ```bash
13
13
  pan reload
14
- pan reload --force # explicitly bypass the agent deploy-window gate
14
+ pan reload --force # explicit operator bypass of the deploy-window gate
15
15
  ```
16
16
 
17
- `pan reload` runs `bun install` and then `npm run build` first. If either fails, it leaves the current dashboard running and exits non-zero. If both succeed, it restarts the dashboard and waits for `http://127.0.0.1:3011/api/health`.
17
+ `pan reload` fetches `origin/main`, creates a temporary detached worktree at that commit, and runs `bun install` followed by `npm run build` there — never in the primary working tree. If the primary tree has uncommitted changes or its `HEAD` differs from `origin/main`, the command notes that those changes are excluded and continues with the canonical build. If installation or build fails, it leaves the current dashboard running and exits non-zero; after a successful build, it keeps the detached worktree as the active deployment root and launches its `dist/dashboard/server.js` with its canonical runtime dependencies and workspace packages intact, leaves the primary checkout's `node_modules/` untouched, refreshes the primary `dist/` CLI mirror with a dependency link back to that deployment root, then restarts the dashboard and waits for `http://127.0.0.1:3011/api/health`. Deployments alternate between two fixed generation worktrees. A failure before the new process is left running restores the prior marker and primary `dist/` and removes the failed generation. A health timeout keeps the new deployment active because the dashboard is deliberately left running so a slow boot can finish or a failed boot can be inspected. Retries still reuse one of the two fixed slots, so failures cannot accumulate unbounded dependency trees.
18
18
 
19
19
  `npm run build` already rebuilds the dashboard **server** bundle (via `build-post-cli.mjs` → `build:dashboard:server:bundle`), so `pan reload` picks up server/deacon code changes — you do **not** need a separate `npm run build:dashboard:server`. The `bun install` step runs first so a merge/rebase that added a runtime dependency (e.g. `chokidar`) can't produce a freshly-built server that boot-crashes with `ERR_MODULE_NOT_FOUND`.
20
20
 
21
21
  ## Options
22
22
 
23
23
  - `--skip-build` — restart the current bundle without running `bun install` or `npm run build`.
24
- - `--force` — bypass the deploy-window gate for an agent-issued reload. Without it, active verification, merge, post-merge, flywheel, restart, or `pan dev` ownership refuses the reload because it would disconnect live conversations and terminals.
24
+ - `--force` — explicitly bypass the deploy-window gate. Without it, a refused agent-issued reload queues the deploy, reports its age and distinct verification blockers, and self-fires at the next safe verification boundary. Do not retry-loop or use `--force` to interrupt healthy verification; reserve the bypass for exceptional operator recovery.
25
25
  - `--health-timeout <ms>` — set the dashboard health-check budget. The default is `30000`.
26
26
  - `--no-deacon` — restart without Cloister/Deacon auto-start.
27
27
 
@@ -34,7 +34,7 @@ pan restart --traefik
34
34
  pan restart --full # nuclear — stops & restarts everything
35
35
 
36
36
  # Explicit force cases
37
- pan restart --force # bypass the agent deploy-window gate
37
+ pan restart --force # explicit operator bypass of the deploy-window gate
38
38
  pan restart --cliproxy --force # redownload the pinned CLIProxy binary
39
39
  ```
40
40
 
@@ -61,9 +61,10 @@ server is a failure, not a successful restart.
61
61
  - `pan restart --dashboard` NEVER touches CLIProxy, Traefik, or TLDR — that
62
62
  scope contract is enforced by tests.
63
63
  - Agent-issued dashboard and full restarts consult the deploy-window gate before
64
- acquiring the restart lock. Active verification, merge, post-merge, flywheel,
65
- restart, or `pan dev` ownership refuses the restart because it would disconnect
66
- live conversations and terminals; `--force` explicitly bypasses this gate.
64
+ acquiring the restart lock. A refusal queues the deploy, reports its age and
65
+ distinct verification blockers, and self-fires at the next safe verification
66
+ boundary. Do not retry in a loop or use `--force` to interrupt healthy verification;
67
+ `--force` remains the explicit operator bypass for exceptional recovery.
67
68
  - For `--cliproxy`, `--force` has a separate meaning: it redownloads the binary at
68
69
  the pinned version before restarting it.
69
70
  - If the dashboard restart fails, shared sidecars are left running so recovery
@@ -1,12 +1,13 @@
1
1
  ---
2
2
  name: pan-review
3
- description: "pan review <subcommand> — manage the code review lifecycle: list pending work, set quick/full mode, re-request review, reset/abort/restart review cycles"
3
+ description: "pan review <subcommand> — manage the code review lifecycle: list pending work, re-request review, heal status drift, reset/abort/restart review cycles"
4
4
  triggers:
5
5
  - pan review
6
6
  - review pending
7
7
  - request review
8
8
  - review mode
9
9
  - reset review
10
+ - resync review
10
11
  - restart review
11
12
  - abort review
12
13
  - code review lifecycle
@@ -30,6 +31,7 @@ pan review pending --blocked # List blocked review/test/me
30
31
  pan review request <id> # Re-request review after fixing feedback
31
32
  pan review mode <id> <quick|full> # Set this issue's review mode override
32
33
  pan review reset <id> [--session] # Reset review/test/merge cycles (human override)
34
+ pan review resync <id> # Re-emit canonical status to heal dashboard drift
33
35
  pan review abort <id> # Kill all running reviewers, leave worker idle
34
36
  pan review restart <id> [--model <m>] [--role <r>] # Kill reviewers and dispatch a fresh review pipeline
35
37
  ```
@@ -54,6 +56,9 @@ pan review restart <id> [--model <m>] [--role <r>] # Kill reviewers and dispatch
54
56
  pipeline can be re-dispatched from scratch. Use when the saved state is
55
57
  inconsistent or corrupt. `--session` additionally clears the saved Claude
56
58
  session for each reviewer so they restart with a clean conversation.
59
+ - **`resync <id>`** — Reads the canonical review status and re-emits it without
60
+ changing any verdict. Use when an issue passed review but is missing from
61
+ Awaiting Merge or its actions are wrongly gated by stale dashboard state.
57
62
  - **`abort <id>`** — Kills any currently running reviewer sessions but
58
63
  leaves the work agent alone. Use when reviewers are stuck or running
59
64
  against the wrong commit and you want to halt without resetting state.
@@ -77,6 +82,7 @@ pan review restart <id> [--model <m>] [--role <r>] # Kill reviewers and dispatch
77
82
  | This issue needs the full review convoy | `pan review mode <id> full` |
78
83
  | Return an issue to default quick review | `pan review mode <id> quick` |
79
84
  | Pipeline state is inconsistent, need a clean slate | `pan review reset <id>` |
85
+ | Issue passed but is missing from Awaiting Merge or actions are wrongly gated | `pan review resync <id>` |
80
86
  | Same as above plus reviewer Claude sessions are bad | `pan review reset <id> --session` |
81
87
  | Reviewer is hung, just kill it | `pan review abort <id>` |
82
88
  | Reviewer crashed, want a fresh convoy with a different model | `pan review restart <id> --model gpt-5.4` |
@@ -30,12 +30,12 @@ curl -X POST http://localhost:3011/api/issues/PAN-XXX/sync-main
30
30
  ## What It Does
31
31
 
32
32
  1. Checks for uncommitted changes (blocks if any — must commit, explicitly discard, or surface to the operator first; agents never `git stash`)
33
- 2. Cleans up any stale git locks
34
- 3. Runs `git fetch origin main`
35
- 4. Runs `git merge origin/main`
36
- 5. If clean merge: reports commit count and changed files
37
- 6. If conflicts: wakes the merge-agent specialist to resolve them
38
- 7. After conflict resolution: scans for leftover markers, then reports result
33
+ 2. Resolves the workspace's required git repos; monorepos produce one repo root
34
+ 3. Cleans up stale git locks in each repo
35
+ 4. Fetches and merges each repo's configured target branch sequentially in config order
36
+ 5. Stops at the first failed or conflicted repo and marks later repos skipped
37
+ 6. If clean: reports aggregate commit/file totals plus one result per repo
38
+ 7. If conflicts remain: aborts that repo's merge and reports its conflict files
39
39
 
40
40
  ## Outcomes
41
41
 
@@ -44,14 +44,15 @@ curl -X POST http://localhost:3011/api/issues/PAN-XXX/sync-main
44
44
  | Already up to date | Main has no new commits since last sync |
45
45
  | Success (N commits) | Clean merge or agent-resolved conflicts |
46
46
  | Uncommitted changes | Commit or discard workspace changes first |
47
- | Conflict (unresolvable) | Agent could not resolve — merge aborted, workspace unchanged |
47
+ | Conflict (unresolvable) | The failing repo's merge is aborted and its conflict files are reported |
48
+ | Per-repo / skipped | Polyrepo output shows each repo's result; repos after the first failure are skipped |
48
49
 
49
50
  ## Design Decisions
50
51
 
51
52
  - **Merge, not rebase** — Rebase rewrites SHAs and requires force-push. Merge commits serve as audit markers.
52
53
  - **No tests/builds** — Feature branch is WIP. Running tests after sync would fail on pre-existing issues.
53
54
  - **No push to remote** — This is a local workspace operation only.
54
- - **All-or-nothing for polyrepo** — If any repo fails, all are aborted (not implemented yet; sync is per-workspace).
55
+ - **Sequential polyrepo sync** — Required repos sync in config order. The first failure stops iteration; earlier merges remain, later repos are skipped, and output reports every repo's result.
55
56
 
56
57
  ## Examples
57
58
 
@@ -86,7 +86,11 @@ don't appear via `/api/issues` filtering.
86
86
  ### 1. Generate the table
87
87
 
88
88
  Run this script. It gets the row universe from `GET /api/pipeline/membership`,
89
- then joins issue titles, review status, tmux, and agent state as annotations.
89
+ then joins issue titles, review status, tmux, and agent state as annotations. A
90
+ bare array is a successful answer. An HTTP 200 object with
91
+ `status: "unavailable"` is a typed blind spot; show its `projectKey`, `reason`,
92
+ and `message`, then stop instead of deriving membership from another source.
93
+ HTTP 503 means the first snapshot is still loading and may be retried later.
90
94
 
91
95
  ```bash
92
96
  python3 - <<'PY'
@@ -100,6 +104,11 @@ issues_data = json.loads(subprocess.check_output(['curl','-s','http://localhost:
100
104
  membership = json.loads(subprocess.check_output([
101
105
  'curl','-s','http://localhost:3011/api/pipeline/membership?project=overdeck'
102
106
  ]))
107
+ if isinstance(membership, dict) and membership.get('status') == 'unavailable':
108
+ raise SystemExit(
109
+ 'PIPELINE MEMBERSHIP UNAVAILABLE: '
110
+ f"{membership.get('projectKey')} — {membership.get('reason')}: {membership.get('message')}"
111
+ )
103
112
  issues_by_id = {(i.get('identifier') or '').upper(): i for i in issues_data}
104
113
  panissues = []
105
114
  for member in membership:
@@ -14,6 +14,7 @@ Run from the workspace root:
14
14
  ```bash
15
15
  pan workspace add-repo <workspace-id> <repo-name> [repo-name...]
16
16
  pan workspace add-repo <workspace-id> --group <group-name>
17
+ pan workspace add-repo <workspace-id> --new <git-url>
17
18
  ```
18
19
 
19
20
  Examples:
@@ -25,8 +26,11 @@ pan workspace add-repo int-123 int-provider-a int-canonical-to-hs
25
26
  # Add a named group
26
27
  pan workspace add-repo int-123 --group simphony
27
28
 
28
- # Add all repos
29
+ # Add all configured repos
29
30
  pan workspace add-repo int-123 --group all
31
+
32
+ # Register a repo created as part of this issue
33
+ pan workspace add-repo int-123 --new git@github.com:acme/new-service.git
30
34
  ```
31
35
 
32
36
  ## How to decide which repos you need
@@ -40,7 +44,18 @@ pan workspace add-repo int-123 --group all
40
44
  The new repos appear as subdirectories in the workspace with feature branches ready.
41
45
  Run git commands inside each repo subdirectory.
42
46
 
47
+ ## New deliverable repositories
48
+
49
+ Run `--new <git-url>` before cloning or committing in a repository created during the issue. Overdeck clones the project-level source repo, creates the issue feature worktree, and registers it so review, inspection, and merge include it.
50
+
51
+ If the repo name inferred from the URL is not suitable, pass the workspace directory name before `--new`:
52
+
53
+ ```bash
54
+ pan workspace add-repo int-123 service --new git@github.com:acme/new-service.git
55
+ ```
56
+
43
57
  ## Notes
44
58
 
59
+ - An unknown repo name without `--new` fails instead of silently reporting success
45
60
  - Meta repos (symlinked) are readonly — do NOT commit changes to them
46
61
  - Use `--dry-run` first to see what would be added without making changes
@@ -1,3 +0,0 @@
1
- import { a as init_activity_logger, n as emitActivityEntrySync, r as emitActivityTtsSync } from "./activity-logger-DDlOIAML.js";
2
- init_activity_logger();
3
- export { emitActivityEntrySync, emitActivityTtsSync };
@@ -1,3 +0,0 @@
1
- import { Bn as clearAgentPausedSync, Hn as clearAgentTroubledSync, Xn as init_agent_state, Yn as getAgentStateSync, dr as setAgentPausedSync } from "./queries-CjNIf-Ub.js";
2
- init_agent_state();
3
- export { clearAgentPausedSync, clearAgentTroubledSync, getAgentStateSync, setAgentPausedSync };
@@ -1,3 +0,0 @@
1
- import { $ as appendActivity, $n as isRole, $t as OHMYPI_AGENT_READY_TIMEOUT_SECONDS, An as buildDefaultResumeContinueMessage, Ar as saveAgentRuntimeState, At as deliverAgentPermissionDecision, B as detectCrashedAgents, Bn as clearAgentPausedSync, Bt as assertWorkspaceStackHealthyForSpawn, C as replayCrashedStandingAgent, Cn as getProviderEnvForModel, Cr as normalizeAgentId, Dr as getAgentRuntimeState, Er as waitForReadySignal, Fn as writeChannelsBridgeMcpConfig, G as resumeAgent, Gn as getAgentDir, Gt as transitionIssueToInProgress, H as restartAgent, Hn as clearAgentTroubledSync, In as GOVERNOR_SLOT_PAUSE_REASON_PREFIX, Jn as getAgentStateFilePath, Kt as transitionIssueToInReview, Ln as SESSION_EXITED_BEFORE_KICKOFF, Mn as decideChannelsForWorkAgent, Mt as deliverResumeMessageWithTranscriptConfirmation, Nn as decideSupervisorForWorkAgent, Nt as setAgentDeliveryMethod, Or as getAgentRuntimeStateSync, Pn as dismissDevChannelsDialog, Qn as isAgentTroubled, Rn as __testInternals, S as contextWindowForModel, Sn as determineModel, Sr as isQualifiedAgentId, T as shouldReplayCompactAtTierRunBoundary, Tn as getProviderTmuxFlags, Tr as waitForAgentIdle, U as buildCompactRecoverySeed, Un as clearYieldForResumeSync, V as recoverAgent, Vn as clearAgentTroubled, Vt as buildAgentLaunchConfig, Wt as retrieveSpawnTimeMemoryContext, X as messageAgent, Yn as getAgentStateSync, Zn as isAgentPaused, a as listRunningAgentsSync, an as getProviderAuthMode, ar as recordAgentFailureSync, at as saveSessionId, b as init_agents, bn as buildCavemanExports, cn as injectPiConversationMemory, cr as saveAgentState, dn as waitForPromptReady, dr as setAgentPausedSync, en as describeOhmypiSpawnFailure, et as getActivity, fr as setAgentYieldedSync, ft as stopAgent, i as listRunningAgents, ir as recordAgentFailure, jn as buildResumeContinueMessage, jt as deliverInitialPromptWithRetry, kt as deliverAgentMessage, ln as roleAgentDefinitionPath, lr as saveAgentStateSync, lt as spawnAgent, mr as writeAgentStateJsonSync, nn as getAgentRuntimeBaseCommand, nr as markAgentStoppedState, nt as getLatestSessionIdSync, o as warnOnBareNumericIssueIds, on as getRoleRuntimeBaseCommand, pr as wipeAgentStateDirs, pt as stopAgentSync, qn as getAgentState, r as listAgentStates, rr as markAgentTroubled, rt as getSessionId, sr as resetAgentFailureCount, t as dropLegacyAgentStatesMissingRoleAsync, tr as markAgentRunningState, tt as getLatestSessionId, ur as setAgentPaused, ut as spawnRun, w as replayStandingAgent, wn as getProviderExportsForModel, wr as resolveAgentTargetSync, x as compactAtTierRunBoundary, xn as buildSpawnEnvForModel, xr as clearReadySignal, z as autoRecoverAgents, zn as clearAgentPaused } from "./queries-CjNIf-Ub.js";
2
- init_agents();
3
- export { GOVERNOR_SLOT_PAUSE_REASON_PREFIX, OHMYPI_AGENT_READY_TIMEOUT_SECONDS, SESSION_EXITED_BEFORE_KICKOFF, __testInternals, appendActivity, assertWorkspaceStackHealthyForSpawn, autoRecoverAgents, buildAgentLaunchConfig, buildCavemanExports, buildCompactRecoverySeed, buildDefaultResumeContinueMessage, buildResumeContinueMessage, buildSpawnEnvForModel, clearAgentPaused, clearAgentPausedSync, clearAgentTroubled, clearAgentTroubledSync, clearReadySignal, clearYieldForResumeSync, compactAtTierRunBoundary, contextWindowForModel, decideChannelsForWorkAgent, decideSupervisorForWorkAgent, deliverAgentMessage, deliverAgentPermissionDecision, deliverInitialPromptWithRetry, deliverResumeMessageWithTranscriptConfirmation, describeOhmypiSpawnFailure, detectCrashedAgents, determineModel, dismissDevChannelsDialog, dropLegacyAgentStatesMissingRoleAsync, getActivity, getAgentDir, getAgentRuntimeBaseCommand, getAgentRuntimeState, getAgentRuntimeStateSync, getAgentState, getAgentStateFilePath, getAgentStateSync, getLatestSessionId, getLatestSessionIdSync, getProviderAuthMode, getProviderEnvForModel, getProviderExportsForModel, getProviderTmuxFlags, getRoleRuntimeBaseCommand, getSessionId, injectPiConversationMemory, isAgentPaused, isAgentTroubled, isQualifiedAgentId, isRole, listAgentStates, listRunningAgents, listRunningAgentsSync, markAgentRunningState, markAgentStoppedState, markAgentTroubled, messageAgent, normalizeAgentId, recordAgentFailure, recordAgentFailureSync, recoverAgent, replayCrashedStandingAgent, replayStandingAgent, resetAgentFailureCount, resolveAgentTargetSync, restartAgent, resumeAgent, retrieveSpawnTimeMemoryContext, roleAgentDefinitionPath, saveAgentRuntimeState, saveAgentState, saveAgentStateSync, saveSessionId, setAgentDeliveryMethod, setAgentPaused, setAgentPausedSync, setAgentYieldedSync, shouldReplayCompactAtTierRunBoundary, spawnAgent, spawnRun, stopAgent, stopAgentSync, transitionIssueToInProgress, transitionIssueToInReview, waitForAgentIdle, waitForPromptReady, waitForReadySignal, warnOnBareNumericIssueIds, wipeAgentStateDirs, writeAgentStateJsonSync, writeChannelsBridgeMcpConfig };