chainlesschain 0.166.6 → 0.166.7

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 (189) hide show
  1. package/package.json +3 -1
  2. package/src/assets/web-panel/assets/{AIOps-CVnFjTfG.js → AIOps-BlrmQxa2.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BxkwuuQC.js → ActionButton-zyRyLITg.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-C2670q6z.js → Analytics-DwGz7OGN.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-CU_rylW6.js → AppLayout-Dc-nj7Zd.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-DGJmYqnj.js → Artifacts-7Hu3O73p.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-BZOQbINJ.js → Audit-Bnoe3-fR.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DghB4QwF.js → BackgroundAgents-BqYFrDKZ.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-l0mwPbta.js → Backup-B3hwW1nz.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-Bv3WSZOh.js → BaseInput-XFVxLA4w.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-s88nBdvt.js → Chat-CWRDNw7e.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Z8CBuB1a.js → ChatBubbleRenderer-Bf30VM8G.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-B5icasEs.js → Checkbox-kFeeBgac.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-CsUFqNud.js → Codegen-CCxp8xoI.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DlBtClaW.js → Col-BLKZalle.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-xRn1IdLB.js → Community-DD0eWCez.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-naIr8a_o.js → Compact-CHqHWdy0.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Dp9esfFE.js → Compliance-Bw54uPiK.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-DQlMYJB-.js → Cowork-DZ13zKNJ.js} +4 -4
  20. package/src/assets/web-panel/assets/{Cron-Cd0oNLzJ.js → Cron-Dlj5Jevg.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BtDIx3XX.js → Crosschain-Nvz0aR0j.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-BOlpzEwg.js → DID-Ct89eUyY.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-DV15Axk1.js → Dashboard-BHUH5IAe.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-COXrewN1.js → Dropdown-BhZG-PO7.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-EjIt0Cm7.js → EmailListRenderer-ae4RVwwJ.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DJlhwb-R.js → FamilyGuardDashboard-AOcxLfLr.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BMiFl82k.js → Federation-BK2PJQOF.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-BUcDQyxn.js → FormItemContext-C2n3xO2_.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-C25uFxvK.js → GenericCardRenderer-DcyUVFZq.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-D20uaEUU.js → Git-tBae9Lt8.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CQxYJjCX.js → Governance-DmNR3AP4.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-m-sczpS5.js → Inference-CoseEigi.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-CBsIlU0S.js → KnowledgeGraph-Bdjd1sxr.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-D0-5bqeu.js → Logs-CtlkKIcn.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-BwH414Ms.js → MarkdownRenderer-CZsTBEQE.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-CwDGFu2Q.js → Marketplace-BTYb7nEx.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-7FxJ3omT.js → McpTools-D0iUdW3P.js} +2 -2
  38. package/src/assets/web-panel/assets/{Memory-DOVyb59U.js → Memory--gwI7w4Y.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DZXl-Hje.js → MobileBridge-JmFBi24T.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DlZ8tRXt.js → MobileProjects-BK01cQRx.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-D7Pjx1s_.js → Mtc-u7avzyoO.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-BND7lX8p.js → MtcAudit-gT3z5fo_.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-BknS7B-p.js → Multisig-BIqZTz5n.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-7C2-KPHt.js → NLProgramming-DdhVfXYq.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-DNWdTndN.js → Notes-CBlyUmY3.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-DCm4KcJZ.js → NotificationSettings-DSyI26N3.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-DyVwwjJx.js → OrderTableRenderer-B7IEuNz4.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Dl2O_qJ9.js → Organization-ozhi4kGS.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-BOFCvk9Q.js → Overflow-CBy57RVM.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-DgdVowY1.js → P2P-CA-ZRv77.js} +2 -2
  51. package/src/assets/web-panel/assets/PdhVaultBrowser-DOHc9zm8.js +7 -0
  52. package/src/assets/web-panel/assets/{Permissions-BHNEUUwa.js → Permissions-DiP632GP.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CaZbrOdz.js → PersonalDataHub-AnU8O-SS.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-DJDnoXmE.js → Pipeline-DDibOUaP.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CBQr2eX8.js → Privacy-D421t36T.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-Yghqa06z.js → ProjectInit-DR879ZPJ.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-HBAtJi8U.js → ProjectSettings-Ded8o6aY.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-DiCGnMjz.js → Projects-BHPxiucB.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-uJTz77GI.js → Providers-Boivuu-E.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-k3M5ouTp.js → QrScannerModal-xKD_ntKp.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CMji45PH.js → QuickAsk-D3y_A6FV.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DyoZYPls.js → Recommend-BjKM-YC2.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-s1gR38IO.js → RemoteSession-CgqKMXG4.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-D4hIs4vV.js → Reputation-Ci2GjH5p.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-mzE-ElTg.js → Row-B0-T2BSh.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-cg7J3hI6.js → RssFeed-Bet-ur-r.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-6M0TkGSZ.js → Search-DWtRAS2R.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-B1GQ67qh.js → Security-BDfu2Qn6.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-D_RwU_5S.js → Services-CvJmvSMM.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-TZjk-dsW.js → Skeleton-CEbrKpdC.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CG6FcaCV.js → Skills-CjVeiETf.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-BI190QDv.js → Sla-Dibypxum.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-BWmxF2Wu.js → SpeechSettings-XflYXp7a.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-CwPiGw6L.js → SyncSettings-ro1Ivx1E.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-BIXgCeSk.js → Tasks-CHq1qFbo.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-CQFgGCoK.js → Templates-CRnUZxtZ.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-DAelEdkL.js → Tenant-jUX72JCA.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BbqWK6qh.js → Terminal-BBhAs7pt.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-cmG3zvY5.js → TimelineRenderer-CD5M3RGp.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-C8444NKU.js → Tokens-sah3v0gu.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-C1Rpnz0I.js → Trigger-BNT3Uz3s.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-u4koPiFD.js → Trust-BytMGPMo.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-oPWKn80Z.js → UkeySign-BkYVMRQs.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-D0CUUY_5.js → VideoEditing-psvb5Q7Y.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-fu9pIAbt.js → Wallet-PFQTW0MH.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-Bc5ciuOx.js → WebAuthn-DgO-OwRT.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BCin4_4N.js → WorkflowEditor-DL2l9VNl.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-B2jbM-XN.js → chat-C84akEzN.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-CUVoUQ_2.js → colors-DzTWuQKP.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-DgOGpkRH.js → compact-item-CR9LJQFv.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DIxU6eKI.js → createContext-CTTov5Kn.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-BOhvmlpc.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DoKRKMav.js → hasIn-DALj523o.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-i5MB455u.js → index-3-XJoYgX.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CLdpHe6w.js → index-7ux_XohH.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B3F_p8NA.js → index-AXnERsyV.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D2yo6ast.js → index-B2qpjU-D.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CWbL1-N0.js → index-B6QOJbSn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DtyAuGOm.js → index-BDyt57zL.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DpTFx8Xx.js → index-BHRXKiU1.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CF80xxPG.js → index-BKNIzw0U.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BRMEO2Tl.js → index-BNaQt49r.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-ByjrulIZ.js → index-Be6Os5S8.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BCLeNqIL.js → index-C5eeMl_2.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DJMHnbmu.js → index-CNmTDXmf.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-2flsPFIX.js → index-CXTEpfGe.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BwYofQJg.js → index-CXaCRXN4.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B5ySiGYy.js → index-CZhhFQi9.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CeWSw-z5.js → index-Cef0n4k_.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C846lPGD.js → index-CjkPDSX4.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-C9TsO9T9.js → index-CmELknPe.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CqlwIjJx.js → index-CnxjXIsK.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Co4lDEk-.js → index-CqUgXYIQ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cj-us-D_.js → index-CunGDV0g.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BFUprhNd.js → index-D0MqUnKO.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DGTZdZOE.js → index-D9ScRFxz.js} +3 -3
  117. package/src/assets/web-panel/assets/{index-C88m9lsi.js → index-DBIPnoTj.js} +1 -1
  118. package/src/assets/web-panel/assets/index-DDyMJexx.js +1 -0
  119. package/src/assets/web-panel/assets/{index-BXb-Smmm.js → index-DH6OG-ci.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-eTWPaeBI.js → index-DZER6Lj3.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Cskz--fd.js → index-D_Bg0LdK.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-D-ufbAJB.js → index-Dah8M4l2.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DHugFl3v.js → index-DjE_ew7U.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B9mSYovv.js → index-DtW6Zr_i.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Ds8r3Fzb.js → index-DxdzSljS.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CPXdBnGi.js → index-QW0EXx14.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-B-f6l4Vm.js → index-W9axN_Ce.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CpvyOt5Z.js → index-_8vetPbU.js} +1 -1
  129. package/src/assets/web-panel/assets/index-btiojFYn.js +1 -0
  130. package/src/assets/web-panel/assets/{index-eYxUASSG.js → index-eJcFleIV.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-be8SonCh.js → index-hzzTITR9.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BtSPhEyC.js → index-s4CFyn-n.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-B4chl7iR.js → initDefaultProps-JuW8mFj7.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-DruN9h96.js → motion-Cwb0HBve.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-Cl0UtCgU.js → move-DHokzMgu.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-FX2ttw70.js → mtc-parser-DX31y6QS.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BDCneY46.js → omit-BCIUYDA6.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-DycsEg8b.js → pickAttrs-DMCj4EoZ.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-Bc-dBuMv.js → placementArrow-Dy5K-u1s.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve--Wwaf8lu.js → responsiveObserve-DkGeZu54.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-vDmHQqHH.js → slide-Dc5dyJdg.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-9c52yv3G.js → statusUtils-DIUBjOaC.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BT4BiO6_.js → styleChecker-DmyEOxm5.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-C7XxWPcP.js → useFlexGapSupport-FRhakk1e.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BHoMqh4i.js → useFs-clXyV1WQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-BOLxvsAG.js → usePersonalDataHub-UF6DG41z.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-CA7poeeP.js → vnode-CoCt95G7.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B_sAn-co.js → zoom-yVWt-ENm.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/graph.js +215 -5
  151. package/src/commands/team-distributed.js +342 -2
  152. package/src/commands/team.js +169 -7
  153. package/src/data/changelog.json +13 -0
  154. package/src/generated/cc-agent-protocol.schema.json +6 -1
  155. package/src/lib/agent-team/task-lease.js +315 -0
  156. package/src/lib/agent-team/team-agent-stream.js +16 -0
  157. package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
  158. package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
  159. package/src/lib/agent-team/team-distributed-queue.js +251 -0
  160. package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
  161. package/src/lib/agent-team/team-runner.js +225 -2
  162. package/src/lib/app-server/graph-runtime.js +754 -0
  163. package/src/lib/app-server/rollout-store.js +32 -0
  164. package/src/lib/app-server/server.js +140 -0
  165. package/src/lib/autonomous-agent.js +11 -0
  166. package/src/lib/cowork-graph-authority-adapter.js +455 -0
  167. package/src/lib/dynamic-workflow-facade.js +83 -16
  168. package/src/lib/graph-kernel/adapters.js +93 -20
  169. package/src/lib/graph-kernel/authority.js +324 -0
  170. package/src/lib/graph-kernel/compiler.js +1 -8
  171. package/src/lib/graph-kernel/cutover-authority-resolver.js +219 -0
  172. package/src/lib/graph-kernel/cutover-ledger.js +650 -0
  173. package/src/lib/graph-kernel/event-store.js +15 -1
  174. package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
  175. package/src/lib/graph-kernel/index.js +4 -0
  176. package/src/lib/graph-kernel/migration-saga.js +309 -0
  177. package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
  178. package/src/lib/graph-kernel/runtime.js +661 -24
  179. package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
  180. package/src/lib/graph-kernel/trace-reducer.js +6 -0
  181. package/src/lib/graph-kernel/trigger-adapter.js +60 -3
  182. package/src/lib/legacy-runtime-authority.js +160 -0
  183. package/src/lib/orchestrator.js +28 -0
  184. package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
  185. package/src/lib/scheduler-kernel/runtime.js +75 -2
  186. package/src/assets/web-panel/assets/PdhVaultBrowser-BiaZfQIM.js +0 -7
  187. package/src/assets/web-panel/assets/devWarning-DiSlgCC4.js +0 -1
  188. package/src/assets/web-panel/assets/index-9WIQEHvv.js +0 -1
  189. package/src/assets/web-panel/assets/index-B7mDobAl.js +0 -1
@@ -126,6 +126,37 @@ export class TeamRunner {
126
126
  typeof opts.beforeTask === "function" ? opts.beforeTask : null;
127
127
  this.afterTask =
128
128
  typeof opts.afterTask === "function" ? opts.afterTask : null;
129
+ // Canonical Graph settlement happens after the executor has physically
130
+ // settled but before the legacy registry projection is updated. This hook
131
+ // is fail-closed: a Graph write failure cannot be converted into legacy
132
+ // task success.
133
+ this.canonicalSettlement =
134
+ typeof opts.canonicalSettlement === "function"
135
+ ? opts.canonicalSettlement
136
+ : null;
137
+ // In canonical rollout the Graph Kernel owns the ready frontier. The task
138
+ // registry remains a compatibility/lease projection and cannot make a node
139
+ // executable when Graph still considers it blocked.
140
+ this.canonicalReady =
141
+ typeof opts.canonicalReady === "function" ? opts.canonicalReady : null;
142
+ // Shadow settlement observes the already-produced executor outcome and
143
+ // never owns effects. Divergence is visible but cannot change the legacy
144
+ // result while a surface is still in shadow rollout.
145
+ this.shadowSettlement =
146
+ typeof opts.shadowSettlement === "function"
147
+ ? opts.shadowSettlement
148
+ : null;
149
+ // Whole-run cancellation follows the same rollout contract as settlement.
150
+ // Canonical cancellation is fail-closed and must finish before run() can
151
+ // return/throw; shadow cancellation is observation-only.
152
+ this.canonicalCancellation =
153
+ typeof opts.canonicalCancellation === "function"
154
+ ? opts.canonicalCancellation
155
+ : null;
156
+ this.shadowCancellation =
157
+ typeof opts.shadowCancellation === "function"
158
+ ? opts.shadowCancellation
159
+ : null;
129
160
  // A lease that expires and is reacquired receives a new fencing identity.
130
161
  // Persist that identity synchronously before the executor can settle under
131
162
  // it. Ordinary renewals keep the same identity and do not call this hook.
@@ -169,6 +200,10 @@ export class TeamRunner {
169
200
  this._budgetStopped = false;
170
201
  this._registryBudgetReason = null;
171
202
  this._fatalError = null;
203
+ this._canonicalCancellationRequested = false;
204
+ this._shadowCancellationRequested = false;
205
+ this._cancellationPromise = null;
206
+ this._cancellationFailure = null;
172
207
  // Idle workers wait on graph progress instead of polling the full graph
173
208
  // through setTimeout(0). This matters once a team has many workers but only
174
209
  // a narrow DAG frontier.
@@ -1164,6 +1199,7 @@ export class TeamRunner {
1164
1199
  requestedAt: this._now(),
1165
1200
  };
1166
1201
  }
1202
+ this._requestRunCancellation(failure);
1167
1203
  this._setFatal(failure, { phase: "external-control" });
1168
1204
  for (const claim of this._claimsByKey.values()) {
1169
1205
  claim.coordinatorAbort = failure;
@@ -1176,6 +1212,58 @@ export class TeamRunner {
1176
1212
  return { ok: true, activeClaims: this._claimsByKey.size };
1177
1213
  }
1178
1214
 
1215
+ _requestRunCancellation(failure) {
1216
+ const request = {
1217
+ reason: failure.message,
1218
+ error: failure,
1219
+ requireAdjudication: failure.adjudication != null,
1220
+ };
1221
+ if (this.canonicalCancellation && !this._canonicalCancellationRequested) {
1222
+ this._canonicalCancellationRequested = true;
1223
+ let cancellation;
1224
+ try {
1225
+ cancellation = this.canonicalCancellation(request);
1226
+ } catch (error) {
1227
+ cancellation = Promise.reject(error);
1228
+ }
1229
+ this._cancellationPromise = Promise.resolve(cancellation).catch(
1230
+ (error) => {
1231
+ const authorityFailure = new Error(
1232
+ `Canonical Team Graph cancellation failed: ${error?.message || String(error)}`,
1233
+ { cause: error },
1234
+ );
1235
+ authorityFailure.code = "CC_TEAM_GRAPH_CANCEL_FAILED";
1236
+ authorityFailure.retryable = false;
1237
+ authorityFailure.abortCause = failure;
1238
+ this._cancellationFailure = authorityFailure;
1239
+ },
1240
+ );
1241
+ }
1242
+ if (this.shadowCancellation && !this._shadowCancellationRequested) {
1243
+ this._shadowCancellationRequested = true;
1244
+ let observation;
1245
+ try {
1246
+ observation = this.shadowCancellation(request);
1247
+ } catch (error) {
1248
+ observation = Promise.reject(error);
1249
+ }
1250
+ const shadow = Promise.resolve(observation).catch((error) => {
1251
+ this._emit("run:shadow-cancel-diverged", {
1252
+ code: error?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
1253
+ error: error?.message || String(error),
1254
+ });
1255
+ });
1256
+ this._cancellationPromise = this._cancellationPromise
1257
+ ? Promise.all([this._cancellationPromise, shadow])
1258
+ : shadow;
1259
+ }
1260
+ }
1261
+
1262
+ async _awaitRunCancellation() {
1263
+ await this._cancellationPromise;
1264
+ if (this._cancellationFailure) throw this._cancellationFailure;
1265
+ }
1266
+
1179
1267
  /**
1180
1268
  * Run the graph to completion (all tasks terminal) or until no teammate can
1181
1269
  * make progress (everything remaining is blocked/leased). Returns a summary.
@@ -1291,6 +1379,7 @@ export class TeamRunner {
1291
1379
  clearTimeout(timer);
1292
1380
  }
1293
1381
  this._handoffExpiryTimers.clear();
1382
+ await this._awaitRunCancellation();
1294
1383
  }
1295
1384
  if (this._fatalError) throw this._fatalError;
1296
1385
  const stats = this.registry.stats();
@@ -1546,6 +1635,24 @@ export class TeamRunner {
1546
1635
  return;
1547
1636
  }
1548
1637
  // Lost the race to a peer (or it just got blocked) — try another.
1638
+ if (
1639
+ this.canonicalReady &&
1640
+ !["leased", "concurrent", "no_claimable_task"].includes(acq.reason)
1641
+ ) {
1642
+ const error = new Error(
1643
+ `Canonical Graph declared task "${key}" ready but the legacy projection rejected it: ${acq.reason || "unknown"}`,
1644
+ );
1645
+ error.code = "CC_TEAM_GRAPH_LEGACY_PROJECTION_DIVERGED";
1646
+ this._setFatal(error, {
1647
+ phase: "legacy-ready-projection",
1648
+ key,
1649
+ holder,
1650
+ reason: acq.reason || null,
1651
+ });
1652
+ this._setState(holder, "shutdown", { reason: "fatal-error" });
1653
+ this._signalProgress();
1654
+ return;
1655
+ }
1549
1656
  this._setState(holder, "idle");
1550
1657
  await this._tick();
1551
1658
  continue;
@@ -2119,10 +2226,15 @@ export class TeamRunner {
2119
2226
  ) {
2120
2227
  return null;
2121
2228
  }
2122
- if (typeof this.registry.nextClaimable === "function") {
2229
+ const nextClaimable = this.canonicalReady
2230
+ ? (options) => this.canonicalReady({ holder, ...options })
2231
+ : typeof this.registry.nextClaimable === "function"
2232
+ ? (options) => this.registry.nextClaimable(options)
2233
+ : null;
2234
+ if (nextClaimable) {
2123
2235
  const excluded = new Set(this._activeKeys);
2124
2236
  for (let scanned = 0; scanned < this.maxScopeScan; scanned++) {
2125
- const key = this.registry.nextClaimable({ excludeKeys: excluded });
2237
+ const key = nextClaimable({ excludeKeys: excluded });
2126
2238
  if (!key) return null;
2127
2239
  const task = this.registry.getTask(key);
2128
2240
  const targetHolder =
@@ -2432,11 +2544,47 @@ export class TeamRunner {
2432
2544
  throw error;
2433
2545
  }
2434
2546
  }
2547
+ if (this.canonicalSettlement) {
2548
+ try {
2549
+ await this.canonicalSettlement({
2550
+ key,
2551
+ task,
2552
+ holder,
2553
+ lease: claim.lease,
2554
+ status: "completed",
2555
+ result,
2556
+ });
2557
+ claim.canonicalSettled = true;
2558
+ } catch (error) {
2559
+ error.canonicalSettlementFailed = true;
2560
+ throw error;
2561
+ }
2562
+ }
2435
2563
  const done = this.registry.complete(key, {
2436
2564
  holder,
2437
2565
  leaseId: claim.leaseId,
2438
2566
  result,
2439
2567
  });
2568
+ if (this.shadowSettlement) {
2569
+ try {
2570
+ await this.shadowSettlement({
2571
+ key,
2572
+ task,
2573
+ holder,
2574
+ lease: claim.lease,
2575
+ status: "completed",
2576
+ result,
2577
+ legacyAccepted: done.ok === true,
2578
+ });
2579
+ } catch (error) {
2580
+ this._emit("task:shadow-diverged", {
2581
+ key,
2582
+ holder,
2583
+ code: error?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
2584
+ error: error?.message || String(error),
2585
+ });
2586
+ }
2587
+ }
2440
2588
  if (done.ok) {
2441
2589
  if (span) span.end();
2442
2590
  this._setState(holder, "completed-task", {
@@ -2451,10 +2599,24 @@ export class TeamRunner {
2451
2599
  await this._notifySettlement({
2452
2600
  key,
2453
2601
  holder,
2602
+ task,
2603
+ lease: claim.lease,
2454
2604
  status: "completed",
2455
2605
  result,
2456
2606
  });
2457
2607
  } else {
2608
+ if (claim.canonicalSettled) {
2609
+ const error = new Error(
2610
+ `Legacy Team projection rejected canonical completion for ${key}: ${done.reason || "lease_lost"}`,
2611
+ );
2612
+ error.code = "CC_TEAM_LEGACY_PROJECTION_DIVERGED";
2613
+ error.retryable = false;
2614
+ this._setFatal(error, {
2615
+ phase: "legacy-projection",
2616
+ key,
2617
+ holder,
2618
+ });
2619
+ }
2458
2620
  if (span) {
2459
2621
  span.setAttribute("team.completion_discarded", true);
2460
2622
  span.end();
@@ -2500,6 +2662,33 @@ export class TeamRunner {
2500
2662
  claim.budgetSettled = true;
2501
2663
  }
2502
2664
  this._recordSessionUsage(claim, failure);
2665
+ if (
2666
+ this.canonicalSettlement &&
2667
+ !claim.canonicalSettled &&
2668
+ !(this._canonicalCancellationRequested && claim.coordinatorAbort) &&
2669
+ failure?.code !== "TEAM_HANDOFF_COMMITTED" &&
2670
+ failure?.canonicalSettlementFailed !== true
2671
+ ) {
2672
+ try {
2673
+ await this.canonicalSettlement({
2674
+ key,
2675
+ task,
2676
+ holder,
2677
+ lease: claim.lease,
2678
+ status: "failed",
2679
+ error: failure,
2680
+ });
2681
+ claim.canonicalSettled = true;
2682
+ } catch (canonicalError) {
2683
+ canonicalError.cause ||= failure;
2684
+ canonicalError.canonicalSettlementFailed = true;
2685
+ this._setFatal(canonicalError, {
2686
+ phase: "canonical-settlement",
2687
+ key,
2688
+ holder,
2689
+ });
2690
+ }
2691
+ }
2503
2692
  const outcome = this.registry.fail(key, {
2504
2693
  holder,
2505
2694
  leaseId: claim.leaseId,
@@ -2507,6 +2696,26 @@ export class TeamRunner {
2507
2696
  retryable: failure?.retryable !== false,
2508
2697
  adjudication: failure?.adjudication || null,
2509
2698
  });
2699
+ if (this.shadowSettlement) {
2700
+ try {
2701
+ await this.shadowSettlement({
2702
+ key,
2703
+ task,
2704
+ holder,
2705
+ lease: claim.lease,
2706
+ status: "failed",
2707
+ error: failure,
2708
+ legacyAccepted: outcome?.ok === true,
2709
+ });
2710
+ } catch (shadowError) {
2711
+ this._emit("task:shadow-diverged", {
2712
+ key,
2713
+ holder,
2714
+ code: shadowError?.code || "CC_TEAM_GRAPH_SHADOW_DIVERGED",
2715
+ error: shadowError?.message || String(shadowError),
2716
+ });
2717
+ }
2718
+ }
2510
2719
  if (outcome?.ok) {
2511
2720
  this._setState(holder, "failed-task", {
2512
2721
  error: failure?.message || String(failure),
@@ -2525,6 +2734,8 @@ export class TeamRunner {
2525
2734
  await this._notifySettlement({
2526
2735
  key,
2527
2736
  holder,
2737
+ task,
2738
+ lease: claim.lease,
2528
2739
  status: outcome.retry === true ? "pending" : "failed",
2529
2740
  error: failure?.message || String(failure),
2530
2741
  retry: outcome.retry === true,
@@ -2533,6 +2744,18 @@ export class TeamRunner {
2533
2744
  requestId: failure?.adjudication?.requestId || null,
2534
2745
  });
2535
2746
  } else {
2747
+ if (claim.canonicalSettled) {
2748
+ const error = new Error(
2749
+ `Legacy Team projection rejected canonical failure for ${key}: ${outcome?.reason || "lease_lost"}`,
2750
+ );
2751
+ error.code = "CC_TEAM_LEGACY_PROJECTION_DIVERGED";
2752
+ error.retryable = false;
2753
+ this._setFatal(error, {
2754
+ phase: "legacy-projection",
2755
+ key,
2756
+ holder,
2757
+ });
2758
+ }
2536
2759
  this._emit("task:failure-discarded", {
2537
2760
  key,
2538
2761
  holder,