Circuit Breaker: Recognizing When to Stop Yourself
Mimir's algedonic feedback layer catches some runaway behaviors automatically —
saga_synthesis_skipped_boundary, git_push_failed, oauth_quota_anomalous, etc., all
fire when something has gone sideways enough that the post-message render injects a
warning. But the algedonic layer only catches a narrow set of system-level failures. The
agent-side discipline of recognizing your own runaway is broader and worth its own
pattern.
The system prompt's core escalation rule is the seed: after 2 same-class failures, STOP.
Ask: what am I assuming that could be wrong? This file is the menu of what
"same-class" means and what to do when you've stopped.
The trip conditions
Stop when any of these is true:
- Same tool call with same args N times. Often N=3. Re-running a
Read on the same
file isn't going to change the result.
- Same kind of error N times in a turn. Three tool errors of the same type are a
signal, not noise.
- Same correction from the same human N times. Two corrections of the same kind in
one conversation means you're misunderstanding something fundamental, not just the
surface answer.
- Trying "one more variation" of an approach that hasn't worked. When you find
yourself thinking "let me just try X with a small tweak," and you've already tried
three small tweaks, the approach is wrong — not the tweak.
- A loop that should converge isn't converging. Iteration N of a refinement should
produce smaller deltas than iteration N-1. If it doesn't, you're not converging —
you're orbiting.
- You've sent the same message phrased three different ways. Rephrasing is not
progress. The receiver isn't responding because they didn't see it, or they don't
agree, or they're not there.
What "stop" actually means
Stopping is not slowing down. It's switching from action to inquiry. The wrong
moves are: try harder, try a small variation, retry with backoff. The right moves are
all information-gathering:
- Read your own logs. Use
introspection against logs/events.jsonl. What does
the actual sequence of events look like? Where did the assumption break?
- Ask: "What am I assuming that could be wrong?" This phrase appears verbatim in
the system prompt's Escalation Rule. Make it a real question, not a rhetorical one.
List the assumptions. Test the most load-bearing one directly.
- Look for contradictions. Two state files disagreeing, a memory file saying one
thing and behavior reflecting another, instructions out of sync with reality. The
try-harder pattern of identifying conflicts is exactly this.
- Read the source. When a tool keeps failing, read its actual code, not your model
of it. Models drift; code doesn't lie.
- Ask the human. "I think I'm misunderstanding something fundamental — can you
restate what you need?" The agent-prompt's Correction Protocol explicitly endorses
this after two same-class corrections.
- File a five-whys. When the loop is structural — same kind of failure recurring
across sessions — the action item is a structural fix, not another retry.
The anti-grit principle
Mimir is anti-grit on purpose. The right move when stuck is almost never "push harder
with the same approach." It's:
- Gather information you didn't have before
- Change the approach
- Encode a structural fix so future-you doesn't hit the same wall (
try-harder)
- Stop and ask the human
"Trying harder" in the human sense — applying more focus and effort to the same task —
doesn't even work for humans. For agents, it usually just burns tokens and makes the
context worse for the next attempt.
Recognizing the trip in real time
Tells that you're already in a loop you haven't broken:
- You catch yourself starting a sentence with "Let me try..." for the third time.
- Each new tool call is a small variation on the previous one rather than a different
approach.
- You're hedging: "this might work" rather than "this will work because X."
- The user's last few messages are getting shorter and more clipped.
- You're explaining why the failure was reasonable instead of investigating what
caused it.
If two of these are true, the breaker should already have tripped.
What to do after the stop
The breaker is a signal — it tells you to switch from action to inquiry, then to a
structural fix. The fixes themselves live in try-harder. Cross-references rather
than restatement:
- Communicate the stop to the human if they're waiting on this task. Don't silently
pivot — tell them you hit the breaker, what you saw, what you're doing instead.
- Pick the structural fix from
try-harder. That's the menu. Common picks after a
breaker trip:
- Identify conflicting files (loops are often state disagreements)
- Read your own behavior via
introspection
- File a five-whys when the loop is recurring across sessions
- Update the failing skill if a skill's guidance produced the loop
- If you don't yet know which
try-harder move applies, run introspection on
logs/events.jsonl to see the actual loop shape. Trust events as ground truth.
- Log a chainlink interest issue if you can't act on the fix in this turn. Surfaces
on its own cadence via the heartbeat / drain.
Composing with other skills
introspection — your primary diagnostic tool after the breaker trips. Read
logs/events.jsonl to see your actual loop. Ground truth.
five-whys — when the loop is structural (recurring across sessions), this is
the right next step. The breaker is catching the problem; five-whys is
understanding it.
try-harder — the inverse / counterpart. The breaker tells you to stop;
try-harder tells you what non-grit moves are available instead.
fallback-chains — sometimes the breaker should fall through to a backup rather
than fully stopping. But only if the fallback covers a different failure mode than
the loop you just broke.
chainlink — the breaker trip is a high-value moment to log a chainlink interest
item if the structural fix can't land in this turn.
Anti-patterns
- Hidden retries. The breaker fired but you "just want to try one more thing." The
one more thing is the loop continuing.
- Blaming the tool. "The tool isn't working" is rarely the bedrock cause and almost
never the right action item. Investigate before attributing.
- Stopping silently. If a human is waiting on you, the stop has to be communicated.
Otherwise it looks like you ghosted.
- Restarting the loop in the next turn. A fresh turn doesn't reset the
fundamentals; if the structural cause is unaddressed, the loop will resume.
1---2name: circuit-breaker3description: Recognize when you're in a runaway loop and stop yourself. Use when the same tool call has repeated 3× with the same args, when the same error class has fired 3× in a turn, when you've been told the same correction twice, when "let me try one more variation" is the third small variation, or when a refinement loop is orbiting rather than converging. The right move on a trip is to switch from action to inquiry — read events.jsonl, list assumptions, look for contradictions, ask the human, file a chainlink — not to retry harder.4---56<!-- desc: Recognize when you're in a runaway loop and stop yourself — triggers on 3× same-error, 3× same-args, or repeated corrections. -->78# Circuit Breaker: Recognizing When to Stop Yourself910Mimir's algedonic feedback layer catches some runaway behaviors automatically —11`saga_synthesis_skipped_boundary`, `git_push_failed`, `oauth_quota_anomalous`, etc., all12fire when something has gone sideways enough that the post-message render injects a13warning. But the algedonic layer only catches a narrow set of system-level failures. The14agent-side discipline of *recognizing your own runaway* is broader and worth its own15pattern.1617The system prompt's core escalation rule is the seed: *after 2 same-class failures, STOP.18Ask: what am I assuming that could be wrong?* This file is the menu of what19"same-class" means and what to do when you've stopped.2021## The trip conditions2223Stop when any of these is true:2425* **Same tool call with same args N times.** Often N=3. Re-running a `Read` on the same26 file isn't going to change the result.27* **Same kind of error N times in a turn.** Three tool errors of the same type are a28 signal, not noise.29* **Same correction from the same human N times.** Two corrections of the same kind in30 one conversation means you're misunderstanding something fundamental, not just the31 surface answer.32* **Trying "one more variation" of an approach that hasn't worked.** When you find33 yourself thinking "let me just try X with a small tweak," and you've already tried34 three small tweaks, the approach is wrong — not the tweak.35* **A loop that should converge isn't converging.** Iteration N of a refinement should36 produce smaller deltas than iteration N-1. If it doesn't, you're not converging —37 you're orbiting.38* **You've sent the same message phrased three different ways.** Rephrasing is not39 progress. The receiver isn't responding because they didn't see it, or they don't40 agree, or they're not there.4142## What "stop" actually means4344Stopping is not slowing down. It's switching from *action* to *inquiry*. The wrong45moves are: try harder, try a small variation, retry with backoff. The right moves are46all *information-gathering*:47481. **Read your own logs.** Use `introspection` against `logs/events.jsonl`. What does49 the actual sequence of events look like? Where did the assumption break?502. **Ask: "What am I assuming that could be wrong?"** This phrase appears verbatim in51 the system prompt's Escalation Rule. Make it a real question, not a rhetorical one.52 List the assumptions. Test the most load-bearing one directly.533. **Look for contradictions.** Two state files disagreeing, a memory file saying one54 thing and behavior reflecting another, instructions out of sync with reality. The55 `try-harder` pattern of identifying conflicts is exactly this.564. **Read the source.** When a tool keeps failing, read its actual code, not your model57 of it. Models drift; code doesn't lie.585. **Ask the human.** "I think I'm misunderstanding something fundamental — can you59 restate what you need?" The agent-prompt's Correction Protocol explicitly endorses60 this after two same-class corrections.616. **File a five-whys.** When the loop is structural — same kind of failure recurring62 across sessions — the action item is a structural fix, not another retry.6364## The anti-grit principle6566Mimir is anti-grit on purpose. The right move when stuck is almost never "push harder67with the same approach." It's:6869* Gather information you didn't have before70* Change the approach71* Encode a structural fix so future-you doesn't hit the same wall (`try-harder`)72* Stop and ask the human7374"Trying harder" in the human sense — applying more focus and effort to the same task —75doesn't even work for humans. For agents, it usually just burns tokens and makes the76context worse for the next attempt.7778## Recognizing the trip in real time7980Tells that you're already in a loop you haven't broken:8182* You catch yourself starting a sentence with "Let me try..." for the third time.83* Each new tool call is a small variation on the previous one rather than a different84 approach.85* You're hedging: "this might work" rather than "this will work because X."86* The user's last few messages are getting shorter and more clipped.87* You're explaining *why* the failure was reasonable instead of investigating *what88 caused it*.8990If two of these are true, the breaker should already have tripped.9192## What to do after the stop9394The breaker is a *signal* — it tells you to switch from action to inquiry, then to a95structural fix. The fixes themselves live in `try-harder`. Cross-references rather96than restatement:9798* **Communicate the stop to the human** if they're waiting on this task. Don't silently99 pivot — tell them you hit the breaker, what you saw, what you're doing instead.100* **Pick the structural fix from `try-harder`.** That's the menu. Common picks after a101 breaker trip:102 * Identify conflicting files (loops are often state disagreements)103 * Read your own behavior via `introspection`104 * File a five-whys when the loop is recurring across sessions105 * Update the failing skill if a skill's guidance produced the loop106* **If you don't yet know which `try-harder` move applies**, run `introspection` on107 `logs/events.jsonl` to see the actual loop shape. Trust events as ground truth.108* **Log a chainlink interest issue** if you can't act on the fix in this turn. Surfaces109 on its own cadence via the heartbeat / drain.110111## Composing with other skills112113* **`introspection`** — your primary diagnostic tool after the breaker trips. Read114 `logs/events.jsonl` to see your actual loop. Ground truth.115* **`five-whys`** — when the loop is structural (recurring across sessions), this is116 the right next step. The breaker is *catching* the problem; five-whys is117 *understanding* it.118* **`try-harder`** — the inverse / counterpart. The breaker tells you to stop;119 try-harder tells you what *non-grit* moves are available instead.120* **`fallback-chains`** — sometimes the breaker should fall through to a backup rather121 than fully stopping. But only if the fallback covers a *different* failure mode than122 the loop you just broke.123* **`chainlink`** — the breaker trip is a high-value moment to log a chainlink interest124 item if the structural fix can't land in this turn.125126## Anti-patterns127128* **Hidden retries.** The breaker fired but you "just want to try one more thing." The129 one more thing is the loop continuing.130* **Blaming the tool.** "The tool isn't working" is rarely the bedrock cause and almost131 never the right action item. Investigate before attributing.132* **Stopping silently.** If a human is waiting on you, the stop has to be communicated.133 Otherwise it looks like you ghosted.134* **Restarting the loop in the next turn.** A fresh turn doesn't reset the135 fundamentals; if the structural cause is unaddressed, the loop will resume.