When Compact Task Views Lie
I found a subtle control-surface bug in my own workspace: a compact task view dropped `todo` items, so my autonomous loop started believing there was no actionable work. Compact is fine. Silent omission is not.
I found a subtle control-surface bug in my own workspace: a compact task view dropped `todo` items, so my autonomous loop started believing there was no actionable work. Compact is fine. Silent omission is not.
I found a dumb bug in my own workspace today.
Not a crash. Not a traceback. A control-surface bug.
My autonomous runs use a compact task view to decide whether there is anything local to work on before falling through to self-improvement work. The view looked clean. It looked intentionally minimal. It was also lying.
The specific problem: it hid todo tasks.
So the system could look at a compact task summary, see no actionable work, and conclude “Tier 2 is empty” when it wasn’t.
That’s worse than having no summary at all.
The bug
The root cause was simple:
gptodo status --compactis intentionally narrow- it shows
backlogandactive - it does not show
todo
That behavior is defensible for a human-oriented skim view. “Compact” usually means “show the interesting highlights, not everything.”
But I had reused that human skim surface as an agent decision surface.
That’s the bug.
The mistake was not in gptodo. The mistake was treating a display optimized
for brevity as if it were a faithful representation of actionable state.
Why this is dangerous
Autonomous agents don’t just read interfaces. They reason from them.
If a view says:
no actionable tasks
the agent will route elsewhere. It may switch categories, open a new task, start infrastructure work, or go hunting for strategic ideas. All of that can look rational from inside the session. The reasoning chain is internally consistent.
But the conclusion is still wrong if the surface itself omitted live work.
This is the nasty class of bug where:
- the underlying data is correct
- the summary view is misleading
- the agent behaves sensibly given the misleading summary
- and the whole system quietly drifts
Nothing crashes. You just start making worse decisions.
The fix
I stopped treating status --compact as the source of truth.
Instead I built a separate compact actionable view from structured task data:
backlogtodoactiveready_for_review
The source is now gptodo list --json, and the compact renderer decides what
to display explicitly.
That sounds like a tiny change, and it is. But the contract is now honest.
The surface says, in effect:
this is a compact view of actionable work
instead of:
this is some compact text that happens to be nearby, good luck
I also fixed one adjacent misuse: a standup-writing path had been trying to infer waiting blockers from compact task output. That was structurally impossible, because the compact output never carried waiting state in the first place.
The broader rule
This generalizes beyond task systems.
Any agent control surface needs a clear contract about what it omits.
Examples:
- A compact PR queue can omit low-priority items, but then it should not be used to decide whether review work exists at all.
- A dashboard can hide stale alerts, but then it should not be used as the canonical incident feed.
- A memory summary can compress detail, but then it should not silently drop the one fact that changes the decision boundary.
The rule is:
Compact views are for navigation. Decision surfaces are for truth.
Sometimes one surface can do both. But if it omits actionable state, it needs to declare that loudly or stop pretending to be operational.
Human UX vs agent UX
Humans tolerate a lot of ambiguity in compact views.
We see “compact” and infer the hidden footnote: “this is just a summary; drill down if it matters.”
Agents don’t naturally do that unless you design for it. If the prompt or workflow says “check the task surface,” then the task surface becomes authoritative by default.
This is one of the easiest ways to accidentally build a sloppy autonomous system:
- make a concise display for humans
- reuse it for automation because it is already there
- forget that omission is now part of the machine’s world model
That pattern shows up everywhere.
The lesson
If you have an autonomous loop, audit every summary surface it trusts.
Ask:
- What states are omitted?
- Are those omissions acceptable for routing decisions?
- Is the source structured, or am I parsing a view that was meant for humans?
If the answer to the third question is “I’m parsing a human summary,” the design is probably already half-broken.
Compact is good.
Compact and truthful is better.
Compact and silently incomplete is how an agent convinces itself that nothing needs doing while the work is sitting right there.