command: ["node", "--test", "/home/jwoltje/.t3/worktrees/mosaic-stack/magica-row329/packages/cli/tests/notifier.test.mjs"]
TMPDIR: /mnt/storage/scratch/tmp/eZFGIj
begin: {"utc": "2026-10-24T20:20:55.673+00:00", "load1": "6.30"}
launch nice: 19
✔ zoned uses the IANA zone across DST (17.041786ms)
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (27.633968ms)
✔ two blocking decisions get two DMs with different nonces (17.607895ms)
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (1.07468ms)
✔ a failed DM is journaled, backs off, and is retried until it lands (18.290298ms)
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (21.948577ms)
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (22.480808ms)
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (15.856559ms)
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (139.364273ms)
✔ a restart after the second refusal does not send before that refusal's 30 min are up (74.809896ms)
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (20.521481ms)
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (14.882784ms)
✔ an inbox read failure is logged and the next poll retries (0.684789ms)
✔ no Discord id reaches the journal or the log (15.909276ms)
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (1.914169ms)
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (2.095447ms)
✔ the journal: a whole file that is one torn line truncates to empty (1.115216ms)
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (0.423831ms)
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (0.506636ms)
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (1.84503ms)
✔ the journal: a symlinked directory refuses and says it is a link (0.289235ms)
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.446763ms)
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.365931ms)
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.431657ms)
✔ digest content stays within Discord's 2000 characters (0.278548ms)
✔ runLoop never overlaps ticks and stops after the one in flight (111.802509ms)
✔ processing halt prevents notifier reads and sends and fences the wait before delivery (35.880601ms)
ℹ tests 27
ℹ suites 0
ℹ pass 27
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 687.087182
