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
@@ -1,10 +1,22 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { types as utilTypes } from "node:util";
3
3
 
4
+ import {
5
+ isProgressiveCanaryGateAuthority,
6
+ nextProgressiveCanaryStage,
7
+ verifyProgressiveCanaryPlan,
8
+ } from "./statistical-progressive-canary.js";
9
+ import {
10
+ SKILL_WIKI_PILOT_OUTCOME_SCHEMA,
11
+ createSkillWikiPilotReconciliationSource,
12
+ } from "./skill-wiki-reconciliation.js";
13
+
4
14
  export const CONTROLLED_SKILL_PILOT_SCHEMA =
5
15
  "chainlesschain.controlled-skill-production-pilot/v1";
6
16
  export const CONTROLLED_SKILL_PILOT_STATE_SCHEMA =
7
17
  "chainlesschain.controlled-skill-production-pilot-state/v1";
18
+ export const CONTROLLED_SKILL_PILOT_PROGRESSIVE_STATE_SCHEMA =
19
+ "chainlesschain.controlled-skill-production-pilot-state/v2";
8
20
  export const CONTROLLED_SKILL_PILOT_EVENT_SCHEMA =
9
21
  "chainlesschain.controlled-skill-production-pilot-event/v1";
10
22
 
@@ -12,6 +24,7 @@ export const CONTROLLED_SKILL_PILOT_STAGE = Object.freeze({
12
24
  CANDIDATE: "candidate",
13
25
  SHADOW: "shadow",
14
26
  CANARY: "canary",
27
+ ACTIVE_PROBATION: "active-probation",
15
28
  ACTIVE: "active",
16
29
  ROLLED_BACK: "rolled-back",
17
30
  });
@@ -50,6 +63,14 @@ function hash(value) {
50
63
  return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
51
64
  }
52
65
 
66
+ export function digestControlledSkillPilotState(value) {
67
+ return hash(value);
68
+ }
69
+
70
+ export function digestControlledSkillPilotEvent(value) {
71
+ return hash(value);
72
+ }
73
+
53
74
  function clone(value) {
54
75
  return value == null ? value : JSON.parse(JSON.stringify(value));
55
76
  }
@@ -264,9 +285,15 @@ function normalizeDescriptor(input) {
264
285
  return deepFreeze(normalized);
265
286
  }
266
287
 
