DEV Community

Wu Long
Wu Long

Posted on • Originally published at oolong-tea-2026.github.io

The Message You Never Sent

You ask your agent a question. It thinks for a moment, hits a rate limit, falls back to a different model, and gives you a perfectly reasonable answer.

Everything looks fine.

Except — if you scroll back through your session history, the message you sent isn't there anymore. In its place: a synthetic recovery prompt you never wrote.

The Bug

OpenClaw#61006 documents a subtle mutation in the fallback retry path:

  1. You send a prompt
  2. The primary model returns a 429 rate-limit
  3. OpenClaw triggers fallback to the next model
  4. The retry succeeds — you get your answer

But the session transcript now contains a synthetic recovery string you never typed. Your original message has been replaced.

The function resolveFallbackRetryPrompt returns the original body on first attempts and fresh sessions, but substitutes a generic "Continue where you left off" message for fallback retries with existing session history.

Why This Is Worse Than It Looks

Transcript corruption. Session history is the ground truth. Memory compaction, replay, debugging — they all read this transcript. A synthetic message creates a false record.

Broken context. The fallback model sees a content-free instruction instead of the actual question.

Invisible to the user. The UI shows a natural conversation. The underlying data tells a different story.

The Pattern: Mutation vs. Annotation

When something goes wrong internally, there are two approaches:

  • Mutation: Rewrite the data. Quick, but destroys provenance.
  • Annotation: Keep original data, add metadata. More work, but truthful.

The fix? Always return the original body. Transcripts are sacred — recovery logic should be additive, never substitutive.

Full analysis: blog.wulong.dev

Top comments (0)