@ashlr/hub 3.12.0 → 3.14.0

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 (719) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +29 -16
  3. package/dist/authority-surface.json +274 -148
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/authority.d.ts +145 -33
  6. package/dist/cli/authority.js +1292 -315
  7. package/dist/cli/authority.js.map +1 -1
  8. package/dist/cli/cloud.js +12 -3
  9. package/dist/cli/cloud.js.map +1 -1
  10. package/dist/cli/comms.d.ts +33 -19
  11. package/dist/cli/comms.js +128 -151
  12. package/dist/cli/comms.js.map +1 -1
  13. package/dist/cli/completions.js +1 -1
  14. package/dist/cli/completions.js.map +1 -1
  15. package/dist/cli/daemon.js +29 -0
  16. package/dist/cli/daemon.js.map +1 -1
  17. package/dist/cli/director.d.ts +8 -12
  18. package/dist/cli/director.js +17 -52
  19. package/dist/cli/director.js.map +1 -1
  20. package/dist/cli/fleet.js +4 -1
  21. package/dist/cli/fleet.js.map +1 -1
  22. package/dist/cli/help.js +1 -0
  23. package/dist/cli/help.js.map +1 -1
  24. package/dist/cli/leader.d.ts +27 -3
  25. package/dist/cli/leader.js +253 -4
  26. package/dist/cli/leader.js.map +1 -1
  27. package/dist/core/authority/protected-paths.js +11 -0
  28. package/dist/core/authority/protected-paths.js.map +1 -1
  29. package/dist/core/authority/resident.d.ts +101 -0
  30. package/dist/core/authority/resident.js +246 -0
  31. package/dist/core/authority/resident.js.map +1 -0
  32. package/dist/core/authority/server-enforcement.d.ts +110 -0
  33. package/dist/core/authority/server-enforcement.js +260 -0
  34. package/dist/core/authority/server-enforcement.js.map +1 -0
  35. package/dist/core/authority/standing-grant.d.ts +24 -4
  36. package/dist/core/authority/standing-grant.js +19 -3
  37. package/dist/core/authority/standing-grant.js.map +1 -1
  38. package/dist/core/authority/types.d.ts +43 -0
  39. package/dist/core/authority/types.js +6 -0
  40. package/dist/core/authority/types.js.map +1 -1
  41. package/dist/core/cloud/budget.js +11 -1
  42. package/dist/core/cloud/budget.js.map +1 -1
  43. package/dist/core/cloud/cloud-api.d.ts +25 -2
  44. package/dist/core/cloud/cloud-api.js +139 -5
  45. package/dist/core/cloud/cloud-api.js.map +1 -1
  46. package/dist/core/cloud/pr-actions.d.ts +93 -0
  47. package/dist/core/cloud/pr-actions.js +436 -0
  48. package/dist/core/cloud/pr-actions.js.map +1 -0
  49. package/dist/core/cloud/pr-preview.d.ts +128 -0
  50. package/dist/core/cloud/pr-preview.js +228 -0
  51. package/dist/core/cloud/pr-preview.js.map +1 -0
  52. package/dist/core/cloud/store.d.ts +2 -0
  53. package/dist/core/cloud/store.js +28 -0
  54. package/dist/core/cloud/store.js.map +1 -1
  55. package/dist/core/cloud/timeline-api.d.ts +24 -0
  56. package/dist/core/cloud/timeline-api.js +46 -0
  57. package/dist/core/cloud/timeline-api.js.map +1 -0
  58. package/dist/core/cloud/timeline-types.d.ts +62 -0
  59. package/dist/core/cloud/timeline-types.js +36 -0
  60. package/dist/core/cloud/timeline-types.js.map +1 -0
  61. package/dist/core/cloud/timeline.d.ts +102 -0
  62. package/dist/core/cloud/timeline.js +925 -0
  63. package/dist/core/cloud/timeline.js.map +1 -0
  64. package/dist/core/cloud/tracker.js +67 -0
  65. package/dist/core/cloud/tracker.js.map +1 -1
  66. package/dist/core/cloud/types.d.ts +38 -0
  67. package/dist/core/cloud/types.js +1 -1
  68. package/dist/core/cloud/types.js.map +1 -1
  69. package/dist/core/comms/change-digest.d.ts +130 -0
  70. package/dist/core/comms/change-digest.js +451 -0
  71. package/dist/core/comms/change-digest.js.map +1 -0
  72. package/dist/core/comms/director-prompt.d.ts +4 -5
  73. package/dist/core/comms/director-prompt.js +4 -71
  74. package/dist/core/comms/director-prompt.js.map +1 -1
  75. package/dist/core/comms/director.d.ts +24 -61
  76. package/dist/core/comms/director.js +29 -382
  77. package/dist/core/comms/director.js.map +1 -1
  78. package/dist/core/comms/dispatch.d.ts +37 -12
  79. package/dist/core/comms/dispatch.js +244 -177
  80. package/dist/core/comms/dispatch.js.map +1 -1
  81. package/dist/core/comms/elon-dialogue.d.ts +23 -15
  82. package/dist/core/comms/elon-dialogue.js +36 -307
  83. package/dist/core/comms/elon-dialogue.js.map +1 -1
  84. package/dist/core/comms/fleet-pulse.js +4 -7
  85. package/dist/core/comms/fleet-pulse.js.map +1 -1
  86. package/dist/core/comms/handlers.d.ts +10 -6
  87. package/dist/core/comms/handlers.js +14 -48
  88. package/dist/core/comms/handlers.js.map +1 -1
  89. package/dist/core/comms/migrations.d.ts +47 -0
  90. package/dist/core/comms/migrations.js +125 -0
  91. package/dist/core/comms/migrations.js.map +1 -0
  92. package/dist/core/comms/requests.d.ts +32 -5
  93. package/dist/core/comms/requests.js +101 -5
  94. package/dist/core/comms/requests.js.map +1 -1
  95. package/dist/core/comms/telegram-channel.d.ts +104 -0
  96. package/dist/core/comms/telegram-channel.js +622 -0
  97. package/dist/core/comms/telegram-channel.js.map +1 -0
  98. package/dist/core/comms/telegram-thread-map.d.ts +56 -0
  99. package/dist/core/comms/telegram-thread-map.js +144 -0
  100. package/dist/core/comms/telegram-thread-map.js.map +1 -0
  101. package/dist/core/daemon/capacity-publisher.d.ts +8 -1
  102. package/dist/core/daemon/capacity-publisher.js +40 -2
  103. package/dist/core/daemon/capacity-publisher.js.map +1 -1
  104. package/dist/core/daemon/loop.js +18 -4
  105. package/dist/core/daemon/loop.js.map +1 -1
  106. package/dist/core/daemon/service-install-authority.d.ts +10 -2
  107. package/dist/core/daemon/service-install-authority.js +14 -5
  108. package/dist/core/daemon/service-install-authority.js.map +1 -1
  109. package/dist/core/daemon/service.d.ts +15 -0
  110. package/dist/core/daemon/service.js +26 -0
  111. package/dist/core/daemon/service.js.map +1 -1
  112. package/dist/core/daemon/tick-deadline.d.ts +44 -0
  113. package/dist/core/daemon/tick-deadline.js +83 -0
  114. package/dist/core/daemon/tick-deadline.js.map +1 -0
  115. package/dist/core/daemon/tick-hooks.d.ts +7 -0
  116. package/dist/core/daemon/tick-hooks.js.map +1 -1
  117. package/dist/core/daemon/tick-progress.d.ts +39 -0
  118. package/dist/core/daemon/tick-progress.js +194 -0
  119. package/dist/core/daemon/tick-progress.js.map +1 -0
  120. package/dist/core/dashboard.js +3 -1
  121. package/dist/core/dashboard.js.map +1 -1
  122. package/dist/core/fleet/cloud-intake.d.ts +95 -0
  123. package/dist/core/fleet/cloud-intake.js +557 -0
  124. package/dist/core/fleet/cloud-intake.js.map +1 -0
  125. package/dist/core/fleet/dispatch-router.d.ts +13 -0
  126. package/dist/core/fleet/dispatch-router.js +32 -8
  127. package/dist/core/fleet/dispatch-router.js.map +1 -1
  128. package/dist/core/fleet/fleet-merge-state.d.ts +16 -0
  129. package/dist/core/fleet/fleet-merge-state.js.map +1 -1
  130. package/dist/core/fleet/host-merge.d.ts +14 -0
  131. package/dist/core/fleet/host-merge.js +24 -2
  132. package/dist/core/fleet/host-merge.js.map +1 -1
  133. package/dist/core/fleet/merge-gates.d.ts +21 -0
  134. package/dist/core/fleet/merge-gates.js +39 -5
  135. package/dist/core/fleet/merge-gates.js.map +1 -1
  136. package/dist/core/fleet/mirrors.d.ts +162 -6
  137. package/dist/core/fleet/mirrors.js +1051 -49
  138. package/dist/core/fleet/mirrors.js.map +1 -1
  139. package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
  140. package/dist/core/fleet/standing-merge-pass.js +102 -1
  141. package/dist/core/fleet/standing-merge-pass.js.map +1 -1
  142. package/dist/core/fleet/status.d.ts +17 -0
  143. package/dist/core/fleet/status.js +22 -0
  144. package/dist/core/fleet/status.js.map +1 -1
  145. package/dist/core/fleet/tick-hooks-live.d.ts +10 -1
  146. package/dist/core/fleet/tick-hooks-live.js +57 -8
  147. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  148. package/dist/core/fleet/verify-check-run.d.ts +90 -0
  149. package/dist/core/fleet/verify-check-run.js +274 -0
  150. package/dist/core/fleet/verify-check-run.js.map +1 -0
  151. package/dist/core/git.d.ts +17 -0
  152. package/dist/core/git.js +124 -25
  153. package/dist/core/git.js.map +1 -1
  154. package/dist/core/goals/open-goals.d.ts +47 -0
  155. package/dist/core/goals/open-goals.js +33 -0
  156. package/dist/core/goals/open-goals.js.map +1 -0
  157. package/dist/core/inbox/merge.d.ts +5 -0
  158. package/dist/core/inbox/merge.js +58 -2
  159. package/dist/core/inbox/merge.js.map +1 -1
  160. package/dist/core/integrations/locus.d.ts +28 -0
  161. package/dist/core/integrations/locus.js +155 -30
  162. package/dist/core/integrations/locus.js.map +1 -1
  163. package/dist/core/integrations/telegram-format.d.ts +40 -0
  164. package/dist/core/integrations/telegram-format.js +123 -0
  165. package/dist/core/integrations/telegram-format.js.map +1 -0
  166. package/dist/core/integrations/telegram.d.ts +60 -4
  167. package/dist/core/integrations/telegram.js +161 -28
  168. package/dist/core/integrations/telegram.js.map +1 -1
  169. package/dist/core/mcp-registry.d.ts +12 -0
  170. package/dist/core/mcp-registry.js +70 -0
  171. package/dist/core/mcp-registry.js.map +1 -1
  172. package/dist/core/observability/rollup.d.ts +12 -10
  173. package/dist/core/observability/rollup.js +44 -17
  174. package/dist/core/observability/rollup.js.map +1 -1
  175. package/dist/core/resources/connection-monitor.d.ts +9 -0
  176. package/dist/core/resources/connection-monitor.js +19 -9
  177. package/dist/core/resources/connection-monitor.js.map +1 -1
  178. package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
  179. package/dist/core/resources/quota-refresh-lease.js +34 -1
  180. package/dist/core/resources/quota-refresh-lease.js.map +1 -1
  181. package/dist/core/routing/budget-api.d.ts +18 -1
  182. package/dist/core/routing/budget-api.js +120 -10
  183. package/dist/core/routing/budget-api.js.map +1 -1
  184. package/dist/core/routing/budget-store.d.ts +22 -1
  185. package/dist/core/routing/budget-store.js +22 -8
  186. package/dist/core/routing/budget-store.js.map +1 -1
  187. package/dist/core/routing/readiness-types.d.ts +82 -0
  188. package/dist/core/routing/readiness-types.js +23 -0
  189. package/dist/core/routing/readiness-types.js.map +1 -0
  190. package/dist/core/routing/readiness.d.ts +103 -0
  191. package/dist/core/routing/readiness.js +480 -0
  192. package/dist/core/routing/readiness.js.map +1 -0
  193. package/dist/core/sandbox/confine.js +22 -1
  194. package/dist/core/sandbox/confine.js.map +1 -1
  195. package/dist/core/sandbox/policy.d.ts +23 -0
  196. package/dist/core/sandbox/policy.js +100 -0
  197. package/dist/core/sandbox/policy.js.map +1 -1
  198. package/dist/core/types.d.ts +13 -0
  199. package/dist/core/types.js.map +1 -1
  200. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  201. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
  202. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
  203. package/dist/core/usage/frontier-usage.d.ts +20 -2
  204. package/dist/core/usage/frontier-usage.js +75 -17
  205. package/dist/core/usage/frontier-usage.js.map +1 -1
  206. package/dist/core/verse/account-health.js +9 -3
  207. package/dist/core/verse/account-health.js.map +1 -1
  208. package/dist/core/verse/accounts.d.ts +45 -0
  209. package/dist/core/verse/accounts.js +246 -17
  210. package/dist/core/verse/accounts.js.map +1 -1
  211. package/dist/core/verse/activity-api.d.ts +5 -1
  212. package/dist/core/verse/activity-api.js +62 -14
  213. package/dist/core/verse/activity-api.js.map +1 -1
  214. package/dist/core/verse/apps-api.js +23 -11
  215. package/dist/core/verse/apps-api.js.map +1 -1
  216. package/dist/core/verse/apps.d.ts +11 -9
  217. package/dist/core/verse/apps.js +2 -2
  218. package/dist/core/verse/apps.js.map +1 -1
  219. package/dist/core/verse/authority-api.d.ts +17 -3
  220. package/dist/core/verse/authority-api.js +122 -7
  221. package/dist/core/verse/authority-api.js.map +1 -1
  222. package/dist/core/verse/autonomy-ladder.d.ts +172 -0
  223. package/dist/core/verse/autonomy-ladder.js +251 -0
  224. package/dist/core/verse/autonomy-ladder.js.map +1 -0
  225. package/dist/core/verse/context-fit.js +7 -5
  226. package/dist/core/verse/context-fit.js.map +1 -1
  227. package/dist/core/verse/control-api.d.ts +23 -1
  228. package/dist/core/verse/control-api.js +117 -10
  229. package/dist/core/verse/control-api.js.map +1 -1
  230. package/dist/core/verse/fleet-live-api.js +13 -5
  231. package/dist/core/verse/fleet-live-api.js.map +1 -1
  232. package/dist/core/verse/folder-io.d.ts +50 -0
  233. package/dist/core/verse/folder-io.js +142 -0
  234. package/dist/core/verse/folder-io.js.map +1 -0
  235. package/dist/core/verse/git-api.js +5 -4
  236. package/dist/core/verse/git-api.js.map +1 -1
  237. package/dist/core/verse/git-ops.d.ts +10 -1
  238. package/dist/core/verse/git-ops.js +18 -2
  239. package/dist/core/verse/git-ops.js.map +1 -1
  240. package/dist/core/verse/github-api.d.ts +1 -1
  241. package/dist/core/verse/github-api.js +5 -4
  242. package/dist/core/verse/github-api.js.map +1 -1
  243. package/dist/core/verse/github-repo.js +118 -14
  244. package/dist/core/verse/github-repo.js.map +1 -1
  245. package/dist/core/verse/leader-api.d.ts +5 -4
  246. package/dist/core/verse/leader-api.js +237 -10
  247. package/dist/core/verse/leader-api.js.map +1 -1
  248. package/dist/core/verse/local-models.d.ts +10 -0
  249. package/dist/core/verse/local-models.js +10 -1
  250. package/dist/core/verse/local-models.js.map +1 -1
  251. package/dist/core/verse/login-path.d.ts +73 -0
  252. package/dist/core/verse/login-path.js +123 -14
  253. package/dist/core/verse/login-path.js.map +1 -1
  254. package/dist/core/verse/mcp-control-api.js +4 -4
  255. package/dist/core/verse/mcp-control-api.js.map +1 -1
  256. package/dist/core/verse/mcp-scope.d.ts +22 -0
  257. package/dist/core/verse/mcp-scope.js +41 -1
  258. package/dist/core/verse/mcp-scope.js.map +1 -1
  259. package/dist/core/verse/mcp-seat-view.d.ts +10 -0
  260. package/dist/core/verse/mcp-seat-view.js +30 -4
  261. package/dist/core/verse/mcp-seat-view.js.map +1 -1
  262. package/dist/core/verse/overnight-api.js +20 -2
  263. package/dist/core/verse/overnight-api.js.map +1 -1
  264. package/dist/core/verse/path-guard.d.ts +24 -0
  265. package/dist/core/verse/path-guard.js +91 -22
  266. package/dist/core/verse/path-guard.js.map +1 -1
  267. package/dist/core/verse/preview-api.js +22 -0
  268. package/dist/core/verse/preview-api.js.map +1 -1
  269. package/dist/core/verse/projects.d.ts +21 -0
  270. package/dist/core/verse/projects.js +82 -0
  271. package/dist/core/verse/projects.js.map +1 -1
  272. package/dist/core/verse/seat-readiness.d.ts +25 -0
  273. package/dist/core/verse/seat-readiness.js +43 -6
  274. package/dist/core/verse/seat-readiness.js.map +1 -1
  275. package/dist/core/verse/session-controls-api.js +5 -3
  276. package/dist/core/verse/session-controls-api.js.map +1 -1
  277. package/dist/core/verse/session-handoff.d.ts +26 -0
  278. package/dist/core/verse/session-handoff.js +90 -12
  279. package/dist/core/verse/session-handoff.js.map +1 -1
  280. package/dist/core/verse/terminal-api.js +7 -4
  281. package/dist/core/verse/terminal-api.js.map +1 -1
  282. package/dist/core/verse/terminal.js +9 -5
  283. package/dist/core/verse/terminal.js.map +1 -1
  284. package/dist/core/verse/verse-api.d.ts +3 -1
  285. package/dist/core/verse/verse-api.js +87 -27
  286. package/dist/core/verse/verse-api.js.map +1 -1
  287. package/dist/core/verse/workspaces.d.ts +51 -0
  288. package/dist/core/verse/workspaces.js +177 -47
  289. package/dist/core/verse/workspaces.js.map +1 -1
  290. package/dist/core/vision/leader-apply.d.ts +40 -0
  291. package/dist/core/vision/leader-apply.js +101 -30
  292. package/dist/core/vision/leader-apply.js.map +1 -1
  293. package/dist/core/vision/leader-cadence.d.ts +114 -0
  294. package/dist/core/vision/leader-cadence.js +127 -0
  295. package/dist/core/vision/leader-cadence.js.map +1 -0
  296. package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
  297. package/dist/core/vision/leader-goal-evidence.js +36 -0
  298. package/dist/core/vision/leader-goal-evidence.js.map +1 -0
  299. package/dist/core/vision/leader-health.d.ts +53 -0
  300. package/dist/core/vision/leader-health.js +92 -0
  301. package/dist/core/vision/leader-health.js.map +1 -0
  302. package/dist/core/vision/leader-operator.d.ts +176 -0
  303. package/dist/core/vision/leader-operator.js +355 -0
  304. package/dist/core/vision/leader-operator.js.map +1 -0
  305. package/dist/core/vision/leader-run-chain.d.ts +41 -0
  306. package/dist/core/vision/leader-run-chain.js +54 -0
  307. package/dist/core/vision/leader-run-chain.js.map +1 -0
  308. package/dist/core/vision/leader-seat-plan.d.ts +68 -0
  309. package/dist/core/vision/leader-seat-plan.js +93 -0
  310. package/dist/core/vision/leader-seat-plan.js.map +1 -0
  311. package/dist/core/vision/leader-seat.d.ts +71 -5
  312. package/dist/core/vision/leader-seat.js +235 -33
  313. package/dist/core/vision/leader-seat.js.map +1 -1
  314. package/dist/core/vision/leader-thread-types.d.ts +104 -0
  315. package/dist/core/vision/leader-thread-types.js +9 -0
  316. package/dist/core/vision/leader-thread-types.js.map +1 -0
  317. package/dist/core/vision/leader-thread.d.ts +138 -0
  318. package/dist/core/vision/leader-thread.js +926 -0
  319. package/dist/core/vision/leader-thread.js.map +1 -0
  320. package/dist/core/vision/leader-types.d.ts +75 -1
  321. package/dist/core/vision/leader.d.ts +88 -18
  322. package/dist/core/vision/leader.js +269 -69
  323. package/dist/core/vision/leader.js.map +1 -1
  324. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-CIiX2X8w.js} +2 -2
  325. package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
  326. package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
  327. package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-DHsysoIL.js.map} +1 -1
  328. package/dist/core/web/public/next/assets/App-CMeAocmW.js +7 -0
  329. package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-CMeAocmW.js.map} +1 -1
  330. package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
  331. package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DISYnMnc.js.map} +1 -1
  332. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
  333. package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
  334. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js +3 -0
  335. package/dist/core/web/public/next/assets/AutonomyOffState-CEPSZToP.js.map +1 -0
  336. package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
  337. package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
  338. package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
  339. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
  340. package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
  341. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-BxhdiIpx.js} +2 -2
  342. package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
  343. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js +2 -0
  344. package/dist/core/web/public/next/assets/BudgetControl-C-0KhjRS.js.map +1 -0
  345. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-D90dzI_o.js} +2 -2
  346. package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-D90dzI_o.js.map} +1 -1
  347. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-qKDBC65C.js} +2 -2
  348. package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
  349. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
  350. package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
  351. package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
  352. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
  353. package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js.map +1 -0
  354. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
  355. package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
  356. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
  357. package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
  358. package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
  359. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
  360. package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
  361. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
  362. package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
  363. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-BCfP12GH.js} +2 -2
  364. package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
  365. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-D3msQlCj.js} +2 -2
  366. package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-D3msQlCj.js.map} +1 -1
  367. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Ix6hvXlY.js} +2 -2
  368. package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
  369. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-C4WKsCIe.js} +2 -2
  370. package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
  371. package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
  372. package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-aWP7liri.js.map} +1 -1
  373. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-D2IRy3Cg.js} +2 -2
  374. package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
  375. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-DMr18muX.js} +2 -2
  376. package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-DMr18muX.js.map} +1 -1
  377. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js +2 -0
  378. package/dist/core/web/public/next/assets/EvidenceTimeline-DXmmz6Fi.js.map +1 -0
  379. package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
  380. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
  381. package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
  382. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
  383. package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
  384. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-Dt-ee32-.js} +2 -2
  385. package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-Dt-ee32-.js.map} +1 -1
  386. package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
  387. package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
  388. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-CLJQLe7M.js} +2 -2
  389. package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
  390. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-D_KRJA9V.js} +2 -2
  391. package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-D_KRJA9V.js.map} +1 -1
  392. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
  393. package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
  394. package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
  395. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
  396. package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
  397. package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
  398. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
  399. package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
  400. package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
  401. package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-DGbRcyv8.js.map} +1 -1
  402. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-DFvk06qG.js} +3 -3
  403. package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
  404. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
  405. package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
  406. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-CMj-VafN.js} +2 -2
  407. package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-CMj-VafN.js.map} +1 -1
  408. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
  409. package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
  410. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
  411. package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
  412. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
  413. package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
  414. package/dist/core/web/public/next/assets/NeedsYouList-CCsijdWt.js +2 -0
  415. package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
  416. package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
  417. package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
  418. package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
  419. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js +3 -0
  420. package/dist/core/web/public/next/assets/OnboardingFlow-Cy9BA9eR.js.map +1 -0
  421. package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
  422. package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
  423. package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
  424. package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-COid5A0f.js.map} +1 -1
  425. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-Cq-CYIwT.js} +2 -2
  426. package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
  427. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-Co5UB6We.js} +2 -2
  428. package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-Co5UB6We.js.map} +1 -1
  429. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-DO9ibnSq.js} +2 -2
  430. package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
  431. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
  432. package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
  433. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
  434. package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
  435. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
  436. package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
  437. package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
  438. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
  439. package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
  440. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
  441. package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
  442. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-J5R3zDkB.js} +3 -3
  443. package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
  444. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-CGh_-tBb.js} +2 -2
  445. package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-CGh_-tBb.js.map} +1 -1
  446. package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-CWnmUzs3.js} +2 -2
  447. package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-CWnmUzs3.js.map} +1 -1
  448. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-sp4KsnUo.js} +2 -2
  449. package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
  450. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DLFAzdbi.js} +2 -2
  451. package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
  452. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-DbFjwR1h.js} +2 -2
  453. package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
  454. package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Ch23msJ5.js} +2 -2
  455. package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
  456. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js +2 -0
  457. package/dist/core/web/public/next/assets/SetupChecklist-Bd76MBAR.js.map +1 -0
  458. package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
  459. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
  460. package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
  461. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-BZ2AG4Eo.js} +2 -2
  462. package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
  463. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
  464. package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
  465. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
  466. package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js.map +1 -0
  467. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-KVoJLDD6.js} +2 -2
  468. package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-KVoJLDD6.js.map} +1 -1
  469. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
  470. package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
  471. package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
  472. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXsYqmdU.js} +2 -2
  473. package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
  474. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
  475. package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
  476. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-BfDmQcKe.js} +2 -2
  477. package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-BfDmQcKe.js.map} +1 -1
  478. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
  479. package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
  480. package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
  481. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-9NtO_6Lj.js} +2 -2
  482. package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-9NtO_6Lj.js.map} +1 -1
  483. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-DscCRFcN.js} +2 -2
  484. package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-DscCRFcN.js.map} +1 -1
  485. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-B668-DJW.js} +5 -5
  486. package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-B668-DJW.js.map} +1 -1
  487. package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
  488. package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
  489. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DG70zH0W.js} +4 -4
  490. package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DG70zH0W.js.map} +1 -1
  491. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
  492. package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
  493. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
  494. package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
  495. package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
  496. package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-D1nP9BhD.js.map} +1 -1
  497. package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
  498. package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-CY-PjpGc.js.map} +1 -1
  499. package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
  500. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-Du02KhAf.js} +2 -2
  501. package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-Du02KhAf.js.map} +1 -1
  502. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-79SeuKlJ.js} +2 -2
  503. package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-79SeuKlJ.js.map} +1 -1
  504. package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
  505. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
  506. package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
  507. package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
  508. package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
  509. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
  510. package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
  511. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
  512. package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
  513. package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
  514. package/dist/core/web/public/next/assets/cloud-model-BDivRMqv.js +2 -0
  515. package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-BDivRMqv.js.map} +1 -1
  516. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-BPQQ5_pJ.js} +2 -2
  517. package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
  518. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
  519. package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
  520. package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-BIntSa9l.js} +2 -2
  521. package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
  522. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-Br8t9jgG.js} +2 -2
  523. package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-Br8t9jgG.js.map} +1 -1
  524. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-CokrgEUq.js} +3 -3
  525. package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-CokrgEUq.js.map} +1 -1
  526. package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
  527. package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-eL3caKVG.js.map} +1 -1
  528. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-B9K-wmcB.js} +2 -2
  529. package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-B9K-wmcB.js.map} +1 -1
  530. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js +2 -0
  531. package/dist/core/web/public/next/assets/copy-setup-XMgCC5f8.js.map +1 -0
  532. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-BJ6ZqB2t.js} +2 -2
  533. package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
  534. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-BvDR3gjp.js} +2 -2
  535. package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
  536. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-W2UFVMZJ.js} +2 -2
  537. package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
  538. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-CtI1SlMX.js} +2 -2
  539. package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
  540. package/dist/core/web/public/next/assets/format-CH4g_sl1.js +2 -0
  541. package/dist/core/web/public/next/assets/format-CH4g_sl1.js.map +1 -0
  542. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
  543. package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
  544. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-Dnkd1TnK.js} +2 -2
  545. package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-Dnkd1TnK.js.map} +1 -1
  546. package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
  547. package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-CMNW_dqn.js.map} +1 -1
  548. package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
  549. package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
  550. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-D1sYbCTQ.js} +2 -2
  551. package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-D1sYbCTQ.js.map} +1 -1
  552. package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-DZ-UQ7v8.js} +3 -3
  553. package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-DZ-UQ7v8.js.map} +1 -1
  554. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
  555. package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
  556. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
  557. package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
  558. package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D_32RAOR.js} +2 -2
  559. package/dist/core/web/public/next/assets/live-model-D_32RAOR.js.map +1 -0
  560. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-7hA92hRg.js} +2 -2
  561. package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-7hA92hRg.js.map} +1 -1
  562. package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
  563. package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-DQPbFdRJ.js.map} +1 -1
  564. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-0dOYe2rJ.js} +2 -2
  565. package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-0dOYe2rJ.js.map} +1 -1
  566. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-C4wOnFtE.js} +2 -2
  567. package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
  568. package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
  569. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-BTXWdZzU.js} +2 -2
  570. package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-BTXWdZzU.js.map} +1 -1
  571. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-Ca6lN6x_.js} +2 -2
  572. package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
  573. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-DfNLgK_I.js} +2 -2
  574. package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
  575. package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
  576. package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
  577. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-CLCdqwkR.js} +2 -2
  578. package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
  579. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-C-qBeu-8.js} +3 -3
  580. package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-C-qBeu-8.js.map} +1 -1
  581. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-Dj71tdD-.js} +2 -2
  582. package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-Dj71tdD-.js.map} +1 -1
  583. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
  584. package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
  585. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-O8yR5YXp.js} +2 -2
  586. package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
  587. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-CoRZq9iO.js} +2 -2
  588. package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
  589. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
  590. package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
  591. package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
  592. package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
  593. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-AdjEyEtn.js} +2 -2
  594. package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
  595. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-CuuMHeDX.js} +2 -2
  596. package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
  597. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BBcp02SZ.js} +2 -2
  598. package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
  599. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-CbXVYQYI.js} +2 -2
  600. package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
  601. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-C_Fpe_sH.js} +2 -2
  602. package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
  603. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
  604. package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
  605. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-DgbigUlV.js} +2 -2
  606. package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
  607. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-S56hIiXS.js} +2 -2
  608. package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-S56hIiXS.js.map} +1 -1
  609. package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
  610. package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-DAVevkNe.js.map} +1 -1
  611. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-B_RAtNZ_.js} +3 -3
  612. package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-B_RAtNZ_.js.map} +1 -1
  613. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js +2 -0
  614. package/dist/core/web/public/next/assets/why-seat-model-M_r0wX3b.js.map +1 -0
  615. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-dji5-Al3.js} +2 -2
  616. package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-dji5-Al3.js.map} +1 -1
  617. package/dist/core/web/public/next/index.html +1 -1
  618. package/dist/core/web/read-projection-worker.js +2 -1
  619. package/dist/core/web/read-projection-worker.js.map +1 -1
  620. package/dist/core/web/read-projections.d.ts +3 -0
  621. package/dist/core/web/read-projections.js +2 -2
  622. package/dist/core/web/read-projections.js.map +1 -1
  623. package/dist/core/web/visibility.js +3 -4
  624. package/dist/core/web/visibility.js.map +1 -1
  625. package/dist/release-dependency-inventory.json +1 -1
  626. package/docs/AUTONOMY-GAP.md +1 -1
  627. package/package.json +3 -2
  628. package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
  629. package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
  630. package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
  631. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js +0 -2
  632. package/dist/core/web/public/next/assets/AreaTrend-BFimExYn.js.map +0 -1
  633. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
  634. package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
  635. package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
  636. package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
  637. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
  638. package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
  639. package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
  640. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js +0 -2
  641. package/dist/core/web/public/next/assets/ChartFrame-SygZ7B3x.js.map +0 -1
  642. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
  643. package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
  644. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js +0 -2
  645. package/dist/core/web/public/next/assets/CommandPalette-B6SgDJH-.js.map +0 -1
  646. package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
  647. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
  648. package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
  649. package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
  650. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js +0 -3
  651. package/dist/core/web/public/next/assets/FleetSection-BdZN6rGS.js.map +0 -1
  652. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js +0 -2
  653. package/dist/core/web/public/next/assets/Funnel-BeNQZWv2.js.map +0 -1
  654. package/dist/core/web/public/next/assets/GrowthSection-iiQg6wvK.js +0 -2
  655. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js +0 -2
  656. package/dist/core/web/public/next/assets/LeaderCard-BRr3_yE-.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js +0 -2
  658. package/dist/core/web/public/next/assets/MatrixHeatmap-DZvZeWXL.js.map +0 -1
  659. package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
  660. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js +0 -2
  661. package/dist/core/web/public/next/assets/MindSection-BTIiQS8P.js.map +0 -1
  662. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
  664. package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
  665. package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
  666. package/dist/core/web/public/next/assets/NewChatDialog-Db5Xjrk8.js +0 -3
  667. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
  668. package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
  669. package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
  670. package/dist/core/web/public/next/assets/PreviewPane-BPBbcROb.js +0 -2
  671. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BX2nkdmZ.js +0 -7
  672. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
  673. package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js.map +0 -1
  674. package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
  675. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js +0 -2
  676. package/dist/core/web/public/next/assets/ResourcesDrawer-DlUKOjl9.js.map +0 -1
  677. package/dist/core/web/public/next/assets/SettingsSection-mI9wQYZg.js.map +0 -1
  678. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
  679. package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
  680. package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
  681. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js +0 -2
  682. package/dist/core/web/public/next/assets/StatTile-DPZ5yyaU.js.map +0 -1
  683. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js +0 -2
  684. package/dist/core/web/public/next/assets/StepBand-DQykLkk_.js.map +0 -1
  685. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js +0 -2
  686. package/dist/core/web/public/next/assets/Swimlane-BzH6OCee.js.map +0 -1
  687. package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
  688. package/dist/core/web/public/next/assets/UniverseConsoleApp-DtXFhAhw.js +0 -2
  689. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js +0 -3
  690. package/dist/core/web/public/next/assets/UsageSection-CiD1DbuF.js.map +0 -1
  691. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
  692. package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
  693. package/dist/core/web/public/next/assets/Workspace-BQSZFSeO.js +0 -10
  694. package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
  695. package/dist/core/web/public/next/assets/actions-Ci6I4C0l.js +0 -2
  696. package/dist/core/web/public/next/assets/budget-queries-DsAjH8ac.js +0 -2
  697. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js +0 -2
  698. package/dist/core/web/public/next/assets/charts-C_xJbJiw.js.map +0 -1
  699. package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
  700. package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
  701. package/dist/core/web/public/next/assets/command-catalog-CF0cQQac.js.map +0 -1
  702. package/dist/core/web/public/next/assets/context-queries-CktFQqSS.js +0 -2
  703. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
  704. package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
  705. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
  706. package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
  707. package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
  708. package/dist/core/web/public/next/assets/guarded-runners-DPh2d32e.js +0 -2
  709. package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
  710. package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
  711. package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
  712. package/dist/core/web/public/next/assets/seat-subscription-C5Tvr0WQ.js +0 -2
  713. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
  714. package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js.map +0 -1
  715. package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
  716. package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
  717. package/dist/core/web/public/next/assets/verse-model-MMySehjj.js +0 -2
  718. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
  719. package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
