chainlesschain 0.166.86 → 0.166.87

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 (182) hide show
  1. package/package.json +1 -1
  2. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  3. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-DZwiXAIh.js → AIOps-DdQjhXg9.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-aNzXoIJP.js → ActionButton-CuwA3hPA.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-ETQk4ZXt.js → Analytics-DTVXJSAC.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-D5oEbeEC.js → AppLayout-j06JBfEQ.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-ja48FAne.js → Artifacts-BFAK8LEW.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DlN0YnDt.js → Audit-BiGxRpOf.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-CzvyNsRg.js → BackgroundAgents-B6uHaPkZ.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-DXgEC2MQ.js → Backup-BNAesB8q.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-D9XqejLx.js → BaseInput-BOuetfCd.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-BTwuYUlN.js → Chat-cVzo3m_D.js} +4 -4
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-0anIC2Wn.js → ChatBubbleRenderer-DZ2Ys-CI.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-CLuaQbDt.js → Checkbox-BaCTS-H8.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-KwQUZs8A.js → Codegen-CBE8NiYh.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-BCmROkzc.js → Col-C9wLiUTN.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-CXlUEHR4.js → Community-jdClBSIp.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-Dzx-lWI2.js → Compact-BIjauIlM.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-CfXW82FF.js → Compliance-CZ-AoaNj.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DIISTRm2.js → Cowork-BbTKtDS4.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-nyJ-KcFE.js → Cron-ImKdtwNi.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-Dtv1E4cV.js → Crosschain-B54GSHf5.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BCTpektS.js → DID-BQt5WUzs.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-C1Q_m0So.js → Dashboard--gNOffif.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BrQ5_PPL.js → Dropdown-342A5YJw.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-DjoNlONP.js → EmailListRenderer-CtIZ3ZHd.js} +1 -1
  28. package/src/assets/web-panel/assets/{EvolutionSettings-DaGaE6bX.js → EvolutionSettings-CyZPoTio.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-nJDWBECt.js → FamilyGuardDashboard-B1MCkFEu.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-DhMUY_wG.js → Federation-DZWoERUy.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-CbONJPuc.js → FormItemContext-Onmb0mp3.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-CDdX4dX-.js → GenericCardRenderer-u1qhNNc7.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-DXbDVJdR.js → Git-BEowR1C5.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-DbAfAvs1.js → Governance-BiYd3AAg.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-Dy-fGea2.js → Inference-CsC4Vjh5.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-DAxRpGUF.js → KnowledgeGraph-BXA7ikPM.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-5L1UCR8X.js → Logs-C9WoplQm.js} +2 -2
  38. package/src/assets/web-panel/assets/{MarkdownRenderer-u0FPafvT.js → MarkdownRenderer-DecEsXsy.js} +1 -1
  39. package/src/assets/web-panel/assets/{Marketplace-DUk_McDG.js → Marketplace-CCoJBfRL.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-B6PNsZ_p.js → McpTools-CzaOWBoA.js} +3 -3
  41. package/src/assets/web-panel/assets/{Memory-BUUs8j5F.js → Memory-BPwh7u1-.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-pXRsgyuO.js → MobileBridge-Bk47v6z2.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileProjects-D7v-2Hwm.js → MobileProjects-D-CY--Sb.js} +1 -1
  44. package/src/assets/web-panel/assets/{Mtc-Deaj4faB.js → Mtc-ExVyAGlW.js} +4 -4
  45. package/src/assets/web-panel/assets/{MtcAudit-wUV0VUH1.js → MtcAudit-Rrw10csE.js} +5 -5
  46. package/src/assets/web-panel/assets/{Multisig-C67IIkts.js → Multisig-8TxxwxZZ.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-BCA_CWrW.js → NLProgramming-CNckjtnY.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-D9eu14hQ.js → Notes-C4j6cZTu.js} +3 -3
  49. package/src/assets/web-panel/assets/{NotificationSettings-Cnd-J4LM.js → NotificationSettings-CchU8rWd.js} +1 -1
  50. package/src/assets/web-panel/assets/{OrderTableRenderer-C4pHUuyZ.js → OrderTableRenderer-ZJBoyJ16.js} +1 -1
  51. package/src/assets/web-panel/assets/{Organization-4YExAbnp.js → Organization-F0Je7EdZ.js} +4 -4
  52. package/src/assets/web-panel/assets/{Overflow-BF-wFuZz.js → Overflow-B2k-JA3u.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-CdiajqCT.js → P2P-yui9Xxe6.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-BkjfS6Th.js → PdhVaultBrowser-CegM7hT6.js} +3 -3
  55. package/src/assets/web-panel/assets/{Permissions-DrZ4D78_.js → Permissions-CSFL0uvh.js} +4 -4
  56. package/src/assets/web-panel/assets/{PersonalDataHub-lDc6OXjz.js → PersonalDataHub-BrMcd-vr.js} +5 -5
  57. package/src/assets/web-panel/assets/{Pipeline-DqDS9ON1.js → Pipeline-fzrliaVP.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-BMekZRZu.js → Privacy-BrkUjJ_g.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-LYS7NFvJ.js → ProjectInit-CF_QCsW9.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-CcJNHk9A.js → ProjectSettings-Duwrd8aC.js} +2 -2
  61. package/src/assets/web-panel/assets/{Projects-DrfAHgdF.js → Projects-B0dLVXzU.js} +1 -1
  62. package/src/assets/web-panel/assets/{Providers-aqsly9SR.js → Providers-Db8iS1xQ.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-ZWvR3zqg.js → QrScannerModal-CHbNzEQs.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-BT5CgsvW.js → QuickAsk-CIESMfeR.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-Cz8Dz2RN.js → Recommend-BTMbCMtR.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-BlxPVbtQ.js → RemoteSession-DavyK6J-.js} +3 -3
  67. package/src/assets/web-panel/assets/{Reputation-B3VGBE-1.js → Reputation-BFKtMelA.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-Bwv7vSEA.js → Row-BI9AZUvw.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-DHI085r_.js → RssFeed-1nwXt8NY.js} +2 -2
  70. package/src/assets/web-panel/assets/{Search-DBler5T0.js → Search-Ck8PDYbk.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-BZdw43NW.js → Security-BgDqpCbq.js} +3 -3
  72. package/src/assets/web-panel/assets/{Services-Cslk5lUj.js → Services-DF8anXm4.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-Bur-C-25.js → Skeleton-CoHyY4ZX.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-v0zgLy0X.js → Skills-dOaD4Ztl.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-B1OWgQ51.js → Sla-XuOawvQY.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-CaBcEaV4.js → SpeechSettings-DFJ7nAiu.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-CBbG8L6J.js → SyncSettings-B2xYj-Pi.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-C7EjXrnN.js → Tasks-D_SzNTLi.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates-VBBOZ1H5.js → Templates-BXFmKh7W.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-CtQTj7IF.js → Tenant-CRg2AXbd.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-DXVTQjnl.js → Terminal-DQgxnuep.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-BRIno0aN.js → TimelineRenderer-BrPQhQVc.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-uiiAfkYN.js → Tokens-RByy4USy.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-CPApN8o6.js → Trigger-pE3y8u73.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-T2jKVwCE.js → Trust-DhID9C33.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-C2U_gbzP.js → UkeySign-CPxEPNBH.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-BCdlr3Kj.js → VideoEditing-ZD8DUxeQ.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-CWnjoSc1.js → Wallet-Br9JREEd.js} +4 -4
  89. package/src/assets/web-panel/assets/{WebAuthn-CqSbYqHq.js → WebAuthn-Cn-YacJg.js} +4 -4
  90. package/src/assets/web-panel/assets/{WorkflowEditor-Dr_I3jcr.js → WorkflowEditor-BTu0oqMp.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-Cg21FKdE.js → chat-CEjws_QF.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-CK85tY9e.js → colors-Bv2RNebW.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-m-XYPC7W.js → compact-item-gSc3EofP.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-BmiEeNvs.js → createContext-kyFDaqWC.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-Dcc8pILJ.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-CCw4KAoc.js → hasIn-BuMWcjhx.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-ByVvAXdl.js → index--nrQmk8X.js} +1 -1
  98. package/src/assets/web-panel/assets/index-05NB95_V.js +1 -0
  99. package/src/assets/web-panel/assets/{index-BIOTRzaF.js → index-42PTBO7a.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-8KzhlvJ9.js → index-BCS5j4SQ.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-lhoexBDH.js → index-BSSIJ-rv.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-6jXf-Lln.js → index-BUOCcXou.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D7gS_TJl.js → index-Bg5jis0q.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BtvVupUL.js → index-C-LPpwe9.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BGb1j2z9.js → index-C56Drzol.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DpIy2HzE.js → index-C7Jo20JB.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Cf5arJie.js → index-C9U9SjcT.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CBcgIWOe.js → index-CF3TjDNz.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-J81uvUMN.js → index-CMS3Mk93.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BGUYgc96.js → index-CNt2X-aK.js} +1 -1
  111. package/src/assets/web-panel/assets/index-Cb6q8wlI.js +1 -0
  112. package/src/assets/web-panel/assets/{index-CN2xbLGz.js → index-Cj4RA7oA.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-D1sU5-XA.js → index-CkfvP2dN.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-DmSgfXuz.js → index-Cm8K8Evn.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DMbrl43d.js → index-CvSuM_CB.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B7xJkhtJ.js → index-Czo_hw97.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BvjC3t35.js → index-D3m3EXbL.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DAlGVix-.js → index-DR561Sqc.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B8IC9ZeZ.js → index-DRa4R7vv.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-yYmjkf38.js → index-DYKSuD02.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-Br9t_I1X.js → index-DYcPWVN9.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Bv90WEWa.js → index-DbVUA5l3.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BiVPFsat.js → index-DbkyTMj-.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-IskAKXhx.js → index-Dej4AGOz.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CYEzWoyZ.js → index-EpxWlmip.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Br0ZNdu1.js → index-GpvWtvw3.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DIlGxS2W.js → index-NQ0c4hJ1.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-sWUmvT8H.js → index-OjZUHz5z.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-OIbfsi-o.js → index-U-ytt84A.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BUYyhYP6.js → index-_0bfDTDu.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DxRhnsEC.js → index-jmMAqBAm.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DI9GJFcn.js → index-nLemnBZ2.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BStyjmLG.js → index-q65c1kp8.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BHsiSoGY.js → index-sJ1F5Txa.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-BcfVHmFK.js → index-xfS_WO9b.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-Cc1XOmNe.js → initDefaultProps-B-wqiSu7.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-BehsX88u.js → motion-BK4_B4MD.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-BPx2YsqY.js → move-BU2TgDDO.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-BSFJgFQA.js → mtc-parser-DA3E4_EX.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-DBN5KUeo.js → omit-CaHz1e_q.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-BDK1yZ-9.js → pickAttrs-NXZ19amf.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-C4rMmKNJ.js → placementArrow-BCXI9AHO.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-BoeoOnxX.js → responsiveObserve-DdlZ9tLk.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-BKlr1bl9.js → slide-DCZm_Vc4.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-Ky1apWPI.js → statusUtils-CuEULKQr.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-DxxR7uXk.js → styleChecker-Bo_UXG8x.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-DmsUqVe9.js → useFlexGapSupport-B9PaTcFH.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-CwkG7sOg.js → useFs-DwSTGdVR.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-CddgeEfF.js → usePersonalDataHub-FswSxnDC.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-C_-H8i4Y.js → vnode-EUztvYTj.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-aAsHUMNE.js → zoom-D41MAgV-.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/command-help-index.json +1 -1
  154. package/src/commands/eval.js +118 -18
  155. package/src/commands/memory.js +34 -15
  156. package/src/commands/sandbox.js +9 -0
  157. package/src/data/changelog.json +13 -0
  158. package/src/lib/causal-observability.js +6 -45
  159. package/src/lib/context-memory-kernel/durable-memory-port.js +49 -10
  160. package/src/lib/context-memory-kernel/memory-query-index.js +278 -0
  161. package/src/lib/context-memory-kernel/memory-service.js +17 -2
  162. package/src/lib/context-memory-kernel/segmented-memory-port.js +277 -9
  163. package/src/lib/eval/outcomes.js +20 -10
  164. package/src/lib/eval/runner.js +49 -5
  165. package/src/lib/eval/tasks.js +8 -3
  166. package/src/lib/eval/verify01-contracts.js +349 -0
  167. package/src/lib/eval/verify01-execution.js +605 -0
  168. package/src/lib/execution-support.js +58 -0
  169. package/src/lib/llm-pricing.js +98 -11
  170. package/src/lib/model-catalog-review.js +116 -0
  171. package/src/lib/model-context-catalog.js +23 -1
  172. package/src/lib/openai-responses.js +39 -0
  173. package/src/lib/process-execution-broker/index.js +8 -0
  174. package/src/lib/process-execution-broker/linux-subreaper-process.js +24 -2
  175. package/src/lib/process-execution-broker/process-ownership-journal.js +168 -7
  176. package/src/lib/process-execution-broker/process-ownership-quarantine.js +56 -1
  177. package/src/lib/process-execution-broker/process-recovery-cgroup.js +272 -0
  178. package/src/runtime/agent-core.js +9 -24
  179. package/src/runtime/permission-authority-host.js +14 -0
  180. package/src/assets/web-panel/assets/devWarning-CkMEODFC.js +0 -1
  181. package/src/assets/web-panel/assets/index-BjE5qaKn.js +0 -1
  182. package/src/assets/web-panel/assets/index-CsFH-2Zk.js +0 -1
@@ -55,7 +55,7 @@
55
55
  "economy": "Usage: chainlesschain economy [options] [command]\n\nAgent economy — payments, channels, marketplace, NFTs\n\nOptions:\n -h, --help display help for command\n\nCommands:\n price <service-id> <price> Set a service price\n pay [options] <from> <to> <amount> Make a payment between agents\n balance [options] <agent-id> Show agent balance\n channel State channel management\n market Resource marketplace\n trade <listing-id> <buyer> <quantity> Buy a resource from the marketplace\n nft NFT management\n revenue <pool> <agent-ids> Distribute revenue pool (comma-separated agent IDs)\n contribute <agent-id> <type> <value> Record agent contribution\n payment-types [options] List PAYMENT_TYPE enum values (Phase 85)\n channel-statuses [options] List CHANNEL_STATUS enum values (Phase 85)\n resource-types [options] List RESOURCE_TYPE enum values (Phase 85)\n nft-statuses [options] List NFT_STATUS enum values (Phase 85)\n price-v2 [options] <service-id> <payment-type> <rate> Set a service price with payment-type model (Phase 85)\n price-get [options] <service-id> Get a service's price model (Phase 85)\n pay-v2 [options] <from> <to> <service-id> Pay for a priced service (computes amount from usage) (Phase 85)\n channel-open-v2 [options] <party-a> <party-b> Open a two-sided channel (Phase 85)\n channel-activate [options] <id> OPEN → ACTIVE (Phase 85)\n channel-settle [options] <id> ACTIVE → SETTLING with final balances (Phase 85)\n channel-close-v2 [options] <id> Close channel and release locked funds (Phase 85)\n channel-dispute [options] <id> Mark channel DISPUTED (Phase 85)\n channels-v2 [options] List channels with optional status/party filter (Phase 85)\n market-list-v2 [options] <seller> <resource-type> <price> List a resource with validated RESOURCE_TYPE (Phase 85)\n nft-mint-v2 [options] <owner> <asset-type> Mint NFT with royalty tracking (Phase 85)\n nft-list [options] <id> <price> List NFT for sale at a price (Phase 85)\n nft-buy [options] <id> <buyer> Buy a listed NFT (Phase 85)\n nft-burn [options] <id> Burn an NFT (Phase 85)\n nft-status [options] <id> Get NFT status (Phase 85)\n contribute-task [options] <task-id> <agent-id> Record a weighted task contribution (Phase 85)\n contributions-task [options] <task-id> List contributions for a task (Phase 85)\n distribute-v2 [options] <task-id> <total> Distribute revenue across task contributors (Phase 85)\n distributions [options] List distribution records (Phase 85)\n stats-v2 [options] Extended economy stats (Phase 85)\n enums-v2 Show V2 enums (account maturity + tx lifecycle)\n config-v2 Show V2 config thresholds\n set-max-active-accounts-v2 <n> Set max active accounts per holder\n set-max-pending-txs-v2 <n> Set max pending txs per account\n set-account-idle-ms-v2 <n> Set account idle threshold (ms)\n set-tx-stuck-ms-v2 <n> Set tx stuck threshold (ms)\n register-account-v2 [options] <id> <holder> Register V2 economy account\n activate-account-v2 <id> Activate account (pending→active or frozen→active)\n freeze-account-v2 <id> Freeze account\n close-account-v2 <id> Close account (terminal)\n touch-account-v2 <id> Touch account lastTouchedAt\n get-account-v2 <id> Get V2 account\n list-accounts-v2 List all V2 accounts\n create-tx-v2 [options] <id> <accountId> Create V2 tx (queued)\n start-tx-v2 <id> Start tx (queued→processing)\n settle-tx-v2 <id> Settle tx (processing→settled)\n fail-tx-v2 <id> [reason] Fail tx\n cancel-tx-v2 <id> [reason] Cancel tx\n get-tx-v2 <id> Get V2 tx\n list-txs-v2 List all V2 txs\n auto-freeze-idle-v2 Auto-freeze idle active accounts\n auto-fail-stuck-v2 Auto-fail stuck processing txs\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
56
56
  "ecosystem": "Usage: chainlesschain ecosystem|eco [options] [command]\n\nPlugin Ecosystem 2.0 (Phase 64) — registry + deps + install + AI review +\npublish + revenue + recommend\n\nOptions:\n -h, --help display help for command\n\nCommands:\n config Show ecosystem config (severities, statuses, rules, defaults)\n severities List review severities\n statuses List publish / install statuses\n revenue-types List revenue event types\n dep-kinds List dependency kinds\n rules List heuristic AI review rules\n register [options] Register a new plugin (status=draft)\n plugins [options] List plugins\n show <pluginId> Show plugin details\n update-stats [options] <pluginId> Update download count / avg rating\n dep-add [options] <pluginId> Add a dependency to a plugin\n deps <pluginId> List direct dependencies of a plugin\n resolve <pluginId> Resolve dependency tree (detects conflicts + cycles)\n install [options] Install a plugin for a user (auto-fails on cycle/conflict)\n installs [options] List install records\n uninstall <installId> Mark an install as uninstalled\n review [options] <pluginId> Run heuristic AI code review (regex rules + score)\n review-show <reviewId> Show a single review record\n reviews [options] List review records\n sandbox [options] <pluginId> Record a sandbox test result (caller pushes outcome)\n sandbox-show <testId> Show a single sandbox test record\n sandbox-tests [options] List sandbox test records\n submit <pluginId> Submit a plugin for review (draft/rejected → reviewing)\n approve <pluginId> Approve a reviewing plugin\n reject [options] <pluginId> Reject a reviewing plugin (appends a rejection review record)\n publish [options] <pluginId> Publish an approved plugin (computes sourceHash)\n rev-record [options] Record a revenue event (splits via developerShareRatio)\n revenue [options] <developerId> Aggregate a developer's revenue\n recommend [options] Heuristic plugin recommendations for a user\n stats Show ecosystem stats\n maturity-statuses-v2 List V2 plugin maturity statuses\n install-lifecycle-v2 List V2 install lifecycle statuses\n default-max-active-plugins-per-developer Show V2 default max active plugins per developer\n max-active-plugins-per-developer Show current V2 max active plugins per developer\n set-max-active-plugins-per-developer <n> Set V2 max active plugins per developer\n default-max-pending-installs-per-user Show V2 default max pending installs per user\n max-pending-installs-per-user Show current V2 max pending installs per user\n set-max-pending-installs-per-user <n> Set V2 max pending installs per user\n default-auto-deprecate-after-ms Show V2 default auto-deprecate threshold (ms)\n auto-deprecate-after-ms Show current V2 auto-deprecate threshold (ms)\n set-auto-deprecate-after-ms <ms> Set V2 auto-deprecate threshold (ms)\n default-auto-archive-after-ms Show V2 default auto-archive threshold (ms)\n auto-archive-after-ms Show current V2 auto-archive threshold (ms)\n set-auto-archive-after-ms <ms> Set V2 auto-archive threshold (ms)\n active-plugin-count [options] Count V2 active plugins (optionally scoped)\n pending-install-count [options] Count V2 pending+resolving installs (optionally scoped)\n register-plugin-v2 [options] <plugin-id> Register V2 plugin (status=active)\n maturity-v2 <plugin-id> Show V2 plugin maturity\n set-maturity-v2 [options] <plugin-id> <status> Transition V2 plugin maturity\n deprecate-plugin [options] <plugin-id> Deprecate V2 plugin\n archive-plugin-v2 [options] <plugin-id> Archive V2 plugin\n remove-plugin-v2 [options] <plugin-id> Remove V2 plugin (terminal)\n touch-plugin-activity <plugin-id> Bump lastActivityAt for V2 plugin\n submit-install-v2 [options] <install-id> Submit V2 install (status=pending)\n install-status-v2 <install-id> Show V2 install status\n set-install-status-v2 [options] <install-id> <status> Transition V2 install status\n resolve-install [options] <install-id> Mark V2 install as resolving\n complete-install [options] <install-id> Mark V2 install as installed\n fail-install [options] <install-id> Mark V2 install as failed\n uninstall-install-v2 [options] <install-id> Mark V2 install as uninstalled (terminal)\n retry-failed-install [options] <install-id> Retry a failed V2 install (failed → pending)\n auto-deprecate-stale-plugins Bulk-flip stale V2 ACTIVE plugins to DEPRECATED\n auto-archive-long-deprecated Bulk-flip long-deprecated V2 plugins to ARCHIVED\n stats-v2 Show V2 ecosystem stats (maturity + install)\n help [command] display help for command\n",
57
57
  "encrypt": "Usage: chainlesschain encrypt [options] [command]\n\nFile encryption and database encryption management\n\nOptions:\n -h, --help display help for command\n\nCommands:\n file [options] <path> Encrypt a file with AES-256-GCM\n db [options] Enable database encryption tracking\n info [options] <path> Check if a file is encrypted\n status [options] Show database encryption status\n key-maturities-v2 [options] [V2] List crypto key maturity states\n job-lifecycles-v2 [options] [V2] List crypto job lifecycle states\n config-v2 [options] [V2] Show governance config\n set-max-active-keys-per-owner-v2 <n> [V2] Set per-owner active key cap\n set-max-pending-jobs-per-key-v2 <n> [V2] Set per-key pending job cap\n set-key-idle-ms-v2 <ms> [V2] Set key idle threshold (ms)\n set-job-stuck-ms-v2 <ms> [V2] Set job stuck threshold (ms)\n register-key-v2 [options] <id> [V2] Register a crypto key profile\n (PENDING)\n activate-key-v2 <id> [V2] Activate key (pending|rotated ->\n active)\n rotate-key-v2 <id> [V2] Rotate key (active -> rotated)\n retire-key-v2 <id> [V2] Retire key (terminal)\n touch-key-v2 <id> [V2] Bump key lastSeenAt\n get-key-v2 [options] <id> [V2] Show crypto key profile\n list-keys-v2 [options] [V2] List crypto key profiles\n create-job-v2 [options] <id> [V2] Create a queued V2 crypto job\n start-job-v2 <id> [V2] Start crypto job (queued ->\n running)\n complete-job-v2 <id> [V2] Complete crypto job (running ->\n completed)\n fail-job-v2 <id> [V2] Fail crypto job (running ->\n failed)\n cancel-job-v2 <id> [V2] Cancel crypto job (queued|running\n -> cancelled)\n get-job-v2 [options] <id> [V2] Show crypto job\n list-jobs-v2 [options] [V2] List V2 crypto jobs\n active-key-count-v2 [options] [V2] Count active crypto keys (optional\n --owner)\n pending-job-count-v2 [options] [V2] Count pending crypto jobs\n (queued+running)\n auto-rotate-idle-keys-v2 [options] [V2] Rotate idle active keys\n auto-fail-stuck-jobs-v2 [options] [V2] Fail stuck running crypto jobs\n stats-v2 [options] [V2] Show governance stats\n help [command] display help for command\n",
58
- "eval": "Usage: chainlesschain eval [options]\n\nRun the reliability eval suite (self-checking coding tasks) and report the\ntask-success rate\n\nOptions:\n --suite <name> Suite to run (default: \"builtin\")\n --model <model> Model for the agent runs\n --provider <provider> Provider for the agent runs\n --json Output the summary as JSON\n --keep Keep the per-task temp workspaces (debug)\n --otlp <file> Write OpenTelemetry (OTLP/JSON) spans for the\n run to a file\n --dry-run Use a no-op agent (exercise the harness/report\n without a model)\n --history <file> Append this run's summary (JSONL) for trend\n tracking\n --label <label> Tag this run in the history (e.g. a\n version/commit)\n --trend Report the diagnostic pass-rate trend from\n --history instead of running\n --strict With --trend: require complete, comparable\n recent evidence; legacy history cannot pass\n --max-age-hours <hours> With --strict: maximum age of both compared\n runs (default: \"168\")\n --comparison-context <file> Bind explicit provider/model to\n operator-declared modelRevision and\n environment/permission/inference digests (not\n production attestation)\n --regression-threshold <pct> With --trend: pass-rate drop (in points) that\n fails the gate on its own (default: \"0\")\n -h, --help display help for command\n",
58
+ "eval": "Usage: chainlesschain eval [options]\n\nRun the reliability eval suite (self-checking coding tasks) and report the\ntask-success rate\n\nOptions:\n --suite <name> Suite to run (default: \"builtin\")\n --plan-dir <directory> Frozen VERIFY-01 plan bundle\n --plan-digest <digest> Externally pinned frozen plan digest\n --review <file> Independent setup/check review configuration\n --review-digest <digest> Review digest pinned before execution\n --review-root <directory> Trusted evaluator source root outside the task\n project\n --project-root <directory> Actual checkout of the frozen project commit\n --samples <ids> Selected frozen sample IDs; unselected samples\n remain missing\n --evidence-dir <directory> Keep frozen-suite raw process output and\n complete diffs outside compact Eval history\n --model <model> Model for the agent runs\n --provider <provider> Provider for the agent runs\n --json Output the summary as JSON\n --keep Keep the per-task temp workspaces (debug)\n --otlp <file> Write OpenTelemetry (OTLP/JSON) spans for the\n run to a file\n --dry-run Use a no-op agent (exercise the harness/report\n without a model)\n --history <file> Append this run's summary (JSONL) for trend\n tracking\n --label <label> Tag this run in the history (e.g. a\n version/commit)\n --trend Report the diagnostic pass-rate trend from\n --history instead of running\n --strict With --trend: require complete, comparable\n recent evidence; legacy history cannot pass\n --max-age-hours <hours> With --strict: maximum age of both compared\n runs (default: \"168\")\n --comparison-context <file> Bind explicit provider/model to\n operator-declared modelRevision and\n environment/permission/inference digests (not\n production attestation)\n --regression-threshold <pct> With --trend: pass-rate drop (in points) that\n fails the gate on its own (default: \"0\")\n -h, --help display help for command\n",
59
59
  "evolution": "Usage: chainlesschain evolution [options] [command]\n\nEvolution metrics and governance records — not model training or active Skill\npromotion\n\nOptions:\n -h, --help display help for command\n\nCommands:\n workbench Review governed Skill evolution evidence and versions\n attestor-trust Operate the governed Skill attestor trust control plane\n knowledge Review encrypted governed knowledge conflicts\n benchmark Run and inspect governed WikiSkill benchmark reports\n deployment Configure the signed governed Skill evolution deployment\n assess [options] <name> <score> Assess and track a capability\n record-model-metrics [options] <model-id> Record a synthetic model metric estimate (no training)\n diagnose [options] Diagnose recorded evolution metrics\n repair [options] <issue> Apply a maintenance strategy to a recorded diagnosis\n predict [options] [user-id] Predict user behavior\n growth [options] Show growth log\n stats [options] Show capabilities and models overview\n export [options] <model-id> Export a model metric record for portability\n dimensions [options] List CAPABILITY_DIMENSION enum\n severities [options] List DIAGNOSIS_SEVERITY enum\n strategies [options] List REPAIR_STRATEGY enum\n milestones [options] List GROWTH_MILESTONE enum\n assess-v2 [options] <dimension> <score> Assess capability by canonical dimension\n capabilities-v2 [options] List V2 capabilities\n record-training-metrics-v2 [options] Record caller-supplied loss metrics (no training)\n training-metrics-v2 [options] List V2 training metric records\n diagnose-v2 [options] Diagnose recorded V2 evolution metrics\n diagnoses-v2 [options] List V2 diagnoses\n diagnosis-show [options] <id> Show a specific diagnosis\n repair-v2 [options] <diagnosis-id> Record a V2 maintenance strategy for a diagnosis\n predict-v2 [options] Project behavior from recorded V2 metrics\n record-milestone [options] <type> Record a growth milestone explicitly\n growth-v2 [options] List V2 growth milestones\n configure [options] Update evolution config\n config [options] Show evolution config\n stats-v2 [options] V2 evolution stats\n enums-v2 Show V2 enums (goal maturity + cycle lifecycle)\n config-v2 Show V2 config thresholds\n set-max-active-goals-v2 <n> Set max active goals per owner\n set-max-pending-cycles-v2 <n> Set max pending cycles per goal\n set-goal-idle-ms-v2 <n> Set goal idle threshold (ms)\n set-cycle-stuck-ms-v2 <n> Set cycle stuck threshold (ms)\n register-goal-v2 [options] <id> <owner> Register V2 evo goal\n activate-goal-v2 <id> Activate evo goal\n pause-goal-v2 <id> Pause evo goal\n archive-goal-v2 <id> Archive goal (terminal)\n touch-goal-v2 <id> Touch goal lastTouchedAt\n get-goal-v2 <id> Get V2 goal\n list-goals-v2 List all V2 goals\n create-cycle-v2 [options] <id> <goalId> Create V2 cycle (queued)\n start-cycle-v2 <id> Start cycle (queued→running)\n complete-cycle-v2 <id> Complete cycle (running→completed)\n fail-cycle-v2 <id> [reason] Fail cycle\n cancel-cycle-v2 <id> [reason] Cancel cycle\n get-cycle-v2 <id> Get V2 cycle\n list-cycles-v2 List all V2 cycles\n auto-pause-idle-v2 Auto-pause idle active goals\n auto-fail-stuck-v2 Auto-fail stuck running cycles\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
60
60
  "evomap": "Usage: chainlesschain evomap [options] [command]\n\nEvoMap — gene exchange protocol for agent capabilities\n\nOptions:\n -h, --help display help for command\n\nCommands:\n search [options] <query> Search for genes on the hub\n download <geneId> Download a gene from the hub\n publish [options] Publish a gene to the hub\n list List locally installed genes\n hubs List configured EvoMap hubs\n federation Federated hub management and gene syncing\n gov EvoMap governance — ownership, proposals,\n voting\n enums-v2 Show V2 governance enums\n register-map-v2 [options] Register an evomap profile (pending)\n activate-map-v2 <id> Activate map\n stale-map-v2 <id> Mark map stale\n archive-map-v2 <id> Archive map (terminal)\n touch-map-v2 <id> Refresh lastTouchedAt\n get-map-v2 <id> Get map\n list-maps-v2 List maps\n create-evolution-v2 [options] Create an evolution (queued)\n start-evolution-v2 <id> Transition evolution to running\n complete-evolution-v2 <id> Transition evolution to completed\n fail-evolution-v2 [options] <id> Fail evolution\n cancel-evolution-v2 [options] <id> Cancel evolution\n get-evolution-v2 <id> Get evolution\n list-evolutions-v2 List evolutions\n set-max-active-maps-v2 <n> Set per-owner active cap\n set-max-pending-evolutions-v2 <n> Set per-map pending cap\n set-map-idle-ms-v2 <n> Set idle threshold\n set-evolution-stuck-ms-v2 <n> Set stuck threshold\n auto-stale-idle-maps-v2 Auto-stale idle maps\n auto-fail-stuck-evolutions-v2 Auto-fail stuck running evolutions\n gov-stats-v2 V2 governance aggregate stats\n help [command] display help for command\n",
61
61
  "execbe": "Usage: chainlesschain execbe [options] [command]\n\nExecution backend V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n maturities-v2\n job-lifecycle-v2\n stats-v2\n config-v2\n register-backend-v2 <id> <owner> [kind]\n activate-backend-v2 <id>\n degrade-backend-v2 <id>\n retire-backend-v2 <id>\n touch-backend-v2 <id>\n get-backend-v2 <id>\n list-backends-v2\n create-job-v2 <id> <backendId> [cmd]\n start-job-v2 <id>\n succeed-job-v2 <id>\n fail-job-v2 <id> [reason]\n cancel-job-v2 <id> [reason]\n get-job-v2 <id>\n list-jobs-v2\n auto-degrade-idle-v2\n auto-fail-stuck-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n reset-state-v2\n help [command] display help for command\n",
@@ -14,6 +14,7 @@ import path from "path";
14
14
  import { fileURLToPath } from "url";
15
15
  import { runEvalSuite } from "../lib/eval/runner.js";
16
16
  import { getSuite } from "../lib/eval/tasks.js";
17
+ import { persistVerify01Receipts } from "../lib/eval/verify01-execution.js";
17
18
  import executionBroker from "../lib/process-execution-broker/index.js";
18
19
  import {
19
20
  TelemetryRecorder,
@@ -142,7 +143,7 @@ function killAgentTree(child) {
142
143
  * workspace. acceptEdits lets it write files without an interactive prompt.
143
144
  */
144
145
  function makeHeadlessRunAgent(opts = {}) {
145
- return function runAgent({ prompt, cwd, timeoutMs }) {
146
+ return function runAgent({ prompt, cwd, timeoutMs, costBudgetUsd }) {
146
147
  return new Promise((resolve) => {
147
148
  let args;
148
149
  if (opts._argv) {
@@ -163,6 +164,9 @@ function makeHeadlessRunAgent(opts = {}) {
163
164
  if (opts.model) args.push("--model", opts.model);
164
165
  if (opts.provider) args.push("--provider", opts.provider);
165
166
  if (opts.ephemeral === true) args.push("--ephemeral");
167
+ if (opts.sandboxMode) args.push("--sandbox-mode", opts.sandboxMode);
168
+ if (Number.isFinite(costBudgetUsd) && costBudgetUsd >= 0)
169
+ args.push("--max-budget-usd", String(costBudgetUsd));
166
170
  }
167
171
  const child = _deps.spawn(process.execPath, args, {
168
172
  cwd,
@@ -272,6 +276,26 @@ export function registerEvalCommand(program, { logger } = {}) {
272
276
  "Run the reliability eval suite (self-checking coding tasks) and report the task-success rate",
273
277
  )
274
278
  .option("--suite <name>", "Suite to run", "builtin")
279
+ .option("--plan-dir <directory>", "Frozen VERIFY-01 plan bundle")
280
+ .option("--plan-digest <digest>", "Externally pinned frozen plan digest")
281
+ .option("--review <file>", "Independent setup/check review configuration")
282
+ .option("--review-digest <digest>", "Review digest pinned before execution")
283
+ .option(
284
+ "--review-root <directory>",
285
+ "Trusted evaluator source root outside the task project",
286
+ )
287
+ .option(
288
+ "--project-root <directory>",
289
+ "Actual checkout of the frozen project commit",
290
+ )
291
+ .option(
292
+ "--samples <ids>",
293
+ "Selected frozen sample IDs; unselected samples remain missing",
294
+ )
295
+ .option(
296
+ "--evidence-dir <directory>",
297
+ "Keep frozen-suite raw process output and complete diffs outside compact Eval history",
298
+ )
275
299
  .option("--model <model>", "Model for the agent runs")
276
300
  .option("--provider <provider>", "Provider for the agent runs")
277
301
  .option("--json", "Output the summary as JSON")
@@ -381,21 +405,54 @@ export function registerEvalCommand(program, { logger } = {}) {
381
405
  let tasks;
382
406
  let comparison;
383
407
  try {
384
- tasks = _deps.getSuite(options.suite);
385
- comparison = createEvalComparison({
386
- suite: options.suite,
387
- corpusDigest: evalDigest(
388
- fs.readFileSync(new URL("../lib/eval/tasks.js", import.meta.url)),
389
- ),
390
- provider: options.provider,
391
- model: options.model,
392
- context: options.comparisonContext
393
- ? readComparisonContext(options.comparisonContext, {
394
- provider: options.provider,
395
- model: options.model,
396
- })
397
- : null,
408
+ tasks = _deps.getSuite(options.suite, {
409
+ verify01: {
410
+ planDir: options.planDir,
411
+ planDigest: options.planDigest,
412
+ reviewFile: options.review,
413
+ reviewDigest: options.reviewDigest,
414
+ reviewRoot: options.reviewRoot,
415
+ projectRoot: options.projectRoot,
416
+ sampleIds: options.samples,
417
+ provider: options.provider,
418
+ model: options.model,
419
+ },
398
420
  });
421
+ if (tasks.verification && !/^[a-f0-9]{40}$/u.test(options.label || ""))
422
+ throw new Error(
423
+ "frozen suite requires --label <40-character tested CLI source SHA>; this differs from the task project checkout SHA",
424
+ );
425
+ if (tasks.verification)
426
+ tasks.verification.executionSource = {
427
+ declaredCommit: options.label,
428
+ identityVerified: false,
429
+ declarationOnly: true,
430
+ entryDigest: evalDigest(fs.readFileSync(BIN)),
431
+ };
432
+ if (tasks.verification && !options.evidenceDir)
433
+ throw new Error(
434
+ "frozen suite requires --evidence-dir to retain raw execution material",
435
+ );
436
+ if (tasks.verification && options.comparisonContext)
437
+ throw new Error(
438
+ "frozen suite comparison is bound by its plan; --comparison-context cannot override it",
439
+ );
440
+ comparison =
441
+ tasks.verification?.comparison ||
442
+ createEvalComparison({
443
+ suite: options.suite,
444
+ corpusDigest: evalDigest(
445
+ fs.readFileSync(new URL("../lib/eval/tasks.js", import.meta.url)),
446
+ ),
447
+ provider: options.provider,
448
+ model: options.model,
449
+ context: options.comparisonContext
450
+ ? readComparisonContext(options.comparisonContext, {
451
+ provider: options.provider,
452
+ model: options.model,
453
+ })
454
+ : null,
455
+ });
399
456
  } catch (err) {
400
457
  log.error ? log.error(err.message) : console.error(err.message);
401
458
  process.exitCode = 1;
@@ -406,6 +463,12 @@ export function registerEvalCommand(program, { logger } = {}) {
406
463
  : makeHeadlessRunAgent({
407
464
  model: options.model,
408
465
  provider: options.provider,
466
+ ...(tasks.verification
467
+ ? {
468
+ ephemeral: true,
469
+ sandboxMode: tasks.verification.requiredSandboxMode,
470
+ }
471
+ : {}),
409
472
  });
410
473
 
411
474
  // OTel-shaped telemetry for the run (per-task span + failure class).
@@ -414,7 +477,7 @@ export function registerEvalCommand(program, { logger } = {}) {
414
477
  const summary = await _deps.runEvalSuite(tasks, {
415
478
  runAgent,
416
479
  recorder,
417
- keepWorkspaces: options.keep === true,
480
+ keepWorkspaces: options.keep === true || Boolean(tasks.verification),
418
481
  onResult: options.json
419
482
  ? undefined
420
483
  : (r) =>
@@ -432,6 +495,40 @@ export function registerEvalCommand(program, { logger } = {}) {
432
495
  dryRun: options.dryRun === true,
433
496
  label: options.label || null,
434
497
  });
498
+ if (tasks.verification) {
499
+ try {
500
+ record.verification = {
501
+ ...persistVerify01Receipts(
502
+ tasks.verification,
503
+ options.evidenceDir,
504
+ record.runId,
505
+ ),
506
+ executionStatus: options.dryRun ? "DRY_RUN" : "ATTEMPTED",
507
+ // Execution material for the existing collector, not an observation
508
+ // or an independent acceptance of the frozen population.
509
+ observationsCreated: false,
510
+ collectionReady:
511
+ options.dryRun !== true &&
512
+ record.results.every(
513
+ (result) =>
514
+ result.executionEvidence?.terminalVerified === true &&
515
+ result.executionEvidence.protocol ===
516
+ EVAL_EXECUTION_PROTOCOL &&
517
+ result.executionEvidence.observedFallback === false &&
518
+ Number.isFinite(result.totalCostUsd) &&
519
+ result.totalCostUsd >= 0 &&
520
+ Array.isArray(result.unrelatedChanges) &&
521
+ result.unrelatedChanges.length === 0,
522
+ ),
523
+ };
524
+ } catch (error) {
525
+ (log.error || console.error)(
526
+ `frozen evidence persistence failed: ${error.message}`,
527
+ );
528
+ process.exitCode = 1;
529
+ return;
530
+ }
531
+ }
435
532
 
436
533
  if (options.otlp) {
437
534
  try {
@@ -445,8 +542,9 @@ export function registerEvalCommand(program, { logger } = {}) {
445
542
  }
446
543
  }
447
544
  try {
448
- const { exportTelemetryRecorder } =
449
- await import("../lib/observability/index.js");
545
+ const { exportTelemetryRecorder } = await import(
546
+ "../lib/observability/index.js"
547
+ );
450
548
  exportTelemetryRecorder(recorder);
451
549
  } catch {
452
550
  // Collector export is best-effort and never changes evaluation gates.
@@ -485,6 +583,8 @@ export function registerEvalCommand(program, { logger } = {}) {
485
583
  // Non-zero exit when not every task passed — usable as a CI gate.
486
584
  if (summary.total === 0 || summary.passed < summary.total)
487
585
  process.exitCode = 1;
586
+ else if (record.verification && !record.verification.collectionReady)
587
+ process.exitCode = 2;
488
588
  });
489
589
  return program;
490
590
  }
@@ -166,27 +166,40 @@ export function registerMemoryCommand(program) {
166
166
  .description("Show memory entries")
167
167
  .option("-n, --limit <n>", "Max entries", "20")
168
168
  .option("--category <cat>", "Filter by category")
169
+ .option("--page", "Return a page with a next-page cursor")
170
+ .option("--cursor <cursor>", "Continue a page using the same filters")
169
171
  .option("--json", "Output as JSON")
170
172
  .action(async (options) => {
171
173
  try {
172
174
  const ctx = await bootstrap({ verbose: program.opts().verbose });
173
175
  const service = await resolveCanonicalMemory(ctx);
174
176
  if (!ctx.db && !service.decision.canonical) {
175
- logger.error("Database not available");
176
- process.exit(1);
177
+ throw new Error("Database not available");
177
178
  }
178
- const entries = service.decision.canonical
179
- ? await service.list({
180
- limit: Math.max(1, parseInt(options.limit) || 20),
181
- category: options.category,
182
- })
183
- : listMemory(ctx.db.getDatabase(), {
184
- limit: Math.max(1, parseInt(options.limit) || 20),
185
- category: options.category,
186
- });
179
+ const paged = Boolean(options.page || options.cursor !== undefined);
180
+ if (paged && !service.decision.canonical) {
181
+ throw new Error(
182
+ "Paged memory listing requires canonical memory mode",
183
+ );
184
+ }
185
+ if (options.cursor !== undefined && !options.cursor.trim()) {
186
+ throw new Error("Pagination cursor must not be empty");
187
+ }
188
+ const query = {
189
+ limit: Math.max(1, parseInt(options.limit) || 20),
190
+ category: options.category,
191
+ };
192
+ const page = paged
193
+ ? await service.listPage({ ...query, cursor: options.cursor })
194
+ : null;
195
+ const entries = page
196
+ ? page.entries
197
+ : service.decision.canonical
198
+ ? await service.list(query)
199
+ : listMemory(ctx.db.getDatabase(), query);
187
200
 
188
201
  if (options.json) {
189
- console.log(JSON.stringify(entries, null, 2));
202
+ console.log(JSON.stringify(page || entries, null, 2));
190
203
  } else if (entries.length === 0) {
191
204
  logger.info("No memory entries. Use 'memory add' to create one.");
192
205
  } else {
@@ -206,11 +219,17 @@ export function registerMemoryCommand(program) {
206
219
  logger.log(` ${chalk.gray(e.created_at)}`);
207
220
  }
208
221
  }
209
-
210
- await shutdown();
222
+ if (!options.json && page?.nextCursor) {
223
+ logger.log(`Next page cursor: ${page.nextCursor}`);
224
+ logger.log(
225
+ "Use 'memory show --cursor <cursor>' with the same category and limit.",
226
+ );
227
+ }
211
228
  } catch (err) {
212
229
  logger.error(`Failed: ${err.message}`);
213
- process.exit(1);
230
+ process.exitCode = 1;
231
+ } finally {
232
+ await shutdown();
214
233
  }
215
234
  });
216
235
 
@@ -5,6 +5,7 @@
5
5
 
6
6
  import chalk from "chalk";
7
7
  import { intArg } from "../lib/cli-arg.js";
8
+ import { describeExecutionSupport } from "../lib/execution-support.js";
8
9
  import ora from "ora";
9
10
  import { logger } from "../lib/logger.js";
10
11
  import { bootstrap, shutdown } from "../runtime/bootstrap.js";
@@ -132,6 +133,7 @@ export function registerSandboxCommand(program, dependencies = {}) {
132
133
  availability,
133
134
  host: dependencies.host,
134
135
  });
136
+ report.support = describeExecutionSupport({ capabilityReport: report });
135
137
 
136
138
  if (options.json) {
137
139
  console.log(JSON.stringify(report, null, 2));
@@ -144,6 +146,13 @@ export function registerSandboxCommand(program, dependencies = {}) {
144
146
  ` Backend: ${report.backend.engine || "none"} (${report.backend.availabilityChecked ? (report.backend.available ? "available" : "unavailable") : "not probed"})`,
145
147
  );
146
148
  logger.log(` Status: ${report.status}`);
149
+ logger.log(
150
+ ` I/O: ${report.support.io.stdin} stdin; captured stdout/stderr`,
151
+ );
152
+ logger.log(` Permission source: ${report.support.permissionSource}`);
153
+ logger.log(
154
+ ` Persistent network revocation: ${report.support.persistentNetworkRevocation.status} (${report.support.persistentNetworkRevocation.reason || "configured"})`,
155
+ );
147
156
  logger.log(
148
157
  ` Execution observed: ${report.execution.observed ? "yes" : "no"}`,
149
158
  );
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.87",
7
+ "cliVersions": ["0.166.87"],
8
+ "date": null,
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.87: October model contracts and indexed memory queries",
13
+ "body": "- Add exact GPT-6.1 Sol and Claude Sonnet 5.5 profiles, model-specific cache\n pricing, Responses reasoning/output validation and reviewed catalog drift checks.\n- Push memory list filters and limits into authority-bound query indexes, retain\n stable snapshot pagination and rebuild corrupted derived indexes from authority.\n Upgraded index descriptors require compatible readers; older readers fail closed.\n- Add a reviewed frozen CLI evaluation entry with isolated project snapshots,\n independent acceptance scripts and raw execution evidence. Real provider/IDE\n evaluation and billing acceptance remain separate from fixture validation.\n- Support explicit cooperative Linux cgroup2 ownership cleanup after supervisor\n loss, preserving quarantine when kernel identity or durable settlement is unknown.\n- Verify Codex 0.160.0 native protocol and pinned MCP reference-server recovery\n without expanding the production external-agent admission allowlist.\n- Pair VS Code `0.37.132` and JetBrains `0.4.150` with CLI `0.166.87` for live\n capability diagnostics, strict CLI identity and bounded slow-start draft handling."
14
+ }
15
+ ]
16
+ },
4
17
  {
5
18
  "productVersion": null,
6
19
  "cliVersion": "0.166.86",
@@ -7,7 +7,11 @@
7
7
  */
8
8
 
9
9
  import crypto from "node:crypto";
10
- import { PRICE_TABLE, priceRollup } from "./llm-pricing.js";
10
+ import {
11
+ PRICE_TABLE,
12
+ priceRollup,
13
+ normalizePricingTerms,
14
+ } from "./llm-pricing.js";
11
15
  import {
12
16
  projectUsagePricingContext,
13
17
  mergeUsagePricingBucket,
@@ -267,50 +271,7 @@ function normalizePricingTable(table = PRICE_TABLE) {
267
271
  result.exact = entry.exact;
268
272
  }
269
273
  if (Object.hasOwn(entry, "terms")) {
270
- const terms = entry.terms;
271
- const nonNegative = (value) => {
272
- if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
273
- throw new Error("invalid pricing multiplier");
274
- return value;
275
- };
276
- assertKnownOwnKeys(
277
- terms,
278
- new Set([
279
- "cacheReadMultiplier",
280
- "cacheWriteMultiplier",
281
- "longContext",
282
- "serviceMultipliers",
283
- ]),
284
- "pricing terms",
285
- );
286
- assertKnownOwnKeys(
287
- terms.longContext,
288
- new Set(["threshold", "inputMultiplier", "outputMultiplier"]),
289
- "pricing long context",
290
- );
291
- const threshold = nonNegative(terms.longContext.threshold);
292
- if (!Number.isSafeInteger(threshold))
293
- throw new Error("invalid pricing threshold");
294
- assertKnownOwnKeys(
295
- terms.serviceMultipliers,
296
- new Set(["standard", "default", "auto", "batch", "flex", "fast"]),
297
- "pricing service multipliers",
298
- );
299
- result.terms = {
300
- cacheReadMultiplier: nonNegative(terms.cacheReadMultiplier),
301
- cacheWriteMultiplier: nonNegative(terms.cacheWriteMultiplier),
302
- longContext: {
303
- threshold,
304
- inputMultiplier: nonNegative(terms.longContext.inputMultiplier),
305
- outputMultiplier: nonNegative(terms.longContext.outputMultiplier),
306
- },
307
- serviceMultipliers: Object.fromEntries(
308
- Object.entries(terms.serviceMultipliers).map(([key, value]) => [
309
- key,
310
- nonNegative(value),
311
- ]),
312
- ),
313
- };
274
+ result.terms = normalizePricingTerms(entry.terms);
314
275
  }
315
276
  return result;
316
277
  });
@@ -21,6 +21,16 @@ import {
21
21
  } from "@chainlesschain/context-memory-kernel";
22
22
  import { withFileLock } from "../with-file-lock.js";
23
23
  import { getHomeDir } from "../paths.js";
24
+ import { resolve } from "node:path";
25
+ import {
26
+ compareMemoryRows,
27
+ decodeListCursor,
28
+ encodeListCursor,
29
+ listCursorBinding,
30
+ matchesListQuery,
31
+ normalizeListQuery,
32
+ pageLimit,
33
+ } from "./memory-query-index.js";
24
34
 
25
35
  const STORE_SCHEMA = "chainlesschain.cli-context-memory-store/v1";
26
36
  const DEFAULT_MAX_STORE_BYTES = 64 * 1024 * 1024;
@@ -292,19 +302,48 @@ export class DurableJsonMemoryPort {
292
302
  );
293
303
  }
294
304
 
295
- async listRecords({ includeTombstones = false } = {}) {
305
+ async listRecords(options = {}) {
306
+ const query = normalizeListQuery(options);
296
307
  const records = await this.query();
297
308
  return records
298
- .filter(
299
- (record) =>
300
- includeTombstones || !["deleted", "purged"].includes(record.state),
301
- )
302
- .sort(
303
- (left, right) =>
304
- right.importance - left.importance ||
305
- right.updatedAt.localeCompare(left.updatedAt, "en") ||
306
- left.memoryId.localeCompare(right.memoryId, "en"),
309
+ .filter((record) => matchesListQuery(record, query))
310
+ .sort(compareMemoryRows)
311
+ .slice(
312
+ 0,
313
+ options.limit == null
314
+ ? undefined
315
+ : Math.max(1, Number(options.limit) || 20),
316
+ );
317
+ }
318
+
319
+ async listPage(options = {}) {
320
+ const query = normalizeListQuery(options);
321
+ const count = pageLimit(options.limit);
322
+ return this._locked(() => {
323
+ const state = this._readUnlocked();
324
+ const binding = listCursorBinding(
325
+ resolve(this.filePath),
326
+ state.digest,
327
+ query,
307
328
  );
329
+ const after = decodeListCursor(options.cursor, binding);
330
+ const matches = Object.values(state.records)
331
+ .filter(
332
+ (record) =>
333
+ matchesListQuery(record, query) &&
334
+ (!after || compareMemoryRows(record, after) > 0),
335
+ )
336
+ .sort(compareMemoryRows);
337
+ const records = matches.slice(0, count);
338
+ return {
339
+ records,
340
+ storeRevision: state.storeRevision,
341
+ nextCursor:
342
+ matches.length > count
343
+ ? encodeListCursor(binding, records.at(-1))
344
+ : null,
345
+ };
346
+ });
308
347
  }
309
348
 
310
349
  async commit({ record, event, reconciliation }, expectedRevision = 0) {