chainlesschain 0.166.65 → 0.166.69

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 (200) hide show
  1. package/README.md +20 -12
  2. package/package.json +4 -4
  3. package/src/assets/web-panel/assets/{AIOps-Byz17CTN.js → AIOps-FhevRfL6.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-C5LiW2-J.js → ActionButton-rOeOykx5.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D1INcvZF.js → Analytics-BK_wYlfz.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DZzHO1VV.js → AppLayout-_2cCtZKV.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-WfYQL6Ia.js → Artifacts-D5MSvVzk.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DohBoGWO.js → Audit-yd-Ah-A3.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-Chtk-Hde.js → BackgroundAgents-yCaw_Gu_.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-B813PuMz.js → Backup-G3ADD4N-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DaDdWWgK.js → BaseInput-ByDhkLbF.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-D4pJ6oZ7.js → Chat-BMrc7qjz.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-nA7n0I6S.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-Clo9TvO6.js → Checkbox-BHYgyZWA.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-uejLg8Ih.js → Codegen-DJfcy0jC.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-B7nbx-iJ.js → Col-C27zROxc.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-FEyjPK1j.js → Community-CuS5tq_1.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-B6Fk0Kn6.js → Compact-BrYJNe7Q.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BQG8goUl.js → Compliance-8hfahYHT.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CbBeEfHp.js → Cowork-DdE0n2lp.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-DPzlFcEZ.js → Cron-CUq3aSiX.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-B8pWJrbg.js → Crosschain-BM4XSPWG.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-gGQHUlFN.js → DID-CdaBY57N.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2TMFHrn.js → Dashboard-Cwtd52So.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BVPxGbll.js → Dropdown-BvlObh6U.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-CNPxs0hd.js → EmailListRenderer-e3fLhjnX.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-_XTiB7q1.js → EvolutionSettings-CTtk1Zo8.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-UyE3VWtI.js → FamilyGuardDashboard-BpPJUnCU.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CLt6FHK-.js → Federation-vzjZ6_nQ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CdNQPRPw.js → FormItemContext-DEDNLhkE.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-BJ0AMhrh.js → GenericCardRenderer-DEl2Te5f.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CQnvMfOM.js → Git-BzsYQnCq.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-deYsHC-o.js → Governance-zxJs6Y8s.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-qaSck43z.js → Inference-5JUsrmF1.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-De0aJ3Ls.js → KnowledgeGraph-Br8b5Htz.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-ZtS98jCm.js → Logs-D-tubDMJ.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-In4itZX2.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Byz3xCBN.js → Marketplace-s8MmWkS9.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DOZUUW6z.js → McpTools-Wu-WRg4M.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-C33wC2hA.js → Memory-B_i-eX9w.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-zZe-T_6M.js → MobileBridge-Ca64kjVx.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CRnUIume.js → MobileProjects-Cq9AFiO4.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-C1xlRVAN.js → Mtc-DKvGmG3y.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-D0U07bIi.js → MtcAudit-BVvWx8pF.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DF8uvV3h.js → Multisig-wqeJ2O9x.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-bBPGAFlt.js → NLProgramming-DX87ysYu.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BHAaOsgg.js → Notes-ChenGdu0.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Cl0fG_rA.js → NotificationSettings-BZRa68-x.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-BEPAs8Zv.js → OrderTableRenderer-DZ6xG1M6.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-BAxSwgk5.js → Organization-BWJp4VPX.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-D68KubAu.js → Overflow-BoM4bYt5.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-bhdT17zk.js → P2P-Cvi8YV09.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-DqaO6wgH.js → PdhVaultBrowser-CNVC1NIj.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-Bq8fvkak.js → Permissions-DNd1MRjW.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BYd2JEic.js → PersonalDataHub-DGSBYZ5-.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-Csg_ja69.js → Pipeline-DkcoGMBo.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-lwxwLj4M.js → Privacy-DltwvMAW.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-BdBZkH8z.js → ProjectInit-ChYbpHg8.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-ClWgFy-K.js → ProjectSettings-B8FWiHTJ.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Bu-qj8N1.js → Projects-DuyhtSm4.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-DEjxrxw3.js → Providers-Bo18Tx_6.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-eccy-8Vi.js → QrScannerModal-6W85KlsG.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-Vx3uDvFg.js → QuickAsk-DznRUedP.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CfUivNps.js → Recommend-CQDN3_p-.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BU4gk7GI.js → RemoteSession-CiJgokEj.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-CbPzdZ0C.js → Reputation-DexzGH7E.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-CYLrgfKA.js → Row-BgZOIvSi.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-DbY1oyuv.js → RssFeed-BWIZJ_Jr.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-QeW41K5r.js → Search-B376EwWJ.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CJxf1kLZ.js → Security-92mUR5OD.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-CFO9ySZc.js → Services-ClSEAOHk.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CQFjeQN0.js → Skeleton-DVhLbv99.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CLLB4INW.js → Skills-JTcXs_xI.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DxeLIJk0.js → Sla-DnKY9zy9.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-D4FA9KYI.js → SpeechSettings-GO1JefAH.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-C6NOkcQK.js → SyncSettings-jX5tB2St.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-LmVPWDfQ.js → Tasks-BxRBzhUc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-BdEfUoVB.js → Templates-CAVkbTG1.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-IUlESacN.js → Tenant-5Y7sHBkz.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B9pDe7sn.js → Terminal-CbbLShYb.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-ZCwB-Pki.js → TimelineRenderer-2HptWihL.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-4qk16LX1.js → Tokens-B-jGxzHl.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-jXNyargn.js → Trigger-9DGa90DT.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D13PydtT.js → Trust-BSJEkEOO.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-yPgws6mS.js → UkeySign-C807So5R.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-B329WjpG.js → VideoEditing-ByiieAv-.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-T8VM-Ttm.js → Wallet-BixbIOUv.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-XuRibrpP.js → WebAuthn-z7akhor4.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-D1Gwz3YR.js → WorkflowEditor-KvijuUuR.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-DjydtnT-.js → chat-BYKoh0YG.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-gFtBvPrr.js → colors-CLT8IYBt.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-CndxhGfx.js → compact-item-DlBIyYHF.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DnfGpd0L.js → createContext-5XmAnNLr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BmcCIHwY.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CmT5hRVW.js → hasIn-rPdRhm7K.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DoBKSzqu.js → index-8un-eUDI.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DGbKeg8G.js → index-B-0nAxf5.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DreYqebI.js → index-B1VfBUPB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-zQf599Uq.js → index-BBt2CSAx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BlTcxT_L.js → index-BDtlwjSr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CqpR0Des.js → index-BIRl2Ii5.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C3HvYeA3.js → index-BgevTkUv.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B0WFjxWs.js → index-Bve7Wsgf.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BNHdO6Jr.js → index-Bzd0sFkp.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DV2PR3Fa.js → index-C2sFDVb_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D2d7358Y.js → index-CErvHCDe.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DaEPE2DC.js → index-CM_a9spK.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DKyuE_Y2.js → index-CY6TMc2m.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BVM_w30N.js → index-ChlzaTV3.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CZLDbPTa.js → index-CsnbOKdI.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-HHP1zzo7.js → index-D3-NL-x-.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BFif4Cev.js → index-D3f9Jzx2.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C14jryXi.js → index-DCDSycWo.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CB27echm.js → index-DIVrVGvf.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BGlmPbl_.js → index-DI_tYFBe.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BsRKmb6k.js → index-DPS4mWnI.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BXNUTiW8.js → index-DTslLzPJ.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dbpk75MO.js → index-DW8vozBS.js} +1 -1
  119. package/src/assets/web-panel/assets/index-DY8rmd6x.js +1 -0
  120. package/src/assets/web-panel/assets/{index-DjY-3sMA.js → index-DZiSMYoD.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-DV6NrfJx.js → index-DZjGcIGU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-ktN-K1Tf.js → index-Dea32nOK.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DjcR-CwS.js → index-Djd7uqwM.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CuOx4Pbe.js → index-Dntid6oj.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BW3nWiu0.js → index-DqZU4_7J.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-C4Mqhmas.js → index-DuvweiCz.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CRqz8TtI.js → index-DzExCCLS.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D5na0B7G.js → index-LKT-Ol0A.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-_-wGLtAg.js → index-akwXS-FF.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CgMKElUh.js → index-b-rQCMkx.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DUlubR4l.js → index-eHbr3f5I.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D88-8bsB.js → index-kx6zDWew.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DuAvYTmY.js → index-rRuCGdKW.js} +1 -1
  134. package/src/assets/web-panel/assets/index-sbwcUeRS.js +1 -0
  135. package/src/assets/web-panel/assets/{initDefaultProps-KV3V-PNH.js → initDefaultProps-a8411LiK.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-PFGQg7_X.js → motion-oVcQdpCm.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Dnl79wq4.js → move-B-eyzzzL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-Bwl5JH9V.js → mtc-parser-BCYIxuG7.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-DCcTtM1l.js → omit-DuFtWiYh.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Cl6BjjDf.js → pickAttrs-CVAoJhGu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-fdqhyo42.js → placementArrow-Y2iub2bO.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DYQpmcDW.js → responsiveObserve-BHenWIVD.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-C4l-VfO4.js → slide-CKrMaL29.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DYDw_dyZ.js → statusUtils-w8eb_1da.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BEsubSMu.js → styleChecker-CCVi_Ww3.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-Cj82ggQ_.js → useFlexGapSupport-BsmR_q0r.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-B7L1eJ0V.js → useFs-a8GMBjnc.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-DVlJVD4d.js → usePersonalDataHub-BMUYSPn-.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-BBAbRN_Y.js → vnode-DL2pI31V.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BYn48q-I.js → zoom-Cbi8fISi.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +33 -7
  153. package/src/lib/dependency-install-policy.js +1 -1
  154. package/src/lib/evolution/browser-download-action-authority.js +747 -0
  155. package/src/lib/evolution/browser-download-artifact-disposal-authority.js +436 -0
  156. package/src/lib/evolution/browser-filesystem-quarantine-custody.js +2453 -0
  157. package/src/lib/evolution/browser-filesystem-quarantine-disposal.js +36 -0
  158. package/src/lib/evolution/browser-keyboard-action-authority.js +560 -0
  159. package/src/lib/evolution/browser-navigation-action-authority.js +546 -0
  160. package/src/lib/evolution/browser-quarantine-lock-maintenance-authority.js +573 -0
  161. package/src/lib/evolution/browser-quarantine-operator-revocation-authority.js +442 -0
  162. package/src/lib/evolution/browser-quarantine-retention-authority.js +503 -0
  163. package/src/lib/evolution/browser-quarantine-retention-scheduler.js +207 -0
  164. package/src/lib/evolution/browser-quarantined-download-executor.js +525 -0
  165. package/src/lib/evolution/browser-tab-open-action-authority.js +491 -0
  166. package/src/lib/evolution/browser-vision-action-authority.js +444 -0
  167. package/src/lib/evolution/browser-vision-observation-authority.js +304 -0
  168. package/src/lib/evolution/evolution-deployment-loader.js +241 -1
  169. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +5 -0
  170. package/src/lib/evolution/evolution-eval-gate.js +2 -1
  171. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +71 -9
  172. package/src/lib/evolution/evolution-eval-process-supervisor.js +276 -9
  173. package/src/lib/evolution/evolution-workbench-metrics.js +81 -21
  174. package/src/lib/evolution/pm-exploration-benchmark.js +747 -0
  175. package/src/lib/evolution/pm-exploration-budget-executor.js +106 -9
  176. package/src/lib/evolution/pm-exploration-egress-authority.js +382 -0
  177. package/src/lib/evolution/pm-exploration-evidence-bundle.js +149 -44
  178. package/src/lib/evolution/pm-exploration-execution-host.js +1254 -8
  179. package/src/lib/evolution/pm-exploration-process-grader.js +458 -0
  180. package/src/lib/evolution/pm-exploration-process-reviewer.js +456 -0
  181. package/src/lib/evolution/pm-exploration-process-runner.js +500 -0
  182. package/src/lib/evolution/pm-exploration-receipts.js +211 -11
  183. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +465 -46
  184. package/src/lib/evolution/pm-exploration-transition-committer.js +185 -34
  185. package/src/lib/evolution/skill-outcome-index-authority.js +7 -3
  186. package/src/lib/evolution/skill-writer-inventory-manifest.js +0 -39
  187. package/src/lib/evolution/volcengine-function-execution-authority.js +2949 -0
  188. package/src/lib/evolution/volcengine-function-process-executor.js +615 -0
  189. package/src/lib/evolution/volcengine-function-replay-store.js +836 -0
  190. package/src/lib/evolution/volcengine-function-revocation-status-floor-store.js +480 -0
  191. package/src/lib/governance-coverage.js +1 -1
  192. package/src/lib/headless-manifest.js +1 -1
  193. package/src/lib/protocol-replay.js +1 -1
  194. package/src/lib/skill-outcome-transcript-authority.js +45 -5
  195. package/src/runtime/agent-core.js +17 -0
  196. package/src/assets/web-panel/assets/ChatBubbleRenderer-Cf3LLgDc.js +0 -1
  197. package/src/assets/web-panel/assets/MarkdownRenderer-CTsYo9NN.js +0 -1
  198. package/src/assets/web-panel/assets/devWarning-D60SbiD-.js +0 -1
  199. package/src/assets/web-panel/assets/index-C0yR4_7h.js +0 -1
  200. package/src/assets/web-panel/assets/index-D4xuvo03.js +0 -1
@@ -10,6 +10,12 @@ import {
10
10
  verifyPmExplorationPlan,
11
11
  } from "./pm-exploration-rounds.js";
12
12
  import { executePmExplorationBudgetedOperation } from "./pm-exploration-budget-executor.js";
13
+ import {
14
+ inspectPmExplorationEgressAuthority,
15
+ invokePmExplorationModelEgress,
16
+ PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA,
17
+ retrievePmExplorationMemory,
18
+ } from "./pm-exploration-egress-authority.js";
13
19
  import {
14
20
  getPmExplorationReceiptSignerAuthority,
15
21
  inspectPmExplorationReceiptAuthority,
@@ -17,9 +23,40 @@ import {
17
23
  verifyPmExplorationReceipt,
18
24
  } from "./pm-exploration-receipts.js";
19
25
  import { verifyPmExplorationVolcengineSettlementRecord } from "./pm-exploration-volcengine-provider.js";
26
+ import {
27
+ createPmExplorationProcessGraderExecutor,
28
+ inspectPmExplorationProcessGraderExecutor,
29
+ invokePmExplorationProcessGrader,
30
+ PM_EXPLORATION_GRADER_ISOLATION_SCHEMA,
31
+ } from "./pm-exploration-process-grader.js";
32
+ import {
33
+ createPmExplorationProcessRunnerExecutor,
34
+ inspectPmExplorationProcessRunnerExecutor,
35
+ invokePmExplorationProcessRunner,
36
+ PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA,
37
+ PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2,
38
+ } from "./pm-exploration-process-runner.js";
39
+ import {
40
+ createPmExplorationProcessReviewerExecutor,
41
+ inspectPmExplorationProcessReviewerExecutor,
42
+ invokePmExplorationProcessReviewer,
43
+ PM_EXPLORATION_CURRICULUM_ISOLATION_SCHEMA,
44
+ PM_EXPLORATION_EVALUATOR_ISOLATION_SCHEMA,
45
+ PM_EXPLORATION_MERGER_ISOLATION_SCHEMA,
46
+ } from "./pm-exploration-process-reviewer.js";
20
47
 
21
- export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA =
48
+ export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2 =
22
49
  "chainlesschain.pm-exploration-execution-manifest/v2";
50
+ export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3 =
51
+ "chainlesschain.pm-exploration-execution-manifest/v3";
52
+ export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4 =
53
+ "chainlesschain.pm-exploration-execution-manifest/v4";
54
+ export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5 =
55
+ "chainlesschain.pm-exploration-execution-manifest/v5";
56
+ export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6 =
57
+ "chainlesschain.pm-exploration-execution-manifest/v6";
58
+ export const PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA =
59
+ "chainlesschain.pm-exploration-execution-manifest/v7";
23
60
  export const PM_EXPLORATION_RUN_REQUEST_SCHEMA =
24
61
  "chainlesschain.pm-exploration-run-request/v1";
25
62
  export const PM_EXPLORATION_GRADE_REQUEST_SCHEMA_V1 =
@@ -36,6 +73,10 @@ export const PM_EXPLORATION_MERGE_REQUEST_SCHEMA =
36
73
  "chainlesschain.pm-exploration-merge-request/v1";
37
74
  export const PM_EXPLORATION_EVALUATION_REQUEST_SCHEMA =
38
75
  "chainlesschain.pm-exploration-evaluation-request/v1";
76
+ export const PM_EXPLORATION_TASK_SELECTION_REQUEST_SCHEMA =
77
+ "chainlesschain.pm-exploration-task-selection-request/v1";
78
+ export const PM_EXPLORATION_TASK_SELECTION_RESULT_SCHEMA =
79
+ "chainlesschain.pm-exploration-task-selection-result/v1";
39
80
 
40
81
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
41
82
  const ID = /^[a-z][a-z0-9]*(?:[._:-][a-z0-9]+)*$/u;
@@ -43,6 +84,7 @@ const RUNNERS = new WeakMap();
43
84
  const GRADERS = new WeakMap();
44
85
  const MERGERS = new WeakMap();
45
86
  const EVALUATORS = new WeakMap();
87
+ const CURRICULA = new WeakMap();
46
88
  const HOSTS = new WeakMap();
47
89
 
48
90
  function canonical(value) {
@@ -144,6 +186,235 @@ function authorityDescriptor(value, expectedRole, label) {
144
186
  });
145
187
  }
146
188
 
189
+ function graderIsolationDescriptor(value) {
190
+ exact(
191
+ value,
192
+ [
193
+ "schema",
194
+ "mode",
195
+ "targetDigest",
196
+ "targetAuthorityDigest",
197
+ "handlerId",
198
+ "handlerRevision",
199
+ "operation",
200
+ "handlerArtifactDigest",
201
+ "supervisorAuthorityDigest",
202
+ "maxWallClockMs",
203
+ ],
204
+ "graderIsolation",
205
+ );
206
+ if (
207
+ value.schema !== PM_EXPLORATION_GRADER_ISOLATION_SCHEMA ||
208
+ value.mode !== "process" ||
209
+ value.operation !== "pm-exploration-grade"
210
+ ) {
211
+ throw new TypeError("graderIsolation descriptor is invalid");
212
+ }
213
+ return deepFreeze({
214
+ schema: value.schema,
215
+ mode: value.mode,
216
+ targetDigest: digest(value.targetDigest, "graderIsolation.targetDigest"),
217
+ targetAuthorityDigest: digest(
218
+ value.targetAuthorityDigest,
219
+ "graderIsolation.targetAuthorityDigest",
220
+ ),
221
+ handlerId: identifier(value.handlerId, "graderIsolation.handlerId"),
222
+ handlerRevision: identifier(
223
+ value.handlerRevision,
224
+ "graderIsolation.handlerRevision",
225
+ ),
226
+ operation: value.operation,
227
+ handlerArtifactDigest: digest(
228
+ value.handlerArtifactDigest,
229
+ "graderIsolation.handlerArtifactDigest",
230
+ ),
231
+ supervisorAuthorityDigest: digest(
232
+ value.supervisorAuthorityDigest,
233
+ "graderIsolation.supervisorAuthorityDigest",
234
+ ),
235
+ maxWallClockMs: integer(
236
+ value.maxWallClockMs,
237
+ "graderIsolation.maxWallClockMs",
238
+ 1,
239
+ 600_000,
240
+ ),
241
+ });
242
+ }
243
+
244
+ function runnerIsolationDescriptor(value) {
245
+ exact(
246
+ value,
247
+ [
248
+ "schema",
249
+ "mode",
250
+ "brokerMode",
251
+ "targetDigest",
252
+ "targetAuthorityDigest",
253
+ "handlerId",
254
+ "handlerRevision",
255
+ "operation",
256
+ "handlerArtifactDigest",
257
+ "supervisorAuthorityDigest",
258
+ "maxWallClockMs",
259
+ ],
260
+ "runnerIsolation",
261
+ );
262
+ if (
263
+ ![
264
+ PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA,
265
+ PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2,
266
+ ].includes(value.schema) ||
267
+ value.mode !== "process" ||
268
+ (value.schema === PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA
269
+ ? value.brokerMode !== "parent-budgeted-tools"
270
+ : value.brokerMode !== "parent-budgeted-tools-memory-model") ||
271
+ value.operation !== "pm-exploration-run"
272
+ ) {
273
+ throw new TypeError("runnerIsolation descriptor is invalid");
274
+ }
275
+ return deepFreeze({
276
+ schema: value.schema,
277
+ mode: value.mode,
278
+ brokerMode: value.brokerMode,
279
+ targetDigest: digest(value.targetDigest, "runnerIsolation.targetDigest"),
280
+ targetAuthorityDigest: digest(
281
+ value.targetAuthorityDigest,
282
+ "runnerIsolation.targetAuthorityDigest",
283
+ ),
284
+ handlerId: identifier(value.handlerId, "runnerIsolation.handlerId"),
285
+ handlerRevision: identifier(
286
+ value.handlerRevision,
287
+ "runnerIsolation.handlerRevision",
288
+ ),
289
+ operation: value.operation,
290
+ handlerArtifactDigest: digest(
291
+ value.handlerArtifactDigest,
292
+ "runnerIsolation.handlerArtifactDigest",
293
+ ),
294
+ supervisorAuthorityDigest: digest(
295
+ value.supervisorAuthorityDigest,
296
+ "runnerIsolation.supervisorAuthorityDigest",
297
+ ),
298
+ maxWallClockMs: integer(
299
+ value.maxWallClockMs,
300
+ "runnerIsolation.maxWallClockMs",
301
+ 1,
302
+ 600_000,
303
+ ),
304
+ });
305
+ }
306
+
307
+ function egressAuthorityDescriptor(value, kind, label) {
308
+ exact(
309
+ value,
310
+ [
311
+ "schema",
312
+ "kind",
313
+ "authorityId",
314
+ "revision",
315
+ "handlerArtifactDigest",
316
+ "policyDigest",
317
+ "authorityDigest",
318
+ ],
319
+ label,
320
+ );
321
+ if (
322
+ value.schema !== PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA ||
323
+ value.kind !== kind
324
+ ) {
325
+ throw new TypeError(`${label} descriptor is invalid`);
326
+ }
327
+ const core = deepFreeze({
328
+ schema: value.schema,
329
+ kind: value.kind,
330
+ authorityId: identifier(value.authorityId, `${label}.authorityId`),
331
+ revision: integer(value.revision, `${label}.revision`, 1),
332
+ handlerArtifactDigest: digest(
333
+ value.handlerArtifactDigest,
334
+ `${label}.handlerArtifactDigest`,
335
+ ),
336
+ policyDigest: digest(value.policyDigest, `${label}.policyDigest`),
337
+ });
338
+ const normalized = deepFreeze({
339
+ ...core,
340
+ authorityDigest: hash(PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA, core),
341
+ });
342
+ if (normalized.authorityDigest !== value.authorityDigest)
343
+ throw new Error(`${label} authority digest mismatch`);
344
+ return normalized;
345
+ }
346
+
347
+ function reviewerIsolationDescriptor(value, kind) {
348
+ const label = `${kind}Isolation`;
349
+ const expected =
350
+ kind === "merger"
351
+ ? {
352
+ operation: "pm-exploration-merge",
353
+ schema: PM_EXPLORATION_MERGER_ISOLATION_SCHEMA,
354
+ }
355
+ : kind === "evaluator"
356
+ ? {
357
+ operation: "pm-exploration-evaluate",
358
+ schema: PM_EXPLORATION_EVALUATOR_ISOLATION_SCHEMA,
359
+ }
360
+ : {
361
+ operation: "pm-exploration-select-task",
362
+ schema: PM_EXPLORATION_CURRICULUM_ISOLATION_SCHEMA,
363
+ };
364
+ exact(
365
+ value,
366
+ [
367
+ "schema",
368
+ "mode",
369
+ "targetDigest",
370
+ "targetAuthorityDigest",
371
+ "handlerId",
372
+ "handlerRevision",
373
+ "operation",
374
+ "handlerArtifactDigest",
375
+ "supervisorAuthorityDigest",
376
+ "maxWallClockMs",
377
+ ],
378
+ label,
379
+ );
380
+ if (
381
+ value.schema !== expected.schema ||
382
+ value.mode !== "process" ||
383
+ value.operation !== expected.operation
384
+ ) {
385
+ throw new TypeError(`${label} descriptor is invalid`);
386
+ }
387
+ return deepFreeze({
388
+ schema: value.schema,
389
+ mode: value.mode,
390
+ targetDigest: digest(value.targetDigest, `${label}.targetDigest`),
391
+ targetAuthorityDigest: digest(
392
+ value.targetAuthorityDigest,
393
+ `${label}.targetAuthorityDigest`,
394
+ ),
395
+ handlerId: identifier(value.handlerId, `${label}.handlerId`),
396
+ handlerRevision: identifier(
397
+ value.handlerRevision,
398
+ `${label}.handlerRevision`,
399
+ ),
400
+ operation: value.operation,
401
+ handlerArtifactDigest: digest(
402
+ value.handlerArtifactDigest,
403
+ `${label}.handlerArtifactDigest`,
404
+ ),
405
+ supervisorAuthorityDigest: digest(
406
+ value.supervisorAuthorityDigest,
407
+ `${label}.supervisorAuthorityDigest`,
408
+ ),
409
+ maxWallClockMs: integer(
410
+ value.maxWallClockMs,
411
+ `${label}.maxWallClockMs`,
412
+ 1,
413
+ 600_000,
414
+ ),
415
+ });
416
+ }
417
+
147
418
  function toolIds(value) {
148
419
  if (
149
420
  !Array.isArray(value) ||
@@ -165,12 +436,51 @@ function toolIds(value) {
165
436
  }
166
437
 
167
438
  export function createPmExplorationExecutionManifest(input = {}) {
439
+ if (
440
+ !input ||
441
+ typeof input !== "object" ||
442
+ Array.isArray(input) ||
443
+ isProxy(input) ||
444
+ Object.getPrototypeOf(input) !== Object.prototype
445
+ ) {
446
+ throw new TypeError(
447
+ "PM exploration execution manifest must be a plain object",
448
+ );
449
+ }
450
+ const hasRunnerIsolation = Reflect.ownKeys(input).includes("runnerIsolation");
451
+ const hasGraderIsolation = Reflect.ownKeys(input).includes("graderIsolation");
452
+ const hasMergerIsolation = Reflect.ownKeys(input).includes("mergerIsolation");
453
+ const hasEvaluatorIsolation =
454
+ Reflect.ownKeys(input).includes("evaluatorIsolation");
455
+ const hasCurriculum = Reflect.ownKeys(input).includes("curriculum");
456
+ const hasCurriculumIsolation = Reflect.ownKeys(input).includes(
457
+ "curriculumIsolation",
458
+ );
459
+ const hasMemoryRetrieval = Reflect.ownKeys(input).includes("memoryRetrieval");
460
+ const hasModelEgress = Reflect.ownKeys(input).includes("modelEgress");
461
+ if (hasCurriculum !== hasCurriculumIsolation)
462
+ throw new TypeError(
463
+ "curriculum authority and isolation must be declared together",
464
+ );
465
+ if (hasMemoryRetrieval !== hasModelEgress)
466
+ throw new TypeError(
467
+ "memory retrieval and model egress authorities must be declared together",
468
+ );
469
+ const isolationFields = [
470
+ ...(hasRunnerIsolation ? ["runnerIsolation"] : []),
471
+ ...(hasGraderIsolation ? ["graderIsolation"] : []),
472
+ ...(hasMergerIsolation ? ["mergerIsolation"] : []),
473
+ ...(hasEvaluatorIsolation ? ["evaluatorIsolation"] : []),
474
+ ];
168
475
  exact(
169
476
  input,
170
477
  [
171
478
  "planDigest",
172
479
  "environmentDigest",
480
+ ...(hasCurriculum ? ["curriculum", "curriculumIsolation"] : []),
481
+ ...(hasMemoryRetrieval ? ["memoryRetrieval", "modelEgress"] : []),
173
482
  "runner",
483
+ ...isolationFields,
174
484
  "grader",
175
485
  "merger",
176
486
  "evaluator",
@@ -180,19 +490,85 @@ export function createPmExplorationExecutionManifest(input = {}) {
180
490
  ],
181
491
  "PM exploration execution manifest",
182
492
  );
493
+ const schema = hasMemoryRetrieval
494
+ ? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA
495
+ : hasCurriculum
496
+ ? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6
497
+ : hasMergerIsolation || hasEvaluatorIsolation
498
+ ? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5
499
+ : hasRunnerIsolation
500
+ ? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4
501
+ : hasGraderIsolation
502
+ ? PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3
503
+ : PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2;
183
504
  const core = deepFreeze({
184
- schema: PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA,
505
+ schema,
185
506
  planDigest: digest(input.planDigest, "planDigest"),
186
507
  environmentDigest: digest(input.environmentDigest, "environmentDigest"),
508
+ ...(hasCurriculum
509
+ ? {
510
+ curriculum: authorityDescriptor(
511
+ input.curriculum,
512
+ "curriculum",
513
+ "curriculum",
514
+ ),
515
+ curriculumIsolation: reviewerIsolationDescriptor(
516
+ input.curriculumIsolation,
517
+ "curriculum",
518
+ ),
519
+ }
520
+ : {}),
521
+ ...(hasMemoryRetrieval
522
+ ? {
523
+ memoryRetrieval: egressAuthorityDescriptor(
524
+ input.memoryRetrieval,
525
+ "memory-retrieval",
526
+ "memoryRetrieval",
527
+ ),
528
+ modelEgress: egressAuthorityDescriptor(
529
+ input.modelEgress,
530
+ "model-egress",
531
+ "modelEgress",
532
+ ),
533
+ }
534
+ : {}),
187
535
  runner: authorityDescriptor(input.runner, "execution", "runner"),
536
+ ...(hasRunnerIsolation
537
+ ? { runnerIsolation: runnerIsolationDescriptor(input.runnerIsolation) }
538
+ : {}),
188
539
  grader: authorityDescriptor(input.grader, "grader", "grader"),
540
+ ...(hasGraderIsolation
541
+ ? { graderIsolation: graderIsolationDescriptor(input.graderIsolation) }
542
+ : {}),
189
543
  merger: authorityDescriptor(input.merger, "merge", "merger"),
544
+ ...(hasMergerIsolation
545
+ ? {
546
+ mergerIsolation: reviewerIsolationDescriptor(
547
+ input.mergerIsolation,
548
+ "merger",
549
+ ),
550
+ }
551
+ : {}),
190
552
  evaluator: authorityDescriptor(input.evaluator, "evaluator", "evaluator"),
553
+ ...(hasEvaluatorIsolation
554
+ ? {
555
+ evaluatorIsolation: reviewerIsolationDescriptor(
556
+ input.evaluatorIsolation,
557
+ "evaluator",
558
+ ),
559
+ }
560
+ : {}),
191
561
  toolIds: toolIds(input.toolIds),
192
562
  toolPolicyDigest: digest(input.toolPolicyDigest, "toolPolicyDigest"),
193
563
  preRunSealDigest: digest(input.preRunSealDigest, "preRunSealDigest"),
194
564
  });
195
- const authorities = [core.runner, core.grader, core.merger, core.evaluator];
565
+ const authorities = [
566
+ ...(hasCurriculum ? [core.curriculum] : []),
567
+ core.runner,
568
+ core.grader,
569
+ core.merger,
570
+ core.evaluator,
571
+ ];
196
572
  if (
197
573
  new Set(authorities.map((entry) => entry.authorityId)).size !==
198
574
  authorities.length ||
@@ -200,20 +576,123 @@ export function createPmExplorationExecutionManifest(input = {}) {
200
576
  authorities.length
201
577
  )
202
578
  throw new TypeError("PM receipt roles must use independent authorities");
579
+ if (
580
+ hasMemoryRetrieval &&
581
+ (core.memoryRetrieval.authorityId === core.modelEgress.authorityId ||
582
+ core.memoryRetrieval.handlerArtifactDigest ===
583
+ core.modelEgress.handlerArtifactDigest ||
584
+ authorities.some(
585
+ (entry) =>
586
+ entry.authorityId === core.memoryRetrieval.authorityId ||
587
+ entry.authorityId === core.modelEgress.authorityId,
588
+ ))
589
+ ) {
590
+ throw new TypeError(
591
+ "PM egress and receipt roles must use independent authorities",
592
+ );
593
+ }
594
+ if (
595
+ hasMemoryRetrieval !==
596
+ (core.runnerIsolation?.schema === PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2)
597
+ ) {
598
+ throw new TypeError(
599
+ "governed PM egress and its brokered process runner must be paired",
600
+ );
601
+ }
203
602
  return deepFreeze({
204
603
  ...core,
205
- manifestDigest: hash(PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA, core),
604
+ manifestDigest: hash(schema, core),
206
605
  });
207
606
  }
208
607
 
209
608
  export function verifyPmExplorationExecutionManifest(value) {
609
+ if (
610
+ !value ||
611
+ typeof value !== "object" ||
612
+ Array.isArray(value) ||
613
+ isProxy(value) ||
614
+ Object.getPrototypeOf(value) !== Object.prototype
615
+ ) {
616
+ throw new TypeError(
617
+ "PM exploration execution manifest envelope must be a plain object",
618
+ );
619
+ }
620
+ const hasRunnerIsolation = Reflect.ownKeys(value).includes("runnerIsolation");
621
+ const hasGraderIsolation = Reflect.ownKeys(value).includes("graderIsolation");
622
+ const hasMergerIsolation = Reflect.ownKeys(value).includes("mergerIsolation");
623
+ const hasEvaluatorIsolation =
624
+ Reflect.ownKeys(value).includes("evaluatorIsolation");
625
+ const hasCurriculum = Reflect.ownKeys(value).includes("curriculum");
626
+ const hasCurriculumIsolation = Reflect.ownKeys(value).includes(
627
+ "curriculumIsolation",
628
+ );
629
+ const hasMemoryRetrieval = Reflect.ownKeys(value).includes("memoryRetrieval");
630
+ const hasModelEgress = Reflect.ownKeys(value).includes("modelEgress");
631
+ if (
632
+ hasCurriculum !== hasCurriculumIsolation ||
633
+ hasMemoryRetrieval !== hasModelEgress
634
+ ) {
635
+ throw new TypeError("PM exploration manifest authority pairing is invalid");
636
+ }
637
+ if (
638
+ (value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2 &&
639
+ (hasRunnerIsolation ||
640
+ hasGraderIsolation ||
641
+ hasMergerIsolation ||
642
+ hasEvaluatorIsolation ||
643
+ hasCurriculum ||
644
+ hasCurriculumIsolation ||
645
+ hasMemoryRetrieval ||
646
+ hasModelEgress)) ||
647
+ (value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3 &&
648
+ (hasRunnerIsolation ||
649
+ !hasGraderIsolation ||
650
+ hasMergerIsolation ||
651
+ hasEvaluatorIsolation ||
652
+ hasCurriculum ||
653
+ hasCurriculumIsolation ||
654
+ hasMemoryRetrieval ||
655
+ hasModelEgress)) ||
656
+ (value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4 &&
657
+ (!hasRunnerIsolation ||
658
+ hasMergerIsolation ||
659
+ hasEvaluatorIsolation ||
660
+ hasCurriculum ||
661
+ hasCurriculumIsolation ||
662
+ hasMemoryRetrieval ||
663
+ hasModelEgress)) ||
664
+ (value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5 &&
665
+ (hasCurriculum ||
666
+ hasCurriculumIsolation ||
667
+ hasMemoryRetrieval ||
668
+ hasModelEgress ||
669
+ (!hasMergerIsolation && !hasEvaluatorIsolation))) ||
670
+ (value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6 &&
671
+ (!hasCurriculum ||
672
+ !hasCurriculumIsolation ||
673
+ hasMemoryRetrieval ||
674
+ hasModelEgress)) ||
675
+ (value.schema === PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA &&
676
+ (!hasMemoryRetrieval || !hasModelEgress))
677
+ ) {
678
+ throw new TypeError("PM exploration manifest isolation schema is invalid");
679
+ }
680
+ const isolationFields = [
681
+ ...(hasRunnerIsolation ? ["runnerIsolation"] : []),
682
+ ...(hasGraderIsolation ? ["graderIsolation"] : []),
683
+ ...(hasMergerIsolation ? ["mergerIsolation"] : []),
684
+ ...(hasEvaluatorIsolation ? ["evaluatorIsolation"] : []),
685
+ ];
210
686
  exact(
211
687
  value,
212
688
  [
213
689
  "schema",
214
690
  "planDigest",
215
691
  "environmentDigest",
692
+ ...(hasCurriculum ? ["curriculum", "curriculumIsolation"] : []),
693
+ ...(hasMemoryRetrieval ? ["memoryRetrieval", "modelEgress"] : []),
216
694
  "runner",
695
+ ...isolationFields,
217
696
  "grader",
218
697
  "merger",
219
698
  "evaluator",
@@ -224,15 +703,40 @@ export function verifyPmExplorationExecutionManifest(value) {
224
703
  ],
225
704
  "PM exploration execution manifest envelope",
226
705
  );
227
- if (value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA)
706
+ if (
707
+ value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA &&
708
+ value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V6 &&
709
+ value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V5 &&
710
+ value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V4 &&
711
+ value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V3 &&
712
+ value.schema !== PM_EXPLORATION_EXECUTION_MANIFEST_SCHEMA_V2
713
+ )
228
714
  throw new TypeError("PM exploration execution manifest schema is invalid");
229
715
  const normalized = createPmExplorationExecutionManifest({
230
716
  planDigest: value.planDigest,
231
717
  environmentDigest: value.environmentDigest,
718
+ ...(hasCurriculum
719
+ ? {
720
+ curriculum: value.curriculum,
721
+ curriculumIsolation: value.curriculumIsolation,
722
+ }
723
+ : {}),
724
+ ...(hasMemoryRetrieval
725
+ ? {
726
+ memoryRetrieval: value.memoryRetrieval,
727
+ modelEgress: value.modelEgress,
728
+ }
729
+ : {}),
232
730
  runner: value.runner,
731
+ ...(hasRunnerIsolation ? { runnerIsolation: value.runnerIsolation } : {}),
233
732
  grader: value.grader,
733
+ ...(hasGraderIsolation ? { graderIsolation: value.graderIsolation } : {}),
234
734
  merger: value.merger,
735
+ ...(hasMergerIsolation ? { mergerIsolation: value.mergerIsolation } : {}),
235
736
  evaluator: value.evaluator,
737
+ ...(hasEvaluatorIsolation
738
+ ? { evaluatorIsolation: value.evaluatorIsolation }
739
+ : {}),
236
740
  toolIds: value.toolIds,
237
741
  toolPolicyDigest: value.toolPolicyDigest,
238
742
  preRunSealDigest: value.preRunSealDigest,
@@ -246,6 +750,9 @@ function createProvider({
246
750
  signer,
247
751
  handler,
248
752
  prepare = null,
753
+ isolation = null,
754
+ consumeIsolationEvidence = null,
755
+ consumeEgressEvidence = null,
249
756
  expectedRole,
250
757
  bindings,
251
758
  label,
@@ -254,14 +761,31 @@ function createProvider({
254
761
  throw new TypeError(`${label} handler must be a direct function`);
255
762
  if (prepare !== null && (typeof prepare !== "function" || isProxy(prepare)))
256
763
  throw new TypeError(`${label} prepare hook must be a direct function`);
764
+ if (
765
+ consumeIsolationEvidence !== null &&
766
+ (typeof consumeIsolationEvidence !== "function" ||
767
+ isProxy(consumeIsolationEvidence))
768
+ ) {
769
+ throw new TypeError(`${label} isolation evidence port must be direct`);
770
+ }
771
+ if (
772
+ consumeEgressEvidence !== null &&
773
+ (typeof consumeEgressEvidence !== "function" ||
774
+ isProxy(consumeEgressEvidence))
775
+ ) {
776
+ throw new TypeError(`${label} egress evidence port must be direct`);
777
+ }
257
778
  const descriptor = inspectPmExplorationReceiptAuthority(signer);
258
779
  if (descriptor.role !== expectedRole)
259
780
  throw new TypeError(`${label} signer has the wrong receipt role`);
260
781
  const provider = Object.freeze({});
261
782
  bindings.set(provider, {
262
783
  authority: getPmExplorationReceiptSignerAuthority(signer),
784
+ consumeEgressEvidence,
785
+ consumeIsolationEvidence,
263
786
  descriptor,
264
787
  handler,
788
+ isolation,
265
789
  prepare,
266
790
  issue: (payload) => issuePmExplorationReceipt(signer, payload),
267
791
  });
@@ -279,6 +803,83 @@ export function createPmExplorationRunner(options = {}) {
279
803
  });
280
804
  }
281
805
 
806
+ export function createPmExplorationProcessRunner(options = {}) {
807
+ if (
808
+ !options ||
809
+ typeof options !== "object" ||
810
+ Array.isArray(options) ||
811
+ isProxy(options) ||
812
+ Object.getPrototypeOf(options) !== Object.prototype
813
+ ) {
814
+ throw new TypeError(
815
+ "PM exploration process runner options must be a plain object",
816
+ );
817
+ }
818
+ const hasNow = Reflect.ownKeys(options).includes("now");
819
+ const hasEgressBrokered = Reflect.ownKeys(options).includes("egressBrokered");
820
+ exact(
821
+ options,
822
+ [
823
+ "signer",
824
+ "supervisor",
825
+ "target",
826
+ "maxWallClockMs",
827
+ ...(hasNow ? ["now"] : []),
828
+ ...(hasEgressBrokered ? ["egressBrokered"] : []),
829
+ ],
830
+ "PM exploration process runner options",
831
+ );
832
+ const executor = createPmExplorationProcessRunnerExecutor({
833
+ supervisor: options.supervisor,
834
+ target: options.target,
835
+ maxWallClockMs: options.maxWallClockMs,
836
+ ...(hasNow ? { now: options.now } : {}),
837
+ ...(hasEgressBrokered ? { egressBrokered: options.egressBrokered } : {}),
838
+ });
839
+ const evidence = new Map();
840
+ return createProvider({
841
+ signer: options.signer,
842
+ handler: async (request, runtime) => {
843
+ const result = await invokePmExplorationProcessRunner(
844
+ executor,
845
+ request,
846
+ runtime,
847
+ );
848
+ if (evidence.has(request.requestDigest))
849
+ throw new Error("process runner isolation evidence was replayed");
850
+ evidence.set(
851
+ request.requestDigest,
852
+ Object.freeze({
853
+ supervisionReceiptDigest: result.supervisionReceiptDigest,
854
+ egressEvidenceDigest: result.egressEvidenceDigest ?? null,
855
+ }),
856
+ );
857
+ return result.value;
858
+ },
859
+ isolation: inspectPmExplorationProcessRunnerExecutor(executor),
860
+ consumeIsolationEvidence: (requestDigest) => {
861
+ const value = evidence.get(requestDigest) ?? null;
862
+ if (value?.egressEvidenceDigest === null) evidence.delete(requestDigest);
863
+ return value?.supervisionReceiptDigest ?? null;
864
+ },
865
+ consumeEgressEvidence: (requestDigest) => {
866
+ const value = evidence.get(requestDigest)?.egressEvidenceDigest ?? null;
867
+ evidence.delete(requestDigest);
868
+ return value;
869
+ },
870
+ expectedRole: "execution",
871
+ bindings: RUNNERS,
872
+ label: "PM exploration process runner",
873
+ });
874
+ }
875
+
876
+ export function inspectPmExplorationRunnerIsolation(value) {
877
+ const runner = RUNNERS.get(value);
878
+ if (!runner)
879
+ throw new TypeError("a branded PM exploration runner is required");
880
+ return runner.isolation;
881
+ }
882
+
282
883
  export function createPmExplorationGrader(options = {}) {
283
884
  if (
284
885
  !options ||
@@ -305,6 +906,50 @@ export function createPmExplorationGrader(options = {}) {
305
906
  });
306
907
  }
307
908
 
909
+ export function createPmExplorationProcessGrader(options = {}) {
910
+ if (
911
+ !options ||
912
+ typeof options !== "object" ||
913
+ Array.isArray(options) ||
914
+ isProxy(options) ||
915
+ Object.getPrototypeOf(options) !== Object.prototype
916
+ ) {
917
+ throw new TypeError(
918
+ "PM exploration process grader options must be a plain object",
919
+ );
920
+ }
921
+ const hasNow = Reflect.ownKeys(options).includes("now");
922
+ exact(
923
+ options,
924
+ hasNow
925
+ ? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
926
+ : ["signer", "supervisor", "target", "maxWallClockMs"],
927
+ "PM exploration process grader options",
928
+ );
929
+ const executor = createPmExplorationProcessGraderExecutor({
930
+ supervisor: options.supervisor,
931
+ target: options.target,
932
+ maxWallClockMs: options.maxWallClockMs,
933
+ ...(hasNow ? { now: options.now } : {}),
934
+ });
935
+ return createProvider({
936
+ signer: options.signer,
937
+ handler: (request, runtime) =>
938
+ invokePmExplorationProcessGrader(executor, request, runtime),
939
+ isolation: inspectPmExplorationProcessGraderExecutor(executor),
940
+ expectedRole: "grader",
941
+ bindings: GRADERS,
942
+ label: "PM exploration process grader",
943
+ });
944
+ }
945
+
946
+ export function inspectPmExplorationGraderIsolation(value) {
947
+ const grader = GRADERS.get(value);
948
+ if (!grader)
949
+ throw new TypeError("a branded PM exploration grader is required");
950
+ return grader.isolation;
951
+ }
952
+
308
953
  export function createPmExplorationMerger(options = {}) {
309
954
  exact(options, ["signer", "merge"], "PM exploration merger options");
310
955
  return createProvider({
@@ -316,6 +961,66 @@ export function createPmExplorationMerger(options = {}) {
316
961
  });
317
962
  }
318
963
 
964
+ export function createPmExplorationProcessMerger(options = {}) {
965
+ if (
966
+ !options ||
967
+ typeof options !== "object" ||
968
+ Array.isArray(options) ||
969
+ isProxy(options) ||
970
+ Object.getPrototypeOf(options) !== Object.prototype
971
+ ) {
972
+ throw new TypeError(
973
+ "PM exploration process merger options must be a plain object",
974
+ );
975
+ }
976
+ const hasNow = Reflect.ownKeys(options).includes("now");
977
+ exact(
978
+ options,
979
+ hasNow
980
+ ? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
981
+ : ["signer", "supervisor", "target", "maxWallClockMs"],
982
+ "PM exploration process merger options",
983
+ );
984
+ const executor = createPmExplorationProcessReviewerExecutor({
985
+ kind: "merge",
986
+ supervisor: options.supervisor,
987
+ target: options.target,
988
+ maxWallClockMs: options.maxWallClockMs,
989
+ ...(hasNow ? { now: options.now } : {}),
990
+ });
991
+ const evidence = new Map();
992
+ return createProvider({
993
+ signer: options.signer,
994
+ handler: async (request, runtime) => {
995
+ const result = await invokePmExplorationProcessReviewer(
996
+ executor,
997
+ request,
998
+ runtime,
999
+ );
1000
+ if (evidence.has(request.requestDigest))
1001
+ throw new Error("process merger isolation evidence was replayed");
1002
+ evidence.set(request.requestDigest, result.supervisionReceiptDigest);
1003
+ return result.value;
1004
+ },
1005
+ isolation: inspectPmExplorationProcessReviewerExecutor(executor),
1006
+ consumeIsolationEvidence: (requestDigest) => {
1007
+ const value = evidence.get(requestDigest) ?? null;
1008
+ evidence.delete(requestDigest);
1009
+ return value;
1010
+ },
1011
+ expectedRole: "merge",
1012
+ bindings: MERGERS,
1013
+ label: "PM exploration process merger",
1014
+ });
1015
+ }
1016
+
1017
+ export function inspectPmExplorationMergerIsolation(value) {
1018
+ const merger = MERGERS.get(value);
1019
+ if (!merger)
1020
+ throw new TypeError("a branded PM exploration merger is required");
1021
+ return merger.isolation;
1022
+ }
1023
+
319
1024
  export function createPmExplorationEvaluator(options = {}) {
320
1025
  exact(options, ["signer", "evaluate"], "PM exploration evaluator options");
321
1026
  return createProvider({
@@ -327,17 +1032,155 @@ export function createPmExplorationEvaluator(options = {}) {
327
1032
  });
328
1033
  }
329
1034
 
1035
+ export function createPmExplorationProcessEvaluator(options = {}) {
1036
+ if (
1037
+ !options ||
1038
+ typeof options !== "object" ||
1039
+ Array.isArray(options) ||
1040
+ isProxy(options) ||
1041
+ Object.getPrototypeOf(options) !== Object.prototype
1042
+ ) {
1043
+ throw new TypeError(
1044
+ "PM exploration process evaluator options must be a plain object",
1045
+ );
1046
+ }
1047
+ const hasNow = Reflect.ownKeys(options).includes("now");
1048
+ exact(
1049
+ options,
1050
+ hasNow
1051
+ ? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
1052
+ : ["signer", "supervisor", "target", "maxWallClockMs"],
1053
+ "PM exploration process evaluator options",
1054
+ );
1055
+ const executor = createPmExplorationProcessReviewerExecutor({
1056
+ kind: "evaluate",
1057
+ supervisor: options.supervisor,
1058
+ target: options.target,
1059
+ maxWallClockMs: options.maxWallClockMs,
1060
+ ...(hasNow ? { now: options.now } : {}),
1061
+ });
1062
+ const evidence = new Map();
1063
+ return createProvider({
1064
+ signer: options.signer,
1065
+ handler: async (request, runtime) => {
1066
+ const result = await invokePmExplorationProcessReviewer(
1067
+ executor,
1068
+ request,
1069
+ runtime,
1070
+ );
1071
+ if (evidence.has(request.requestDigest))
1072
+ throw new Error("process evaluator isolation evidence was replayed");
1073
+ evidence.set(request.requestDigest, result.supervisionReceiptDigest);
1074
+ return result.value;
1075
+ },
1076
+ isolation: inspectPmExplorationProcessReviewerExecutor(executor),
1077
+ consumeIsolationEvidence: (requestDigest) => {
1078
+ const value = evidence.get(requestDigest) ?? null;
1079
+ evidence.delete(requestDigest);
1080
+ return value;
1081
+ },
1082
+ expectedRole: "evaluator",
1083
+ bindings: EVALUATORS,
1084
+ label: "PM exploration process evaluator",
1085
+ });
1086
+ }
1087
+
1088
+ export function inspectPmExplorationEvaluatorIsolation(value) {
1089
+ const evaluator = EVALUATORS.get(value);
1090
+ if (!evaluator)
1091
+ throw new TypeError("a branded PM exploration evaluator is required");
1092
+ return evaluator.isolation;
1093
+ }
1094
+
1095
+ export function createPmExplorationProcessCurriculum(options = {}) {
1096
+ if (
1097
+ !options ||
1098
+ typeof options !== "object" ||
1099
+ Array.isArray(options) ||
1100
+ isProxy(options) ||
1101
+ Object.getPrototypeOf(options) !== Object.prototype
1102
+ ) {
1103
+ throw new TypeError(
1104
+ "PM exploration process curriculum options must be a plain object",
1105
+ );
1106
+ }
1107
+ const hasNow = Reflect.ownKeys(options).includes("now");
1108
+ exact(
1109
+ options,
1110
+ hasNow
1111
+ ? ["signer", "supervisor", "target", "maxWallClockMs", "now"]
1112
+ : ["signer", "supervisor", "target", "maxWallClockMs"],
1113
+ "PM exploration process curriculum options",
1114
+ );
1115
+ const executor = createPmExplorationProcessReviewerExecutor({
1116
+ kind: "curriculum",
1117
+ supervisor: options.supervisor,
1118
+ target: options.target,
1119
+ maxWallClockMs: options.maxWallClockMs,
1120
+ ...(hasNow ? { now: options.now } : {}),
1121
+ });
1122
+ const evidence = new Map();
1123
+ return createProvider({
1124
+ signer: options.signer,
1125
+ handler: async (request, runtime) => {
1126
+ const result = await invokePmExplorationProcessReviewer(
1127
+ executor,
1128
+ request,
1129
+ runtime,
1130
+ );
1131
+ if (evidence.has(request.requestDigest))
1132
+ throw new Error("process curriculum isolation evidence was replayed");
1133
+ evidence.set(request.requestDigest, result.supervisionReceiptDigest);
1134
+ return result.value;
1135
+ },
1136
+ isolation: inspectPmExplorationProcessReviewerExecutor(executor),
1137
+ consumeIsolationEvidence: (requestDigest) => {
1138
+ const value = evidence.get(requestDigest) ?? null;
1139
+ evidence.delete(requestDigest);
1140
+ return value;
1141
+ },
1142
+ expectedRole: "curriculum",
1143
+ bindings: CURRICULA,
1144
+ label: "PM exploration process curriculum",
1145
+ });
1146
+ }
1147
+
1148
+ export function inspectPmExplorationCurriculumIsolation(value) {
1149
+ const curriculum = CURRICULA.get(value);
1150
+ if (!curriculum)
1151
+ throw new TypeError("a branded PM exploration curriculum is required");
1152
+ return curriculum.isolation;
1153
+ }
1154
+
330
1155
  function snapshotPlan(value) {
331
1156
  verifyPmExplorationPlan(value);
332
1157
  return deepFreeze(structuredClone(value));
333
1158
  }
334
1159
 
335
1160
  export function createPmExplorationExecutionHost(options = {}) {
1161
+ const hasCurriculum =
1162
+ options &&
1163
+ typeof options === "object" &&
1164
+ Reflect.ownKeys(options).includes("curriculum");
1165
+ const hasMemoryRetrieval =
1166
+ options &&
1167
+ typeof options === "object" &&
1168
+ Reflect.ownKeys(options).includes("memoryRetrieval");
1169
+ const hasModelEgress =
1170
+ options &&
1171
+ typeof options === "object" &&
1172
+ Reflect.ownKeys(options).includes("modelEgress");
1173
+ if (hasMemoryRetrieval !== hasModelEgress)
1174
+ throw new TypeError(
1175
+ "PM exploration host memory and model egress ports must be paired",
1176
+ );
336
1177
  exact(
337
1178
  options,
338
1179
  [
339
1180
  "plan",
340
1181
  "manifest",
1182
+ ...(hasCurriculum ? ["curriculum"] : []),
1183
+ ...(hasMemoryRetrieval ? ["memoryRetrieval", "modelEgress"] : []),
341
1184
  "runner",
342
1185
  "grader",
343
1186
  "merger",
@@ -349,18 +1192,44 @@ export function createPmExplorationExecutionHost(options = {}) {
349
1192
  );
350
1193
  const plan = snapshotPlan(options.plan);
351
1194
  const manifest = verifyPmExplorationExecutionManifest(options.manifest);
1195
+ const curriculum = hasCurriculum ? CURRICULA.get(options.curriculum) : null;
1196
+ const memoryRetrieval = hasMemoryRetrieval
1197
+ ? inspectPmExplorationEgressAuthority(options.memoryRetrieval)
1198
+ : null;
1199
+ const modelEgress = hasModelEgress
1200
+ ? inspectPmExplorationEgressAuthority(options.modelEgress)
1201
+ : null;
352
1202
  const runner = RUNNERS.get(options.runner);
353
1203
  const grader = GRADERS.get(options.grader);
354
1204
  const merger = MERGERS.get(options.merger);
355
1205
  const evaluator = EVALUATORS.get(options.evaluator);
356
- if (!runner || !grader || !merger || !evaluator)
1206
+ if (
1207
+ !runner ||
1208
+ !grader ||
1209
+ !merger ||
1210
+ !evaluator ||
1211
+ (hasCurriculum && !curriculum)
1212
+ )
357
1213
  throw new TypeError("branded PM exploration providers are required");
1214
+ if (hasCurriculum !== Object.hasOwn(manifest, "curriculum"))
1215
+ throw new Error("PM exploration curriculum differs from the manifest");
1216
+ if (hasMemoryRetrieval !== Object.hasOwn(manifest, "memoryRetrieval"))
1217
+ throw new Error("PM exploration egress differs from the manifest");
358
1218
  if (
359
1219
  manifest.planDigest !== plan.planDigest ||
360
1220
  manifest.environmentDigest !== plan.environmentDigest
361
1221
  ) {
362
1222
  throw new Error("PM exploration manifest differs from its plan");
363
1223
  }
1224
+ if (
1225
+ hasMemoryRetrieval &&
1226
+ (canonical(manifest.memoryRetrieval) !== canonical(memoryRetrieval) ||
1227
+ canonical(manifest.modelEgress) !== canonical(modelEgress))
1228
+ ) {
1229
+ throw new Error(
1230
+ "PM exploration egress authorities differ from the manifest",
1231
+ );
1232
+ }
364
1233
  if (
365
1234
  canonical(manifest.runner) !== canonical(runner.descriptor) ||
366
1235
  canonical(manifest.grader) !== canonical(grader.descriptor) ||
@@ -369,21 +1238,63 @@ export function createPmExplorationExecutionHost(options = {}) {
369
1238
  ) {
370
1239
  throw new Error("PM exploration providers differ from the manifest");
371
1240
  }
1241
+ if (
1242
+ hasCurriculum &&
1243
+ (canonical(manifest.curriculum) !== canonical(curriculum.descriptor) ||
1244
+ canonical(manifest.curriculumIsolation) !==
1245
+ canonical(curriculum.isolation))
1246
+ ) {
1247
+ throw new Error("PM exploration curriculum differs from the manifest");
1248
+ }
1249
+ const manifestIsolation = manifest.graderIsolation ?? null;
1250
+ if (canonical(manifestIsolation) !== canonical(grader.isolation))
1251
+ throw new Error(
1252
+ "PM exploration grader isolation differs from the manifest",
1253
+ );
1254
+ const manifestRunnerIsolation = manifest.runnerIsolation ?? null;
1255
+ if (canonical(manifestRunnerIsolation) !== canonical(runner.isolation))
1256
+ throw new Error(
1257
+ "PM exploration runner isolation differs from the manifest",
1258
+ );
1259
+ if (
1260
+ hasMemoryRetrieval &&
1261
+ runner.isolation?.schema !== PM_EXPLORATION_RUNNER_ISOLATION_SCHEMA_V2
1262
+ ) {
1263
+ throw new Error(
1264
+ "PM exploration egress requires the brokered process runner",
1265
+ );
1266
+ }
1267
+ const manifestMergerIsolation = manifest.mergerIsolation ?? null;
1268
+ if (canonical(manifestMergerIsolation) !== canonical(merger.isolation))
1269
+ throw new Error(
1270
+ "PM exploration merger isolation differs from the manifest",
1271
+ );
1272
+ const manifestEvaluatorIsolation = manifest.evaluatorIsolation ?? null;
1273
+ if (canonical(manifestEvaluatorIsolation) !== canonical(evaluator.isolation))
1274
+ throw new Error(
1275
+ "PM exploration evaluator isolation differs from the manifest",
1276
+ );
372
1277
  if (typeof options.invokeTool !== "function" || isProxy(options.invokeTool))
373
1278
  throw new TypeError("PM exploration host requires a direct tool broker");
374
1279
  if (typeof options.now !== "function" || isProxy(options.now))
375
1280
  throw new TypeError("PM exploration host requires a direct clock");
376
1281
  const host = Object.freeze({});
377
1282
  HOSTS.set(host, {
1283
+ curriculum,
378
1284
  grader,
379
1285
  evaluator,
380
1286
  invokeTool: options.invokeTool,
381
1287
  manifest,
382
1288
  merger,
1289
+ memoryRetrievalAuthority: hasMemoryRetrieval
1290
+ ? options.memoryRetrieval
1291
+ : null,
1292
+ modelEgressAuthority: hasModelEgress ? options.modelEgress : null,
383
1293
  now: options.now,
384
1294
  plan,
385
1295
  runner,
386
1296
  overhead: new WeakMap(),
1297
+ selections: new WeakMap(),
387
1298
  });
388
1299
  return host;
389
1300
  }
@@ -401,6 +1312,21 @@ export function inspectPmExplorationExecutionHost(value) {
401
1312
  environmentDigest: host.plan.environmentDigest,
402
1313
  manifestDigest: host.manifest.manifestDigest,
403
1314
  preRunSealDigest: host.manifest.preRunSealDigest,
1315
+ ...(host.curriculum === null
1316
+ ? {}
1317
+ : { curriculumIsolation: host.curriculum.isolation }),
1318
+ ...(host.runner.isolation === null
1319
+ ? {}
1320
+ : { runnerIsolation: host.runner.isolation }),
1321
+ ...(host.grader.isolation === null
1322
+ ? {}
1323
+ : { graderIsolation: host.grader.isolation }),
1324
+ ...(host.merger.isolation === null
1325
+ ? {}
1326
+ : { mergerIsolation: host.merger.isolation }),
1327
+ ...(host.evaluator.isolation === null
1328
+ ? {}
1329
+ : { evaluatorIsolation: host.evaluator.isolation }),
404
1330
  });
405
1331
  }
406
1332
 
@@ -447,6 +1373,19 @@ function recordOverhead(host, journal, metrics) {
447
1373
  return next;
448
1374
  }
449
1375
 
1376
+ function settleOverhead(host, journal, metrics) {
1377
+ const current = overheadFor(host, journal);
1378
+ const next = {};
1379
+ for (const key of ["tokens", "toolCalls", "wallClockMs"]) {
1380
+ if (metrics[key] > current[key])
1381
+ throw new Error(`PM exploration ${key} overhead settlement underflow`);
1382
+ next[key] = current[key] - metrics[key];
1383
+ }
1384
+ const settled = Object.freeze(next);
1385
+ host.overhead.set(journal, settled);
1386
+ return settled;
1387
+ }
1388
+
450
1389
  function normalizedRunnerValue(value) {
451
1390
  if (
452
1391
  !value ||
@@ -519,10 +1458,40 @@ function normalizedGraderValue(value) {
519
1458
  }
520
1459
 
521
1460
  async function runActor(binding, request, limits, host, prepare) {
1461
+ const egressContext = Object.freeze({
1462
+ planDigest: host.plan.planDigest,
1463
+ environmentDigest: host.plan.environmentDigest,
1464
+ executionManifestDigest: host.manifest.manifestDigest,
1465
+ roundId: request.roundId,
1466
+ stage: request.stage,
1467
+ branchId: request.branchId,
1468
+ taskId: request.taskId,
1469
+ inputMemoryDigest: request.inputMemoryDigest,
1470
+ });
522
1471
  const outcome = await executePmExplorationBudgetedOperation({
523
1472
  limits,
524
1473
  allowedToolIds: host.manifest.toolIds,
525
1474
  invokeTool: host.invokeTool,
1475
+ retrieveMemory:
1476
+ host.memoryRetrievalAuthority === null
1477
+ ? null
1478
+ : ({ request: retrievalRequest, signal, remainingTokens }) =>
1479
+ retrievePmExplorationMemory(
1480
+ host.memoryRetrievalAuthority,
1481
+ egressContext,
1482
+ retrievalRequest,
1483
+ { signal, remainingTokens },
1484
+ ),
1485
+ invokeModel:
1486
+ host.modelEgressAuthority === null
1487
+ ? null
1488
+ : ({ request: modelRequest, signal, remainingTokens }) =>
1489
+ invokePmExplorationModelEgress(
1490
+ host.modelEgressAuthority,
1491
+ egressContext,
1492
+ modelRequest,
1493
+ { signal, remainingTokens },
1494
+ ),
526
1495
  operation: async (runtime) => {
527
1496
  if (prepare !== null) {
528
1497
  await prepare(request, runtime.signal);
@@ -535,6 +1504,19 @@ async function runActor(binding, request, limits, host, prepare) {
535
1504
  },
536
1505
  });
537
1506
  const succeeded = outcome.status === "succeeded";
1507
+ const runnerIsolationEvidenceDigest =
1508
+ binding.consumeIsolationEvidence === null
1509
+ ? null
1510
+ : binding.consumeIsolationEvidence(request.requestDigest);
1511
+ const egressEvidenceDigest =
1512
+ host.memoryRetrievalAuthority === null
1513
+ ? null
1514
+ : (binding.consumeEgressEvidence?.(request.requestDigest) ?? null);
1515
+ if (succeeded && binding.isolation !== null) {
1516
+ digest(runnerIsolationEvidenceDigest, "runnerIsolationEvidenceDigest");
1517
+ }
1518
+ if (succeeded && host.memoryRetrievalAuthority !== null)
1519
+ digest(egressEvidenceDigest, "egressEvidenceDigest");
538
1520
  const payload = {
539
1521
  planDigest: host.plan.planDigest,
540
1522
  environmentDigest: host.plan.environmentDigest,
@@ -550,12 +1532,32 @@ async function runActor(binding, request, limits, host, prepare) {
550
1532
  traceDigest: succeeded ? outcome.value.traceDigest : outcome.traceDigest,
551
1533
  status: outcome.status,
552
1534
  failureClass: outcome.failureClass,
1535
+ ...(binding.isolation === null
1536
+ ? {}
1537
+ : {
1538
+ runnerIsolationEvidenceDigest: succeeded
1539
+ ? runnerIsolationEvidenceDigest
1540
+ : null,
1541
+ }),
1542
+ ...(host.memoryRetrievalAuthority === null
1543
+ ? {}
1544
+ : {
1545
+ egressEvidenceDigest: succeeded ? egressEvidenceDigest : null,
1546
+ }),
553
1547
  metrics: outcome.metrics,
554
1548
  issuedAt: isoTime(host.now),
555
1549
  };
556
1550
  return Object.freeze({
557
1551
  receipt: binding.issue(payload),
558
1552
  providerSettlement: succeeded ? outcome.value.providerSettlement : null,
1553
+ runnerIsolationEvidenceDigest:
1554
+ succeeded && binding.isolation !== null
1555
+ ? runnerIsolationEvidenceDigest
1556
+ : null,
1557
+ egressEvidenceDigest:
1558
+ succeeded && host.memoryRetrievalAuthority !== null
1559
+ ? egressEvidenceDigest
1560
+ : null,
559
1561
  });
560
1562
  }
561
1563
 
@@ -603,13 +1605,184 @@ async function runGrader(binding, request, limits, host) {
603
1605
  });
604
1606
  }
605
1607
 
1608
+ function normalizedCurriculumValue(value) {
1609
+ exact(
1610
+ value,
1611
+ ["taskId", "rationaleDigest"],
1612
+ "PM exploration curriculum result",
1613
+ );
1614
+ return Object.freeze({
1615
+ taskId: identifier(value.taskId, "taskId"),
1616
+ rationaleDigest: digest(value.rationaleDigest, "rationaleDigest"),
1617
+ });
1618
+ }
1619
+
1620
+ function validateTaskSelectionPosition(host, projection, input) {
1621
+ if (
1622
+ projection.planDigest !== host.plan.planDigest ||
1623
+ projection.activeRoundCount !== 0 ||
1624
+ projection.stopReason !== null
1625
+ ) {
1626
+ throw new Error("PM exploration journal is not ready for task selection");
1627
+ }
1628
+ if (input.stage === "broad") {
1629
+ if (projection.stage !== "broad")
1630
+ throw new Error("PM exploration broad selection stage is invalid");
1631
+ const branch = projection.branchHeads.find(
1632
+ (entry) => entry.branchId === input.branchId,
1633
+ );
1634
+ if (!branch || branch.memoryDigest !== input.inputMemoryDigest)
1635
+ throw new Error("PM exploration broad selection memory is invalid");
1636
+ return;
1637
+ }
1638
+ if (
1639
+ input.stage !== "deep" ||
1640
+ input.branchId !== null ||
1641
+ projection.stage !== "deep" ||
1642
+ projection.deepHead !== input.inputMemoryDigest
1643
+ ) {
1644
+ throw new Error("PM exploration deep selection position is invalid");
1645
+ }
1646
+ }
1647
+
1648
+ export async function selectPmExplorationTask(hostValue, journal, input) {
1649
+ const host = HOSTS.get(hostValue);
1650
+ if (!host)
1651
+ throw new TypeError("a branded PM exploration execution host is required");
1652
+ if (host.curriculum === null)
1653
+ throw new Error("PM exploration host has no curriculum provider");
1654
+ exact(
1655
+ input,
1656
+ ["selectionId", "roundId", "stage", "branchId", "inputMemoryDigest"],
1657
+ "PM exploration task selection",
1658
+ );
1659
+ const selectionInput = Object.freeze({
1660
+ selectionId: identifier(input.selectionId, "selectionId"),
1661
+ roundId: identifier(input.roundId, "roundId"),
1662
+ stage: input.stage,
1663
+ branchId: input.branchId,
1664
+ inputMemoryDigest: digest(input.inputMemoryDigest, "inputMemoryDigest"),
1665
+ });
1666
+ const projection = inspectPmExplorationJournal(journal);
1667
+ validateTaskSelectionPosition(host, projection, selectionInput);
1668
+ const selections = host.selections.get(journal) ?? new Map();
1669
+ if (selections.size !== 0)
1670
+ throw new Error("PM exploration journal has a pending task selection");
1671
+ const core = {
1672
+ schema: PM_EXPLORATION_TASK_SELECTION_REQUEST_SCHEMA,
1673
+ planDigest: host.plan.planDigest,
1674
+ suiteDigest: host.plan.suiteDigest,
1675
+ trainingPartitionDigest: host.plan.trainingPartitionDigest,
1676
+ environmentDigest: host.plan.environmentDigest,
1677
+ executionManifestDigest: host.manifest.manifestDigest,
1678
+ ...selectionInput,
1679
+ candidateTaskIds: host.plan.trainingTaskIds,
1680
+ completedRoundCount: projection.checkpointDigests.length,
1681
+ consecutiveNoGain: projection.consecutiveNoGain,
1682
+ };
1683
+ const request = deepFreeze({
1684
+ ...core,
1685
+ requestDigest: hash(PM_EXPLORATION_TASK_SELECTION_REQUEST_SCHEMA, core),
1686
+ });
1687
+ const outcome = await executePmExplorationBudgetedOperation({
1688
+ limits: remaining(host.plan, totalUsage(host, journal, projection)),
1689
+ operation: async (runtime) =>
1690
+ normalizedCurriculumValue(
1691
+ await host.curriculum.handler(request, runtime),
1692
+ ),
1693
+ });
1694
+ const consumedIsolationEvidence =
1695
+ host.curriculum.consumeIsolationEvidence?.(request.requestDigest) ?? null;
1696
+ const succeeded =
1697
+ outcome.status === "succeeded" &&
1698
+ host.plan.trainingTaskIds.includes(outcome.value.taskId);
1699
+ const curriculumIsolationEvidenceDigest = succeeded
1700
+ ? consumedIsolationEvidence
1701
+ : null;
1702
+ if (succeeded)
1703
+ digest(
1704
+ curriculumIsolationEvidenceDigest,
1705
+ "curriculumIsolationEvidenceDigest",
1706
+ );
1707
+ const status =
1708
+ outcome.status === "succeeded" && !succeeded ? "failed" : outcome.status;
1709
+ const failureClass =
1710
+ outcome.status === "succeeded" && !succeeded
1711
+ ? "infrastructure"
1712
+ : outcome.failureClass;
1713
+ const receipt = host.curriculum.issue({
1714
+ planDigest: host.plan.planDigest,
1715
+ environmentDigest: host.plan.environmentDigest,
1716
+ executionManifestDigest: host.manifest.manifestDigest,
1717
+ requestDigest: request.requestDigest,
1718
+ ...selectionInput,
1719
+ taskId: succeeded ? outcome.value.taskId : null,
1720
+ rationaleDigest: succeeded
1721
+ ? outcome.value.rationaleDigest
1722
+ : outcome.traceDigest,
1723
+ status,
1724
+ failureClass,
1725
+ curriculumIsolationEvidenceDigest,
1726
+ metrics: outcome.metrics,
1727
+ issuedAt: isoTime(host.now),
1728
+ });
1729
+ const verified = verifyPmExplorationReceipt(
1730
+ host.curriculum.authority,
1731
+ receipt,
1732
+ {
1733
+ planDigest: host.plan.planDigest,
1734
+ environmentDigest: host.plan.environmentDigest,
1735
+ executionManifestDigest: host.manifest.manifestDigest,
1736
+ requestDigest: request.requestDigest,
1737
+ selectionId: selectionInput.selectionId,
1738
+ roundId: selectionInput.roundId,
1739
+ stage: selectionInput.stage,
1740
+ branchId: selectionInput.branchId,
1741
+ inputMemoryDigest: selectionInput.inputMemoryDigest,
1742
+ },
1743
+ );
1744
+ recordOverhead(host, journal, verified.payload.metrics);
1745
+ if (succeeded) {
1746
+ selections.set(
1747
+ selectionInput.roundId,
1748
+ Object.freeze({
1749
+ receiptDigest: verified.receiptDigest,
1750
+ metrics: verified.payload.metrics,
1751
+ }),
1752
+ );
1753
+ host.selections.set(journal, selections);
1754
+ }
1755
+ return deepFreeze({
1756
+ schema: PM_EXPLORATION_TASK_SELECTION_RESULT_SCHEMA,
1757
+ selection: succeeded
1758
+ ? Object.freeze({
1759
+ taskId: verified.payload.taskId,
1760
+ selectionReceiptDigest: verified.receiptDigest,
1761
+ })
1762
+ : null,
1763
+ curriculumReceipt: verified,
1764
+ curriculumIsolationEvidenceDigest,
1765
+ budgetEnforced: true,
1766
+ receiptsAuthenticated: true,
1767
+ snapshotAuthenticated: false,
1768
+ qualifiesForPromotion: false,
1769
+ });
1770
+ }
1771
+
606
1772
  export async function executePmExplorationRound(hostValue, journal, input) {
607
1773
  const host = HOSTS.get(hostValue);
608
1774
  if (!host)
609
1775
  throw new TypeError("a branded PM exploration execution host is required");
610
1776
  exact(
611
1777
  input,
612
- ["roundId", "stage", "branchId", "taskId", "inputMemoryDigest"],
1778
+ [
1779
+ "roundId",
1780
+ "stage",
1781
+ "branchId",
1782
+ "taskId",
1783
+ "inputMemoryDigest",
1784
+ ...(host.curriculum === null ? [] : ["taskSelectionReceipt"]),
1785
+ ],
613
1786
  "PM exploration hosted round",
614
1787
  );
615
1788
  const roundInput = Object.freeze({
@@ -622,6 +1795,35 @@ export async function executePmExplorationRound(hostValue, journal, input) {
622
1795
  const before = inspectPmExplorationJournal(journal);
623
1796
  if (before.planDigest !== host.plan.planDigest)
624
1797
  throw new Error("PM exploration journal differs from the execution host");
1798
+ let curriculumMetrics = Object.freeze({
1799
+ tokens: 0,
1800
+ toolCalls: 0,
1801
+ wallClockMs: 0,
1802
+ });
1803
+ if (host.curriculum !== null) {
1804
+ const selectionReceipt = verifyPmExplorationReceipt(
1805
+ host.curriculum.authority,
1806
+ input.taskSelectionReceipt,
1807
+ {
1808
+ planDigest: host.plan.planDigest,
1809
+ environmentDigest: host.plan.environmentDigest,
1810
+ executionManifestDigest: host.manifest.manifestDigest,
1811
+ roundId: roundInput.roundId,
1812
+ stage: roundInput.stage,
1813
+ branchId: roundInput.branchId,
1814
+ inputMemoryDigest: roundInput.inputMemoryDigest,
1815
+ taskId: roundInput.taskId,
1816
+ status: "succeeded",
1817
+ },
1818
+ );
1819
+ const selections = host.selections.get(journal);
1820
+ const selected = selections?.get(roundInput.roundId);
1821
+ if (selected?.receiptDigest !== selectionReceipt.receiptDigest) {
1822
+ throw new Error("PM exploration task selection is missing or replayed");
1823
+ }
1824
+ curriculumMetrics = selected.metrics;
1825
+ selections.delete(roundInput.roundId);
1826
+ }
625
1827
  const round = startPmExplorationRound(journal, roundInput);
626
1828
  const runCore = {
627
1829
  schema: PM_EXPLORATION_RUN_REQUEST_SCHEMA,
@@ -699,7 +1901,10 @@ export async function executePmExplorationRound(hostValue, journal, input) {
699
1901
  outputMemoryDigest: execution.payload.outputMemoryDigest,
700
1902
  },
701
1903
  );
702
- const consumed = addMetrics(execution.payload.metrics, grade.payload.metrics);
1904
+ const consumed = addMetrics(
1905
+ curriculumMetrics,
1906
+ addMetrics(execution.payload.metrics, grade.payload.metrics),
1907
+ );
703
1908
  const checkpoint = completePmExplorationRound(journal, round, {
704
1909
  executionReceiptDigest: execution.receiptDigest,
705
1910
  graderReceiptDigest: grade.receiptDigest,
@@ -707,12 +1912,23 @@ export async function executePmExplorationRound(hostValue, journal, input) {
707
1912
  decision: grade.payload.decision,
708
1913
  metrics: consumed,
709
1914
  });
1915
+ if (host.curriculum !== null)
1916
+ settleOverhead(host, journal, curriculumMetrics);
710
1917
  return deepFreeze({
711
1918
  schema: PM_EXPLORATION_EXECUTION_RESULT_SCHEMA,
712
1919
  checkpoint,
713
1920
  executionReceipt: execution,
714
1921
  graderReceipt: grade,
715
1922
  providerSettlement: executionOutcome.providerSettlement,
1923
+ ...(executionOutcome.runnerIsolationEvidenceDigest === null
1924
+ ? {}
1925
+ : {
1926
+ runnerIsolationEvidenceDigest:
1927
+ executionOutcome.runnerIsolationEvidenceDigest,
1928
+ }),
1929
+ ...(executionOutcome.egressEvidenceDigest === null
1930
+ ? {}
1931
+ : { egressEvidenceDigest: executionOutcome.egressEvidenceDigest }),
716
1932
  budgetEnforced: true,
717
1933
  receiptsAuthenticated: true,
718
1934
  snapshotAuthenticated: false,
@@ -797,6 +2013,14 @@ export async function mergePmExplorationBranches(hostValue, journal, input) {
797
2013
  normalizedMergerValue(await host.merger.handler(request, runtime)),
798
2014
  });
799
2015
  const succeeded = outcome.status === "succeeded";
2016
+ const consumedIsolationEvidence =
2017
+ host.merger.consumeIsolationEvidence?.(request.requestDigest) ?? null;
2018
+ const mergerIsolationEvidenceDigest = succeeded
2019
+ ? consumedIsolationEvidence
2020
+ : null;
2021
+ if (succeeded && host.merger.isolation !== null) {
2022
+ digest(mergerIsolationEvidenceDigest, "mergerIsolationEvidenceDigest");
2023
+ }
800
2024
  const receipt = host.merger.issue({
801
2025
  planDigest: host.plan.planDigest,
802
2026
  environmentDigest: host.plan.environmentDigest,
@@ -811,6 +2035,9 @@ export async function mergePmExplorationBranches(hostValue, journal, input) {
811
2035
  : outcome.traceDigest,
812
2036
  status: outcome.status,
813
2037
  failureClass: outcome.failureClass,
2038
+ ...(host.merger.isolation === null
2039
+ ? {}
2040
+ : { mergerIsolationEvidenceDigest }),
814
2041
  metrics: outcome.metrics,
815
2042
  issuedAt: isoTime(host.now),
816
2043
  });
@@ -833,6 +2060,9 @@ export async function mergePmExplorationBranches(hostValue, journal, input) {
833
2060
  schema: PM_EXPLORATION_MERGE_RESULT_SCHEMA,
834
2061
  merge,
835
2062
  mergeReceipt: verified,
2063
+ ...(host.merger.isolation === null
2064
+ ? {}
2065
+ : { mergerIsolationEvidenceDigest }),
836
2066
  budgetEnforced: true,
837
2067
  receiptsAuthenticated: true,
838
2068
  snapshotAuthenticated: false,
@@ -893,6 +2123,16 @@ export async function evaluatePmExplorationMemory(hostValue, journal, input) {
893
2123
  operation: async (runtime) =>
894
2124
  normalizedEvaluatorValue(await host.evaluator.handler(request, runtime)),
895
2125
  });
2126
+ const consumedIsolationEvidence =
2127
+ host.evaluator.consumeIsolationEvidence?.(request.requestDigest) ?? null;
2128
+ const evaluatorIsolationEvidenceDigest =
2129
+ outcome.status === "succeeded" ? consumedIsolationEvidence : null;
2130
+ if (outcome.status === "succeeded" && host.evaluator.isolation !== null) {
2131
+ digest(
2132
+ evaluatorIsolationEvidenceDigest,
2133
+ "evaluatorIsolationEvidenceDigest",
2134
+ );
2135
+ }
896
2136
  const evaluation =
897
2137
  outcome.status === "succeeded"
898
2138
  ? outcome.value
@@ -911,6 +2151,9 @@ export async function evaluatePmExplorationMemory(hostValue, journal, input) {
911
2151
  decision: evaluation.decision,
912
2152
  scoreBasisPoints: evaluation.scoreBasisPoints,
913
2153
  evaluationDigest: evaluation.evaluationDigest,
2154
+ ...(host.evaluator.isolation === null
2155
+ ? {}
2156
+ : { evaluatorIsolationEvidenceDigest }),
914
2157
  metrics: outcome.metrics,
915
2158
  issuedAt: isoTime(host.now),
916
2159
  });
@@ -938,6 +2181,9 @@ export async function evaluatePmExplorationMemory(hostValue, journal, input) {
938
2181
  schema: PM_EXPLORATION_EVALUATION_RESULT_SCHEMA,
939
2182
  frozen,
940
2183
  evaluatorReceipt: verified,
2184
+ ...(host.evaluator.isolation === null
2185
+ ? {}
2186
+ : { evaluatorIsolationEvidenceDigest }),
941
2187
  budgetEnforced: true,
942
2188
  receiptsAuthenticated: true,
943
2189
  snapshotAuthenticated: false,