chainlesschain 0.166.21 → 0.166.22

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 (178) hide show
  1. package/README.md +67 -9
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-BjMnsUci.js → AIOps-oJ7USzMC.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DdYFP03A.js → ActionButton-BlgnZe_C.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Bb8TuuK_.js → Analytics-D2rRbTLu.js} +2 -2
  6. package/src/assets/web-panel/assets/{AppLayout-Kn3TIOtk.js → AppLayout-FwS3f0B2.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-4IxpqI_b.js → Artifacts-iF-_08Hi.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BOV2caqU.js → Audit-D24p0zQw.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-B86k-ay4.js → BackgroundAgents-Cg3mRVi9.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C5_ie1e3.js → Backup-EOqht3H-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-xpwg6QCW.js → BaseInput-9XWYq2hj.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-CVZOcZau.js → Chat-Dq5yardA.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D8fPYhUu.js → ChatBubbleRenderer-Ds3pA-ET.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-MKTq3zdP.js → Checkbox-CuyCBoBf.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-JUk3wzep.js → Codegen-DjWtYHNe.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-JPvTA0kC.js → Col-CrVr_iuG.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-Tqgl87NQ.js → Community-C6QxpfGc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BuAFYBmN.js → Compact-B-v5r6Pa.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CXS9WIPZ.js → Compliance-zNiLiFgD.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-Ds2bFHrr.js → Cowork-D9K7lMOu.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-C_dV_OeW.js → Cron-DAjO36z4.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-BsO6tIRo.js → Crosschain-Bxqn0aqB.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-rNOFqBac.js → DID-DfRmLUe-.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2fcKKVY.js → Dashboard-Cz8KF3fr.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Y7Ndr0X_.js → Dropdown-C4oVfkP0.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-DcP_uPmL.js → EmailListRenderer-ivyZKN8k.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Cwn3gDzk.js → FamilyGuardDashboard-DoxY1CPW.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-ClQuOsqb.js → Federation-C93gZxnb.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-DfwtmlcK.js → FormItemContext-D_lEjYJE.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-zNZhtbC5.js → GenericCardRenderer-BNFN9YjN.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BZmdW-G5.js → Git-mUu2HcLI.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CqBk4lEn.js → Governance-CNuosrge.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-Dbmt3ZXk.js → Inference-DwY5pbCB.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-hMTH6qf3.js → KnowledgeGraph-aRUxhACD.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-CkiYgiW2.js → Logs-DFfsWYy_.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-BL1FElXg.js → MarkdownRenderer-DqTx7_u1.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-CbB6wfin.js → Marketplace-COI-ciM-.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BSwiFtte.js → McpTools-BJJwaIpe.js} +2 -2
  39. package/src/assets/web-panel/assets/{Memory-B03PeHrz.js → Memory-CDO6SGDZ.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-CRGrnd-X.js → MobileBridge-BlZ5tFf4.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CE_5v2kO.js → MobileProjects-DuoxbgWz.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Dp11QVx1.js → Mtc-6ec9j70b.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-CYu-3JBu.js → MtcAudit-BuL7HkC7.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-CGyJ0Xl3.js → Multisig-CJxR85lk.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CoWi_ov1.js → NLProgramming-B71O1S4l.js} +1 -1
  46. package/src/assets/web-panel/assets/Notes-Bsw5zbpV.js +7 -0
  47. package/src/assets/web-panel/assets/{NotificationSettings-DX4I2b4W.js → NotificationSettings-BnAhXuK_.js} +1 -1
  48. package/src/assets/web-panel/assets/OrderTableRenderer-BJ0R5GGz.js +1 -0
  49. package/src/assets/web-panel/assets/{Organization-oopLO_tk.js → Organization-B7wwNxoP.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-BFVvjMyf.js → Overflow-CfAGr0gM.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CBy5t-Tk.js → P2P-KhMg22Fz.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser--YWJNsu6.js → PdhVaultBrowser-NdAXI9ft.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-C2dZ8scb.js → Permissions-CIYjqyT7.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Bs3l7Hlx.js → PersonalDataHub-D2ht3P_R.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-DEBWbZuD.js → Pipeline-i6flZW1m.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-CjHBb6NU.js → Privacy-DE0lhYVc.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-D2WipUz5.js → ProjectInit-BL3YbyxS.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-B6WfnrGB.js → ProjectSettings-CEtdg7ni.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-FF_thRi6.js → Projects-CvtU5peJ.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-CCv5M_Dv.js → Providers-DKt_Cg-j.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-CGthxU54.js → QrScannerModal-DA61jNSx.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-CnPmXPFb.js → QuickAsk-fS9ryUmq.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Df_tGEa9.js → Recommend-CR9dZU5Y.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-Z58N0Loe.js → RemoteSession-BV0BR2Dz.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CZTBQ2Vt.js → Reputation-BIeGUvYD.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-CdK3YpCQ.js → Row-DHDT1aro.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CFMVT5sb.js → RssFeed-Cq6YKb1h.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DrF8RIvD.js → Search-DEF6vsy6.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-Ddk2f2DM.js → Security-CHtYiKY9.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-CCuK-VOo.js → Services-u16lvBJN.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DxCpHzeM.js → Skeleton-CGbizyDj.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-t2oTDgcv.js → Skills-BZMQcAa7.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Df63M9_R.js → Sla-Bm-CycVi.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-l7ox6KuX.js → SpeechSettings-BudpA5kr.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-COd_tgPp.js → SyncSettings-B8q1C1eC.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-CzDCcrik.js → Tasks-SU1pBWc-.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-D-vfxTGA.js → Templates-CyOfJzmt.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BlpT_Gxc.js → Tenant-xqWSm2GP.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-D5rq52Hg.js → Terminal-D1Ttgjsi.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DdoMndkK.js → TimelineRenderer-Da2lYs5D.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BhgBsI6g.js → Tokens-B34-SduO.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-DwwzoikZ.js → Trigger-C8zyYm4R.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-HkTpzXFb.js → Trust-D1Pvqems.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-D9nk6Ehe.js → UkeySign-Do3VVnAy.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-BKk0rfoy.js → VideoEditing-Dz7egVIA.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-IVWIU_Lq.js → Wallet-Dcuw-OxR.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-CFTCpfsG.js → WebAuthn-DPlw-QsB.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Dnf4Obif.js → WorkflowEditor-h4OsnU5q.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-D2snERdj.js → chat-eO9wEwrW.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DKEjK1N1.js → colors-34lSmOXw.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BEDLwQdt.js → compact-item-CK4kEWJ4.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-DA9iW1a0.js → createContext-E0A57xed.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CF3xafX2.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-5l2xEcY9.js → hasIn-BD9ZMGAl.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-C7sKbM5s.js → index--N0u6kTG.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DU2TXJu-.js → index-8qMA1DWQ.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CxEtQYdi.js → index-B0rkHxKK.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B7_W_rYd.js → index-B_G_ElKO.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B4QYBliR.js → index-BbX_Dted.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DLoalqRX.js → index-Bjs90Eh9.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-Dbkghqn_.js → index-BmNbU2Z6.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BgfImyZI.js → index-Brqc9Emx.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-5pW4t1iD.js → index-BsGmo6v1.js} +1 -1
  104. package/src/assets/web-panel/assets/index-C907rPwd.js +1 -0
  105. package/src/assets/web-panel/assets/{index-CRPrHE7h.js → index-CT1_eRL-.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DvV03Ayk.js → index-CZBaqe3d.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D7z4zB_a.js → index-CZkFMeWL.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CmruhzFi.js → index-Ch175NUw.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-e-e40id6.js → index-CsrKJJcX.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CGlotREA.js → index-CuSau5ya.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CjWltbi_.js → index-Cx3Jn1r0.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-fccZmC_h.js → index-Cz3unNfL.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-NJieh3T1.js → index-D4bB_x_v.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CkMKuqUs.js → index-DCn-ECvK.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BZ5lY2zx.js → index-DFLE2qO9.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B_eCoZgW.js → index-DGRxt5wj.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-7P1b8HZo.js → index-DONOUtlz.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-yYEQXYaU.js → index-DP-UZAQN.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Dbd7eEex.js → index-Da5fmOHB.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bqc8tdIF.js → index-DcE1BspQ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DXet1xol.js → index-DcbgVLOH.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-BO9dQjpt.js → index-DeXNCyQJ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CX1x4AFn.js → index-DiT_REby.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Bq5P3piS.js → index-DpfisY1g.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Csfb-7hw.js → index-DrOalGut.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DpqtbXdE.js → index-DrSAAuJj.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-B00GeekA.js → index-DrsDA_md.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Dg2a9owQ.js → index-DvKcroix.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-fgYk0QXO.js → index-DzXjP44T.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Td8ZwyoC.js → index-MIg5Z8qe.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DqwPFbOb.js → index-o8pYehRq.js} +3 -3
  132. package/src/assets/web-panel/assets/index-wueRSK2d.js +1 -0
  133. package/src/assets/web-panel/assets/{index-CbTPvp2_.js → index-yAGBu2E0.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-CPrcB1TC.js → initDefaultProps-DMTkAomF.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BQ7mWRh_.js → motion-Cnti1F5g.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-CzOEq99p.js → move-CGxmHUga.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-BlQI5jrw.js → mtc-parser-CuwwLoq7.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DlW4gxmv.js → omit-BpdlTkPM.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-BBYms5nP.js → pickAttrs-D7nWrThp.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-az2MPJ_7.js → placementArrow-Bhx0TV8F.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-D1-ibEol.js → responsiveObserve-CZ1KesZh.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DHGqa4GA.js → slide-CnldF8J6.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-CYGDo6lD.js → statusUtils-CZfo_GOA.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-Cl2EM9K6.js → styleChecker-B2QCcAv5.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DdYhzuv1.js → useFlexGapSupport-DzzjIS4J.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DWumPuBW.js → useFs-B_atg9M0.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-DxAO-Aqi.js → usePersonalDataHub-DhZs3QYN.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-CplsQf_N.js → vnode-DcePTYAm.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cw5HXNSG.js → zoom-BYmlnjRk.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/commands/serve.js +31 -0
  152. package/src/data/changelog.json +13 -0
  153. package/src/index.js +11 -3
  154. package/src/lazy-dispatch.js +9 -1
  155. package/src/lib/app-server/websocket-transport.js +21 -0
  156. package/src/lib/evolution/evolution-artifact-ports.js +9 -0
  157. package/src/lib/evolution/evolution-deployment-loader.js +208 -0
  158. package/src/lib/evolution/evolution-release-train-ledger-adapter.js +335 -0
  159. package/src/lib/evolution/evolution-release-train.js +538 -0
  160. package/src/lib/evolution/evolution-workbench-projection.js +20 -1
  161. package/src/lib/evolution/evolvable-artifact-ledger-adapter.js +688 -0
  162. package/src/lib/evolution/governed-knowledge-artifact-lifecycle.js +364 -0
  163. package/src/lib/evolution/governed-knowledge-merge-ledger-executor.js +29 -2
  164. package/src/lib/evolution/governed-knowledge-merge-publisher-authority.js +31 -3
  165. package/src/lib/evolution/governed-knowledge-sync-ledger-adapter.js +92 -6
  166. package/src/lib/evolution/governed-knowledge-sync-merge-publisher.js +57 -4
  167. package/src/lib/evolution/governed-knowledge-sync.js +317 -7
  168. package/src/lib/evolution/skill-writer-inventory-manifest.js +7 -6
  169. package/src/lib/evolution/statistical-progressive-canary.js +683 -0
  170. package/src/lib/evolution/wikiskill-benchmark.js +510 -0
  171. package/src/lib/session-host-lease.js +11 -16
  172. package/src/runtime/agent-core.js +61 -7
  173. package/src/runtime/headless-stream.js +3 -0
  174. package/src/assets/web-panel/assets/Notes-CgU9DDo9.js +0 -7
  175. package/src/assets/web-panel/assets/OrderTableRenderer-CwHc15Zs.js +0 -1
  176. package/src/assets/web-panel/assets/devWarning-DyhgpXPf.js +0 -1
  177. package/src/assets/web-panel/assets/index-Ck1jhFE0.js +0 -1
  178. package/src/assets/web-panel/assets/index-c8jJEHVs.js +0 -1
@@ -11,11 +11,16 @@ import {
11
11
  } from "./evolution-ledger.js";
12
12
  import {
13
13
  GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA,
14
+ verifyGovernedKnowledgeArtifactBinding,
14
15
  verifyGovernedKnowledgeEnvelopeIntegrity,
15
16
  verifyGovernedKnowledgeRecord,
16
17
  } from "./governed-knowledge-sync.js";
17
18
 
18
19
  export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA =
20
+ "chainlesschain.governed-evolution-knowledge-ledger-record/v4";
21
+ export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA =
22
+ "chainlesschain.governed-evolution-knowledge-ledger-record/v3";
23
+ export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA =
19
24
  "chainlesschain.governed-evolution-knowledge-ledger-record/v2";
20
25
  export const GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA =
21
26
  "chainlesschain.governed-evolution-knowledge-ledger-record/v1";
@@ -32,6 +37,7 @@ const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,255}$/u;
32
37
  const DISPOSITIONS = new Set(["conflict", "local", "remote"]);
