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,12 @@
1
1
  import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
2
+ import { types as utilTypes } from "node:util";
2
3
  import { StructuredMemoryLedgerAdapter } from "./structured-memory-ledger-adapter.js";
3
4
  import { StructuredMemoryAuthorityLedgerAdapter } from "./structured-memory-authority-ledger-adapter.js";
4
5
  import { captureStructuredMemoryPromotionReceiptWriter } from "./structured-memory-promotion-receipt-writer.js";
5
6
  import { captureStructuredMemoryPolicyReceiptWriter } from "./structured-memory-policy-receipt-writer.js";
6
7
  import { createStructuredMemorySemanticReviewPipeline } from "./structured-memory-semantic-review-pipeline.js";
7
8
  import { createSkillEvaluatedPromotionControlPlane } from "./skill-promotion-controller.js";
9
+ import { SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA } from "./skill-revocation-propagation.js";
8
10
 
9
11
  const { captureStructuredMemoryAuthority } = structuredMemory;
10
12
 
@@ -12,6 +14,51 @@ export const STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA =
12
14
  "chainlesschain.structured-memory-agent-control-plane/v1";
13
15
 
14
16
  const CONTROL_PLANES = new WeakSet();
17
+ const REVOCATION_REQUEST_KEYS = new Set([
18
+ "schema",
19
+ "tenantId",
20
+ "streamId",
21
+ "operationId",
22
+ "transitionDigest",
23
+ "candidateId",
24
+ "skillName",
25
+ "occurredAt",
26
+ "sourceReceiptDigest",
27
+ "resolutionDigest",
28
+ "dependency",
29
+ "requestDigest",
30
+ ]);
31
+ const REVOCATION_DEPENDENCY_KEYS = new Set([
32
+ "kind",
33
+ "ref",
34
+ "digest",
35
+ "disposition",
36
+ ]);
37
+
38
+ function exactDataRecord(value, keys, label) {
39
+ if (
40
+ !value ||
41
+ typeof value !== "object" ||
42
+ Array.isArray(value) ||
43
+ utilTypes.isProxy(value) ||
44
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
45
+ ) {
46
+ throw new TypeError(`${label} must be a plain record`);
47
+ }
48
+ const own = Reflect.ownKeys(value);
49
+ if (
50
+ own.length !== keys.size ||
51
+ own.some((key) => typeof key !== "string" || !keys.has(key))
52
+ ) {
53
+ throw new TypeError(`${label} has an invalid shape`);
54
+ }
55
+ for (const key of own) {
56
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
57
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
58
+ throw new TypeError(`${label}.${String(key)} is not a data field`);
59
+ }
60
+ }
61
+ }
15
62
 
