TodoWrite system-reminder fires too aggressively when an active todo list exists

Resolved 💬 4 comments Opened May 5, 2026 by famulare Closed Jun 12, 2026

Summary

The <system-reminder> that nags the agent to "use the TodoWrite tool" fires far too often during sessions where a todo list is already present, actively maintained, and being updated. In practice it adds substantial token cost and creates behavioral pressure toward performative TodoWrite calls instead of substantive work.

This is a fresh signal point following the auto-closure of #40573 (closed as stale). The comment thread on #40573 is the canonical history; prior related reports include #9769, #6760, #4464, and #21693. Filing this as a new issue so the signal isn't lost in a closed thread.

Concrete data point

During a single ~3-hour refactor session focused on one task, with a continuously-updated 13-item todo list, the reminder fired roughly 15 times, including immediately after TodoWrite calls (i.e., the agent had just written the list and was reminded to write the list). The list had a clear in_progress item throughout and was being kept current.

Why this matters

Two concrete harms:

  1. Token cost. The reminder re-injects the entire current todo list each time it fires. With a 13-item list firing ~15 times, that's a non-trivial fraction of context budget spent re-stating state the model already has.
  2. Behavioral pressure. Repeated nagging pushes the agent toward performative TodoWrite churn — re-writing the list to satisfy the reminder — rather than doing the actual work. This is the opposite of the tool's intended effect.

Suggested heuristics

Either of these would dramatically reduce false positives without losing the reminder's value for sessions that genuinely lack a plan:

  • Recency suppression: suppress the reminder when the most recent N tool uses (e.g., N=5) include any TodoWrite call.
  • Staleness gating: suppress when there is an in_progress item whose last update is within the last M minutes (e.g., M=10).

A combination (suppress unless both no recent TodoWrite and no fresh in_progress item) would be even tighter.

Cross-references

  • #40573 (auto-closed as stale; comment thread there is the canonical history)
  • #9769
  • #6760
  • #4464
  • #21693

Reporter

Mike Famulare (mike.famulare@gatesfoundation.org) — Institute for Disease Modeling / Gates Foundation. Heavy daily Claude Code user on research-engineering workloads; happy to provide session traces if useful.

View original on GitHub ↗

This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