Skip to content

feat: keep the plan readable after you answer it (don't lose plan cards) #1688

Description

@cleiter

Prior search

  • I searched existing issues and discussions, and this isn't already proposed.

What's the problem

When a Claude Code agent presents a plan (ExitPlanMode), the plan only lives in the
transient permission card. The moment I respond, it's gone from the conversation:

  • Implement → the plan vanishes; I can't re-read what I just approved.
  • Reject → same; no record of what was proposed.
  • Type a follow-up instead of tapping a button → the plan also disappears.

So right at the one moment I'd most likely want to re-read the plan — just after deciding
on it — there's no way back to it. For any plan longer than a couple of lines, this is a
recurring papercut.

Steps to reproduce:

  1. Start a Claude Code agent in plan mode.
  2. Let it present a plan (the ExitPlanMode permission card appears).
  3. Respond any way — Implement, Reject, or just type a message.
  4. The plan is no longer anywhere in the timeline.

What would solve it

Keep the resolved plan in the conversation as a collapsible card, at the position
where it was proposed:

  • Collapsed: the plan's own title + an outcome badge — Approved / Rejected /
    Dismissed (dismissed = I typed a follow-up instead of tapping a button).
  • Tap to expand: the full plan, on demand.
  • Durable: survives a daemon restart, so history stays complete.

No new plan view and no new data model — the card can come straight from the ExitPlanMode
tool_use + tool_result that's already in the session transcript, so it's cheap and stays
consistent live and after a reload.

I threw together a working prototype just to make these screenshots concrete (happy to park
it and go whichever way you prefer — wanted to check the idea first):

The plan, presented for approval:

Image

After approving — it stays as a collapsed card with its outcome, right in the stream:

Image

Tap to re-read the whole plan:

Image

Same for a rejected plan:

Image

Alternatives you considered

Known nuance: after a daemon restart, a plan dismissed by typing a follow-up currently
reloads as Rejected rather than Dismissed (the transcript records a typed
follow-up and a clicked Reject the same way). Live, before a restart, it shows
Dismissed. Flagging in case distinguishing them after reload matters.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions