chainlesschain 0.166.21 → 0.166.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/README.md +67 -9
  2. package/package.json +4 -3
  3. package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-DR-MWcZc.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-DT8B7sEb.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-asjh3dQJ.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-DivQ491i.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-DPH2uUmy.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-Bp2nLyc-.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-CHS28khl.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-CKeaFSfz.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-CxwM9BAH.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-DYLDwaCv.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-DdBJDBP0.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-uYTWOB8j.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-CvYa_dwT.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CanMAX4m.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-B4WaDtHw.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-K93Uof_3.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-CKeDLgUW.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-P93grAeB.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-BSHnMtDn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-epAOpUVJ.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-ByjXfP7t.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-QztTU8tb.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-DhUc9yhN.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-C2sLhJJN.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-CdfbWNDn.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-CcF_R7NW.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-Cm_X2IBk.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-DUi4NWlb.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-4Sq5FjBt.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-Dx2_v4V6.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-7Vr1xekR.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-Cnd2XOzf.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-B66QPVf-.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-PLsEvhly.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-BMIK9BmC.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BDbyp3J_.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CJdzfZGi.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-C2TH5Y3-.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-D1dYXkvV.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-B-4A1I1j.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-Bgcc9UOl.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-DqOe-etP.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-7VnhzE_6.js} +1 -1
  46. package/src/assets/web-panel/assets/Notes-BxawpeUQ.js +7 -0
  47. package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-Cr08G2aE.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-Ce8bEGlK.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-BC7lveGv.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CakOW-G0.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-Cf8CaOBZ.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-Dc7b98W9.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-DGJyMEfS.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-DNIwSdwu.js} +6 -6
  55. package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-5B1S12wa.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-CMB6Ke5t.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-D5PqTFiT.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CbKNdSjV.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-ccXaHzYL.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-CJF5_-Gs.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-CT6iEAdi.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-Ci0h9mJ_.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-Da5mobZu.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BaCY8eey.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-CaITfTsI.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DtUDamyP.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-DX27gFpg.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DFL69osN.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-BqGeoWv-.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-3z1WnEAc.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-C_OJQQ9Z.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BY7aT6Mo.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-BZv7DSaD.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-6lJKLhCn.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B6D7STlI.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-Co_FCZAO.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CnY-9fgz.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-B71yXfZ8.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-Dd_P7awo.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-CvIEMyli.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-DknFBGOi.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-D_4nJONB.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-BNl21fa7.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-CFrCI7uK.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-BVfY6JLg.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Cj9CAK0J.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DcqZlzA3.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-Dfr_dMld.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-Yv6UF0AD.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-CDW_-1fs.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-BYOQvd-6.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-BCGO0BiP.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-H-kXSuf-.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-DY-70cfQ.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-366wfQBU.js} +1 -1
  96. package/src/assets/web-panel/assets/index-B0o4MeNK.js +1 -0
  97. package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B9ZogJJM.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B00GeekA.js → index-B9m5QAMg.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index-BBs2mv5M.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-BFv1hzF6.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BVafOL_I.js +1 -0
  102. package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-BXlEx4UH.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-e-e40id6.js → index-BayRTE5w.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DXet1xol.js → index-Bb9nyts1.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-Bf_Va0S-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Br3wQLVY.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-BvK4fjkk.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-C40UdtlS.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-C4UJA2ju.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-CB_Iw73G.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-CCwWp3mT.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-CFa2fPCk.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-CIyHxV4u.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-CUP-A2_h.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-CUo27q9J.js} +3 -3
  116. package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-CaT8trvf.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-CnZNbcux.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Cy2NE6AO.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-CzeEEazr.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-D--TEyDj.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DCtsjhhT.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DLOf7BSz.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DM5c4pc-.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-DRFC2Qt0.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DT_qVaaV.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-DUDoRk9r.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-Dg-AQYDf.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-DuIPq5MX.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CGlotREA.js → index-NYVBUAVN.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-NaCESahy.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-RjIMPG0u.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-Y9akzgFO.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-hZ0Eyrrw.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-CG99CcR4.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Z7MH0_0G.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-BX67lOdq.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CmAbG1fE.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-DiU5tI1_.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-BGfvLrYL.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-CggLEgaJ.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-t3nlghPZ.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-BkV4dL9s.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-qec1PUoC.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-ChjX6T8D.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-B1jLoZcM.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-C3X53s4E.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DOvbbnkZ.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-Ie0TEVFT.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-CRUMVS8l.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +18 -1
  153. package/src/commands/evolution-benchmark.js +72 -0
  154. package/src/commands/evolution.js +2 -0
  155. package/src/commands/governed-skill-marketplace.js +142 -0
  156. package/src/commands/marketplace.js +4 -1
  157. package/src/commands/serve.js +41 -0
  158. package/src/commands/skill.js +3 -0
  159. package/src/data/changelog.json +39 -0
  160. package/src/gateways/ws/ws-agent-handler.js +59 -2
  161. package/src/gateways/ws/ws-server.js +2 -0
  162. package/src/harness/golden-transcript.js +1 -0
  163. package/src/harness/prompt-compressor.js +51 -5
  164. package/src/harness/provider-backed-compaction.js +28 -1
  165. package/src/harness/remote-session-registry.js +15 -3
  166. package/src/index.js +30 -4
  167. package/src/lazy-dispatch.js +15 -1
  168. package/src/lib/advisor-runtime.js +55 -2
  169. package/src/lib/app-server/cli-agent-kernel-adapter.js +4 -0
  170. package/src/lib/app-server/graph-runtime.js +32 -0
  171. package/src/lib/app-server/server.js +45 -1
  172. package/src/lib/app-server/websocket-transport.js +23 -0
  173. package/src/lib/autonomous-agent.js +63 -13
  174. package/src/lib/cowork/ab-comparator-cli.js +4 -3
  175. package/src/lib/cowork/debate-review-cli.js +4 -3
  176. package/src/lib/cowork/decision-kb-cli.js +5 -0
  177. package/src/lib/cowork-adapter.js +38 -16
  178. package/src/lib/evolution/agent-evolution-ingress.js +95 -15
  179. package/src/lib/evolution/agent-evolution-runtime-composition.js +82 -0
  180. package/src/lib/evolution/agent-evolution-session-lifecycle.js +46 -0
  181. package/src/lib/evolution/agent-model-projection.js +217 -0
  182. package/src/lib/evolution/bounded-descriptor-read.js +29 -0
  183. package/src/lib/evolution/controlled-skill-pilot-ledger-adapter.js +551 -0
  184. package/src/lib/evolution/controlled-skill-production-pilot.js +308 -18
  185. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +10 -1
  186. package/src/lib/evolution/evidence-json-text.js +236 -0
  187. package/src/lib/evolution/evolution-artifact-ports.js +202 -21
  188. package/src/lib/evolution/evolution-deployment-loader.js +369 -0
  189. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +373 -0
  190. package/src/lib/evolution/evolution-eval-gate.js +14 -1
  191. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +14 -0
  192. package/src/lib/evolution/evolution-eval-process-supervisor.js +607 -0
  193. package/src/lib/evolution/evolution-evidence-artifact-adapter.js +14 -1
  194. package/src/lib/evolution/evolution-evidence-projector.js +240 -37
  195. package/src/lib/evolution/evolution-file-witness.js +153 -30
  196. package/src/lib/evolution/evolution-ledger-ports.js +1027 -66
  197. package/src/lib/evolution/evolution-ledger.js +66 -2
  198. package/src/lib/evolution/evolution-raw-crypto-shred.js +29 -15
  199. package/src/lib/evolution/evolution-raw-deletion-ledger-adapter.js +865 -0
  200. package/src/lib/evolution/evolution-release-train-domain-stages.js +769 -0
  201. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  202. package/src/lib/evolution/evolution-release-train-stage-output-ledger-adapter.js +333 -0
  203. package/src/lib/evolution/evolution-release-train.js +586 -0
  204. package/src/lib/evolution/evolution-workbench-batch-executor.js +101 -144
  205. package/src/lib/evolution/evolution-workbench-control-ports.js +203 -0
  206. package/src/lib/evolution/evolution-workbench-file-resources.js +403 -0
  207. package/src/lib/evolution/evolution-workbench-projection.js +152 -25
  208. package/src/lib/evolution/evolution-workbench-registry-source.js +482 -0
  209. package/src/lib/evolution/evolution-workbench-review-ledger-adapter.js +823 -0
  210. package/src/lib/evolution/evolution-workbench-review-protocol.js +157 -0
  211. package/src/lib/evolution/evolution-workbench-rollback-authorization.js +57 -0
  212. package/src/lib/evolution/evolution-workbench-rollback-ledger-adapter.js +1016 -0
  213. package/src/lib/evolution/evolution-workbench-runtime.js +133 -0
  214. package/src/lib/evolution/evolution-workbench-version-control.js +70 -36
  215. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +736 -0
  216. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  217. package/src/lib/evolution/governed-knowledge-candidate-rejection.js +343 -0
  218. package/src/lib/evolution/governed-knowledge-dependency-authority.js +227 -44
  219. package/src/lib/evolution/governed-knowledge-dependency-ledger-executor.js +95 -83
  220. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
  221. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
  222. package/src/lib/evolution/governed-knowledge-record.js +148 -0
  223. package/src/lib/evolution/governed-knowledge-revocation-record.js +135 -0
  224. package/src/lib/evolution/governed-knowledge-skill-rollback.js +475 -0
  225. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
  226. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
  227. package/src/lib/evolution/governed-knowledge-sync.js +332 -99
  228. package/src/lib/evolution/governed-knowledge-wiki-tombstone.js +462 -0
  229. package/src/lib/evolution/governed-skill-marketplace-badge.js +208 -0
  230. package/src/lib/evolution/governed-skill-marketplace-candidate.js +330 -0
  231. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +308 -0
  232. package/src/lib/evolution/governed-skill-marketplace-ledger-adapter.js +420 -0
  233. package/src/lib/evolution/governed-skill-marketplace.js +288 -5
  234. package/src/lib/evolution/governed-wiki-pruning-journal.js +302 -0
  235. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +459 -0
  236. package/src/lib/evolution/governed-wiki-pruning-maintenance.js +576 -0
  237. package/src/lib/evolution/governed-wiki-pruning-plan-authority.js +169 -0
  238. package/src/lib/evolution/governed-wiki-pruning-raw-shred.js +207 -0
  239. package/src/lib/evolution/governed-wiki-pruning-retrieval.js +587 -0
  240. package/src/lib/evolution/governed-wiki-pruning-runtime.js +153 -0
  241. package/src/lib/evolution/governed-wiki-pruning-skill-rollback.js +360 -0
  242. package/src/lib/evolution/governed-wiki-pruning.js +322 -143
  243. package/src/lib/evolution/independent-skill-revocation-source.js +231 -0
  244. package/src/lib/evolution/knowledge-wiki-source-admission.js +124 -0
  245. package/src/lib/evolution/knowledge-wiki-source-provenance.js +359 -0
  246. package/src/lib/evolution/progressive-canary-external-watchdog.js +578 -0
  247. package/src/lib/evolution/progressive-canary-traffic-worker.js +628 -0
  248. package/src/lib/evolution/progressive-canary-watchdog-file-store.js +285 -0
  249. package/src/lib/evolution/progressive-canary-watchdog-node-pki.js +265 -0
  250. package/src/lib/evolution/skill-candidate-registry.js +22 -0
  251. package/src/lib/evolution/skill-promotion-controller.js +25 -0
  252. package/src/lib/evolution/skill-promotion-review-ledger-adapter.js +100 -0
  253. package/src/lib/evolution/skill-registry-transition-ledger-adapter.js +131 -2
  254. package/src/lib/evolution/skill-release-registry.js +25 -4
  255. package/src/lib/evolution/skill-retrieval-revocation-authority.js +361 -0
  256. package/src/lib/evolution/skill-retrieval-revocation-ledger-adapter.js +346 -0
  257. package/src/lib/evolution/skill-revocation-propagation.js +467 -0
  258. package/src/lib/evolution/skill-target-matrix-eval.js +162 -11
  259. package/src/lib/evolution/skill-wiki-reconciliation.js +985 -0
  260. package/src/lib/evolution/skill-writer-inventory-manifest.js +15 -12
  261. package/src/lib/evolution/statistical-progressive-canary.js +845 -0
  262. package/src/lib/evolution/structured-memory-agent-control-plane.js +120 -0
  263. package/src/lib/evolution/structured-memory-authority-ledger-adapter.js +5 -1
  264. package/src/lib/evolution/structured-memory-promotion-receipt-writer.js +126 -0
  265. package/src/lib/evolution/wiki-informed-skill-proposer.js +127 -21
  266. package/src/lib/evolution/wiki-maintainer-ledger-adapter.js +760 -100
  267. package/src/lib/evolution/wiki-revision-protocol.js +120 -0
  268. package/src/lib/evolution/wiki-skill-proposal-ledger-adapter.js +307 -0
  269. package/src/lib/evolution/wiki-target-tombstone-revision.js +101 -0
  270. package/src/lib/evolution/wikiskill-benchmark-cli-host.js +178 -0
  271. package/src/lib/evolution/wikiskill-benchmark-execution-host.js +702 -0
  272. package/src/lib/evolution/wikiskill-benchmark-ledger-adapter.js +613 -0
  273. package/src/lib/evolution/wikiskill-benchmark.js +574 -0
  274. package/src/lib/goal-assess.js +17 -10
  275. package/src/lib/interactive-planner.js +9 -1
  276. package/src/lib/iteration-budget.js +16 -2
  277. package/src/lib/micro-compact.js +4 -1
  278. package/src/lib/model-failure-policy.js +21 -0
  279. package/src/lib/process-execution-broker/index.js +1 -0
  280. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  281. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  282. package/src/lib/process-execution-broker/windows-sandbox.cs +33 -15
  283. package/src/lib/read-file-page.js +191 -0
  284. package/src/lib/runnable-provider.js +2 -1
  285. package/src/lib/session-host-lease.js +11 -16
  286. package/src/lib/skill-retrieval-router.js +22 -1
  287. package/src/repl/agent-repl.js +127 -33
  288. package/src/runtime/agent-core.js +224 -80
  289. package/src/runtime/agent-runtime.js +43 -0
  290. package/src/runtime/coding-agent-contract-shared.cjs +7 -1
  291. package/src/runtime/fallback-model.js +143 -62
  292. package/src/runtime/headless-runner.js +54 -10
  293. package/src/runtime/headless-stream.js +53 -6
  294. package/src/runtime/runtime-factory.js +41 -2
  295. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
  296. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
  297. package/src/assets/web-panel/assets/Projects-FF_thRi6.js +0 -1
  298. package/src/assets/web-panel/assets/SpeechSettings-l7ox6KuX.js +0 -1
  299. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
  300. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
  301. package/src/assets/web-panel/assets/index-c8jJEHVs.js +0 -1
