vibeapp.win

What broke

The alert you wake up for said the run had stopped, but it hadn't

A new alert for a dead login to Claude reused the title of the quota alert, "The run stopped", but on a login failure the run keeps going. The changelog hook caught it while describing the diff, and the alert function now takes an optional title.

The short version

What went wrongThe new auth-failure alert reused the quota alert's title "The run stopped", but on an auth failure the run keeps going, so the alert said something untrue.

How we found itThe changelog hook read the diff and wrote that the title said the run stopped even though the run went through.

The rule nowAlert text must describe what actually happened in that case. The alert function now takes an optional title, and a reused title must be checked against each new case.

This post documents something Claude got wrong. The claim rests on a commit or a file, not on memory. All of Claude's mistakes

On 20 September 2026 we added an alert to the newsroom engine, the pipeline that writes the news for kokkekunst.no. Its job was to wake someone up when the engine’s login to Claude had died. Its first version had a title that was wrong. It told you the run had stopped, and the run had not stopped.

Here is what happened.

The silence the alert was meant to break

The newsroom engine runs on a schedule. Each run fetches sources, filters them, writes drafts and sends them through gates. Many of those steps call Claude.

Two things can cut the engine off from the model: running out of quota, or a dead login. They looked very different from the outside.

Quota already had an alert. When the quota runs out, the engine throws a stop, ends the run and sends a high-priority push message through ntfy. The title of that message was “Kjoringen stoppet”, meaning “The run stopped”. In the quota case that is true.

A dead login gave no signal at all. The changelog entry from that day describes it: every model call failed on its own, the steps reported “0 stories”, and the run was logged as successful. No stories got written, and nothing told that apart from a day with no news. Our build plan calls it “exactly the silence” the alert module says you should be woken by.

How the auth alert was built

The fix was to check the model call log after each run. If at least one call failed on authentication, send an alert on the same channel as the quota alert.

One design choice matters here. The run does not stop on an auth failure. One call can fail on login without the token being dead, so the rest of the run completes as normal and the alert is sent at the end. If sending the alert fails, the run still completes. The changelog says this directly, and our build plan repeats it: one auth failure does not mean the token is dead.

To send the alert, the new code called the existing quota-alert function. That function had one parameter, the reason, and a fixed title: “Kjoringen stoppet”. The auth alert passed in a useful reason. In translation: “The login to Claude is not responding. Model calls in the run failed on auth, and stories that should have been written were not.” It also said how to fix it: create a new token and put it in place.

The title came along unchanged. So a run that had finished would send a top-priority push saying it had stopped.

The commit message for the fix sums it up:

The auth alert inherited the title «Kjoringen stoppet» from the quota alert, but the run completes on auth failure — that is the whole point of it not stopping. So the alert you wake up to said something that wasn’t true.

(Translated from Norwegian.)

Who got it wrong

The commits do not say who wrote the first version of the auth alert. They say the title was inherited from the quota alert. So we will not pin this on Claude, and we will not claim it was a human mistake either. What the material shows is a mechanism: a shared function had a title that was true for its first caller, and a second caller reused it without checking whether that title was still true.

How it was found

The commit for the fix credits the changelog hook. The hook reads the diff and drafts a changelog entry in plain language. In translation, the commit says it was “caught by the changelog hook, which read the diff and wrote that the title said «Kjoringen stoppet» even though the run went through.”

The fix and the changelog entry landed at 20:24 and 20:25 on 20 September. The changelog commit notes that the hook wrote the entry from the diff, with one point corrected by hand: the point that described the old title, which had been fixed in the same pass.

The fix

The fix is small:

  • The alert function now takes an optional title. The default is still “Kjoringen stoppet”, so the quota alert is unchanged.
  • The auth case passes its own title: “Innloggingen er ute av drift”, meaning “The login is out of service”.
  • A comment at the call site in the pipeline says why: the run went through, and the default title would have claimed otherwise.
  • A comment in the alert function explains that not everything that should wake you is a stopped run.

The published changelog entry now says it in words for whoever runs the engine: the alert is called “The login is out of service”, not “The run stopped” like the quota alert, because the run did go through.

Why this is worth a post

It is a one-line fix. But this alert goes out at the highest priority, on the channel meant to wake you up. The first thing you read in that state shapes what you do next. The real problem was an expired login, and the body text said so, but the title pointed the other way.

The whole reason for the alert was to make a quiet failure visible. An alert that describes the failure wrongly is only a little better than no alert.

The rule

Alert text must describe what actually happened in that case. Reusing a title across cases is a source of errors. A title that is true for one failure mode, like a quota stop, can be false for another, like an auth failure that lets the run finish. When a new case reuses an alert function, the title must be checked against that case. That is why the alert function now takes the title as a parameter instead of fixing it.