◉CLAUDE LABJP
●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…
Articles/Claude Code
⟐ Claude Code/2026-07-07Advanced

I Could Detect Failures — Then the Alerts Grew So Loud I Stopped Noticing

The moment I could detect silent job failures, my phone started buzzing too often to be useful. Here is how I collapsed alerts by action rather than event, added hysteresis and quiet hours, and built a three-step escalation so only the pages worth waking me survive.

Claude Code264automation109alertingreliability18indie dev11

✦ Premium Article

The week after I wired up a dead man's switch, I had started leaving my phone face down.

Being able to detect silent misfires from the outside did work: I finally noticed the empty runs. But the finer I made the detection net, the more it buzzed. A connector wobbling for a few minutes would page me. A late-night rate limit would page me. By morning, a dozen notifications had stacked up, and I had started swiping them away from the top without reading.

And, of course, one real failure was buried in that stack.

I wrote up the detection design earlier, in noticing from the outside when a scheduled run finishes silently empty. This is the sequel: once you can detect, how do you collapse everything into a single message worth reading? It turns out that not ringing is far harder than ringing.

Adding detection only moved the pain to overload

When you run nightly generation for several sites as a solo indie developer, most failures are not real. A transient 529, a connector that recovers in minutes, a miss that resolves on retry. Turn each of those into a notification and the count grows with the number of events.

The problem was never the volume itself — it was that volume dulled my judgment. By the tenth notification, I no longer remembered what the first one said. Alert fatigue is not lowered sensitivity; it is exhausted attention.

So I moved the starting point of the design from "what should ring" to "what should stay silent."

Alert on the action required, not the event

The first thing I changed was granularity. I had been running on a naive rule: an error happens, so notify. But what I actually wanted to know was not that an error occurred — it was whether I needed to get up and act right now.

So I sorted every event into three action tiers.

TierMeaningDestinationExample
logRecord only; no human reads itJSONL ledgerA single 529 resolved by retry
notifyFine to review together in the morningDaily digestOne site's article merely delayed
pageGet up and handle it nowImmediate push (phone)All sites produced zero / auth expired

Just running events through this sort first cut the phone-ringing set dramatically. The key is to set severity by "the action it demands of me," not "the technical seriousness of the error." A 500 that retries clean and still ships output can be a log. Conversely, an exit 0 that produced nothing is a page.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦A notification gate that classifies by action (log / notify / page) instead of event, and collapses duplicates by fingerprint
✦Flap-suppressing hysteresis (fire on N consecutive failures, clear on M consecutive successes) plus a quiet-hours breakthrough rule
✦A self-heal to notify to page escalation ladder, and real numbers: from dozens of pages a night down to 2 to 3 a week over three weeks
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⟐ Claude Code2026-10-12
After Moving to SPM, My App Died the Moment It Launched — Reading One dyld Line with Claude Code
Right after moving from CocoaPods to Swift Package Manager, the build passed but the app died on launch. Here is how I traced one dyld line to its cause, the fix, and how to verify it.
⟐ Claude Code2026-09-02
Two hooks that record every model switch and stop the ones you never agreed to
Build a PostModelSwitch hook that logs every model change and a PreModelSwitch hook that blocks unapproved switches during unattended runs. Complete scripts, measured timings, and the reason the two jobs must stay separate.
⟐ Claude Code2026-08-31
Half of My Scheduled Runs Vanished Without a Single Error
A batch job set to run twice a day was only firing once. No errors, no failure alerts. Here is how to expand your own schedule, count expected runs, and reconcile them against execution records to catch silent misses.