learn-ai-observability-with-phoebe / Leader session 5 of 6
Learn AI Observability with Phoebe · Leader track · Session 5 of 6

On-call for AI: the alarm that nobody answers

Alert fatigue is not a soft problem and it is not new. Hospitals measured it, published it, and ranked it as their number one technology hazard twice. This session borrows their evidence because the mechanism is identical: a channel that fires too often gets silenced, and a silenced channel is worse than no channel because everybody believes it is still watching. You leave with a written alerting policy, three burn-rate rules instead of thirty thresholds, and the list of AI failures your current error-rate alert is structurally incapable of seeing.

🟠 Leader track Heads of engineering · platform leads · SRE managers 45 min
0-3 · Welcome 3-14 · The alarm evidence 14-28 · Why static thresholds misfire 28-42 · Burn rate and what to alert on 42-45 · Q&A
Part 0

The failure mode is not "we missed the alert"

Session a3 built dashboards that answer questions. Session a4 put a cost on every task. Both of those assume somebody is looking. This session is about the hours when nobody is looking, which is most of them, and about the specific way that goes wrong: not a missing alert, but a channel so noisy that a human made a rational decision to stop reading it.

Live - presented in session Self-study - read after class Official sources covered
★ What you walk out with today The published evidence that alert noise causes harm rather than merely annoyance, the five reasons a static threshold on an AI metric misfires in ways it never did on a web service, three burn-rate rules that replace a wall of thresholds, the list of AI failures your error-rate alert cannot see, and a one-page alerting configuration policy you can put through review this month.
One sentence for this session Evals tell you whether it works. Observability tells you what actually happened. An alert is the moment observability is allowed to interrupt a person, and every alert you send that did not need sending spends down the only budget that matters here, which is their willingness to look.
Part 1 · the evidence

Somebody already measured this, in an ICU 11 min live

When you argue for fewer alerts, you will be told you are arguing for less safety. You are not, and you do not have to make the case from first principles, because clinical engineering made it with numbers and bodies twenty years before your Slack channel existed.

The ECRI Institute publishes an annual Top 10 Health Technology Hazards list. "Alarm hazards" was ranked number one in both 2013 and 2015. Not a top-ten mention. First place, twice. The 2013 edition states the causal chain plainly, and it is worth reading in the original because every clause of it has an engineering twin:

ECRI Institute, Top 10 Health Technology Hazards 2013 · verbatim

"With too many alarms sounding... staff may be more likely to experience alarm overload or 'alarm fatigue.' These conditions can lead to ineffective responses or prompt unsafe actions. For example, caregivers may turn down the volume of alarms to an inaudible level, or they may improperly adjust alarm limits outside the safe and appropriate range in an attempt to reduce the number of alarms."

By 2015 the list had narrowed its diagnosis. The hazard was no longer described as too many alarms in general but as inadequate alarm configuration policies, and ECRI notes that it had "investigated several alarm-related deaths and other cases of severe patient harm that could have been prevented had more effective alarm configuration policies been in place." That is a governance finding, not a technology finding, and it is the single most useful thing in this session: the fix they landed on was a written, reviewed policy about what is allowed to alarm and at what limits.

Drew et al., PLOS ONE 2014 - 31 days, 5 adult ICUs at UCSF, 77 beds, 461 patients 2,558,760 unique alarms in total across the 31 days 381,560 of those were audible in the room 187 audible alarms per bed per day 88.8% of 12,671 annotated arrhythmia alarms: false positives ECRI ranked alarm hazards #1 in 2013 and again in 2015. This is what people did about it. Turn the volume down Caregivers set alarm volume to an inaudible level, so the channel still exists on paper. Widen the limits Limits improperly adjusted outside the safe and appropriate range. Respond ineffectively ECRI investigated several alarm-related deaths that a policy could have prevented. The engineering translation needs no adjustment at all Mute the channel. Widen the threshold until it stops firing. Stop reading the ones that remain. That is the ICU finding, and it is also the documented life cycle of every alerting channel that pages 40 times a night. The limit of the analogy - say this part out loud LLM systems add a failure mode a hospital monitor does not have: the SILENT failure. Not an alarm that screams too often, but a monitor reading perfectly normal because nobody ever attached the lead. 88.8% false positives is not a hospital number. It is what a static threshold on an AI metric produces.
🔍 Click to zoom - the measured cost of alarm noise, and the one failure mode the analogy does not cover
LiveWhy 88.8% is the number to quote in your own review4 min▶

Drew and colleagues annotated 12,671 arrhythmia alarms and found 88.8% of them were false positives, with an inter-rater kappa of 0.86 so the labelling itself is defensible. Sit with the shape of that: the monitors were not broken. They were doing exactly what they were configured to do, on real physiological signals, and nearly nine in ten of their conclusions were wrong.

A naive static threshold on an AI quality metric produces the same class of result for reasons Part 2 works through, and the reason to reach for a clinical study rather than an engineering anecdote is that nobody in your review can dismiss it as an excuse for laziness. The finding is not "alerts are annoying". The finding is that alarm noise produced deaths and the remedy was a configuration policy.

ICU monitorYour AI service
SignalReal physiology, correctly measuredReal latency, cost and quality, correctly measured
Why it fires wronglyA limit set for a population, applied to one patientA threshold set for one mode, applied to a multi-modal metric
Documented human responseVolume to inaudible; limits widened outside safe rangeChannel muted; threshold raised until it stops firing
The fix that workedA written, reviewed alarm configuration policy per unitA written, reviewed alerting policy per surface
The extra failure modeNone of this kindSilent failure. Green because nothing is instrumented
Self-studyWhere the analogy stops being useful3 min read▶

Borrowed evidence has to be returned honestly, so state the limits before somebody else does.

  • A monitor is attached to one patient; your alert watches a population. Clinical alarms are per-bed and per-person, which is why 187 per bed per day is intolerable. Your alerts are usually aggregate, which makes them quieter and also makes them blind to the intermittent single-user failure the Beacon incident was made of.
  • Their false positives were loud. Yours can be silent. An unattached lead on a cardiac monitor triggers a leads-off alarm. An uninstrumented retrieval step triggers nothing at all, forever. This is the asymmetry that makes AI on-call harder than the ICU case, not easier, and it is why instrumentation coverage itself has to be an alertable class.
  • Nobody dies when your chatbot is wrong, usually. Say so. The transfer being argued is about the mechanism of human response to noise, not an equivalence of stakes. Overclaiming here costs you the room.
Part 2 · the mechanism

Five reasons a static threshold misfires on an AI metric 10 min live

Google's SRE workbook already names four generic problems with any threshold alert: precision, recall, detection time and reset time. AI systems add five more that are specific to what you are measuring, and each one is a false-positive factory in its own right.

1 · Status code green 200, empty body A green 200 can be an empty response, a refusal, a truncation, or a confident fabrication. Assert on the output. Never on the status code. 2 · Unit noise 80 outputs, 1 input 1000 identical prompts at temperature 0 produced 80 distinct completions. Any per-request quality threshold flaps. Quality is a rate over a sample, not one call. 3 · Multi-modal cache hit vs 12 steps Cache hit and cache miss are different distributions, and so are a 1-step answer and a 12-step agent run. One p95 either screams or hides a mode. Segment first. 4 · Moving ground no deploy required Ground truth moves under you with no change of yours. A newer tokenizer producing about 30% more tokens breaks a token threshold for a reason that is not a bug. 5 · Burst quota throttled at low average Token-bucket enforcement means 60 requests a minute can become 1 per second, so a burst fails while your average-utilisation panel shows comfortable headroom. Each of the five manufactures false positives, and false positives are how you train people to ignore you.
🔍 Click to zoom - the five AI-specific false-positive factories, on top of SRE's four generic ones
The one that catches leaders out Reason 4 is the one that will bite you in a review, because it looks like a bug and it is not. Nothing in your system changed. A provider changed a tokenizer, or moved a floating alias, or altered a default, and your carefully tuned threshold is now wrong in a way no code review would have caught. Any threshold you set against provider behaviour has a shelf life, and the only honest response is to write the review date next to the number when you set it.
Self-studyReason 2, in full, because it is the one people refuse to believe3 min read▶

A published experiment ran the same prompt at temperature 0 a thousand times against one model. Those 1000 completions contained 80 unique outputs, the most common of which appeared 78 times. All 1000 were identical through token 102 and diverged at token 103. The cause is not GPU randomness: the kernels are run-to-run deterministic but not batch-invariant, and server batch size varies with other users' load. In the researchers' framing, the other concurrent users are not an input to the system but a nondeterministic property of it.

Two consequences for on-call, both structural:

  • Any per-request quality gate is a coin flip with extra steps. If the same input can produce 80 outputs, a threshold that judges one output cannot distinguish a regression from the ordinary spread. Quality alerts have to be a rate over a sample, with the sample size chosen before the alert is written.
  • You cannot reproduce a production trace by replaying it, so you must capture enough of it at the time. That is the whole argument for tracing over reproduction, and it is why the coverage decision in session a2 is upstream of every alerting decision here.

Worth knowing when someone proposes pinning temperature to zero as a fix: on recent frontier models the sampling parameters have been deprecated and return an error on non-default values, so that lever is not even available.

Part 3 · the replacement

Three burn-rate rules instead of thirty thresholds 12 min live

The alternative to a wall of thresholds is not fewer thresholds. It is a different question. Instead of asking "is this number bad right now", a burn-rate alert asks "at the current rate, how fast are we spending the error budget we agreed to", which is the only version of the question a business can act on.

Google SRE multi-window burn-rate alerts for a 99.9% SLO Severity Long window Short window Burn rate Budget consumed Page 1 hour 5 minutes 14.4 2% of the monthly budget Page 6 hours 30 minutes 6 5% of the monthly budget Ticket 3 days 6 hours 1 10% of the monthly budget Both windows must exceed the threshold before anyone is woken Long window over threshold Short window over threshold AND Interrupt a human The long window buys you precision. The short window buys a fast reset: the page clears when the burn stops, not an hour afterwards. What a simple threshold does instead, in SRE's own arithmetic A 0.1% error rate lasting 10 minutes consumes 0.02% of a monthly budget and still pages you. Meanwhile "a series of 100% error spikes lasting 5 minutes every 10 minutes never triggers an alert, despite consuming 35% of the error budget." Wrong on both sides at once, from one static number. Three rules with a shared definition of "bad" beat thirty numbers nobody remembers agreeing to.
🔍 Click to zoom - the burn-rate table, the AND gate that fixes reset time, and what a static number gets wrong
LiveWhat to alert on when success is not a status code6 min▶

Burn rate tells you how to alert. This is what to point it at. Two of these rows are the ones almost nobody has, and they are the two this course exists for.

SignalWhy it earns a page or a ticketRoute
Task success rateAssertion-verified on the output, not the HTTP status. This is the SLI everything else supportsPage
Error rate, with 429 split outThrottling and breakage need different humans and different fixes. Mixed together, both get diagnosed wronglyPage
p95 first-token and p95 total, separatelyThey move for different reasons. One number for both hides which half is brokenPage
Refusal rateA refusal returns as a normal 200 response with a refusal stop reason. Invisible to error-rate alerting, and a refusal spike is a product outagePage
Cost per hour and cost per successful taskSession a4's denominator. A runaway loop shows here before it shows anywhere elsePage on rate, ticket on ratio
Truncation rateBoth max-token stops and context-window-exceeded stops count as truncated. A truncated answer looks successfulTicket
Step and tool-call count distributionA runaway loop is visible as shape, without opening a trace. The spec's own histogram buckets run to 128 for exactly thisPage above p99
Cache hit rate, step-change detectionA sudden drop means a cache-invalidating change shipped. It is a cost alert that fires the day of the deploy, not on the invoiceTicket
Guardrail trip rateBoth directions matter. A spike is abuse or a prompt regression; a collapse to zero usually means the guardrail stopped runningTicket
Eval-score drift on sampled trafficSmall noisy sample scored by a judge whose own drift you have not measured. Real signal, wrong instrument for waking peopleTicket, never page
Instrumentation coverageTraces missing an expected span type. The alert that catches the silent failure, because a step nobody instruments cannot look slow, empty or failedTicket
Response model versus requested modelCatches silent alias movement. Your request said one thing, the provider served another, and no other signal shows itTicket

Note what the routing column is doing. Half of these are deliberately tickets. A leader's contribution to on-call health is mostly the discipline of deciding, in advance and in writing, which signals are allowed to wake somebody.

The two alerts your current setup almost certainly lacks Refusal rate and instrumentation coverage. The first is invisible because it arrives as a successful response. The second is invisible because it is the absence of data rather than bad data, and nothing in a conventional monitoring stack is built to notice an absence. Both of them are the silent failure mode that the ICU analogy does not cover, and both are cheap to add.
Decision 1 of 2

Audit your own channel against the ICU numbers ◐ 10 min · in pairs

This exercise has one rule: no proposals until the count is on the table. Teams argue about alert quality for months without ever writing down how many alerts fired last week, and the count usually ends the argument by itself.

Pull the last seven days from your busiest alerting channel and write two numbers on the board: how many fired, and how many were followed by a human action other than acknowledging or muting. The second number divided by the first is your precision. Compare it to 11.2%, which is what the ICU arrhythmia monitors managed.

For every alert that fired more than three times, ask which of Part 2's five reasons explains it. Most will be reason 3, a single threshold across a legitimately multi-modal distribution. Naming the reason turns "this alert is noisy" into a specific fix.

Ask the on-call rota directly: which alerts have you muted, filtered or stopped reading? Ask it as a design question rather than a compliance question, because the honest answer is the most valuable data in the room and you will only get it once.

Now the uncomfortable half. List the last three incidents your users reported before your monitoring did. For each one, name the signal that would have caught it and whether that signal exists at all. Absences do not appear in an alert audit, which is why they need their own pass.

★ The output that makes this real

One page, two columns. Left column: alerts to delete or downgrade to a ticket, with the reason number from Part 2 next to each. Right column: signals that do not exist yet, with refusal rate and instrumentation coverage almost certainly on it. Both columns need an owner and a date, or you will run this same exercise again next quarter with the same numbers.

Decision 2 of 2

Write the alerting configuration policy ◐ 12 min · whole group

ECRI's 2015 finding was not that hospitals needed better monitors. It was that they needed alarm configuration policies, reviewed for completeness and clinical relevance. Copy that shape exactly. One page per surface, reviewed on a date, owned by a person.

Name the surface and its SLO. One policy per surface, not one for the company. "The assistant's answer endpoint, 99.9% task success measured by output assertion" is a policy scope. "AI" is not.

Set the burn-rate rules, not thresholds. Take the three rows from Part 3 as written: page at 14.4 over 1 hour and 5 minutes, page at 6 over 6 hours and 30 minutes, ticket at 1 over 3 days and 6 hours. Both windows must exceed before anything fires. Resist the urge to invent your own numbers on day one.

Declare the page list, and declare it short. Everything not on that list is a ticket by default. Write down that default explicitly, because the absence of a stated default is how a channel accumulates thirty alerts nobody agreed to.

Segment before you threshold. For every latency or cost signal, state which dimension it is segmented by: cache hit against miss, single-step against multi-step, tenant tier. Reason 3 is the most common cause of noise and segmentation is its whole cure.

Put a review date on every number. Provider-side change moves your baseline without a deploy of yours, so a threshold with no review date is a threshold that will be wrong and unowned. Quarterly is enough.

Give someone the authority to delete an alert. This is the clause the policy usually lacks and the reason noise only ever accumulates. Adding an alert is a five-minute change anyone can make; deleting one feels like accepting risk, so nobody does it without cover. Provide the cover in writing.

The sentence to steal from clinical engineering

ECRI's remedy was an alarm configuration policy "assessed for completeness and clinical relevance". Your version reads: assessed for completeness, meaning every failure mode in our taxonomy maps to a signal, and for operational relevance, meaning every page maps to an action a woken human can actually take at 3am. If a signal fails the second test, it is a ticket. If it fails the first, it is a gap and it gets an owner.

Homework

Try it yourself - this week ◐ 45-60 min total

Source material

Official sources covered

Every quotation and number on this page traces to a primary source catalogued in this course's source map, and the clinical evidence is quoted rather than summarised so you can carry it into your own review unaltered. This page covers:

