Skip to content

[Bug]: Unfinished task list disappears from the composer when the turn ends #14327

Open

Description

@TonybynMp4

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/web

Steps to reproduce

  1. Launch T3 Code with CLAUDE_CODE_ENABLE_TODO_TOOLS=1 set. main doesn't set it for Claude 5 sessions yet ([Bug]: Plan sidebar stays empty on Claude 5 models — Claude Code no longer exposes the Task tools by default #9029), so without it Claude 5 has no task tools.
  2. Start a Claude thread on a Claude 5 model and ask it to create a task list, then stop after the first task.
  3. Let the turn finish with tasks still pending.
  4. Send a follow-up that doesn't touch the task list.

Expected behavior

The composer tasks drawer keeps showing the latest task list while any item isn't completed, and hides once every item is completed.

Actual behavior

Screencast.From.2026-09-30.00-13-17.mp4

The drawer shows during the turn and disappears when the turn ends, with items still open. It stays hidden on later turns until the agent updates the list.

The drawer only renders when a turn is running and the plan was written in that same turn:

  • main: activeComposerTasksProgress in ChatView.tsx returns null when latestTurnSettled, or when activePlan.turnId !== activeLatestTurn.turnId. This came in with the composer drawer move in feat(web): attach composer state drawers #7150, which doesn't mention hiding tasks between turns.
  • orchestrator v2 (t3code/codex-turn-mapping): the same check on runId, with the comment "deriveActivePlanState falls back to older runs' plans, which must not label fresh work".

deriveActivePlanState keeps the most recent plan across turns on purpose. Its comment says "so that TodoWrite tasks persist across follow-up messages". The drawer check then throws that plan away. The v2 comment is about labeling fresh work, which the drawer doesn't do on main.

Impact

Medium. Claude 5's task tools keep one list for the whole session, so between turns there's nowhere to see where the agent stands, and it looks like the agent dropped its plan.

Version or commit

v0.0.44 (main), and t3code/codex-turn-mapping @ cb64162dee

Environment

Linux, T3 Code web/desktop, Claude provider on a Claude 5 model with CLAUDE_CODE_ENABLE_TODO_TOOLS=1

Possible fix

Separate what the drawer shows from what labels the running turn:

  • Drawer: show the latest plan whenever it has an unfinished step, whether or not a turn is running or the plan came from an earlier turn. Hide it once every step is completed.
  • On v2, keep the working label and progress text tied to the running turn's own plan. On main the plan only feeds the drawer, so nothing else changes. The server's ThreadPlanProgress indicator stays as is.

One tradeoff to decide: a list the agent abandons, for example after an interrupted turn, stays in the collapsed tasks tab until the agent completes or clears it. I think that's the right call, since the tasks really are unfinished, but it's a product choice.

Mobile has no task list UI on main, so there's nothing to change there.

I already made PRs to fix this, the main branch would receive the web fix in #14341, since all PRs conflicting with the Orchestrator V2 are closed by default i didn't bother fixing that. Orchestrator v2 would need a separate follow-up on t3code/codex-turn-mapping if #14337, the actual fix to the tool list, lands.

Activity

  1. TonybynMp4 commented on Sep 30, 2026

    @TonybynMp4
    ContributorAuthor

    @juliusmarminge hey can you triage this issue please, it seems the triage didn't run 😅

  2. TonybynMp4 commented on Oct 3, 2026

    @TonybynMp4
    ContributorAuthor

    @juliusmarminge following up on your notes on #14341 and #14337: could a maintainer pick the drawer behavior here before I touch it again?

    Now that orchestrator v2 is on main, there's only one place to change: activeComposerTasksProgress in ChatView.tsx, which hides the list once the run settles or when the plan came from an earlier run.

    The question is what the composer tasks tab should do with a list that still has open steps after the turn ends:

    1. Keep it visible across settled and later turns until every step is completed or the list is cleared. This includes lists left behind by an interrupted turn. That's what fix(web): unfinished task lists stay in the composer after the turn ends #14341 did.
    2. Same as 1, but drop the list when the turn that wrote it was interrupted.
    3. Keep the current behavior: the tab only shows during the run that wrote the plan.

    I'd go with 1, because with Claude 5's task tools the list belongs to the whole session, not one turn. But it's your call. If you approve 1 or 2, I'll open a web-only PR with before/after screenshots.

    The adapter fix for #14322 is going up separately with no drawer changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions