@reddoorla/maintenance 0.88.2 → 0.89.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 (116) hide show
  1. package/dist/{announce-GKD5YJNB.js → announce-OJFAS5JT.js} +6 -6
  2. package/dist/{blux-DN4MI532.js → blux-EATHOHKK.js} +5 -5
  3. package/dist/{chunk-7UAYMAKR.js → chunk-3VQWSE3F.js} +4 -4
  4. package/dist/{chunk-A2UNJIKH.js → chunk-5PWB3JHJ.js} +6 -4
  5. package/dist/chunk-5PWB3JHJ.js.map +1 -0
  6. package/dist/{chunk-K6SLF6GI.js → chunk-62NYED6E.js} +6 -6
  7. package/dist/{chunk-B23FFWU4.js → chunk-AEXJDCJN.js} +96 -19
  8. package/dist/{chunk-B23FFWU4.js.map → chunk-AEXJDCJN.js.map} +1 -1
  9. package/dist/{chunk-7FFUBF4I.js → chunk-AX22DH6S.js} +2 -2
  10. package/dist/{chunk-7TMWBXX7.js → chunk-DXKF552B.js} +269 -7
  11. package/dist/chunk-DXKF552B.js.map +1 -0
  12. package/dist/{chunk-6I6L3CMX.js → chunk-KGUKL3CV.js} +2 -2
  13. package/dist/{chunk-ULHPALI5.js → chunk-NDCOOI3V.js} +2 -2
  14. package/dist/{chunk-GQDDWYU2.js → chunk-QBAAZY7W.js} +1 -1
  15. package/dist/{chunk-GQDDWYU2.js.map → chunk-QBAAZY7W.js.map} +1 -1
  16. package/dist/{chunk-KMCZA7CH.js → chunk-QLIUDTY6.js} +2 -2
  17. package/dist/{chunk-XP5WM2LV.js → chunk-SKI23ZZH.js} +4 -4
  18. package/dist/chunk-SVAAONYB.js +21 -0
  19. package/dist/chunk-SVAAONYB.js.map +1 -0
  20. package/dist/{chunk-DGZWFI2G.js → chunk-VBEKL445.js} +17 -8
  21. package/dist/chunk-VBEKL445.js.map +1 -0
  22. package/dist/{chunk-ANJNTAMM.js → chunk-ZOCJBJQV.js} +4 -2
  23. package/dist/{chunk-J3WEZGIN.js → chunk-ZRI5VRPG.js} +4 -4
  24. package/dist/cli/bin.js +27 -18
  25. package/dist/cli/bin.js.map +1 -1
  26. package/dist/cli/commands/audit.js +5 -5
  27. package/dist/{db-V6UIS433.js → db-DAJX7NNW.js} +51 -10
  28. package/dist/db-DAJX7NNW.js.map +1 -0
  29. package/dist/{digest-2JEAEJK6.js → digest-T6TAZNLF.js} +73 -16
  30. package/dist/digest-T6TAZNLF.js.map +1 -0
  31. package/dist/digest-collectors-NI2M3UTC.js +50 -0
  32. package/dist/digest-state-3KHZF7GD.js +50 -0
  33. package/dist/digest-state-3KHZF7GD.js.map +1 -0
  34. package/dist/{dump-EPL7AZFR.js → dump-QK7LNOGC.js} +14 -1
  35. package/dist/{dump-EPL7AZFR.js.map → dump-QK7LNOGC.js.map} +1 -1
  36. package/dist/{email-SL7464YI.js → email-LJQT5J7F.js} +6 -7
  37. package/dist/{email-SL7464YI.js.map → email-LJQT5J7F.js.map} +1 -1
  38. package/dist/{ensure-site-FU6527OU.js → ensure-site-NSNY2QHN.js} +2 -2
  39. package/dist/{fleet-state-R5LU7IC3.js → fleet-state-3LQUQHYD.js} +2 -2
  40. package/dist/{forms-notify-target-SGDGXXK5.js → forms-notify-target-LYSKME5L.js} +2 -2
  41. package/dist/freeze-A6MUCZU4.js +9 -0
  42. package/dist/{github-signals-GWGCKEE2.js → github-signals-4YML6NY5.js} +4 -4
  43. package/dist/{health-mirror-GCDN7BJL.js → health-mirror-7LKC7Q5Z.js} +5 -5
  44. package/dist/index.d.ts +19 -4
  45. package/dist/index.js +29 -28
  46. package/dist/index.js.map +1 -1
  47. package/dist/{init-FGTYNGUI.js → init-NHKADHB6.js} +7 -7
  48. package/dist/{launch-5H7LPEGP.js → launch-VQJ4Z35C.js} +6 -6
  49. package/dist/{orchestrate-JNKCWU5K.js → orchestrate-6HROYTM6.js} +4 -4
  50. package/dist/{parity-NBYZUBFU.js → parity-623WNFZG.js} +3 -3
  51. package/dist/{pipeline-WYTXSLHX.js → pipeline-MQJD4CKN.js} +6 -2
  52. package/dist/{preflight-IMTYDDD4.js → preflight-LIN5NCYU.js} +5 -5
  53. package/dist/{prismic-ci-MY2U6NN7.js → prismic-ci-PZ5LCPWT.js} +4 -4
  54. package/dist/{prismic-models-NJN5JORF.js → prismic-models-6OYYZUR5.js} +3 -3
  55. package/dist/prospect/types.d.ts +27 -0
  56. package/dist/{prospect-audit-JMBRVXSG.js → prospect-audit-DBBXL7EG.js} +8 -6
  57. package/dist/prospect-audit-DBBXL7EG.js.map +1 -0
  58. package/dist/recipes/sync-configs.js +2 -2
  59. package/dist/{render-VX72AESY.js → render-P3SBUFVB.js} +3 -3
  60. package/dist/{render-from-row-DOYJDO2L.js → render-from-row-P5CWM3MQ.js} +3 -3
  61. package/dist/render-from-row-P5CWM3MQ.js.map +1 -0
  62. package/dist/{report-TALY5P3L.js → report-2N4PXO3L.js} +33 -17
  63. package/dist/report-2N4PXO3L.js.map +1 -0
  64. package/dist/{report-mirror-AAK3MXHY.js → report-mirror-3ENU6OOK.js} +5 -5
  65. package/dist/{selftest-NZTR4SM2.js → selftest-CUX2FIQD.js} +7 -7
  66. package/dist/{site-mirror-Q763PLGG.js → site-mirror-RQTEAID5.js} +5 -5
  67. package/dist/{sync-GBFV45WX.js → sync-ESP5ZQUU.js} +3 -3
  68. package/dist/{sync-configs-34JIA6KZ.js → sync-configs-LVBITPLU.js} +3 -3
  69. package/dist/usage-UHKU76VK.js +147 -0
  70. package/dist/usage-UHKU76VK.js.map +1 -0
  71. package/dist/{write-audits-to-airtable-OBHGR7DQ.js → write-audits-to-airtable-K352LZQY.js} +3 -3
  72. package/dist/write-audits-to-airtable-K352LZQY.js.map +1 -0
  73. package/package.json +1 -1
  74. package/dist/chunk-7TMWBXX7.js.map +0 -1
  75. package/dist/chunk-A2UNJIKH.js.map +0 -1
  76. package/dist/chunk-DGZWFI2G.js.map +0 -1
  77. package/dist/chunk-RUPPWAD6.js +0 -7
  78. package/dist/chunk-RUPPWAD6.js.map +0 -1
  79. package/dist/db-V6UIS433.js.map +0 -1
  80. package/dist/digest-2JEAEJK6.js.map +0 -1
  81. package/dist/digest-state-CRZRNGDI.js +0 -25
  82. package/dist/digest-state-CRZRNGDI.js.map +0 -1
  83. package/dist/prospect-audit-JMBRVXSG.js.map +0 -1
  84. package/dist/report-TALY5P3L.js.map +0 -1
  85. /package/dist/{announce-GKD5YJNB.js.map → announce-OJFAS5JT.js.map} +0 -0
  86. /package/dist/{blux-DN4MI532.js.map → blux-EATHOHKK.js.map} +0 -0
  87. /package/dist/{chunk-7UAYMAKR.js.map → chunk-3VQWSE3F.js.map} +0 -0
  88. /package/dist/{chunk-K6SLF6GI.js.map → chunk-62NYED6E.js.map} +0 -0
  89. /package/dist/{chunk-7FFUBF4I.js.map → chunk-AX22DH6S.js.map} +0 -0
  90. /package/dist/{chunk-6I6L3CMX.js.map → chunk-KGUKL3CV.js.map} +0 -0
  91. /package/dist/{chunk-ULHPALI5.js.map → chunk-NDCOOI3V.js.map} +0 -0
  92. /package/dist/{chunk-KMCZA7CH.js.map → chunk-QLIUDTY6.js.map} +0 -0
  93. /package/dist/{chunk-XP5WM2LV.js.map → chunk-SKI23ZZH.js.map} +0 -0
  94. /package/dist/{chunk-ANJNTAMM.js.map → chunk-ZOCJBJQV.js.map} +0 -0
  95. /package/dist/{chunk-J3WEZGIN.js.map → chunk-ZRI5VRPG.js.map} +0 -0
  96. /package/dist/{fleet-state-R5LU7IC3.js.map → digest-collectors-NI2M3UTC.js.map} +0 -0
  97. /package/dist/{ensure-site-FU6527OU.js.map → ensure-site-NSNY2QHN.js.map} +0 -0
  98. /package/dist/{orchestrate-JNKCWU5K.js.map → fleet-state-3LQUQHYD.js.map} +0 -0
  99. /package/dist/{forms-notify-target-SGDGXXK5.js.map → forms-notify-target-LYSKME5L.js.map} +0 -0
  100. /package/dist/{parity-NBYZUBFU.js.map → freeze-A6MUCZU4.js.map} +0 -0
  101. /package/dist/{github-signals-GWGCKEE2.js.map → github-signals-4YML6NY5.js.map} +0 -0
  102. /package/dist/{health-mirror-GCDN7BJL.js.map → health-mirror-7LKC7Q5Z.js.map} +0 -0
  103. /package/dist/{init-FGTYNGUI.js.map → init-NHKADHB6.js.map} +0 -0
  104. /package/dist/{launch-5H7LPEGP.js.map → launch-VQJ4Z35C.js.map} +0 -0
  105. /package/dist/{pipeline-WYTXSLHX.js.map → orchestrate-6HROYTM6.js.map} +0 -0
  106. /package/dist/{render-VX72AESY.js.map → parity-623WNFZG.js.map} +0 -0
  107. /package/dist/{render-from-row-DOYJDO2L.js.map → pipeline-MQJD4CKN.js.map} +0 -0
  108. /package/dist/{preflight-IMTYDDD4.js.map → preflight-LIN5NCYU.js.map} +0 -0
  109. /package/dist/{prismic-ci-MY2U6NN7.js.map → prismic-ci-PZ5LCPWT.js.map} +0 -0
  110. /package/dist/{prismic-models-NJN5JORF.js.map → prismic-models-6OYYZUR5.js.map} +0 -0
  111. /package/dist/{write-audits-to-airtable-OBHGR7DQ.js.map → render-P3SBUFVB.js.map} +0 -0
  112. /package/dist/{report-mirror-AAK3MXHY.js.map → report-mirror-3ENU6OOK.js.map} +0 -0
  113. /package/dist/{selftest-NZTR4SM2.js.map → selftest-CUX2FIQD.js.map} +0 -0
  114. /package/dist/{site-mirror-Q763PLGG.js.map → site-mirror-RQTEAID5.js.map} +0 -0
  115. /package/dist/{sync-GBFV45WX.js.map → sync-ESP5ZQUU.js.map} +0 -0
  116. /package/dist/{sync-configs-34JIA6KZ.js.map → sync-configs-LVBITPLU.js.map} +0 -0
@@ -15,7 +15,7 @@ import {
15
15
  mirrorSiteFields,
16
16
  mirrorSiteInsert,
17
17
  storeRenderedHtml
18
- } from "./chunk-GQDDWYU2.js";
18
+ } from "./chunk-QBAAZY7W.js";
19
19
  import "./chunk-P6AORG32.js";
20
20
  import "./chunk-F3JWOPTG.js";
21
21
  import "./chunk-VAD43MOR.js";
@@ -38,4 +38,4 @@ export {
38
38
  mirrorSiteInsert,
39
39
  storeRenderedHtml
40
40
  };
41
- //# sourceMappingURL=fleet-state-R5LU7IC3.js.map
41
+ //# sourceMappingURL=fleet-state-3LQUQHYD.js.map
@@ -143,7 +143,7 @@ async function runFormsNotifyTargetCommand(site, opts) {
143
143
  return { output: `--set must be 'on' or 'off' (got '${opts.set}')`, code: 2 };
144
144
  }
145
145
  try {
146
- const { makeSiteMirror } = await import("./site-mirror-Q763PLGG.js");
146
+ const { makeSiteMirror } = await import("./site-mirror-RQTEAID5.js");
147
147
  const result = await formsNotifyTarget({
148
148
  siteMirror: await makeSiteMirror(),
149
149
  site: site.trim(),
@@ -163,4 +163,4 @@ export {
163
163
  formatNotifyTarget,
164
164
  runFormsNotifyTargetCommand
165
165
  };
166
- //# sourceMappingURL=forms-notify-target-SGDGXXK5.js.map
166
+ //# sourceMappingURL=forms-notify-target-LYSKME5L.js.map
@@ -0,0 +1,9 @@
1
+ import {
2
+ TURSO_IS_AUTHORITATIVE,
3
+ mirrorWrite
4
+ } from "./chunk-SVAAONYB.js";
5
+ export {
6
+ TURSO_IS_AUTHORITATIVE,
7
+ mirrorWrite
8
+ };
9
+ //# sourceMappingURL=freeze-A6MUCZU4.js.map
@@ -3,9 +3,9 @@ import {
3
3
  } from "./chunk-PZQ3WED2.js";
4
4
  import {
5
5
  formatFleetWriteSummary
6
- } from "./chunk-KMCZA7CH.js";
6
+ } from "./chunk-QLIUDTY6.js";
7
7
  import "./chunk-7BZUOZPU.js";
8
- import "./chunk-RUPPWAD6.js";
8
+ import "./chunk-SVAAONYB.js";
9
9
  import {
10
10
  detectSignalEvents,
11
11
  fleetSweptEvent
@@ -91,7 +91,7 @@ async function runGitHubSignalsCommand(opts, deps = {}) {
91
91
  );
92
92
  const sweptAt = (/* @__PURE__ */ new Date()).toISOString();
93
93
  const makeMirror = deps.makeMirror ?? (async () => {
94
- const { makeHealthMirrorBestEffort } = await import("./health-mirror-GCDN7BJL.js");
94
+ const { makeHealthMirrorBestEffort } = await import("./health-mirror-7LKC7Q5Z.js");
95
95
  return makeHealthMirrorBestEffort();
96
96
  });
97
97
  const mirror = await makeMirror();
@@ -156,4 +156,4 @@ export {
156
156
  githubSignalsExitCode,
157
157
  runGitHubSignalsCommand
158
158
  };
159
- //# sourceMappingURL=github-signals-GWGCKEE2.js.map
159
+ //# sourceMappingURL=github-signals-4YML6NY5.js.map
@@ -1,10 +1,10 @@
1
- import {
2
- TURSO_IS_AUTHORITATIVE
3
- } from "./chunk-RUPPWAD6.js";
4
1
  import {
5
2
  mirrorHealthFields,
6
3
  mirrorScheduleFields
7
- } from "./chunk-GQDDWYU2.js";
4
+ } from "./chunk-QBAAZY7W.js";
5
+ import {
6
+ TURSO_IS_AUTHORITATIVE
7
+ } from "./chunk-SVAAONYB.js";
8
8
  import "./chunk-P6AORG32.js";
9
9
  import "./chunk-F3JWOPTG.js";
10
10
  import "./chunk-VAD43MOR.js";
@@ -43,4 +43,4 @@ export {
43
43
  makeHealthMirrorBestEffort,
44
44
  makeScheduleMirrorBestEffort
45
45
  };
46
- //# sourceMappingURL=health-mirror-GCDN7BJL.js.map
46
+ //# sourceMappingURL=health-mirror-7LKC7Q5Z.js.map
package/dist/index.d.ts CHANGED
@@ -129,6 +129,13 @@ type FormSubmitOutcome = {
129
129
  * `elapsedMs` — is what the budget check must compare against. Undefined
130
130
  * when no POST was observed. */
131
131
  postElapsedMs?: number;
132
+ /** The probe's filled values were wiped by a client re-render (2026-08-31:
133
+ * a hydration mismatch on reddoor's /contact recreated the form subtree,
134
+ * discarding the fills AND the injected hidden fields, so the click hit an
135
+ * empty form and native `required` validation blocked the submit) and were
136
+ * re-filled once before the click. On a pass this is production proof the
137
+ * wipe happens; on a failure it says one refill wasn't enough. */
138
+ refilled?: boolean;
132
139
  } | {
133
140
  testModeUndeclared: true;
134
141
  };
@@ -1006,10 +1013,8 @@ interface ReportsTable {
1006
1013
  *
1007
1014
  * `rendered_html` stays deliberately OUT even though the drafting path now
1008
1015
  * writes it: bodies go through `storeRenderedHtml`, so a request handler
1009
- * holding a patch cannot accidentally write megabytes of HTML. `sent_at` and
1010
- * `resend_message_id` stay out because nothing but the send batch writes them
1011
- * and the hourly sync converges those. */
1012
- type ReportMirrorPatch = Partial<Pick<ReportsTable, "approved_to_send" | "approved_at" | "approved_by" | "send_override" | "override_reason" | "override_by" | "override_at" | "delivery_status" | "commentary" | "draft_ready" | "lighthouse_performance" | "lighthouse_accessibility" | "lighthouse_best_practices" | "lighthouse_seo" | "ga_users_current" | "ga_users_previous" | "search_found_page1" | "search_position" | "completed_on">>;
1016
+ * holding a patch cannot accidentally write megabytes of HTML. */
1017
+ type ReportMirrorPatch = Partial<Pick<ReportsTable, "approved_to_send" | "approved_at" | "approved_by" | "send_override" | "override_reason" | "override_by" | "override_at" | "delivery_status" | "commentary" | "draft_ready" | "lighthouse_performance" | "lighthouse_accessibility" | "lighthouse_best_practices" | "lighthouse_seo" | "ga_users_current" | "ga_users_previous" | "search_found_page1" | "search_position" | "completed_on" | "sent_at" | "resend_message_id">>;
1013
1018
 
1014
1019
  /** #539 Phase 5: the Turso write-through for the Reports write surface.
1015
1020
  *
@@ -1255,6 +1260,13 @@ type OrchestrateOptions = {
1255
1260
  * updates. Injected rather than defaulted — this function is called directly
1256
1261
  * by tests, and a default would open a real libSQL handle inside the suite. */
1257
1262
  siteMirror?: SiteMirror;
1263
+ /** #643 (the freeze): Turso write-through for the `Sent at` / `Resend message
1264
+ * ID` stamp. stampSent is what removes a row from listSendableReports, so
1265
+ * once it lands there is no replay left to converge a lost mirror — and the
1266
+ * console's already-sent guards (approve, the commentary lock, re-render)
1267
+ * read `sent_at` from Turso. Injected like siteMirror; the CLI wires it
1268
+ * through `mirrorWrite` so the freeze switch owns the error semantics. */
1269
+ reportSentMirror?: (reportId: string, sentAt: Date, messageId: string | null) => Promise<void>;
1258
1270
  };
1259
1271
  declare function sendApprovedReports(options?: OrchestrateOptions): Promise<{
1260
1272
  output: string;
@@ -1500,9 +1512,12 @@ type CockpitModel = {
1500
1512
  /** NEW submissions across the fleet, newest-first (optional for back-compat). */
1501
1513
  submissions?: SubmissionEntry[];
1502
1514
  /** Fleet spam totals over the window (optional; populated by buildCockpitModel). */
1515
+ /** `computedAt` present ⇒ these came from the nightly roll-up and are up to
1516
+ * 24h old; the strip labels them so a stale number is never read as live. */
1503
1517
  spam?: {
1504
1518
  caught: number;
1505
1519
  through: number;
1520
+ computedAt?: string;
1506
1521
  } | null;
1507
1522
  /** Recent fleet-activity events for the "Recently" lane (optional for back-compat). */
1508
1523
  recent?: RecentEntry[];
package/dist/index.js CHANGED
@@ -1,22 +1,23 @@
1
- import "./chunk-ANJNTAMM.js";
2
1
  import "./chunk-2SLED3NB.js";
3
2
  import {
4
3
  draftReportForSite
5
- } from "./chunk-J3WEZGIN.js";
6
- import {
7
- approveBlockers
8
- } from "./chunk-6I6L3CMX.js";
4
+ } from "./chunk-ZRI5VRPG.js";
5
+ import "./chunk-YFAXOD7Z.js";
9
6
  import {
10
- findDueReports
11
- } from "./chunk-PZR4EBPY.js";
7
+ upgradeSvelte4to5
8
+ } from "./chunk-Z3KYFUN6.js";
12
9
  import {
13
10
  DEFAULT_INIT_STEPS,
14
11
  a11yFixturesPage,
15
12
  init
16
- } from "./chunk-K6SLF6GI.js";
13
+ } from "./chunk-62NYED6E.js";
14
+ import {
15
+ convertToPnpm
16
+ } from "./chunk-XIDUYLSR.js";
17
17
  import {
18
18
  svelteCodemods
19
19
  } from "./chunk-IYSEC543.js";
20
+ import "./chunk-J7SZQUCW.js";
20
21
  import "./chunk-BQRFQSGY.js";
21
22
  import "./chunk-Y53WOQIJ.js";
22
23
  import {
@@ -24,28 +25,27 @@ import {
24
25
  selfCaretRange,
25
26
  selfPackageVersion
26
27
  } from "./chunk-7RJ2HMMJ.js";
27
- import "./chunk-YFAXOD7Z.js";
28
28
  import {
29
29
  bumpDeps
30
30
  } from "./chunk-2NJQLSEU.js";
31
31
  import "./chunk-R53VL3RI.js";
32
+ import "./chunk-ZOCJBJQV.js";
32
33
  import {
33
- upgradeSvelte4to5
34
- } from "./chunk-Z3KYFUN6.js";
35
- import "./chunk-J7SZQUCW.js";
34
+ approveBlockers
35
+ } from "./chunk-KGUKL3CV.js";
36
36
  import {
37
- convertToPnpm
38
- } from "./chunk-XIDUYLSR.js";
37
+ findDueReports
38
+ } from "./chunk-PZR4EBPY.js";
39
39
  import {
40
40
  parseAddresses,
41
41
  sendApprovedReports,
42
42
  withGlobalCc
43
- } from "./chunk-DGZWFI2G.js";
44
- import "./chunk-BRYXFH77.js";
45
- import "./chunk-NYUYNYQL.js";
43
+ } from "./chunk-VBEKL445.js";
46
44
  import {
47
45
  isPendingApproval
48
46
  } from "./chunk-F3JWOPTG.js";
47
+ import "./chunk-BRYXFH77.js";
48
+ import "./chunk-NYUYNYQL.js";
49
49
  import {
50
50
  checklistFor,
51
51
  gatingFields,
@@ -56,14 +56,8 @@ import {
56
56
  } from "./chunk-PR343K7F.js";
57
57
  import "./chunk-IY6256GK.js";
58
58
  import "./chunk-HN6I2XWI.js";
59
- import "./chunk-XP5WM2LV.js";
59
+ import "./chunk-SKI23ZZH.js";
60
60
  import "./chunk-GECESMVS.js";
61
- import {
62
- domainFromUrl,
63
- generateHeaderImage,
64
- loadHeadline,
65
- loadPlate
66
- } from "./chunk-5UINJNAJ.js";
67
61
  import {
68
62
  BLURRED_CID,
69
63
  CHECK_CID,
@@ -71,6 +65,12 @@ import {
71
65
  renderReportHtml,
72
66
  rendersCommentary
73
67
  } from "./chunk-KJGKZLCT.js";
68
+ import {
69
+ domainFromUrl,
70
+ generateHeaderImage,
71
+ loadHeadline,
72
+ loadPlate
73
+ } from "./chunk-5UINJNAJ.js";
74
74
  import {
75
75
  escapeHtml,
76
76
  safeUrl
@@ -84,9 +84,9 @@ import {
84
84
  import "./chunk-WEKL2HYJ.js";
85
85
  import {
86
86
  syncConfigs
87
- } from "./chunk-7UAYMAKR.js";
88
- import "./chunk-73UFRZKY.js";
87
+ } from "./chunk-3VQWSE3F.js";
89
88
  import "./chunk-3G25KIWW.js";
89
+ import "./chunk-73UFRZKY.js";
90
90
  import "./chunk-OTGB6YQO.js";
91
91
  import {
92
92
  ALL_AUDIT_NAMES,
@@ -96,7 +96,7 @@ import {
96
96
  runAudits,
97
97
  runAuditsAcross,
98
98
  securityAudit
99
- } from "./chunk-B23FFWU4.js";
99
+ } from "./chunk-AEXJDCJN.js";
100
100
  import "./chunk-LKGVSM2O.js";
101
101
  import "./chunk-GASBX52O.js";
102
102
  import "./chunk-XHHMM5HX.js";
@@ -1650,7 +1650,8 @@ function renderInboxLane(model) {
1650
1650
  }).join("");
1651
1651
  const overflow = subs.length - shown.length;
1652
1652
  const more = overflow > 0 ? `<div class="approve-row subm-more muted"><a href="/submissions">+${overflow} more \u2014 view all submissions</a></div>` : `<div class="approve-row subm-more muted"><a href="/submissions">View all submissions \u2192</a></div>`;
1653
- const spamLine = hasSpam ? `<div class="spam-rollup muted">\u{1F6E1} Spam (30d) \u2014 caught ${spam.caught} \xB7 through ${spam.through}</div>` : "";
1653
+ const spamAsOf = spam?.computedAt !== void 0 ? ` \xB7 as of ${escapeHtml(spam.computedAt.slice(0, 16).replace("T", " "))} UTC` : "";
1654
+ const spamLine = hasSpam ? `<div class="spam-rollup muted">\u{1F6E1} Spam (30d) \u2014 caught ${spam.caught} \xB7 through ${spam.through}${spamAsOf}</div>` : "";
1654
1655
  const spamInSummary = hasSpam ? " \xB7 \u{1F6E1} Spam (30d)" : "";
1655
1656
  const autoFilteredLine = hasAutoFiltered ? `<div class="spam-rollup muted">\u{1F6AB} ${autoFiltered} auto-filtered this week \u2014 <a href="/submissions?status=spam_auto">review</a></div>` : "";
1656
1657
  const leads = subs.filter((s) => isLeadFormType(s.formType)).length;