@rubytech/create-sitedesk-code 0.1.552 → 0.1.553

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 (229) hide show
  1. package/package.json +1 -1
  2. package/payload/platform/lib/routine-templates/dist/index.d.ts +15 -2
  3. package/payload/platform/lib/routine-templates/dist/index.d.ts.map +1 -1
  4. package/payload/platform/lib/routine-templates/dist/index.js +25 -1
  5. package/payload/platform/lib/routine-templates/dist/index.js.map +1 -1
  6. package/payload/platform/lib/routine-templates/dist/roster.d.ts +76 -1
  7. package/payload/platform/lib/routine-templates/dist/roster.d.ts.map +1 -1
  8. package/payload/platform/lib/routine-templates/dist/roster.js +60 -3
  9. package/payload/platform/lib/routine-templates/dist/roster.js.map +1 -1
  10. package/payload/platform/lib/routine-templates/src/__tests__/roster.test.ts +93 -1
  11. package/payload/platform/lib/routine-templates/src/__tests__/seed.test.ts +74 -0
  12. package/payload/platform/lib/routine-templates/src/index.ts +25 -1
  13. package/payload/platform/lib/routine-templates/src/roster.ts +111 -2
  14. package/payload/platform/plugins/admin/skills/whats-new/SKILL.md +6 -0
  15. package/payload/platform/plugins/scheduling/PLUGIN.md +32 -4
  16. package/payload/platform/plugins/scheduling/mcp/dist/index.js +6 -0
  17. package/payload/platform/plugins/scheduling/mcp/dist/index.js.map +1 -1
  18. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts +2 -0
  19. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.d.ts.map +1 -0
  20. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js +44 -0
  21. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/fires-per-day.test.js.map +1 -0
  22. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts +2 -0
  23. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.d.ts.map +1 -0
  24. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js +92 -0
  25. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/gate-classification.test.js.map +1 -0
  26. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js +78 -2
  27. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/schedule-audit.test.js.map +1 -1
  28. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js +18 -1
  29. package/payload/platform/plugins/scheduling/mcp/dist/lib/__tests__/update-summary.test.js.map +1 -1
  30. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts +2 -0
  31. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.d.ts.map +1 -0
  32. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js +47 -0
  33. package/payload/platform/plugins/scheduling/mcp/dist/lib/fires-per-day.js.map +1 -0
  34. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts +58 -0
  35. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.d.ts.map +1 -1
  36. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js +173 -0
  37. package/payload/platform/plugins/scheduling/mcp/dist/lib/schedule-audit.js.map +1 -1
  38. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.d.ts.map +1 -1
  39. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js +11 -1
  40. package/payload/platform/plugins/scheduling/mcp/dist/lib/update-summary.js.map +1 -1
  41. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js +29 -2
  42. package/payload/platform/plugins/scheduling/mcp/dist/scripts/check-due-events.js.map +1 -1
  43. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts +2 -0
  44. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.d.ts.map +1 -0
  45. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js +200 -0
  46. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-waiver.test.js.map +1 -0
  47. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js +21 -1
  48. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-gate-write.test.js.map +1 -1
  49. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts +2 -0
  50. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.d.ts.map +1 -0
  51. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js +208 -0
  52. package/payload/platform/plugins/scheduling/mcp/dist/tools/__tests__/schedule-update-recurrence-record.test.js.map +1 -0
  53. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts +40 -0
  54. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.d.ts.map +1 -1
  55. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js +70 -5
  56. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-event.js.map +1 -1
  57. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.d.ts.map +1 -1
  58. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js +67 -0
  59. package/payload/platform/plugins/scheduling/mcp/dist/tools/schedule-update.js.map +1 -1
  60. package/payload/platform/plugins/workflows/skills/workflow-manager/SKILL.md +4 -0
  61. package/payload/server/public/activity.html +5 -5
  62. package/payload/server/public/agents.html +4 -4
  63. package/payload/server/public/assets/{AdminLoginScreens-Bjcs9ta9.js → AdminLoginScreens-Ca2QhL18.js} +1 -1
  64. package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.br +0 -0
  65. package/payload/server/public/assets/AdminLoginScreens-Ca2QhL18.js.gz +0 -0
  66. package/payload/server/public/assets/{AdminShell-DVBAMUCy.js → AdminShell-Dc5du5xX.js} +1 -1
  67. package/payload/server/public/assets/AdminShell-Dc5du5xX.js.br +0 -0
  68. package/payload/server/public/assets/AdminShell-Dc5du5xX.js.gz +0 -0
  69. package/payload/server/public/assets/{activity-C8E8-EwQ.js → activity-TSDKmIYb.js} +1 -1
  70. package/payload/server/public/assets/activity-TSDKmIYb.js.br +0 -0
  71. package/payload/server/public/assets/activity-TSDKmIYb.js.gz +0 -0
  72. package/payload/server/public/assets/{admin-CeWAlpRS.js → admin-Ba729Eyg.js} +1 -1
  73. package/payload/server/public/assets/admin-Ba729Eyg.js.br +0 -0
  74. package/payload/server/public/assets/admin-Ba729Eyg.js.gz +0 -0
  75. package/payload/server/public/assets/{agents-DuN92iFb.js → agents-9hlQHOS5.js} +1 -1
  76. package/payload/server/public/assets/agents-9hlQHOS5.js.br +0 -0
  77. package/payload/server/public/assets/agents-9hlQHOS5.js.gz +0 -0
  78. package/payload/server/public/assets/{browser-BxebdKbh.js → browser-BrqoCsqh.js} +1 -1
  79. package/payload/server/public/assets/browser-BrqoCsqh.js.br +0 -0
  80. package/payload/server/public/assets/browser-BrqoCsqh.js.gz +0 -0
  81. package/payload/server/public/assets/{calendar-BtFZQ5Np.js → calendar-DOObQ_m8.js} +1 -1
  82. package/payload/server/public/assets/calendar-DOObQ_m8.js.br +0 -0
  83. package/payload/server/public/assets/calendar-DOObQ_m8.js.gz +0 -0
  84. package/payload/server/public/assets/chat-Xaul2lLF.js +1 -0
  85. package/payload/server/public/assets/chat-Xaul2lLF.js.br +3 -0
  86. package/payload/server/public/assets/chat-Xaul2lLF.js.gz +0 -0
  87. package/payload/server/public/assets/chevron-left-BYH5vH4S.js +1 -0
  88. package/payload/server/public/assets/chevron-left-BYH5vH4S.js.br +0 -0
  89. package/payload/server/public/assets/chevron-right-XxQPHfNH.js +1 -0
  90. package/payload/server/public/assets/chevron-right-XxQPHfNH.js.br +0 -0
  91. package/payload/server/public/assets/clock-BNp2JTKh.js +1 -0
  92. package/payload/server/public/assets/clock-BNp2JTKh.js.br +0 -0
  93. package/payload/server/public/assets/clock-BNp2JTKh.js.gz +0 -0
  94. package/payload/server/public/assets/{copy-DCDHXq3O.js → copy-BkbgmpJo.js} +1 -1
  95. package/payload/server/public/assets/copy-BkbgmpJo.js.br +0 -0
  96. package/payload/server/public/assets/copy-BkbgmpJo.js.gz +0 -0
  97. package/payload/server/public/assets/data-yuHj8g0C.js +1 -0
  98. package/payload/server/public/assets/data-yuHj8g0C.js.br +3 -0
  99. package/payload/server/public/assets/data-yuHj8g0C.js.gz +0 -0
  100. package/payload/server/public/assets/{file-text-zQgEQWCF.js → file-text-DDCrqbWB.js} +1 -1
  101. package/payload/server/public/assets/file-text-DDCrqbWB.js.br +0 -0
  102. package/payload/server/public/assets/file-text-DDCrqbWB.js.gz +0 -0
  103. package/payload/server/public/assets/{graph-CFCEh_YI.js → graph-BKPdL5ph.js} +1 -1
  104. package/payload/server/public/assets/graph-BKPdL5ph.js.br +0 -0
  105. package/payload/server/public/assets/graph-BKPdL5ph.js.gz +0 -0
  106. package/payload/server/public/assets/{graph-labels-CA1UcDuS.js → graph-labels-B2PrHK6O.js} +1 -1
  107. package/payload/server/public/assets/graph-labels-B2PrHK6O.js.br +0 -0
  108. package/payload/server/public/assets/graph-labels-B2PrHK6O.js.gz +0 -0
  109. package/payload/server/public/assets/{operator-hFXPDc2X.js → operator-BVULmN09.js} +1 -1
  110. package/payload/server/public/assets/operator-BVULmN09.js.br +0 -0
  111. package/payload/server/public/assets/operator-BVULmN09.js.gz +0 -0
  112. package/payload/server/public/assets/{page-ne7I_r9L.js → page-BbzdSxuU.js} +1 -1
  113. package/payload/server/public/assets/page-BbzdSxuU.js.br +0 -0
  114. package/payload/server/public/assets/page-BbzdSxuU.js.gz +0 -0
  115. package/payload/server/public/assets/{page-C8jyPH_3.js → page-baQ9FQIg.js} +1 -1
  116. package/payload/server/public/assets/page-baQ9FQIg.js.br +0 -0
  117. package/payload/server/public/assets/page-baQ9FQIg.js.gz +0 -0
  118. package/payload/server/public/assets/play-3hlqzxLI.js +1 -0
  119. package/payload/server/public/assets/play-3hlqzxLI.js.br +0 -0
  120. package/payload/server/public/assets/play-3hlqzxLI.js.gz +0 -0
  121. package/payload/server/public/assets/{public-BgnqjAal.js → public-B_SEBxWy.js} +1 -1
  122. package/payload/server/public/assets/public-B_SEBxWy.js.br +0 -0
  123. package/payload/server/public/assets/public-B_SEBxWy.js.gz +0 -0
  124. package/payload/server/public/assets/{rotate-ccw-DfJWjXAg.js → rotate-ccw-DzXTXh3g.js} +1 -1
  125. package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.br +0 -0
  126. package/payload/server/public/assets/rotate-ccw-DzXTXh3g.js.gz +0 -0
  127. package/payload/server/public/assets/routines-BQzE0xzC.js +2 -0
  128. package/payload/server/public/assets/routines-BQzE0xzC.js.br +0 -0
  129. package/payload/server/public/assets/routines-BQzE0xzC.js.gz +0 -0
  130. package/payload/server/public/assets/{skills-D-6EbgfP.js → skills-yCZhYVIs.js} +1 -1
  131. package/payload/server/public/assets/skills-yCZhYVIs.js.br +0 -0
  132. package/payload/server/public/assets/skills-yCZhYVIs.js.gz +0 -0
  133. package/payload/server/public/assets/{tasks-DnN5Fyds.js → tasks-DxNFLsHv.js} +1 -1
  134. package/payload/server/public/assets/tasks-DxNFLsHv.js.br +0 -0
  135. package/payload/server/public/assets/tasks-DxNFLsHv.js.gz +0 -0
  136. package/payload/server/public/assets/{triangle-alert-eh9UOKDT.js → triangle-alert-CYwHTcvU.js} +1 -1
  137. package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.br +0 -0
  138. package/payload/server/public/assets/triangle-alert-CYwHTcvU.js.gz +0 -0
  139. package/payload/server/public/assets/{useCopyFeedback-Bz9OJHBb.js → useCopyFeedback-BCRjKc-H.js} +1 -1
  140. package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.br +0 -0
  141. package/payload/server/public/assets/useCopyFeedback-BCRjKc-H.js.gz +0 -0
  142. package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css → useMediaQuery-Vxpamxqq.css} +1 -1
  143. package/payload/server/public/assets/useMediaQuery-Vxpamxqq.css.br +0 -0
  144. package/payload/server/public/assets/{useMediaQuery-CNxsjKZp.css.gz → useMediaQuery-Vxpamxqq.css.gz} +0 -0
  145. package/payload/server/public/assets/{useVoiceRecorder-BaDpMYxX.js → useVoiceRecorder-BaAtMu9T.js} +1 -1
  146. package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.br +0 -0
  147. package/payload/server/public/assets/useVoiceRecorder-BaAtMu9T.js.gz +0 -0
  148. package/payload/server/public/assets/{wrench-BO-l46rF.js → wrench-iI-vx-g2.js} +1 -1
  149. package/payload/server/public/assets/wrench-iI-vx-g2.js.br +0 -0
  150. package/payload/server/public/assets/wrench-iI-vx-g2.js.gz +0 -0
  151. package/payload/server/public/browser.html +4 -4
  152. package/payload/server/public/calendar.html +8 -8
  153. package/payload/server/public/chat.html +13 -13
  154. package/payload/server/public/data.html +11 -11
  155. package/payload/server/public/graph.html +9 -9
  156. package/payload/server/public/index.html +14 -14
  157. package/payload/server/public/operator.html +14 -14
  158. package/payload/server/public/public.html +13 -13
  159. package/payload/server/public/routines.html +6 -6
  160. package/payload/server/public/skills.html +5 -5
  161. package/payload/server/public/tasks.html +6 -6
  162. package/payload/server/server.js +36 -5
  163. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.br +0 -0
  164. package/payload/server/public/assets/AdminLoginScreens-Bjcs9ta9.js.gz +0 -0
  165. package/payload/server/public/assets/AdminShell-DVBAMUCy.js.br +0 -0
  166. package/payload/server/public/assets/AdminShell-DVBAMUCy.js.gz +0 -0
  167. package/payload/server/public/assets/activity-C8E8-EwQ.js.br +0 -0
  168. package/payload/server/public/assets/activity-C8E8-EwQ.js.gz +0 -0
  169. package/payload/server/public/assets/admin-CeWAlpRS.js.br +0 -0
  170. package/payload/server/public/assets/admin-CeWAlpRS.js.gz +0 -0
  171. package/payload/server/public/assets/agents-DuN92iFb.js.br +0 -0
  172. package/payload/server/public/assets/agents-DuN92iFb.js.gz +0 -0
  173. package/payload/server/public/assets/browser-BxebdKbh.js.br +0 -0
  174. package/payload/server/public/assets/browser-BxebdKbh.js.gz +0 -0
  175. package/payload/server/public/assets/calendar-BtFZQ5Np.js.br +0 -0
  176. package/payload/server/public/assets/calendar-BtFZQ5Np.js.gz +0 -0
  177. package/payload/server/public/assets/chat-CGIwynaH.js +0 -1
  178. package/payload/server/public/assets/chat-CGIwynaH.js.br +0 -3
  179. package/payload/server/public/assets/chat-CGIwynaH.js.gz +0 -0
  180. package/payload/server/public/assets/chevron-left-DaNP1zDb.js +0 -1
  181. package/payload/server/public/assets/chevron-left-DaNP1zDb.js.br +0 -0
  182. package/payload/server/public/assets/chevron-right-BbbuTUnt.js +0 -1
  183. package/payload/server/public/assets/chevron-right-BbbuTUnt.js.br +0 -0
  184. package/payload/server/public/assets/clock-CfDdatjp.js +0 -1
  185. package/payload/server/public/assets/clock-CfDdatjp.js.br +0 -0
  186. package/payload/server/public/assets/clock-CfDdatjp.js.gz +0 -0
  187. package/payload/server/public/assets/copy-DCDHXq3O.js.br +0 -0
  188. package/payload/server/public/assets/copy-DCDHXq3O.js.gz +0 -0
  189. package/payload/server/public/assets/data-BchSWOju.js +0 -1
  190. package/payload/server/public/assets/data-BchSWOju.js.br +0 -1
  191. package/payload/server/public/assets/data-BchSWOju.js.gz +0 -0
  192. package/payload/server/public/assets/file-text-zQgEQWCF.js.br +0 -0
  193. package/payload/server/public/assets/file-text-zQgEQWCF.js.gz +0 -0
  194. package/payload/server/public/assets/graph-CFCEh_YI.js.br +0 -0
  195. package/payload/server/public/assets/graph-CFCEh_YI.js.gz +0 -0
  196. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.br +0 -0
  197. package/payload/server/public/assets/graph-labels-CA1UcDuS.js.gz +0 -0
  198. package/payload/server/public/assets/operator-hFXPDc2X.js.br +0 -0
  199. package/payload/server/public/assets/operator-hFXPDc2X.js.gz +0 -0
  200. package/payload/server/public/assets/page-C8jyPH_3.js.br +0 -0
  201. package/payload/server/public/assets/page-C8jyPH_3.js.gz +0 -0
  202. package/payload/server/public/assets/page-ne7I_r9L.js.br +0 -0
  203. package/payload/server/public/assets/page-ne7I_r9L.js.gz +0 -0
  204. package/payload/server/public/assets/play-Ep0SZTbr.js +0 -1
  205. package/payload/server/public/assets/play-Ep0SZTbr.js.br +0 -0
  206. package/payload/server/public/assets/play-Ep0SZTbr.js.gz +0 -0
  207. package/payload/server/public/assets/public-BgnqjAal.js.br +0 -0
  208. package/payload/server/public/assets/public-BgnqjAal.js.gz +0 -0
  209. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.br +0 -0
  210. package/payload/server/public/assets/rotate-ccw-DfJWjXAg.js.gz +0 -0
  211. package/payload/server/public/assets/routines-OGFXwTFO.js +0 -2
  212. package/payload/server/public/assets/routines-OGFXwTFO.js.br +0 -0
  213. package/payload/server/public/assets/routines-OGFXwTFO.js.gz +0 -0
  214. package/payload/server/public/assets/skills-D-6EbgfP.js.br +0 -0
  215. package/payload/server/public/assets/skills-D-6EbgfP.js.gz +0 -0
  216. package/payload/server/public/assets/tasks-DnN5Fyds.js.br +0 -0
  217. package/payload/server/public/assets/tasks-DnN5Fyds.js.gz +0 -0
  218. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.br +0 -0
  219. package/payload/server/public/assets/triangle-alert-eh9UOKDT.js.gz +0 -0
  220. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.br +0 -0
  221. package/payload/server/public/assets/useCopyFeedback-Bz9OJHBb.js.gz +0 -0
  222. package/payload/server/public/assets/useMediaQuery-CNxsjKZp.css.br +0 -0
  223. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.br +0 -0
  224. package/payload/server/public/assets/useVoiceRecorder-BaDpMYxX.js.gz +0 -0
  225. package/payload/server/public/assets/wrench-BO-l46rF.js.br +0 -0
  226. package/payload/server/public/assets/wrench-BO-l46rF.js.gz +0 -0
  227. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js → useMediaQuery-Baf4Huvv.js} +0 -0
  228. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.br → useMediaQuery-Baf4Huvv.js.br} +0 -0
  229. /package/payload/server/public/assets/{useMediaQuery-_mMln3Fu.js.gz → useMediaQuery-Baf4Huvv.js.gz} +0 -0