33
38
  const MAX_CONFLICT_PAGE = 256;
34
39
  const RECORD_KEYS = new Set([
40
+ "artifactBinding",
35
41
  "committedAt",
36
42
  "authorizationReceiptDigest",
37
43
  "conflictWithDigest",
@@ -45,8 +51,11 @@ const RECORD_KEYS = new Set([
45
51
  "schema",
46
52
  "tenantId",
47
53
  ]);
54
+ const V2_RECORD_KEYS = new Set(
55
+ [...RECORD_KEYS].filter((key) => key !== "artifactBinding"),
56
+ );
48
57
  const LEGACY_RECORD_KEYS = new Set(
49
- [...RECORD_KEYS].filter((key) => key !== "operationId"),
58
+ [...V2_RECORD_KEYS].filter((key) => key !== "operationId"),
50
59
  );
51
60
 
52
61
  function canonical(value) {
@@ -132,9 +141,23 @@ function recordCore(value) {
132
141
  authorizationReceiptDigest: value.authorizationReceiptDigest,
133
142
  committedAt: value.committedAt,
134
143
  };
135
- if (value.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA) {
144
+ if (
145
+ [
146
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
147
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
148
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
149
+ ].includes(value.schema)
150
+ ) {
136
151
  core.operationId = value.operationId;
137
152
  }
153
+ if (
154
+ [
155
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
156
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
157
+ ].includes(value.schema)
158
+ ) {
159
+ core.artifactBinding = value.artifactBinding;
160
+ }
138
161
  return core;
139
162
  }
140
163
 
@@ -208,14 +231,24 @@ function validateEnvelope(value, knowledge, descriptor, disposition) {
208
231
  function validateLedgerRecord(value, descriptor) {
209
232
  const current =
210
233
  value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA;
234
+ const version3 =
235
+ value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA;
236
+ const version2 =
237
+ value?.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA;
211
238
  exact(
212
239
  value,
213
- current ? RECORD_KEYS : LEGACY_RECORD_KEYS,
240
+ current || version3
241
+ ? RECORD_KEYS
242
+ : version2
243
+ ? V2_RECORD_KEYS
244
+ : LEGACY_RECORD_KEYS,
214
245
  "knowledge sync ledger record",
215
246
  );
216
247
  if (
217
248
  ![
218
249
  GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
250
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
251
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
219
252
  GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_LEGACY_SCHEMA,
220
253
  ].includes(value.schema) ||
221
254
  value.tenantId !== descriptor.tenantId ||
@@ -231,10 +264,10 @@ function validateLedgerRecord(value, descriptor) {
231
264
  corrupt("knowledge sync ledger record binding is invalid");
232
265
  }
233
266
  if (
234
- (current &&
267
+ ((current || version3 || version2) &&
235
268
  value.operationId !== null &&
236
269
  !SAFE_ID.test(value.operationId ?? "")) ||
237
- (!current && Object.hasOwn(value, "operationId"))
270
+ (!current && !version3 && !version2 && Object.hasOwn(value, "operationId"))
238
271
  ) {
239
272
  corrupt("knowledge sync operation binding is invalid");
240
273
  }
@@ -246,6 +279,33 @@ function validateLedgerRecord(value, descriptor) {
246
279
  if (value.conflictWithDigest !== conflictWithDigest) {
247
280
  corrupt("knowledge sync conflict digest was substituted");
248
281
  }
282
+ if (current || version3) {
283
+ if (current || value.disposition === "local") {
284
+ try {
285
+ const binding = verifyGovernedKnowledgeArtifactBinding(
286
+ value.artifactBinding,
287
+ {
288
+ tenantId: descriptor.tenantId,
289
+ knowledge: value.knowledge,
290
+ authorizationReceiptDigest: value.authorizationReceiptDigest,
291
+ },
292
+ );
293
+ if (
294
+ current &&
295
+ (binding.activate !== (value.disposition !== "conflict") ||
296
+ (value.disposition === "local"
297
+ ? !["publish", "merge"].includes(binding.operation)
298
+ : binding.operation !== "receive"))
299
+ ) {
300
+ corrupt("knowledge sync artifact activation binding is invalid");
301
+ }
302
+ } catch {
303
+ corrupt("knowledge sync artifact binding is invalid");
304
+ }
305
+ } else if (value.artifactBinding !== null) {
306
+ corrupt("remote knowledge sync cannot claim an artifact binding");
307
+ }
308
+ }
249
309
  validateEnvelope(
250
310
  value.envelope,
251
311
  value.knowledge,
@@ -398,6 +458,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
398
458
  disposition,
399
459
  authorizationReceiptDigest,
400
460
  operationId = null,
461
+ artifactBinding = null,
401
462
  } = {}) => {
402
463
  if (!DISPOSITIONS.has(disposition)) {
403
464
  throw new TypeError("knowledge sync disposition is invalid");
@@ -451,6 +512,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
451
512
  conflictWithDigest,
452
513
  authorizationReceiptDigest,
453
514
  operationId,
515
+ artifactBinding,
454
516
  };
455
517
  if (canonical(stableExisting) !== canonical(stableRequest)) {
456
518
  corrupt("knowledge sync event identity resolved different content");
@@ -479,6 +541,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
479
541
  conflictWithDigest,
480
542
  authorizationReceiptDigest,
481
543
  operationId,
544
+ artifactBinding: clone(artifactBinding),
482
545
  committedAt,
483
546
  };
484
547
  const record = Object.freeze({
@@ -556,7 +619,11 @@ export class GovernedKnowledgeSyncLedgerAdapter {
556
619
  )
557
620
  ).filter(
558
621
  (record) =>
559
- record.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA &&
622
+ [
623
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA,
624
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V3_SCHEMA,
625
+ GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_V2_SCHEMA,
626
+ ].includes(record.schema) &&
560
627
  record.disposition === "local" &&
561
628
  record.operationId === normalizedId,
562
629
  );
@@ -566,6 +633,24 @@ export class GovernedKnowledgeSyncLedgerAdapter {
566
633
  return matches[0] ?? null;
567
634
  };
568
635
 
636
+ getReception = async ({ envelopeDigest } = {}) => {
637
+ if (!DIGEST.test(envelopeDigest ?? "")) {
638
+ throw new TypeError("knowledge reception envelope digest is invalid");
639
+ }
640
+ const matches = (
641
+ await Promise.all(
642
+ this._events().map((event) => this._resolveEvent(event)),
643
+ )
644
+ ).filter(
645
+ (record) =>
646
+ record.schema === GOVERNED_KNOWLEDGE_SYNC_LEDGER_RECORD_SCHEMA &&
647
+ ["remote", "conflict"].includes(record.disposition) &&
648
+ record.envelopeDigest === envelopeDigest,
649
+ );
650
+ if (matches.length > 1) corrupt("knowledge reception is ambiguous");
651
+ return matches[0] ?? null;
652
+ };
653
+
569
654
  listConflicts = async ({ cursor = 0, limit = 50 } = {}) => {
570
655
  if (
571
656
  !Number.isSafeInteger(cursor) ||
@@ -629,6 +714,7 @@ export class GovernedKnowledgeSyncLedgerAdapter {
629
714
  send: capture(send, "send", "send"),
630
715
  load: this.load,
631
716
  loadPublication: this.getPublication,
717
+ loadReception: this.getReception,
632
718
  commit: this.commit,
633
719
  });
634
720
  }
@@ -8,6 +8,7 @@ import {
8
8
  } from "./governed-knowledge-merge-publisher-authority.js";
9
9
  import { isGovernedKnowledgeSync } from "./governed-knowledge-sync.js";
10
10
  import { isGovernedKnowledgePublicationReader } from "./governed-knowledge-sync-ledger-adapter.js";
11
+ import { isEvolvableArtifactTransitionReader } from "./evolvable-artifact-ledger-adapter.js";
11
12
 
12
13
  export const GOVERNED_KNOWLEDGE_SYNC_MERGE_VERIFICATION_SCHEMA =
13
14
  "chainlesschain.governed-knowledge-sync-merge-verification/v1";
@@ -121,6 +122,7 @@ function verifyStoredPublication(record, request, envelope = null) {
121
122
 
122
123
  export function createGovernedKnowledgeSyncMergePublisherAuthority({
123
124
  sync,
125
+ verifierArtifactTransitionReader,
124
126
  providerPublicationReader,
125
127
  verifierPublicationReader,
126
128
  providerDescriptor,
@@ -142,9 +144,22 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
142
144
  }
143
145
  const tenantId = sync.tenantId;
144
146
  const deviceId = sync.deviceId;
147
+ if (
148
+ !isEvolvableArtifactTransitionReader(verifierArtifactTransitionReader) ||
149
+ verifierArtifactTransitionReader.tenantId !== tenantId
150
+ ) {
151
+ throw new TypeError(
152
+ "an independent tenant-bound artifact transition reader is required",
153
+ );
154
+ }
155
+ const readArtifactTransition = capture(
156
+ verifierArtifactTransitionReader,
157
+ "readTransition",
158
+ "verifierArtifactTransitionReader",
159
+ );
145
160
  const providerIdentity = descriptor(providerDescriptor, "provider");
146
161
  const verifierIdentity = descriptor(verifierDescriptor, "verifier");
147
- const publish = capture(sync, "publish", "sync");
162
+ const publish = capture(sync, "publishWithArtifactEvidence", "sync");
148
163
  const readProviderPublication = bindReader(
149
164
  providerPublicationReader,
150
165
  tenantId,
@@ -158,10 +173,14 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
158
173
  "verifierPublicationReader",
159
174
  );
160
175
  const provider = Object.freeze({
161
- async publish(request) {
162
- const envelope = await publish(request.mergedKnowledge, {
176
+ async publish(request, plan) {
177
+ const published = await publish(request.mergedKnowledge, {
163
178
  operationId: request.operationId,
179
+ artifactOperation: "merge",
180
+ artifactEvidenceDigest: plan.humanReceiptDigest,
181
+ artifactHumanReviewed: true,
164
182
  });
183
+ const { envelope, artifact } = published;
165
184
  const stored = verifyStoredPublication(
166
185
  await readProviderPublication({ operationId: request.operationId }),
167
186
  request,
@@ -184,6 +203,12 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
184
203
  knowledgeId: request.knowledgeId,
185
204
  mergedContentDigest: request.mergedContentDigest,
186
205
  envelopeDigest: stored.envelopeDigest,
206
+ artifactCandidateDigest: artifact.artifactCandidateDigest,
207
+ artifactDigest: artifact.artifactDigest,
208
+ artifactReleaseId: artifact.artifactReleaseId,
209
+ artifactTransitionOperationId: artifact.artifactTransitionOperationId,
210
+ artifactTransitionReceiptDigest:
211
+ artifact.artifactTransitionReceiptDigest,
187
212
  providerAuthorityId: providerIdentity.authorityId,
188
213
  providerRevision: providerIdentity.revision,
189
214
  providerHandlerArtifactDigest: providerIdentity.handlerArtifactDigest,
@@ -204,13 +229,30 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
204
229
  await readVerifierPublication({ operationId: request.operationId }),
205
230
  request,
206
231
  );
232
+ const transition = await readArtifactTransition({
233
+ operationId: result.artifactTransitionOperationId,
234
+ });
207
235
  if (
208
236
  result.envelopeDigest !== stored.envelopeDigest ||
209
237
  Date.parse(result.publishedAt) < Date.parse(stored.committedAt) ||
210
238
  canonical(result.attestation) !==
211
239
  canonical(stored.envelope.signature) ||
212
240
  result.resultDigest !==
213
- digestGovernedKnowledgeMergePublishResult(result)
241
+ digestGovernedKnowledgeMergePublishResult(result) ||
242
+ transition?.request?.previousArtifactDigest !==
243
+ result.artifactCandidateDigest ||
244
+ transition.request.nextArtifactDigest !== result.artifactDigest ||
245
+ transition.artifact.artifactDigest !== result.artifactDigest ||
246
+ transition.artifact.activeReleaseId !== result.artifactReleaseId ||
247
+ transition.artifact.contentDigest !== request.mergedContentDigest ||
248
+ transition.artifact.runtimeManifest.operation !== "merge" ||
249
+ transition.artifact.runtimeManifest.operationId !==
250
+ request.operationId ||
251
+ transition.receipt.operationId !==
252
+ result.artifactTransitionOperationId ||
253
+ transition.receipt.receiptDigest !==
254
+ result.artifactTransitionReceiptDigest ||
255
+ transition.receipt.durable !== true
214
256
  ) {
215
257
  throw new Error("merge publication result differs from durable state");
216
258
  }
@@ -224,6 +266,12 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
224
266
  resultDigest: result.resultDigest,
225
267
  envelopeDigest: stored.envelopeDigest,
226
268
  publicationRecordDigest: stored.recordDigest,
269
+ artifactCandidateDigest: result.artifactCandidateDigest,
270
+ artifactDigest: result.artifactDigest,
271
+ artifactReleaseId: result.artifactReleaseId,
272
+ artifactTransitionOperationId: result.artifactTransitionOperationId,
273
+ artifactTransitionReceiptDigest:
274
+ result.artifactTransitionReceiptDigest,
227
275
  verifierAuthorityId: verifierIdentity.authorityId,
228
276
  verifierRevision: verifierIdentity.revision,
229
277
  verifierHandlerArtifactDigest: verifierIdentity.handlerArtifactDigest,
@@ -239,6 +287,11 @@ export function createGovernedKnowledgeSyncMergePublisherAuthority({
239
287
  planDigest: request.planDigest,
240
288
  resultDigest: result.resultDigest,
241
289
  envelopeDigest: stored.envelopeDigest,
290
+ artifactCandidateDigest: result.artifactCandidateDigest,
291
+ artifactDigest: result.artifactDigest,
292
+ artifactReleaseId: result.artifactReleaseId,
293
+ artifactTransitionOperationId: result.artifactTransitionOperationId,
294
+ artifactTransitionReceiptDigest: result.artifactTransitionReceiptDigest,
242
295
  providerAuthorityId: providerIdentity.authorityId,
243
296
  providerRevision: providerIdentity.revision,
244
297
  verifierAuthorityId: verifierIdentity.authorityId,