@@ -0,0 +1,153 @@
1
+ import { captureWikiRevisionReader } from "./wiki-maintainer-ledger-adapter.js";
2
+ import { captureRawDeletionLedgerReader } from "./evolution-raw-deletion-ledger-adapter.js";
3
+ import { capturePruningData } from "./governed-wiki-pruning-journal.js";
4
+ import { GovernedWikiPruning } from "./governed-wiki-pruning.js";
5
+ import { GovernedWikiPruningLedgerAdapter } from "./governed-wiki-pruning-ledger-adapter.js";
6
+ import { GovernedWikiPruningPlanAuthority } from "./governed-wiki-pruning-plan-authority.js";
7
+ import { GovernedWikiPruningMaintenance } from "./governed-wiki-pruning-maintenance.js";
8
+ import { GovernedWikiPruningRawShred } from "./governed-wiki-pruning-raw-shred.js";
9
+ import { GovernedWikiPruningRetrieval } from "./governed-wiki-pruning-retrieval.js";
10
+
11
+ // Deployment composition, not an acknowledgement-port harness. Every effect
12
+ // and verifier below is a concrete repository implementation. The caller owns
13
+ // the physical Ledger/ArtifactStore and independent privacy/KMS/release keys.
14
+ // No fallback signer, fake successful shred, or task-time self-modification.
15
+ export function createGovernedWikiPruningRuntime({
16
+ descriptor: input,
17
+ artifactPorts,
18
+ ledgerArtifactResolver,
19
+ ledger,
20
+ wikiLedgerAdapter,
21
+ deletionLedgerAdapter,
22
+ skillRollbackProvider = null,
23
+ keyAuthority,
24
+ clock = Date.now,
25
+ } = {}) {
26
+ const descriptor = capturePruningData(input);
27
+ const wiki = captureWikiRevisionReader(wikiLedgerAdapter);
28
+ const raw = captureRawDeletionLedgerReader(
29
+ deletionLedgerAdapter,
30
+ descriptor.tenantId,
31
+ descriptor.streamId,
32
+ );
33
+ for (const key of ["tenantId", "artifactTenantId", "audience", "purpose"])
34
+ if (
35
+ wiki.descriptor[key] !== descriptor[key] ||
36
+ raw.descriptor[key] !== descriptor[key]
37
+ )
38
+ throw new TypeError(
39
+ "pruning runtime stores must share the exact deployment scope",
40
+ );
41
+ const maintenance = new GovernedWikiPruningMaintenance({
42
+ descriptor,
43
+ wikiLedgerAdapter,
44
+ skillRollbackProvider,
45
+ });
46
+ const authority = new GovernedWikiPruningPlanAuthority({
47
+ descriptor,
48
+ wikiLedgerAdapter,
49
+ deletionReceipts: { resolve: raw.resolveDeletionReceipt },
50
+ wikiMaintenance: maintenance.authorityPorts(),
51
+ });
52
+ const rawShred = new GovernedWikiPruningRawShred({
53
+ descriptor,
54
+ deletionLedgerAdapter,
55
+ keyAuthority,
56
+ });
57
+ const retrieval = new GovernedWikiPruningRetrieval({
58
+ descriptor,
59
+ wikiLedgerAdapter,
60
+ skillRollbackProvider,
61
+ artifactPorts,
62
+ ledgerArtifactResolver,
63
+ ledger,
64
+ clock,
65
+ });
66
+ const wikiReceiptVerifier = maintenance.operationReceiptVerifier();
67
+ const rawReceiptVerifier = rawShred.operationReceiptVerifier();
68
+ const retrievalReceiptVerifier = retrieval.operationReceiptVerifier();
69
+ const journal = new GovernedWikiPruningLedgerAdapter({
70
+ descriptor,
71
+ artifactPorts,
72
+ ledgerArtifactResolver,
73
+ ledger,
74
+ clock,
75
+ planVerifier: authority.verifier(),
76
+ operationReceiptVerifier: {
77
+ async verifyAll(inputs) {
78
+ const wikiInputs = [];
79
+ for (const input of inputs) {
80
+ switch (input.request.operation) {
81
+ case "dependency-dispositions":
82
+ case "wiki-revision":
83
+ wikiInputs.push(input);
84
+ break;
85
+ case "crypto-shred":
86
+ if (!(await rawReceiptVerifier.verify(input))) return false;
87
+ break;
88
+ case "retrieval-projection":
89
+ if (!(await retrievalReceiptVerifier.verify(input))) return false;
90
+ break;
91
+ default:
92
+ return false;
93
+ }
94
+ }
95
+ return !wikiInputs.length || wikiReceiptVerifier.verifyMany(wikiInputs);
96
+ },
97
+ verify(input) {
98
+ switch (input.request.operation) {
99
+ case "dependency-dispositions":
100
+ case "wiki-revision":
101
+ return wikiReceiptVerifier.verify(input);
102
+ case "crypto-shred":
103
+ return rawReceiptVerifier.verify(input);
104
+ case "retrieval-projection":
105
+ return retrievalReceiptVerifier.verify(input);
106
+ default:
107
+ return false;
108
+ }
109
+ },
110
+ },
111
+ });
112
+ const provider = maintenance.createProvider(journal);
113
+ const rawProvider = rawShred.createProvider(journal);
114
+ const retrievalProvider = retrieval.createProvider(journal);
115
+ const controller = new GovernedWikiPruning({
116
+ descriptor,
117
+ journalStore: journal,
118
+ ports: {
119
+ loadWikiState: wiki.loadWiki,
120
+ resolveDeletionReceipt: raw.resolveDeletionReceipt,
121
+ ...provider,
122
+ ...rawProvider,
123
+ ...retrievalProvider,
124
+ verifyOfflineClosure() {
125
+ throw new Error(
126
+ "task-time online adaptation is not enabled by the pruning runtime",
127
+ );
128
+ },
129
+ },
130
+ });
131
+ return Object.freeze({
132
+ descriptor,
133
+ controller,
134
+ journal,
135
+ maintenance,
136
+ authority,
137
+ rawShred,
138
+ retrieval,
139
+ provider,
140
+ rawProvider,
141
+ retrievalProvider,
142
+ wikiReceiptVerifier,
143
+ rawReceiptVerifier,
144
+ retrievalReceiptVerifier,
145
+ plan: (input) => controller.plan(input),
146
+ execute: (input) => controller.execute(input),
147
+ resume: (input) => controller.resume(input),
148
+ retrievalReader: retrieval.createProposerReader({
149
+ journalStore: journal,
150
+ policy: { proposerWikiRead: true, executionAgentWikiRead: false },
151
+ }),
152
+ });
153
+ }
@@ -0,0 +1,360 @@
1
+ import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
2
+ import { types } from "node:util";
3
+ import { captureSkillReleaseOperationReader } from "./evolution-ledger-ports.js";
4
+ import { captureSkillRollbackProvider } from "./skill-promotion-controller.js";
5
+ import {
6
+ verifySkillMutationRequest,
7
+ digestSkillMutationTransitionSubject,
8
+ } from "./skill-mutation-authority.js";
9
+ import { digestWikiState } from "./evidence-backed-wiki-maintainer.js";
10
+ import {
11
+ capturePruningData,
12
+ pruningDigest,
13
+ pruningOperationCalls,
14
+ verifyPruningJournalPlan,
15
+ } from "./governed-wiki-pruning-journal.js";
16
+
17
+ const PROVIDERS = new WeakMap();
18
+ export const WIKI_PRUNING_SKILL_ROLLBACK_SCHEMA =
19
+ "chainlesschain.wiki-pruning-skill-rollback/v1";
20
+
21
+ function fail(message) {
22
+ const error = new Error(message);
23
+ error.code = "CC_WIKI_PRUNING_SKILL_ROLLBACK_INVALID";
24
+ throw error;
25
+ }
26
+ export function captureWikiPruningSkillRollback(value, tenantId) {
27
+ const provider = PROVIDERS.get(value);
28
+ if (!provider || provider.tenantId !== tenantId)
29
+ throw new TypeError(
30
+ "a same-tenant branded pruning Skill rollback provider is required",
31
+ );
32
+ return provider;
33
+ }
34
+
35
+ // A real ReleaseRegistry/controller effect, never a rollback boolean or an
36
+ // independent revoke record. The enclosing Wiki provider supplies the source
37
+ // it authenticated with its branded history reader and exact journal context.
38
+ // All release transactions MUST be on that same Ledger, so a later finalize
39
+ // cannot retrospectively authenticate an earlier pruning checkpoint.
40
+ export class GovernedWikiPruningSkillRollback {
41
+ #registry;
42
+ #operations;
43
+ #rollback;
44
+ #authorize;
45
+ #tenantId;
46
+
47
+ constructor({
48
+ tenantId,
49
+ releaseRegistry,
50
+ transactionLedger,
51
+ rollbackProvider,
52
+ authorizationProvider,
53
+ } = {}) {
54
+ this.#registry = captureSkillReleaseRegistryReader(releaseRegistry);
55
+ this.#operations = captureSkillReleaseOperationReader(transactionLedger);
56
+ const executor = captureSkillRollbackProvider(
57
+ rollbackProvider,
58
+ releaseRegistry,
59
+ );
60
+ if (
61
+ this.#registry.tenantId !== tenantId ||
62
+ executor.tenantId !== tenantId ||
63
+ !this.#registry.matchesTransactionLedger(transactionLedger)
64
+ )
65
+ throw new TypeError(
66
+ "pruning rollback registry/ledger tenant binding differs",
67
+ );
68
+ const authorize = authorizationProvider?.authorizeRollback;
69
+ if (typeof authorize !== "function")
70
+ throw new TypeError("rollback authorization provider is required");
71
+ this.#tenantId = tenantId;
72
+ this.#rollback = executor.rollback;
73
+ this.#authorize = authorize.bind(authorizationProvider);
74
+ PROVIDERS.set(
75
+ this,
76
+ Object.freeze({
77
+ tenantId,
78
+ apply: (input, refresh) => this.#apply(input, refresh),
79
+ verify: (input) => this.#verify(input),
80
+ }),
81
+ );
82
+ Object.freeze(this);
83
+ }
84
+
85
+ #input(input) {
86
+ const {
87
+ plan: candidate,
88
+ source,
89
+ context,
90
+ requireCurrent = false,
91
+ } = capturePruningData(input);
92
+ const plan = verifyPruningJournalPlan(candidate, this.#tenantId);
93
+ if (
94
+ source?.trusted !== true ||
95
+ source.state?.tenantId !== this.#tenantId ||
96
+ source.stateDigest !== plan.wikiStateDigest ||
97
+ digestWikiState(source.state) !== plan.wikiStateDigest ||
98
+ typeof requireCurrent !== "boolean"
99
+ )
100
+ fail("rollback source differs from the pruning Wiki baseline");
101
+ const groups = new Map();
102
+ for (const item of plan.dependencyDispositions) {
103
+ if (item.action !== "rollback") continue;
104
+ if (!Array.isArray(item.skillNames) || item.skillNames.length === 0)
105
+ fail("rollback has no Skill dependency");
106
+ for (const name of item.skillNames) {
107
+ if (!groups.has(name)) groups.set(name, new Set());
108
+ groups.get(name).add(item.patternId);
109
+ }
110
+ }
111
+ if (groups.size > 4096)
112
+ fail("rollback Skill count exceeds the pruning action budget");
113
+ const skills = [...groups]
114
+ .sort(([a], [b]) => a.localeCompare(b))
115
+ .map(([skillName, patternIds]) => ({
116
+ skillName,
117
+ patternIds: [...patternIds].sort(),
118
+ operationId: `pruning-rollback:${pruningDigest(
119
+ "chainlesschain.wiki-pruning-skill-operation/v1",
120
+ {
121
+ requestDigest: pruningOperationCalls(plan)[0].requestDigest,
122
+ skillName,
123
+ },
124
+ ).slice(7)}`,
125
+ }));
126
+ return { plan, source, context, requireCurrent, skills };
127
+ }
128
+
129
+ #validateReleases(input, skill, from, target) {
130
+ if (
131
+ !from ||
132
+ !target ||
133
+ from.tenantId !== this.#tenantId ||
134
+ target.tenantId !== this.#tenantId ||
135
+ from.skillName !== skill.skillName ||
136
+ target.skillName !== skill.skillName ||
137
+ from.releaseDigest === target.releaseDigest
138
+ )
139
+ fail("rollback does not select distinct same-tenant releases");
140
+ const decisions =
141
+ input.source.state.skillImpact?.[skill.skillName]?.decisions ?? [];
142
+ const patternsFor = (release) => {
143
+ const accepted = decisions.filter(
144
+ (item) =>
145
+ item.candidateId === release.candidate.candidateId &&
146
+ item.outcome === "accepted",
147
+ );
148
+ if (!accepted.length)
149
+ fail("release has no authenticated candidate-to-pattern lineage");
150
+ return new Set(accepted.flatMap((item) => item.patternRefs));
151
+ };
152
+ const affected = patternsFor(from);
153
+ if (skill.patternIds.some((id) => !affected.has(id)))
154
+ fail("active release is not the planned dependent candidate");
155
+ const deleted = new Set(
156
+ input.plan.deletions.map((item) => item.evidenceRef),
157
+ );
158
+ for (const id of patternsFor(target)) {
159
+ const pattern = input.source.state.patterns[id];
160
+ if (
161
+ !pattern ||
162
+ [...pattern.positiveEvidence, ...pattern.negativeEvidence].some((ref) =>
163
+ deleted.has(ref),
164
+ )
165
+ )
166
+ fail("last-known-good release still depends on deleted evidence");
167
+ }
168
+ // Direct recordings must not be hidden behind an empty Wiki pattern list.
169
+ const deletedRefs = new Set(
170
+ input.plan.deletions.flatMap((item) => [
171
+ item.evidenceRef,
172
+ item.artifactRef,
173
+ item.rawArtifactRef,
174
+ ]),
175
+ );
176
+ if (
177
+ target.candidate.sourceEvidenceRefs.some(({ ref }) =>
178
+ deletedRefs.has(ref),
179
+ )
180
+ )
181
+ fail("last-known-good release directly references deleted evidence");
182
+ }
183
+
184
+ #resolve(input, skill) {
185
+ return this.#operations.resolveOperation({
186
+ tenantId: this.#tenantId,
187
+ skillName: skill.skillName,
188
+ operationId: skill.operationId,
189
+ context: input.context,
190
+ }).result;
191
+ }
192
+ #receipt(input, skill, result) {
193
+ if (result.projection.status !== "committed")
194
+ fail(
195
+ "rollback transaction is prepared but not committed; reopen the registry for recovery",
196
+ );
197
+ const { intent, projection, previous } = result;
198
+ if (
199
+ intent.operation !== "rollback" ||
200
+ intent.operationId !== skill.operationId ||
201
+ intent.skillName !== skill.skillName ||
202
+ intent.targetReleaseDigest !== previous.lastKnownGoodReleaseDigest ||
203
+ previous.activeReleaseDigest === intent.targetReleaseDigest
204
+ )
205
+ fail("settled release transaction is not the exact pruning rollback");
206
+ const from = this.#registry.readRelease(previous.activeReleaseDigest);
207
+ const target = this.#registry.readRelease(intent.targetReleaseDigest);
208
+ this.#validateReleases(input, skill, from, target);
209
+ if (
210
+ intent.expectedParentDigest !== from.contentDigest ||
211
+ intent.dependencyLockDigest !== target.dependencyLockDigest
212
+ )
213
+ fail("rollback content/dependency lock binding differs");
214
+ if (input.requireCurrent) {
215
+ const current = this.#registry.readActive(skill.skillName);
216
+ if (
217
+ projection.current !== true ||
218
+ current?.state.transactionId !== intent.transactionId ||
219
+ current.state.stateDigest !== projection.stateDigest ||
220
+ current.release.releaseDigest !== target.releaseDigest
221
+ )
222
+ fail("active release changed after the pruning rollback");
223
+ }
224
+ const core = {
225
+ schema: WIKI_PRUNING_SKILL_ROLLBACK_SCHEMA,
226
+ tenantId: this.#tenantId,
227
+ skillName: skill.skillName,
228
+ planDigest: input.plan.planDigest,
229
+ pruningRequestDigest: pruningOperationCalls(input.plan)[0].requestDigest,
230
+ operationId: skill.operationId,
231
+ transactionId: intent.transactionId,
232
+ fromReleaseDigest: from.releaseDigest,
233
+ targetReleaseDigest: target.releaseDigest,
234
+ previousStateDigest: previous.stateDigest,
235
+ resultStateDigest: projection.stateDigest,
236
+ intentDigest: intent.intentDigest,
237
+ authorityReceiptDigest: intent.authorityReceiptDigest,
238
+ releaseReceiptDigest: projection.receiptDigest,
239
+ epoch: projection.epoch,
240
+ ledgerId: projection.ledgerId,
241
+ sequence: projection.sequence,
242
+ eventDigest: projection.headDigest,
243
+ };
244
+ return capturePruningData({
245
+ ...core,
246
+ receiptDigest: pruningDigest(WIKI_PRUNING_SKILL_ROLLBACK_SCHEMA, core),
247
+ });
248
+ }
249
+
250
+ #verify(value) {
251
+ const input = this.#input(value);
252
+ const receipts = [];
253
+ for (const skill of input.skills) {
254
+ const result = this.#resolve(input, skill);
255
+ if (!result) return null;
256
+ receipts.push(this.#receipt(input, skill, result));
257
+ }
258
+ return capturePruningData(receipts);
259
+ }
260
+
261
+ async #apply(value, refresh) {
262
+ if (typeof refresh !== "function")
263
+ fail("a fresh pruning journal authorization is required");
264
+ const input = this.#input({ ...value, requireCurrent: true });
265
+ if (input.context.mode !== "current")
266
+ fail("historical checkpoints cannot authorize new rollback effects");
267
+ const pending = [];
268
+ for (const skill of input.skills) {
269
+ const existing = this.#resolve(input, skill);
270
+ if (existing) {
271
+ this.#receipt(input, skill, existing);
272
+ continue;
273
+ }
274
+ const active = this.#registry.readActive(skill.skillName);
275
+ if (!active) fail("planned dependent Skill has no active release");
276
+ const target = this.#registry.readRelease(
277
+ active.state.lastKnownGoodReleaseDigest,
278
+ );
279
+ this.#validateReleases(input, skill, active.release, target);
280
+ pending.push({ skill, active, target });
281
+ }
282
+ if (pending.length === 0) return { changed: false };
283
+ // Preflight every pending Skill before mutating the first. One real
284
+ // operation per call lets the enclosing journal refresh its full head.
285
+ const { skill, active, target } = pending[0];
286
+ const expected = Object.freeze({
287
+ tenantId: this.#tenantId,
288
+ skillName: skill.skillName,
289
+ operationId: skill.operationId,
290
+ operation: "rollback",
291
+ targetScope: "active",
292
+ expectedTargetDigest: active.release.contentDigest,
293
+ expectedTargetRevision: active.state.revision,
294
+ targetReleaseDigest: target.releaseDigest,
295
+ transitionSubjectDigest: digestSkillMutationTransitionSubject({
296
+ tenantId: this.#tenantId,
297
+ skillName: skill.skillName,
298
+ operation: "rollback",
299
+ candidateId: null,
300
+ rollbackTargetReleaseDigest: target.releaseDigest,
301
+ dependencyLockDigest: target.dependencyLockDigest,
302
+ expectedActiveContentDigest: active.release.contentDigest,
303
+ expectedActiveRevision: active.state.revision,
304
+ }),
305
+ });
306
+ const authorization = await this.#authorize(expected);
307
+ if (
308
+ !authorization ||
309
+ typeof authorization !== "object" ||
310
+ types.isProxy(authorization)
311
+ )
312
+ fail("rollback authorization must be own data");
313
+ const fields = Object.getOwnPropertyDescriptors(authorization);
314
+ if (
315
+ Reflect.ownKeys(fields).length !== 2 ||
316
+ !fields.request ||
317
+ !fields.capability ||
318
+ [fields.request, fields.capability].some(
319
+ (field) => !("value" in field) || !field.enumerable,
320
+ )
321
+ )
322
+ fail(
323
+ "rollback authorization must have exact own request/capability fields",
324
+ );
325
+ const request = verifySkillMutationRequest(fields.request.value);
326
+ for (const key of [
327
+ "tenantId",
328
+ "skillName",
329
+ "operationId",
330
+ "operation",
331
+ "targetScope",
332
+ "expectedTargetDigest",
333
+ "expectedTargetRevision",
334
+ "transitionSubjectDigest",
335
+ ])
336
+ if (request[key] !== expected[key])
337
+ fail("rollback authority authorized a different transition");
338
+ // Issuing authorization may itself append authority audit events. The
339
+ // enclosing branded journal must reauthenticate the SAME plan at its new
340
+ // current head; reusing the pre-authorization head would reject real audit.
341
+ const refreshed = this.#input({
342
+ ...(await refresh()),
343
+ requireCurrent: true,
344
+ });
345
+ if (
346
+ refreshed.plan.planDigest !== input.plan.planDigest ||
347
+ refreshed.context.mode !== "current"
348
+ )
349
+ fail(
350
+ "pruning authorization changed while requesting rollback permission",
351
+ );
352
+ if (this.#resolve(refreshed, skill) !== null)
353
+ fail("rollback changed while authorization was pending");
354
+ await this.#rollback({
355
+ authorization: { request, capability: fields.capability.value },
356
+ targetReleaseDigest: target.releaseDigest,
357
+ });
358
+ return { changed: true };
359
+ }
360
+ }