267
- function emptyState(descriptorDigest) {
268
- return {
269
- schema: CONTROLLED_SKILL_PILOT_STATE_SCHEMA,
288
+ export function digestControlledSkillPilotDescriptor(input) {
289
+ return hash(normalizeDescriptor(input));
290
+ }
291
+
292
+ function emptyState(descriptorDigest, progressive = null) {
293
+ const state = {
294
+ schema: progressive
295
+ ? CONTROLLED_SKILL_PILOT_PROGRESSIVE_STATE_SCHEMA
296
+ : CONTROLLED_SKILL_PILOT_STATE_SCHEMA,
270
297
  descriptorDigest,
271
298
  revision: 0,
272
299
  stage: CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE,
@@ -278,28 +305,86 @@ function emptyState(descriptorDigest) {
278
305
  pendingTransition: null,
279
306
  lastTransitionReceiptDigest: null,
280
307
  };
308
+ if (progressive) {
309
+ state.progressivePlanDigest = progressive.plan.planDigest;
310
+ state.progressiveStepId = null;
311
+ state.progressiveGateReceiptDigests = [];
312
+ }
313
+ return state;
314
+ }
315
+
316
+ function progressiveStateIsCoherent(state, progressive) {
317
+ if (!progressive) return true;
318
+ const digests = state.progressiveGateReceiptDigests;
319
+ if (
320
+ !Array.isArray(digests) ||
321
+ digests.length > progressive.plan.steps.length ||
322
+ new Set(digests).size !== digests.length
323
+ ) {
324
+ return false;
325
+ }
326
+ const effectiveStage = state.pendingTransition?.request?.to ?? state.stage;
327
+ if (effectiveStage === CONTROLLED_SKILL_PILOT_STAGE.ROLLED_BACK) {
328
+ return (
329
+ state.progressiveStepId === null ||
330
+ progressive.plan.steps.some(
331
+ ({ id: stepId }) => stepId === state.progressiveStepId,
332
+ )
333
+ );
334
+ }
335
+ if (effectiveStage === CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE) {
336
+ return state.progressiveStepId === null && digests.length === 0;
337
+ }
338
+ if (effectiveStage === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE) {
339
+ return (
340
+ state.progressiveStepId === null &&
341
+ digests.length === progressive.plan.steps.length
342
+ );
343
+ }
344
+ const index = progressive.plan.steps.findIndex(
345
+ ({ id: stepId, stage }) =>
346
+ stepId === state.progressiveStepId && stage === effectiveStage,
347
+ );
348
+ return index >= 0 && digests.length === index;
281
349
  }
282
350
 
283
- function normalizeRestore(input, descriptorDigest) {
351
+ function normalizeRestore(input, descriptorDigest, progressive) {
284
352
  plain(input, "pilot restore");
285
353
  const state = plain(input.state, "pilot restore.state");
286
354
  if (
287
355
  input.authenticated !== true ||
288
356
  input.durable !== true ||
289
357
  input.descriptorDigest !== descriptorDigest ||
290
- input.stateDigest !== hash(state) ||
291
- state.schema !== CONTROLLED_SKILL_PILOT_STATE_SCHEMA ||
358
+ input.stateDigest !== digestControlledSkillPilotState(state) ||
359
+ state.schema !==
360
+ (progressive
361
+ ? CONTROLLED_SKILL_PILOT_PROGRESSIVE_STATE_SCHEMA
362
+ : CONTROLLED_SKILL_PILOT_STATE_SCHEMA) ||
292
363
  state.descriptorDigest !== descriptorDigest ||
293
364
  !STAGES.has(state.stage) ||
294
365
  !Number.isSafeInteger(state.revision) ||
295
366
  state.revision < 0 ||
296
367
  !Array.isArray(state.observations) ||
368
+ (progressive === null
369
+ ? state.progressivePlanDigest !== undefined ||
370
+ state.progressiveStepId !== undefined ||
371
+ state.progressiveGateReceiptDigests !== undefined
372
+ : state.progressivePlanDigest !== progressive.plan.planDigest ||
373
+ (state.progressiveStepId !== null &&
374
+ !progressive.plan.steps.some(
375
+ ({ id: stepId }) => stepId === state.progressiveStepId,
376
+ )) ||
377
+ !Array.isArray(state.progressiveGateReceiptDigests) ||
378
+ state.progressiveGateReceiptDigests.some(
379
+ (value) => !DIGEST.test(value),
380
+ )) ||
297
381
  (state.pendingTransition !== null &&
298
382
  (!state.pendingTransition ||
299
383
  typeof state.pendingTransition !== "object" ||
300
384
  state.pendingTransition.requestDigest !==
301
385
  hash(state.pendingTransition.request) ||
302
- state.pendingTransition.request?.from !== state.stage))
386
+ state.pendingTransition.request?.from !== state.stage)) ||
387
+ !progressiveStateIsCoherent(state, progressive)
303
388
  ) {
304
389
  fail(
305
390
  CONTROLLED_SKILL_PILOT_ERROR.PERSISTENCE_FAILED,
@@ -309,6 +394,37 @@ function normalizeRestore(input, descriptorDigest) {
309
394
  return clone(state);
310
395
  }
311
396
 
397
+ function normalizeProgressiveCanary(input, descriptor) {
398
+ if (input == null) return null;
399
+ plain(input, "progressive Canary configuration");
400
+ if (
401
+ Reflect.ownKeys(input).length !== 2 ||
402
+ !Object.hasOwn(input, "plan") ||
403
+ !Object.hasOwn(input, "gateAuthority")
404
+ ) {
405
+ throw new TypeError("progressive Canary configuration is not exact");
406
+ }
407
+ const plan = verifyProgressiveCanaryPlan(input.plan);
408
+ if (!isProgressiveCanaryGateAuthority(input.gateAuthority)) {
409
+ throw new TypeError(
410
+ "a branded progressive Canary gate authority is required",
411
+ );
412
+ }
413
+ if (
414
+ plan.tenantId !== descriptor.tenantId ||
415
+ plan.pilotId !== descriptor.pilotId ||
416
+ plan.skillName !== descriptor.skillName ||
417
+ plan.candidateDigest !== descriptor.candidateDigest ||
418
+ plan.baselineDigest !== descriptor.baselineDigest ||
419
+ input.gateAuthority.planDigest !== plan.planDigest ||
420
+ input.gateAuthority.tenantId !== plan.tenantId ||
421
+ input.gateAuthority.pilotId !== plan.pilotId
422
+ ) {
423
+ throw new TypeError("progressive Canary plan is not bound to this pilot");
424
+ }
425
+ return Object.freeze({ plan, gateAuthority: input.gateAuthority });
426
+ }
427
+
312
428
  function normalizeApproval(value, descriptor, descriptorDigest) {
313
429
  plain(value, "review approval");
314
430
  if (
@@ -447,9 +563,16 @@ export class ControlledSkillProductionPilot {
447
563
  ports,
448
564
  now = Date.now,
449
565
  restore = null,
566
+ progressiveCanary = null,
450
567
  } = {}) {
451
568
  this.descriptor = normalizeDescriptor(input);
452
- this.descriptorDigest = hash(this.descriptor);
569
+ this.descriptorDigest = digestControlledSkillPilotDescriptor(
570
+ this.descriptor,
571
+ );
572
+ this._progressiveCanary = normalizeProgressiveCanary(
573
+ progressiveCanary,
574
+ this.descriptor,
575
+ );
453
576
  this._now = typeof now === "function" ? now : Date.now;
454
577
  this._readActiveState = capture(ports, "readActiveState");
455
578
  this._verifyApproval = capture(ports, "verifyApproval");
@@ -465,8 +588,9 @@ export class ControlledSkillProductionPilot {
465
588
  descriptorDigest: this.descriptorDigest,
466
589
  }),
467
590
  this.descriptorDigest,
591
+ this._progressiveCanary,
468
592
  )
469
- : emptyState(this.descriptorDigest);
593
+ : emptyState(this.descriptorDigest, this._progressiveCanary);
470
594
  }
471
595
 
472
596
  async start({ optedIn, tenantId, cohortId } = {}) {
@@ -510,15 +634,35 @@ export class ControlledSkillProductionPilot {
510
634
  await this._assertActiveUnchanged();
511
635
  const next = clone(this._state);
512
636
  next.reviewReceiptDigest = reviewReceiptDigest;
513
- await this._advance(next, CONTROLLED_SKILL_PILOT_STAGE.SHADOW, {
514
- reviewReceiptDigest,
515
- });
637
+ if (this._progressiveCanary) {
638
+ next.progressiveStepId = this._progressiveCanary.plan.steps[0].id;
639
+ }
640
+ await this._advance(
641
+ next,
642
+ CONTROLLED_SKILL_PILOT_STAGE.SHADOW,
643
+ {
644
+ reviewReceiptDigest,
645
+ ...(this._progressiveCanary
646
+ ? {
647
+ progressivePlanDigest: this._progressiveCanary.plan.planDigest,
648
+ progressiveStepId: next.progressiveStepId,
649
+ }
650
+ : {}),
651
+ },
652
+ { progressive: this._progressiveCanary !== null },
653
+ );
516
654
  return this.view();
517
655
  }
518
656
 
519
657
  async recordObservation(input) {
520
658
  this._started();
521
659
  this._noPending();
660
+ if (this._progressiveCanary) {
661
+ fail(
662
+ CONTROLLED_SKILL_PILOT_ERROR.INVALID,
663
+ "progressive Canary observations must enter the gate authority",
664
+ );
665
+ }
522
666
  if (
523
667
  ![
524
668
  CONTROLLED_SKILL_PILOT_STAGE.SHADOW,
@@ -627,9 +771,12 @@ export class ControlledSkillProductionPilot {
627
771
  return this.view();
628
772
  }
629
773
 
630
- async advance() {
774
+ async advance(input = {}) {
631
775
  this._started();
632
776
  this._noPending();
777
+ if (this._progressiveCanary) {
778
+ return this._advanceProgressive(input);
779
+ }
633
780
  const target = FORWARD.get(this._state.stage);
634
781
  if (!target) {
635
782
  fail(
@@ -693,7 +840,7 @@ export class ControlledSkillProductionPilot {
693
840
  snapshot() {
694
841
  return deepFreeze({
695
842
  descriptorDigest: this.descriptorDigest,
696
- stateDigest: hash(this._state),
843
+ stateDigest: digestControlledSkillPilotState(this._state),
697
844
  state: clone(this._state),
698
845
  });
699
846
  }
@@ -736,9 +883,135 @@ export class ControlledSkillProductionPilot {
736
883
  cohort: clone(this.descriptor.cohort),
737
884
  lastTransitionReceiptDigest: this._state.lastTransitionReceiptDigest,
738
885
  reconciliationRequired: this._state.pendingTransition !== null,
886
+ progressiveCanary:
887
+ this._progressiveCanary === null
888
+ ? null
889
+ : {
890
+ planDigest: this._state.progressivePlanDigest,
891
+ stepId: this._state.progressiveStepId,
892
+ gateReceiptDigests: clone(
893
+ this._state.progressiveGateReceiptDigests,
894
+ ),
895
+ },
896
+ });
897
+ }
898
+
899
+ createWikiOutcomeSource() {
900
+ return createSkillWikiPilotReconciliationSource({
901
+ tenantId: this.descriptor.tenantId,
902
+ streamId: `${this.descriptor.pilotId}:wiki-outcomes`,
903
+ readPilotOutcomes: () => {
904
+ if (
905
+ this._state.pendingTransition !== null ||
906
+ this._state.lastTransitionReceiptDigest === null ||
907
+ this._state.activeStateDigest === null
908
+ ) {
909
+ return [];
910
+ }
911
+ const stable =
912
+ this._progressiveCanary !== null &&
913
+ this._state.stage === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE &&
914
+ this._state.progressiveStepId === null &&
915
+ this._state.progressiveGateReceiptDigests.length ===
916
+ this._progressiveCanary.plan.steps.length;
917
+ const rolledBack =
918
+ this._state.stage === CONTROLLED_SKILL_PILOT_STAGE.ROLLED_BACK;
919
+ if (!stable && !rolledBack) return [];
920
+ return [
921
+ {
922
+ schema: SKILL_WIKI_PILOT_OUTCOME_SCHEMA,
923
+ authenticated: true,
924
+ durable: true,
925
+ tenantId: this.descriptor.tenantId,
926
+ streamId: `${this.descriptor.pilotId}:wiki-outcomes`,
927
+ sequence: this._state.revision,
928
+ pilotId: this.descriptor.pilotId,
929
+ descriptorDigest: this.descriptorDigest,
930
+ candidateId: this.descriptor.candidateDigest,
931
+ skillName: this.descriptor.skillName,
932
+ outcome: stable ? "stable" : "rollback",
933
+ reason: stable
934
+ ? "The statistical progressive Canary reached stable."
935
+ : "The production Pilot rolled back the candidate.",
936
+ occurredAt: new Date(this._state.stageStartedAt).toISOString(),
937
+ activeStateDigest: this._state.activeStateDigest,
938
+ evidenceReceiptDigests: [
939
+ ...(this._state.reviewReceiptDigest === null
940
+ ? []
941
+ : [this._state.reviewReceiptDigest]),
942
+ ...(this._state.progressiveGateReceiptDigests ?? []),
943
+ ],
944
+ sourceReceiptDigest: this._state.lastTransitionReceiptDigest,
945
+ },
946
+ ];
947
+ },
739
948
  });
740
949
  }
741
950
 
951
+ async _advanceProgressive({ gateReceipt } = {}) {
952
+ if (this._state.stage === CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE) {
953
+ fail(
954
+ CONTROLLED_SKILL_PILOT_ERROR.REVIEW_REQUIRED,
955
+ "shadow requires explicit durable human approval",
956
+ );
957
+ }
958
+ if (this._state.killSwitch) {
959
+ fail(
960
+ CONTROLLED_SKILL_PILOT_ERROR.KILL_SWITCH,
961
+ "pilot kill switch is set",
962
+ );
963
+ }
964
+ const currentStepId = this._state.progressiveStepId;
965
+ if (typeof currentStepId !== "string") {
966
+ fail(
967
+ CONTROLLED_SKILL_PILOT_ERROR.INVALID,
968
+ "progressive Canary step is unavailable",
969
+ );
970
+ }
971
+ let receipt;
972
+ let nextStep;
973
+ try {
974
+ receipt = await this._progressiveCanary.gateAuthority.verify(
975
+ gateReceipt,
976
+ {
977
+ stepId: currentStepId,
978
+ },
979
+ );
980
+ nextStep = nextProgressiveCanaryStage({
981
+ plan: this._progressiveCanary.plan,
982
+ currentStepId,
983
+ gateReport: receipt.report,
984
+ });
985
+ } catch (error) {
986
+ const failure = new Error(
987
+ `pilot progressive gate failed: ${error.message}`,
988
+ );
989
+ failure.code = CONTROLLED_SKILL_PILOT_ERROR.GATE_FAILED;
990
+ throw failure;
991
+ }
992
+ const target =
993
+ nextStep.stage === "stable"
994
+ ? CONTROLLED_SKILL_PILOT_STAGE.ACTIVE
995
+ : nextStep.stage;
996
+ await this._assertActiveUnchanged();
997
+ const next = clone(this._state);
998
+ next.progressiveStepId = nextStep.stepId;
999
+ next.progressiveGateReceiptDigests.push(receipt.receiptDigest);
1000
+ await this._advance(
1001
+ next,
1002
+ target,
1003
+ {
1004
+ progressivePlanDigest: this._progressiveCanary.plan.planDigest,
1005
+ gateReportDigest: receipt.reportDigest,
1006
+ gateReceiptDigest: receipt.receiptDigest,
1007
+ fromStepId: currentStepId,
1008
+ toStepId: nextStep.stepId,
1009
+ },
1010
+ { progressive: true },
1011
+ );
1012
+ return this.view();
1013
+ }
1014
+
742
1015
  _started() {
743
1016
  if (this._state.activeStateDigest === null) {
744
1017
  fail(CONTROLLED_SKILL_PILOT_ERROR.INVALID, "pilot has not started");
@@ -777,9 +1050,26 @@ export class ControlledSkillProductionPilot {
777
1050
  }
778
1051
  }
779
1052
 
780
- async _advance(next, target, evidence) {
1053
+ async _advance(next, target, evidence, { progressive = false } = {}) {
781
1054
  const from = this._state.stage;
782
- if (target !== CONTROLLED_PILOT_ROLLBACK && FORWARD.get(from) !== target) {
1055
+ const progressiveTransition =
1056
+ progressive &&
1057
+ ((from === CONTROLLED_SKILL_PILOT_STAGE.CANDIDATE &&
1058
+ target === CONTROLLED_SKILL_PILOT_STAGE.SHADOW) ||
1059
+ (from === CONTROLLED_SKILL_PILOT_STAGE.SHADOW &&
1060
+ target === CONTROLLED_SKILL_PILOT_STAGE.CANARY) ||
1061
+ (from === CONTROLLED_SKILL_PILOT_STAGE.CANARY &&
1062
+ [
1063
+ CONTROLLED_SKILL_PILOT_STAGE.CANARY,
1064
+ CONTROLLED_SKILL_PILOT_STAGE.ACTIVE_PROBATION,
1065
+ ].includes(target)) ||
1066
+ (from === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE_PROBATION &&
1067
+ target === CONTROLLED_SKILL_PILOT_STAGE.ACTIVE));
1068
+ if (
1069
+ target !== CONTROLLED_PILOT_ROLLBACK &&
1070
+ !progressiveTransition &&
1071
+ FORWARD.get(from) !== target
1072
+ ) {
783
1073
  fail(
784
1074
  CONTROLLED_SKILL_PILOT_ERROR.INVALID,
785
1075
  "non-canonical pilot transition",
@@ -869,7 +1159,7 @@ export class ControlledSkillProductionPilot {
869
1159
  async _commit(next, type, evidence) {
870
1160
  const expectedRevision = this._state.revision;
871
1161
  next.revision = expectedRevision + 1;
872
- const stateDigest = hash(next);
1162
+ const stateDigest = digestControlledSkillPilotState(next);
873
1163
  const event = deepFreeze({
874
1164
  schema: CONTROLLED_SKILL_PILOT_EVENT_SCHEMA,
875
1165
  descriptorDigest: this.descriptorDigest,
@@ -882,7 +1172,7 @@ export class ControlledSkillProductionPilot {
882
1172
  evidence: clone(evidence),
883
1173
  committedAt: this._timestamp(),
884
1174
  });
885
- const eventDigest = hash(event);
1175
+ const eventDigest = digestControlledSkillPilotEvent(event);
886
1176
  const acknowledgement = await this._commitState({
887
1177
  expectedRevision,
888
1178
  state: deepFreeze(clone(next)),
@@ -340,6 +340,7 @@ function rebuildDerivedState(state, effectiveAt, descriptor) {
340
340
  ).toFixed(6),
341
341
  );
342
342
  if (
343
+ (pattern.rollbackCount ?? 0) > 0 ||
343
344
  positive.length === 0 ||
344
345
  expired ||
345
346
  pattern.operationalConfidence < descriptor.staleConfidenceFloor
@@ -425,6 +426,7 @@ function applyUpsert(state, operation, evidenceByRef, effectiveAt) {
425
426
  ...new Set([...(existing?.supersedes ?? []), ...proposed.supersedes]),
426
427
  ].sort(),
427
428
  rejectionCount: existing?.rejectionCount ?? 0,
429
+ rollbackCount: existing?.rollbackCount ?? 0,
428
430
  status: WIKI_PATTERN_STATUS.HYPOTHESIS,
429
431
  actionable: false,
430
432
  evidenceCounts: { positive: 0, negative: 0, trustDomains: 0 },
@@ -549,8 +551,15 @@ function applyOperation(state, operation, evidenceByRef, effectiveAt) {
549
551
  throw new Error(
550
552
  `proposal decision references unknown pattern: ${patternId}`,
551
553
  );
552
- if (decision.outcome === "rejected")
554
+ if (decision.outcome === "rejected") {
553
555
  pattern.rejectionCount = (pattern.rejectionCount ?? 0) + 1;
556
+ if (
557
+ evidence.data?.pilotOutcome === "rollback" ||
558
+ evidence.data?.revocationOutcome === "revoke"
559
+ ) {
560
+ pattern.rollbackCount = (pattern.rollbackCount ?? 0) + 1;
561
+ }
562
+ }
554
563
  }
555
564
  appendLog(
556
565
  state,