@@ -19,12 +19,18 @@
19
19
  *
20
20
  * SEAT: leader-seat.ts — grok first, then local; Claude only for the weekly
21
21
  * deep run inside Mason's reserve; no seat ⇒ `no-seat`, never a cloud
22
- * fallback.
22
+ * fallback. 3.14: a run walks a CHAIN of router-approved seats (grok → fast
23
+ * local → large local → opt-in Claude) with per-attempt timeouts, and the
24
+ * memo records every attempt (leader-seat.ts planLeaderSeats,
25
+ * leader-run-chain.ts).
23
26
  *
24
27
  * CADENCE: daily at 06:30 local, plus runs triggered by 10 fleet merges, any
25
28
  * revert, a seat window resetting, or a high-severity reasoning insight —
26
- * skipped when the evidence digest is unchanged, and at most 3 model runs
27
- * per local day.
29
+ * skipped when the evidence digest is unchanged, and at most 3 full model
30
+ * runs per local day. 3.14 (leader-cadence.ts): a failed full run retries
31
+ * (bounded, backed off), and a cheap advisory check-in may run every
32
+ * `foundry.leader.checkinHours` (default 2) in working hours when the
33
+ * evidence changed materially — at most 8 model runs a day in total.
28
34
  *
29
35
  * ACCOUNTABILITY: each move's expectedDelta is graded against the measured
30
36
  * metric once 7 days have passed and its own deadline has come; the grades
@@ -41,8 +47,14 @@ import { ensurePrivateDirectory, readPrivateFileCapped, writePrivateFileAtomic }
41
47
  import { LEADER_ACTION_KINDS, LEADER_LIMITS, } from './leader-types.js';
42
48
  import { LEADER_MEMO_SCHEMA_TEXT, LEADER_METRICS, actionIdFor, cleanModelText, isLeaderMetric, leaderRoot, materializeHypotheses, newMemoId, parseLeaderMemoOutput, readRecentMemos, summarizeMemo, writeLeaderMemo, } from './leader-memo.js';
43
49
  import { applyDueLeaderActions, enactLeaderActions, isLeaderDryRun, listLeaderActions, loadDefaultLeaderDeps, readLeaderDirectives, readStandards, } from './leader-apply.js';
44
- import { loadDefaultLeaderSeatDeps, resolveLeaderSeat } from './leader-seat.js';
50
+ import { loadDefaultLeaderSeatDeps, planLeaderSeats } from './leader-seat.js';
45
51
  import { suggestLeaderCloudBacklog } from './leader-cloud.js';
52
+ import { readLeaderOperatorContext } from './leader-operator.js';
53
+ import { buildLeaderGoalEvidence } from './leader-goal-evidence.js';
54
+ import { LEADER_CHECKIN_SUFFIX, LEADER_MAX_RETRY_ATTEMPTS, LEGACY_LEADER_CADENCE, checkinWindowOpen, materialEvidenceDigest, resolveLeaderCadence, retryDelayMs, } from './leader-cadence.js';
55
+ import { runLeaderSeatChain } from './leader-run-chain.js';
56
+ import { buildLeaderHealth } from './leader-health.js';
57
+ import { isOpenGoal } from '../goals/open-goals.js';
46
58
  // ---------------------------------------------------------------------------
47
59
  // Persona
48
60
  // ---------------------------------------------------------------------------
@@ -171,26 +183,11 @@ export async function gatherLeaderEvidence(sources, nowMs, state) {
171
183
  })),
172
184
  })).sort((a, b) => a.seatId.localeCompare(b.seatId)) : null;
173
185
  const goalRead = attempt('goals', () => sources.goals());
174
- const goals = goalRead && goalRead.complete ? (() => {
175
- const open = goalRead.goals.filter((g) => g.status === 'active' || g.status === 'planning');
176
- const shown = [...open, ...goalRead.goals.filter((g) => g.status === 'paused')].slice(0, 40);
177
- return {
178
- open: open.length,
179
- total: goalRead.goals.length,
180
- focusLimit: LEADER_LIMITS.maxActiveGoals,
181
- items: shown.map((g) => ({
182
- id: g.id,
183
- objective: cleanModelText(g.objective, 200) ?? '',
184
- status: g.status,
185
- repo: g.project ? g.project.split(/[\\/]/).pop() ?? null : null,
186
- milestonesDone: g.milestones.filter((m) => m.status === 'done').length,
187
- milestones: g.milestones.length,
188
- updatedOn: day(g.updatedAt) ?? '',
189
- })),
190
- };
191
- })() : null;
186
+ // An incomplete read is a LOWER BOUND with its caveat, never null: null read
187
+ // as "zero goals" to the model while 21 were open (leader-goal-evidence.ts).
188
+ const goals = goalRead ? buildLeaderGoalEvidence(goalRead) : null;
192
189
  if (goalRead && !goalRead.complete)
193
- unknown.push('goals');
190
+ unknown.push('goals-partial');
194
191
  const facts = await ledgerFacts((o) => sources.readLedger(o), nowMs);
195
192
  if (!facts)
196
193
  unknown.push('ledger');
@@ -219,6 +216,8 @@ export async function gatherLeaderEvidence(sources, nowMs, state) {
219
216
  }
220
217
  const directives = readLeaderDirectives();
221
218
  const actions = listLeaderActions(200);
219
+ // 3.14 operator input (additive): unreadable is reported, never read as "no guidance".
220
+ const operator = attempt('operator', () => readLeaderOperatorContext(nowMs));
222
221
  return {
223
222
  grant,
224
223
  budget,
@@ -238,6 +237,7 @@ export async function gatherLeaderEvidence(sources, nowMs, state) {
238
237
  hitRate: computeHitRate(state.outcomes, nowMs),
239
238
  recentVetoes: actions.filter((a) => a.status === 'vetoed').slice(0, 5).map((a) => ({ summary: a.summary, note: a.vetoNote })),
240
239
  directives: directives ? { grokLanes: directives.grokLanes, codexEnabled: directives.codexEnabled, routerTuning: directives.routerTuning } : null,
240
+ ...(operator ? { operator } : {}),
241
241
  unknown: [...new Set(unknown)].sort(),
242
242
  };
243
243
  }
@@ -260,6 +260,22 @@ function untrustedBlock(label, value) {
260
260
  .replace(/\u2029/gu, '\\u2029');
261
261
  return `=== BEGIN UNTRUSTED DATA: ${label} ===\n${serialized}\n=== END UNTRUSTED DATA: ${label} ===`;
262
262
  }