16
63
  function sameStorage(left, right) {
17
64
  return (
@@ -143,6 +190,78 @@ export function createStructuredMemoryAgentControlPlane({
143
190
  projection: memory.projection(),
144
191
  });
145
192
  };
193
+ const quarantineMemory = async (input) => {
194
+ exactDataRecord(
195
+ input,
196
+ REVOCATION_REQUEST_KEYS,
197
+ "Memory revocation request",
198
+ );
199
+ exactDataRecord(
200
+ input.dependency,
201
+ REVOCATION_DEPENDENCY_KEYS,
202
+ "Memory revocation dependency",
203
+ );
204
+ const request = structuredClone(input);
205
+ const projection = memory.projection();
206
+ const active = projection.memories[request?.dependency?.ref];
207
+ const quarantined = projection.quarantines?.[request?.dependency?.ref];
208
+ const subject =
209
+ active ??
210
+ (quarantined
211
+ ? {
212
+ ...quarantined,
213
+ memoryId: request.dependency.ref,
214
+ status: "active",
215
+ }
216
+ : null);
217
+ if (!subject) {
218
+ throw new Error("procedural Memory dependency is missing");
219
+ }
220
+ const authorityReceipt = await promotion.retainRevocation(request, subject);
221
+ if (quarantined) {
222
+ if (
223
+ quarantined.metadata?.revocationPropagationRequestDigest !==
224
+ request.requestDigest ||
225
+ quarantined.receipts?.revocation !== authorityReceipt.receiptDigest
226
+ ) {
227
+ throw new Error("quarantined Memory conflicts with the rollback");
228
+ }
229
+ } else {
230
+ await memory.append({
231
+ eventId: `revocation-${request.requestDigest.slice("sha256:".length)}`,
232
+ memoryId: subject.memoryId,
233
+ layer: "procedural",
234
+ action: "quarantine",
235
+ authority: promotionActor,
236
+ automatic: true,
237
+ contentDigest: subject.contentDigest,
238
+ artifactRef: subject.artifactRef,
239
+ evidenceRefs: authorityReceipt.evidenceRefs,
240
+ supersedes: [],
241
+ receiptRefs: { revocation: authorityReceipt.receiptDigest },
242
+ timestamp: request.occurredAt,
243
+ metadata: {
244
+ revocationPropagationRequestDigest: request.requestDigest,
245
+ transitionDigest: request.transitionDigest,
246
+ },
247
+ });
248
+ }
249
+ return Object.freeze({
250
+ schema: SKILL_REVOCATION_DEPENDENCY_RESULT_SCHEMA,
251
+ authenticated: true,
252
+ durable: true,
253
+ applied: true,
254
+ idempotent: true,
255
+ tenantId,
256
+ operationId: request.operationId,
257
+ requestDigest: request.requestDigest,
258
+ dependencyKind: request.dependency.kind,
259
+ dependencyRef: request.dependency.ref,
260
+ dependencyDigest: request.dependency.digest,
261
+ disposition: request.dependency.disposition,
262
+ receiptDigest: memory.projection().projectionDigest,
263
+ });
264
+ };
146
265
  const controlPlane = Object.freeze({
147
266
  schema: STRUCTURED_MEMORY_AGENT_CONTROL_PLANE_SCHEMA,
148
267
  tenantId,
@@ -152,6 +271,7 @@ export function createStructuredMemoryAgentControlPlane({
152
271
  promotionReceiptWriter: promotion,
153
272
  policyReceiptWriter: policy,
154
273
  reconcilePromotionMemories: Object.freeze(reconcilePromotionMemories),
274
+ quarantineMemory: Object.freeze(quarantineMemory),
155
275
  createEvaluatedPromotionControlPlane(options = {}) {
156
276
  if (
157
277
  !options ||
@@ -258,7 +258,11 @@ export class StructuredMemoryAuthorityLedgerAdapter {
258
258
  }
259
259
 
260
260
  async listReceipts(kind) {
261
- if (!["critic", "evaluator", "promotion", "policy"].includes(kind)) {
261
+ if (
262
+ !["critic", "evaluator", "promotion", "revocation", "policy"].includes(
263
+ kind,
264
+ )
265
+ ) {
262
266
  throw new TypeError(
263
267
  "a structured memory authority receipt kind is required",
264
268
  );
@@ -1,8 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
+ import { types as utilTypes } from "node:util";
2
3
  import structuredMemory from "@chainlesschain/session-core/structured-evolution-memory";
3
4
  import { buildSkillEvaluatedPromotionReceiptEnvelope } from "./skill-evaluated-promotion.js";
4
5
  import { digestSkillMutationReceiptEnvelope } from "./skill-mutation-authority.js";
5
6
  import { SKILL_TARGET_MATRIX_EVAL_RECEIPT_SCHEMA } from "./skill-target-matrix-eval.js";
7
+ import {
8
+ SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA,
9
+ digestSkillRevocationDependencyRequest,
10
+ } from "./skill-revocation-propagation.js";
6
11
 
7
12
  const { createStructuredMemoryAuthorityReceipt } = structuredMemory;
8
13
  const SKILL_RELEASE_RECEIPT_SCHEMA =
@@ -12,6 +17,26 @@ const SKILL_PROMOTION_REVIEW_ENVELOPE_SCHEMA =
12
17
  const RELEASE_RECEIPT_DOMAIN = `${SKILL_RELEASE_RECEIPT_SCHEMA}\0`;
13
18
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
14
19
  const WRITERS = new WeakSet();
20
+ const REVOCATION_REQUEST_KEYS = new Set([
21
+ "schema",
22
+ "tenantId",
23
+ "streamId",
24
+ "operationId",
25
+ "transitionDigest",
26
+ "candidateId",
27
+ "skillName",
28
+ "occurredAt",
29
+ "sourceReceiptDigest",
30
+ "resolutionDigest",
31
+ "dependency",
32
+ "requestDigest",
33
+ ]);
34
+ const REVOCATION_DEPENDENCY_KEYS = new Set([
35
+ "kind",
36
+ "ref",
37
+ "digest",
38
+ "disposition",
39
+ ]);
15
40
 
16
41
  function canonical(value) {
17
42
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -40,6 +65,31 @@ function requiredDigest(value, name) {
40
65
  return value;
41
66
  }
42
67
 
68
+ function exact(value, keys, label) {
69
+ if (
70
+ !value ||
71
+ typeof value !== "object" ||
72
+ Array.isArray(value) ||
73
+ utilTypes.isProxy(value) ||
74
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
75
+ ) {
76
+ throw new TypeError(`${label} must be a plain record`);
77
+ }
78
+ const own = Reflect.ownKeys(value);
79
+ if (
80
+ own.length !== keys.size ||
81
+ own.some((key) => typeof key !== "string" || !keys.has(key))
82
+ ) {
83
+ throw new TypeError(`${label} has an invalid shape`);
84
+ }
85
+ for (const key of own) {
86
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
87
+ if (!descriptor || !("value" in descriptor) || !descriptor.enumerable) {
88
+ throw new TypeError(`${label}.${String(key)} is not a data field`);
89
+ }
90
+ }
91
+ }
92
+
43
93
  function capture(owner, name) {
44
94
  if (typeof owner?.[name] !== "function") {
45
95
  throw new TypeError(`${name} port is required`);
@@ -143,6 +193,45 @@ function verifyPromotion(result, matrixBinding, reviewBinding, tenantId) {
143
193
  return { release, receipt, evidenceRefs: [...new Set(evidenceRefs)].sort() };
144
194
  }
145
195
 
196
+ function verifyRevocation(request, memory, tenantId) {
197
+ exact(request, REVOCATION_REQUEST_KEYS, "Memory revocation request");
198
+ exact(
199
+ request.dependency,
200
+ REVOCATION_DEPENDENCY_KEYS,
201
+ "Memory revocation dependency",
202
+ );
203
+ if (
204
+ request?.schema !== SKILL_REVOCATION_DEPENDENCY_REQUEST_SCHEMA ||
205
+ request.tenantId !== tenantId ||
206
+ request.dependency?.kind !== "memory" ||
207
+ request.dependency.disposition !== "quarantine" ||
208
+ request.dependency.ref !== memory?.memoryId ||
209
+ request.dependency.digest !== memory?.contentDigest ||
210
+ request.requestDigest !== digestSkillRevocationDependencyRequest(request) ||
211
+ memory.layer !== "procedural" ||
212
+ !DIGEST.test(request.transitionDigest ?? "") ||
213
+ !DIGEST.test(request.sourceReceiptDigest ?? "") ||
214
+ !DIGEST.test(request.resolutionDigest ?? "") ||
215
+ !Number.isFinite(Date.parse(request.occurredAt ?? "")) ||
216
+ new Date(request.occurredAt).toISOString() !== request.occurredAt ||
217
+ typeof memory.artifactRef !== "string" ||
218
+ !Array.isArray(memory.evidenceRefs)
219
+ ) {
220
+ throw new Error("Memory revocation request is not exactly bound");
221
+ }
222
+ return {
223
+ evidenceRefs: [
224
+ ...new Set([
225
+ ...memory.evidenceRefs,
226
+ request.transitionDigest,
227
+ request.sourceReceiptDigest,
228
+ request.resolutionDigest,
229
+ request.requestDigest,
230
+ ]),
231
+ ].sort(),
232
+ };
233
+ }
234
+
146
235
  export function createStructuredMemoryPromotionReceiptWriter({
147
236
  descriptor: input,
148
237
  authorityStore,
@@ -201,6 +290,42 @@ export function createStructuredMemoryPromotionReceiptWriter({
201
290
  }
202
291
  return signed;
203
292
  },
293
+ async retainRevocation(request, memory) {
294
+ const verified = verifyRevocation(request, memory, descriptor.tenantId);
295
+ const receipt = createStructuredMemoryAuthorityReceipt({
296
+ tenantId: descriptor.tenantId,
297
+ kind: "revocation",
298
+ decision: "accepted",
299
+ memoryId: memory.memoryId,
300
+ layer: "procedural",
301
+ action: "quarantine",
302
+ contentDigest: memory.contentDigest,
303
+ artifactRef: memory.artifactRef,
304
+ evidenceRefs: verified.evidenceRefs,
305
+ issuerId: descriptor.issuerId,
306
+ issuerRevision: descriptor.issuerRevision,
307
+ issuerHandlerDigest: descriptor.issuerHandlerDigest,
308
+ issuedAt: request.occurredAt,
309
+ });
310
+ const attestation = await attest({
311
+ purpose: "structured-memory-revocation-receipt",
312
+ payloadDigest: receipt.receiptDigest,
313
+ receipt,
314
+ propagationRequestDigest: request.requestDigest,
315
+ });
316
+ if (attestation === null || attestation === undefined) {
317
+ throw new Error("revocation receipt attestor returned no attestation");
318
+ }
319
+ const signed = Object.freeze({ ...receipt, attestation });
320
+ const retained = await retainReceipt(signed);
321
+ if (
322
+ retained?.persisted !== true ||
323
+ retained.receiptDigest !== receipt.receiptDigest
324
+ ) {
325
+ throw new Error("revocation receipt was not durably acknowledged");
326
+ }
327
+ return signed;
328
+ },
204
329
  });
205
330
  WRITERS.add(writer);
206
331
  return writer;
@@ -215,6 +340,7 @@ export function captureStructuredMemoryPromotionReceiptWriter(value) {
215
340
  const captured = Object.freeze({
216
341
  descriptor: value.descriptor,
217
342
  retainPromotion: capture(value, "retainPromotion"),
343
+ retainRevocation: capture(value, "retainRevocation"),
218
344
  });
219
345
  WRITERS.add(captured);
220
346
  return captured;
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
 
3
3
  export const WIKI_SKILL_PROPOSAL_SCHEMA =
4
- "chainlesschain.wiki-informed-skill-proposal/v1";
4
+ "chainlesschain.wiki-informed-skill-proposal/v2";
5
5
  export const WIKI_PROPOSAL_STATUS = Object.freeze({
6
6
  PROPOSAL: "proposal",
7
7
  NO_PROPOSAL: "no-proposal",
@@ -38,6 +38,10 @@ function hash(value) {
38
38
  return `sha256:${createHash("sha256").update(canonical(value)).digest("hex")}`;
39
39
  }
40
40
 
41
+ export function computeWikiSkillProposalDigest(proposal) {
42
+ return hash(proposal);
43
+ }
44
+
41
45
  function deepFreeze(value) {
42
46
  if (value && typeof value === "object" && !Object.isFrozen(value)) {
43
47
  Object.freeze(value);
@@ -53,6 +57,24 @@ function requiredString(value, name) {
53
57
  return value;
54
58
  }
55
59
 
60
+ function normalizeProposerModel(value) {
61
+ if (
62
+ !value ||
63
+ typeof value !== "object" ||
64
+ Array.isArray(value) ||
65
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||
66
+ canonical(Object.keys(value).sort()) !==
67
+ canonical(["model", "provider", "version"])
68
+ ) {
69
+ throw new TypeError("proposerModel must be an exact plain object");
70
+ }
71
+ return {
72
+ provider: requiredString(value.provider, "proposerModel.provider"),
73
+ model: requiredString(value.model, "proposerModel.model"),
74
+ version: requiredString(value.version, "proposerModel.version"),
75
+ };
76
+ }
77
+
56
78
  function stringList(value, name, { allowEmpty = false, max = 64 } = {}) {
57
79
  if (
58
80
  !Array.isArray(value) ||
@@ -76,7 +98,9 @@ function verifyEnvelope(value, expectedKind) {
76
98
  !DIGEST.test(value.digest ?? "") ||
77
99
  value.digest !== hash(value.data)
78
100
  ) {
79
- const error = new Error(`${expectedKind} evidence is not digest-bound and trusted`);
101
+ const error = new Error(
102
+ `${expectedKind} evidence is not digest-bound and trusted`,
103
+ );
80
104
  error.code = "WIKI_PROPOSAL_UNTRUSTED_EVIDENCE";
81
105
  throw error;
82
106
  }
@@ -94,7 +118,7 @@ function normalizeDescriptor(input) {
94
118
  evolutionRunId: requiredString(input?.evolutionRunId, "evolutionRunId"),
95
119
  targetSkillName: requiredString(input?.targetSkillName, "targetSkillName"),
96
120
  wikiRevision: requiredString(input?.wikiRevision, "wikiRevision"),
97
- proposerModel: requiredString(input?.proposerModel, "proposerModel"),
121
+ proposerModel: normalizeProposerModel(input?.proposerModel),
98
122
  minEvidenceSamples: Math.max(1, Number(input?.minEvidenceSamples) || 1),
99
123
  maxSelectiveEvidence: Math.min(
100
124
  16,
@@ -115,7 +139,10 @@ function validateDiff(diff) {
115
139
  if (!entry || !["add", "replace", "remove"].includes(entry.op)) {
116
140
  throw new TypeError("machineDiff operation is invalid");
117
141
  }
118
- const path = requiredString(entry.path, "machineDiff.path").replaceAll("\\", "/");
142
+ const path = requiredString(entry.path, "machineDiff.path").replaceAll(
143
+ "\\",
144
+ "/",
145
+ );
119
146
  const parts = path.split("/");
120
147
  if (
121
148
  path.startsWith("/") ||
@@ -141,7 +168,9 @@ function validateProposal(output, descriptor, evidence) {
141
168
  throw new TypeError("proposal output status is invalid");
142
169
  }
143
170
  if (output.skillName !== descriptor.targetSkillName) {
144
- const error = new Error("proposer attempted to change more than the fixed Skill");
171
+ const error = new Error(
172
+ "proposer attempted to change more than the fixed Skill",
173
+ );
145
174
  error.code = "WIKI_PROPOSAL_MULTI_SKILL";
146
175
  throw error;
147
176
  }
@@ -156,7 +185,9 @@ function validateProposal(output, descriptor, evidence) {
156
185
  };
157
186
  for (const ref of [...purpose.patternRefs, ...purpose.sourceEvidenceRefs]) {
158
187
  if (!knownRefs.has(ref)) {
159
- const error = new Error("PURPOSE references evidence outside the resolved set");
188
+ const error = new Error(
189
+ "PURPOSE references evidence outside the resolved set",
190
+ );
160
191
  error.code = "WIKI_PROPOSAL_UNKNOWN_LINEAGE";
161
192
  throw error;
162
193
  }
@@ -181,22 +212,38 @@ function validateProposal(output, descriptor, evidence) {
181
212
  skillName: descriptor.targetSkillName,
182
213
  purpose,
183
214
  applicableWhen: stringList(output.applicableWhen, "applicableWhen"),
184
- notApplicableWhen: stringList(output.notApplicableWhen, "notApplicableWhen"),
215
+ notApplicableWhen: stringList(
216
+ output.notApplicableWhen,
217
+ "notApplicableWhen",
218
+ ),
185
219
  failureCounterexamples: stringList(
186
220
  output.failureCounterexamples,
187
221
  "failureCounterexamples",
188
222
  ),
189
223
  rollbackSteps: stringList(output.rollbackSteps, "rollbackSteps"),
190
- validationMethods: stringList(output.validationMethods, "validationMethods"),
224
+ validationMethods: stringList(
225
+ output.validationMethods,
226
+ "validationMethods",
227
+ ),
191
228
  requestedCapabilities: stringList(
192
229
  output.requestedCapabilities,
193
230
  "requestedCapabilities",
194
231
  { allowEmpty: true },
195
- ),
196
- targetRuntimes: stringList(output.targetRuntimes, "targetRuntimes"),
232
+ ).sort(),
233
+ targetRuntimes: stringList(output.targetRuntimes, "targetRuntimes").sort(),
197
234
  contextCost,
198
235
  machineDiff: validateDiff(output.machineDiff),
199
- sourceEvidenceRefs: evidence.map(({ ref, digest }) => ({ ref, digest })),
236
+ sourceEvidenceRefs: evidence
237
+ .map(({ ref, digest }) => ({ ref, digest }))
238
+ .sort(
239
+ (left, right) =>
240
+ (left.ref < right.ref ? -1 : left.ref > right.ref ? 1 : 0) ||
241
+ (left.digest < right.digest
242
+ ? -1
243
+ : left.digest > right.digest
244
+ ? 1
245
+ : 0),
246
+ ),
200
247
  wikiRevision: descriptor.wikiRevision,
201
248
  proposerModel: descriptor.proposerModel,
202
249
  });
@@ -214,8 +261,13 @@ function abstention(status, reason, evidence = []) {
214
261
  export class WikiInformedSkillProposer {
215
262
  constructor({ descriptor, policy, ports } = {}) {
216
263
  this.descriptor = normalizeDescriptor(descriptor);
217
- if (policy?.proposerWikiRead !== true || policy?.executionAgentWikiRead === true) {
218
- throw new Error("capability policy must isolate Wiki reads to the proposer");
264
+ if (
265
+ policy?.proposerWikiRead !== true ||
266
+ policy?.executionAgentWikiRead === true
267
+ ) {
268
+ throw new Error(
269
+ "capability policy must isolate Wiki reads to the proposer",
270
+ );
219
271
  }
220
272
  if (typeof ports?.readInitial !== "function")
221
273
  throw new TypeError("readInitial port is required");
@@ -229,7 +281,7 @@ export class WikiInformedSkillProposer {
229
281
  Object.freeze(this);
230
282
  }
231
283
 
232
- async propose() {
284
+ async draft() {
233
285
  const initial = [];
234
286
  for (const kind of INITIAL_SOURCES) {
235
287
  initial.push(verifyEnvelope(await this._ports.readInitial(kind), kind));
@@ -243,7 +295,9 @@ export class WikiInformedSkillProposer {
243
295
  initial,
244
296
  );
245
297
  }
246
- if (Number(training.data?.sampleCount) < this.descriptor.minEvidenceSamples) {
298
+ if (
299
+ Number(training.data?.sampleCount) < this.descriptor.minEvidenceSamples
300
+ ) {
247
301
  return abstention(
248
302
  WIKI_PROPOSAL_STATUS.NEEDS_EVIDENCE,
249
303
  "training evidence sample is insufficient",
@@ -257,7 +311,11 @@ export class WikiInformedSkillProposer {
257
311
  evidence: deepFreeze([...evidence]),
258
312
  });
259
313
  if (output?.status === WIKI_PROPOSAL_STATUS.NO_PROPOSAL) {
260
- return abstention(output.status, requiredString(output.reason, "reason"), evidence);
314
+ return abstention(
315
+ output.status,
316
+ requiredString(output.reason, "reason"),
317
+ evidence,
318
+ );
261
319
  }
262
320
  if (output?.status === WIKI_PROPOSAL_STATUS.NEEDS_EVIDENCE) {
263
321
  const requests = output.requests;
@@ -266,11 +324,19 @@ export class WikiInformedSkillProposer {
266
324
  requests.length === 0 ||
267
325
  requests.length > this.descriptor.maxSelectiveEvidence
268
326
  ) {
269
- return abstention(output.status, "selective evidence request is invalid", evidence);
327
+ return abstention(
328
+ output.status,
329
+ "selective evidence request is invalid",
330
+ evidence,
331
+ );
270
332
  }
271
333
  for (const request of requests) {
272
334
  if (!SELECTIVE_SOURCES.has(request?.kind)) {
273
- return abstention(output.status, "requested evidence scope is not allowed", evidence);
335
+ return abstention(
336
+ output.status,
337
+ "requested evidence scope is not allowed",
338
+ evidence,
339
+ );
274
340
  }
275
341
  evidence.push(
276
342
  verifyEnvelope(
@@ -295,7 +361,45 @@ export class WikiInformedSkillProposer {
295
361
  }
296
362
 
297
363
  const proposal = validateProposal(output, this.descriptor, evidence);
298
- const proposalDigest = hash(proposal);
364
+ const proposalDigest = computeWikiSkillProposalDigest(proposal);
365
+ return deepFreeze({
366
+ status: WIKI_PROPOSAL_STATUS.PROPOSAL,
367
+ proposal,
368
+ proposalDigest,
369
+ });
370
+ }
371
+
372
+ async propose() {
373
+ const drafted = await this.draft();
374
+ if (drafted.status !== WIKI_PROPOSAL_STATUS.PROPOSAL) return drafted;
375
+ return this.createCandidateFromDraft(drafted);
376
+ }
377
+
378
+ async createCandidateFromDraft(drafted) {
379
+ const proposal = drafted?.proposal;
380
+ const sourceEvidenceRefs = Array.isArray(proposal?.sourceEvidenceRefs)
381
+ ? proposal.sourceEvidenceRefs
382
+ : [];
383
+ const normalized = validateProposal(
384
+ proposal,
385
+ this.descriptor,
386
+ sourceEvidenceRefs,
387
+ );
388
+ if (
389
+ drafted?.status !== WIKI_PROPOSAL_STATUS.PROPOSAL ||
390
+ proposal?.schema !== WIKI_SKILL_PROPOSAL_SCHEMA ||
391
+ proposal?.tenantId !== this.descriptor.tenantId ||
392
+ proposal?.evolutionRunId !== this.descriptor.evolutionRunId ||
393
+ canonical(normalized) !== canonical(proposal) ||
394
+ drafted?.proposalDigest !== computeWikiSkillProposalDigest(proposal)
395
+ ) {
396
+ const error = new Error(
397
+ "draft is not an exact proposal bound to this proposer",
398
+ );
399
+ error.code = "WIKI_PROPOSAL_DRAFT_UNCONFIRMED";
400
+ throw error;
401
+ }
402
+ const { proposalDigest } = drafted;
299
403
  const candidateInput = deepFreeze({
300
404
  tenantId: proposal.tenantId,
301
405
  skillName: proposal.skillName,
@@ -315,10 +419,12 @@ export class WikiInformedSkillProposer {
315
419
  candidate.content !== candidateInput.content ||
316
420
  candidate.derivationMode !== "wiki" ||
317
421
  candidate.wikiRevision !== proposal.wikiRevision ||
318
- candidate.proposerModel !== proposal.proposerModel ||
422
+ canonical(candidate.proposerModel) !==
423
+ canonical(proposal.proposerModel) ||
319
424
  canonical(candidate.requestedCapabilities) !==
320
425
  canonical(proposal.requestedCapabilities) ||
321
- canonical(candidate.targetRuntimes) !== canonical(proposal.targetRuntimes) ||
426
+ canonical(candidate.targetRuntimes) !==
427
+ canonical(proposal.targetRuntimes) ||
322
428
  canonical(candidate.sourceEvidenceRefs) !==
323
429
  canonical(proposal.sourceEvidenceRefs)
324
430
  ) {