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,574 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ export const WIKISKILL_BENCHMARK_PLAN_SCHEMA =
4
+ "chainlesschain.wikiskill-benchmark-plan/v2";
5
+ export const WIKISKILL_BENCHMARK_REPORT_SCHEMA =
6
+ "chainlesschain.wikiskill-benchmark-report/v1";
7
+ export const WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA =
8
+ "chainlesschain.wikiskill-benchmark-envelope/v1";
9
+
10
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
11
+ const COMMIT = /^[a-f0-9]{40}$/u;
12
+ const FAILURE_CLASSES = new Set([
13
+ "none",
14
+ "model",
15
+ "tool",
16
+ "provider",
17
+ "sandbox",
18
+ "permission",
19
+ "infrastructure",
20
+ "grader",
21
+ "unknown",
22
+ ]);
23
+
24
+ function canonical(value) {
25
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
26
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
27
+ return `{${Object.keys(value)
28
+ .sort()
29
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
30
+ .join(",")}}`;
31
+ }
32
+
33
+ function digest(domain, value) {
34
+ return `sha256:${createHash("sha256")
35
+ .update(domain)
36
+ .update("\0")
37
+ .update(canonical(value))
38
+ .digest("hex")}`;
39
+ }
40
+
41
+ function exactKeys(value, keys, name) {
42
+ if (!value || typeof value !== "object" || Array.isArray(value))
43
+ throw new TypeError(`${name} must be an object`);
44
+ const actual = Object.keys(value).sort();
45
+ const expected = [...keys].sort();
46
+ if (canonical(actual) !== canonical(expected))
47
+ throw new TypeError(`${name} has unexpected or missing fields`);
48
+ }
49
+
50
+ function string(value, name) {
51
+ if (typeof value !== "string" || value.trim() === "")
52
+ throw new TypeError(`${name} must be a non-empty string`);
53
+ return value;
54
+ }
55
+
56
+ function sha(value, name) {
57
+ if (!DIGEST.test(value ?? ""))
58
+ throw new TypeError(`${name} must be a sha256 digest`);
59
+ return value;
60
+ }
61
+
62
+ function finite(value, name, { min = 0, max = Number.MAX_VALUE } = {}) {
63
+ const number = Number(value);
64
+ if (!Number.isFinite(number) || number < min || number > max)
65
+ throw new TypeError(`${name} is outside its allowed range`);
66
+ return number;
67
+ }
68
+
69
+ function normalizeDatasets(datasets) {
70
+ if (!Array.isArray(datasets) || datasets.length !== 5)
71
+ throw new TypeError("datasets must contain exactly five entries");
72
+ const ids = new Set();
73
+ return datasets.map((dataset, index) => {
74
+ exactKeys(
75
+ dataset,
76
+ ["id", "version", "digest", "splitIds"],
77
+ `dataset ${index}`,
78
+ );
79
+ const id = string(dataset.id, `dataset ${index} id`);
80
+ if (ids.has(id)) throw new TypeError(`duplicate dataset id: ${id}`);
81
+ ids.add(id);
82
+ if (!Array.isArray(dataset.splitIds) || dataset.splitIds.length === 0)
83
+ throw new TypeError(`dataset ${id} must contain splitIds`);
84
+ const splitIds = dataset.splitIds.map((item, splitIndex) =>
85
+ string(item, `dataset ${id} split ${splitIndex}`),
86
+ );
87
+ if (new Set(splitIds).size !== splitIds.length)
88
+ throw new TypeError(`dataset ${id} contains duplicate splitIds`);
89
+ return Object.freeze({
90
+ id,
91
+ version: string(dataset.version, `dataset ${id} version`),
92
+ digest: sha(dataset.digest, `dataset ${id} digest`),
93
+ splitIds: Object.freeze(splitIds),
94
+ splitDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, splitIds),
95
+ });
96
+ });
97
+ }
98
+
99
+ export function createWikiSkillBenchmarkPlan(input = {}) {
100
+ exactKeys(
101
+ input,
102
+ [
103
+ "gitCommit",
104
+ "runnerDigest",
105
+ "executionManifestDigest",
106
+ "model",
107
+ "inference",
108
+ "environment",
109
+ "datasets",
110
+ "toolDigest",
111
+ "apiDigest",
112
+ "promptDigest",
113
+ "skillDigest",
114
+ "wikiDigest",
115
+ "seedSchedule",
116
+ "bootstrapSamples",
117
+ ],
118
+ "benchmark plan",
119
+ );
120
+ exactKeys(input.model, ["checkpoint", "digest"], "model");
121
+ exactKeys(
122
+ input.environment,
123
+ ["containerDigest", "vllmVersion", "hardware"],
124
+ "environment",
125
+ );
126
+ if (
127
+ !input.inference ||
128
+ typeof input.inference !== "object" ||
129
+ Array.isArray(input.inference)
130
+ )
131
+ throw new TypeError("inference must be an object");
132
+ if (!Array.isArray(input.seedSchedule) || input.seedSchedule.length < 3)
133
+ throw new TypeError(
134
+ "seedSchedule must contain at least three independent runs",
135
+ );
136
+ const seedSchedule = input.seedSchedule.map((seed, index) => {
137
+ if (!Number.isSafeInteger(seed) || seed < 0)
138
+ throw new TypeError(
139
+ `seedSchedule ${index} must be a non-negative safe integer`,
140
+ );
141
+ return seed;
142
+ });
143
+ if (new Set(seedSchedule).size !== seedSchedule.length)
144
+ throw new TypeError("seedSchedule must not contain duplicates");
145
+ if (input.bootstrapSamples !== 1_000)
146
+ throw new TypeError("bootstrapSamples must equal 1000");
147
+ const gitCommit = string(input.gitCommit, "gitCommit");
148
+ if (!COMMIT.test(gitCommit))
149
+ throw new TypeError("gitCommit must be a full commit SHA");
150
+ const core = {
151
+ schema: WIKISKILL_BENCHMARK_PLAN_SCHEMA,
152
+ gitCommit,
153
+ runnerDigest: sha(input.runnerDigest, "runnerDigest"),
154
+ executionManifestDigest: sha(
155
+ input.executionManifestDigest,
156
+ "executionManifestDigest",
157
+ ),
158
+ model: Object.freeze({
159
+ checkpoint: string(input.model.checkpoint, "model checkpoint"),
160
+ digest: sha(input.model.digest, "model digest"),
161
+ }),
162
+ inference: Object.freeze(JSON.parse(canonical(input.inference))),
163
+ environment: Object.freeze({
164
+ containerDigest: sha(
165
+ input.environment.containerDigest,
166
+ "container digest",
167
+ ),
168
+ vllmVersion: string(input.environment.vllmVersion, "vLLM version"),
169
+ hardware: string(input.environment.hardware, "hardware"),
170
+ }),
171
+ datasets: Object.freeze(normalizeDatasets(input.datasets)),
172
+ toolDigest: sha(input.toolDigest, "toolDigest"),
173
+ apiDigest: sha(input.apiDigest, "apiDigest"),
174
+ promptDigest: sha(input.promptDigest, "promptDigest"),
175
+ skillDigest: sha(input.skillDigest, "skillDigest"),
176
+ wikiDigest: sha(input.wikiDigest, "wikiDigest"),
177
+ seedSchedule: Object.freeze(seedSchedule),
178
+ bootstrapSamples: 1_000,
179
+ };
180
+ return Object.freeze({
181
+ ...core,
182
+ planDigest: digest(WIKISKILL_BENCHMARK_PLAN_SCHEMA, core),
183
+ });
184
+ }
185
+
186
+ export function verifyWikiSkillBenchmarkPlan(plan) {
187
+ exactKeys(
188
+ plan,
189
+ [
190
+ "schema",
191
+ "gitCommit",
192
+ "runnerDigest",
193
+ "executionManifestDigest",
194
+ "model",
195
+ "inference",
196
+ "environment",
197
+ "datasets",
198
+ "toolDigest",
199
+ "apiDigest",
200
+ "promptDigest",
201
+ "skillDigest",
202
+ "wikiDigest",
203
+ "seedSchedule",
204
+ "bootstrapSamples",
205
+ "planDigest",
206
+ ],
207
+ "benchmark plan",
208
+ );
209
+ if (plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA)
210
+ throw new TypeError("benchmark plan schema is invalid");
211
+ const recreated = createWikiSkillBenchmarkPlan({
212
+ gitCommit: plan.gitCommit,
213
+ runnerDigest: plan.runnerDigest,
214
+ executionManifestDigest: plan.executionManifestDigest,
215
+ model: plan.model,
216
+ inference: plan.inference,
217
+ environment: plan.environment,
218
+ datasets: plan.datasets.map(({ id, version, digest: value, splitIds }) => ({
219
+ id,
220
+ version,
221
+ digest: value,
222
+ splitIds,
223
+ })),
224
+ toolDigest: plan.toolDigest,
225
+ apiDigest: plan.apiDigest,
226
+ promptDigest: plan.promptDigest,
227
+ skillDigest: plan.skillDigest,
228
+ wikiDigest: plan.wikiDigest,
229
+ seedSchedule: plan.seedSchedule,
230
+ bootstrapSamples: plan.bootstrapSamples,
231
+ });
232
+ if (canonical(recreated) !== canonical(plan))
233
+ throw new Error("benchmark plan digest mismatch");
234
+ return recreated;
235
+ }
236
+
237
+ function normalizeArm(arm, name) {
238
+ exactKeys(
239
+ arm,
240
+ [
241
+ "score",
242
+ "traceDigest",
243
+ "graderReceiptDigest",
244
+ "failureClass",
245
+ "tokens",
246
+ "cost",
247
+ "latencyMs",
248
+ ],
249
+ name,
250
+ );
251
+ if (!FAILURE_CLASSES.has(arm.failureClass))
252
+ throw new TypeError(`${name} failureClass is invalid`);
253
+ return Object.freeze({
254
+ score: finite(arm.score, `${name} score`, { max: 1 }),
255
+ traceDigest: sha(arm.traceDigest, `${name} traceDigest`),
256
+ graderReceiptDigest: sha(
257
+ arm.graderReceiptDigest,
258
+ `${name} graderReceiptDigest`,
259
+ ),
260
+ failureClass: arm.failureClass,
261
+ tokens: finite(arm.tokens, `${name} tokens`),
262
+ cost: finite(arm.cost, `${name} cost`),
263
+ latencyMs: finite(arm.latencyMs, `${name} latencyMs`),
264
+ });
265
+ }
266
+
267
+ function percentile(sorted, probability) {
268
+ if (sorted.length === 1) return sorted[0];
269
+ const position = (sorted.length - 1) * probability;
270
+ const lower = Math.floor(position);
271
+ const upper = Math.ceil(position);
272
+ const weight = position - lower;
273
+ return sorted[lower] * (1 - weight) + sorted[upper] * weight;
274
+ }
275
+
276
+ function prngFromDigest(value) {
277
+ let state = Number.parseInt(value.slice(7, 15), 16) || 0x9e3779b9;
278
+ return () => {
279
+ state ^= state << 13;
280
+ state ^= state >>> 17;
281
+ state ^= state << 5;
282
+ return (state >>> 0) / 0x1_0000_0000;
283
+ };
284
+ }
285
+
286
+ function mean(values) {
287
+ return values.reduce((sum, value) => sum + value, 0) / values.length;
288
+ }
289
+
290
+ export function buildWikiSkillBenchmarkReport({ plan, runs } = {}) {
291
+ try {
292
+ plan = verifyWikiSkillBenchmarkPlan(plan);
293
+ } catch (cause) {
294
+ if (cause?.message === "benchmark plan digest mismatch") throw cause;
295
+ throw new TypeError("a canonical benchmark plan is required", { cause });
296
+ }
297
+ if (!Array.isArray(runs) || runs.length !== plan.seedSchedule.length)
298
+ throw new TypeError("runs must exactly cover the seed schedule");
299
+ const expectedCases = new Map(
300
+ plan.datasets.flatMap((dataset) =>
301
+ dataset.splitIds.map((splitId) => [`${dataset.id}\0${splitId}`, dataset]),
302
+ ),
303
+ );
304
+ const seenSeeds = new Set();
305
+ const normalizedRuns = runs.map((run, runIndex) => {
306
+ exactKeys(run, ["runId", "seed", "cases"], `run ${runIndex}`);
307
+ if (!plan.seedSchedule.includes(run.seed) || seenSeeds.has(run.seed))
308
+ throw new TypeError(`run ${runIndex} seed is absent or duplicated`);
309
+ seenSeeds.add(run.seed);
310
+ if (!Array.isArray(run.cases) || run.cases.length !== expectedCases.size)
311
+ throw new TypeError(`run ${runIndex} does not cover every split`);
312
+ const seenCases = new Set();
313
+ const cases = run.cases.map((item, caseIndex) => {
314
+ exactKeys(
315
+ item,
316
+ ["datasetId", "splitId", "baseline", "skill"],
317
+ `run ${runIndex} case ${caseIndex}`,
318
+ );
319
+ const key = `${item.datasetId}\0${item.splitId}`;
320
+ if (!expectedCases.has(key) || seenCases.has(key))
321
+ throw new TypeError(`run ${runIndex} has an absent or duplicate split`);
322
+ seenCases.add(key);
323
+ return Object.freeze({
324
+ datasetId: item.datasetId,
325
+ splitId: item.splitId,
326
+ baseline: normalizeArm(item.baseline, `run ${runIndex} baseline`),
327
+ skill: normalizeArm(item.skill, `run ${runIndex} skill`),
328
+ });
329
+ });
330
+ cases.sort((left, right) =>
331
+ `${left.datasetId}\0${left.splitId}`.localeCompare(
332
+ `${right.datasetId}\0${right.splitId}`,
333
+ ),
334
+ );
335
+ return Object.freeze({
336
+ runId: string(run.runId, `run ${runIndex} runId`),
337
+ seed: run.seed,
338
+ cases: Object.freeze(cases),
339
+ });
340
+ });
341
+ normalizedRuns.sort(
342
+ (left, right) =>
343
+ plan.seedSchedule.indexOf(left.seed) -
344
+ plan.seedSchedule.indexOf(right.seed),
345
+ );
346
+
347
+ const perDataset = plan.datasets.map((dataset) => {
348
+ const observations = normalizedRuns.flatMap((run) =>
349
+ run.cases.filter((item) => item.datasetId === dataset.id),
350
+ );
351
+ const baseline = mean(observations.map((item) => item.baseline.score));
352
+ const skill = mean(observations.map((item) => item.skill.score));
353
+ return Object.freeze({
354
+ datasetId: dataset.id,
355
+ count: observations.length,
356
+ baseline,
357
+ skill,
358
+ delta: skill - baseline,
359
+ });
360
+ });
361
+ const equalWeightBaseline = mean(perDataset.map((item) => item.baseline));
362
+ const equalWeightSkill = mean(perDataset.map((item) => item.skill));
363
+ const deltas = normalizedRuns.flatMap((run) =>
364
+ run.cases.map((item) => item.skill.score - item.baseline.score),
365
+ );
366
+ const random = prngFromDigest(plan.planDigest);
367
+ const bootstrap = Array.from({ length: plan.bootstrapSamples }, () => {
368
+ const sample = Array.from(
369
+ { length: deltas.length },
370
+ () => deltas[Math.floor(random() * deltas.length)],
371
+ );
372
+ return mean(sample);
373
+ }).sort((left, right) => left - right);
374
+ const measurements = normalizedRuns.flatMap((run) =>
375
+ run.cases.flatMap((item) => [item.baseline, item.skill]),
376
+ );
377
+ const core = {
378
+ schema: WIKISKILL_BENCHMARK_REPORT_SCHEMA,
379
+ planDigest: plan.planDigest,
380
+ gitCommit: plan.gitCommit,
381
+ runnerDigest: plan.runnerDigest,
382
+ datasetDigests: Object.freeze(
383
+ plan.datasets.map(({ id, digest: datasetDigest, splitDigest }) => ({
384
+ id,
385
+ digest: datasetDigest,
386
+ splitDigest,
387
+ })),
388
+ ),
389
+ runCount: normalizedRuns.length,
390
+ pairedObservationCount: deltas.length,
391
+ perDataset: Object.freeze(perDataset),
392
+ metrics: Object.freeze({
393
+ equalWeightBaseline,
394
+ equalWeightSkill,
395
+ delta: equalWeightSkill - equalWeightBaseline,
396
+ pairedBootstrap95Ci: Object.freeze([
397
+ percentile(bootstrap, 0.025),
398
+ percentile(bootstrap, 0.975),
399
+ ]),
400
+ bootstrapSamples: plan.bootstrapSamples,
401
+ tokens: measurements.reduce((sum, item) => sum + item.tokens, 0),
402
+ cost: measurements.reduce((sum, item) => sum + item.cost, 0),
403
+ latencyMs: Object.freeze({
404
+ p50: percentile(
405
+ measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
406
+ 0.5,
407
+ ),
408
+ p95: percentile(
409
+ measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
410
+ 0.95,
411
+ ),
412
+ p99: percentile(
413
+ measurements.map((item) => item.latencyMs).sort((a, b) => a - b),
414
+ 0.99,
415
+ ),
416
+ }),
417
+ }),
418
+ failureCounts: Object.freeze(
419
+ [...FAILURE_CLASSES].reduce((result, classification) => {
420
+ result[classification] = measurements.filter(
421
+ (item) => item.failureClass === classification,
422
+ ).length;
423
+ return result;
424
+ }, {}),
425
+ ),
426
+ runs: Object.freeze(normalizedRuns),
427
+ };
428
+ return Object.freeze({
429
+ ...core,
430
+ reportDigest: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core),
431
+ });
432
+ }
433
+
434
+ export function verifyWikiSkillBenchmarkReport({ plan, report } = {}) {
435
+ const verifiedPlan = verifyWikiSkillBenchmarkPlan(plan);
436
+ if (!report || report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA)
437
+ throw new TypeError("a canonical benchmark report is required");
438
+ const recreated = buildWikiSkillBenchmarkReport({
439
+ plan: verifiedPlan,
440
+ runs: report.runs,
441
+ });
442
+ if (canonical(recreated) !== canonical(report))
443
+ throw new Error("benchmark report digest mismatch");
444
+ return recreated;
445
+ }
446
+
447
+ export async function executeWikiSkillBenchmarkProtocolFixture({
448
+ plan,
449
+ runner,
450
+ } = {}) {
451
+ if (
452
+ !plan ||
453
+ plan.schema !== WIKISKILL_BENCHMARK_PLAN_SCHEMA ||
454
+ !DIGEST.test(plan.planDigest ?? "")
455
+ )
456
+ throw new TypeError("a canonical benchmark plan is required");
457
+ if (typeof runner !== "function")
458
+ throw new TypeError("benchmark runner is required");
459
+ const runs = [];
460
+ for (const seed of plan.seedSchedule) {
461
+ const cases = [];
462
+ for (const dataset of plan.datasets) {
463
+ for (const splitId of dataset.splitIds) {
464
+ const common = Object.freeze({
465
+ planDigest: plan.planDigest,
466
+ seed,
467
+ dataset: Object.freeze({
468
+ id: dataset.id,
469
+ version: dataset.version,
470
+ digest: dataset.digest,
471
+ splitId,
472
+ splitDigest: dataset.splitDigest,
473
+ }),
474
+ model: plan.model,
475
+ inference: plan.inference,
476
+ environment: plan.environment,
477
+ toolDigest: plan.toolDigest,
478
+ apiDigest: plan.apiDigest,
479
+ promptDigest: plan.promptDigest,
480
+ runnerDigest: plan.runnerDigest,
481
+ });
482
+ const baseline = await runner(
483
+ Object.freeze({
484
+ ...common,
485
+ arm: "no-skill",
486
+ skillDigest: null,
487
+ wikiDigest: null,
488
+ }),
489
+ );
490
+ const skill = await runner(
491
+ Object.freeze({
492
+ ...common,
493
+ arm: "skill",
494
+ skillDigest: plan.skillDigest,
495
+ wikiDigest: plan.wikiDigest,
496
+ }),
497
+ );
498
+ cases.push({
499
+ datasetId: dataset.id,
500
+ splitId,
501
+ baseline,
502
+ skill,
503
+ });
504
+ }
505
+ }
506
+ runs.push({
507
+ runId: digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, {
508
+ planDigest: plan.planDigest,
509
+ seed,
510
+ }),
511
+ seed,
512
+ cases,
513
+ });
514
+ }
515
+ return buildWikiSkillBenchmarkReport({ plan, runs });
516
+ }
517
+
518
+ export async function signWikiSkillBenchmarkReport({ report, attestor } = {}) {
519
+ if (
520
+ !report ||
521
+ report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA ||
522
+ !DIGEST.test(report.reportDigest ?? "")
523
+ )
524
+ throw new TypeError("a canonical benchmark report is required");
525
+ if (typeof attestor !== "function")
526
+ throw new TypeError("attestor is required");
527
+ const attestation = await attestor(report.reportDigest);
528
+ if (!attestation || typeof attestation !== "object")
529
+ throw new Error("benchmark attestor returned no attestation");
530
+ return Object.freeze({
531
+ schema: WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA,
532
+ report,
533
+ attestation: Object.freeze({ ...attestation }),
534
+ });
535
+ }
536
+
537
+ export async function projectWikiSkillBenchmarkClaim({
538
+ envelope,
539
+ verifyAttestation,
540
+ } = {}) {
541
+ const hold = Object.freeze({
542
+ provenance: "external-paper-only",
543
+ status: "HOLD",
544
+ reportDigest: null,
545
+ metrics: null,
546
+ });
547
+ if (!envelope) return hold;
548
+ if (
549
+ envelope.schema !== WIKISKILL_BENCHMARK_ENVELOPE_SCHEMA ||
550
+ typeof verifyAttestation !== "function"
551
+ )
552
+ throw new TypeError("signed benchmark envelope and verifier are required");
553
+ const { report } = envelope;
554
+ if (!report || report.schema !== WIKISKILL_BENCHMARK_REPORT_SCHEMA)
555
+ throw new Error("benchmark report is invalid");
556
+ const core = Object.fromEntries(
557
+ Object.entries(report).filter(([key]) => key !== "reportDigest"),
558
+ );
559
+ if (digest(WIKISKILL_BENCHMARK_REPORT_SCHEMA, core) !== report.reportDigest)
560
+ throw new Error("benchmark report digest mismatch");
561
+ if (
562
+ !(await verifyAttestation({
563
+ digest: report.reportDigest,
564
+ attestation: envelope.attestation,
565
+ }))
566
+ )
567
+ throw new Error("benchmark report attestation rejected");
568
+ return Object.freeze({
569
+ provenance: "chainlesschain-measured",
570
+ status: "VERIFIED",
571
+ reportDigest: report.reportDigest,
572
+ metrics: report.metrics,
573
+ });
574
+ }
@@ -62,15 +62,17 @@ export function buildAssessPrompt(goal, transcript = {}) {
62
62
  `RUN RESULT:\n${finalText || "(no final text)"}`,
63
63
  "",
64
64
  "Reply with ONLY a JSON object (no prose, no code fence) of this shape:",
65
- "{",
66
- ' "advanced": true|false, // did this run move the goal forward?',
67
- ' "progress": <0-100 or null>, // your estimate of new overall progress, or null to leave unchanged',
68
- ' "keyResults": [ // updates for specific key results (omit if none)',
69
- ' {"id": "<kr-id>", "current": <number or null>, "done": true|false}',
70
- " ],",
71
- ' "note": "<one short sentence summarizing what changed>",',
72
- ' "concerns": ["<short concern>", ...] // anything blocking/at-risk (omit if none)',
73
- "}",
65
+ JSON.stringify({
66
+ advanced: false,
67
+ progress: null,
68
+ keyResults: [{ id: "<kr-id>", current: null, done: false }],
69
+ note: "<one short sentence summarizing what changed>",
70
+ concerns: [],
71
+ }),
72
+ "Set advanced to true only if this run moved the goal forward; otherwise false.",
73
+ "Set progress to an estimated number from 0 to 100, or null to leave it unchanged.",
74
+ "Each keyResults entry uses a real key-result id, a numeric current value or null, and a boolean done. Omit keyResults if there are no updates.",
75
+ "Include short strings in concerns for blocking or at-risk items; omit concerns if there are none.",
74
76
  ].join("\n");
75
77
  }
76
78
 
@@ -218,7 +220,12 @@ export async function assessGoalProgress({
218
220
  let reply;
219
221
  try {
220
222
  reply = await chat(prompt);
221
- } catch {
223
+ } catch (error) {
224
+ if (
225
+ error?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED" ||
226
+ error?.runtimeLedgerPersistence === true
227
+ )
228
+ throw error;
222
229
  return { assessment: null, goal };
223
230
  }
224
231
  const assessment = parseAssessment(reply);
@@ -96,6 +96,11 @@ export class CLIInteractivePlanner extends EventEmitter {
96
96
  };
97
97
  } catch (err) {
98
98
  session.status = PlanSessionStatus.FAILED;
99
+ if (
100
+ err?.runtimeLedgerPersistence === true ||
101
+ err?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED"
102
+ )
103
+ throw err;
99
104
  return {
100
105
  sessionId,
101
106
  status: session.status,
@@ -345,7 +350,10 @@ Keep plans concise (3-8 steps). Use appropriate tools for each step.`;
345
350
  { role: "user", content: prompt },
346
351
  ]);
347
352
 
348
- const content = response?.message?.content || response?.content || "";
353
+ const content =
354
+ typeof response === "string"
355
+ ? response
356
+ : response?.message?.content || response?.content || "";
349
357
  const jsonText = firstBalancedJson(content, "{");
350
358
  if (!jsonText) {
351
359
  throw new Error("Failed to parse plan from LLM response");
@@ -45,13 +45,24 @@ export class IterationBudget {
45
45
  * Resolve the budget limit from config/env/default.
46
46
  * Priority: CC_ITERATION_BUDGET env > default
47
47
  */
48
- static resolveLimit() {
48
+ static resolveLimit(fallback = DEFAULT_BUDGET) {
49
49
  const env = process.env.CC_ITERATION_BUDGET;
50
50
  if (env) {
51
51
  const parsed = parseInt(env, 10);
52
52
  if (!isNaN(parsed) && parsed > 0) return parsed;
53
53
  }
54
- return DEFAULT_BUDGET;
54
+ return fallback;
55
+ }
56
+
57
+ /** Interactive work can continue until completion; explicit caps still win. */
58
+ static forRun({ maxTurns, continuous = false } = {}) {
59
+ return new IterationBudget({
60
+ limit: Number.isFinite(maxTurns)
61
+ ? maxTurns === 0
62
+ ? Infinity
63
+ : Math.max(1, Math.floor(maxTurns))
64
+ : IterationBudget.resolveLimit(continuous ? Infinity : DEFAULT_BUDGET),
65
+ });
55
66
  }
56
67
 
57
68
  /** Total iteration limit. */
@@ -141,6 +152,9 @@ export class IterationBudget {
141
152
  * @returns {string}
142
153
  */
143
154
  toSummary() {
155
+ if (!Number.isFinite(this._limit)) {
156
+ return `Iteration budget: ${this._consumed} iterations used (no turn limit).`;
157
+ }
144
158
  const pct = Math.round(this.percentage() * 100);
145
159
  return (
146
160
  `Iteration budget: ${this._consumed}/${this._limit} (${pct}%). ` +
@@ -9,6 +9,8 @@
9
9
  * Pure → unit-testable.
10
10
  */
11
11
 
12
+ import { compactReadFileResult } from "./read-file-page.js";
13
+
12
14
  const DEFAULT_KEEP_RECENT = 6; // last N messages kept verbatim
13
15
  const DEFAULT_MAX_TOOL_CHARS = 400; // trim older tool results longer than this
14
16
 
@@ -44,7 +46,8 @@ export function microCompact(messages, opts = {}) {
44
46
  ? fullMarker
45
47
  : "…[trimmed]".slice(0, maxChars);
46
48
  const head = content.slice(0, Math.max(0, maxChars - marker.length));
47
- const compactedContent = `${head}${marker}`;
49
+ const compactedContent =
50
+ compactReadFileResult(content, maxChars) || `${head}${marker}`;
48
51
  trimmed += 1;
49
52
  saved += content.length - compactedContent.length;
50
53
  return {