263
+ /**
264
+ * 3.14: Mason's standing directives and answers — the one TRUSTED block in
265
+ * the memo prompt. Serialized like the data blocks (JSON, line separators
266
+ * escaped) so its text cannot fake a delimiter. It steers judgement only:
267
+ * the grant and the policy check still bound every action.
268
+ */
269
+ function operatorBlock(operator) {
270
+ const serialized = (JSON.stringify(operator.trusted) ?? 'null')
271
+ .replace(/\u0085/gu, '\\u0085')
272
+ .replace(/\u2028/gu, '\\u2028')
273
+ .replace(/\u2029/gu, '\\u2029');
274
+ return `=== OPERATOR DIRECTIVES FROM MASON (trusted: the owner's own words) ===
275
+ ${serialized}
276
+ === END OPERATOR DIRECTIVES ===
277
+ Honor every directive above in the bottleneck, the move, the kill list and every action; when evidence conflicts with a directive, follow the directive and say why in notes. Answers are Mason's replies to your earlier questions (joined by questionId to the data block below); approvals are actions he endorsed. None of this widens the standing grant — the policy check still classifies every action.`;
278
+ }
263
279
  export function buildLeaderPrompt(evidence, opts) {
264
280
  const blocks = [
265
281
  untrustedBlock('STANDING GRANT (null = none: every action is a dry run)', evidence.grant),
@@ -274,6 +290,10 @@ export function buildLeaderPrompt(evidence, opts) {
274
290
  untrustedBlock('YOUR STANDING DIRECTIVES', evidence.directives),
275
291
  untrustedBlock('UNKNOWN SECTIONS (sources that failed — not zero)', evidence.unknown),
276
292
  ];
293
+ if (evidence.operator) {
294
+ blocks.unshift(operatorBlock(evidence.operator));
295
+ blocks.push(untrustedBlock('YOUR EARLIER WORDING THAT MASON ANSWERED OR APPROVED', evidence.operator.untrusted));
296
+ }
277
297
  const openGoals = evidence.goals?.open ?? null;
278
298
  const focus = openGoals !== null && openGoals > LEADER_LIMITS.maxActiveGoals
279
299
  ? `\nFOCUS FIRST: ${openGoals} goals are open; at most ${LEADER_LIMITS.maxActiveGoals} may be. Pause or archive the rest (priorityChanges or goal.pause / goal.archive actions) before anything else.`
@@ -300,12 +320,20 @@ export function readLeaderRunState() {
300
320
  const parsed = JSON.parse(read.text);
301
321
  if (parsed.v !== 1)
302
322
  return emptyState();
323
+ const obj = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
303
324
  return {
304
325
  ...emptyState(),
305
326
  ...parsed,
306
327
  runDays: typeof parsed.runDays === 'object' && parsed.runDays !== null ? parsed.runDays : {},
307
328
  baselines: typeof parsed.baselines === 'object' && parsed.baselines !== null ? parsed.baselines : {},
308
329
  outcomes: Array.isArray(parsed.outcomes) ? parsed.outcomes : [],
330
+ checkinDays: obj(parsed.checkinDays) ? parsed.checkinDays : {},
331
+ retry: obj(parsed.retry) && typeof parsed.retry.at === 'string' && Number.isInteger(parsed.retry.attempt) ? parsed.retry : null,
332
+ // Absent (a pre-3.14 file) stays undefined: health then reads the last run's outcome.
333
+ consecutiveFailures: Number.isInteger(parsed.consecutiveFailures) && parsed.consecutiveFailures >= 0 ? parsed.consecutiveFailures : undefined,
334
+ lastFailure: obj(parsed.lastFailure) ? parsed.lastFailure : null,
335
+ lastAttempts: Array.isArray(parsed.lastAttempts) ? parsed.lastAttempts.filter(obj).slice(0, 20) : [],
336
+ lastServed: obj(parsed.lastServed) ? parsed.lastServed : null,
309
337
  };
310
338
  }
311
339
  catch {
@@ -318,11 +346,22 @@ function writeLeaderRunState(state) {
318
346
  const runDays = {};
319
347
  for (const d of keepDays)
320
348
  runDays[d] = state.runDays[d];
349
+ const checkinDays = {};
350
+ for (const d of Object.keys(state.checkinDays ?? {}).sort().slice(-14))
351
+ checkinDays[d] = state.checkinDays[d];
321
352
  const memoIds = Object.keys(state.baselines).sort().slice(-300);
322
353
  const baselines = {};
323
354
  for (const id of memoIds)
324
355
  baselines[id] = state.baselines[id];
325
- writePrivateFileAtomic(leaderStatePath(), `${JSON.stringify({ ...state, runDays, baselines, outcomes: state.outcomes.slice(-300) })}\n`);
356
+ writePrivateFileAtomic(leaderStatePath(), `${JSON.stringify({ ...state, runDays, checkinDays, baselines, outcomes: state.outcomes.slice(-300) })}\n`);
357
+ }
358
+ /** Check-in runs on the local day of `ms` (3.14). */
359
+ export function checkinsOnDay(state, ms) {
360
+ return state.checkinDays?.[localDay(ms)] ?? 0;
361
+ }
362
+ /** Full (non-check-in) runs on the local day of `ms` — what the 3-a-day cap counts. */
363
+ export function fullRunsOnDay(state, ms) {
364
+ return Math.max(0, runsOnDay(state, ms) - checkinsOnDay(state, ms));
326
365
  }
327
366
  /** Local calendar day (the cadence and the 3-runs-a-day cap are local). */
328
367
  export function localDay(ms) {
@@ -351,16 +390,30 @@ export function scheduleSlots(nowMs) {
351
390
  today = next;
352
391
  return { previous, next: today };
353
392
  }
354
- /** Pure: is a Leader run due now, and why. */
355
- export function leaderRunDue(nowMs, state, signals) {
393
+ /**
394
+ * Pure: is a Leader run due now, and why. `cadence` (3.14) adds the bounded
395
+ * retry and the working-hours check-in; without it this is the 3.10 cadence
396
+ * (no check-ins, 3 runs a day) — retries still apply, inside that cap.
397
+ */
398
+ export function leaderRunDue(nowMs, state, signals, cadence = LEGACY_LEADER_CADENCE) {
356
399
  const slots = scheduleSlots(nowMs);
357
400
  const nextRunAt = new Date(slots.next).toISOString();
358
- if (runsOnDay(state, nowMs) >= LEADER_LIMITS.maxRunsPerDay) {
359
- return { due: false, trigger: null, reason: `The Leader already ran ${LEADER_LIMITS.maxRunsPerDay} times today.`, nextRunAt };
401
+ const capped = `The Leader already ran ${cadence.maxRunsPerDay} times today.`;
402
+ if (runsOnDay(state, nowMs) >= cadence.maxRunsPerDayTotal) {
403
+ return { due: false, trigger: null, reason: `The Leader already ran ${cadence.maxRunsPerDayTotal} times today.`, nextRunAt };
404
+ }
405
+ if (fullRunsOnDay(state, nowMs) >= cadence.maxRunsPerDay) {
406
+ // Full runs are spent for today; only a check-in may still run.
407
+ if (checkinWindowOpen(nowMs, state, cadence))
408
+ return { due: true, trigger: 'checkin', reason: 'A working-hours check-in is due.', nextRunAt };
409
+ return { due: false, trigger: null, reason: capped, nextRunAt };
360
410
  }
361
411
  const lastMs = state.lastRun ? Date.parse(state.lastRun.at) : -Infinity;
362
412
  if (lastMs < slots.previous)
363
413
  return { due: true, trigger: 'schedule', reason: 'The daily 06:30 run is due.', nextRunAt };
414
+ if (state.retry && Date.parse(state.retry.at) <= nowMs) {
415
+ return { due: true, trigger: 'retry', reason: `Retry ${state.retry.attempt} of ${LEADER_MAX_RETRY_ATTEMPTS} after a failed run.`, nextRunAt };
416
+ }
364
417
  if (signals.revertsSinceLastRun !== null && signals.revertsSinceLastRun > 0) {
365
418
  return { due: true, trigger: 'revert', reason: 'A fleet merge was reverted.', nextRunAt };
366
419
  }
@@ -371,8 +424,31 @@ export function leaderRunDue(nowMs, state, signals) {
371
424
  return { due: true, trigger: 'seat-reset', reason: 'A seat window reset.', nextRunAt };
372
425
  if (signals.highInsightSinceLastRun)
373
426
  return { due: true, trigger: 'insight', reason: 'A high-severity reasoning insight appeared.', nextRunAt };
427
+ if (checkinWindowOpen(nowMs, state, cadence))
428
+ return { due: true, trigger: 'checkin', reason: 'A working-hours check-in is due.', nextRunAt };
374
429
  return { due: false, trigger: null, reason: 'Nothing new since the last memo.', nextRunAt };
375
430
  }
431
+ /**
432
+ * PURE and cheap (state file only — no ledger, no evidence): could a tick run
433
+ * the Leader now for a TIME reason — the daily slot not yet run, a retry
434
+ * that came due, or an open check-in window? The comms poller (every 3 min,
435
+ * no daemon needed) uses it to decide whether to start `ashlr leader tick
436
+ * --wait` in the background; the tick then applies the real rules.
437
+ * Event triggers (merges, reverts, …) are left to the daily ticks.
438
+ */
439
+ export function leaderWakeDue(nowMs, state, cadence) {
440
+ if (runsOnDay(state, nowMs) >= cadence.maxRunsPerDayTotal)
441
+ return { due: false, why: 'daily cap reached' };
442
+ const fullRoom = fullRunsOnDay(state, nowMs) < cadence.maxRunsPerDay;
443
+ const lastMs = state.lastRun ? Date.parse(state.lastRun.at) : -Infinity;
444
+ if (fullRoom && lastMs < scheduleSlots(nowMs).previous)
445
+ return { due: true, why: 'the daily run has not happened' };
446
+ if (fullRoom && state.retry && Date.parse(state.retry.at) <= nowMs)
447
+ return { due: true, why: `retry ${state.retry.attempt} is due` };
448
+ if (checkinWindowOpen(nowMs, state, cadence))
449
+ return { due: true, why: 'a check-in window is open' };
450
+ return { due: false, why: 'nothing is due' };
451
+ }
376
452
  export async function gatherTriggerSignals(sources, state, nowMs) {
377
453
  const lastIso = state.lastRun?.at ?? new Date(nowMs - 86_400_000).toISOString();
378
454
  const lastMs = Date.parse(lastIso);
@@ -413,7 +489,8 @@ export async function measureLeaderMetric(metric, sources, nowMs) {
413
489
  switch (metric) {
414
490
  case 'active-goals': {
415
491
  const read = sources.goals();
416
- return read.complete ? read.goals.filter((g) => g.status === 'active' || g.status === 'planning').length : null;
492
+ // Grading needs the exact count: a lower bound is not a measurement.
493
+ return read.complete ? read.goals.filter(isOpenGoal).length : null;
417
494
  }
418
495
  case 'proposals-7d':
419
496
  return sources.quality7d().proposalsCreated;
@@ -487,7 +564,7 @@ export async function loadDefaultLeaderRunDeps(cfg) {
487
564
  capacity: () => budgetStore.readCapacitySnapshot(),
488
565
  goals: () => {
489
566
  const read = goalsStore.listGoalsDetailed();
490
- return { goals: read.goals, complete: read.complete || read.sourceState === 'missing' };
567
+ return { goals: read.goals, complete: read.complete || read.sourceState === 'missing', unreadable: read.unreadableFiles };
491
568
  },
492
569
  readLedger: (opts) => ledger.readLedger(opts),
493
570
  holds: () => quarantine.listRepoHolds(),
@@ -569,13 +646,32 @@ async function runLeaderOnce(deps, trigger, opts) {
569
646
  const nowMs = deps.now();
570
647
  const nowIso = new Date(nowMs).toISOString();
571
648
  const state = readLeaderRunState();
572
- if (runsOnDay(state, nowMs) >= LEADER_LIMITS.maxRunsPerDay) {
573
- return { outcome: 'skipped-unchanged', reason: `The Leader already ran ${LEADER_LIMITS.maxRunsPerDay} times today.`, memo: null };
649
+ const cadence = resolveLeaderCadence(deps.cfg);
650
+ const mode = trigger === 'checkin' ? 'checkin' : 'full';
651
+ // Full runs keep the 3-a-day cap; check-ins have their own room under the total cap.
652
+ if (mode === 'full' && fullRunsOnDay(state, nowMs) >= cadence.maxRunsPerDay) {
653
+ return { outcome: 'skipped-unchanged', reason: `The Leader already ran ${cadence.maxRunsPerDay} times today.`, memo: null };
654
+ }
655
+ if (runsOnDay(state, nowMs) >= cadence.maxRunsPerDayTotal) {
656
+ return { outcome: 'skipped-unchanged', reason: `The Leader already ran ${cadence.maxRunsPerDayTotal} times today.`, memo: null };
574
657
  }
575
658
  const evidence = await gatherLeaderEvidence(deps.sources, nowMs, state);
576
659
  const digest = evidenceDigest(evidence);
660
+ const material = materialEvidenceDigest(evidence);
661
+ if (mode === 'checkin' && !opts.force && (state.lastMaterialDigest ?? null) === material) {
662
+ // Nothing material: no model call, and the next look is a recheck interval away.
663
+ state.lastRun = { at: nowIso, outcome: 'skipped-unchanged', reason: 'Check-in: nothing material changed since the last memo.', memoId: null, trigger };
664
+ state.lastCheckinEvalAt = nowIso;
665
+ writeLeaderRunState(state);
666
+ return { outcome: 'skipped-unchanged', reason: state.lastRun.reason, memo: null };
667
+ }
577
668
  if (!opts.force && state.lastEvidenceDigest === digest) {
578
669
  state.lastRun = { at: nowIso, outcome: 'skipped-unchanged', reason: 'The evidence has not changed since the last memo.', memoId: null, trigger };
670
+ if (mode === 'checkin')
671
+ state.lastCheckinEvalAt = nowIso;
672
+ // A retry whose evidence a later run already consumed has nothing left to do.
673
+ if (trigger === 'retry')
674
+ state.retry = null;
579
675
  writeLeaderRunState(state);
580
676
  return { outcome: 'skipped-unchanged', reason: state.lastRun.reason, memo: null };
581
677
  }
@@ -588,65 +684,120 @@ async function runLeaderOnce(deps, trigger, opts) {
588
684
  }
589
685
  })();
590
686
  const dryRun = isLeaderDryRun(policy);
591
- const prompt = buildLeaderPrompt(evidence, { dryRun, nowIso });
592
- const deep = trigger === 'schedule'
687
+ const basePrompt = buildLeaderPrompt(evidence, { dryRun, nowIso });
688
+ const prompt = mode === 'checkin' ? `${basePrompt}\n\n${LEADER_CHECKIN_SUFFIX}` : basePrompt;
689
+ // A retry of the 06:30 run is still that run (deep-eligible).
690
+ const scheduled = trigger === 'schedule' || (trigger === 'retry' && state.retry?.of === 'schedule');
691
+ const deep = scheduled
593
692
  && (state.lastDeepRunAt === null || nowMs - Date.parse(state.lastDeepRunAt) >= 7 * 86_400_000);
594
693
  const memoId = newMemoId(nowMs);
595
694
  const memo = emptyMemo(memoId, nowIso, trigger, digest, dryRun);
596
- const seat = await resolveLeaderSeat(deps.seat, { deep, promptChars: LEADER_SYSTEM_PROMPT.length + prompt.length });
695
+ memo.mode = mode;
696
+ // Check-ins in reserve mode stay on free local models.
697
+ const budgetMode = (() => {
698
+ try {
699
+ return deps.sources.budgetPolicy().mode;
700
+ }
701
+ catch {
702
+ return null;
703
+ }
704
+ })();
705
+ const plan = await planLeaderSeats(deps.seat, {
706
+ deep,
707
+ promptChars: LEADER_SYSTEM_PROMPT.length + prompt.length,
708
+ mode,
709
+ localOnly: mode === 'checkin' && budgetMode === 'reserve',
710
+ });
711
+ let servedDeep = false;
712
+ let attempts = [];
597
713
  const finish = (outcome, reason, countsAsRun) => {
598
714
  memo.status = outcome;
599
715
  memo.statusReason = reason === null ? null : scrubPrivateText(reason).slice(0, 400);
716
+ memo.attempts = attempts.map((a) => ({ ...a, reason: a.reason === null ? null : scrubPrivateText(a.reason).slice(0, 300) }));
600
717
  writeLeaderMemo(memo);
601
718
  recordMemoOnLedger(deps, memo);
602
719
  const fresh = readLeaderRunState();
603
720
  fresh.lastRun = { at: nowIso, outcome, reason: memo.statusReason, memoId, trigger };
604
721
  fresh.lastMemoAt = nowIso;
722
+ const today = localDay(nowMs);
605
723
  if (countsAsRun)
606
- fresh.runDays[localDay(nowMs)] = (fresh.runDays[localDay(nowMs)] ?? 0) + 1;
607
- // A failed run does not consume the evidence: the next trigger may retry it.
608
- if (outcome === 'ok')
724
+ fresh.runDays[today] = (fresh.runDays[today] ?? 0) + 1;
725
+ if (countsAsRun && mode === 'checkin')
726
+ fresh.checkinDays = { ...(fresh.checkinDays ?? {}), [today]: (fresh.checkinDays?.[today] ?? 0) + 1 };
727
+ fresh.lastAttempts = memo.attempts;
728
+ fresh.lastAttemptsAt = nowIso;
729
+ if (outcome === 'ok') {
730
+ // A failed run does not consume the evidence: the next trigger may retry it.
609
731
  fresh.lastEvidenceDigest = digest;
610
- if (outcome === 'ok' && memo.seatId && seat.ok && seat.choice.deep)
611
- fresh.lastDeepRunAt = nowIso;
732
+ fresh.lastMaterialDigest = material;
733
+ fresh.lastSuccessAt = nowIso;
734
+ fresh.consecutiveFailures = 0;
735
+ fresh.lastFailure = null;
736
+ fresh.retry = null;
737
+ fresh.lastServed = memo.seatId ? { seatId: memo.seatId, model: memo.model, at: nowIso } : null;
738
+ if (memo.seatId && servedDeep)
739
+ fresh.lastDeepRunAt = nowIso;
740
+ }
741
+ else {
742
+ fresh.consecutiveFailures = (fresh.consecutiveFailures ?? 0) + 1;
743
+ fresh.lastFailure = { at: nowIso, outcome, reason: memo.statusReason };
744
+ if (mode === 'full') {
745
+ // A bounded retry instead of waiting for tomorrow's slot. A check-in
746
+ // does not retry: the next check-in window is its retry.
747
+ const attempt = trigger === 'retry' ? (fresh.retry?.attempt ?? 0) + 1 : 1;
748
+ const delay = retryDelayMs(attempt);
749
+ fresh.retry = delay === null ? null : {
750
+ attempt,
751
+ at: new Date(nowMs + delay).toISOString(),
752
+ of: trigger === 'retry' ? fresh.retry?.of ?? 'schedule' : trigger,
753
+ reason: memo.statusReason,
754
+ };
755
+ }
756
+ }
612
757
  writeLeaderRunState(fresh);
613
758
  return { outcome, reason: memo.statusReason, memo };
614
759
  };
615
- if (!seat.ok)
616
- return finish('no-seat', seat.reason, false);
617
- memo.seatId = seat.choice.seatId;
618
- memo.model = seat.choice.model;
619
- let raw;
620
- try {
621
- raw = await seat.complete(LEADER_SYSTEM_PROMPT, prompt);
622
- }
623
- catch (err) {
624
- return finish('failed', `The ${seat.choice.engine} call failed: ${err instanceof Error ? err.message : 'error'}`, true);
760
+ if (!plan.ok) {
761
+ attempts = plan.skipped;
762
+ return finish('no-seat', plan.reason, false);
625
763
  }
626
- let parsed = parseLeaderMemoOutput(raw, { nowMs });
627
- // One retry, on FREE seats only — a paid retry would double the spend of a memo.
628
- if (!parsed.ok && seat.choice.engine === 'local') {
629
- try {
630
- raw = await seat.complete(LEADER_SYSTEM_PROMPT, `${prompt}\n\nYour previous reply could not be parsed (${parsed.reason}). Reply with ONLY the JSON object.`);
631
- parsed = parseLeaderMemoOutput(raw, { nowMs });
632
- }
633
- catch { /* keep the first failure */ }
634
- }
635
- if (!parsed.ok)
636
- return finish('parse-failed', parsed.reason, true);
637
- const draft = parsed.draft;
764
+ const chain = await runLeaderSeatChain(plan.steps, {
765
+ system: LEADER_SYSTEM_PROMPT,
766
+ user: prompt,
767
+ parse: (raw) => parseLeaderMemoOutput(raw, { nowMs }),
768
+ reask: (why) => `${prompt}\n\nYour previous reply could not be parsed (${why}). Reply with ONLY the JSON object.`,
769
+ }, () => deps.now());
770
+ attempts = [...chain.attempts, ...plan.skipped];
771
+ const step = chain.ok ? chain.step : chain.lastStep;
772
+ memo.seatId = step?.choice.seatId ?? null;
773
+ memo.model = step?.choice.model ?? null;
774
+ if (!chain.ok)
775
+ return finish(chain.outcome, chain.reason, true);
776
+ servedDeep = chain.step.choice.deep;
777
+ const draft = chain.draft;
638
778
  memo.bottleneck = draft.bottleneck;
639
779
  memo.move = draft.move;
640
780
  memo.killList = draft.killList;
781
+ memo.questionsForMason = draft.questionsForMason;
782
+ memo.status = 'ok';
783
+ memo.statusReason = draft.notes.length > 0 ? draft.notes.join('; ').slice(0, 400) : null;
784
+ if (mode === 'checkin') {
785
+ // ADVISORY: a check-in's goals, hypotheses, standards and actions are
786
+ // never enacted (a cheap model every two hours does not act; the daily
787
+ // memo does). Its move is not graded either (gradeLeaderOutcomes).
788
+ const dropped = draft.actions.length + draft.goals.length + draft.hypotheses.length + draft.standards.length;
789
+ if (dropped > 0) {
790
+ memo.statusReason = [memo.statusReason, `Check-in: ${dropped} proposal(s) not enacted (check-ins are advisory).`]
791
+ .filter((n) => typeof n === 'string' && n.length > 0).join('; ').slice(0, 400);
792
+ }
793
+ return finish('ok', memo.statusReason, true);
794
+ }
641
795
  memo.goals = draft.goals;
642
796
  memo.priorityChanges = draft.priorityChanges;
643
797
  memo.standards = draft.standards;
644
798
  memo.critiques = draft.critiques;
645
799
  memo.seatPlan = draft.seatPlan;
646
- memo.questionsForMason = draft.questionsForMason;
647
800
  memo.hypotheses = materializeHypotheses(memoId, draft.hypotheses, nowIso);
648
- memo.status = 'ok';
649
- memo.statusReason = draft.notes.length > 0 ? draft.notes.join('; ').slice(0, 400) : null;
650
801
  // Written BEFORE the actions run: experiment.start reads its hypothesis from this file.
651
802
  writeLeaderMemo(memo);
652
803
  // Register the memo's hypotheses with U9's harness registry as OPEN (Growth
@@ -722,10 +873,16 @@ export async function runLeader(deps, trigger, opts = {}) {
722
873
  return { outcome: 'skipped-unchanged', reason: 'A Leader run is already in progress.', memo: null };
723
874
  const job = (async () => {
724
875
  ensurePrivateDirectory(leaderRoot());
876
+ // Cross-process single flight: the lock is reclaimed only from a dead
877
+ // owner (pid + start identity), never on a timer, so a slow local memo
878
+ // keeps it for as long as it runs.
725
879
  const lock = acquireLocalStoreLock(join(leaderRoot(), '.run.lock'), 0);
726
880
  if (!lock)
727
881
  return { outcome: 'skipped-unchanged', reason: 'Another process is running the Leader.', memo: null };
728
882
  try {
883
+ if (opts.expectLastRunAt !== undefined && (readLeaderRunState().lastRun?.at ?? null) !== opts.expectLastRunAt) {
884
+ return { outcome: 'skipped-unchanged', reason: 'Another process ran the Leader since this run was scheduled.', memo: null };
885
+ }
729
886
  return await runLeaderOnce(deps, trigger, { force: opts.force === true });
730
887
  }
731
888
  finally {
@@ -747,7 +904,8 @@ export async function gradeLeaderOutcomes(deps) {
747
904
  const graded = new Set(state.outcomes.map((o) => o.memoId));
748
905
  const fresh = [];
749
906
  for (const memo of readRecentMemos(60)) {
750
- if (memo.status !== 'ok' || graded.has(memo.id))
907
+ // Check-ins are advisory (3.14): their moves are not graded into the hit-rate.
908
+ if (memo.status !== 'ok' || memo.mode === 'checkin' || graded.has(memo.id))
751
909
  continue;
752
910
  const due = gradeDueAt(memo);
753
911
  const expected = memo.move?.expectedDelta;
@@ -797,11 +955,15 @@ export async function leaderTick(deps, opts = {}) {
797
955
  }
798
956
  catch { /* retried next tick */ }
799
957
  const state = readLeaderRunState();
958
+ const cadence = resolveLeaderCadence(deps.cfg);
959
+ rememberCadence(state, cadence);
800
960
  const signals = await gatherTriggerSignals(deps.sources, state, nowMs);
801
- const due = leaderRunDue(nowMs, state, signals);
961
+ const due = leaderRunDue(nowMs, state, signals, cadence);
802
962
  if (!due.due || !due.trigger || runInFlight)
803
963
  return { applied, graded, due, started: false, run: null };
804
- const job = runLeader(deps, due.trigger);
964
+ // The CAS token: if the daemon's tick and the comms poller's tick both saw
965
+ // this run as due, only the first to take the lock runs it.
966
+ const job = runLeader(deps, due.trigger, { expectLastRunAt: state.lastRun?.at ?? null });
805
967
  if (opts.awaitRun)
806
968
  return { applied, graded, due, started: true, run: await job };
807
969
  void job.catch(() => undefined);
@@ -810,12 +972,49 @@ export async function leaderTick(deps, opts = {}) {
810
972
  // ---------------------------------------------------------------------------
811
973
  // State for the API / UI
812
974
  // ---------------------------------------------------------------------------
813
- export function buildLeaderState(nowMs) {
975
+ /**
976
+ * The cadence the last tick ran under, kept in the state file so the read
977
+ * path (GET /api/verse/leader, which has no config in hand) reports the same
978
+ * check-in interval the runs use. Written only when it changed.
979
+ */
980
+ function rememberCadence(state, cadence) {
981
+ const stored = state.cadence;
982
+ if (stored && stored.checkinHours === cadence.checkinHours
983
+ && stored.workingHours.start === cadence.workingHours.start && stored.workingHours.end === cadence.workingHours.end)
984
+ return;
985
+ try {
986
+ const fresh = readLeaderRunState();
987
+ fresh.cadence = { checkinHours: cadence.checkinHours, workingHours: { ...cadence.workingHours } };
988
+ writeLeaderRunState(fresh);
989
+ }
990
+ catch { /* the health read falls back to the defaults */ }
991
+ }
992
+ function cadenceFor(state, cfg) {
993
+ if (cfg)
994
+ return resolveLeaderCadence(cfg);
995
+ const stored = state.cadence;
996
+ if (!stored)
997
+ return resolveLeaderCadence(undefined);
998
+ return resolveLeaderCadence({ foundry: { leader: { checkinHours: stored.checkinHours, workingHours: stored.workingHours } } });
999
+ }
1000
+ export function buildLeaderState(nowMs, cfg) {
814
1001
  const state = readLeaderRunState();
815
1002
  const memos = readRecentMemos(30);
816
1003
  const outcomeByMemo = new Map(state.outcomes.map((o) => [o.memoId, o]));
817
1004
  const timeline = memos.map((m) => summarizeMemo(m, outcomeByMemo.get(m.id) ?? null));
818
1005
  const latest = memos.find((m) => m.status === 'ok') ?? memos[0] ?? null;
1006
+ const lastOk = memos.find((m) => m.status === 'ok') ?? null;
1007
+ const health = buildLeaderHealth({
1008
+ ...state,
1009
+ // Pre-3.14 state files: the newest ok memo is the last success.
1010
+ lastSuccessAt: state.lastSuccessAt ?? lastOk?.at ?? null,
1011
+ lastServed: state.lastServed ?? (lastOk?.seatId ? { seatId: lastOk.seatId, model: lastOk.model, at: lastOk.at } : null),
1012
+ }, nowMs, {
1013
+ cadence: cadenceFor(state, cfg),
1014
+ nextScheduledAt: scheduleSlots(nowMs).next,
1015
+ runsToday: runsOnDay(state, nowMs),
1016
+ checkinsToday: checkinsOnDay(state, nowMs),
1017
+ });
819
1018
  return {
820
1019
  v: 1,
821
1020
  generatedAt: new Date(nowMs).toISOString(),
@@ -828,6 +1027,7 @@ export function buildLeaderState(nowMs) {
828
1027
  hitRate: computeHitRate(state.outcomes, nowMs),
829
1028
  standards: readStandards(),
830
1029
  directives: readLeaderDirectives(),
1030
+ health,
831
1031
  };
832
1032
  }
833
1033
  //# sourceMappingURL=leader.js.map