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
@@ -0,0 +1,330 @@
1
+ /** Candidate-independent statistical scope. History must authenticate its registration. */
2
+ import { isProxy } from "node:util/types";
3
+ import { verifyRrsiCampaign } from "./rrsi-contracts.js";
4
+ import {
5
+ verifySkillDependencyLock,
6
+ verifySkillRuntimeManifest,
7
+ verifySkillTargetMatrix,
8
+ } from "./skill-execution-manifest.js";
9
+ import {
10
+ buildRrsiGroupStatisticsSourceComponents,
11
+ RRSI_BOUNDED_CLUSTER_METHOD,
12
+ RRSI_CLUSTER_ENVELOPE_METHOD,
13
+ } from "./rrsi-group-statistics.js";
14
+ import { normalizeRrsiNativeEvaluationBatch } from "./rrsi-native-evaluation-batch.js";
15
+ import { buildRrsiNativeGroupStatisticsPlan } from "./rrsi-native-group-statistics-plan.js";
16
+ import {
17
+ snapshotRrsiData,
18
+ rrsiCanonical,
19
+ rrsiHash,
20
+ rrsiEnvelope,
21
+ freezeRrsiData,
22
+ rrsiFail,
23
+ } from "./rrsi-data.js";
24
+
25
+ export const RRSI_NATIVE_STATISTICS_SCOPE_PROTOCOL_SCHEMA =
26
+ "chainlesschain.rrsi-native-statistics-scope-protocol/v1";
27
+ const MAX_BOOTSTRAP_SAMPLES = 1_000_000;
28
+ const MAX_RESAMPLE_OPERATIONS = 50_000_000;
29
+ const STAGES = {
30
+ training: ["train"],
31
+ selection: ["select"],
32
+ generalization: ["gate-validation", "gate-test", "audit"],
33
+ };
34
+ const COMPARISONS = new Set([
35
+ "rrsi-vs-rsi",
36
+ "rrsi-vs-baseline",
37
+ "rsi-vs-baseline",
38
+ ]);
39
+ const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
40
+
41
+ function fields(input, names, label) {
42
+ if (
43
+ !input ||
44
+ isProxy(input) ||
45
+ Object.getPrototypeOf(input) !== Object.prototype ||
46
+ Reflect.ownKeys(input).length !== names.length
47
+ )
48
+ rrsiFail(`${label} requires plain own fields`);
49
+ return Object.fromEntries(
50
+ names.map((name) => {
51
+ const field = Object.getOwnPropertyDescriptor(input, name);
52
+ if (!field?.enumerable || !("value" in field))
53
+ rrsiFail(`${label} cannot use accessors`);
54
+ return [name, field.value];
55
+ }),
56
+ );
57
+ }
58
+
59
+ function verifiedExecutionContract(input, campaign) {
60
+ const execution = fields(
61
+ input,
62
+ ["dependencyLock", "runtimeManifest", "targetMatrix"],
63
+ "native statistics execution contract",
64
+ );
65
+ // Original manifest validators accept their own null-prototype records and
66
+ // copy descriptors without executing caller accessors or Proxy traps.
67
+ const dependencyLock = verifySkillDependencyLock(execution.dependencyLock);
68
+ const runtimeManifest = verifySkillRuntimeManifest(execution.runtimeManifest);
69
+ if (
70
+ !execution.targetMatrix ||
71
+ typeof execution.targetMatrix !== "object" ||
72
+ isProxy(execution.targetMatrix)
73
+ )
74
+ rrsiFail("native statistics target matrix requires own data fields");
75
+ const root = Object.getOwnPropertyDescriptor(
76
+ execution.targetMatrix,
77
+ "targetMatrixRoot",
78
+ );
79
+ const cells = Object.getOwnPropertyDescriptor(
80
+ execution.targetMatrix,
81
+ "cells",
82
+ );
83
+ if (!root || !("value" in root) || !cells || !("value" in cells))
84
+ rrsiFail("native statistics target matrix cannot use accessors");
85
+ const targetMatrix = verifySkillTargetMatrix(execution.targetMatrix, {
86
+ dependencyLock,
87
+ runtimeManifest,
88
+ expectedTargetMatrixRoot: root.value,
89
+ expectedEnvironmentBindings: cells.value,
90
+ });
91
+ if (targetMatrix.tenantId !== campaign.tenantId)
92
+ rrsiFail("native statistics execution contract belongs to another tenant");
93
+ return { dependencyLock, runtimeManifest, targetMatrix };
94
+ }
95
+
96
+ function executionProjection(input, campaign) {
97
+ const { dependencyLock, runtimeManifest, targetMatrix } =
98
+ verifiedExecutionContract(input, campaign);
99
+ return {
100
+ dependencyLockDigest: dependencyLock.dependencyLockDigest,
101
+ runtimeManifestDigest: runtimeManifest.runtimeManifestDigest,
102
+ targetMatrixRoot: targetMatrix.targetMatrixRoot,
103
+ targets: targetMatrix.cells
104
+ .map((cell) => ({
105
+ slotId: cell.cellId,
106
+ runtimeId: cell.runtimeId,
107
+ targetEnvironmentRef: cell.targetEnvironmentRef,
108
+ environmentDigest: cell.environmentDigest,
109
+ }))
110
+ .sort((a, b) => compare(a.slotId, b.slotId)),
111
+ };
112
+ }
113
+
114
+ /** Convert only independent validator outputs, never stringify caller objects. */
115
+ export function normalizeRrsiNativeStatisticsExecutionContract(input) {
116
+ const options = fields(
117
+ input,
118
+ ["campaign", "execution"],
119
+ "statistics execution normalization",
120
+ );
121
+ const campaign = verifyRrsiCampaign(options.campaign);
122
+ const verified = verifiedExecutionContract(options.execution, campaign);
123
+ return freezeRrsiData(snapshotRrsiData(JSON.parse(JSON.stringify(verified))));
124
+ }
125
+
126
+ function stageDesign(campaign, stage, partitions, targetCount) {
127
+ const variants =
128
+ stage === "training"
129
+ ? ["clean"]
130
+ : ["clean", ...campaign.experiment.perturbations];
131
+ const comparisons = campaign.experiment.comparisons.map((id) => {
132
+ const [leftArm, rightArm] = id.split("-vs-");
133
+ return { id, leftArm, rightArm };
134
+ });
135
+ const pools = partitions.map((partition) => ({
136
+ partition,
137
+ partitionDigest: campaign.dataset.pools[partition].partitionDigest,
138
+ taskCount: campaign.dataset.pools[partition].taskCount,
139
+ components: buildRrsiGroupStatisticsSourceComponents(campaign, partition),
140
+ }));
141
+ const hypothesisCount =
142
+ comparisons.length * partitions.length * variants.length * targetCount;
143
+ const alphaPerHypothesis = campaign.experiment.familyAlpha / hypothesisCount;
144
+ const tailReplicates =
145
+ (campaign.experiment.bootstrapSamples * alphaPerHypothesis) / 2;
146
+ const resampleOperations =
147
+ pools.reduce((sum, pool) => sum + pool.components.length, 0) *
148
+ variants.length *
149
+ comparisons.length *
150
+ campaign.experiment.bootstrapSamples *
151
+ targetCount;
152
+ if (resampleOperations > MAX_RESAMPLE_OPERATIONS)
153
+ rrsiFail(
154
+ `complete native statistics ${stage} family exceeds resampling operation limit`,
155
+ "CC_RRSI_BUDGET_EXCEEDED",
156
+ );
157
+ return {
158
+ stage,
159
+ seeds: campaign.experiment.seeds,
160
+ variants,
161
+ comparisons,
162
+ pools,
163
+ familyDefinition:
164
+ "comparisons-times-partitions-times-variants-times-targets/v1",
165
+ familyAlpha: campaign.experiment.familyAlpha,
166
+ hypothesisCount,
167
+ alphaPerHypothesis,
168
+ bootstrapSamples: campaign.experiment.bootstrapSamples,
169
+ bootstrapTailReplicates: tailReplicates,
170
+ bootstrapTailResolutionSufficient: tailReplicates >= 25,
171
+ resampleOperations,
172
+ decision: "HOLD",
173
+ blockingReasons:
174
+ tailReplicates >= 25 ? [] : ["INSUFFICIENT_BOOTSTRAP_TAIL_RESOLUTION"],
175
+ };
176
+ }
177
+
178
+ function scopeProtocol(campaign, execution) {
179
+ if (campaign.candidateKind !== "skill")
180
+ rrsiFail("native statistics scope requires a Skill campaign");
181
+ if (campaign.experiment.bootstrapSamples > MAX_BOOTSTRAP_SAMPLES)
182
+ rrsiFail("native statistical protocol exceeds the interval kernel bound");
183
+ if (
184
+ campaign.experiment.perturbations.includes("clean") ||
185
+ campaign.experiment.comparisons.some((id) => !COMPARISONS.has(id))
186
+ )
187
+ rrsiFail(
188
+ "native statistics scope has an unsupported variant or comparison",
189
+ );
190
+ if (
191
+ execution.targets.some(
192
+ (target) =>
193
+ target.environmentDigest !== campaign.execution.environmentDigest,
194
+ )
195
+ )
196
+ rrsiFail("native statistics target environment differs from campaign");
197
+ const stages = Object.fromEntries(
198
+ Object.entries(STAGES).map(([stage, partitions]) => [
199
+ stage,
200
+ stageDesign(campaign, stage, partitions, execution.targets.length),
201
+ ]),
202
+ );
203
+ const protocol = rrsiEnvelope(
204
+ RRSI_NATIVE_STATISTICS_SCOPE_PROTOCOL_SCHEMA,
205
+ "protocolDigest",
206
+ {
207
+ // Campaign aliases and per-query candidate/native plan identities do not
208
+ // create a new scope. Every fixed scientific and execution input does.
209
+ campaignScope: {
210
+ tenantId: campaign.tenantId,
211
+ goalId: campaign.goalId,
212
+ candidateKind: campaign.candidateKind,
213
+ sourceCommitSha: campaign.sourceCommitSha,
214
+ parentReleaseDigest: campaign.parentReleaseDigest,
215
+ anchorReleaseDigest: campaign.anchorReleaseDigest,
216
+ policyDigest: campaign.policy.policyDigest,
217
+ datasetDigest: campaign.dataset.datasetDigest,
218
+ execution: campaign.execution,
219
+ budgetDigest: rrsiHash(
220
+ "chainlesschain.rrsi-root-budget/v1",
221
+ campaign.budget,
222
+ ),
223
+ experiment: campaign.experiment,
224
+ },
225
+ execution,
226
+ stages,
227
+ fixedPairReplicasPerTaskSeedArm: 2,
228
+ aggregationMethod:
229
+ "mean-fixed-pair-replicas-then-seeds-then-task-weighted-source-components/v2",
230
+ successDefinition:
231
+ "reported-pass-and-zero-security-and-permission-violations/v2",
232
+ manualRemediationMeasured: false,
233
+ randomnessCommitment: campaign.experiment.randomnessCommitment,
234
+ resamplingUnit: "task-group-component",
235
+ bootstrapMethod: "task-weighted-cluster-percentile/v1",
236
+ boundedMethod: RRSI_BOUNDED_CLUSTER_METHOD,
237
+ intervalMethod: RRSI_CLUSTER_ENVELOPE_METHOD,
238
+ minimumIndependentGroups: campaign.policy.thresholds.minIndependentGroups,
239
+ stoppingRule: "fixed-full-denominator-no-interim-acceptance",
240
+ maxBootstrapSamples: MAX_BOOTSTRAP_SAMPLES,
241
+ maxResampleOperations: MAX_RESAMPLE_OPERATIONS,
242
+ operationLimitScope: "complete-family-per-stage/v1",
243
+ alphaControlScope: "per-stage-family-not-across-adaptive-queries/v1",
244
+ decision: "HOLD",
245
+ preObservationRegistrationVerified: false,
246
+ sourceIndependenceVerified: false,
247
+ perturbationSemanticsVerified: false,
248
+ statisticalProtocolValidated: false,
249
+ },
250
+ );
251
+ snapshotRrsiData(protocol);
252
+ return protocol;
253
+ }
254
+
255
+ /** Works before preparation: no candidate, batch, native plan or result is accepted. */
256
+ export function buildRrsiNativeStatisticsScopeProtocol(input) {
257
+ const options = fields(input, ["campaign", "execution"], "statistics scope");
258
+ const campaign = verifyRrsiCampaign(options.campaign);
259
+ return scopeProtocol(
260
+ campaign,
261
+ executionProjection(options.execution, campaign),
262
+ );
263
+ }
264
+
265
+ export function verifyRrsiNativeStatisticsScopeProtocol(protocol, context) {
266
+ const rebuilt = buildRrsiNativeStatisticsScopeProtocol(context);
267
+ if (rrsiCanonical(snapshotRrsiData(protocol)) !== rrsiCanonical(rebuilt))
268
+ rrsiFail("native statistics scope protocol differs");
269
+ return rebuilt;
270
+ }
271
+
272
+ /** Structural match only. Genuine History separately proves registration order. */
273
+ export function assertRrsiNativeStatisticsScopeBatch(protocol, context) {
274
+ const options = fields(
275
+ context,
276
+ ["campaign", "batch"],
277
+ "statistics scope batch",
278
+ );
279
+ const campaign = verifyRrsiCampaign(options.campaign);
280
+ const batch = normalizeRrsiNativeEvaluationBatch(options.batch, campaign);
281
+ const expected = scopeProtocol(campaign, {
282
+ dependencyLockDigest: batch.parentIdentity.dependencyLockDigest,
283
+ runtimeManifestDigest: batch.parentIdentity.runtimeManifestDigest,
284
+ targetMatrixRoot: batch.parentIdentity.targetMatrixRoot,
285
+ targets: batch.targetIdentity
286
+ .map(([slotId, runtimeId, targetEnvironmentRef, environmentDigest]) => ({
287
+ slotId,
288
+ runtimeId,
289
+ targetEnvironmentRef,
290
+ environmentDigest,
291
+ }))
292
+ .sort((a, b) => compare(a.slotId, b.slotId)),
293
+ });
294
+ if (rrsiCanonical(snapshotRrsiData(protocol)) !== rrsiCanonical(expected))
295
+ rrsiFail("native batch changes the frozen statistics scope protocol");
296
+ const plan = buildRrsiNativeGroupStatisticsPlan({ campaign, batch });
297
+ for (const field of [
298
+ "seeds",
299
+ "variants",
300
+ "comparisons",
301
+ "pools",
302
+ "familyAlpha",
303
+ "hypothesisCount",
304
+ "alphaPerHypothesis",
305
+ "bootstrapSamples",
306
+ "bootstrapTailReplicates",
307
+ "bootstrapTailResolutionSufficient",
308
+ "resampleOperations",
309
+ ])
310
+ if (
311
+ rrsiCanonical(plan[field]) !==
312
+ rrsiCanonical(expected.stages[batch.stage][field])
313
+ )
314
+ rrsiFail(`native statistics plan changes the frozen ${field}`);
315
+ for (const field of [
316
+ "fixedPairReplicasPerTaskSeedArm",
317
+ "aggregationMethod",
318
+ "successDefinition",
319
+ "manualRemediationMeasured",
320
+ "randomnessCommitment",
321
+ "resamplingUnit",
322
+ "bootstrapMethod",
323
+ "boundedMethod",
324
+ "minimumIndependentGroups",
325
+ "stoppingRule",
326
+ ])
327
+ if (rrsiCanonical(plan[field]) !== rrsiCanonical(expected[field]))
328
+ rrsiFail(`native statistics plan changes the frozen ${field}`);
329
+ return plan;
330
+ }
@@ -0,0 +1,290 @@
1
+ /** Effective Skill parent readback binding; never replaces mutation CAS or admission. */
2
+ import { isProxy } from "node:util/types";
3
+ import { captureSkillReleaseRegistryReader } from "./skill-release-registry.js";
4
+ import { verifyRrsiCampaign } from "./rrsi-contracts.js";
5
+ import {
6
+ captureRrsiRegistryHistoryBinding,
7
+ recheckRrsiRegistryHistoryBinding,
8
+ } from "./rrsi-registry-history-binding.js";
9
+ import {
10
+ snapshotRrsiData,
11
+ rrsiExact,
12
+ rrsiDigest,
13
+ rrsiInteger,
14
+ rrsiCanonical,
15
+ rrsiEnvelope,
16
+ rrsiFail,
17
+ } from "./rrsi-data.js";
18
+
19
+ export const RRSI_PARENT_BINDING_SCHEMA =
20
+ "chainlesschain.rrsi-effective-parent-binding/v1";
21
+ export const RRSI_PARENT_READBACK_SCHEMA =
22
+ "chainlesschain.rrsi-effective-parent-readback/v1";
23
+ export const RRSI_PARENT_BINDING_V2_SCHEMA =
24
+ "chainlesschain.rrsi-effective-parent-binding/v2";
25
+ export const RRSI_PARENT_READBACK_V2_SCHEMA =
26
+ "chainlesschain.rrsi-effective-parent-readback/v2";
27
+ const BINDINGS = new WeakMap();
28
+
29
+ function options(input, extraKeys = []) {
30
+ const keys = [
31
+ "campaign",
32
+ "releaseRegistry",
33
+ "transactionLedger",
34
+ "expectedParent",
35
+ ...extraKeys,
36
+ ];
37
+ if (
38
+ !input ||
39
+ typeof input !== "object" ||
40
+ isProxy(input) ||
41
+ Object.getPrototypeOf(input) !== Object.prototype ||
42
+ Reflect.ownKeys(input).length !== keys.length
43
+ )
44
+ rrsiFail("effective parent composition requires plain own fields");
45
+ return Object.fromEntries(
46
+ keys.map((key) => {
47
+ const field = Object.getOwnPropertyDescriptor(input, key);
48
+ if (!field?.enumerable || !("value" in field))
49
+ rrsiFail("effective parent composition cannot use accessors");
50
+ return [key, field.value];
51
+ }),
52
+ );
53
+ }
54
+
55
+ function readParent(reader, campaign, expected) {
56
+ const current = reader.readActive(campaign.goalId);
57
+ if (
58
+ !current ||
59
+ current.state.tenantId !== campaign.tenantId ||
60
+ current.release.tenantId !== campaign.tenantId ||
61
+ current.state.skillName !== campaign.goalId ||
62
+ current.release.skillName !== campaign.goalId ||
63
+ current.state.activeReleaseDigest !== campaign.parentReleaseDigest ||
64
+ current.release.releaseDigest !== campaign.parentReleaseDigest ||
65
+ current.state.revision !== expected.revision ||
66
+ current.state.stateDigest !== expected.stateDigest ||
67
+ current.release.contentDigest !== expected.contentDigest
68
+ )
69
+ rrsiFail(
70
+ "effective parent differs from frozen active release, content or revision",
71
+ "CC_RRSI_PARENT_DRIFT",
72
+ );
73
+ // Preserve the campaign's initial anchor even when the registry LKG moves.
74
+ // A readable release does not prove activation, stability or suitability.
75
+ const parent = reader.readRelease(campaign.parentReleaseDigest);
76
+ const anchor = reader.readRelease(campaign.anchorReleaseDigest);
77
+ if (
78
+ rrsiCanonical(parent) !== rrsiCanonical(current.release) ||
79
+ anchor.tenantId !== campaign.tenantId ||
80
+ anchor.skillName !== campaign.goalId
81
+ )
82
+ rrsiFail(
83
+ "parent or campaign anchor readback differs",
84
+ "CC_RRSI_PARENT_DRIFT",
85
+ );
86
+ // Detect a committed transition during multi-artifact readback. Dispatch and
87
+ // promotion still need the registry's own atomic authorization/CAS boundary.
88
+ const after = reader.readActive(campaign.goalId);
89
+ if (!after || rrsiCanonical(after) !== rrsiCanonical(current))
90
+ rrsiFail(
91
+ "effective parent changed during readback",
92
+ "CC_RRSI_PARENT_DRIFT",
93
+ );
94
+ return {
95
+ parentContentDigest: parent.contentDigest,
96
+ parentCandidateId: parent.candidateId,
97
+ activeRevision: current.state.revision,
98
+ activeStateDigest: current.state.stateDigest,
99
+ stateTransactionId: current.state.transactionId,
100
+ stateAuthorityReceiptDigest: current.state.authorityReceiptDigest,
101
+ stateFence: current.state.fence,
102
+ lastKnownGoodReleaseDigest: current.state.lastKnownGoodReleaseDigest,
103
+ dependencyLockDigest: parent.dependencyLockDigest,
104
+ runtimeManifestDigest: parent.runtimeManifestDigest,
105
+ targetMatrixRoot: parent.targetMatrixRoot,
106
+ targetRuntimes: parent.targetRuntimes,
107
+ anchorContentDigest: anchor.contentDigest,
108
+ anchorIdentity: {
109
+ candidateId: anchor.candidateId,
110
+ dependencyLockDigest: anchor.dependencyLockDigest,
111
+ runtimeManifestDigest: anchor.runtimeManifestDigest,
112
+ targetMatrixRoot: anchor.targetMatrixRoot,
113
+ targetRuntimes: anchor.targetRuntimes,
114
+ },
115
+ };
116
+ }
117
+
118
+ export function createRrsiEffectiveParentBinding(input) {
119
+ const value = options(input);
120
+ const campaign = verifyRrsiCampaign(snapshotRrsiData(value.campaign));
121
+ if (campaign.candidateKind !== "skill")
122
+ rrsiFail(
123
+ "Skill release parent adapter cannot authenticate a Memory-policy parent",
124
+ );
125
+ const reader = captureSkillReleaseRegistryReader(value.releaseRegistry);
126
+ if (reader.tenantId !== campaign.tenantId)
127
+ rrsiFail("effective parent registry belongs to another tenant");
128
+ if (
129
+ !value.transactionLedger ||
130
+ !reader.matchesTransactionLedger(value.transactionLedger)
131
+ )
132
+ rrsiFail("effective parent registry uses another transaction Ledger");
133
+ const expected = snapshotRrsiData(value.expectedParent);
134
+ rrsiExact(
135
+ expected,
136
+ ["revision", "stateDigest", "contentDigest"],
137
+ "frozen effective parent",
138
+ );
139
+ rrsiInteger(expected.revision, "effective parent revision", 1);
140
+ rrsiDigest(expected.stateDigest, "effective parent state digest");
141
+ rrsiDigest(expected.contentDigest, "effective parent content digest");
142
+ const identity = readParent(reader, campaign, expected);
143
+ const descriptor = rrsiEnvelope(
144
+ RRSI_PARENT_BINDING_SCHEMA,
145
+ "parentBindingDigest",
146
+ {
147
+ campaignDigest: campaign.campaignDigest,
148
+ tenantId: campaign.tenantId,
149
+ skillName: campaign.goalId,
150
+ candidateKind: campaign.candidateKind,
151
+ parentReleaseDigest: campaign.parentReleaseDigest,
152
+ anchorReleaseDigest: campaign.anchorReleaseDigest,
153
+ ...identity,
154
+ registryReadbackVerified: true,
155
+ transactionLedgerBound: true,
156
+ transactionLedgerAuthorityVerified: false,
157
+ productionAuthorityVerified: false,
158
+ anchorPolicy: "frozen-campaign-anchor-artifact-reference",
159
+ anchorArtifactIntegrityVerified: true,
160
+ anchorHistoricalActivationVerified: false,
161
+ anchorStabilityVerified: false,
162
+ anchorRevocationStatusVerified: false,
163
+ anchorDeploymentCompatibilityVerified: false,
164
+ deploymentAdmissionVerified: false,
165
+ historicalStabilityIndependentlyVerified: false,
166
+ sourceProvenanceVerified: false,
167
+ modelPricingAdmissionVerified: false,
168
+ grantsMutationOrDispatchAuthority: false,
169
+ },
170
+ );
171
+ const binding = Object.freeze({ descriptor });
172
+ BINDINGS.set(binding, { reader, campaign, expected, identity });
173
+ return binding;
174
+ }
175
+
176
+ /** Versioned storage association keeps all existing parent and anchor checks. */
177
+ export function createRrsiEffectiveParentBindingV2(input) {
178
+ const value = options(input, ["registryHistoryBinding"]);
179
+ const storage = captureRrsiRegistryHistoryBinding(
180
+ value.registryHistoryBinding,
181
+ );
182
+ recheckRrsiRegistryHistoryBinding(value.registryHistoryBinding);
183
+ if (
184
+ !storage.matchesReleaseRegistry(value.releaseRegistry) ||
185
+ !storage.matchesTransactionLedger(value.transactionLedger)
186
+ )
187
+ rrsiFail(
188
+ "effective parent requires the Registry History binding's actual registry and transaction ports",
189
+ );
190
+ const campaign = verifyRrsiCampaign(value.campaign);
191
+ for (const [field, expected] of [
192
+ ["tenantId", campaign.tenantId],
193
+ ["skillName", campaign.goalId],
194
+ ["parentReleaseDigest", campaign.parentReleaseDigest],
195
+ ["anchorReleaseDigest", campaign.anchorReleaseDigest],
196
+ ])
197
+ if (storage.descriptor[field] !== expected)
198
+ rrsiFail("effective parent differs from the bound History scope");
199
+ const original = createRrsiEffectiveParentBinding({
200
+ campaign: value.campaign,
201
+ releaseRegistry: value.releaseRegistry,
202
+ transactionLedger: value.transactionLedger,
203
+ expectedParent: value.expectedParent,
204
+ });
205
+ const core = Object.fromEntries(
206
+ Object.entries(original.descriptor).filter(
207
+ ([name]) =>
208
+ ![
209
+ "schema",
210
+ "parentBindingDigest",
211
+ "structuralOnly",
212
+ "authenticated",
213
+ "readyForExecution",
214
+ "qualifiesForPromotion",
215
+ ].includes(name),
216
+ ),
217
+ );
218
+ const descriptor = rrsiEnvelope(
219
+ RRSI_PARENT_BINDING_V2_SCHEMA,
220
+ "parentBindingDigest",
221
+ {
222
+ ...core,
223
+ registryHistoryBindingDigest:
224
+ storage.descriptor.registryHistoryBindingDigest,
225
+ ledgerIdentity: storage.descriptor.ledgerIdentity,
226
+ transactionJournalObjectIdentityVerified: true,
227
+ backendArtifactPortsAndResolverIdentityVerified: true,
228
+ registryOriginCutoverAuthenticated: false,
229
+ },
230
+ );
231
+ recheckRrsiRegistryHistoryBinding(value.registryHistoryBinding);
232
+ const binding = Object.freeze({ descriptor });
233
+ BINDINGS.set(binding, {
234
+ ...BINDINGS.get(original),
235
+ registryHistoryBinding: value.registryHistoryBinding,
236
+ });
237
+ return binding;
238
+ }
239
+
240
+ /** The PM bridge passes its captured genuine History, never a descriptor. */
241
+ export function assertRrsiEffectiveParentHistory(binding, history) {
242
+ const state = BINDINGS.get(binding);
243
+ if (!state?.registryHistoryBinding)
244
+ rrsiFail("effective parent requires a genuine Registry History binding");
245
+ if (
246
+ !captureRrsiRegistryHistoryBinding(
247
+ state.registryHistoryBinding,
248
+ ).matchesCapturedHistory(history)
249
+ )
250
+ rrsiFail(
251
+ "effective parent and PM bridge use different genuine History compositions",
252
+ );
253
+ recheckRrsiRegistryHistoryBinding(state.registryHistoryBinding);
254
+ }
255
+
256
+ /** A recovered JSON descriptor is not a live read capability. */
257
+ export function recheckRrsiEffectiveParent(binding) {
258
+ const state = BINDINGS.get(binding);
259
+ if (!state) rrsiFail("a branded live effective-parent binding is required");
260
+ if (state.registryHistoryBinding)
261
+ recheckRrsiRegistryHistoryBinding(state.registryHistoryBinding);
262
+ const identity = readParent(state.reader, state.campaign, state.expected);
263
+ if (rrsiCanonical(identity) !== rrsiCanonical(state.identity))
264
+ rrsiFail(
265
+ "effective parent immutable identity changed",
266
+ "CC_RRSI_PARENT_DRIFT",
267
+ );
268
+ if (state.registryHistoryBinding)
269
+ recheckRrsiRegistryHistoryBinding(state.registryHistoryBinding);
270
+ return rrsiEnvelope(
271
+ state.registryHistoryBinding
272
+ ? RRSI_PARENT_READBACK_V2_SCHEMA
273
+ : RRSI_PARENT_READBACK_SCHEMA,
274
+ "parentReadbackDigest",
275
+ {
276
+ parentBindingDigest: binding.descriptor.parentBindingDigest,
277
+ registryReadbackVerified: true,
278
+ effectiveParentUnchanged: true,
279
+ atomicDispatchOrPromotionAuthorized: false,
280
+ ...(state.registryHistoryBinding
281
+ ? {
282
+ registryHistoryBindingDigest:
283
+ binding.descriptor.registryHistoryBindingDigest,
284
+ originalStorageGraphRechecked: true,
285
+ registryOriginCutoverAuthenticated: false,
286
+ }
287
+ : {}),
288
+ },
289
+ );
290
+ }