chainlesschain 0.163.7 → 0.163.8

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 (181) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/assets/{AIOps-axqQfwv8.js → AIOps-CavM7W3k.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DV-Ro0By.js → ActionButton-CUvZGabQ.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-Bt72WEVu.js → Analytics-DeBnWnbe.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-BtepG55E.js → AppLayout-DbI5kxvd.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-B7KaJ7S_.js → Artifacts-D93bigKm.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-FNFaUg7A.js → Audit-CBNvfUZa.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DFb6J2wQ.js → BackgroundAgents-CJLyh_YU.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-CC7YBhyj.js → Backup-D_0yoehD.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-RkgTNVtj.js → BaseInput-TJxmbObW.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-hHEmGZy-.js → Chat-CE0dto1q.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CAP9YhHv.js → ChatBubbleRenderer-CZ5-yYiD.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-z5wXOQP1.js → Checkbox-Ck1RVIVo.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DVaDJnxy.js → Codegen-qpoyf6DK.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-CJmaRDR5.js → Col-DUyPWjIE.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DF29_2bI.js → Community-D_S1BemS.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DtkQkBzn.js → Compact-BjxeK-Gc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-xoHDxp7I.js → Compliance-Dd3CEJsu.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-BUm-R7ht.js → Cowork-B4QG7-ad.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-Cgl14ZkB.js → Cron-BtZnids5.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BNcbmoqh.js → Crosschain-CHPfCBFD.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-Bwja0Zo9.js → DID-DT8DCEOK.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-Bk5XjEdJ.js → Dashboard-COQab5_U.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-Ci36Oitq.js → Dropdown-BY1PsQuU.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer--U04ZN4q.js → EmailListRenderer-CsuAuaq3.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B2gNPR2s.js → FamilyGuardDashboard-BqpinD-j.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-C4KghYn7.js → Federation-D0gkfQFv.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-QL7x_Q_0.js → FormItemContext-BqgE-axK.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-F3Ryltwm.js → GenericCardRenderer-D0hJ2KvC.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-2HassK5k.js → Git-CmMB0uPY.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DoBIp7oe.js → Governance-BnVEI0Dk.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference--W01QhZ-.js → Inference-YTAMihRP.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DmvwqGpT.js → KnowledgeGraph-0ax7VHop.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BBJ4yAel.js → Logs-B9TRcokL.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-D5lNngSI.js → Marketplace-B6CSuD_H.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-CkEVOMKH.js → McpTools-CjMXvOVU.js} +4 -4
  38. package/src/assets/web-panel/assets/{Memory-B1Ow1xVE.js → Memory-CXRF71U3.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-SgYbUfb6.js → MobileBridge-DQgNp_oS.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-BWdOvQAj.js → MobileProjects-DlPwcCbq.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-DcTXSSma.js → Mtc-6hDTRPe1.js} +2 -2
  42. package/src/assets/web-panel/assets/{MtcAudit-Dt3WG4oj.js → MtcAudit-BlVHU1DS.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-B9B38UZx.js → Multisig-DP9pzEbV.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-B0S4GGvG.js → NLProgramming-Djorh8EV.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-DZ5U58Ng.js → Notes-oLZ-JkUg.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-PjL5ZW34.js → NotificationSettings-Cg288VH3.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-DrAX2ESt.js → OrderTableRenderer-Bb1O3Ofr.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Cv1GYs-c.js → Organization-CBdo-bHs.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-Bbkp_PL3.js → Overflow-qZdnVumx.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-BD8QUgoZ.js → P2P-D4kNfGNQ.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-BO-2PeaB.js → PdhVaultBrowser-DnlMemM7.js} +5 -5
  52. package/src/assets/web-panel/assets/{Permissions-D_OPVa02.js → Permissions-DHucHFBJ.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-mh-pEmaB.js → PersonalDataHub-BovlOIPR.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-6JC2EDdb.js → Pipeline-Deru3CQY.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CUshzUAG.js → Privacy-Bq5oTTbU.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-Cs2Aalri.js → ProjectInit-BfzxVWAz.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-1ak49tcj.js → ProjectSettings-CKC6XBtH.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-BV4oApsm.js → Projects-CMolGhae.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-CXXxvafH.js → Providers-C_jx4TWX.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-PTcDsF58.js → QrScannerModal-BdIHeVGC.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CDwucrJw.js → QuickAsk-BwZwAcPD.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-CJlLVRXR.js → Recommend-BNTt0L-m.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DlN-ETsO.js → RemoteSession-Biyn2-Ro.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DI23LR6m.js → Reputation-D6VpG32B.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-Cl7UQMrM.js → Row-D_74OvQQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-CexHNfh8.js → RssFeed-BTr0a-BQ.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-BneBWvRN.js → Search-C3MCFoNU.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-DX7Phgrp.js → Security-CqW9aJ6s.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-BWXO8Mte.js → Services-Cw5GNaHF.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-DCyOjKPJ.js → Skeleton-DZps5qeY.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CXqERsTB.js → Skills-C6NQ1znT.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-bhbrbz8E.js → Sla-DFP8G2Sh.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-3IPU0HBZ.js → SpeechSettings-ESt6MB6v.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-DBNTQLbM.js → SyncSettings-BHnN98aM.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-quP0bkN-.js → Tasks-NiSCaOf-.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-BouWmgho.js → Templates-DsKFhW2C.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-qv0D9s7z.js → Tenant-CQ0E0ze5.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BxvbE8BB.js → Terminal-D_rBu_by.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-D-IeLnJ2.js → TimelineRenderer-D3Vm4Po4.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CFMKKyVG.js → Tokens-DNTxRH6q.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-L8as3UuJ.js → Trigger-Dgprz1ms.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-MxmA4VZG.js → Trust-B2rUnVBD.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-C0VvJYRi.js → UkeySign-DEGQNc6_.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-Bf5QZj8N.js → VideoEditing-jlsAx3Eh.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-BIJ9riRz.js → Wallet-8jQih1ij.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-B8p9Mhkw.js → WebAuthn-XLeO6xIB.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BVsuaPen.js → WorkflowEditor-De_dgDAG.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BfkjoKpV.js → chat-CI19R_Sk.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DeAlsWK8.js → colors-DsYTOYN3.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-Cs97bz5j.js → compact-item-CM3-t_Qr.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-BqbG60LH.js → createContext-BjxlBRZv.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-i_RY0b1X.js → hasIn-RDaWX_4i.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-U4f5izHz.js → index-9R6BxAr0.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-0-agYlWL.js → index-B-Z8eFUJ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B1CbOH1i.js → index-B0PMlbMs.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DqBgBpgp.js → index-B5REnKt8.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BcUXAB2s.js → index-B7WBt_4T.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CIG8fQ2_.js → index-B9O9YyWE.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-gyFpvL7l.js → index-BCnZyIMA.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-yObj1O4n.js → index-BGqqJfL0.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DiSkx4UB.js → index-BHNYPO0b.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-Bm7lLR4c.js → index-BKJr-TZp.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BOVkf1K3.js → index-BN6UPD2E.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BESLFt4q.js → index-Bi46Xu4u.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CE2VtTlp.js → index-BlT2VAEK.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DmbfhJUP.js → index-C0yx-jtQ.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BYUVuwKt.js → index-C4gkzxkw.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CeWoNHau.js → index-CVQMeiwH.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-PT_5sBMA.js → index-Cd3euP_4.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CgsqdnRV.js → index-Cd9OJhHG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-B-3tEpTc.js → index-CiECJi-Q.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BkBi5TmC.js → index-CjTrRt13.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-D2B4VPyP.js → index-CnHH7bnD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-dIHr4B_u.js → index-Cpqm1qfU.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B5UkyA3c.js → index-CyOGN6a5.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Dk7-v4hP.js → index-D0zcy54x.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-ZxO_-E8a.js → index-D6sm5-Xq.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B-JVTrpr.js → index-DIUnNOjG.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Dk2qouAz.js → index-DX7tuWVJ.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BuLQobzW.js → index-DXXtGMUJ.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DUUrv141.js → index-DcPFB8qJ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-D9evtvg2.js → index-DoQA0-52.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-COdGA-8n.js → index-Drlnwr8F.js} +1 -1
  125. package/src/assets/web-panel/assets/index-Drz6yq0m.js +1 -0
  126. package/src/assets/web-panel/assets/{index-CED2PL_y.js → index-Dsij_KsN.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-79V_zv1s.js → index-Dxge-xWl.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CG3PRyAL.js → index-DyIWssPC.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-YXgLng0K.js → index-IeiL9RKc.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-s1opAL-M.js → index-nAH87mQP.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cf3WCLmy.js → index-pPL66J85.js} +1 -1
  132. package/src/assets/web-panel/assets/index-uWiUs7S_.js +1 -0
  133. package/src/assets/web-panel/assets/{initDefaultProps-C9h9yKL3.js → initDefaultProps-BTL88of4.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-BvmLsPdu.js → motion-BUB2pXwB.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CoL4ekU1.js → move-egCkkOMm.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-C4pMy6xV.js → mtc-parser-DAWhZC8c.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-DPuJfNxx.js → omit-CvOxe_6d.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-D0KEeaK2.js → pickAttrs-DZUSLZ5Z.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-BpkyINxt.js → placementArrow-BERxGNMY.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-DQI_wOq8.js → responsiveObserve-DZuDfZ9n.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DYfdDiRg.js → slide-DO756sgI.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-B5dtvb0D.js → statusUtils-BRQlIz28.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-CF310mSj.js → styleChecker-DCSfdybl.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-D1Qp4BLp.js → useFlexGapSupport-LD8dWVve.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-C7_iyvJK.js → useFs-BX9uW2LK.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-DZUt_fIm.js → usePersonalDataHub-BPSlPuHU.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-D3dsi0lZ.js → vnode-BmOILC9V.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-WdbOlvdQ.js → zoom-1iKowKGg.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +3 -3
  151. package/src/commands/automation.js +103 -1
  152. package/src/commands/team-merge-review.js +937 -0
  153. package/src/commands/team.js +2 -0
  154. package/src/data/changelog.json +14 -1
  155. package/src/lib/agent-schedule-store.js +139 -28
  156. package/src/lib/agent-team/team-merge-review-store.js +765 -0
  157. package/src/lib/agent-team/team-merge-review-transaction.js +1223 -0
  158. package/src/lib/agent-team/team-merge-review.js +1847 -0
  159. package/src/lib/automation-center-incidents.js +314 -0
  160. package/src/lib/automation-center-runtime.js +448 -0
  161. package/src/lib/automation-center.js +182 -38
  162. package/src/lib/automation-engine.js +41 -0
  163. package/src/lib/automation-execution-authority.js +241 -12
  164. package/src/lib/automation-execution-incident.js +737 -0
  165. package/src/lib/cowork-cron.js +85 -14
  166. package/src/lib/scheduler-kernel/agenda-adapter.js +17 -7
  167. package/src/lib/scheduler-kernel/automation-adapter.js +105 -11
  168. package/src/lib/scheduler-kernel/automation-event-adapter.js +87 -11
  169. package/src/lib/scheduler-kernel/contract.js +91 -0
  170. package/src/lib/scheduler-kernel/cowork-cron-adapter.js +12 -1
  171. package/src/lib/scheduler-kernel/loop-adapter.js +7 -1
  172. package/src/lib/scheduler-kernel/routine-adapter.js +7 -1
  173. package/src/lib/scheduler-kernel/runtime-control-capabilities.js +31 -0
  174. package/src/lib/scheduler-kernel/runtime.js +176 -3
  175. package/src/lib/scheduler-kernel/store.js +1253 -45
  176. package/src/runtime/agent-core.js +10 -0
  177. package/src/runtime/mcp-config.js +81 -10
  178. package/src/assets/web-panel/assets/MarkdownRenderer-BLCZMzhJ.js +0 -1
  179. package/src/assets/web-panel/assets/devWarning-DPty0mGN.js +0 -1
  180. package/src/assets/web-panel/assets/index-Bt7g0Vq_.js +0 -1
  181. package/src/assets/web-panel/assets/index-ChVT0p9u.js +0 -1
@@ -57,6 +57,7 @@ import {
57
57
  } from "../lib/agent-team/team-control-store.js";
58
58
  import { TeamProcessCheckpointBroker } from "../lib/agent-team/team-process-checkpoint.js";
59
59
  import { registerTeamDistributedCommands } from "./team-distributed.js";
60
+ import { registerTeamMergeReviewCommands } from "./team-merge-review.js";
60
61
  import {
61
62
  sameFileStatIdentity,
62
63
  samePathHandleFileIdentity,
@@ -1451,6 +1452,7 @@ export function registerTeamCommand(program, { logger } = {}) {
1451
1452
  agentExecutor: spawnAgent,
1452
1453
  buildAgentPrompt: buildTeamAgentPrompt,
1453
1454
  });
1455
+ registerTeamMergeReviewCommands(team, { logger: log });
1454
1456
 
1455
1457
  team
1456
1458
  .command("control-bindings")
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.163.8",
7
+ "cliVersions": ["0.163.7", "0.163.8"],
8
+ "date": "2026-08-14",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added — cc CLI 0.163.8: governed recovery, merge review, and MCP resource templates",
13
+ "body": "> `chainlesschain` **0.163.7 → 0.163.8** (candidate; not yet published,\n> 2026-08-14).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Crash-safe scheduler source persistence**: Agenda and Cowork authoritative\n stores now reject unreadable, malformed, and non-object records instead of\n treating them as empty state. Generation replacement uses private exclusive\n temporary files, complete short-write loops, file fsync, atomic rename, and\n POSIX directory fsync, while distinguishing pre-rename `not-committed`\n failures from post-rename durability-unknown outcomes.\n- **Deterministic scheduler disk-fault closure**: fault injection covers ENOSPC,\n partial writes, file and directory fsync failures, rename failures, corrupted\n source stores, native SQLite `SQLITE_FULL` transaction rollback, Automation\n source rollback atomicity, database truncation, and clean reopen behavior.\n Routine and Loop retain their existing durable-store and append/CAS\n protections.\n- **Governed Automation runtime recovery**: scheduler-backed Automation work can\n expose exact-fence, control-revision, capability-bound pause and resume safe\n points. Revisioned incidents support bounded retry or cancellation; retry\n revalidates the exact dead-letter occurrence, run identity, fence, and error\n evidence, while manual incidents are not silently replayed.\n- **Governed multi-agent merge review**: `cc team merge-review` subcommands\n `preview|show|apply|rollback` provide stable file and hunk selection,\n digest-bound decisions, durable conflict evidence, guarded cross-branch batch\n publication, and retained-history rollback. Git hooks, repository-local\n configuration, inherited environment, stale revisions, oversized selections,\n and changed branch identities fail closed.\n- **Read-only MCP resource templates**: templates-only MCP servers can now\n register the existing resource surface. The new\n `list_mcp_resource_templates {server?}` tool reads the bounded discovery\n cache, supports explicit server filtering, and lets the model instantiate a\n concrete URI before using the existing `read_mcp_resource` boundary. It does\n not add an implicit network request, subscription, or automatic URI\n expansion.\n- **Explicit optional-protocol decisions**: resource templates enter the\n production read-only surface; resource subscriptions, peer-controlled\n logging, and completion remain deferred pending bounded consumers and\n cancellation/recovery UX. MCP sampling remains undeclared and server\n `createMessage` requests continue to return JSON-RPC `-32601`.\n- **Transaction-time scheduler fencing**: claim, renewal, and settlement paths\n now read their lease clock inside the write transaction, preventing queue\n wait time from turning a pre-transaction timestamp into a stale lease or\n settlement decision.\n- **Formal scheduler soak evidence gate**: Linux, Windows, and macOS workflows\n now exercise two-worker contention, lease/fence recovery, heartbeat renewal,\n stale settlement rejection, outcome-unknown no-replay, DST/backlog behavior,\n SQLite integrity, descendant cleanup, and bounded resource trends. The\n campaign verifier requires at least four identity-bound formal segments whose\n authoritative starts span at least 72 natural hours, with no gap above\n 30 hours.\n- **Release boundary**: the scheduler soak implementation and smoke matrices are\n present, but the required 72-hour formal campaign has not completed; P2-4\n therefore remains partially complete. Signed native distribution,\n representative alias-removal telemetry, and the entire unmerged P2-2 native\n clipboard-image host work remain outside this candidate.\n- **Release status**: final tag, source SHA, workflow run IDs, package digests,\n provenance, and registry readback are intentionally omitted until the exact\n `0.163.8` release merge commit passes complete `CLI CI` and\n `CLI Strict Sandbox` matrices on Linux, Windows, and macOS, followed by the\n dedicated npm release and independent public readback workflows."
14
+ }
15
+ ]
16
+ },
4
17
  {
5
18
  "productVersion": null,
6
19
  "cliVersion": "0.163.7",
@@ -10,7 +23,7 @@
10
23
  "sections": [
11
24
  {
12
25
  "heading": "Added — cc CLI 0.163.7: governed scheduler migration and causal observability",
13
- "body": "> `chainlesschain` **0.163.6 → 0.163.7** (candidate; not yet published,\n> 2026-08-14).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Five-domain migration journal**: Agenda, Cowork Cron, Routine, Automation,\n and Loop migrations use the scheduler store schema-v5 journal with\n domain-typed source locators, immutable source/target digest bindings,\n idempotent recovery, and fail-closed rejection of conflicting or ambiguous\n legacy entries.\n- **Governed rollback controls**: the new scheduler migration `list`, `show`,\n and `rollback` commands expose redacted migration status and blockers.\n Rollback requires the latest evidence digest, an interactive TTY, and the\n exact typed challenge before reopening any legacy source.\n- **Target-first recovery and CAS fencing**: rollback stops or restores the\n scheduler target before restoring the legacy source, validates target\n revision, definition and execution evidence, and makes terminal source\n restoration retry-safe across process crashes. This is not a claim of one\n atomic transaction across independent stores or filesystems.\n- **Fail-closed source identity**: Windows drive and UNC paths are canonicalized\n while relative, incomplete and device-namespace paths are rejected.\n Automation migration requires an existing native SQLite database and refuses\n the non-durable sql.js fallback; Loop restoration remains bound to its durable\n retirement fence, marker and original source digest.\n- **Windows persistence hardening**: team adjudication atomic replacement\n retries only transient Windows `EACCES`, `EBUSY`, and `EPERM` sharing\n failures with bounded backoff and authority-path revalidation. Exhausted,\n non-transient, and non-Windows replacement failures continue to fail closed.\n- **Cross-platform CI hardening**: migration fixtures verify retirement fences\n and canonical source identities consistently across operating systems, while\n distributed-queue and authority test workers use bounded lifetimes and attach\n result observers before short-lived children can exit. Terminal Skill\n authority fixtures now use an explicit parent acknowledgement before clean\n exit, removing Windows IPC exit-before-message ordering ambiguity without\n weakening concurrent revocation assertions.\n- **Verified causal delivery reports**: scoped sessions can be bound by exact\n transcript head and event count to digest-protected delivery states. The new\n session observability commands export a redacted session-to-delivery graph\n spanning diffs, gates, artifacts, pull requests, and merges, with exact\n workspace, team, and policy filters.\n- **Fail-closed call-ledger budgets**: `call-ledger@1` brackets model, retry,\n compaction, subagent, isolated-skill, and tool calls with known or unknown\n settlements. Strict budget mode rejects exceeded and unevaluable results\n instead of treating missing token, cost, retry, or tool-latency evidence as\n zero.\n- **Background recovery authority hardening**: verified transcript CAS,\n delegated recovery leases, IPC sender/nonce binding, bootstrap guards, exact\n process-group termination checks, and terminal cleanup prevent uncertain or\n still-live descendants from authorizing recovery or worktree deletion.\n- **Causal evidence boundary**: report bindings prove exact verified revisions,\n not that a model call semantically caused a source hunk. Scope labels are not\n identity or membership proofs, digests are not signatures, anti-rollback is\n machine-local, and incomplete or legacy ledgers remain partial or unknown.\n- **Known residuals**: scheduler ENOSPC/partial-write/fsync/rename/SQLite fault\n closure and the Linux, Windows, and macOS long-soak matrix remain open.\n Signed native distribution and representative alias-removal telemetry also\n remain outside this candidate.\n- **Release status**: final tag, source SHA, workflow run IDs, package digest,\n provenance, and registry readback are intentionally omitted until the exact\n `0.163.7` release merge commit passes both required workflow matrices on\n Linux, Windows, and macOS, followed by the dedicated npm release and\n independent public readback workflows."
26
+ "body": "> `chainlesschain` **0.163.6 → 0.163.7** (published from exact SHA\n> `3e997168621c53708a1682868c6cc4edc9baf15b`, 2026-08-14).\n> CLI-only release; `@chainlesschain/personal-data-hub` remains **0.4.57**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Five-domain migration journal**: Agenda, Cowork Cron, Routine, Automation,\n and Loop migrations use the scheduler store schema-v5 journal with\n domain-typed source locators, immutable source/target digest bindings,\n idempotent recovery, and fail-closed rejection of conflicting or ambiguous\n legacy entries.\n- **Governed rollback controls**: the new scheduler migration `list`, `show`,\n and `rollback` commands expose redacted migration status and blockers.\n Rollback requires the latest evidence digest, an interactive TTY, and the\n exact typed challenge before reopening any legacy source.\n- **Target-first recovery and CAS fencing**: rollback stops or restores the\n scheduler target before restoring the legacy source, validates target\n revision, definition and execution evidence, and makes terminal source\n restoration retry-safe across process crashes. This is not a claim of one\n atomic transaction across independent stores or filesystems.\n- **Fail-closed source identity**: Windows drive and UNC paths are canonicalized\n while relative, incomplete and device-namespace paths are rejected.\n Automation migration requires an existing native SQLite database and refuses\n the non-durable sql.js fallback; Loop restoration remains bound to its durable\n retirement fence, marker and original source digest.\n- **Windows persistence hardening**: team adjudication atomic replacement\n retries only transient Windows `EACCES`, `EBUSY`, and `EPERM` sharing\n failures with bounded backoff and authority-path revalidation. Exhausted,\n non-transient, and non-Windows replacement failures continue to fail closed.\n- **Cross-platform CI hardening**: migration fixtures verify retirement fences\n and canonical source identities consistently across operating systems, while\n distributed-queue and authority test workers use bounded lifetimes and attach\n result observers before short-lived children can exit. Terminal Skill\n authority fixtures now use an explicit parent acknowledgement before clean\n exit, removing Windows IPC exit-before-message ordering ambiguity without\n weakening concurrent revocation assertions.\n- **Verified causal delivery reports**: scoped sessions can be bound by exact\n transcript head and event count to digest-protected delivery states. The new\n session observability commands export a redacted session-to-delivery graph\n spanning diffs, gates, artifacts, pull requests, and merges, with exact\n workspace, team, and policy filters.\n- **Fail-closed call-ledger budgets**: `call-ledger@1` brackets model, retry,\n compaction, subagent, isolated-skill, and tool calls with known or unknown\n settlements. Strict budget mode rejects exceeded and unevaluable results\n instead of treating missing token, cost, retry, or tool-latency evidence as\n zero.\n- **Background recovery authority hardening**: verified transcript CAS,\n delegated recovery leases, IPC sender/nonce binding, bootstrap guards, exact\n process-group termination checks, and terminal cleanup prevent uncertain or\n still-live descendants from authorizing recovery or worktree deletion.\n- **Causal evidence boundary**: report bindings prove exact verified revisions,\n not that a model call semantically caused a source hunk. Scope labels are not\n identity or membership proofs, digests are not signatures, anti-rollback is\n machine-local, and incomplete or legacy ledgers remain partial or unknown.\n- **Release boundary**: deterministic scheduler disk-fault closure landed after\n this immutable release and is not attributed to its tarball. The\n three-platform long-soak campaign, signed native distribution, and\n representative alias-removal telemetry remained outside this release.\n- **Published release evidence**: immutable tag `v-npm-0-163-7` resolves to\n exact source commit `3e997168621c53708a1682868c6cc4edc9baf15b`. Its Linux,\n Windows, and macOS `CLI CI` (`31745391661`, attempt 2) and\n `CLI Strict Sandbox` (`31745391321`) matrices passed; the dedicated npm\n release (`31748153519`) completed its exact-SHA gate, immutable package,\n Trusted Publishing, and signed provenance, and the independent public\n readback (`31749404980`) succeeded. npm reports `latest=0.163.7`; the public\n tarball SHA-1 is `5bfb7471643cfe4d4cd0b0a382b31c63fc1efdff` and SHA-256 is\n `d7ca295e6cdb4e442ee7ad6bb9cc0b9d923f40de4eae395974d91b4dfab83a9d`."
14
27
  }
15
28
  ]
16
29
  },
