chainlesschain 0.166.62 → 0.166.64

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 (172) hide show
  1. package/README.md +54 -8
  2. package/package.json +3 -1
  3. package/src/assets/web-panel/assets/{AIOps-BqoRiuXE.js → AIOps-BFbLDWTF.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BwBhyFIm.js → ActionButton-CAHMtgNB.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DTW03Emb.js → Analytics-CkrSj0oR.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-CI-wxMLQ.js → AppLayout-BTb0Ws1l.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-DVqbM3iE.js → Artifacts-C2Pgepj-.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DulhOs16.js → Audit-ZweyxXW8.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DnRs67e8.js → BackgroundAgents-BS8tAnzP.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-BFEZo0vX.js → Backup-CLkG_74M.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-D185sBnp.js → BaseInput-MIfNcdUZ.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DUvP-2SK.js → Chat-DBwqlWWr.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-u9WKQbZb.js → ChatBubbleRenderer-6T0uoJuS.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-D8Zh_18b.js → Checkbox-DdBYhlVX.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-WdiWRdfC.js → Codegen-BR6MhiDo.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CnSoVpw6.js → Col-yO-5EbbM.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BJDHgBkw.js → Community-B608q_m7.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-uNRdmBaq.js → Compact-BmVHi7Z7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-_6jRTJa3.js → Compliance-BQ-DzutA.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-D5lnbXR6.js → Cowork-BEfLyXvi.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-D6tuGBVg.js → Cron-Cld6NX-_.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-Ce5e9Lbm.js → Crosschain-CUA3nDId.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-1VVKZ_c1.js → DID-DSI3E9zv.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DuHcZ13w.js → Dashboard-CoWtEdhO.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BC3EK0wN.js → Dropdown-CGhZ1Dyy.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DzLpGs5E.js → EmailListRenderer-BHZe2K5q.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-x2XZHG0Z.js → EvolutionSettings-Corjo98k.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-nAavV50Y.js → FamilyGuardDashboard-dPSWF3Pt.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CCHWVS5J.js → Federation-DT-Zr78c.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CGod_3Ni.js → FormItemContext-CzKq63B0.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DIFYQa2f.js → GenericCardRenderer-CDkKrmu0.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DikM1Nc5.js → Git-BrwRnLOv.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-SzzBXCDX.js → Governance-C4PtCzod.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-wVsu9QzM.js → Inference-CVPv5nwa.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DDpVxfO-.js → KnowledgeGraph-CmT9lvED.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BnIjS-2Z.js → Logs-DaRgv7pL.js} +2 -2
  37. package/src/assets/web-panel/assets/{MarkdownRenderer-3AsRzie6.js → MarkdownRenderer-B3zZwlSz.js} +1 -1
  38. package/src/assets/web-panel/assets/{Marketplace-Cj3PLhXV.js → Marketplace-Bm0GGEaL.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DMKO55Kz.js → McpTools-71L5h0en.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-wWJl5yJL.js → Memory-BoWrfASi.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-CJ_VIPgJ.js → MobileBridge-Dp4FcX_-.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CiJT5cF8.js → MobileProjects-00ja0Z7O.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-BXmndm9a.js → Mtc-BZF6YNYp.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-C3hWIAnz.js → MtcAudit-Bp_vcI6H.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DU4OUQ7u.js → Multisig-CnCo56CS.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-CyAwOeU5.js → NLProgramming-BCSzNHpv.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes--YvcAg13.js → Notes-kXoQk8B7.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Dyu6dC0D.js → NotificationSettings-oN-1fkcy.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Df-0iTO2.js → OrderTableRenderer-5ZVHrVZ9.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-a9Em4Sgu.js → Organization-D4_T9Tdc.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-CCQtvcsw.js → Overflow-d8vZwo9w.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P--CaB5e38.js → P2P-0HGUdmTv.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CmfHjoJG.js → PdhVaultBrowser-Cx8vp92z.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-BCDjNsXi.js → Permissions-XHd6pVQB.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-ByprqCJd.js → PersonalDataHub-CB5bZU9T.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-CZRZq-P0.js → Pipeline-Dy_qx4-0.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CeDay_dV.js → Privacy-BgR0-uEu.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CgpIfRAZ.js → ProjectInit-DAcRi1Nx.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CU8iakEs.js → ProjectSettings-Bd1Q0rK_.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-pPM0KRfQ.js → Projects-DVc9DcbM.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-BfpxsZh1.js → Providers-C3c4QfUT.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Dmv3rax1.js → QrScannerModal-Ba_GbitW.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DBOtB5wd.js → QuickAsk-CSn5tIkO.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-C_KnHRvS.js → Recommend-B3-8PLX0.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-OIO9kT7D.js → RemoteSession-Bd_7Zmi-.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-BCfNIBt3.js → Reputation-BU2A_wy5.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-pnhw7dyj.js → Row-I0JFMjCz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-CLJ1A3FF.js → RssFeed-CNc4Dgfz.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-CSQzJ3gj.js → Search-uAA6ceLl.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CS_mvkaE.js → Security-U1SWj5nP.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DBqA2Csq.js → Services-BFjZ5ASY.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-BjR3_iWH.js → Skeleton-B8InBvQf.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DwGIXRJS.js → Skills-BDYwf3QV.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DwiHHJtJ.js → Sla-Dcc6iq3q.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-QYN_t0CS.js → SpeechSettings-C3Ta-mC9.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DcXA1Jp3.js → SyncSettings-BNHEYO95.js} +2 -2
  77. package/src/assets/web-panel/assets/Tasks-JbV6L1FX.js +1 -0
  78. package/src/assets/web-panel/assets/{Templates-C6MTuLXU.js → Templates-Yp0CUTBz.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DmbdMB2D.js → Tenant-CToNYxCo.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-DYeXnE4A.js → Terminal-D7W9UqSD.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BrwLhsSE.js → TimelineRenderer-B7rqc1kE.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-C5kKpRWj.js → Tokens-QP7K4ppA.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C4Zyg1jj.js → Trigger-CAWowQCR.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D0mrY3kY.js → Trust-B-0XOP97.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-Bq5NMLLb.js → UkeySign-BtiZbiuj.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-OObS6euz.js → VideoEditing-Dee11JI0.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-Die77ZAO.js → Wallet-y7qOmaWY.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DFpqn0WO.js → WebAuthn-CjyRRWGK.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BgKZiece.js → WorkflowEditor-D7Kiz25Q.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CbWtbRmr.js → chat-4F_yB-Gw.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-Zu_TgmpG.js → colors-CrczPd-t.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-BqABAwA_.js → compact-item-AenPL6fz.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DR6r1ykz.js → createContext-BcwoqPgi.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-C4qWsAvh.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-BNnYbjOt.js → hasIn-YouHmap8.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BQHn6m4S.js → index--xwN0ZvG.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DxloCIDQ.js → index-31dhJpt3.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CuYLjMxX.js → index-4r7B8sTx.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-hZ41pakD.js → index-5GHNjmnt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index--vigBXnN.js → index-B5Vmr0CM.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CpmSx_mp.js → index-B8EXHVmM.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BQ1WFS4G.js → index-BHA5Fyjc.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-ys7--3Ab.js → index-B_I1INkw.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CO9hQ7ri.js → index-BaguGDJP.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DaKziwj_.js → index-BoVeUGhC.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DiaPl_6F.js → index-BsGhFk79.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DEdqCQKQ.js → index-BwUqDg9_.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-hWckjvz-.js → index-BzyDSW_e.js} +1 -1
  109. package/src/assets/web-panel/assets/index-C-ltOW-O.js +1 -0
  110. package/src/assets/web-panel/assets/{index-P-0rrwu0.js → index-C5hpEYbx.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CVgcq0cJ.js → index-CHNKoexH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-rS1lj7A9.js → index-COgeZETv.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Ct4xnx2r.js → index-CWgIKCVS.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CYgH1j85.js → index-CZ9Ikuo6.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BtQDpNFU.js → index-CZT-LLGS.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B9qA3lcI.js → index-CedvtJA_.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DuCixW1o.js → index-D0dXNgvi.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-55eCb40A.js → index-D5Rvq67L.js} +3 -3
  119. package/src/assets/web-panel/assets/index-D7Ir0TiS.js +1 -0
  120. package/src/assets/web-panel/assets/{index-fvl4dSWm.js → index-D7m5Z4We.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-D08ytPR_.js → index-D8a1AEVK.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CbJgVaoQ.js → index-DAGfuEUu.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-n62j7dTt.js → index-DAh5KwVL.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BCyrVLzm.js → index-DE3qPp9l.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C912Wlyi.js → index-DNHmbdGm.js} +1 -1
  126. package/src/assets/web-panel/assets/{index--1t0mcMh.js → index-DPrzFdCg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-uwS83tsv.js → index-DVrgnhfu.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CR4uB9Mt.js → index-D_4VsL-L.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BvQB-LK5.js → index-Dfw3WyZU.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BbHnxChr.js → index-GP5u18DV.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CkBDWART.js → index-YX4dcbgh.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CSNMSJAt.js → index-fCuM1NPH.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-GrGT2dft.js → index-gy1H_PJk.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CmGll9ri.js → index-q_9aqSgF.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-BEtGYjIT.js → initDefaultProps-Ci6zc6ZA.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-Cvnft4fL.js → motion-DS3kjIxw.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-CdxE_5Yl.js → move-DCdWAKk4.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CS0l6IJn.js → mtc-parser-B0Wfce9U.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-Bnji87sb.js → omit-Clx9TR6z.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-BYdnEgN3.js → pickAttrs-CqSiqUvN.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-DYYd524z.js → placementArrow-BWe_v-40.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-BbIJIkXp.js → responsiveObserve-BSJ68bw6.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BSvuvfUS.js → slide-VRPlLxZB.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DeLSt3js.js → statusUtils-BFBVDPdB.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-DpJTPfyI.js → styleChecker-CehOXy1f.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-S7WdFQMU.js → useFlexGapSupport-BCOdfK18.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CkfCBy52.js → useFs-BMKrjfJQ.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-CA48p8Gt.js → usePersonalDataHub-BIjZ7IgI.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-C9D1tq_L.js → vnode-oD0MXddQ.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-B0TG7YQI.js → zoom-D7WqH2Ai.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +26 -0
  153. package/src/lib/evolution/evolution-artifact-ports.js +3 -0
  154. package/src/lib/evolution/evolution-deployment-loader.js +125 -9
  155. package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
  156. package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
  157. package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
  158. package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
  159. package/src/lib/evolution/pm-exploration-ledger-adapter.js +210 -22
  160. package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
  161. package/src/lib/evolution/pm-exploration-receipts.js +626 -0
  162. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
  163. package/src/lib/evolution/pm-exploration-rounds.js +12 -2
  164. package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
  165. package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
  166. package/src/lib/read-file-loop-guard.js +13 -7
  167. package/src/lib/task-progress-tracker.js +1 -1
  168. package/src/runtime/agent-core.js +14 -7
  169. package/src/assets/web-panel/assets/Tasks-DwWqvoyB.js +0 -1
  170. package/src/assets/web-panel/assets/devWarning-CmMzSuk5.js +0 -1
  171. package/src/assets/web-panel/assets/index-Dw-oPGSM.js +0 -1
  172. package/src/assets/web-panel/assets/index-OXemaG8f.js +0 -1
@@ -21,9 +21,14 @@ import {
21
21
  restorePmExplorationJournal,
22
22
  verifyPmExplorationPlan,
23
23
  } from "./pm-exploration-rounds.js";
24
+ import { verifyPmExplorationEvidenceBundle } from "./pm-exploration-evidence-bundle.js";
25
+ import { verifyPmExplorationExecutionManifest } from "./pm-exploration-execution-host.js";
26
+ import { inspectPmExplorationReceiptAuthority } from "./pm-exploration-receipts.js";
24
27
 
25
28
  export const PM_EXPLORATION_LEDGER_RECORD_SCHEMA =
26
29
  "chainlesschain.pm-exploration-ledger-record/v1";
30
+ export const PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA =
31
+ "chainlesschain.pm-exploration-ledger-record/v2";
27
32
  export const PM_EXPLORATION_LEDGER_EVENT_TYPE =
28
33
  "pm.exploration.snapshot-committed";
29
34
  export const PM_EXPLORATION_LEDGER_RESTORE_SCHEMA =
@@ -55,6 +60,12 @@ const RECORD_KEYS = new Set([
55
60
  "snapshot",
56
61
  "committedAt",
57
62
  ]);
63
+ const AUTHENTICATED_RECORD_KEYS = new Set([
64
+ ...RECORD_KEYS,
65
+ "evidenceBundle",
66
+ "evidenceDigest",
67
+ "executionManifestDigest",
68
+ ]);
58
69
  const DURABILITY_AUTHORITY_KEYS = new Set(["id", "retain", "resolve"]);
59
70
  const DURABILITY_RECEIPT_KEYS = new Set([
60
71
  "schema",
@@ -220,7 +231,19 @@ function normalizeSnapshot(plan, snapshot) {
220
231
  return exportPmExplorationRecoverySnapshot(restored);
221
232
  }
222
233
 
223
- function parseRecord(resolution, descriptor, plan) {
234
+ function normalizeEvidence(context, plan, snapshot, bundle) {
235
+ if (!context)
236
+ corrupt("PM exploration signed evidence verifier is unavailable");
237
+ return verifyPmExplorationEvidenceBundle({
238
+ plan,
239
+ manifest: context.manifest,
240
+ authorities: context.authorities,
241
+ snapshot,
242
+ bundle,
243
+ });
244
+ }
245
+
246
+ function parseRecord(resolution, descriptor, plan, evidenceContext) {
224
247
  if (
225
248
  resolution?.schema !== EVOLUTION_ARTIFACT_RESOLUTION_SCHEMA ||
226
249
  resolution.authenticated !== true ||
@@ -248,14 +271,23 @@ function parseRecord(resolution, descriptor, plan) {
248
271
  ) {
249
272
  corrupt("PM exploration durable artifact binding is invalid");
250
273
  }
274
+ const record = durable.value;
275
+ const authenticatedRecord =
276
+ record?.schema === PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA;
251
277
  try {
252
- exact(durable.value, RECORD_KEYS, "PM exploration ledger record");
278
+ exact(
279
+ record,
280
+ authenticatedRecord ? AUTHENTICATED_RECORD_KEYS : RECORD_KEYS,
281
+ "PM exploration ledger record",
282
+ );
253
283
  } catch (cause) {
254
284
  corrupt("PM exploration ledger record shape is invalid", { cause });
255
285
  }
256
- const record = durable.value;
257
286
  if (
258
- record.schema !== PM_EXPLORATION_LEDGER_RECORD_SCHEMA ||
287
+ ![
288
+ PM_EXPLORATION_LEDGER_RECORD_SCHEMA,
289
+ PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA,
290
+ ].includes(record.schema) ||
259
291
  record.descriptorDigest !== descriptor.descriptorDigest ||
260
292
  !Number.isSafeInteger(record.revision) ||
261
293
  record.revision < 1 ||
@@ -279,7 +311,35 @@ function parseRecord(resolution, descriptor, plan) {
279
311
  ) {
280
312
  corrupt("PM exploration recovery snapshot readback differs");
281
313
  }
282
- return deepFreeze({ ...record, snapshot });
314
+ let evidenceBundle = null;
315
+ if (authenticatedRecord) {
316
+ if (
317
+ !DIGEST.test(record.evidenceDigest ?? "") ||
318
+ !DIGEST.test(record.executionManifestDigest ?? "")
319
+ ) {
320
+ corrupt("PM exploration signed evidence fields are invalid");
321
+ }
322
+ try {
323
+ evidenceBundle = normalizeEvidence(
324
+ evidenceContext,
325
+ plan,
326
+ snapshot,
327
+ record.evidenceBundle,
328
+ );
329
+ } catch (cause) {
330
+ corrupt("PM exploration signed evidence is invalid", { cause });
331
+ }
332
+ if (
333
+ evidenceBundle.evidenceDigest !== record.evidenceDigest ||
334
+ evidenceBundle.executionManifestDigest !==
335
+ record.executionManifestDigest ||
336
+ evidenceBundle.snapshotDigest !== snapshot.snapshotDigest ||
337
+ !same(evidenceBundle, record.evidenceBundle)
338
+ ) {
339
+ corrupt("PM exploration signed evidence readback differs");
340
+ }
341
+ }
342
+ return deepFreeze({ ...record, snapshot, evidenceBundle });
283
343
  }
284
344
 
285
345
  function assertSnapshotExtension(previous, next) {
@@ -313,8 +373,29 @@ function sameHead(left, right) {
313
373
  ].every((key) => left?.[key] === right?.[key]);
314
374
  }
315
375
 
376
+ function recordIsAuthenticated(record) {
377
+ return record.schema === PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA;
378
+ }
379
+
380
+ function recordEventId(record) {
381
+ const suffix = recordIsAuthenticated(record)
382
+ ? hash("chainlesschain.pm-exploration-ledger-event-id/v2", {
383
+ snapshotDigest: record.snapshotDigest,
384
+ evidenceDigest: record.evidenceDigest,
385
+ }).slice(7)
386
+ : record.snapshotDigest.slice(7);
387
+ return `${PM_EXPLORATION_LEDGER_EVENT_TYPE}.${suffix}`;
388
+ }
389
+
390
+ function recordReason(record) {
391
+ return recordIsAuthenticated(record)
392
+ ? `PM exploration authenticated recovery snapshot revision ${record.revision} committed`
393
+ : `PM exploration recovery snapshot revision ${record.revision} committed`;
394
+ }
395
+
316
396
  function acknowledgement(descriptor, entry, recovered) {
317
- return deepFreeze({
397
+ const authenticated = recordIsAuthenticated(entry.record);
398
+ const result = {
318
399
  schema: PM_EXPLORATION_LEDGER_ACK_SCHEMA,
319
400
  authenticated: true,
320
401
  durable: true,
@@ -330,14 +411,64 @@ function acknowledgement(descriptor, entry, recovered) {
330
411
  snapshotDigest: entry.record.snapshotDigest,
331
412
  ledgerEventDigest: entry.event.eventDigest,
332
413
  recovered,
333
- snapshotAuthenticated: false,
414
+ snapshotAuthenticated: authenticated,
334
415
  qualifiesForPromotion: false,
416
+ };
417
+ if (authenticated) {
418
+ result.evidenceDigest = entry.record.evidenceDigest;
419
+ result.executionManifestDigest = entry.record.executionManifestDigest;
420
+ }
421
+ return deepFreeze(result);
422
+ }
423
+
424
+ function normalizeEvidenceContext(executionManifest, receiptAuthorities, plan) {
425
+ if (executionManifest === null && receiptAuthorities === null) return null;
426
+ if (executionManifest === null || receiptAuthorities === null)
427
+ throw new TypeError(
428
+ "executionManifest and receiptAuthorities must be configured together",
429
+ );
430
+ const manifest = verifyPmExplorationExecutionManifest(executionManifest);
431
+ if (
432
+ manifest.planDigest !== plan.planDigest ||
433
+ manifest.environmentDigest !== plan.environmentDigest
434
+ ) {
435
+ throw new TypeError("PM signed evidence manifest differs from the plan");
436
+ }
437
+ exact(
438
+ receiptAuthorities,
439
+ new Set(["execution", "grader", "merge", "evaluator"]),
440
+ "PM exploration receipt authorities",
441
+ );
442
+ for (const [role, expected] of [
443
+ ["execution", manifest.runner],
444
+ ["grader", manifest.grader],
445
+ ["merge", manifest.merger],
446
+ ["evaluator", manifest.evaluator],
447
+ ]) {
448
+ if (
449
+ !same(
450
+ inspectPmExplorationReceiptAuthority(receiptAuthorities[role]),
451
+ expected,
452
+ )
453
+ ) {
454
+ throw new TypeError(`PM ${role} receipt authority differs from manifest`);
455
+ }
456
+ }
457
+ return Object.freeze({
458
+ manifest,
459
+ authorities: Object.freeze({
460
+ execution: receiptAuthorities.execution,
461
+ grader: receiptAuthorities.grader,
462
+ merge: receiptAuthorities.merge,
463
+ evaluator: receiptAuthorities.evaluator,
464
+ }),
335
465
  });
336
466
  }
337
467
 
338
468
  export class PmExplorationLedgerAdapter {
339
469
  #append;
340
470
  #clock;
471
+ #evidenceContext;
341
472
  #plan;
342
473
  #put;
343
474
  #read;
@@ -352,12 +483,19 @@ export class PmExplorationLedgerAdapter {
352
483
  artifactDurabilityAuthority,
353
484
  ledger,
354
485
  ledgerArtifactResolver,
486
+ executionManifest = null,
487
+ receiptAuthorities = null,
355
488
  now = Date.now,
356
489
  } = {}) {
357
490
  this.descriptor = normalizeDescriptor(input);
358
491
  this.#plan = snapshotPlan(plan);
359
492
  if (this.#plan.planDigest !== this.descriptor.planDigest)
360
493
  throw new TypeError("PM exploration plan differs from ledger descriptor");
494
+ this.#evidenceContext = normalizeEvidenceContext(
495
+ executionManifest,
496
+ receiptAuthorities,
497
+ this.#plan,
498
+ );
361
499
  const trustedArtifactPorts = requireExactInstance(
362
500
  artifactPorts,
363
501
  EvolutionArtifactPorts.prototype,
@@ -404,7 +542,8 @@ export class PmExplorationLedgerAdapter {
404
542
  this,
405
543
  Object.freeze({
406
544
  load: () => this.load(),
407
- commitJournal: (journal) => this.commitJournal(journal),
545
+ commitJournal: (journal, evidenceBundle = null) =>
546
+ this.commitJournal(journal, evidenceBundle),
408
547
  restoreLatestJournal: () => this.restoreLatestJournal(),
409
548
  }),
410
549
  );
@@ -437,7 +576,12 @@ export class PmExplorationLedgerAdapter {
437
576
  ) {
438
577
  corrupt("PM exploration ledger subject was substituted");
439
578
  }
440
- return parseRecord(resolution, this.descriptor, this.#plan);
579
+ return parseRecord(
580
+ resolution,
581
+ this.descriptor,
582
+ this.#plan,
583
+ this.#evidenceContext,
584
+ );
441
585
  }
442
586
 
443
587
  #historyWithIdentity() {
@@ -454,10 +598,8 @@ export class PmExplorationLedgerAdapter {
454
598
  event.artifactTenantId !== this.descriptor.artifactTenantId ||
455
599
  event.decision !== "committed" ||
456
600
  event.skillName !== null ||
457
- event.eventId !==
458
- `${PM_EXPLORATION_LEDGER_EVENT_TYPE}.${record.snapshotDigest.slice(7)}` ||
459
- event.reason !==
460
- `PM exploration recovery snapshot revision ${record.revision} committed` ||
601
+ event.eventId !== recordEventId(record) ||
602
+ event.reason !== recordReason(record) ||
461
603
  event.timestamp !== new Date(record.committedAt).toISOString() ||
462
604
  !DIGEST.test(event.eventDigest ?? "") ||
463
605
  !Array.isArray(event.sourceRefs) ||
@@ -487,7 +629,8 @@ export class PmExplorationLedgerAdapter {
487
629
  load() {
488
630
  const latest = this.#historyWithIdentity().history.at(-1) ?? null;
489
631
  if (!latest) return null;
490
- return deepFreeze({
632
+ const authenticated = recordIsAuthenticated(latest.record);
633
+ const result = {
491
634
  schema: PM_EXPLORATION_LEDGER_RESTORE_SCHEMA,
492
635
  authenticated: true,
493
636
  durable: true,
@@ -503,9 +646,15 @@ export class PmExplorationLedgerAdapter {
503
646
  snapshotDigest: latest.record.snapshotDigest,
504
647
  ledgerEventDigest: latest.event.eventDigest,
505
648
  snapshot: latest.record.snapshot,
506
- snapshotAuthenticated: false,
649
+ snapshotAuthenticated: authenticated,
507
650
  qualifiesForPromotion: false,
508
- });
651
+ };
652
+ if (authenticated) {
653
+ result.evidenceBundle = latest.record.evidenceBundle;
654
+ result.evidenceDigest = latest.record.evidenceDigest;
655
+ result.executionManifestDigest = latest.record.executionManifestDigest;
656
+ }
657
+ return deepFreeze(result);
509
658
  }
510
659
 
511
660
  restoreLatestJournal() {
@@ -515,7 +664,7 @@ export class PmExplorationLedgerAdapter {
515
664
  return Object.freeze({ journal, evidence });
516
665
  }
517
666
 
518
- commitJournal(journal) {
667
+ commitJournal(journal, evidenceBundle = null) {
519
668
  let snapshot;
520
669
  try {
521
670
  snapshot = exportPmExplorationRecoverySnapshot(journal);
@@ -527,10 +676,38 @@ export class PmExplorationLedgerAdapter {
527
676
  }
528
677
  if (snapshot.planDigest !== this.descriptor.planDigest)
529
678
  conflict("PM exploration journal belongs to another plan");
679
+ let authenticatedEvidence = null;
680
+ if (this.#evidenceContext) {
681
+ if (evidenceBundle === null)
682
+ throw new TypeError(
683
+ "signed PM exploration evidence is required for this adapter",
684
+ );
685
+ authenticatedEvidence = normalizeEvidence(
686
+ this.#evidenceContext,
687
+ this.#plan,
688
+ snapshot,
689
+ evidenceBundle,
690
+ );
691
+ } else if (evidenceBundle !== null) {
692
+ throw new TypeError(
693
+ "signed PM exploration evidence is not configured for this adapter",
694
+ );
695
+ }
530
696
  const { history, identity } = this.#historyWithIdentity();
531
697
  const latest = history.at(-1) ?? null;
532
- if (latest?.record.snapshotDigest === snapshot.snapshotDigest)
533
- return acknowledgement(this.descriptor, latest, true);
698
+ if (latest?.record.snapshotDigest === snapshot.snapshotDigest) {
699
+ if (
700
+ (authenticatedEvidence === null &&
701
+ !recordIsAuthenticated(latest.record)) ||
702
+ (authenticatedEvidence !== null &&
703
+ recordIsAuthenticated(latest.record) &&
704
+ latest.record.evidenceDigest === authenticatedEvidence.evidenceDigest)
705
+ ) {
706
+ return acknowledgement(this.descriptor, latest, true);
707
+ }
708
+ if (recordIsAuthenticated(latest.record))
709
+ conflict("PM exploration snapshot evidence cannot be replaced");
710
+ }
534
711
  assertSnapshotExtension(latest?.record.snapshot ?? null, snapshot);
535
712
 
536
713
  const revision = history.length + 1;
@@ -538,13 +715,24 @@ export class PmExplorationLedgerAdapter {
538
715
  if (!Number.isSafeInteger(committedAt) || committedAt < 0)
539
716
  throw new TypeError("PM exploration ledger clock is invalid");
540
717
  const record = deepFreeze({
541
- schema: PM_EXPLORATION_LEDGER_RECORD_SCHEMA,
718
+ schema:
719
+ authenticatedEvidence === null
720
+ ? PM_EXPLORATION_LEDGER_RECORD_SCHEMA
721
+ : PM_EXPLORATION_AUTHENTICATED_LEDGER_RECORD_SCHEMA,
542
722
  descriptorDigest: this.descriptor.descriptorDigest,
543
723
  revision,
544
724
  priorSnapshotDigest: latest?.record.snapshotDigest ?? null,
545
725
  snapshotDigest: snapshot.snapshotDigest,
546
726
  snapshot,
547
727
  committedAt,
728
+ ...(authenticatedEvidence === null
729
+ ? {}
730
+ : {
731
+ evidenceBundle: authenticatedEvidence,
732
+ evidenceDigest: authenticatedEvidence.evidenceDigest,
733
+ executionManifestDigest:
734
+ authenticatedEvidence.executionManifestDigest,
735
+ }),
548
736
  });
549
737
  const published = this.#put(ARTIFACT_TYPE, record, {
550
738
  audience: this.descriptor.audience,
@@ -617,7 +805,7 @@ export class PmExplorationLedgerAdapter {
617
805
  ) {
618
806
  corrupt("PM exploration artifact was not durably retained");
619
807
  }
620
- const eventId = `${PM_EXPLORATION_LEDGER_EVENT_TYPE}.${snapshot.snapshotDigest.slice(7)}`;
808
+ const eventId = recordEventId(record);
621
809
  try {
622
810
  const receipt = this.#append(
623
811
  {
@@ -625,7 +813,7 @@ export class PmExplorationLedgerAdapter {
625
813
  correlationId: this.descriptor.planDigest,
626
814
  decision: "committed",
627
815
  eventId,
628
- reason: `PM exploration recovery snapshot revision ${revision} committed`,
816
+ reason: recordReason(record),
629
817
  skillName: null,
630
818
  sourceRefs: latest ? [latest.event.subjectRef] : [],
631
819
  subjectRef: published.ref,