chainlesschain 0.166.91 → 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 (209) hide show
  1. package/README.md +17 -17
  2. package/package.json +3 -3
  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-DgV7xb8F.js → AIOps-C74YzqwJ.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-CgANpkKu.js → ActionButton-TFef1hOE.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DnvpX7RB.js → Analytics-CYsWpkkU.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-C2bHccBM.js → AppLayout-CFf9kjwu.js} +3 -3
  9. package/src/assets/web-panel/assets/{Artifacts-BIhijC9g.js → Artifacts-TQqa94YO.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-CKRjWGdp.js → Audit-B79ayqfS.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-CblYtgBE.js → BackgroundAgents-pjkHfLP9.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-Cq35b78a.js → Backup-CE6A-t_r.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-DcB7NoRz.js → BaseInput-CwcgWMBY.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-tc3b-s7i.js → Chat-BIkDNesY.js} +6 -6
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-DgaokYts.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-BLD5bH5u.js → Checkbox-MbypIy5V.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-BLOsoazN.js → Codegen-DiFHWDnt.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-Bdr7JwIx.js → Col-BNMlYMso.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-C84BsWE0.js → Community-B3HVyHOX.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-Dzdwd04z.js → Compact-C7hlAubb.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CCG-R0EV.js → Compliance-PaXZu6sE.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-BYj72SK0.js → Cowork-BGiojbm-.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-B6iKAwOf.js → Cron-Bmr-1QAx.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-BJ-oDC6u.js → Crosschain-BwUvWCVd.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-BnMckGLr.js → DID-k_4QZocW.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-Cyje-gCO.js → Dashboard-_ieRo2C5.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-BpNlenjK.js → Dropdown-DYHh6T27.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-BhonO7Nv.js → EmailListRenderer-BNlQcWQX.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DVoNU-Id.js → EvolutionSettings-DIkZ6U2D.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-tdn-KC67.js → FamilyGuardDashboard-Dq7qSr0P.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation--EEVrHhz.js → Federation-C64e3Cbx.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-Cy8zr0-4.js → FormItemContext-D-GE2vUa.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-BuUhpgFi.js → GenericCardRenderer-DO3B2gis.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-Ctd3E5Pe.js → Git-0ETirIQH.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-Ce7dV6aU.js → Governance-C9fnRygX.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-CD1vExIH.js → Inference-CLJ9RTsK.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Dn64OdQ7.js → KnowledgeGraph-D3C_GxrN.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-PmElVRrT.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-OW4jTXwx.js → Marketplace-GF_t6hJ_.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-BEq2Ib4x.js → McpTools-BGsGzgQs.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Can_P2oK.js → Memory-CcrY2A0j.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DJ8R-dn3.js → MobileBridge-Bi4T0RlS.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-B7kV9GOt.js → MobileProjects-DvjEGyvf.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-BfxamolS.js → Mtc-DL77Vf-k.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-DHtuv7av.js → MtcAudit-CDy_Uswb.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DLkLpvxc.js → Multisig-DL0BAO_c.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-u4XtJTIt.js → NLProgramming-B-woh5IR.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BwuuPJLS.js → Notes-CEFVCxk7.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-HEeu-E9v.js → NotificationSettings-BqPPMuAP.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-BtvN-Qwh.js → OrderTableRenderer-GUKQ1xwp.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-Yh-czs3b.js → Organization-B1gX8jlr.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DmE8mYVM.js → Overflow-CeMxuUZy.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-CWVck8WN.js → P2P-B5aIRWwJ.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-DgFqekod.js → PdhVaultBrowser-6rYgejd4.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-BtJBVOHV.js → Permissions-CqCp2SIl.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-6VBObXzd.js → PersonalDataHub-BsA7DJWW.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline-D222FmqY.js → Pipeline-CiW6HeZh.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-Bi9FMikp.js → Privacy-DckUOLYq.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-Bo52H47H.js → ProjectInit-CZppOOYR.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-BPkesfOc.js → ProjectSettings-B9QPzhDU.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-GynohSFX.js → Projects-BErjjGha.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DVdMg04n.js → Providers-DehU6Qiz.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-DqJCb595.js → QrScannerModal-E1SUvv1m.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-J7loQbXi.js → QuickAsk-COWFxyH3.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BI5aURVc.js → Recommend-D26pWKxX.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BN2sqGvz.js → RemoteSession-DCOIaId3.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-BGOND-Fi.js → Reputation-DT_AHGAR.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-77dfwaUk.js → Row-B50S-1nl.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-FtBAxS3g.js → RssFeed-BaBnHg3Q.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-BaYVLFb7.js → Search-BVdnLuuS.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-LE3Vv6ab.js → Security-BnacH74J.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-C5pP-Whz.js → Services-CxM08Zch.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CLqKUVsF.js → Skeleton-DE7CIc1N.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-BPjN0SX5.js → Skills-CGI0SJmf.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-14jD70kg.js → Sla-DpEzPcqc.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Dr9ij42W.js → SpeechSettings-CTmnmMHn.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BzLHP7B8.js → SyncSettings-Dxgrd9hd.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-YqV9b0rV.js → Tasks-CW4slS0A.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-CxxAE4PK.js → Templates-DxvGWDgB.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CRb3PcKJ.js → Tenant-_Q0o2tNK.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CTzPpBaP.js → Terminal-BTZn8pow.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-DjFUj_hy.js → TimelineRenderer-CauL0KFe.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-Bbb8tPvx.js → Tokens-CDoM2qeT.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-CSeWGM0W.js → Trigger-B-QYGEU7.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-JgESMBo3.js → Trust-BD6XJHT-.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CiObLk0T.js → UkeySign-x4TFwCy0.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-CFEZaQ2x.js → VideoEditing-t3imBK_0.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-DR8ZGDNn.js → Wallet-BCfkWwNC.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DxZukvu7.js → WebAuthn-WH314Mdm.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-CKgSZQwn.js → WorkflowEditor-jUlcjrUg.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CTxEQE66.js → chat-Dg3VASTL.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-CAjKMUu3.js → colors-BNvmBRKE.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BXuz49at.js → compact-item-BGOfoqf4.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-CFN_Hwr9.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-BwoSBSfP.js → hasIn-Bg3AjCrq.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-u9_DM3ZC.js → index--I3UF5t1.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-IahILygB.js → index-2D04Zltx.js} +3 -3
  100. package/src/assets/web-panel/assets/{index-Bqv_Cray.js → index-60AnjUTX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CSmFby3Q.js → index-7QJUWemf.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DTX9CJPx.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-C8er4W9u.js → index-B0mgngoB.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DViK2bkv.js → index-BBCMulQ-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DmkbAADP.js → index-BSNhW95G.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-B2tEnBPx.js → index-B_JmInC0.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-_ZtCyUdz.js → index-BaPvEvB4.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CN53dE_u.js → index-Bkz1tgFR.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Bj4hIiLW.js → index-BmTacaQV.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Tz5dheZa.js → index-CCFZN66A.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dv7V2kg6.js → index-COol3xfA.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Bu2P6u8m.js → index-CY8cRKHR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Bw9s2d3c.js → index-Cbp-wp-U.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-B9yR7zqr.js → index-Co_LnCWD.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BK4ftQ4d.js → index-Cx2EXRfr.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DxunxaTw.js → index-D-mSvCQK.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B7kp-zRE.js → index-D072oLjp.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CB3kVd9c.js → index-D6UqK83L.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CF9lWi1o.js → index-DF_FKSVH.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-IY9bd5az.js → index-DLwEXRrb.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-F2E5RCwz.js → index-DO0VlNtc.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-B2o_BBjg.js → index-DS04wRll.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DY-gBSm8.js → index-DYn5DnDk.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B0QbLlWn.js → index-D_O2ZjPk.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DjF5BOZx.js → index-DcCnO0RU.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CehdwJ_Q.js → index-Dkp-okWa.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BmXpdcHI.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-t2Ch_JKn.js → index-Wo0f2iqb.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-T3MTE6jB.js → index-ZD5Kd8tx.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Cp5y7lX_.js → index-fOwii3LP.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Cgk0YEiq.js → index-hG7jXGEW.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DpdDnZX_.js → index-pVdQieac.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-o9DpkZKf.js → index-uH2LnAs_.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BmQITjMU.js → index-xzaUx19r.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BoiGJDoO.js → initDefaultProps-B8PN9AxJ.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-5eL4E0pA.js → motion-BHivfw5Q.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-DjggDi_1.js → move-B0QU5nDd.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-Ce8Vo2T3.js → mtc-parser-DRwRM3PE.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-D1yOBaO2.js → omit-SHt2rV2p.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-8NLceQe8.js → pickAttrs-CcmDlEb2.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CsIdBRmQ.js → placementArrow-DYatmXDS.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-GM5NE8En.js → responsiveObserve-B7qrsXq5.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-44yj3u49.js → slide-BRGhlOWd.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-B8tqtWcX.js → statusUtils-CT-7NXsQ.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-NhDPBbyB.js → styleChecker-rZdw_Yyp.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-C8Qz1GtN.js → useFlexGapSupport-D8YNIP4P.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-ClUv4kih.js → useFs-B8pt0Gu-.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BwkOVEh6.js → usePersonalDataHub-VMmYM1tt.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode--gMF33R0.js → vnode-UNDuoPoq.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-DXg3TqOP.js → zoom-dN-u667S.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/data/changelog.json +39 -0
  155. package/src/lib/evolution/evolution-artifact-ports.js +26 -0
  156. package/src/lib/evolution/evolution-eval-cohort-enrollment.js +713 -47
  157. package/src/lib/evolution/evolution-eval-gate.js +146 -0
  158. package/src/lib/evolution/evolution-eval-launch-admission.js +168 -90
  159. package/src/lib/evolution/evolution-eval-ledger-capture.js +50 -0
  160. package/src/lib/evolution/evolution-eval-readonly-audit.js +106 -0
  161. package/src/lib/evolution/evolution-ledger-file-backend.js +20 -0
  162. package/src/lib/evolution/evolution-ledger-ports.js +59 -27
  163. package/src/lib/evolution/evolution-ledger-v2-journal.js +55 -18
  164. package/src/lib/evolution/evolution-workbench-file-resources.js +19 -1
  165. package/src/lib/evolution/rrsi-cohort-registration.js +275 -0
  166. package/src/lib/evolution/rrsi-contracts.js +742 -0
  167. package/src/lib/evolution/rrsi-data.js +196 -0
  168. package/src/lib/evolution/rrsi-evaluation-adapter.js +275 -0
  169. package/src/lib/evolution/rrsi-evaluation-variants.js +267 -0
  170. package/src/lib/evolution/rrsi-group-statistics.js +553 -0
  171. package/src/lib/evolution/rrsi-history-ledger-adapter.js +3261 -0
  172. package/src/lib/evolution/rrsi-native-batch-evidence.js +520 -0
  173. package/src/lib/evolution/rrsi-native-eval-row-collector.js +538 -0
  174. package/src/lib/evolution/rrsi-native-evaluation-batch.js +547 -0
  175. package/src/lib/evolution/rrsi-native-evaluation-plan.js +431 -0
  176. package/src/lib/evolution/rrsi-native-group-statistics-plan.js +121 -0
  177. package/src/lib/evolution/rrsi-native-group-statistics.js +482 -0
  178. package/src/lib/evolution/rrsi-native-quality-receipt-contracts.js +321 -0
  179. package/src/lib/evolution/rrsi-native-quality-receipt.js +256 -0
  180. package/src/lib/evolution/rrsi-native-statistics-protocol.js +330 -0
  181. package/src/lib/evolution/rrsi-parent-binding.js +290 -0
  182. package/src/lib/evolution/rrsi-pm-execution-bridge.js +500 -0
  183. package/src/lib/evolution/rrsi-pm-training-mapping.js +134 -0
  184. package/src/lib/evolution/rrsi-preparation-contracts.js +213 -0
  185. package/src/lib/evolution/rrsi-registry-history-binding.js +193 -0
  186. package/src/lib/evolution/rrsi-registry-store-policy.js +1191 -0
  187. package/src/lib/evolution/rrsi-runtime-composition.js +79 -0
  188. package/src/lib/evolution/rrsi-selector.js +434 -0
  189. package/src/lib/evolution/rrsi-statistics-simulation.js +354 -0
  190. package/src/lib/evolution/skill-candidate-registry.js +216 -29
  191. package/src/lib/evolution/skill-registry-maintenance.js +80 -0
  192. package/src/lib/evolution/skill-registry-writer-control.js +138 -0
  193. package/src/lib/evolution/skill-release-registry.js +399 -169
  194. package/src/lib/formal-quality-eval-runtime.js +2 -14
  195. package/src/lib/goal-store.js +225 -16
  196. package/src/lib/record-replay/skill-recorder.js +38 -3
  197. package/src/lib/scheduler-kernel/authority-resolver.js +12 -163
  198. package/src/lib/scheduler-kernel/contract.js +27 -414
  199. package/src/lib/scheduler-kernel/runtime.js +21 -823
  200. package/src/lib/scheduler-kernel/service.js +11 -328
  201. package/src/lib/scheduler-kernel/source-locator-path.js +7 -142
  202. package/src/lib/scheduler-kernel/store.js +67 -5931
  203. package/src/lib/secure-fs.js +16 -1314
  204. package/src/lib/with-file-lock.js +122 -20
  205. package/src/assets/web-panel/assets/ChatBubbleRenderer-fcc_Tvqu.js +0 -1
  206. package/src/assets/web-panel/assets/MarkdownRenderer-BFiVKf5t.js +0 -1
  207. package/src/assets/web-panel/assets/devWarning-CfB8DxT2.js +0 -1
  208. package/src/assets/web-panel/assets/index-CCsRfd0k.js +0 -1
  209. package/src/assets/web-panel/assets/index-CsmiZIQ4.js +0 -1
@@ -0,0 +1,553 @@
1
+ /** Versioned descriptive statistics. Conditional bounds are not admission. */
2
+ import { verifyRrsiCampaign, RRSI_GROUP_DIMENSIONS } from "./rrsi-contracts.js";
3
+ import {
4
+ snapshotRrsiData,
5
+ rrsiExact,
6
+ rrsiDigest,
7
+ rrsiInteger,
8
+ rrsiFinite,
9
+ rrsiBoolean,
10
+ rrsiId,
11
+ rrsiCanonical,
12
+ rrsiHash,
13
+ rrsiEnvelope,
14
+ freezeRrsiData,
15
+ rrsiFail,
16
+ } from "./rrsi-data.js";
17
+
18
+ export const RRSI_GROUP_STATISTICS_PLAN_SCHEMA =
19
+ "chainlesschain.rrsi-group-statistics-plan/v1";
20
+ export const RRSI_GROUP_STATISTICS_REPORT_SCHEMA =
21
+ "chainlesschain.rrsi-group-statistics-report/v1";
22
+ export const RRSI_BOUNDED_CLUSTER_METHOD =
23
+ "weighted-independent-bounded-clusters-hoeffding-two-sided/v1";
24
+ export const RRSI_CLUSTER_ENVELOPE_METHOD =
25
+ "outer-envelope-of-cluster-bootstrap-and-conditional-bounded-interval/v1";
26
+ const STAGES = {
27
+ training: ["train"],
28
+ selection: ["select"],
29
+ generalization: ["gate-validation", "gate-test", "audit"],
30
+ };
31
+ const MAX_RESAMPLE_OPERATIONS = 50_000_000;
32
+ const OUTCOMES = ["succeeded", "failed", "cancelled", "not-started", "unknown"];
33
+
34
+ /** Pure component projection; callers verify their campaign first. */
35
+ export function buildRrsiGroupStatisticsSourceComponents(campaign, partition) {
36
+ const tasks = campaign.dataset.tasks.filter(
37
+ (task) => task.partition === partition,
38
+ );
39
+ const parents = tasks.map((_, index) => index);
40
+ const find = (index) => {
41
+ while (parents[index] !== index) {
42
+ parents[index] = parents[parents[index]];
43
+ index = parents[index];
44
+ }
45
+ return index;
46
+ };
47
+ const owners = new Map();
48
+ tasks.forEach((task, index) => {
49
+ for (const dimension of RRSI_GROUP_DIMENSIONS) {
50
+ const key = `${dimension}:${task.groups[dimension]}`;
51
+ if (owners.has(key)) parents[find(index)] = find(owners.get(key));
52
+ else owners.set(key, index);
53
+ }
54
+ });
55
+ const grouped = new Map();
56
+ tasks.forEach((task, index) => {
57
+ const root = find(index);
58
+ if (!grouped.has(root)) grouped.set(root, []);
59
+ grouped.get(root).push(task);
60
+ });
61
+ return [...grouped.values()]
62
+ .map((members) => {
63
+ const ordered = members.sort((left, right) =>
64
+ left.contentDigest < right.contentDigest ? -1 : 1,
65
+ );
66
+ return {
67
+ componentDigest: rrsiHash(
68
+ "chainlesschain.rrsi-statistical-component/v1",
69
+ {
70
+ partition,
71
+ sources: ordered.map((task) => ({
72
+ contentDigest: task.contentDigest,
73
+ groups: task.groups,
74
+ })),
75
+ },
76
+ ),
77
+ taskIds: ordered.map((task) => task.id),
78
+ taskCount: ordered.length,
79
+ weight: ordered.length / tasks.length,
80
+ };
81
+ })
82
+ .sort((left, right) =>
83
+ left.componentDigest < right.componentDigest ? -1 : 1,
84
+ );
85
+ }
86
+
87
+ /** Weights, hypotheses and population all derive before observing outcomes. */
88
+ export function buildRrsiGroupStatisticsPlan(input) {
89
+ const value = snapshotRrsiData(input);
90
+ rrsiExact(
91
+ value,
92
+ ["campaign", "stage", "versions"],
93
+ "group statistics plan input",
94
+ );
95
+ const campaign = verifyRrsiCampaign(value.campaign);
96
+ if (!Object.hasOwn(STAGES, value.stage)) rrsiFail("unknown statistics stage");
97
+ rrsiExact(
98
+ value.versions,
99
+ campaign.experiment.arms,
100
+ "frozen statistical arm artifacts",
101
+ );
102
+ for (const arm of campaign.experiment.arms)
103
+ rrsiDigest(value.versions[arm], `${arm} artifact digest`);
104
+ const partitions = STAGES[value.stage];
105
+ const variants =
106
+ value.stage === "training"
107
+ ? ["clean"]
108
+ : ["clean", ...campaign.experiment.perturbations];
109
+ if (campaign.experiment.perturbations.includes("clean"))
110
+ rrsiFail("clean is a reserved statistical variant");
111
+ const comparisons = campaign.experiment.comparisons.map((id) => {
112
+ const pair = id.split("-vs-");
113
+ if (
114
+ pair.length !== 2 ||
115
+ pair[0] === pair[1] ||
116
+ pair.some((arm) => !campaign.experiment.arms.includes(arm))
117
+ )
118
+ rrsiFail("statistics comparison has no declared arm interpretation");
119
+ return { id, leftArm: pair[0], rightArm: pair[1] };
120
+ });
121
+ const pools = partitions.map((partition) => ({
122
+ partition,
123
+ partitionDigest: campaign.dataset.pools[partition].partitionDigest,
124
+ taskCount: campaign.dataset.pools[partition].taskCount,
125
+ components: buildRrsiGroupStatisticsSourceComponents(campaign, partition),
126
+ }));
127
+ const hypothesisCount =
128
+ comparisons.length * partitions.length * variants.length;
129
+ const alphaPerHypothesis = campaign.experiment.familyAlpha / hypothesisCount;
130
+ const tailReplicates =
131
+ (campaign.experiment.bootstrapSamples * alphaPerHypothesis) / 2;
132
+ const resampleOperations =
133
+ pools.reduce((sum, pool) => sum + pool.components.length, 0) *
134
+ variants.length *
135
+ comparisons.length *
136
+ campaign.experiment.bootstrapSamples;
137
+ if (resampleOperations > MAX_RESAMPLE_OPERATIONS)
138
+ rrsiFail(
139
+ "frozen statistical resampling exceeds operation limit",
140
+ "CC_RRSI_BUDGET_EXCEEDED",
141
+ );
142
+ return rrsiEnvelope(
143
+ RRSI_GROUP_STATISTICS_PLAN_SCHEMA,
144
+ "statisticsPlanDigest",
145
+ {
146
+ campaignDigest: campaign.campaignDigest,
147
+ parentReleaseDigest: campaign.parentReleaseDigest,
148
+ stage: value.stage,
149
+ versions: value.versions,
150
+ seeds: campaign.experiment.seeds,
151
+ variants,
152
+ comparisons,
153
+ pools,
154
+ familyAlpha: campaign.experiment.familyAlpha,
155
+ hypothesisCount,
156
+ alphaPerHypothesis,
157
+ bootstrapSamples: campaign.experiment.bootstrapSamples,
158
+ bootstrapTailReplicates: tailReplicates,
159
+ bootstrapTailResolutionSufficient: tailReplicates >= 25,
160
+ randomnessCommitment: campaign.experiment.randomnessCommitment,
161
+ resamplingUnit: "task-group-component",
162
+ bootstrapMethod: "task-weighted-cluster-percentile/v1",
163
+ boundedMethod: RRSI_BOUNDED_CLUSTER_METHOD,
164
+ minimumIndependentGroups: campaign.policy.thresholds.minIndependentGroups,
165
+ stoppingRule: "fixed-full-denominator-no-interim-acceptance",
166
+ resampleOperations,
167
+ sourceIndependenceVerified: false,
168
+ perturbationSemanticsVerified: false,
169
+ },
170
+ );
171
+ }
172
+
173
+ export function verifyRrsiGroupStatisticsPlan(plan, context) {
174
+ const rebuilt = buildRrsiGroupStatisticsPlan(context);
175
+ if (rrsiCanonical(snapshotRrsiData(plan)) !== rrsiCanonical(rebuilt))
176
+ rrsiFail("group statistics plan or frozen protocol differs");
177
+ return rebuilt;
178
+ }
179
+
180
+ function boundedInterval(values, counts, alpha) {
181
+ const count = counts.reduce((sum, value) => sum + value, 0);
182
+ const weights = counts.map((value) => value / count);
183
+ const squaredWeightSum = weights.reduce(
184
+ (sum, value) => sum + value * value,
185
+ 0,
186
+ );
187
+ const mean = Math.max(
188
+ -1,
189
+ Math.min(
190
+ 1,
191
+ values.reduce((sum, value, index) => sum + value * counts[index], 0) /
192
+ count,
193
+ ),
194
+ );
195
+ const halfWidth = Math.sqrt(2 * squaredWeightSum * Math.log(2 / alpha));
196
+ return {
197
+ mean,
198
+ lower: Math.max(-1, mean - halfWidth),
199
+ upper: Math.min(1, mean + halfWidth),
200
+ halfWidth,
201
+ effectiveGroupCount: 1 / squaredWeightSum,
202
+ };
203
+ }
204
+
205
+ /** Mathematical primitive only; caller must preregister weights and prove independence. */
206
+ export function computeRrsiBoundedClusterInterval(input) {
207
+ const value = snapshotRrsiData(input);
208
+ rrsiExact(
209
+ value,
210
+ ["values", "taskCounts", "alpha"],
211
+ "conditional cluster interval",
212
+ );
213
+ if (
214
+ !Array.isArray(value.values) ||
215
+ value.values.length < 1 ||
216
+ !Array.isArray(value.taskCounts) ||
217
+ value.values.length !== value.taskCounts.length
218
+ )
219
+ rrsiFail("cluster values and frozen task counts differ");
220
+ value.values.forEach((entry) => rrsiFinite(entry, "cluster delta", -1, 1));
221
+ value.taskCounts.forEach((entry) =>
222
+ rrsiInteger(entry, "cluster task count", 1, 5000),
223
+ );
224
+ if (value.taskCounts.reduce((sum, entry) => sum + entry, 0) > 5000)
225
+ rrsiFail("cluster population exceeds task bound");
226
+ rrsiFinite(value.alpha, "cluster alpha", 0.00000001, 0.05);
227
+ return freezeRrsiData({
228
+ method: RRSI_BOUNDED_CLUSTER_METHOD,
229
+ ...boundedInterval(value.values, value.taskCounts, value.alpha),
230
+ conditionalOnIndependentBoundedClusters: true,
231
+ independenceVerified: false,
232
+ qualifiesForPromotion: false,
233
+ });
234
+ }
235
+
236
+ function randomFromDigest(digest) {
237
+ let state = Number.parseInt(digest.slice(7, 15), 16) || 0x6d2b79f5;
238
+ return () => {
239
+ state ^= state << 13;
240
+ state ^= state >>> 17;
241
+ state ^= state << 5;
242
+ return (state >>> 0) / 0x1_0000_0000;
243
+ };
244
+ }
245
+
246
+ function quantile(sorted, fraction) {
247
+ const index = (sorted.length - 1) * fraction;
248
+ const lower = Math.floor(index),
249
+ upper = Math.ceil(index);
250
+ return sorted[lower] + (sorted[upper] - sorted[lower]) * (index - lower);
251
+ }
252
+
253
+ function clusterEnvelope(values, counts, alpha, bootstrapSamples, seedDigest) {
254
+ const random = randomFromDigest(seedDigest);
255
+ const totals = values.map((value, index) => value * counts[index]);
256
+ const samples = new Array(bootstrapSamples);
257
+ for (let sample = 0; sample < samples.length; sample++) {
258
+ let sum = 0,
259
+ count = 0;
260
+ for (let pick = 0; pick < values.length; pick++) {
261
+ const index = Math.floor(random() * values.length);
262
+ sum += totals[index];
263
+ count += counts[index];
264
+ }
265
+ samples[sample] = sum / count;
266
+ }
267
+ samples.sort((left, right) => left - right);
268
+ const bootstrapInterval = {
269
+ lower: quantile(samples, alpha / 2),
270
+ upper: quantile(samples, 1 - alpha / 2),
271
+ };
272
+ const bounded = boundedInterval(values, counts, alpha);
273
+ return {
274
+ bootstrapInterval,
275
+ boundedInterval: bounded,
276
+ confidenceInterval: {
277
+ mean: bounded.mean,
278
+ lower: Math.min(bounded.lower, bootstrapInterval.lower),
279
+ upper: Math.max(bounded.upper, bootstrapInterval.upper),
280
+ },
281
+ };
282
+ }
283
+
284
+ /** The same direct resampling method used by analysis and synthetic simulation. */
285
+ export function computeRrsiClusterEnvelopeInterval(input) {
286
+ const value = snapshotRrsiData(input);
287
+ rrsiExact(
288
+ value,
289
+ [
290
+ "values",
291
+ "taskCounts",
292
+ "alpha",
293
+ "bootstrapSamples",
294
+ "randomnessSeedDigest",
295
+ ],
296
+ "cluster outer envelope",
297
+ );
298
+ computeRrsiBoundedClusterInterval({
299
+ values: value.values,
300
+ taskCounts: value.taskCounts,
301
+ alpha: value.alpha,
302
+ });
303
+ rrsiInteger(value.bootstrapSamples, "bootstrap samples", 1000, 1_000_000);
304
+ rrsiDigest(value.randomnessSeedDigest, "bootstrap seed");
305
+ if ((value.bootstrapSamples * value.alpha) / 2 < 25)
306
+ rrsiFail("insufficient bootstrap tail resolution");
307
+ if (value.values.length * value.bootstrapSamples > MAX_RESAMPLE_OPERATIONS)
308
+ rrsiFail(
309
+ "cluster bootstrap exceeds operation limit",
310
+ "CC_RRSI_BUDGET_EXCEEDED",
311
+ );
312
+ return freezeRrsiData({
313
+ method: RRSI_CLUSTER_ENVELOPE_METHOD,
314
+ ...clusterEnvelope(
315
+ value.values,
316
+ value.taskCounts,
317
+ value.alpha,
318
+ value.bootstrapSamples,
319
+ value.randomnessSeedDigest,
320
+ ),
321
+ independenceVerified: false,
322
+ qualifiesForPromotion: false,
323
+ });
324
+ }
325
+
326
+ function slotKey(taskId, seed, arm, variant) {
327
+ return JSON.stringify([taskId, seed, arm, variant]);
328
+ }
329
+
330
+ /** Input rows are descriptive claims until an independent adapter authenticates them. */
331
+ export function analyzeRrsiGroupStatistics(input) {
332
+ const value = snapshotRrsiData(input);
333
+ rrsiExact(value, ["campaign", "plan", "rows"], "group statistics analysis");
334
+ const plan = verifyRrsiGroupStatisticsPlan(value.plan, {
335
+ campaign: value.campaign,
336
+ stage: value.plan.stage,
337
+ versions: value.plan.versions,
338
+ });
339
+ if (!Array.isArray(value.rows))
340
+ rrsiFail("statistical rows must be a bounded list");
341
+ const tasks = new Map(
342
+ plan.pools.flatMap((pool) =>
343
+ pool.components.flatMap((group) =>
344
+ group.taskIds.map((id) => [id, pool.partition]),
345
+ ),
346
+ ),
347
+ );
348
+ const rows = new Map(),
349
+ receiptOwners = new Map();
350
+ for (const row of value.rows) {
351
+ rrsiExact(
352
+ row,
353
+ [
354
+ "taskId",
355
+ "seed",
356
+ "arm",
357
+ "versionDigest",
358
+ "variant",
359
+ "outcome",
360
+ "passed",
361
+ "manualRemediation",
362
+ "resultDigest",
363
+ ],
364
+ "statistical slot row",
365
+ );
366
+ rrsiId(row.taskId, "statistical task ID");
367
+ rrsiInteger(row.seed, "statistical seed");
368
+ if (
369
+ !tasks.has(row.taskId) ||
370
+ !plan.seeds.includes(row.seed) ||
371
+ !Object.hasOwn(plan.versions, row.arm) ||
372
+ !plan.variants.includes(row.variant) ||
373
+ row.versionDigest !== plan.versions[row.arm]
374
+ )
375
+ rrsiFail(
376
+ "statistical row differs from frozen task, seed, variant or version",
377
+ );
378
+ if (!OUTCOMES.includes(row.outcome))
379
+ rrsiFail("unknown statistical outcome");
380
+ if (row.passed !== null) rrsiBoolean(row.passed, "statistical success");
381
+ rrsiBoolean(row.manualRemediation, "manual remediation");
382
+ if (row.outcome !== "succeeded" && row.passed === true)
383
+ rrsiFail("non-successful slot cannot report success");
384
+ const key = slotKey(row.taskId, row.seed, row.arm, row.variant);
385
+ if (rows.has(key)) rrsiFail("duplicate statistical slot");
386
+ if (row.resultDigest !== null) {
387
+ rrsiDigest(row.resultDigest, "result evidence digest");
388
+ if (receiptOwners.has(row.resultDigest))
389
+ rrsiFail("one result receipt cannot pay multiple statistical slots");
390
+ receiptOwners.set(row.resultDigest, key);
391
+ }
392
+ rows.set(key, row);
393
+ }
394
+ function summary(pool, arm, variant) {
395
+ let terminal = 0,
396
+ passed = 0,
397
+ manual = 0,
398
+ missing = 0;
399
+ const taskScores = new Map();
400
+ for (const group of pool.components)
401
+ for (const id of group.taskIds) {
402
+ let taskPasses = 0;
403
+ for (const seed of plan.seeds) {
404
+ const row = rows.get(slotKey(id, seed, arm, variant));
405
+ const complete =
406
+ row &&
407
+ row.resultDigest !== null &&
408
+ row.outcome !== "unknown" &&
409
+ (row.outcome !== "succeeded" || row.passed !== null);
410
+ if (!complete) {
411
+ missing++;
412
+ continue;
413
+ }
414
+ terminal++;
415
+ if (row.manualRemediation) manual++;
416
+ if (
417
+ row.outcome === "succeeded" &&
418
+ row.passed &&
419
+ !row.manualRemediation
420
+ ) {
421
+ passed++;
422
+ taskPasses++;
423
+ }
424
+ }
425
+ taskScores.set(id, taskPasses / plan.seeds.length);
426
+ }
427
+ return {
428
+ plannedSlots: pool.taskCount * plan.seeds.length,
429
+ declaredTerminalSlots: terminal,
430
+ strictSuccessSlots: passed,
431
+ manualRemediationSlots: manual,
432
+ missingSlots: missing,
433
+ strictCompletionRate: passed / (pool.taskCount * plan.seeds.length),
434
+ taskScores,
435
+ };
436
+ }
437
+ const analyses = [];
438
+ for (const pool of plan.pools)
439
+ for (const variant of plan.variants) {
440
+ const summaries = new Map(
441
+ Object.keys(plan.versions).map((arm) => [
442
+ arm,
443
+ summary(pool, arm, variant),
444
+ ]),
445
+ );
446
+ for (const comparison of plan.comparisons) {
447
+ const left = summaries.get(comparison.leftArm),
448
+ right = summaries.get(comparison.rightArm);
449
+ const reasons = [];
450
+ if (left.missingSlots || right.missingSlots)
451
+ reasons.push("INSUFFICIENT_EVIDENCE");
452
+ if (pool.components.length < plan.minimumIndependentGroups)
453
+ reasons.push("INSUFFICIENT_INDEPENDENT_GROUPS");
454
+ if (!plan.bootstrapTailResolutionSufficient)
455
+ reasons.push("INSUFFICIENT_BOOTSTRAP_TAIL_RESOLUTION");
456
+ let bootstrapInterval = null,
457
+ bounded = null,
458
+ confidenceInterval = null;
459
+ if (!reasons.length) {
460
+ const totals = pool.components.map((group) =>
461
+ group.taskIds.reduce(
462
+ (sum, id) =>
463
+ sum + left.taskScores.get(id) - right.taskScores.get(id),
464
+ 0,
465
+ ),
466
+ );
467
+ const interval = clusterEnvelope(
468
+ totals.map((sum, index) => sum / pool.components[index].taskCount),
469
+ pool.components.map((group) => group.taskCount),
470
+ plan.alphaPerHypothesis,
471
+ plan.bootstrapSamples,
472
+ // Repeat count, caller ordering and task IDs cannot change the RNG.
473
+ rrsiHash("chainlesschain.rrsi-cluster-bootstrap-random/v1", {
474
+ randomnessCommitment: plan.randomnessCommitment,
475
+ partition: pool.partition,
476
+ components: pool.components.map((group) => ({
477
+ componentDigest: group.componentDigest,
478
+ taskCount: group.taskCount,
479
+ })),
480
+ }),
481
+ );
482
+ bootstrapInterval = interval.bootstrapInterval;
483
+ bounded = interval.boundedInterval;
484
+ confidenceInterval = interval.confidenceInterval;
485
+ }
486
+ const publicSummary = (entry) =>
487
+ Object.fromEntries(
488
+ Object.entries(entry).filter(([key]) => key !== "taskScores"),
489
+ );
490
+ analyses.push({
491
+ partition: pool.partition,
492
+ variant,
493
+ comparisonId: comparison.id,
494
+ leftArm: comparison.leftArm,
495
+ rightArm: comparison.rightArm,
496
+ plannedTaskCount: pool.taskCount,
497
+ independentDeclaredGroupCount: pool.components.length,
498
+ alpha: plan.alphaPerHypothesis,
499
+ left: publicSummary(left),
500
+ right: publicSummary(right),
501
+ conservativeDifference: {
502
+ lower:
503
+ (left.strictSuccessSlots -
504
+ right.strictSuccessSlots -
505
+ right.missingSlots) /
506
+ left.plannedSlots,
507
+ upper:
508
+ (left.strictSuccessSlots +
509
+ left.missingSlots -
510
+ right.strictSuccessSlots) /
511
+ left.plannedSlots,
512
+ },
513
+ bootstrapInterval,
514
+ boundedInterval: bounded,
515
+ confidenceInterval,
516
+ status: reasons.length ? "hold" : "descriptive-complete",
517
+ reasons,
518
+ });
519
+ }
520
+ }
521
+ return rrsiEnvelope(
522
+ RRSI_GROUP_STATISTICS_REPORT_SCHEMA,
523
+ "statisticsReportDigest",
524
+ {
525
+ statisticsPlanDigest: plan.statisticsPlanDigest,
526
+ campaignDigest: plan.campaignDigest,
527
+ rowSetDigest: rrsiHash(
528
+ "chainlesschain.rrsi-statistical-slot-claims/v1",
529
+ [...rows.values()].sort((a, b) =>
530
+ slotKey(a.taskId, a.seed, a.arm, a.variant) <
531
+ slotKey(b.taskId, b.seed, b.arm, b.variant)
532
+ ? -1
533
+ : 1,
534
+ ),
535
+ ),
536
+ stage: plan.stage,
537
+ familyAlpha: plan.familyAlpha,
538
+ hypothesisCount: plan.hypothesisCount,
539
+ status: analyses.some((entry) => entry.status === "hold")
540
+ ? "hold"
541
+ : "descriptive-complete",
542
+ analyses,
543
+ intervalMethod: RRSI_CLUSTER_ENVELOPE_METHOD,
544
+ coverageGuaranteeSource: RRSI_BOUNDED_CLUSTER_METHOD,
545
+ conditionalOnIndependentBoundedClusters: true,
546
+ sourceIndependenceVerified: false,
547
+ resultAuthenticityVerified: false,
548
+ costEvidenceVerified: false,
549
+ statisticalProtocolValidated: false,
550
+ qualityVerdictVerified: false,
551
+ },
552
+ );
553
+ }