Skip to content

fix(web): unfinished task lists stay in the composer after the turn ends - #14341

Closed
TonybynMp4 wants to merge 2 commits into
pingdotgg:mainfrom
TonybynMp4:fix/composer-tasks-persist
Closed

TonybynMp4 wants to merge 2 commits into
pingdotgg:mainfrom
TonybynMp4:fix/composer-tasks-persist

Conversation

@TonybynMp4

@TonybynMp4 TonybynMp4 commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #14327

The composer tasks drawer only showed a task list while the turn that wrote it was still running. When the turn ended, a list with open items disappeared, and it stayed hidden on later turns until the agent updated it. Claude 5 keeps one task list for the whole session, so between turns there was nowhere to see it.

  • Web: the drawer now shows the latest task list, from any turn, as long as one item isn't completed, and hides once every item is completed. The rule lives in deriveComposerTasksProgress in session-logic.ts. On main, the plan state only feeds the drawer, so no working label or progress text changes. The server's ThreadPlanProgress indicator is unchanged.
  • Server (Claude adapter): keeping the list visible exposed a bug. A TaskUpdate with status deleted was read as pending, so deleted tasks stayed in the list until Claude called TaskList. Deleted tasks are now removed. When the list becomes empty (every task deleted, or TaskList returns nothing), the adapter now sends the empty list, which clears the drawer and the progress indicator.

A list the agent leaves unfinished, for example after an interrupted turn, stays in the collapsed tasks tab until the agent completes or clears it. The issue asks for exactly that.

Mobile has no task list UI on main, so it has nothing to change. Orchestrator v2 has its own copy of the drawer check and will need a follow-up after #14337.

Before: see the video in #14327.
After:
image

Tests:

  • session-logic.test.ts: covers the drawer rule.
  • ClaudeAdapter.test.ts: covers task deletion and an emptied list.

🤖 Generated with Claude Code

TonybynMp4 and others added 2 commits September 30, 2026 02:41
The composer tasks drawer only showed a plan while its own turn was running,
so a list with open items vanished when the turn ended and stayed hidden on
follow-up turns. Show the latest plan whenever it has an unfinished step, and
hide it once every step is completed.

Fixes pingdotgg#14327

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
TaskUpdate with status "deleted" was read as pending, so deleted tasks stayed
in the list until Claude called TaskList. Remove them instead, and emit the
list when it becomes empty so the composer clears it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Sep 30, 2026
@macroscopeapp

macroscopeapp Bot commented Sep 30, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 82e23b6

Macroscope's review found this PR approvable — This is a narrowly scoped, well-tested bug fix that keeps unfinished task lists visible across turns and correctly clears them when tasks are completed or deleted. It does not alter schemas, defaults, deployment behavior, or sensitive/security-related code.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: pingdotgg/t3code/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 29e6d974-7602-4461-b898-1aeb3fe40df6

📥 Commits

Reviewing files that changed from the base of the PR and between 0fcd5f9 and 82e23b6.

📒 Files selected for processing (5)
  • apps/server/src/provider/Layers/ClaudeAdapter.test.ts
  • apps/server/src/provider/Layers/ClaudeAdapter.ts
  • apps/web/src/components/ChatView.tsx
  • apps/web/src/session-logic.test.ts
  • apps/web/src/session-logic.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

Claude task updates can remove tasks and emit empty plans. The composer now derives progress from unfinished steps in the active plan, including plans retained from earlier turns.

Changes

Task plan lifecycle and composer progress

Layer / File(s) Summary
Claude task updates
apps/server/src/provider/Layers/ClaudeAdapter.ts, apps/server/src/provider/Layers/ClaudeAdapter.test.ts
Task results report changes when a list clears existing tasks. A deleted TaskUpdate removes its task, and empty plans can be emitted. Tests cover deletion and empty-list results.
Composer progress from active plans
apps/web/src/session-logic.ts, apps/web/src/components/ChatView.tsx, apps/web/src/session-logic.test.ts
Progress selects an in-progress step or, if none exists, a pending step. ChatView uses progress without requiring an unsettled turn or matching turn ID. Tests cover retained plans, step selection, and completed or absent plans.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Medium

Suggested reviewers: t3dotgg

Merge Risk: ⚪ Minimal · up to 82e23

The change keeps unfinished task lists visible in the composer and clears deleted or emptied Claude task lists. No blocking risks were found.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 82e23

The change remains scoped to task visibility and clearing within the same conversation. No new access or execution capability was identified. Event ordering and recovery after interrupted updates are not fully established.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The inspected change affects task metadata and its display within the owning session and thread. It does not introduce a cross-session task lookup or a new execution capability in this path.

Trust Boundaries and Controls

  • observed — Provider-supplied task identifiers and contents are applied only through a correlated successful tool result to the current context’s map. The new deletion branch uses that same ownership and result-success gate rather than granting separate deletion authority.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 7 functions across 5 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR implements #14327. deriveComposerTasksProgress selects an in-progress or pending step from the retained latest plan and returns null when no unfinished step exists. ChatView uses this res…
Out of Scope Changes check ✅ Passed The changed web logic and tests implement the drawer visibility rule in #14327. The Claude adapter changes support removal and clearing of task lists. The adapter tests verify those cases. No changed …
Title check ✅ Passed The title clearly identifies the primary fix: unfinished task lists remain visible in the web composer after a turn ends.
Description check ✅ Passed The description explains the problem, web and server changes, expected behavior, scope limitations, UI evidence, and tests. It does not use the template headings or checklist, but it provides the requ…
  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

TonybynMp4 added a commit to TonybynMp4/t3code that referenced this pull request Sep 30, 2026
Match main (pingdotgg#14341): the composer tasks tab no longer hides once the run
settles or a newer run starts. It stays while any step is pending or in
progress, and goes away when the agent completes or clears the list.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
TonybynMp4 added a commit to TonybynMp4/t3code that referenced this pull request Sep 30, 2026
Match main (pingdotgg#14341): the composer tasks tab no longer hides once the run
settles or a newer run starts. It stays while any step is pending or in
progress, and goes away when the agent completes or clears the list.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Copy link
Copy Markdown
Member

Note

This comment is posted by Julius' dot

Keeping unfinished task lists visible across settled and later turns changes the drawer's lifetime, including lists left behind after interruption. #14327 explicitly identifies that tradeoff as a product choice, but it has no maintainer scope approval. Please agree on the direction with a maintainer and link the approval under the prior-approval rule for reconsideration. The disappearing-list report remains useful.

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

Labels

size:M 30-99 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants