chainlesschain 0.166.90 → 0.166.92

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 (222) hide show
  1. package/README.md +15 -13
  2. package/package.json +4 -4
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-CZzXRe1-.js → AIOps-C74YzqwJ.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-_AZfbW1Q.js → ActionButton-TFef1hOE.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-CzaUx_wv.js → Analytics-CYsWpkkU.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-xHEeeD-m.js → AppLayout-CFf9kjwu.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-DmTbtudE.js → Artifacts-TQqa94YO.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-Cn4ng4fo.js → Audit-B79ayqfS.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-DLUY1VD2.js → BackgroundAgents-pjkHfLP9.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-B2v--wB6.js → Backup-CE6A-t_r.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-Bgih7yAv.js → BaseInput-CwcgWMBY.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-1MiiA3yA.js → Chat-BIkDNesY.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CPLynmbb.js → ChatBubbleRenderer-DgaokYts.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-DsyBa_NO.js → Checkbox-MbypIy5V.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-B7WCFx9H.js → Codegen-DiFHWDnt.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-D2x4GBGm.js → Col-BNMlYMso.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-Rnwg9nea.js → Community-B3HVyHOX.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-BPczlrRh.js → Compact-C7hlAubb.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-Br1L_wGU.js → Compliance-PaXZu6sE.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-DlsWB_oS.js → Cowork-BGiojbm-.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-BWo_KGpG.js → Cron-Bmr-1QAx.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-Cug7N8ge.js → Crosschain-BwUvWCVd.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CMbyOZJN.js → DID-k_4QZocW.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-C4dl_UaE.js → Dashboard-_ieRo2C5.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CBrC7M-9.js → Dropdown-DYHh6T27.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DTq7tU4b.js → EmailListRenderer-BNlQcWQX.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DWP3csxS.js → EvolutionSettings-DIkZ6U2D.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DZl7zuv_.js → FamilyGuardDashboard-Dq7qSr0P.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-W-GSlVK5.js → Federation-C64e3Cbx.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DMB7xYFV.js → FormItemContext-D-GE2vUa.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DNv8GEoq.js → GenericCardRenderer-DO3B2gis.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-BZ0Bbzw6.js → Git-0ETirIQH.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-BNEdcOM5.js → Governance-C9fnRygX.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-C8249gIz.js → Inference-CLJ9RTsK.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-ngzebU3e.js → KnowledgeGraph-D3C_GxrN.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-CP15th-f.js → Logs-C5ctGbkN.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-Ce-eWK3j.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-CaH59OsY.js → Marketplace-GF_t6hJ_.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-C07vnJev.js → McpTools-BGsGzgQs.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-CqAOkVAS.js → Memory-CcrY2A0j.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-qp7mZimq.js → MobileBridge-Bi4T0RlS.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-DKhbqvTw.js → MobileProjects-DvjEGyvf.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-CRYCnWXv.js → Mtc-DL77Vf-k.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-Z08IrKws.js → MtcAudit-CDy_Uswb.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-BWdatUnH.js → Multisig-DL0BAO_c.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-BKWiCZ_m.js → NLProgramming-B-woh5IR.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-Bgpzk3sm.js → Notes-CEFVCxk7.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DvtZEktR.js → NotificationSettings-BqPPMuAP.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-CBcy0szc.js → OrderTableRenderer-GUKQ1xwp.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-DRRL6vW1.js → Organization-B1gX8jlr.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-COmfB8Ns.js → Overflow-CeMxuUZy.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-BqMq_DSa.js → P2P-B5aIRWwJ.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-BX7iNvle.js → PdhVaultBrowser-6rYgejd4.js} +4 -4
  56. package/src/assets/web-panel/assets/{Permissions-DzYkjmV_.js → Permissions-CqCp2SIl.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BBTcxBbN.js → PersonalDataHub-BsA7DJWW.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-eRkYFSbO.js → Pipeline-CiW6HeZh.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-Ch7IFKBh.js → Privacy-DckUOLYq.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-Ci8EcBYg.js → ProjectInit-CZppOOYR.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-B4lYHFbI.js → ProjectSettings-B9QPzhDU.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-zkE5cCo_.js → Projects-BErjjGha.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-BKDVD3_e.js → Providers-DehU6Qiz.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-BromrHlf.js → QrScannerModal-E1SUvv1m.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-CCgoY1gR.js → QuickAsk-COWFxyH3.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DCPZvpq7.js → Recommend-D26pWKxX.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-DPnFP8HU.js → RemoteSession-DCOIaId3.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-l6r8ytAs.js → Reputation-DT_AHGAR.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-ke9Mk1cx.js → Row-B50S-1nl.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-DQOEzUEn.js → RssFeed-BaBnHg3Q.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-BqgA0aUz.js → Search-BVdnLuuS.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-FeGD_jqV.js → Security-BnacH74J.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-4kiYYAjZ.js → Services-CxM08Zch.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-BbU8Xegs.js → Skeleton-DE7CIc1N.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-Dl2bUMUL.js → Skills-CGI0SJmf.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-xRGALeaZ.js → Sla-DpEzPcqc.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-DZfd4RDm.js → SpeechSettings-CTmnmMHn.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BRtCV9Ga.js → SyncSettings-Dxgrd9hd.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-DVRQklfG.js → Tasks-CW4slS0A.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BbhE5jt5.js → Templates-DxvGWDgB.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-qXPDNKbK.js → Tenant-_Q0o2tNK.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CV48Ks7E.js → Terminal-BTZn8pow.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-BLGfJIDr.js → TimelineRenderer-CauL0KFe.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-7G9H6Hrt.js → Tokens-CDoM2qeT.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger--F64N11F.js → Trigger-B-QYGEU7.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-Cq1r-D_y.js → Trust-BD6XJHT-.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-Dqyu4RVh.js → UkeySign-x4TFwCy0.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-DuFmWH_B.js → VideoEditing-t3imBK_0.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-C3mg7EWP.js → Wallet-BCfkWwNC.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-CDK-Aj_X.js → WebAuthn-WH314Mdm.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor--K7K-T1F.js → WorkflowEditor-jUlcjrUg.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BQDcS6VP.js → chat-Dg3VASTL.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-BKxJL2-T.js → colors-BNvmBRKE.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-CFjQAMbY.js → compact-item-BGOfoqf4.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DbgCsdQd.js → createContext-BNQeqKAs.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BhkaOBNv.js → hasIn-Bg3AjCrq.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DvWWFJHJ.js → index--I3UF5t1.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DJ2OiRvh.js → index-2D04Zltx.js} +3 -3
  100. package/src/assets/web-panel/assets/{index-BuWPqSGT.js → index-60AnjUTX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-D2Zb-Kd1.js → index-7QJUWemf.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C0DzhUOX.js → index-B--0QM0S.js} +1 -1
  103. package/src/assets/web-panel/assets/index-B-jSKJK6.js +1 -0
  104. package/src/assets/web-panel/assets/{index-COGy6wXn.js → index-B0mgngoB.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-bMX8BBLE.js → index-BBCMulQ-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CE506mgj.js → index-BSNhW95G.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CoOu7sdP.js → index-B_JmInC0.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B4LlAJqc.js → index-BaPvEvB4.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CRtUDiXx.js → index-Bkz1tgFR.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Du_SxxBY.js → index-BmTacaQV.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CSUDlsIr.js → index-CCFZN66A.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-3uR0ThJO.js → index-COol3xfA.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DmYK9Tqt.js → index-CY8cRKHR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-T9ka3Xj3.js → index-Cbp-wp-U.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CB4oHynY.js → index-Co_LnCWD.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DEwHywz9.js → index-Cx2EXRfr.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CUs7XpUO.js → index-D-mSvCQK.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BRqlCTrz.js → index-D072oLjp.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-sKfUUldY.js → index-D6UqK83L.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dhfa_BIl.js → index-DF_FKSVH.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-D9sVcw6v.js → index-DLwEXRrb.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-3djsY75k.js → index-DO0VlNtc.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BfGGsAU7.js → index-DS04wRll.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Dn2QSsuI.js → index-DYn5DnDk.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-D-Yh3-1z.js → index-D_O2ZjPk.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BNjYPJNU.js → index-DcCnO0RU.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DP1NrM9J.js → index-Dkp-okWa.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DdcrixaQ.js → index-OUFoxUgH.js} +1 -1
  129. package/src/assets/web-panel/assets/index-P4FXZJqI.js +1 -0
  130. package/src/assets/web-panel/assets/{index-7BY44UEv.js → index-Wo0f2iqb.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DjmVlpap.js → index-ZD5Kd8tx.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-3YutaXnp.js → index-fOwii3LP.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-aPdVzagA.js → index-hG7jXGEW.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-De7daEnc.js → index-pVdQieac.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CJoXgJ2N.js → index-uH2LnAs_.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DFt48Z-x.js → index-xzaUx19r.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-wrqabmui.js → initDefaultProps-B8PN9AxJ.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-BoyB3ilP.js → motion-BHivfw5Q.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-Cq31cSFE.js → move-B0QU5nDd.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BkxNt-8H.js → mtc-parser-DRwRM3PE.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DofGni53.js → omit-SHt2rV2p.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-BnluLL16.js → pickAttrs-CcmDlEb2.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-C-yegJSP.js → placementArrow-DYatmXDS.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-CD3ziNhu.js → responsiveObserve-B7qrsXq5.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-ToZO4gQ1.js → slide-BRGhlOWd.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-DFVmDmVl.js → statusUtils-CT-7NXsQ.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-De0Y8g1O.js → styleChecker-rZdw_Yyp.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-wBKIYFKX.js → useFlexGapSupport-D8YNIP4P.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-CP9nmUMJ.js → useFs-B8pt0Gu-.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-vFGrVDyp.js → usePersonalDataHub-VMmYM1tt.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-BcBIjvjH.js → vnode-UNDuoPoq.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-DnXDAQxA.js → zoom-dN-u667S.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +1 -1
  155. package/src/commands/agent-process-ownership.js +121 -0
  156. package/src/commands/agent.js +2 -0
  157. package/src/commands/hub.js +86 -9
  158. package/src/data/changelog.json +54 -2
  159. package/src/lib/audit-logger.js +46 -20
  160. package/src/lib/checkpoint-restore-saga.js +11 -1
  161. package/src/lib/eval/verify01-host-evidence.js +36 -3
  162. package/src/lib/evolution/evolution-artifact-ports.js +26 -0
  163. package/src/lib/evolution/evolution-eval-cohort-enrollment.js +713 -47
  164. package/src/lib/evolution/evolution-eval-gate.js +146 -0
  165. package/src/lib/evolution/evolution-eval-launch-admission.js +168 -90
  166. package/src/lib/evolution/evolution-eval-ledger-capture.js +50 -0
  167. package/src/lib/evolution/evolution-eval-readonly-audit.js +106 -0
  168. package/src/lib/evolution/evolution-ledger-file-backend.js +20 -0
  169. package/src/lib/evolution/evolution-ledger-ports.js +59 -27
  170. package/src/lib/evolution/evolution-ledger-v2-journal.js +55 -18
  171. package/src/lib/evolution/evolution-workbench-file-resources.js +19 -1
  172. package/src/lib/evolution/rrsi-cohort-registration.js +275 -0
  173. package/src/lib/evolution/rrsi-contracts.js +742 -0
  174. package/src/lib/evolution/rrsi-data.js +196 -0
  175. package/src/lib/evolution/rrsi-evaluation-adapter.js +275 -0
  176. package/src/lib/evolution/rrsi-evaluation-variants.js +267 -0
  177. package/src/lib/evolution/rrsi-group-statistics.js +553 -0
  178. package/src/lib/evolution/rrsi-history-ledger-adapter.js +3261 -0
  179. package/src/lib/evolution/rrsi-native-batch-evidence.js +520 -0
  180. package/src/lib/evolution/rrsi-native-eval-row-collector.js +538 -0
  181. package/src/lib/evolution/rrsi-native-evaluation-batch.js +547 -0
  182. package/src/lib/evolution/rrsi-native-evaluation-plan.js +431 -0
  183. package/src/lib/evolution/rrsi-native-group-statistics-plan.js +121 -0
  184. package/src/lib/evolution/rrsi-native-group-statistics.js +482 -0
  185. package/src/lib/evolution/rrsi-native-quality-receipt-contracts.js +321 -0
  186. package/src/lib/evolution/rrsi-native-quality-receipt.js +256 -0
  187. package/src/lib/evolution/rrsi-native-statistics-protocol.js +330 -0
  188. package/src/lib/evolution/rrsi-parent-binding.js +290 -0
  189. package/src/lib/evolution/rrsi-pm-execution-bridge.js +500 -0
  190. package/src/lib/evolution/rrsi-pm-training-mapping.js +134 -0
  191. package/src/lib/evolution/rrsi-preparation-contracts.js +213 -0
  192. package/src/lib/evolution/rrsi-registry-history-binding.js +193 -0
  193. package/src/lib/evolution/rrsi-registry-store-policy.js +1191 -0
  194. package/src/lib/evolution/rrsi-runtime-composition.js +79 -0
  195. package/src/lib/evolution/rrsi-selector.js +434 -0
  196. package/src/lib/evolution/rrsi-statistics-simulation.js +354 -0
  197. package/src/lib/evolution/skill-candidate-registry.js +216 -29
  198. package/src/lib/evolution/skill-registry-maintenance.js +80 -0
  199. package/src/lib/evolution/skill-registry-writer-control.js +138 -0
  200. package/src/lib/evolution/skill-release-registry.js +399 -169
  201. package/src/lib/formal-quality-eval-runtime.js +2 -14
  202. package/src/lib/goal-store.js +225 -16
  203. package/src/lib/process-execution-broker/index.js +91 -1
  204. package/src/lib/process-execution-broker/platform-sandbox.js +42 -0
  205. package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +757 -0
  206. package/src/lib/process-execution-broker/windows-native-evaluator.js +316 -0
  207. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  208. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  209. package/src/lib/process-execution-broker/windows-sandbox.cs +383 -11
  210. package/src/lib/record-replay/skill-recorder.js +38 -3
  211. package/src/lib/scheduler-kernel/authority-resolver.js +12 -163
  212. package/src/lib/scheduler-kernel/contract.js +27 -414
  213. package/src/lib/scheduler-kernel/runtime.js +21 -823
  214. package/src/lib/scheduler-kernel/service.js +11 -328
  215. package/src/lib/scheduler-kernel/source-locator-path.js +7 -142
  216. package/src/lib/scheduler-kernel/store.js +67 -5931
  217. package/src/lib/secure-fs.js +16 -1314
  218. package/src/lib/with-file-lock.js +122 -20
  219. package/src/assets/web-panel/assets/MarkdownRenderer-CW3B3JDq.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-DlIv9Mbc.js +0 -1
  221. package/src/assets/web-panel/assets/index-BC972Grv.js +0 -1
  222. package/src/assets/web-panel/assets/index-CVifyQqL.js +0 -1
@@ -22,6 +22,7 @@ import {
22
22
  EVOLUTION_LEDGER_QUERY_SCHEMA,
23
23
  EvolutionLedger,
24
24
  } from "./evolution-ledger.js";
25
+ import { isEvolutionLedgerV2Journal } from "./evolution-ledger-v2-journal.js";
25
26
  import {
26
27
  SKILL_MUTATION_NONCE_ACK_SCHEMA,
27
28
  SKILL_MUTATION_OPERATIONS,
@@ -697,6 +698,37 @@ function requireStableInstance(value, prototype, label) {
697
698
  throw new TypeError(`${label} instance is required`);
698
699
  }
699
700
 
701
+ // A migrated journal must execute its own recovery and retained-payload checks.
702
+ // Never unwrap it to the source Ledger or accept matching ordinary callbacks.
703
+ function captureLedgerJournal(ledger) {
704
+ rejectProxy(ledger, "EvolutionLedger journal");
705
+ const v2 = isEvolutionLedgerV2Journal(ledger);
706
+ if (!v2)
707
+ requireStableInstance(ledger, EvolutionLedger.prototype, "EvolutionLedger");
708
+ const methods = {};
709
+ for (const name of [
710
+ "appendDomainEvent",
711
+ "query",
712
+ "read",
713
+ "verify",
714
+ "verifyReceipt",
715
+ ]) {
716
+ const owner = v2 ? ledger : EvolutionLedger.prototype;
717
+ const field = Object.getOwnPropertyDescriptor(owner, name);
718
+ const method = field?.value;
719
+ if (typeof method !== "function" || utilTypes.isProxy(method))
720
+ throw portsError(
721
+ EVOLUTION_LEDGER_PORTS_INVALID_CODE,
722
+ "genuine Ledger journal method is missing",
723
+ );
724
+ // Do not invoke caller-editable function properties such as method.bind.
725
+ methods[name] = Object.freeze((...args) =>
726
+ Reflect.apply(method, ledger, args),
727
+ );
728
+ }
729
+ return Object.freeze({ ledger, methods: Object.freeze(methods) });
730
+ }
731
+
700
732
  function captureDurabilityAuthority(value) {
701
733
  assertAllExactRecord(
702
734
  value,
@@ -1174,7 +1206,7 @@ class EvolutionLedgerDomainPorts {
1174
1206
  artifactPorts,
1175
1207
  artifactTenantId,
1176
1208
  audience,
1177
- ledger,
1209
+ ledgerMethods,
1178
1210
  purpose,
1179
1211
  }) {
1180
1212
  this.#artifactTenantId = identifier(artifactTenantId, "artifactTenantId");
@@ -1184,35 +1216,34 @@ class EvolutionLedgerDomainPorts {
1184
1216
  this.#durabilityAuthority = artifactDurabilityAuthority;
1185
1217
  this.#durabilityAuthorityId = artifactDurabilityAuthority.id;
1186
1218
  this.#durabilityRetain = artifactDurabilityAuthority.retain;
1187
- this.#appendDomainEvent = Object.freeze(
1188
- EvolutionLedger.prototype.appendDomainEvent.bind(ledger),
1189
- );
1190
- this.#ledgerQuery = Object.freeze(
1191
- EvolutionLedger.prototype.query.bind(ledger),
1192
- );
1193
- this.#ledgerRead = Object.freeze(
1194
- EvolutionLedger.prototype.read.bind(ledger),
1219
+ this.#appendDomainEvent = ledgerMethods.appendDomainEvent;
1220
+ this.#ledgerQuery = ledgerMethods.query;
1221
+ this.#ledgerRead = ledgerMethods.read;
1222
+ this.#ledgerVerify = ledgerMethods.verify;
1223
+ this.#ledgerVerifyReceipt = ledgerMethods.verifyReceipt;
1224
+ const putCanonical = EvolutionArtifactPorts.prototype.putCanonical;
1225
+ this.#artifactPut = Object.freeze((...args) =>
1226
+ Reflect.apply(putCanonical, artifactPorts, args),
1195
1227
  );
1196
- this.#ledgerVerify = Object.freeze(
1197
- EvolutionLedger.prototype.verify.bind(ledger),
1198
- );
1199
- this.#ledgerVerifyReceipt = Object.freeze(
1200
- EvolutionLedger.prototype.verifyReceipt.bind(ledger),
1201
- );
1202
- this.#artifactPut = Object.freeze(
1203
- EvolutionArtifactPorts.prototype.putCanonical.bind(artifactPorts),
1228
+ this.#artifactResolve = Reflect.apply(
1229
+ EvolutionArtifactPorts.prototype.createEvolutionLedgerArtifactResolver,
1230
+ artifactPorts,
1231
+ [Object.freeze({ purpose: this.#purpose })],
1204
1232
  );
1205
- this.#artifactResolve =
1206
- EvolutionArtifactPorts.prototype.createEvolutionLedgerArtifactResolver.call(
1207
- artifactPorts,
1208
- Object.freeze({ purpose: this.#purpose }),
1209
- );
1210
1233
  this.#artifactResolveBatch = captureEvolutionLedgerBatchResolver(
1211
1234
  this.#artifactResolve,
1212
1235
  );
1213
1236
  Object.freeze(this);
1214
1237
  }
1215
1238
 
1239
+ readArtifactScope() {
1240
+ return deepFreeze({
1241
+ artifactTenantId: this.#artifactTenantId,
1242
+ audience: this.#audience,
1243
+ purpose: this.#purpose,
1244
+ });
1245
+ }
1246
+
1216
1247
  #assertAudience(value, label, { nullable = false } = {}) {
1217
1248
  if (value === null && nullable) return null;
1218
1249
  const normalized = identifier(value, label);
@@ -4078,16 +4109,15 @@ export function createEvolutionLedgerPorts(options = {}) {
4078
4109
  FACTORY_REQUIRED_KEYS,
4079
4110
  "evolution ledger ports options",
4080
4111
  );
4081
- const ledger = requireStableInstance(
4112
+ const capturedLedger = captureLedgerJournal(
4082
4113
  ownData(
4083
4114
  options,
4084
4115
  "ledger",
4085
4116
  "evolution ledger ports options",
4086
4117
  EVOLUTION_LEDGER_PORTS_INVALID_CODE,
4087
4118
  ),
4088
- EvolutionLedger.prototype,
4089
- "EvolutionLedger",
4090
4119
  );
4120
+ const { ledger, methods: ledgerMethods } = capturedLedger;
4091
4121
  const artifactPorts = requireStableInstance(
4092
4122
  ownData(
4093
4123
  options,
@@ -4123,7 +4153,7 @@ export function createEvolutionLedgerPorts(options = {}) {
4123
4153
  EVOLUTION_LEDGER_PORTS_INVALID_CODE,
4124
4154
  )
4125
4155
  : undefined,
4126
- ledger,
4156
+ ledgerMethods,
4127
4157
  purpose: Object.hasOwn(options, "purpose")
4128
4158
  ? ownData(
4129
4159
  options,
@@ -4149,10 +4179,11 @@ export function createEvolutionLedgerPorts(options = {}) {
4149
4179
  prepare,
4150
4180
  query,
4151
4181
  });
4152
- const readCurrentHead = ledger.verify.bind(ledger);
4182
+ const readCurrentHead = ledgerMethods.verify;
4153
4183
  RELEASE_OPERATION_READERS.set(
4154
4184
  transactionLedger,
4155
4185
  Object.freeze({
4186
+ scope: adapter.readArtifactScope(),
4156
4187
  currentContext: Object.freeze(() => {
4157
4188
  const head = readCurrentHead();
4158
4189
  return deepFreeze({
@@ -4172,6 +4203,7 @@ export function createEvolutionLedgerPorts(options = {}) {
4172
4203
  captureWikiRevisionReader(wikiAdapter).matchesLedger(ledger),
4173
4204
  ),
4174
4205
  matchesLedger: Object.freeze((value) => value === ledger),
4206
+ matchesArtifactPorts: Object.freeze((value) => value === artifactPorts),
4175
4207
  resolveOperation: Object.freeze((input) =>
4176
4208
  adapter.resolveReleaseOperation(input),
4177
4209
  ),
@@ -4,6 +4,7 @@ import { types as utilTypes } from "node:util";
4
4
  import { withFileLock } from "../with-file-lock.js";
5
5
  import { EvolutionArtifactPorts } from "./evolution-artifact-ports.js";
6
6
  import {
7
+ EvolutionLedger,
7
8
  captureEvolutionLedgerMigrationSource,
8
9
  EVOLUTION_LEDGER_MAX_EVENTS,
9
10
  EVOLUTION_LEDGER_V2_MIGRATION_INTENT,
@@ -105,6 +106,38 @@ export function createEvolutionLedgerV2Journal(options) {
105
106
  });
106
107
  const source = captureEvolutionLedgerMigrationSource(config.sourceLedger);
107
108
  const ledger = source.ledger;
109
+ // Genuine subclasses also own migration capabilities. Capture original
110
+ // private-field operations and physical paths rather than virtual overrides.
111
+ const original = Object.fromEntries(
112
+ [
113
+ "read",
114
+ "query",
115
+ "queryMany",
116
+ "verifyReceipt",
117
+ "verify",
118
+ "checkpointState",
119
+ "exportAuditBundle",
120
+ ].map((name) => {
121
+ const method = Object.getOwnPropertyDescriptor(
122
+ EvolutionLedger.prototype,
123
+ name,
124
+ ).value;
125
+ return [name, (...args) => Reflect.apply(method, ledger, args)];
126
+ }),
127
+ );
128
+ const rootDir = Reflect.apply(
129
+ Object.getOwnPropertyDescriptor(EvolutionLedger.prototype, "rootDir").get,
130
+ ledger,
131
+ [],
132
+ );
133
+ const authorityRootDir = Reflect.apply(
134
+ Object.getOwnPropertyDescriptor(
135
+ EvolutionLedger.prototype,
136
+ "authorityRootDir",
137
+ ).get,
138
+ ledger,
139
+ [],
140
+ );
108
141
  const backend = captureEvolutionLedgerV2ManifestBackend(config.backend);
109
142
  const retention = config.minimumRetainedUntil;
110
143
  if (
@@ -120,7 +153,8 @@ export function createEvolutionLedgerV2Journal(options) {
120
153
  )
121
154
  fail("constructed EvolutionArtifactPorts are required");
122
155
  // Calling the original private-field method also rejects prototype forgeries.
123
- const put = EvolutionArtifactPorts.prototype.putCanonical.bind(artifactPorts);
156
+ const putCanonical = EvolutionArtifactPorts.prototype.putCanonical;
157
+ const put = (...args) => Reflect.apply(putCanonical, artifactPorts, args);
124
158
  const lock = config.lock ?? withFileLock;
125
159
  if (typeof lock !== "function" || utilTypes.isProxy(lock))
126
160
  fail("synchronous journal lock is required");
@@ -134,7 +168,7 @@ export function createEvolutionLedgerV2Journal(options) {
134
168
  const locked = (operation) => {
135
169
  let calls = 0;
136
170
  const result = lock(
137
- path.join(ledger.authorityRootDir, "manifest-cutover-v2"),
171
+ path.join(authorityRootDir, "manifest-cutover-v2"),
138
172
  (context) => {
139
173
  if (++calls !== 1)
140
174
  fail("journal lock callback must execute exactly once");
@@ -149,7 +183,7 @@ export function createEvolutionLedgerV2Journal(options) {
149
183
  return result;
150
184
  };
151
185
  const sourceEvents = () =>
152
- ledger.read({ limit: EVOLUTION_LEDGER_MAX_EVENTS });
186
+ original.read({ limit: EVOLUTION_LEDGER_MAX_EVENTS });
153
187
 
154
188
  function binding(authority) {
155
189
  if (
@@ -252,7 +286,7 @@ export function createEvolutionLedgerV2Journal(options) {
252
286
  return receipt;
253
287
  }
254
288
  function recover() {
255
- const authority = ledger.verify();
289
+ const authority = original.verify();
256
290
  const expectedBinding = binding(authority);
257
291
  let events = sourceEvents();
258
292
  let intents = events.filter(
@@ -416,8 +450,8 @@ export function createEvolutionLedgerV2Journal(options) {
416
450
  }
417
451
  const journal = Object.freeze({
418
452
  descriptor,
419
- rootDir: ledger.rootDir,
420
- authorityRootDir: ledger.authorityRootDir,
453
+ rootDir,
454
+ authorityRootDir,
421
455
  append: (input, options = {}) =>
422
456
  append("append", input, options, false, false),
423
457
  appendBatch: (inputs, options = {}) =>
@@ -433,14 +467,14 @@ export function createEvolutionLedgerV2Journal(options) {
433
467
  read: (options = {}) =>
434
468
  readOperation(({ events }) => {
435
469
  // Preserve exact v1 read validation and return events recovered from v2.
436
- const selected = ledger.read(options);
470
+ const selected = original.read(options);
437
471
  return Object.freeze(
438
472
  selected.map((event) => events[event.sequence - 1]),
439
473
  );
440
474
  }),
441
475
  query: (selector, options = {}) =>
442
476
  readOperation(({ events }) => {
443
- const result = ledger.query(selector, options);
477
+ const result = original.query(selector, options);
444
478
  return result
445
479
  ? Object.freeze({
446
480
  ...result,
@@ -451,7 +485,7 @@ export function createEvolutionLedgerV2Journal(options) {
451
485
  queryMany: (selectors, options = {}) =>
452
486
  readOperation(({ events }) =>
453
487
  Object.freeze(
454
- ledger.queryMany(selectors, options).map((result) =>
488
+ original.queryMany(selectors, options).map((result) =>
455
489
  result
456
490
  ? Object.freeze({
457
491
  ...result,
@@ -463,17 +497,20 @@ export function createEvolutionLedgerV2Journal(options) {
463
497
  ),
464
498
  findByEventId: (eventId) =>
465
499
  readOperation(({ events }) => {
466
- const event = ledger.findByEventId(eventId);
500
+ const event =
501
+ original.query({ eventId }, { issueReceipt: false })?.event ?? null;
467
502
  return event ? events[event.sequence - 1] : null;
468
503
  }),
469
504
  recoverReceipt: (selector) =>
470
- readOperation(() => ledger.recoverReceipt(selector)),
505
+ readOperation(
506
+ () => original.query(selector, { issueReceipt: true })?.receipt ?? null,
507
+ ),
471
508
  verifyReceipt: (receipt, options = {}) =>
472
- readOperation(() => ledger.verifyReceipt(receipt, options)),
473
- verify: () => readOperation(() => ledger.verify()),
474
- getAuthority: () => readOperation(() => ledger.getAuthority()),
475
- checkpointState: () => readOperation(() => ledger.checkpointState()),
476
- exportAuditBundle: () => readOperation(() => ledger.exportAuditBundle()),
509
+ readOperation(() => original.verifyReceipt(receipt, options)),
510
+ verify: () => readOperation(() => original.verify()),
511
+ getAuthority: () => readOperation(() => original.verify()),
512
+ checkpointState: () => readOperation(() => original.checkpointState()),
513
+ exportAuditBundle: () => readOperation(() => original.exportAuditBundle()),
477
514
  recover: () =>
478
515
  readOperation(({ checkpoint, intent, completed }) =>
479
516
  Object.freeze({ checkpoint, intent, completed }),
@@ -506,8 +543,8 @@ export function createEvolutionLedgerV2JournalFromFactory(
506
543
  utilTypes.isProxy(config.createBackend)
507
544
  )
508
545
  fail("explicit manifest backend construction authority is required");
509
- const authority =
510
- captureEvolutionLedgerMigrationSource(sourceLedger).ledger.getAuthority();
546
+ const ledger = captureEvolutionLedgerMigrationSource(sourceLedger).ledger;
547
+ const authority = Reflect.apply(EvolutionLedger.prototype.verify, ledger, []);
511
548
  const scope = Object.freeze({
512
549
  ...record(config.descriptor, ["tenantId", "artifactTenantId", "audience"]),
513
550
  });
@@ -13,12 +13,21 @@ const ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
13
13
  const DIGEST = /^sha256:[a-f0-9]{64}$/u;
14
14
  const STORAGE_ID = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$/u;
15
15
  const FILE_RESOURCES = new WeakSet();
16
+ const FILE_BACKEND_BINDINGS = new WeakMap();
16
17
 
17
18
  export function captureWorkbenchFileResources(value) {
18
19
  if (!FILE_RESOURCES.has(value))
19
20
  throw new TypeError("genuine Workbench file resources are required");
20
21
  return value;
21
22
  }
23
+
24
+ /** Root composition retains the exact backends; public resource bytes stay compatible. */
25
+ export function captureWorkbenchFileBackendBinding(value) {
26
+ const binding = FILE_BACKEND_BINDINGS.get(value);
27
+ if (!binding)
28
+ throw new TypeError("genuine Workbench file backend bindings are required");
29
+ return binding;
30
+ }
22
31
  const DESCRIPTOR_KEYS = [
23
32
  "tenantId",
24
33
  "artifactTenantId",
@@ -327,7 +336,7 @@ export function openEvolutionWorkbenchFileResources(input) {
327
336
  artifactPorts.createEvolutionLedgerArtifactResolver({
328
337
  purpose: descriptor.purpose,
329
338
  });
330
- const { ledger } = createEvolutionLedgerFileBackend({
339
+ const backend = createEvolutionLedgerFileBackend({
331
340
  rootDir: storage.ledgerRootDir,
332
341
  authorityRootDir: storage.ledgerAuthorityRootDir,
333
342
  witnessFilePath: storage.witnessFilePath,
@@ -339,6 +348,7 @@ export function openEvolutionWorkbenchFileResources(input) {
339
348
  fsImpl: io,
340
349
  clock: now,
341
350
  });
351
+ const { ledger } = backend;
342
352
  const ports = createEvolutionLedgerPorts({
343
353
  artifactPorts,
344
354
  ledger,
@@ -356,6 +366,7 @@ export function openEvolutionWorkbenchFileResources(input) {
356
366
  fsImpl: io,
357
367
  });
358
368
  return {
369
+ backend,
359
370
  artifactPorts,
360
371
  ledger,
361
372
  ledgerArtifactResolver,
@@ -399,5 +410,12 @@ export function openEvolutionWorkbenchFileResources(input) {
399
410
  }),
400
411
  });
401
412
  FILE_RESOURCES.add(result);
413
+ FILE_BACKEND_BINDINGS.set(
414
+ result,
415
+ Object.freeze({
416
+ backend: primary.backend,
417
+ verifierBackend: verifier.backend,
418
+ }),
419
+ );
402
420
  return result;
403
421
  }
@@ -0,0 +1,275 @@
1
+ /** Derive enrollment declarations only from a genuine History resolver at composition. */
2
+ import {
3
+ snapshotRrsiData,
4
+ rrsiExact,
5
+ rrsiHash,
6
+ rrsiEnvelope,
7
+ rrsiFail,
8
+ rrsiInteger,
9
+ rrsiCanonical,
10
+ freezeRrsiData,
11
+ } from "./rrsi-data.js";
12
+ import { normalizeRrsiNativeEvaluationBatch } from "./rrsi-native-evaluation-batch.js";
13
+
14
+ export const RRSI_COHORT_REGISTRATION_SCHEMA =
15
+ "chainlesschain.rrsi-cohort-registration/v1";
16
+ export const RRSI_COHORT_PLAN_SCHEMA = "chainlesschain.rrsi-cohort-plan/v1";
17
+ export const RRSI_COHORT_PLAN_V2_SCHEMA = "chainlesschain.rrsi-cohort-plan/v2";
18
+ export const RRSI_COHORT_MANIFEST_SCHEMA =
19
+ "chainlesschain.rrsi-cohort-manifest/v1";
20
+ export const RRSI_COHORT_MANIFEST_V2_SCHEMA =
21
+ "chainlesschain.rrsi-cohort-manifest/v2";
22
+ export const RRSI_EVAL_CAMPAIGN_PLAN_SCHEMA =
23
+ "chainlesschain.rrsi-eval-campaign-plan/v1";
24
+
25
+ /** Structural provenance only. Consumers obtain the registration from genuine History. */
26
+ export function buildRrsiNativeStatisticsRegistrationBindings(
27
+ registrationInput,
28
+ reservationRecordInput,
29
+ ) {
30
+ const registration = snapshotRrsiData(registrationInput);
31
+ const reservationRecord = snapshotRrsiData(reservationRecordInput);
32
+ if (
33
+ registration.schema !==
34
+ "chainlesschain.rrsi-native-statistics-registration-resolution/v1" ||
35
+ registration.historyAuthenticated !== true ||
36
+ registration.preObservationRegistrationVerified !== true ||
37
+ registration.reservationKind !== "reserve-native-batch-v2" ||
38
+ registration.statisticsPlanDigest !==
39
+ registration.statisticsPlan?.statisticsPlanDigest ||
40
+ rrsiCanonical(registration.reservationRecord) !==
41
+ rrsiCanonical(reservationRecord) ||
42
+ !(
43
+ registration.binding.rootRegistrationRecord.sequence <
44
+ registration.scopeRegistrationRecord.sequence &&
45
+ registration.scopeRegistrationRecord.sequence <
46
+ registration.planRegistrationRecord.sequence &&
47
+ registration.planRegistrationRecord.sequence < reservationRecord.sequence
48
+ )
49
+ )
50
+ rrsiFail("native statistics registration provenance or sequence differs");
51
+ return freezeRrsiData({
52
+ schema: "chainlesschain.rrsi-native-statistics-registration-bindings/v1",
53
+ binding: registration.binding,
54
+ protocolDigest: registration.protocolDigest,
55
+ statisticsPlanDigest: registration.statisticsPlanDigest,
56
+ scopeRegistrationRecord: registration.scopeRegistrationRecord,
57
+ planRegistrationRecord: registration.planRegistrationRecord,
58
+ reservationRecord,
59
+ reservationKind: registration.reservationKind,
60
+ });
61
+ }
62
+
63
+ export function buildRrsiEvalCampaignPlan(rootInput) {
64
+ const root = snapshotRrsiData(rootInput);
65
+ return rrsiEnvelope(RRSI_EVAL_CAMPAIGN_PLAN_SCHEMA, "campaignRootDigest", {
66
+ historyScopeId: root.descriptor.scopeId,
67
+ historyDescriptorDigest: rrsiHash(
68
+ "chainlesschain.rrsi-history-descriptor/v1",
69
+ root.descriptor,
70
+ ),
71
+ ledgerIdentity: root.identity,
72
+ rootCampaignDigest: root.campaign.campaignDigest,
73
+ rootRegistrationRecord: root.registrationRecord,
74
+ policyDigest: root.campaign.policy.policyDigest,
75
+ executionDigest: rrsiHash(
76
+ "chainlesschain.rrsi-execution-bindings/v1",
77
+ root.campaign.execution,
78
+ ),
79
+ budgetDigest: rrsiHash(
80
+ "chainlesschain.rrsi-root-budget/v1",
81
+ root.campaign.budget,
82
+ ),
83
+ experimentDigest: rrsiHash(
84
+ "chainlesschain.rrsi-root-experiment/v1",
85
+ root.campaign.experiment,
86
+ ),
87
+ maxSelectionQueries: root.campaign.policy.limits.maxSelectionQueries,
88
+ querySlotPolicy: "global-history-ordinal-and-stage/v1",
89
+ productionBudgetAuthorityVerified: false,
90
+ });
91
+ }
92
+
93
+ export function rrsiEvalQueryStreamId(root, resolution) {
94
+ rrsiInteger(
95
+ resolution.queryOrdinal,
96
+ "global History query ordinal",
97
+ 1,
98
+ root.maxSelectionQueries,
99
+ );
100
+ return `rrsi-query.${rrsiHash("chainlesschain.rrsi-eval-query-stream/v1", { campaignRootDigest: root.campaignRootDigest, queryOrdinal: resolution.queryOrdinal, stage: resolution.batch.stage }).slice(7)}`;
101
+ }
102
+
103
+ /** Immutable plan/manifest bytes exclude changing budget statuses and current head digests. */
104
+ export function buildRrsiCohortRegistration(
105
+ rootInput,
106
+ resolutionInput,
107
+ cohortId,
108
+ ) {
109
+ return prepareRrsiCohortRegistration(rootInput, resolutionInput).build(
110
+ cohortId,
111
+ );
112
+ }
113
+
114
+ /** Structural preparation only; trusted audit callers supply genuine History data. */
115
+ export function prepareRrsiCohortRegistration(rootInput, resolutionInput) {
116
+ const root = snapshotRrsiData(rootInput),
117
+ resolution = snapshotRrsiData(resolutionInput);
118
+ const batch = normalizeRrsiNativeEvaluationBatch(
119
+ resolution.batch,
120
+ resolution.campaign,
121
+ );
122
+ if (rrsiCanonical(root.ledgerIdentity) !== rrsiCanonical(resolution.identity))
123
+ rrsiFail("RRSI cohort belongs to another History journal");
124
+ const childrenByCohort = new Map();
125
+ for (const child of batch.children) {
126
+ if (!childrenByCohort.has(child.cohortId))
127
+ childrenByCohort.set(child.cohortId, []);
128
+ childrenByCohort.get(child.cohortId).push(child);
129
+ }
130
+ const groups = new Map();
131
+ for (const group of resolution.children)
132
+ if (!groups.has(group.bindings.childId))
133
+ groups.set(group.bindings.childId, group);
134
+ const statisticsRegistration = resolution.statisticsRegistration
135
+ ? buildRrsiNativeStatisticsRegistrationBindings(
136
+ resolution.statisticsRegistration,
137
+ resolution.reservationRecord,
138
+ )
139
+ : null;
140
+ return Object.freeze({
141
+ build(cohortId) {
142
+ return deriveRrsiCohortRegistration(
143
+ root,
144
+ resolution,
145
+ batch,
146
+ childrenByCohort.get(cohortId) ?? [],
147
+ groups,
148
+ cohortId,
149
+ statisticsRegistration,
150
+ );
151
+ },
152
+ });
153
+ }
154
+
155
+ function deriveRrsiCohortRegistration(
156
+ root,
157
+ resolution,
158
+ batch,
159
+ sourceChildren,
160
+ groups,
161
+ cohortId,
162
+ statisticsRegistration,
163
+ ) {
164
+ const children = [...sourceChildren].sort((a, b) =>
165
+ a.slotId < b.slotId ? -1 : a.slotId > b.slotId ? 1 : 0,
166
+ );
167
+ if (!children.length)
168
+ rrsiFail("RRSI cohort is outside the committed native batch");
169
+ const first = children[0];
170
+ const queryStreamId = rrsiEvalQueryStreamId(root, resolution);
171
+ const plan = rrsiEnvelope(
172
+ statisticsRegistration
173
+ ? RRSI_COHORT_PLAN_V2_SCHEMA
174
+ : RRSI_COHORT_PLAN_SCHEMA,
175
+ "planDigest",
176
+ {
177
+ campaignRootDigest: root.campaignRootDigest,
178
+ campaignDigest: batch.campaignDigest,
179
+ batchDigest: batch.batchDigest,
180
+ nativeEvaluationPlanDigest: batch.nativeEvaluationPlanDigest,
181
+ evaluationMappingDigest: batch.evaluationMappingDigest,
182
+ nativePlanDigest: first.nativePlanDigest,
183
+ candidateDigest: batch.candidate.candidateDigest,
184
+ rrsiAggregateContentDigest: batch.candidate.contentDigest,
185
+ nativeCandidateContents: batch.nativeCandidateContents,
186
+ versions: batch.versions,
187
+ lifecycleDigests: batch.lifecycleDigests,
188
+ queryOrdinal: resolution.queryOrdinal,
189
+ queryStreamId,
190
+ stage: batch.stage,
191
+ role: first.role,
192
+ variant: first.variant,
193
+ pairId: first.pairId,
194
+ variantMappingDigest: first.variantMappingDigest,
195
+ recipeDigest: first.recipeDigest,
196
+ costAttribution: batch.costAttribution,
197
+ executionCountSemantics: batch.executionCountSemantics,
198
+ productionAdmissionVerified: false,
199
+ ...(statisticsRegistration ? { statisticsRegistration } : {}),
200
+ },
201
+ );
202
+ const denominator = Object.fromEntries(
203
+ Object.keys(first.byArm).map((arm) => [
204
+ arm,
205
+ Object.fromEntries(
206
+ Object.keys(first.plannedObservationsPerArmByPartition).map(
207
+ (partition) => [
208
+ partition,
209
+ children.reduce(
210
+ (sum, child) =>
211
+ sum + child.plannedObservationsPerArmByPartition[partition],
212
+ 0,
213
+ ),
214
+ ],
215
+ ),
216
+ ),
217
+ ]),
218
+ );
219
+ const childBindings = children.map((child) => {
220
+ const group = groups.get(child.childId);
221
+ if (!group) rrsiFail("RRSI cohort has no reserved paired child");
222
+ return {
223
+ slotId: child.slotId,
224
+ childId: child.childId,
225
+ bindings: group.bindings,
226
+ expectedContext: child.expectedContext,
227
+ evaluationContextDigest: child.evaluationContextDigest,
228
+ reservationDigestsByArm: group.bindings.armReservationDigests,
229
+ };
230
+ });
231
+ const manifest = rrsiEnvelope(
232
+ statisticsRegistration
233
+ ? RRSI_COHORT_MANIFEST_V2_SCHEMA
234
+ : RRSI_COHORT_MANIFEST_SCHEMA,
235
+ "manifestDigest",
236
+ {
237
+ cohortId,
238
+ planDigest: plan.planDigest,
239
+ batchDigest: batch.batchDigest,
240
+ campaignRootDigest: root.campaignRootDigest,
241
+ queryOrdinal: resolution.queryOrdinal,
242
+ queryStreamId,
243
+ reservationRecord: resolution.reservationRecord,
244
+ slotIds: children.map((child) => child.slotId),
245
+ childBindings,
246
+ allCohortIds: [
247
+ ...new Set(batch.children.map((child) => child.cohortId)),
248
+ ].sort(),
249
+ plannedObservationsPerArmByPartition: denominator,
250
+ denominatorSemantics: "complete-validation-and-test-paired-attempts/v1",
251
+ nativeExecutionDenominatorVerified: false,
252
+ ...(statisticsRegistration ? { statisticsRegistration } : {}),
253
+ },
254
+ );
255
+ const slots = children.map((child) => ({
256
+ slotId: child.slotId,
257
+ evaluationPlanDigest: child.nativePlanDigest,
258
+ requestDigest: child.requestDigest,
259
+ policyDigest: child.expectedContext.policyDigest,
260
+ evaluationAuthorityRoot: child.expectedContext.evaluationAuthorityRoot,
261
+ }));
262
+ return { plan, manifest, slots };
263
+ }
264
+
265
+ export function normalizeRrsiCohortLookup(input) {
266
+ const lookup = snapshotRrsiData(input);
267
+ rrsiExact(
268
+ lookup,
269
+ ["schema", "batchDigest", "cohortId"],
270
+ "RRSI cohort registration reference",
271
+ );
272
+ if (lookup.schema !== RRSI_COHORT_REGISTRATION_SCHEMA)
273
+ rrsiFail("RRSI registration schema differs");
274
+ return lookup;
275
+ }