@@ -0,0 +1,92 @@
1
+ // @vitest-environment node
2
+ // Task 2383 — how the fleet's recurring agent routines answered the gate
3
+ // question.
4
+ //
5
+ // The two Task 2378 checks watch a gate that is configured. This one watches
6
+ // whether one was configured at all, because the drift it measures is a
7
+ // population moving rather than an action failing: every waiver is individually
8
+ // reasonable and the fleet still ends up ungated.
9
+ //
10
+ // The zero case is asserted as hard as the alarm. A check that goes quiet when
11
+ // healthy cannot be distinguished from one that has stopped running.
12
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
13
+ import { auditGateClassification } from "../schedule-audit.js";
14
+ const ACCT = "20028fb5-0000-4000-8000-000000000000";
15
+ const OTHER = "9f3c1d2e-0000-4000-8000-000000000000";
16
+ /** A driver returning one fixed record set, or throwing on the read. */
17
+ function driverOf(rows, throws = false) {
18
+ return {
19
+ session: () => ({
20
+ run: async () => {
21
+ if (throws)
22
+ throw new Error("neo4j down");
23
+ return { records: rows.map((r) => ({ get: (k) => r[k] ?? null })) };
24
+ },
25
+ close: async () => { },
26
+ }),
27
+ };
28
+ }
29
+ let lines;
30
+ beforeEach(() => {
31
+ lines = [];
32
+ vi.spyOn(console, "error").mockImplementation((...args) => {
33
+ lines.push(args.map(String).join(" "));
34
+ });
35
+ });
36
+ afterEach(() => {
37
+ vi.restoreAllMocks();
38
+ });
39
+ function census(acct = ACCT) {
40
+ return lines.find((l) => l.includes(`op=gate-classification acct=${acct.slice(0, 8)}`));
41
+ }
42
+ describe("auditGateClassification", () => {
43
+ it("classifies each row exactly once", async () => {
44
+ await auditGateClassification(driverOf([
45
+ { accountId: ACCT, gatePlugin: "scheduling", gateWaived: null },
46
+ { accountId: ACCT, gatePlugin: null, gateWaived: "daily briefing" },
47
+ { accountId: ACCT, gatePlugin: null, gateWaived: null },
48
+ ]), [ACCT]);
49
+ expect(census()).toMatch(/agentRoutines=3 gated=1 waived=1 unclassified=1 ok=false/);
50
+ });
51
+ it("counts a row holding both a gate and a waiver as gated", async () => {
52
+ // The gate is what the dispatcher acts on, so it decides the bucket.
53
+ await auditGateClassification(driverOf([{ accountId: ACCT, gatePlugin: "scheduling", gateWaived: "belt and braces" }]), [ACCT]);
54
+ expect(census()).toMatch(/agentRoutines=1 gated=1 waived=0 unclassified=0 ok=true/);
55
+ });
56
+ it("treats a blank waiver as unclassified", async () => {
57
+ // Same rule as the write: blank is absent, so a row that slipped past with
58
+ // an empty string is not reported as a declared exception.
59
+ await auditGateClassification(driverOf([{ accountId: ACCT, gatePlugin: null, gateWaived: " " }]), [ACCT]);
60
+ expect(census()).toMatch(/waived=0 unclassified=1 ok=false/);
61
+ });
62
+ it("never fails on the waived count alone", async () => {
63
+ // Waived carries no threshold. The drift it measures is a judgement the
64
+ // operator makes across weeks, not a condition code can decide.
65
+ await auditGateClassification(driverOf([
66
+ { accountId: ACCT, gatePlugin: null, gateWaived: "weekly digest" },
67
+ { accountId: ACCT, gatePlugin: null, gateWaived: "daily briefing" },
68
+ { accountId: ACCT, gatePlugin: null, gateWaived: "monthly recap" },
69
+ ]), [ACCT]);
70
+ expect(census()).toMatch(/waived=3 unclassified=0 ok=true/);
71
+ });
72
+ it("emits a zero line for an account with no agent routines", async () => {
73
+ await auditGateClassification(driverOf([]), [ACCT]);
74
+ expect(census()).toMatch(/agentRoutines=0 gated=0 waived=0 unclassified=0 ok=true/);
75
+ });
76
+ it("emits one line per local account", async () => {
77
+ await auditGateClassification(driverOf([{ accountId: ACCT, gatePlugin: "scheduling", gateWaived: null }]), [ACCT, OTHER]);
78
+ expect(census(ACCT)).toMatch(/agentRoutines=1 gated=1/);
79
+ expect(census(OTHER)).toMatch(/agentRoutines=0 gated=0 waived=0 unclassified=0 ok=true/);
80
+ });
81
+ it("emits the unavailable line INSTEAD of a census when the read fails", async () => {
82
+ // An unreadable census must never be mistaken for a fully classified fleet.
83
+ await auditGateClassification(driverOf([], true), [ACCT]);
84
+ expect(census()).toBeUndefined();
85
+ expect(lines.some((l) => l.includes("op=gate-classification-unavailable reason=neo4j down"))).toBe(true);
86
+ });
87
+ it("does nothing with no local accounts", async () => {
88
+ await auditGateClassification(driverOf([]), []);
89
+ expect(lines).toHaveLength(0);
90
+ });
91
+ });
92
+ //# sourceMappingURL=gate-classification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-classification.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/gate-classification.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  // Task 2100. The audit exists because the failure it guards emitted nothing:
2
2
  // the write logged ok, the read logged ok, and the two disagreed about which