@@ -258,6 +258,21 @@ function agendaStoreError(code, message, { retryable = false, retryAt } = {}) {
258
258
  return error;
259
259
  }
260
260
 
261
+ function agendaPersistenceError(
262
+ code,
263
+ message,
264
+ cause,
265
+ { filePath, commitState } = {},
266
+ ) {
267
+ const error = new Error(message, { cause });
268
+ error.name = "AgendaScheduleStoreError";
269
+ error.code = code;
270
+ error.filePath = filePath;
271
+ if (typeof cause?.code === "string") error.fsCode = cause.code;
272
+ if (commitState) error.commitState = commitState;
273
+ return error;
274
+ }
275
+
261
276
  function applyScheduledAgentSuccess(entry, atMs) {
262
277
  if (entry.kind === "wakeup") {
263
278
  entry.status = "fired";
@@ -666,9 +681,16 @@ export function previousCronTime(expr, fromMs, options = {}) {
666
681
  // ─── store ───────────────────────────────────────────────────────────────
667
682
 
668
683
  export class AgentScheduleStore {
669
- constructor({ dir = null, now = () => Date.now() } = {}) {
684
+ constructor({
685
+ dir = null,
686
+ now = () => Date.now(),
687
+ fileSystem = fs,
688
+ platform = process.platform,
689
+ } = {}) {
670
690
  this.dir = dir || agentScheduleDir();
671
691
  this._now = typeof now === "function" ? now : () => now;
692
+ this._fs = fileSystem;
693
+ this._platform = platform;
672
694
  }
673
695
 
674
696
  _file(kind) {
@@ -676,37 +698,124 @@ export class AgentScheduleStore {
676
698
  }
677
699
 
678
700
  _ensureDir() {
679
- fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
701
+ this._fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
680
702
  }
681
703
 
682
- _readAll(kind) {
704
+ _readAll(kind, { failOnMalformed = false } = {}) {
705
+ const filePath = this._file(kind);
683
706
  let raw;
684
707
  try {
685
- raw = fs.readFileSync(this._file(kind), "utf-8");
686
- } catch {
687
- return [];
708
+ raw = this._fs.readFileSync(filePath, "utf-8");
709
+ } catch (cause) {
710
+ if (cause?.code === "ENOENT") return [];
711
+ throw agendaPersistenceError(
712
+ "AGENDA_SCHEDULE_STORE_READ_FAILED",
713
+ `Agenda schedule store read failed (${filePath})`,
714
+ cause,
715
+ { filePath },
716
+ );
688
717
  }
689
718
  const entries = [];
719
+ let lineNumber = 0;
690
720
  for (const line of raw.split("\n")) {
721
+ lineNumber += 1;
691
722
  const trimmed = line.trim();
692
723
  if (!trimmed) continue;
693
724
  try {
694
- entries.push(JSON.parse(trimmed));
695
- } catch {
725
+ const entry = JSON.parse(trimmed);
726
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
727
+ throw new TypeError("schedule entry must be an object");
728
+ }
729
+ entries.push(entry);
730
+ } catch (cause) {
731
+ if (failOnMalformed) {
732
+ throw agendaPersistenceError(
733
+ "AGENDA_SCHEDULE_STORE_MALFORMED",
734
+ `Agenda schedule store contains malformed JSONL (${filePath}:${lineNumber})`,
735
+ cause,
736
+ { filePath },
737
+ );
738
+ }
696
739
  // Skip a corrupt line rather than throwing — one bad append must not
697
- // poison the whole store (per-row resilience, like the JSON.parse sweep).
740
+ // poison advisory reads. Authoritative mutations opt into strict mode
741
+ // so they never replace a store after silently dropping durable rows.
698
742
  }
699
743
  }
700
744
  return entries;
701
745
  }
702
746
 
703
747
  _writeAll(kind, entries) {
704
- this._ensureDir();
748
+ const filePath = this._file(kind);
705
749
  const body = entries.map((entry) => JSON.stringify(entry)).join("\n");
706
- fs.writeFileSync(this._file(kind), body ? body + "\n" : "", {
707
- encoding: "utf-8",
708
- mode: 0o600,
709
- });
750
+ const contents = Buffer.from(body ? `${body}\n` : "", "utf8");
751
+ const temporaryPath = path.join(
752
+ this.dir,
753
+ `.${path.basename(filePath)}.${process.pid}.${randomUUID()}.tmp`,
754
+ );
755
+ let descriptor = null;
756
+ let renamed = false;
757
+
758
+ try {
759
+ this._ensureDir();
760
+ descriptor = this._fs.openSync(temporaryPath, "wx", 0o600);
761
+ let offset = 0;
762
+ while (offset < contents.length) {
763
+ const written = this._fs.writeSync(
764
+ descriptor,
765
+ contents,
766
+ offset,
767
+ contents.length - offset,
768
+ null,
769
+ );
770
+ if (!Number.isSafeInteger(written) || written <= 0) {
771
+ const cause = new Error("write returned no progress");
772
+ cause.code = "EIO";
773
+ throw cause;
774
+ }
775
+ offset += written;
776
+ }
777
+ this._fs.fsyncSync(descriptor);
778
+ this._fs.closeSync(descriptor);
779
+ descriptor = null;
780
+ this._fs.renameSync(temporaryPath, filePath);
781
+ renamed = true;
782
+
783
+ if (this._platform !== "win32") {
784
+ const directoryDescriptor = this._fs.openSync(this.dir, "r");
785
+ try {
786
+ this._fs.fsyncSync(directoryDescriptor);
787
+ } finally {
788
+ this._fs.closeSync(directoryDescriptor);
789
+ }
790
+ }
791
+ } catch (cause) {
792
+ if (descriptor !== null) {
793
+ try {
794
+ this._fs.closeSync(descriptor);
795
+ } catch {
796
+ // Preserve the original persistence failure.
797
+ }
798
+ }
799
+ if (!renamed) {
800
+ try {
801
+ this._fs.unlinkSync(temporaryPath);
802
+ } catch {
803
+ // Best-effort orphan cleanup; the authoritative file is untouched.
804
+ }
805
+ }
806
+ throw agendaPersistenceError(
807
+ "AGENDA_SCHEDULE_STORE_WRITE_FAILED",
808
+ `Agenda schedule store write failed (${filePath})`,
809
+ cause,
810
+ {
811
+ filePath,
812
+ // A failure before rename leaves the old generation authoritative.
813
+ // A directory-fsync failure after rename makes crash durability
814
+ // unknowable even though an immediate read sees the new generation.
815
+ commitState: renamed ? "unknown" : "not-committed",
816
+ },
817
+ );
818
+ }
710
819
  }
711
820
 
712
821
  // ── create ──────────────────────────────────────────────────────────────
@@ -741,7 +850,7 @@ export class AgentScheduleStore {
741
850
  createdAt: now,
742
851
  status: "pending",
743
852
  };
744
- const entries = this._readAll("wakeup");
853
+ const entries = this._readAll("wakeup", { failOnMalformed: true });
745
854
  entries.push(entry);
746
855
  this._writeAll("wakeup", entries);
747
856
  return entry;
@@ -786,7 +895,7 @@ export class AgentScheduleStore {
786
895
  runs: 0,
787
896
  status: "active",
788
897
  };
789
- const entries = this._readAll("cron");
898
+ const entries = this._readAll("cron", { failOnMalformed: true });
790
899
  entries.push(entry);
791
900
  this._writeAll("cron", entries);
792
901
  return entry;
@@ -882,7 +991,7 @@ export class AgentScheduleStore {
882
991
  checks: 0,
883
992
  status: "active",
884
993
  };
885
- const entries = this._readAll("monitor");
994
+ const entries = this._readAll("monitor", { failOnMalformed: true });
886
995
  entries.push(entry);
887
996
  this._writeAll("monitor", entries);
888
997
  return entry;
@@ -917,7 +1026,7 @@ export class AgentScheduleStore {
917
1026
  path.join(this.dir, ".agenda-claims"),
918
1027
  () => {
919
1028
  for (const kind of SCHEDULE_KINDS) {
920
- const entries = this._readAll(kind);
1029
+ const entries = this._readAll(kind, { failOnMalformed: true });
921
1030
  const entry = entries.find((candidate) => candidate.id === id);
922
1031
  if (!entry) continue;
923
1032
  if (!isSchedulableStatus(entry)) {
@@ -993,7 +1102,7 @@ export class AgentScheduleStore {
993
1102
  path.join(this.dir, ".agenda-claims"),
994
1103
  () => {
995
1104
  for (const kind of SCHEDULE_KINDS) {
996
- const entries = this._readAll(kind);
1105
+ const entries = this._readAll(kind, { failOnMalformed: true });
997
1106
  const entry = entries.find((candidate) => candidate.id === id);
998
1107
  if (!entry) continue;
999
1108
  const prior = entry.schedulerMigration;
@@ -1079,7 +1188,7 @@ export class AgentScheduleStore {
1079
1188
  path.join(this.dir, ".agenda-claims"),
1080
1189
  () => {
1081
1190
  for (const kind of SCHEDULE_KINDS) {
1082
- const entries = this._readAll(kind);
1191
+ const entries = this._readAll(kind, { failOnMalformed: true });
1083
1192
  const entry = entries.find((candidate) => candidate.id === id);
1084
1193
  if (!entry) continue;
1085
1194
  const migration = entry.schedulerMigration;
@@ -1171,7 +1280,9 @@ export class AgentScheduleStore {
1171
1280
  () => {
1172
1281
  const claimed = [];
1173
1282
  for (const scheduleKind of kinds) {
1174
- const entries = this._readAll(scheduleKind);
1283
+ const entries = this._readAll(scheduleKind, {
1284
+ failOnMalformed: true,
1285
+ });
1175
1286
  let changed = false;
1176
1287
  for (const entry of entries) {
1177
1288
  if (!isSchedulableStatus(entry) || isEntryExpired(entry, now))
@@ -1242,7 +1353,7 @@ export class AgentScheduleStore {
1242
1353
  path.join(this.dir, ".agenda-claims"),
1243
1354
  () => {
1244
1355
  for (const kind of SCHEDULE_KINDS) {
1245
- const entries = this._readAll(kind);
1356
+ const entries = this._readAll(kind, { failOnMalformed: true });
1246
1357
  const entry = entries.find((candidate) => candidate.id === id);
1247
1358
  if (!entry) continue;
1248
1359
  const prior = entry.schedulerExecution;
@@ -1330,7 +1441,7 @@ export class AgentScheduleStore {
1330
1441
  path.join(this.dir, ".agenda-claims"),
1331
1442
  () => {
1332
1443
  for (const kind of SCHEDULE_KINDS) {
1333
- const entries = this._readAll(kind);
1444
+ const entries = this._readAll(kind, { failOnMalformed: true });
1334
1445
  const entry = entries.find((candidate) => candidate.id === id);
1335
1446
  if (!entry) continue;
1336
1447
  const evidence = entry.schedulerExecution;
@@ -1408,7 +1519,7 @@ export class AgentScheduleStore {
1408
1519
  path.join(this.dir, ".agenda-claims"),
1409
1520
  () => {
1410
1521
  for (const kind of SCHEDULE_KINDS) {
1411
- const entries = this._readAll(kind);
1522
+ const entries = this._readAll(kind, { failOnMalformed: true });
1412
1523
  const entry = entries.find((candidate) => candidate.id === id);
1413
1524
  if (!entry) continue;
1414
1525
  const evidence = entry.schedulerExecution;
@@ -1484,7 +1595,7 @@ export class AgentScheduleStore {
1484
1595
  const now = atMs != null ? atMs : this._now();
1485
1596
  const retired = [];
1486
1597
  for (const kind of SCHEDULE_KINDS) {
1487
- const entries = this._readAll(kind);
1598
+ const entries = this._readAll(kind, { failOnMalformed: true });
1488
1599
  let changed = false;
1489
1600
  for (const entry of entries) {
1490
1601
  if (isSchedulableStatus(entry) && isEntryExpired(entry, now)) {
@@ -1501,7 +1612,7 @@ export class AgentScheduleStore {
1501
1612
 
1502
1613
  cancel(id) {
1503
1614
  for (const kind of SCHEDULE_KINDS) {
1504
- const entries = this._readAll(kind);
1615
+ const entries = this._readAll(kind, { failOnMalformed: true });
1505
1616
  const idx = entries.findIndex((entry) => entry.id === id);
1506
1617
  if (idx >= 0) {
1507
1618
  const [removed] = entries.splice(idx, 1);
@@ -1522,7 +1633,7 @@ export class AgentScheduleStore {
1522
1633
  pruneTerminal({ before = Infinity } = {}) {
1523
1634
  const removed = [];
1524
1635
  for (const kind of SCHEDULE_KINDS) {
1525
- const entries = this._readAll(kind);
1636
+ const entries = this._readAll(kind, { failOnMalformed: true });
1526
1637
  const keep = entries.filter((entry) => {
1527
1638
  const prunable =
1528
1639
  TERMINAL_SET.has(entry.status) && terminalAt(entry) <= before;
@@ -1586,7 +1697,7 @@ export class AgentScheduleStore {
1586
1697
  }
1587
1698
 
1588
1699
  _mutate(kind, id, fn) {
1589
- const entries = this._readAll(kind);
1700
+ const entries = this._readAll(kind, { failOnMalformed: true });
1590
1701
  const entry = entries.find((e) => e.id === id);
1591
1702
  if (!entry) return null;
1592
1703
  fn(entry);