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
@@ -2,11 +2,16 @@ import { createHash } from "node:crypto";
2
2
  import { types as utilTypes } from "node:util";
3
3
 
4
4
  import { isGovernedKnowledgeDependencyExecutor } from "./governed-knowledge-dependency-ledger-executor.js";
5
+ import { isGovernedKnowledgeArtifactLifecycle } from "./governed-knowledge-artifact-lifecycle.js";
5
6
 
6
7
  export const GOVERNED_KNOWLEDGE_SYNC_SCHEMA =
7
8
  "chainlesschain.governed-evolution-knowledge-sync/v1";
8
9
  export const GOVERNED_KNOWLEDGE_ENVELOPE_SCHEMA =
9
10
  "chainlesschain.governed-evolution-knowledge-envelope/v1";
11
+ export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA =
12
+ "chainlesschain.governed-knowledge-artifact-binding/v2";
13
+ export const GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA =
14
+ "chainlesschain.governed-knowledge-artifact-binding/v1";
10
15
  export const GOVERNED_KNOWLEDGE_SCOPE = Object.freeze({
11
16
  PERSONAL: "personal",
12
17
  PROJECT: "project",
@@ -37,6 +42,20 @@ const ENVELOPE_KEYS = new Set([
37
42
  "tenantId",
38
43
  "vectorClock",
39
44
  ]);
45
+ const ARTIFACT_BINDING_KEYS = new Set([
46
+ "activate",
47
+ "authorizationReceiptDigest",
48
+ "baseline",
49
+ "evidenceDigest",
50
+ "humanReviewed",
51
+ "issuedAt",
52
+ "operationId",
53
+ "operation",
54
+ "schema",
55
+ ]);
56
+ const LEGACY_ARTIFACT_BINDING_KEYS = new Set(
57
+ [...ARTIFACT_BINDING_KEYS].filter((key) => key !== "activate"),
58
+ );
40
59
 
41
60
  function canonical(value) {
42
61
  if (value === null || typeof value !== "object") return JSON.stringify(value);
@@ -206,6 +225,53 @@ export function verifyGovernedKnowledgeRecord(input, { tenantId } = {}) {
206
225
  return normalizeRecord(input, { tenantId: id(tenantId, "tenantId") });
207
226
  }
208
227
 
228
+ export function verifyGovernedKnowledgeArtifactBinding(
229
+ input,
230
+ { tenantId, knowledge, authorizationReceiptDigest } = {},
231
+ ) {
232
+ record(input, "knowledge artifact binding");
233
+ const expectedTenantId = id(tenantId, "tenantId");
234
+ const normalizedKnowledge = verifyGovernedKnowledgeRecord(knowledge, {
235
+ tenantId: expectedTenantId,
236
+ });
237
+ const keys = Reflect.ownKeys(input);
238
+ const current = input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA;
239
+ const legacy =
240
+ input.schema === GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_LEGACY_SCHEMA;
241
+ const expectedKeys = current
242
+ ? ARTIFACT_BINDING_KEYS
243
+ : LEGACY_ARTIFACT_BINDING_KEYS;
244
+ const baseline =
245
+ input.baseline === null
246
+ ? null
247
+ : verifyGovernedKnowledgeRecord(input.baseline, {
248
+ tenantId: expectedTenantId,
249
+ });
250
+ if (
251
+ (!current && !legacy) ||
252
+ keys.length !== expectedKeys.size ||
253
+ keys.some((key) => typeof key !== "string" || !expectedKeys.has(key)) ||
254
+ !ID.test(input.operationId ?? "") ||
255
+ !(
256
+ current ? ["publish", "merge", "receive"] : ["publish", "merge"]
257
+ ).includes(input.operation) ||
258
+ (current && typeof input.activate !== "boolean") ||
259
+ !Number.isFinite(Date.parse(input.issuedAt)) ||
260
+ input.authorizationReceiptDigest !== authorizationReceiptDigest ||
261
+ !DIGEST.test(input.authorizationReceiptDigest ?? "") ||
262
+ !DIGEST.test(input.evidenceDigest ?? "") ||
263
+ typeof input.humanReviewed !== "boolean" ||
264
+ (baseline !== null &&
265
+ (baseline.knowledgeId !== normalizedKnowledge.knowledgeId ||
266
+ baseline.scope !== normalizedKnowledge.scope ||
267
+ baseline.scopeId !== normalizedKnowledge.scopeId)) ||
268
+ canonical(baseline) !== canonical(input.baseline)
269
+ ) {
270
+ throw new Error("knowledge artifact binding is invalid");
271
+ }
272
+ return freeze(clone(input));
273
+ }
274
+
209
275
  export function isGovernedKnowledgeExecutionRecord(value) {
210
276
  return EXECUTION_RECORDS.has(value);
211
277
  }
@@ -250,7 +316,14 @@ export function verifyGovernedKnowledgeEnvelopeIntegrity(
250
316
  }
251
317
 
252
318
  export class GovernedKnowledgeSync {
253
- constructor({ tenantId, deviceId, ports, dependencyExecutor = null } = {}) {
319
+ constructor({
320
+ tenantId,
321
+ deviceId,
322
+ ports,
323
+ dependencyExecutor = null,
324
+ artifactLifecycle,
325
+ clock = () => Date.now(),
326
+ } = {}) {
254
327
  this.tenantId = id(tenantId, "tenantId");
255
328
  this.deviceId = id(deviceId, "deviceId");
256
329
  this._authorize = capture(ports, "authorize");
@@ -265,6 +338,16 @@ export class GovernedKnowledgeSync {
265
338
  ports?.loadPublication === undefined
266
339
  ? null
267
340
  : capture(ports, "loadPublication");
341
+ this._loadReception = capture(ports, "loadReception");
342
+ if (!isGovernedKnowledgeArtifactLifecycle(artifactLifecycle)) {
343
+ throw new TypeError(
344
+ "a branded governed Knowledge artifact lifecycle is required",
345
+ );
346
+ }
347
+ this._prepareArtifact = capture(artifactLifecycle, "prepare");
348
+ this._commitArtifact = capture(artifactLifecycle, "commit");
349
+ if (typeof clock !== "function") throw new TypeError("clock is required");
350
+ this._clock = clock;
268
351
  if (
269
352
  dependencyExecutor !== null &&
270
353
  !isGovernedKnowledgeDependencyExecutor(dependencyExecutor)
@@ -279,7 +362,20 @@ export class GovernedKnowledgeSync {
279
362
  SYNCHRONIZERS.add(this);
280
363
  }
281
364
 
282
- async publish(input, { operationId = null } = {}) {
365
+ async publish(input, options = {}) {
366
+ const result = await this.publishWithArtifactEvidence(input, options);
367
+ return result.envelope;
368
+ }
369
+
370
+ async publishWithArtifactEvidence(
371
+ input,
372
+ {
373
+ operationId = null,
374
+ artifactOperation = "publish",
375
+ artifactEvidenceDigest = null,
376
+ artifactHumanReviewed = false,
377
+ } = {},
378
+ ) {
283
379
  const knowledge = normalizeRecord(input, this, { executionRecord: true });
284
380
  if (knowledge.scope === "personal")
285
381
  throw new Error("personal knowledge cannot enter a shared sync channel");
@@ -301,6 +397,32 @@ export class GovernedKnowledgeSync {
301
397
  throw new Error("publish operationId resolved different knowledge");
302
398
  }
303
399
  verifyGovernedKnowledgeEnvelopeIntegrity(existing.envelope, this);
400
+ const binding = verifyGovernedKnowledgeArtifactBinding(
401
+ existing.artifactBinding,
402
+ {
403
+ tenantId: this.tenantId,
404
+ knowledge,
405
+ authorizationReceiptDigest: existing.authorizationReceiptDigest,
406
+ },
407
+ );
408
+ if (
409
+ artifactOperation !== binding.operation ||
410
+ (artifactEvidenceDigest !== null &&
411
+ artifactEvidenceDigest !== binding.evidenceDigest) ||
412
+ artifactHumanReviewed !== binding.humanReviewed
413
+ ) {
414
+ throw new Error("publish artifact recovery binding differs");
415
+ }
416
+ const prepared = await this._prepareArtifact({
417
+ knowledge,
418
+ currentKnowledge: binding.baseline,
419
+ operation: binding.operation,
420
+ operationId: binding.operationId,
421
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
422
+ evidenceDigest: binding.evidenceDigest,
423
+ issuedAt: binding.issuedAt,
424
+ humanReviewed: binding.humanReviewed,
425
+ });
304
426
  const sent = await this._send({ envelope: existing.envelope });
305
427
  if (
306
428
  sent?.durable !== true ||
@@ -308,10 +430,51 @@ export class GovernedKnowledgeSync {
308
430
  ) {
309
431
  throw new Error("sync transport did not durably accept the envelope");
310
432
  }
311
- return freeze(clone(existing.envelope));
433
+ const artifact = await this._commitArtifact(prepared);
434
+ return freeze({
435
+ envelope: clone(existing.envelope),
436
+ artifact: clone(artifact),
437
+ recovered: true,
438
+ });
312
439
  }
313
440
  }
314
441
  const admission = await this._admit("publish", knowledge);
442
+ const current = await this._load({ knowledgeId: knowledge.knowledgeId });
443
+ const effectiveOperationId =
444
+ operationId ??
445
+ `knowledge-publish:${hash(
446
+ "chainlesschain.governed-knowledge-publish-operation/v1",
447
+ { tenantId: this.tenantId, deviceId: this.deviceId, knowledge },
448
+ ).slice(7)}`;
449
+ const milliseconds = Number(this._clock());
450
+ if (!Number.isFinite(milliseconds))
451
+ throw new TypeError("knowledge sync clock is invalid");
452
+ const binding = freeze({
453
+ schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
454
+ activate: true,
455
+ operationId: effectiveOperationId,
456
+ operation: artifactOperation,
457
+ issuedAt: new Date(milliseconds).toISOString(),
458
+ authorizationReceiptDigest: admission.receiptDigest,
459
+ evidenceDigest: artifactEvidenceDigest ?? admission.receiptDigest,
460
+ humanReviewed: artifactHumanReviewed,
461
+ baseline: current === null ? null : clone(current),
462
+ });
463
+ verifyGovernedKnowledgeArtifactBinding(binding, {
464
+ tenantId: this.tenantId,
465
+ knowledge,
466
+ authorizationReceiptDigest: admission.receiptDigest,
467
+ });
468
+ const prepared = await this._prepareArtifact({
469
+ knowledge,
470
+ currentKnowledge: binding.baseline,
471
+ operation: binding.operation,
472
+ operationId: binding.operationId,
473
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
474
+ evidenceDigest: binding.evidenceDigest,
475
+ issuedAt: binding.issuedAt,
476
+ humanReviewed: binding.humanReviewed,
477
+ });
315
478
  await this._applyRevocationDependencies(knowledge);
316
479
  const plaintext = Buffer.from(canonical(knowledge), "utf8");
317
480
  const encrypted = await this._encrypt({ knowledge, plaintext });
@@ -344,11 +507,19 @@ export class GovernedKnowledgeSync {
344
507
  envelopeDigest,
345
508
  signature: clone(signature),
346
509
  });
347
- await this._persist(knowledge, envelope, "local", admission, operationId);
510
+ await this._persist(
511
+ knowledge,
512
+ envelope,
513
+ "local",
514
+ admission,
515
+ operationId,
516
+ binding,
517
+ );
348
518
  const sent = await this._send({ envelope });
349
519
  if (sent?.durable !== true || sent.envelopeDigest !== envelopeDigest)
350
520
  throw new Error("sync transport did not durably accept the envelope");
351
- return envelope;
521
+ const artifact = await this._commitArtifact(prepared);
522
+ return freeze({ envelope, artifact: clone(artifact), recovered: false });
352
523
  }
353
524
 
354
525
  async receive(envelope) {
@@ -390,6 +561,60 @@ export class GovernedKnowledgeSync {
390
561
  )
391
562
  throw new Error("knowledge envelope substituted its governed record");
392
563
  const admission = await this._admit("receive", knowledge);
564
+ const existing = await this._loadReception({
565
+ envelopeDigest: envelope.envelopeDigest,
566
+ });
567
+ if (existing) {
568
+ const comparable = { ...existing.knowledge };
569
+ delete comparable.conflictWithDigest;
570
+ if (
571
+ !["remote", "conflict"].includes(existing.disposition) ||
572
+ existing.envelopeDigest !== envelope.envelopeDigest ||
573
+ canonical(comparable) !== canonical(knowledge)
574
+ ) {
575
+ throw new Error("receive envelope resolved different knowledge");
576
+ }
577
+ const binding = verifyGovernedKnowledgeArtifactBinding(
578
+ existing.artifactBinding,
579
+ {
580
+ tenantId: this.tenantId,
581
+ knowledge,
582
+ authorizationReceiptDigest: existing.authorizationReceiptDigest,
583
+ },
584
+ );
585
+ if (
586
+ binding.operation !== "receive" ||
587
+ binding.activate !== (existing.disposition === "remote")
588
+ ) {
589
+ throw new Error("receive artifact recovery binding differs");
590
+ }
591
+ const prepared = await this._prepareArtifact({
592
+ knowledge,
593
+ currentKnowledge: binding.baseline,
594
+ operation: binding.operation,
595
+ operationId: binding.operationId,
596
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
597
+ evidenceDigest: binding.evidenceDigest,
598
+ issuedAt: binding.issuedAt,
599
+ activate: binding.activate,
600
+ humanReviewed: binding.humanReviewed,
601
+ });
602
+ const artifact = await this._commitArtifact(prepared);
603
+ return existing.disposition === "conflict"
604
+ ? freeze({
605
+ applied: false,
606
+ reason: "conflict",
607
+ requiresHumanMerge: true,
608
+ recovered: true,
609
+ artifact: clone(artifact),
610
+ })
611
+ : freeze({
612
+ applied: true,
613
+ action: knowledge.action,
614
+ recovered: true,
615
+ artifact: clone(artifact),
616
+ });
617
+ }
393
618
  const current = await this._load({ knowledgeId: knowledge.knowledgeId });
394
619
  if (current) {
395
620
  const order = relation(current.vectorClock, knowledge.vectorClock);
@@ -400,22 +625,105 @@ export class GovernedKnowledgeSync {
400
625
  return freeze({ applied: false, reason: "replay" });
401
626
  }
402
627
  if (order === "concurrent") {
628
+ const binding = this._receiveArtifactBinding({
629
+ knowledge,
630
+ current,
631
+ admission,
632
+ envelope,
633
+ activate: false,
634
+ });
635
+ const prepared = await this._prepareArtifact({
636
+ knowledge,
637
+ currentKnowledge: binding.baseline,
638
+ operation: binding.operation,
639
+ operationId: binding.operationId,
640
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
641
+ evidenceDigest: binding.evidenceDigest,
642
+ issuedAt: binding.issuedAt,
643
+ activate: binding.activate,
644
+ humanReviewed: binding.humanReviewed,
645
+ });
403
646
  await this._persist(
404
647
  { ...knowledge, conflictWithDigest: current.contentDigest },
405
648
  envelope,
406
649
  "conflict",
407
650
  admission,
651
+ null,
652
+ binding,
408
653
  );
654
+ const artifact = await this._commitArtifact(prepared);
409
655
  return freeze({
410
656
  applied: false,
411
657
  reason: "conflict",
412
658
  requiresHumanMerge: true,
659
+ recovered: false,
660
+ artifact: clone(artifact),
413
661
  });
414
662
  }
415
663
  }
664
+ const binding = this._receiveArtifactBinding({
665
+ knowledge,
666
+ current,
667
+ admission,
668
+ envelope,
669
+ activate: true,
670
+ });
671
+ const prepared = await this._prepareArtifact({
672
+ knowledge,
673
+ currentKnowledge: binding.baseline,
674
+ operation: binding.operation,
675
+ operationId: binding.operationId,
676
+ authorizationReceiptDigest: binding.authorizationReceiptDigest,
677
+ evidenceDigest: binding.evidenceDigest,
678
+ issuedAt: binding.issuedAt,
679
+ activate: binding.activate,
680
+ humanReviewed: binding.humanReviewed,
681
+ });
416
682
  await this._applyRevocationDependencies(knowledge);
417
- await this._persist(knowledge, envelope, "remote", admission);
418
- return freeze({ applied: true, action: knowledge.action });
683
+ await this._persist(
684
+ knowledge,
685
+ envelope,
686
+ "remote",
687
+ admission,
688
+ null,
689
+ binding,
690
+ );
691
+ const artifact = await this._commitArtifact(prepared);
692
+ return freeze({
693
+ applied: true,
694
+ action: knowledge.action,
695
+ recovered: false,
696
+ artifact: clone(artifact),
697
+ });
698
+ }
699
+
700
+ _receiveArtifactBinding({
701
+ knowledge,
702
+ current,
703
+ admission,
704
+ envelope,
705
+ activate,
706
+ }) {
707
+ const milliseconds = Number(this._clock());
708
+ if (!Number.isFinite(milliseconds))
709
+ throw new TypeError("knowledge sync clock is invalid");
710
+ const binding = freeze({
711
+ schema: GOVERNED_KNOWLEDGE_ARTIFACT_BINDING_SCHEMA,
712
+ activate,
713
+ operationId: `knowledge-receive:${envelope.envelopeDigest.slice(7)}`,
714
+ operation: "receive",
715
+ issuedAt: new Date(milliseconds).toISOString(),
716
+ authorizationReceiptDigest: admission.receiptDigest,
717
+ evidenceDigest: envelope.envelopeDigest,
718
+ humanReviewed: false,
719
+ baseline: current === null ? null : clone(current),
720
+ });
721
+ verifyGovernedKnowledgeArtifactBinding(binding, {
722
+ tenantId: this.tenantId,
723
+ knowledge,
724
+ authorizationReceiptDigest: admission.receiptDigest,
725
+ });
726
+ return binding;
419
727
  }
420
728
 
421
729
  async _admit(operation, knowledge) {
@@ -439,6 +747,7 @@ export class GovernedKnowledgeSync {
439
747
  disposition,
440
748
  admission,
441
749
  operationId = null,
750
+ artifactBinding = null,
442
751
  ) {
443
752
  const result = await this._commit({
444
753
  knowledge,
@@ -447,6 +756,7 @@ export class GovernedKnowledgeSync {
447
756
  disposition,
448
757
  authorizationReceiptDigest: admission.receiptDigest,
449
758
  operationId,
759
+ artifactBinding,
450
760
  });
451
761
  if (
452
762
  result?.authenticated !== true ||
@@ -705,8 +705,8 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
705
705
  file: "desktop-app-vue/src/main/ai-engine/cowork/skills/skill-sync-manager.js",
706
706
  symbol: "SkillSyncManager.importSkill",
707
707
  evidence: [
708
- "await this.candidateStore.create(createRequest)",
709
- "validateCandidateReadback(readback, receipt, createRequest)",
708
+ "const staged = await this.artifactCandidateGate.stageCandidate(",
709
+ "persistenceReceipt: staged.receipt",
710
710
  'action: "candidate-staged"',
711
711
  "activeMutation: false",
712
712
  ],
@@ -716,9 +716,9 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
716
716
  id: "desktop-plugin-install",
717
717
  surface: "desktop",
718
718
  triggerClass: "manual",
719
- targetAuthority: "legacy-active",
720
- mutationType: "indirect-plugin-tree",
721
- discoverySymbol: "installPlugin",
719
+ targetAuthority: "candidate-only",
720
+ mutationType: "inactive-plugin-tree",
721
+ discoverySymbol: null,
722
722
  entrypoint: {
723
723
  file: "desktop-app-vue/src/main/marketplace/plugin-installer.js",
724
724
  symbol: "PluginInstaller.installPlugin",
@@ -730,7 +730,8 @@ export const SKILL_WRITER_INVENTORY = Object.freeze({
730
730
  evidence: [
731
731
  "await this.extractPlugin(downloadPath, pluginDir)",
732
732
  'path.join(pluginDir, "SKILL.md")',
733
- "registry.hotLoadSkill(definition.name, definition)",
733
+ "Marketplace SKILL.md files are not active at install time",
734
+ "governed promotion is required",
734
735
  ],
735
736
  },
736
737
  }),