chainlesschain 0.166.91 → 0.166.93

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 (221) 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-oo9rE0gh.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-CgANpkKu.js → ActionButton-CVJVVv4i.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DnvpX7RB.js → Analytics-CUXuwmia.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-C2bHccBM.js → AppLayout-iM4PvCuY.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-BIhijC9g.js → Artifacts-DKUIJbf9.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-CKRjWGdp.js → Audit-C4_SzFN2.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-CblYtgBE.js → BackgroundAgents-C3427uy-.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-Cq35b78a.js → Backup-BpEQQiog.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-DcB7NoRz.js → BaseInput-C_exQomZ.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-tc3b-s7i.js → Chat-DzpkLtWa.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-DX4XmTWm.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-BLD5bH5u.js → Checkbox-CxAC1CU8.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-BLOsoazN.js → Codegen-wDFAGCLp.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-Bdr7JwIx.js → Col-BvwirhMf.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-C84BsWE0.js → Community-BJuA7paY.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-Dzdwd04z.js → Compact-DzV35_u2.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-CCG-R0EV.js → Compliance-CIDPPvr9.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-BYj72SK0.js → Cowork-DyTMxP3N.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-B6iKAwOf.js → Cron-PcNLjMFx.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-BJ-oDC6u.js → Crosschain-B_O7ck6Z.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-BnMckGLr.js → DID-CII35Me1.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-Cyje-gCO.js → Dashboard-DU56fkNz.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-BpNlenjK.js → Dropdown-DHC8HVeJ.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-BhonO7Nv.js → EmailListRenderer-oUOHFNsD.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DVoNU-Id.js → EvolutionSettings-D7RCAWNl.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-tdn-KC67.js → FamilyGuardDashboard-CGONPZxC.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation--EEVrHhz.js → Federation-BbDlPWcl.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-Cy8zr0-4.js → FormItemContext-BBJbFQQT.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-BuUhpgFi.js → GenericCardRenderer-iuxAero4.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-Ctd3E5Pe.js → Git-Dw0prdY5.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-Ce7dV6aU.js → Governance-DOGqi_uV.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-CD1vExIH.js → Inference-BY5oUGGj.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Dn64OdQ7.js → KnowledgeGraph-CcE2EVYX.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-PmElVRrT.js → Logs-DyfN4R5w.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-BFiVKf5t.js → MarkdownRenderer-Bj62Aq0M.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-OW4jTXwx.js → Marketplace-CuuuAXUh.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-BEq2Ib4x.js → McpTools-948Fithv.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Can_P2oK.js → Memory-D4PINvyy.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DJ8R-dn3.js → MobileBridge-ECKMaLzX.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-B7kV9GOt.js → MobileProjects-CB5MAcvD.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-BfxamolS.js → Mtc-BRzIM3HJ.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-DHtuv7av.js → MtcAudit-CGeAXJGn.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DLkLpvxc.js → Multisig-C_qJ-8K-.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-u4XtJTIt.js → NLProgramming-DAEyCn7T.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BwuuPJLS.js → Notes-DmD3MEec.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-HEeu-E9v.js → NotificationSettings-Cv4Q3VC9.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-BNlpaFjH.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-Yh-czs3b.js → Organization-DqAFdz6p.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DmE8mYVM.js → Overflow-8Ye9cIcE.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-CWVck8WN.js → P2P-755SfHoJ.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-DgFqekod.js → PdhVaultBrowser-CgZLiucX.js} +4 -4
  56. package/src/assets/web-panel/assets/{Permissions-BtJBVOHV.js → Permissions-C-vFF_rL.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-6VBObXzd.js → PersonalDataHub-Diz1oXM3.js} +5 -5
  58. package/src/assets/web-panel/assets/{Pipeline-D222FmqY.js → Pipeline-D4kIzsZG.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-Bi9FMikp.js → Privacy-QKLkSAUH.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-Bo52H47H.js → ProjectInit-I0S9o_RT.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-BPkesfOc.js → ProjectSettings-DdgV3-Ho.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-GynohSFX.js → Projects-BJHHegtj.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DVdMg04n.js → Providers-uVa1zfbS.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-DqJCb595.js → QrScannerModal-YLVpOChR.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-J7loQbXi.js → QuickAsk-535AYH61.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BI5aURVc.js → Recommend-C_P6eNSw.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BN2sqGvz.js → RemoteSession-EXH1SbNj.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-BGOND-Fi.js → Reputation-Cxc7d3eU.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-77dfwaUk.js → Row-EDqJy-wS.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-FtBAxS3g.js → RssFeed-C03Xeg9_.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-BaYVLFb7.js → Search-DsIga9DK.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-LE3Vv6ab.js → Security-DgArMFc-.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-C5pP-Whz.js → Services-MooDpHBP.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-CLqKUVsF.js → Skeleton-B10P1Dr6.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-BPjN0SX5.js → Skills-DHLHEkLl.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-14jD70kg.js → Sla-D4RT7d4g.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Dr9ij42W.js → SpeechSettings-D8u6F-LV.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BzLHP7B8.js → SyncSettings-4nvNzRq8.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-YqV9b0rV.js → Tasks-CmCb8zNO.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-CxxAE4PK.js → Templates-CzESIa21.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CRb3PcKJ.js → Tenant-Ch_N3p4d.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-CTzPpBaP.js → Terminal-BZccUf_X.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-DjFUj_hy.js → TimelineRenderer-FrKcNy_3.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-Bbb8tPvx.js → Tokens-4xvLpXfD.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-CSeWGM0W.js → Trigger-84UjyxXd.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-JgESMBo3.js → Trust-M6UtHnji.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-CiObLk0T.js → UkeySign-L_xEgtCg.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-CFEZaQ2x.js → VideoEditing-BLJCX9ru.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-DR8ZGDNn.js → Wallet-DwL6uJCj.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DxZukvu7.js → WebAuthn-Bmn9pdzz.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-CKgSZQwn.js → WorkflowEditor-DSsZ5xG1.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-CTxEQE66.js → chat--FGNUaa8.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-CAjKMUu3.js → colors-DeuwNdqX.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BXuz49at.js → compact-item-I4XKxRFU.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-CFN_Hwr9.js → createContext-RoD2p5Ba.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-ctnml4IW.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-BwoSBSfP.js → hasIn-BsvyddUM.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CB3kVd9c.js → index-0tRU1Sv-.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-o9DpkZKf.js → index-4xHc2WjT.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BmQITjMU.js → index-B8-eGLN9.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DY-gBSm8.js → index-BS_uqSTa.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-F2E5RCwz.js → index-BYEVBlCl.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CF9lWi1o.js → index-BcBM065G.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Bu2P6u8m.js → index-BnrL4s-3.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Dv7V2kg6.js → index-BrZPb0On.js} +1 -1
  106. package/src/assets/web-panel/assets/index-C7PN8mh1.js +1 -0
  107. package/src/assets/web-panel/assets/{index-DViK2bkv.js → index-CBazK4-7.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BmXpdcHI.js → index-CPS3zv1c.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Bqv_Cray.js → index-CSrZiiAs.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B7kp-zRE.js → index-CVwZMt9Z.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-B0QbLlWn.js → index-CdgKZYgm.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DjF5BOZx.js → index-CesTu01s.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CSmFby3Q.js → index-CiHlSuMl.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-B2o_BBjg.js → index-CsLVac9n.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CehdwJ_Q.js → index-D1ONyBTW.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Bj4hIiLW.js → index-D4IZsKbF.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-_ZtCyUdz.js → index-D4P4vpmv.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B9yR7zqr.js → index-D6J8dz7X.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-u9_DM3ZC.js → index-DChy2sHE.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-C8er4W9u.js → index-DKUCl_Lk.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BK4ftQ4d.js → index-DRluW3_r.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B2tEnBPx.js → index-DWUmhNO-.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-IY9bd5az.js → index-DXnpVGG3.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Cp5y7lX_.js → index-DYOpAS6-.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-T3MTE6jB.js → index-DiH-3cR2.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DxunxaTw.js → index-DlEfwgzr.js} +1 -1
  127. package/src/assets/web-panel/assets/index-KnbBJAO-.js +1 -0
  128. package/src/assets/web-panel/assets/{index-DTX9CJPx.js → index-R4St_zjR.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Tz5dheZa.js → index-ScgoDU9V.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DmkbAADP.js → index-UWdT_lty.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bw9s2d3c.js → index-VAlor744.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CN53dE_u.js → index-Wco_uvRo.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DpdDnZX_.js → index-ZgFED_Zd.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-IahILygB.js → index-jaHeti4i.js} +3 -3
  135. package/src/assets/web-panel/assets/{index-Cgk0YEiq.js → index-rJDabtw4.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-t2Ch_JKn.js → index-vRiGKIP0.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BoiGJDoO.js → initDefaultProps-BHT0PacY.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-5eL4E0pA.js → motion-CBYsMtsC.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-DjggDi_1.js → move-DnHfFV4K.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-Ce8Vo2T3.js → mtc-parser-DfGkRYrx.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-D1yOBaO2.js → omit-SjLcPQA9.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-8NLceQe8.js → pickAttrs-CCZHF4ep.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CsIdBRmQ.js → placementArrow-DjCGn2sJ.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-GM5NE8En.js → responsiveObserve-BCFCl2on.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-44yj3u49.js → slide-DsfmuIZu.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-B8tqtWcX.js → statusUtils-hPKuJUia.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-NhDPBbyB.js → styleChecker-DOXKH7Kf.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-C8Qz1GtN.js → useFlexGapSupport-B_G7yqio.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-ClUv4kih.js → useFs-BXOTOm2l.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BwkOVEh6.js → usePersonalDataHub-CRvie3g7.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode--gMF33R0.js → vnode-D9_zMmww.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-DXg3TqOP.js → zoom-C4tW03qI.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/data/changelog.json +52 -0
  155. package/src/lib/artifact-store.js +51 -3
  156. package/src/lib/bounded-artifact-file-read.js +131 -0
  157. package/src/lib/evolution/evolution-artifact-ports.js +235 -129
  158. package/src/lib/evolution/evolution-eval-cohort-enrollment.js +713 -47
  159. package/src/lib/evolution/evolution-eval-gate.js +146 -0
  160. package/src/lib/evolution/evolution-eval-launch-admission.js +168 -90
  161. package/src/lib/evolution/evolution-eval-ledger-capture.js +50 -0
  162. package/src/lib/evolution/evolution-eval-readonly-audit.js +106 -0
  163. package/src/lib/evolution/evolution-ledger-file-backend.js +20 -0
  164. package/src/lib/evolution/evolution-ledger-ports.js +59 -27
  165. package/src/lib/evolution/evolution-ledger-v2-journal.js +55 -18
  166. package/src/lib/evolution/evolution-workbench-file-resources.js +19 -1
  167. package/src/lib/evolution/rrsi-cohort-registration.js +275 -0
  168. package/src/lib/evolution/rrsi-contracts.js +742 -0
  169. package/src/lib/evolution/rrsi-data.js +196 -0
  170. package/src/lib/evolution/rrsi-evaluation-adapter.js +275 -0
  171. package/src/lib/evolution/rrsi-evaluation-variants.js +267 -0
  172. package/src/lib/evolution/rrsi-group-statistics.js +553 -0
  173. package/src/lib/evolution/rrsi-history-ledger-adapter.js +3286 -0
  174. package/src/lib/evolution/rrsi-installation-route-contracts.js +275 -0
  175. package/src/lib/evolution/rrsi-installation-route-reader.js +282 -0
  176. package/src/lib/evolution/rrsi-native-batch-evidence.js +520 -0
  177. package/src/lib/evolution/rrsi-native-eval-row-collector.js +538 -0
  178. package/src/lib/evolution/rrsi-native-evaluation-batch.js +547 -0
  179. package/src/lib/evolution/rrsi-native-evaluation-plan.js +431 -0
  180. package/src/lib/evolution/rrsi-native-group-statistics-plan.js +121 -0
  181. package/src/lib/evolution/rrsi-native-group-statistics.js +482 -0
  182. package/src/lib/evolution/rrsi-native-quality-receipt-contracts.js +321 -0
  183. package/src/lib/evolution/rrsi-native-quality-receipt.js +256 -0
  184. package/src/lib/evolution/rrsi-native-statistics-protocol.js +330 -0
  185. package/src/lib/evolution/rrsi-observed-text-index.js +978 -0
  186. package/src/lib/evolution/rrsi-parent-binding.js +290 -0
  187. package/src/lib/evolution/rrsi-pm-execution-bridge.js +500 -0
  188. package/src/lib/evolution/rrsi-pm-training-mapping.js +134 -0
  189. package/src/lib/evolution/rrsi-preparation-contracts.js +213 -0
  190. package/src/lib/evolution/rrsi-registry-history-binding.js +193 -0
  191. package/src/lib/evolution/rrsi-registry-runtime-policy.js +648 -0
  192. package/src/lib/evolution/rrsi-registry-store-policy.js +1271 -0
  193. package/src/lib/evolution/rrsi-runtime-composition.js +79 -0
  194. package/src/lib/evolution/rrsi-selector.js +434 -0
  195. package/src/lib/evolution/rrsi-statistics-simulation.js +354 -0
  196. package/src/lib/evolution/rrsi-tenant-index-anchor-contracts.js +223 -0
  197. package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +157 -0
  198. package/src/lib/evolution/skill-candidate-registry.js +216 -29
  199. package/src/lib/evolution/skill-registry-maintenance.js +80 -0
  200. package/src/lib/evolution/skill-registry-writer-control.js +138 -0
  201. package/src/lib/evolution/skill-release-registry.js +414 -169
  202. package/src/lib/formal-quality-eval-runtime.js +2 -14
  203. package/src/lib/goal-store.js +225 -16
  204. package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +291 -30
  205. package/src/lib/record-replay/skill-recorder.js +38 -3
  206. package/src/lib/remote-read-loop-guard.js +227 -24
  207. package/src/lib/scheduler-kernel/authority-resolver.js +12 -163
  208. package/src/lib/scheduler-kernel/contract.js +27 -414
  209. package/src/lib/scheduler-kernel/runtime.js +21 -823
  210. package/src/lib/scheduler-kernel/service.js +11 -328
  211. package/src/lib/scheduler-kernel/source-locator-path.js +7 -142
  212. package/src/lib/scheduler-kernel/store.js +67 -5931
  213. package/src/lib/secure-fs.js +16 -1314
  214. package/src/lib/task-progress-tracker.js +6 -1
  215. package/src/lib/with-file-lock.js +122 -20
  216. package/src/runtime/agent-core.js +71 -23
  217. package/src/assets/web-panel/assets/ChatBubbleRenderer-fcc_Tvqu.js +0 -1
  218. package/src/assets/web-panel/assets/OrderTableRenderer-BtvN-Qwh.js +0 -1
  219. package/src/assets/web-panel/assets/devWarning-CfB8DxT2.js +0 -1
  220. package/src/assets/web-panel/assets/index-CCsRfd0k.js +0 -1
  221. package/src/assets/web-panel/assets/index-CsmiZIQ4.js +0 -1
@@ -0,0 +1,354 @@
1
+ /** Preregistered synthetic coverage/power checks, not production calibration. */
2
+ import {
3
+ computeRrsiBoundedClusterInterval,
4
+ computeRrsiClusterEnvelopeInterval,
5
+ RRSI_BOUNDED_CLUSTER_METHOD,
6
+ RRSI_CLUSTER_ENVELOPE_METHOD,
7
+ } from "./rrsi-group-statistics.js";
8
+ import {
9
+ snapshotRrsiData,
10
+ rrsiExact,
11
+ rrsiInteger,
12
+ rrsiFinite,
13
+ rrsiDigest,
14
+ rrsiHash,
15
+ rrsiCanonical,
16
+ rrsiEnvelope,
17
+ rrsiFail,
18
+ } from "./rrsi-data.js";
19
+
20
+ export const RRSI_STATISTICS_SIMULATION_PLAN_SCHEMA =
21
+ "chainlesschain.rrsi-statistics-simulation-plan/v1";
22
+ export const RRSI_STATISTICS_SIMULATION_REPORT_SCHEMA =
23
+ "chainlesschain.rrsi-statistics-simulation-report/v1";
24
+ const KEYS = [
25
+ "intervalMethod",
26
+ "bootstrapSamples",
27
+ "trialCount",
28
+ "clusterCounts",
29
+ "comparisonCount",
30
+ "familyAlpha",
31
+ "qualityThreshold",
32
+ "targetPower",
33
+ "randomnessSeedDigest",
34
+ ];
35
+ const LAWS = [
36
+ {
37
+ id: "symmetric-null",
38
+ negative: -1,
39
+ positive: 1,
40
+ positiveProbability: 0.5,
41
+ mean: 0,
42
+ },
43
+ {
44
+ id: "rare-negative-null",
45
+ negative: -0.95,
46
+ positive: 0.05,
47
+ positiveProbability: 0.95,
48
+ mean: 0,
49
+ },
50
+ {
51
+ id: "moderate-positive",
52
+ negative: -0.25,
53
+ positive: 0.75,
54
+ positiveProbability: 0.5,
55
+ mean: 0.25,
56
+ },
57
+ {
58
+ id: "strong-positive",
59
+ negative: 0.6,
60
+ positive: 1,
61
+ positiveProbability: 0.5,
62
+ mean: 0.8,
63
+ },
64
+ ];
65
+
66
+ export function buildRrsiStatisticsSimulationPlan(input) {
67
+ const value = snapshotRrsiData(input);
68
+ rrsiExact(value, KEYS, "statistics simulation plan");
69
+ rrsiInteger(value.trialCount, "Monte Carlo trials", 100, 10000);
70
+ rrsiInteger(value.comparisonCount, "simulation comparison family", 1, 32);
71
+ rrsiFinite(value.familyAlpha, "simulation family alpha", 0.0001, 0.05);
72
+ rrsiFinite(value.qualityThreshold, "simulation quality threshold", 0, 0.5);
73
+ rrsiFinite(value.targetPower, "simulation planned power", 0.8, 0.99);
74
+ rrsiDigest(value.randomnessSeedDigest, "simulation randomness seed");
75
+ if (
76
+ ![RRSI_BOUNDED_CLUSTER_METHOD, RRSI_CLUSTER_ENVELOPE_METHOD].includes(
77
+ value.intervalMethod,
78
+ )
79
+ )
80
+ rrsiFail("simulation must freeze the actual interval method");
81
+ const fullMethod = value.intervalMethod === RRSI_CLUSTER_ENVELOPE_METHOD;
82
+ if (fullMethod) {
83
+ rrsiInteger(
84
+ value.bootstrapSamples,
85
+ "simulation bootstrap samples",
86
+ 1000,
87
+ 1_000_000,
88
+ );
89
+ if (
90
+ (value.bootstrapSamples * value.familyAlpha) / value.comparisonCount / 2 <
91
+ 25
92
+ )
93
+ rrsiFail("simulation has insufficient bootstrap tail resolution");
94
+ } else if (value.bootstrapSamples !== null)
95
+ rrsiFail("Hoeffding-only simulation must not claim bootstrap samples");
96
+ if (
97
+ !Array.isArray(value.clusterCounts) ||
98
+ value.clusterCounts.length < 1 ||
99
+ value.clusterCounts.length > 6
100
+ )
101
+ rrsiFail("simulation cluster counts must be a bounded nonempty grid");
102
+ value.clusterCounts.forEach((count) =>
103
+ rrsiInteger(count, "simulation cluster count", 20, 4000),
104
+ );
105
+ if (new Set(value.clusterCounts).size !== value.clusterCounts.length)
106
+ rrsiFail("simulation sample grid has duplicate counts");
107
+ const operations =
108
+ value.trialCount *
109
+ value.comparisonCount *
110
+ LAWS.length *
111
+ 2 *
112
+ value.clusterCounts.reduce((sum, count) => sum + count, 0) *
113
+ (fullMethod ? value.bootstrapSamples : 1);
114
+ // Full-method simulations use the direct production primitive, not a surrogate.
115
+ const operationLimit = fullMethod ? 500_000_000 : 50_000_000;
116
+ if (operations > operationLimit)
117
+ rrsiFail(
118
+ "Monte Carlo simulation exceeds frozen operation bound",
119
+ "CC_RRSI_BUDGET_EXCEEDED",
120
+ );
121
+ return rrsiEnvelope(
122
+ RRSI_STATISTICS_SIMULATION_PLAN_SCHEMA,
123
+ "simulationPlanDigest",
124
+ {
125
+ ...value,
126
+ clusterCounts: [...value.clusterCounts].sort((a, b) => a - b),
127
+ laws: LAWS,
128
+ weightProfiles: ["equal-task-counts", "one-dominant-component"],
129
+ operations,
130
+ operationLimit,
131
+ bootstrapAlgorithm: fullMethod
132
+ ? "direct-uniform-cluster-picks-xorshift32/v1"
133
+ : null,
134
+ monteCarloIntervalMethod: "wilson-score-95/v1",
135
+ simultaneousMonteCarloMethod: "bonferroni-hoeffding-all-grid-rates-95/v1",
136
+ simultaneousRateCount: value.clusterCounts.length * LAWS.length * 2 * 4,
137
+ contrastJointLaw:
138
+ "independent-synthetic-contrast-deltas-not-three-arm-outcomes",
139
+ hypothesisScope: "one-synthetic-pool-and-variant-per-family",
140
+ bootstrapIndexCoupling: "same-stream-for-contrasts-within-each-trial",
141
+ stoppingRule: "run-every-preregistered-scenario-no-interim-selection",
142
+ },
143
+ );
144
+ }
145
+
146
+ function verifyPlan(input) {
147
+ const value = snapshotRrsiData(input);
148
+ const rebuilt = buildRrsiStatisticsSimulationPlan(
149
+ Object.fromEntries(KEYS.map((key) => [key, value[key]])),
150
+ );
151
+ if (rrsiCanonical(value) !== rrsiCanonical(rebuilt))
152
+ rrsiFail("simulation plan differs from frozen scenarios");
153
+ return rebuilt;
154
+ }
155
+
156
+ function random(digest) {
157
+ let state = Number.parseInt(digest.slice(7, 15), 16) || 0x6d2b79f5;
158
+ return () => {
159
+ state ^= state << 13;
160
+ state ^= state >>> 17;
161
+ state ^= state << 5;
162
+ return (state >>> 0) / 0x1_0000_0000;
163
+ };
164
+ }
165
+
166
+ function rate(successes, trials, rateCount) {
167
+ const value = successes / trials,
168
+ z = 1.959963984540054;
169
+ const denominator = 1 + (z * z) / trials;
170
+ const center = (value + (z * z) / (2 * trials)) / denominator;
171
+ const margin =
172
+ (z *
173
+ Math.sqrt(
174
+ (value * (1 - value)) / trials + (z * z) / (4 * trials * trials),
175
+ )) /
176
+ denominator;
177
+ const simultaneousMargin = Math.sqrt(
178
+ Math.log((2 * rateCount) / 0.05) / (2 * trials),
179
+ );
180
+ return {
181
+ successes,
182
+ trials,
183
+ estimate: value,
184
+ monteCarlo95: {
185
+ lower: Math.max(0, center - margin),
186
+ upper: Math.min(1, center + margin),
187
+ },
188
+ simultaneousGrid95: {
189
+ lower: Math.max(0, value - simultaneousMargin),
190
+ upper: Math.min(1, value + simultaneousMargin),
191
+ },
192
+ };
193
+ }
194
+
195
+ export function runRrsiStatisticsSimulation(input) {
196
+ const plan = verifyPlan(input);
197
+ const scenarios = [];
198
+ for (const groupCount of plan.clusterCounts)
199
+ for (const weightProfile of plan.weightProfiles)
200
+ for (const law of plan.laws) {
201
+ const taskCounts = Array(groupCount).fill(1);
202
+ if (weightProfile === "one-dominant-component") taskCounts[0] = 100;
203
+ const generator = random(
204
+ rrsiHash("chainlesschain.rrsi-simulation-random/v1", {
205
+ seed: plan.randomnessSeedDigest,
206
+ groupCount,
207
+ weightProfile,
208
+ law: law.id,
209
+ }),
210
+ );
211
+ let coverage = 0,
212
+ power = 0,
213
+ unsupportedPositive = 0,
214
+ degenerateMiss = 0;
215
+ let effectiveGroupCount = null;
216
+ for (let trial = 0; trial < plan.trialCount; trial++) {
217
+ let familyCovered = true,
218
+ allAboveThreshold = true,
219
+ anyUnsupportedPositive = false,
220
+ anyDegenerateMiss = false;
221
+ for (
222
+ let comparison = 0;
223
+ comparison < plan.comparisonCount;
224
+ comparison++
225
+ ) {
226
+ const values = taskCounts.map(() =>
227
+ generator() < law.positiveProbability
228
+ ? law.positive
229
+ : law.negative,
230
+ );
231
+ const intervalInput = {
232
+ values,
233
+ taskCounts,
234
+ alpha: plan.familyAlpha / plan.comparisonCount,
235
+ };
236
+ const fullMethod =
237
+ plan.intervalMethod === RRSI_CLUSTER_ENVELOPE_METHOD;
238
+ const result = fullMethod
239
+ ? computeRrsiClusterEnvelopeInterval({
240
+ ...intervalInput,
241
+ bootstrapSamples: plan.bootstrapSamples,
242
+ randomnessSeedDigest: rrsiHash(
243
+ "chainlesschain.rrsi-simulation-bootstrap/v1",
244
+ {
245
+ seed: plan.randomnessSeedDigest,
246
+ groupCount,
247
+ weightProfile,
248
+ law: law.id,
249
+ trial,
250
+ },
251
+ ),
252
+ })
253
+ : computeRrsiBoundedClusterInterval(intervalInput);
254
+ const interval = fullMethod ? result.confidenceInterval : result;
255
+ effectiveGroupCount = fullMethod
256
+ ? result.boundedInterval.effectiveGroupCount
257
+ : result.effectiveGroupCount;
258
+ familyCovered &&=
259
+ interval.lower <= law.mean + 1e-12 &&
260
+ interval.upper >= law.mean - 1e-12;
261
+ allAboveThreshold &&= interval.lower >= plan.qualityThreshold;
262
+ anyUnsupportedPositive ||= law.mean <= 0 && interval.lower > 0;
263
+ anyDegenerateMiss ||=
264
+ values.every((value) => value === values[0]) &&
265
+ Math.abs(values[0] - law.mean) > 1e-12;
266
+ }
267
+ if (familyCovered) coverage++;
268
+ if (allAboveThreshold) power++;
269
+ if (anyUnsupportedPositive) unsupportedPositive++;
270
+ if (anyDegenerateMiss) degenerateMiss++;
271
+ }
272
+ scenarios.push({
273
+ groupCount,
274
+ weightProfile,
275
+ distribution: law.id,
276
+ trueDelta: law.mean,
277
+ effectiveGroupCount,
278
+ taskCount: taskCounts.reduce((sum, count) => sum + count, 0),
279
+ familyCoverage: rate(
280
+ coverage,
281
+ plan.trialCount,
282
+ plan.simultaneousRateCount,
283
+ ),
284
+ familyThresholdPower: rate(
285
+ power,
286
+ plan.trialCount,
287
+ plan.simultaneousRateCount,
288
+ ),
289
+ unsupportedPositiveFamilyRate: rate(
290
+ unsupportedPositive,
291
+ plan.trialCount,
292
+ plan.simultaneousRateCount,
293
+ ),
294
+ zeroSpreadDiagnosticMissRate: rate(
295
+ degenerateMiss,
296
+ plan.trialCount,
297
+ plan.simultaneousRateCount,
298
+ ),
299
+ });
300
+ }
301
+ const powerEstimates = plan.laws
302
+ .filter((law) => law.mean > plan.qualityThreshold)
303
+ .flatMap((law) =>
304
+ plan.weightProfiles.map((profile) => {
305
+ const eligible = scenarios.filter(
306
+ (row) =>
307
+ row.distribution === law.id &&
308
+ row.weightProfile === profile &&
309
+ row.familyThresholdPower.simultaneousGrid95.lower >=
310
+ plan.targetPower,
311
+ );
312
+ return {
313
+ distribution: law.id,
314
+ weightProfile: profile,
315
+ minimumGridGroupCountMeetingPower: eligible[0]?.groupCount ?? null,
316
+ };
317
+ }),
318
+ );
319
+ const coverageCheckedOnGrid = scenarios.every(
320
+ (row) =>
321
+ row.familyCoverage.simultaneousGrid95.lower >= 1 - plan.familyAlpha,
322
+ );
323
+ return rrsiEnvelope(
324
+ RRSI_STATISTICS_SIMULATION_REPORT_SCHEMA,
325
+ "simulationReportDigest",
326
+ {
327
+ simulationPlanDigest: plan.simulationPlanDigest,
328
+ scope: "preregistered-synthetic-independent-cluster-grid-only",
329
+ intervalMethod: plan.intervalMethod,
330
+ fullAnalysisMethodSimulated:
331
+ plan.intervalMethod === RRSI_CLUSTER_ENVELOPE_METHOD,
332
+ hoeffdingOnlyPowerCannotSelectFullMethodSampleSize:
333
+ plan.intervalMethod === RRSI_BOUNDED_CLUSTER_METHOD,
334
+ familyAlpha: plan.familyAlpha,
335
+ comparisonCount: plan.comparisonCount,
336
+ trialCountPerScenario: plan.trialCount,
337
+ status: coverageCheckedOnGrid ? "synthetic-grid-supported" : "hold",
338
+ scenarios,
339
+ powerEstimates,
340
+ coverageCheckedOnGrid,
341
+ monteCarloIntervalsAreApproximate: true,
342
+ pointwiseWilsonIntervalsAreNotSimultaneous: true,
343
+ sampleGridSelectionUsesSimultaneousBounds: true,
344
+ simultaneousBoundsConditionalOnIndependentMonteCarloTrials: true,
345
+ syntheticRngIsNotProductionEvidence: true,
346
+ threeArmExperimentPowerValidated: false,
347
+ mathematicalGuaranteeConditionalOnIndependentBoundedClusters: true,
348
+ productionCoverageValidated: false,
349
+ productionPowerValidated: false,
350
+ sourceIndependenceVerified: false,
351
+ statisticalProtocolValidated: false,
352
+ },
353
+ );
354
+ }
@@ -0,0 +1,223 @@
1
+ /** Signed anchor declarations. A valid signature is never tenant authority. */
2
+ import { createHash, createPublicKey, verify } from "node:crypto";
3
+ import {
4
+ rrsiCanonical,
5
+ rrsiHash,
6
+ rrsiExact,
7
+ rrsiId,
8
+ rrsiDigest,
9
+ rrsiInteger,
10
+ rrsiEnvelope,
11
+ verifyRrsiEnvelope,
12
+ snapshotRrsiData,
13
+ rrsiFail,
14
+ } from "./rrsi-data.js";
15
+
16
+ export const RRSI_TENANT_INDEX_ANCHOR_SCHEMA =
17
+ "chainlesschain.rrsi-tenant-index-anchor/v1";
18
+ export const RRSI_TENANT_INDEX_ANCHOR_SIGNATURE_SCHEMA =
19
+ "chainlesschain.rrsi-tenant-index-anchor-signature-check/v1";
20
+ export const RRSI_TENANT_INDEX_ANCHOR_HOLD_CODE =
21
+ "CC_RRSI_TENANT_INDEX_ANCHOR_HOLD";
22
+ const SIGNATURE_DOMAIN = "chainlesschain.rrsi-tenant-index-anchor-signature/v1";
23
+ const INPUT_KEYS = [
24
+ "deploymentId",
25
+ "tenantId",
26
+ "routingScope",
27
+ "indexId",
28
+ "ledgerIdentity",
29
+ "artifactScope",
30
+ "storageGraphDigest",
31
+ "rootPublicKeyDigest",
32
+ "revision",
33
+ "previousAnchorDigest",
34
+ "checkpoint",
35
+ "restrictionHistory",
36
+ ];
37
+ const sha = (bytes) =>
38
+ `sha256:${createHash("sha256").update(bytes).digest("hex")}`;
39
+ const same = (a, b) => rrsiCanonical(a) === rrsiCanonical(b);
40
+ function hold(message) {
41
+ rrsiFail(message, RRSI_TENANT_INDEX_ANCHOR_HOLD_CODE);
42
+ }
43
+ function ledgerId(value, label) {
44
+ if (
45
+ typeof value !== "string" ||
46
+ !/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/u.test(value)
47
+ )
48
+ hold(`${label} is not a Ledger identifier`);
49
+ }
50
+ function journalIdentity(value) {
51
+ rrsiExact(
52
+ value,
53
+ ["ledgerId", "identityDigest", "epoch"],
54
+ "anchor journal identity",
55
+ );
56
+ ledgerId(value.ledgerId, "ledgerId");
57
+ ledgerId(value.epoch, "epoch");
58
+ rrsiDigest(value.identityDigest, "identity digest");
59
+ }
60
+
61
+ export function buildRrsiTenantIndexAnchor(input) {
62
+ const value = snapshotRrsiData(input);
63
+ rrsiExact(value, INPUT_KEYS, "tenant index anchor input");
64
+ rrsiId(value.deploymentId, "deployment ID");
65
+ rrsiId(value.tenantId, "tenant ID");
66
+ if (!["installation", "shared-tenant-authority"].includes(value.routingScope))
67
+ hold("anchor routing scope must be explicit");
68
+ const expectedIndex = `rrsi-text.${rrsiHash("chainlesschain.rrsi-observed-text-index/v1", value.tenantId).slice(7)}`;
69
+ if (value.indexId !== expectedIndex)
70
+ hold("anchor index ID must derive only from tenant");
71
+ journalIdentity(value.ledgerIdentity);
72
+ rrsiExact(
73
+ value.artifactScope,
74
+ ["artifactTenantId", "audience", "purpose"],
75
+ "anchor artifact scope",
76
+ );
77
+ for (const [name, entry] of Object.entries(value.artifactScope))
78
+ rrsiId(entry, name);
79
+ if (value.artifactScope.purpose !== "evolution-ledger")
80
+ hold("anchor requires original Ledger retention purpose");
81
+ rrsiDigest(value.storageGraphDigest, "storage graph digest");
82
+ rrsiDigest(value.rootPublicKeyDigest, "declared root public key digest");
83
+ rrsiInteger(value.revision, "anchor revision", 1, 2 ** 31 - 1);
84
+ if (value.revision === 1) {
85
+ if (value.previousAnchorDigest !== null)
86
+ hold("first anchor must not claim a predecessor");
87
+ } else rrsiDigest(value.previousAnchorDigest, "previous anchor digest");
88
+ rrsiExact(
89
+ value.checkpoint,
90
+ ["ledgerId", "identityDigest", "epoch", "sequence", "headDigest"],
91
+ "anchor checkpoint",
92
+ );
93
+ const checkpointIdentity = Object.fromEntries(
94
+ ["ledgerId", "identityDigest", "epoch"].map((name) => [
95
+ name,
96
+ value.checkpoint[name],
97
+ ]),
98
+ );
99
+ if (!same(checkpointIdentity, value.ledgerIdentity))
100
+ hold("anchor checkpoint belongs to another journal");
101
+ rrsiInteger(value.checkpoint.sequence, "checkpoint sequence", 0);
102
+ rrsiDigest(value.checkpoint.headDigest, "checkpoint head digest");
103
+ rrsiExact(
104
+ value.restrictionHistory,
105
+ ["recordCount", "tailRecordDigest", "restrictionsDigest"],
106
+ "anchor restriction history",
107
+ );
108
+ rrsiInteger(
109
+ value.restrictionHistory.recordCount,
110
+ "restriction record count",
111
+ 0,
112
+ 256,
113
+ );
114
+ if (value.restrictionHistory.recordCount > value.checkpoint.sequence)
115
+ hold("restriction count exceeds the declared journal checkpoint");
116
+ if (value.restrictionHistory.recordCount === 0) {
117
+ if (value.restrictionHistory.tailRecordDigest !== null)
118
+ hold("empty restriction history must have no tail");
119
+ } else
120
+ rrsiDigest(
121
+ value.restrictionHistory.tailRecordDigest,
122
+ "restriction tail digest",
123
+ );
124
+ rrsiDigest(
125
+ value.restrictionHistory.restrictionsDigest,
126
+ "restriction set digest",
127
+ );
128
+ return rrsiEnvelope(RRSI_TENANT_INDEX_ANCHOR_SCHEMA, "anchorDigest", value);
129
+ }
130
+
131
+ export function verifyRrsiTenantIndexAnchor(input) {
132
+ return verifyRrsiEnvelope(
133
+ input,
134
+ RRSI_TENANT_INDEX_ANCHOR_SCHEMA,
135
+ "anchorDigest",
136
+ INPUT_KEYS,
137
+ buildRrsiTenantIndexAnchor,
138
+ );
139
+ }
140
+
141
+ /** Exact domain-separated bytes for an external signer; no signer default. */
142
+ export function serializeRrsiTenantIndexAnchorSignatureMessage(anchor) {
143
+ const checked = verifyRrsiTenantIndexAnchor(anchor);
144
+ return Buffer.from(`${SIGNATURE_DOMAIN}\0${rrsiCanonical(checked)}`, "utf8");
145
+ }
146
+
147
+ /**
148
+ * Mathematical verification against an explicitly supplied public key only.
149
+ * This deliberately creates no trusted-root brand, pin store or routing grant.
150
+ */
151
+ export function verifyRrsiTenantIndexAnchorSignature(input) {
152
+ const value = snapshotRrsiData(input);
153
+ rrsiExact(
154
+ value,
155
+ ["anchor", "publicKeySpki", "signature"],
156
+ "anchor signature input",
157
+ );
158
+ const anchor = verifyRrsiTenantIndexAnchor(value.anchor);
159
+ if (
160
+ typeof value.publicKeySpki !== "string" ||
161
+ value.publicKeySpki.length > 128
162
+ )
163
+ hold("anchor public key must be bounded canonical Ed25519 SPKI");
164
+ const publicBytes = Buffer.from(value.publicKeySpki, "base64url");
165
+ if (
166
+ publicBytes.length !== 44 ||
167
+ publicBytes.toString("base64url") !== value.publicKeySpki
168
+ )
169
+ hold("anchor public key SPKI encoding differs");
170
+ let publicKey;
171
+ try {
172
+ publicKey = createPublicKey({
173
+ key: publicBytes,
174
+ format: "der",
175
+ type: "spki",
176
+ });
177
+ } catch {
178
+ hold("anchor public key SPKI cannot be parsed");
179
+ }
180
+ if (
181
+ publicKey.asymmetricKeyType !== "ed25519" ||
182
+ !publicKey.export({ format: "der", type: "spki" }).equals(publicBytes)
183
+ )
184
+ hold("anchor public key must be exact Ed25519 SPKI");
185
+ if (sha(publicBytes) !== anchor.rootPublicKeyDigest)
186
+ hold("anchor public key differs from the declared root digest");
187
+ if (typeof value.signature !== "string" || value.signature.length !== 86)
188
+ hold("anchor signature must be bounded canonical Ed25519 bytes");
189
+ const signatureBytes = Buffer.from(value.signature, "base64url");
190
+ if (
191
+ signatureBytes.length !== 64 ||
192
+ signatureBytes.toString("base64url") !== value.signature
193
+ )
194
+ hold("anchor signature encoding differs");
195
+ if (
196
+ !verify(
197
+ null,
198
+ serializeRrsiTenantIndexAnchorSignatureMessage(anchor),
199
+ publicKey,
200
+ signatureBytes,
201
+ )
202
+ )
203
+ hold("anchor signature was rejected");
204
+ return rrsiEnvelope(
205
+ RRSI_TENANT_INDEX_ANCHOR_SIGNATURE_SCHEMA,
206
+ "signatureCheckDigest",
207
+ {
208
+ anchorDigest: anchor.anchorDigest,
209
+ publicKeyDigest: anchor.rootPublicKeyDigest,
210
+ declaredDeploymentId: anchor.deploymentId,
211
+ declaredTenantId: anchor.tenantId,
212
+ declaredRoutingScope: anchor.routingScope,
213
+ signatureVerifiedRelativeToKey: true,
214
+ rootAuthorityVerified: false,
215
+ routingPinVerified: false,
216
+ historyTransferVerified: false,
217
+ tenantWideIndexAuthorityVerified: false,
218
+ generationProvenanceVerified: false,
219
+ grantsMutationOrPromotionAuthority: false,
220
+ decision: "HOLD",
221
+ },
222
+ );
223
+ }