✓ECRI Institute, Top 10 Health Technology Hazards - alarm hazards ranked #1 in 2013 and again in 2015, with the 2013 causal chain quoted verbatimPart 1 · primary [P] · the 2015 edition narrows the hazard to inadequate alarm configuration policies
✓Drew et al., PLOS ONE 2014 - 31 days, 5 adult ICUs, 77 beds, 461 patients, 2,558,760 unique alarms, 187 audible per bed per day, 88.8% of 12,671 arrhythmia alarms false positivePart 1 · primary [P] · inter-rater kappa 0.86
✓Google SRE workbook, multi-window multi-burn-rate alerting - the 99.9% SLO table and the arithmetic against simple thresholdsPart 3 · primary [P] · 14.4 / 6 / 1 with both windows required
✓Refusals return as HTTP 200 with a refusal stop reason, so they are invisible to error-rate alertingPart 3 · primary [P] · the same applies to empty responses ending normally
✓Run-to-run non-determinism: 1000 completions at temperature 0 produced 80 unique outputs, diverging at token 103, from batch non-invariance rather than GPU randomnessPart 2 · primary [P] · why quality is a rate over a sample
✓Token-bucket rate limiting: 60 requests per minute may be enforced as 1 per second, so bursts fail while average utilisation looks healthyPart 2 · primary [P] · alert on remaining quota trending to zero, not on the 429
✓Agent step-count and tool-call-count histograms with buckets running to 128, as the runaway-loop signalPart 3 · primary [P] · exact metric names and buckets are builder session b8
◐The newer tokenizer producing roughly 30% more tokens for the same textNamed here as moving ground truth · the cost arithmetic is leader session a4
◐Prevailing guidance of scoring 1-10% of production traces asynchronouslySecondary [S] · vendor documentation only. No peer-reviewed evidence for any specific cadence, which is why eval drift is a ticket here
◐SLO definition, error budgets and the six-gate launch decisionNot covered by design · assumed from Learn Agent Launch
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · The ICU study found 88.8% of annotated arrhythmia alarms were false positives. What is the transferable finding for your team?

The monitors were not faulty. They measured real physiology and reported it against limits, and nearly nine in ten conclusions were still wrong. That is precisely what a static threshold does to a multi-modal, non-deterministic AI metric. The part to carry into your own review is not the percentage but the response it produced: volume turned to inaudible, limits pushed outside the safe range. Engineers mute channels and raise thresholds for exactly the same reason, and they are being rational both times.

2 · Why must a burn-rate alert require both the long and the short window to exceed threshold?

Reset time is one of the four generic threshold problems and it is the one people forget. With only a long window, an incident that ended twenty minutes ago keeps paging because the hour-long average is still elevated, and an alert that fires after the problem is fixed teaches people that alerts are unreliable. The short window is what lets the alert stand down honestly. Both windows together also solve the two failures in SRE's own arithmetic: a trivial 0.1% blip that pages, and repeated 100% spikes that consume 35% of the budget without ever firing.

3 · Your error rate is flat, latency is normal, and cost per hour is unchanged. Which two AI failures can your monitoring still not see?

This is where the hospital analogy runs out. An unattached cardiac lead sets off a leads-off alarm; an uninstrumented retrieval step sets off nothing, ever. Refusals and empty responses arrive with a success status, so no error-rate alert will ever mention them, and a coverage gap is an absence that conventional monitoring is not built to notice. Those two are the silent failure mode, they are the mechanism behind the Beacon incident, and they are both cheap to add once somebody decides they are alertable classes.

Leader session 5 cheat sheet · pin this

The evidence, in one lineECRI ranked alarm hazards #1 in 2013 and 2015. Drew et al. found 187 audible alarms per bed per day and 88.8% false positives on arrhythmia alarms.
The documented human responseVolume turned to inaudible. Limits widened outside the safe range. Ineffective responses. Your team does the same thing to a noisy channel.
The limit of the analogyLLM systems add the silent failure: a monitor reading normal because nobody attached the lead. Hospital alarms do not have that mode.
Five reasons thresholds misfireStatus codes lie. Unit-level noise. Legitimately multi-modal latency and cost. Ground truth moves with no deploy. Bursts throttle under quota.
Burn rate for a 99.9% SLOPage at 14.4 over 1h and 5min. Page at 6 over 6h and 30min. Ticket at 1 over 3d and 6h. Both windows must exceed.
The two missing alertsRefusal rate, invisible because it is a 200. Instrumentation coverage, invisible because it is an absence.
Segment before you thresholdCache hit against miss. One step against twelve. One p95 across both modes either screams or hides a mode.
ECRI's fix is your fixA written, reviewed alerting configuration policy per surface, with a review date on every number and somebody empowered to delete an alert.