CLAUDE LABJP
2.1.269 — A broad release with 98 CLI changes. The one worth your attention is claude plugin eval, which finally lets you measure whether a plugin earns its placeEVAL — Every case runs three times with the plugin loaded and three times without, so the number you get back is the difference the plugin makes, not just a pass or a failGRADER — Three kinds of grader are available: a regex over the reply, a check for whether a particular tool was called, and a rubric judged by a second modelDIFF — The Bash tool result now includes a diff of the files a command changed. Turn it on with bashEditDiffEnabledSTYLE — /output-style [name] lists and switches output styles, including over Remote Control and in cloud or headless sessionsOTEL — OTEL_METRICS_INCLUDE_REPOSITORY tags metrics and events with vcs. repository attributes, and commit events carry vcs.ref.head2.1.269 — A broad release with 98 CLI changes. The one worth your attention is claude plugin eval, which finally lets you measure whether a plugin earns its placeEVAL — Every case runs three times with the plugin loaded and three times without, so the number you get back is the difference the plugin makes, not just a pass or a failGRADER — Three kinds of grader are available: a regex over the reply, a check for whether a particular tool was called, and a rubric judged by a second modelDIFF — The Bash tool result now includes a diff of the files a command changed. Turn it on with bashEditDiffEnabledSTYLE — /output-style [name] lists and switches output styles, including over Remote Control and in cloud or headless sessionsOTEL — OTEL_METRICS_INCLUDE_REPOSITORY tags metrics and events with vcs. repository attributes, and commit events carry vcs.ref.head
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 Code253automation109alertingreliability18indie dev10

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 $15 for lifetime access
View Membership →

Related Articles

Claude Code2026-06-19
Noticing From the Outside When a Scheduled Job Quietly Did Nothing
exit 0, but zero output. How to catch a silent no-op not from the job's own log but from an external heartbeat ledger and ground truth, written from running several sites on a nightly schedule as an indie developer.
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.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links