3
3
  // label the calendar lives on.
4
- import { describe, it, expect, vi } from "vitest";
5
- import { auditScheduleVisibility } from "../schedule-audit.js";
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
5
+ import { auditScheduleVisibility, auditFireRateCensus } from "../schedule-audit.js";
6
6
  /** Counts :Meeting and :Event for the account; the list function is injected. */
7
7
  function countingSession(meetings, events) {
8
8
  return {
@@ -177,4 +177,80 @@ describe("auditConnectorResolution", () => {
177
177
  expect(logs.some((l) => l.includes("op=connector-resolution-error"))).toBe(true);
178
178
  });
179
179
  });
180
+ function censusDriver(rows) {
181
+ return {
182
+ session: () => ({
183
+ run: vi.fn(async () => ({
184
+ records: rows.map((r) => ({
185
+ get: (k) => r[k] ?? null,
186
+ })),
187
+ })),
188
+ close: vi.fn(async () => { }),
189
+ }),
190
+ };
191
+ }
192
+ const censusRow = (over = {}) => ({
193
+ accountId: "acct-1111-2222",
194
+ eventId: "evt-3333-4444",
195
+ recurrence: "0 * * * *",
196
+ timezone: "Europe/London",
197
+ eventStatus: "scheduled",
198
+ ...over,
199
+ });
200
+ describe("auditFireRateCensus (Task 2380)", () => {
201
+ let censusLogs = [];
202
+ beforeEach(() => {
203
+ censusLogs = [];
204
+ // Only Date is faked: the per-day counts are real assertions, and on a live
205
+ // clock the two British clock-change days would produce different numbers.
206
+ vi.useFakeTimers({ toFake: ["Date"] });
207
+ vi.setSystemTime(new Date("2026-08-02T12:00:00Z"));
208
+ vi.spyOn(console, "error").mockImplementation((...args) => {
209
+ censusLogs.push(args.map(String).join(" "));
210
+ });
211
+ });
212
+ afterEach(() => {
213
+ vi.useRealTimers();
214
+ vi.restoreAllMocks();
215
+ });
216
+ const censusLine = () => censusLogs.find((l) => l.includes("op=fire-rate-census "));
217
+ it("totals the daily fires of every agent-bearing scheduled routine", async () => {
218
+ await auditFireRateCensus(censusDriver([censusRow(), censusRow({ recurrence: "*/15 * * * *" })]), ["acct-1111-2222"]);
219
+ expect(censusLine()).toContain("agentRoutines=2");
220
+ expect(censusLine()).toContain("agentFiresPerDay=120");
221
+ expect(censusLine()).toContain("ok=true");
222
+ });
223
+ it("counts a suspended routine in neither figure, because its rate is zero", async () => {
224
+ await auditFireRateCensus(censusDriver([censusRow(), censusRow({ eventStatus: "suspended", recurrence: "*/15 * * * *" })]), ["acct-1111-2222"]);
225
+ expect(censusLine()).toContain("agentRoutines=1");
226
+ expect(censusLine()).toContain("agentFiresPerDay=24");
227
+ });
228
+ it("emits a line for an account with no rows at all", async () => {
229
+ // A check that goes quiet when healthy cannot be told apart from one that
230
+ // stopped running.
231
+ await auditFireRateCensus(censusDriver([]), ["acct-1111-2222"]);
232
+ expect(censusLine()).toContain("agentRoutines=0");
233
+ expect(censusLine()).toContain("agentFiresPerDay=0");
234
+ expect(censusLine()).toContain("ok=true");
235
+ });
236
+ it("fails the vacuity guard when agent rows exist but none is counted", async () => {
237
+ // Task 2231's convention: a zero meaning "the enumeration found nothing"
238
+ // must not read the same as a zero meaning "there is nothing".
239
+ await auditFireRateCensus(censusDriver([censusRow({ eventStatus: "suspended" })]), [
240
+ "acct-1111-2222",
241
+ ]);
242
+ expect(censusLine()).toContain("agentRoutines=0");
243
+ expect(censusLine()).toContain("ok=false");
244
+ });
245
+ it("names an unparsable row and keeps the rest of the total", async () => {
246
+ await auditFireRateCensus(censusDriver([censusRow(), censusRow({ eventId: "evt-bad", recurrence: "not a cron" })]), ["acct-1111-2222"]);
247
+ expect(censusLogs.find((l) => l.includes("op=fire-rate-census-unparsable"))).toContain("eventId=evt-bad");
248
+ expect(censusLine()).toContain("agentRoutines=1");
249
+ expect(censusLine()).toContain("agentFiresPerDay=24");
250
+ });
251
+ it("emits nothing when there are no local accounts", async () => {
252
+ await auditFireRateCensus(censusDriver([censusRow()]), []);
253
+ expect(censusLine()).toBeUndefined();
254
+ });
255
+ });
180
256
  //# sourceMappingURL=schedule-audit.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schedule-audit.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schedule-audit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schedule-audit.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/schedule-audit.test.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,9 @@ describe("writtenFields", () => {
7
7
  expect(writtenFields(["e.updatedAt = $now", "e.description = $description"]))
8
8
  .toEqual(["description"]);
9
9
  });
10
- it("drops all four bookkeeping properties", () => {
10
+ // Task 2380 took the set from four to six; the two it added are asserted
11
+ // separately below, so this name says which four it means.
12
+ it("drops the four bookkeeping properties a call writes for itself", () => {
11
13
  const clauses = [
12
14
  "e.updatedAt = $now",
13
15
  "e.operatorEdited = $now",
@@ -24,6 +26,21 @@ describe("writtenFields", () => {
24
26
  it("returns an empty list when only bookkeeping was written", () => {
25
27
  expect(writtenFields(["e.updatedAt = $now"])).toEqual([]);
26
28
  });
29
+ it("drops Task 2380's audit stamps, which no caller asked for", () => {
30
+ // `recurrencePrevious` and `recurrenceChangedAt` are written as a
31
+ // consequence of changing the cron, the same way `operatorEdited` is written
32
+ // as a consequence of setting a prompt. Naming them in the confirmation
33
+ // tells the agent it wrote properties it never mentioned, which is the
34
+ // confusion Task 2362 exists to remove.
35
+ const clauses = [
36
+ "e.updatedAt = $now",
37
+ "e.recurrence = $recurrence",
38
+ "e.nextRun = $newNextRun",
39
+ "e.recurrencePrevious = $recurrencePrevious",
40
+ "e.recurrenceChangedAt = $now",
41
+ ];
42
+ expect(writtenFields(clauses)).toEqual(["recurrence", "nextRun"]);
43
+ });
27
44
  });
28
45
  describe("describeUpdate", () => {
29
46
  it("names the fields and says the instruction did not change", () => {
@@ -1 +1 @@
1
- {"version":3,"file":"update-summary.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/update-summary.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-summary.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/update-summary.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function firesPerDay(recurrence: string, timezone: string | null, reference: Date): number;
2
+ //# sourceMappingURL=fires-per-day.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fires-per-day.d.ts","sourceRoot":"","sources":["../../src/lib/fires-per-day.ts"],"names":[],"mappings":"AAyBA,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,MAAM,CAwBhG"}
@@ -0,0 +1,47 @@
1
+ import cronParser from "cron-parser";
2
+ const { parseExpression } = cronParser;
3
+ /**
4
+ * Task 2380 — how many times a cron fires on one calendar day, in the event's
5
+ * own timezone.
6
+ *
7
+ * The zone is not a detail. A rolling 24-hour window reports 24 for an hourly
8
+ * routine on every day of the year, including the two on which a British day is
9
+ * 23 or 25 hours long, so a cost figure built on it drifts twice a year and
10
+ * nothing says so. Here both day boundaries are themselves cron occurrences —
11
+ * `0 0 * * *` resolved in the same zone — so the window is the local day by
12
+ * construction and `cron-parser` does the clock-change arithmetic.
13
+ *
14
+ * `.prev()` is taken from one millisecond AFTER the reference so that a
15
+ * reference sitting exactly on local midnight yields that midnight rather than
16
+ * the previous day's.
17
+ *
18
+ * Throws when `recurrence` does not parse. Both callers catch: the tool reports
19
+ * `-` for the count, and the census names the row and drops it from the total.
20
+ */
21
+ /** Runaway guard. A five-field cron tops out at 1,440 fires in a day. */
22
+ const MAX_OCCURRENCES = 100_000;
23
+ export function firesPerDay(recurrence, timezone, reference) {
24
+ const tz = timezone ?? undefined;
25
+ const start = parseExpression("0 0 * * *", {
26
+ currentDate: new Date(reference.getTime() + 1),
27
+ tz,
28
+ })
29
+ .prev()
30
+ .toDate();
31
+ const end = parseExpression("0 0 * * *", { currentDate: reference, tz }).next().toDate();
32
+ // One millisecond before the boundary, because `.next()` returns the first
33
+ // occurrence STRICTLY after `currentDate` and a routine firing at local
34
+ // midnight belongs to the day it opens.
35
+ const occurrences = parseExpression(recurrence, {
36
+ currentDate: new Date(start.getTime() - 1),
37
+ tz,
38
+ });
39
+ let count = 0;
40
+ for (let i = 0; i < MAX_OCCURRENCES; i++) {
41
+ if (occurrences.next().toDate() >= end)
42
+ break;
43
+ count++;
44
+ }
45
+ return count;
46
+ }
47
+ //# sourceMappingURL=fires-per-day.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fires-per-day.js","sourceRoot":"","sources":["../../src/lib/fires-per-day.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,MAAM,EAAE,eAAe,EAAE,GAAG,UAAU,CAAC;AAEvC;;;;;;;;;;;;;;;;;GAiBG;AAEH,yEAAyE;AACzE,MAAM,eAAe,GAAG,OAAO,CAAC;AAEhC,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,QAAuB,EAAE,SAAe;IACtF,MAAM,EAAE,GAAG,QAAQ,IAAI,SAAS,CAAC;IACjC,MAAM,KAAK,GAAG,eAAe,CAAC,WAAW,EAAE;QACzC,WAAW,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC9C,EAAE;KACH,CAAC;SACC,IAAI,EAAE;SACN,MAAM,EAAE,CAAC;IACZ,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAEzF,2EAA2E;IAC3E,wEAAwE;IACxE,wCAAwC;IACxC,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,EAAE;QAC9C,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,EAAE;KACH,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,GAAG;YAAE,MAAM;QAC9C,KAAK,EAAE,CAAC;IACV,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -114,4 +114,62 @@ export declare function noneForHours(entry: ConnectorStateEntry, nowMs: number):
114
114
  * running. Never throws (honours the sweep's contract).
115
115
  */
116
116
  export declare function auditConnectorResolution(driver: Driver, localAccountIds: string[], accountsDir: string, statePath: string, nowMs: number): Promise<void>;
117
+ /**
118
+ * Task 2380 — the install's agent-bearing fire rate, counted from the rows.
119
+ *
120
+ * `recurrencePrevious` records a change made through `schedule-update` and
121
+ * nothing else. A direct Cypher write, a restore, or a future editor changes the
122
+ * row and emits nothing, and the writer that skipped the log skipped the stamp
123
+ * too — so no property on the row can detect it. This totals the rate from the
124
+ * rows themselves, which means a change by ANY writer moves the number on the
125
+ * next tick. It is a census, not an alarm: its value is that the total is
126
+ * greppable across days.
127
+ *
128
+ * Only `scheduled` rows are counted, because the sweep selects that literal by
129
+ * equality (check-due-events.ts:502, :567, :704, :768) and a suspended routine's
130
+ * fire rate is zero, not unknown. Each row is counted in its own timezone.
131
+ *
132
+ * `ok=false` in exactly one case: nothing counted while agent-bearing rows exist
133
+ * at any status. That is the Task 2231 vacuity guard — a zero that means "the
134
+ * enumeration found nothing" must not read the same as a zero that means "there
135
+ * is nothing". An install whose agent routines are all suspended reports
136
+ * `ok=false`, and it clears the moment one is resumed.
137
+ *
138
+ * A gate (Task 2378) does not reduce the count. The gate skips the INJECT; the
139
+ * fire still happens and still costs a headless tool call, so the rate this
140
+ * reports is the rate of fires, which is what it claims to be.
141
+ *
142
+ * Never throws; the sweep's contract.
143
+ */
144
+ export declare function auditFireRateCensus(driver: Driver, localAccountIds: string[]): Promise<void>;
145
+ /**
146
+ * Task 2383 — how the fleet's recurring agent routines answered the gate
147
+ * question.
148
+ *
149
+ * The Task 2378 checks watch a gate that is configured. This one watches whether
150
+ * one was configured at all, and the blind spot it exists for is `gateWaived`
151
+ * becoming the path of least resistance: every waiver is individually logged and
152
+ * individually reasonable, and the fleet drifts back to ungated one justified
153
+ * exception at a time. No single event marks that and it does not reproduce. It
154
+ * is a population moving, not an action failing.
155
+ *
156
+ * So `waived` carries no threshold and never fails the check. It is a number to
157
+ * read across weeks, and the drift it measures is a judgement the operator makes,
158
+ * not a condition code can decide. Only `unclassified` fails: a recurring agent
159
+ * routine that answered neither question, which after this task means a row
160
+ * written before it, or by a path that bypassed `schedule-event`.
161
+ *
162
+ * The population is the one the write-time refusal covers — scheduled, recurring,
163
+ * complete agent dispatch — so the control and the census cannot disagree about
164
+ * what they are counting. A row holding both a gate and a waiver counts as gated,
165
+ * because the gate is what the dispatcher acts on. A blank waiver counts as
166
+ * unclassified, the same rule the write applies.
167
+ *
168
+ * Emitted every tick including zero: a check that goes quiet when healthy cannot
169
+ * be distinguished from one that has stopped running. Never throws. An unreadable
170
+ * census emits `op=gate-classification-unavailable` INSTEAD of the count line and
171
+ * never alongside it, so a database that is down is never read as a fleet that is
172
+ * fully classified.
173
+ */
174
+ export declare function auditGateClassification(driver: Driver, localAccountIds: string[]): Promise<void>;
117
175
  //# sourceMappingURL=schedule-audit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schedule-audit.d.ts","sourceRoot":"","sources":["../../src/lib/schedule-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEjF;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,OAAO,YAA2B,GACvC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBpE;AAWD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CA4Df;AAMD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,eAAe,CAAC;IAC3B;oBACgB;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAEjE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,mBAAmB,GAAG,SAAS,EACrC,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,MAAM,GACZ,mBAAmB,CAGrB;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9E;AAwCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAwDf"}
1
+ {"version":3,"file":"schedule-audit.d.ts","sourceRoot":"","sources":["../../src/lib/schedule-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGjF;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,OAAO,YAA2B,GACvC,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBpE;AAWD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,YAAY,EAAE,MAAM,EACpB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,CA4Df;AAMD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,eAAe,CAAC;IAC3B;oBACgB;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAEjE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,mBAAmB,GAAG,SAAS,EACrC,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE,MAAM,GACZ,mBAAmB,CAGrB;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAG9E;AAwCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,EACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAwDf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyElG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -3,6 +3,7 @@ import { join } from "node:path";
3
3
  import { scheduleList } from "../tools/schedule-list.js";
4
4
  import { readWatermarks } from "../tools/scheduling-gate.js";
5
5
  import { resolveConnector } from "./connector-freebusy.js";
6
+ import { firesPerDay } from "./fires-per-day.js";
6
7
  /**
7
8
  * Task 2100 — the standing check for meeting visibility.
8
9
  *
@@ -329,4 +330,176 @@ export async function auditConnectorResolution(driver, localAccountIds, accounts
329
330
  }
330
331
  writeConnectorState(statePath, state);
331
332
  }
333
+ /**
334
+ * Task 2380 — the install's agent-bearing fire rate, counted from the rows.
335
+ *
336
+ * `recurrencePrevious` records a change made through `schedule-update` and
337
+ * nothing else. A direct Cypher write, a restore, or a future editor changes the
338
+ * row and emits nothing, and the writer that skipped the log skipped the stamp
339
+ * too — so no property on the row can detect it. This totals the rate from the
340
+ * rows themselves, which means a change by ANY writer moves the number on the
341
+ * next tick. It is a census, not an alarm: its value is that the total is
342
+ * greppable across days.
343
+ *
344
+ * Only `scheduled` rows are counted, because the sweep selects that literal by
345
+ * equality (check-due-events.ts:502, :567, :704, :768) and a suspended routine's
346
+ * fire rate is zero, not unknown. Each row is counted in its own timezone.
347
+ *
348
+ * `ok=false` in exactly one case: nothing counted while agent-bearing rows exist
349
+ * at any status. That is the Task 2231 vacuity guard — a zero that means "the
350
+ * enumeration found nothing" must not read the same as a zero that means "there
351
+ * is nothing". An install whose agent routines are all suspended reports
352
+ * `ok=false`, and it clears the moment one is resumed.
353
+ *
354
+ * A gate (Task 2378) does not reduce the count. The gate skips the INJECT; the
355
+ * fire still happens and still costs a headless tool call, so the rate this
356
+ * reports is the rate of fires, which is what it claims to be.
357
+ *
358
+ * Never throws; the sweep's contract.
359
+ */
360
+ export async function auditFireRateCensus(driver, localAccountIds) {
361
+ if (localAccountIds.length === 0)
362
+ return;
363
+ const session = driver.session();
364
+ try {
365
+ // Every agent-bearing row on the account regardless of status or
366
+ // recurrence: the wider set is what makes the vacuity guard meaningful, and
367
+ // splitting it into a second query would let the two disagree.
368
+ const res = await session.run(`MATCH (e:Event)
369
+ WHERE e.accountId IN $localAccountIds
370
+ AND e.agentChannel IS NOT NULL
371
+ AND e.agentDestination IS NOT NULL
372
+ AND e.agentPrompt IS NOT NULL
373
+ RETURN e.accountId AS accountId, e.eventId AS eventId,
374
+ e.recurrence AS recurrence, e.timezone AS timezone,
375
+ e.eventStatus AS eventStatus`, { localAccountIds });
376
+ const countedAt = new Date();
377
+ const tally = new Map();
378
+ for (const accountId of localAccountIds) {
379
+ tally.set(accountId, { bearing: 0, routines: 0, fires: 0 });
380
+ }
381
+ for (const rec of res.records) {
382
+ const accountId = rec.get("accountId");
383
+ const acc = tally.get(accountId);
384
+ // The predicate cannot return an account this host does not serve, but
385
+ // counting one would silently inflate somebody else's total.
386
+ if (!acc)
387
+ continue;
388
+ acc.bearing++;
389
+ const recurrence = (rec.get("recurrence") ?? null);
390
+ const eventStatus = (rec.get("eventStatus") ?? null);
391
+ if (recurrence === null || eventStatus !== "scheduled")
392
+ continue;
393
+ try {
394
+ acc.fires += firesPerDay(recurrence, (rec.get("timezone") ?? null), countedAt);
395
+ acc.routines++;
396
+ }
397
+ catch {
398
+ // Named rather than swallowed, and dropped from both figures: one row
399
+ // written by hand must not cost the account its total.
400
+ const eventId = String(rec.get("eventId") ?? "-").slice(0, 8);
401
+ console.error(`[schedule-audit] op=fire-rate-census-unparsable acct=${accountId.slice(0, 8)} ` +
402
+ `eventId=${eventId} recurrence=${recurrence}`);
403
+ }
404
+ }
405
+ // Driven by localAccountIds, not by the result rows: an account with no
406
+ // agent routines returns none, and skipping it would make "healthy" and
407
+ // "not looked at" the same silence.
408
+ for (const accountId of localAccountIds) {
409
+ const c = tally.get(accountId);
410
+ const ok = !(c.routines === 0 && c.bearing > 0);
411
+ console.error(`[schedule-audit] op=fire-rate-census acct=${accountId.slice(0, 8)} ` +
412
+ `agentRoutines=${c.routines} agentFiresPerDay=${c.fires} ok=${ok}`);
413
+ }
414
+ }
415
+ catch (err) {
416
+ console.error(`[schedule-audit] op=fire-rate-census-error detail=${err instanceof Error ? err.message : String(err)}`);
417
+ }
418
+ finally {
419
+ try {
420
+ await session.close();
421
+ }
422
+ catch {
423
+ // ignore
424
+ }
425
+ }
426
+ }
427
+ /**
428
+ * Task 2383 — how the fleet's recurring agent routines answered the gate
429
+ * question.
430
+ *
431
+ * The Task 2378 checks watch a gate that is configured. This one watches whether
432
+ * one was configured at all, and the blind spot it exists for is `gateWaived`
433
+ * becoming the path of least resistance: every waiver is individually logged and
434
+ * individually reasonable, and the fleet drifts back to ungated one justified
435
+ * exception at a time. No single event marks that and it does not reproduce. It
436
+ * is a population moving, not an action failing.
437
+ *
438
+ * So `waived` carries no threshold and never fails the check. It is a number to
439
+ * read across weeks, and the drift it measures is a judgement the operator makes,
440
+ * not a condition code can decide. Only `unclassified` fails: a recurring agent
441
+ * routine that answered neither question, which after this task means a row
442
+ * written before it, or by a path that bypassed `schedule-event`.
443
+ *
444
+ * The population is the one the write-time refusal covers — scheduled, recurring,
445
+ * complete agent dispatch — so the control and the census cannot disagree about
446
+ * what they are counting. A row holding both a gate and a waiver counts as gated,
447
+ * because the gate is what the dispatcher acts on. A blank waiver counts as
448
+ * unclassified, the same rule the write applies.
449
+ *
450
+ * Emitted every tick including zero: a check that goes quiet when healthy cannot
451
+ * be distinguished from one that has stopped running. Never throws. An unreadable
452
+ * census emits `op=gate-classification-unavailable` INSTEAD of the count line and
453
+ * never alongside it, so a database that is down is never read as a fleet that is
454
+ * fully classified.
455
+ */
456
+ export async function auditGateClassification(driver, localAccountIds) {
457
+ if (localAccountIds.length === 0)
458
+ return;
459
+ const session = driver.session();
460
+ try {
461
+ const res = await session.run(`MATCH (e:Event)
462
+ WHERE e.accountId IN $localAccountIds
463
+ AND e.eventStatus = 'scheduled'
464
+ AND e.recurrence IS NOT NULL
465
+ AND e.agentChannel IS NOT NULL
466
+ AND e.agentDestination IS NOT NULL
467
+ AND e.agentPrompt IS NOT NULL
468
+ RETURN e.accountId AS accountId, e.gatePlugin AS gatePlugin, e.gateWaived AS gateWaived`, { localAccountIds });
469
+ const newTally = () => ({ total: 0, gated: 0, waived: 0, unclassified: 0 });
470
+ const byAccount = new Map(localAccountIds.map((id) => [id, newTally()]));
471
+ for (const rec of res.records) {
472
+ const accountId = rec.get("accountId");
473
+ let tally = byAccount.get(accountId);
474
+ if (!tally) {
475
+ tally = newTally();
476
+ byAccount.set(accountId, tally);
477
+ }
478
+ tally.total++;
479
+ const waived = rec.get("gateWaived");
480
+ if (rec.get("gatePlugin"))
481
+ tally.gated++;
482
+ else if (typeof waived === "string" && waived.trim())
483
+ tally.waived++;
484
+ else
485
+ tally.unclassified++;
486
+ }
487
+ for (const [accountId, t] of byAccount) {
488
+ console.error(`[schedule-audit] op=gate-classification acct=${accountId.slice(0, 8)} ` +
489
+ `agentRoutines=${t.total} gated=${t.gated} waived=${t.waived} ` +
490
+ `unclassified=${t.unclassified} ok=${t.unclassified === 0}`);
491
+ }
492
+ }
493
+ catch (err) {
494
+ console.error(`[schedule-audit] op=gate-classification-unavailable reason=${err instanceof Error ? err.message : String(err)}`);
495
+ }
496
+ finally {
497
+ try {
498
+ await session.close();
499
+ }
500
+ catch {
501
+ // ignore
502
+ }
503
+ }
504
+ }
332
505
  //# sourceMappingURL=schedule-audit.js.map