Skip to content

fix(server): Claude 5 task lists reach the tasks drawer - #14964

Merged
Yash-Singh1 merged 5 commits into
pingdotgg:mainfrom
Mnigos:claude-task-tools-reach-tasks-drawer
Oct 10, 2026
Merged

Yash-Singh1 merged 5 commits into
pingdotgg:mainfrom
Mnigos:claude-task-tools-reach-tasks-drawer

Conversation

@Mnigos

@Mnigos Mnigos commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #14322.

Problem

A Claude 5 session never shows its task list in the tasks drawer on V2, for the two reasons the triage confirmed:

  1. Claude 5 models only get TaskCreate, TaskUpdate and TaskList (their replacement for TodoWrite) when the session sets CLAUDE_CODE_ENABLE_TODO_TOOLS. T3 Code leaves that choice to the user: it can be set in the Claude instance's Environment variables, and it reaches the session unchanged.
  2. ClaudeAdapterV2 only projects a todo_list plan for a top-level TodoWrite, which Claude 5 no longer has. TaskCreate, TaskUpdate and TaskList results are dropped, and the drawer only reads todo_list plans.

Change

Both in apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts:

  • T3 Code does not set CLAUDE_CODE_ENABLE_TODO_TOOLS. Users who want the task tools set CLAUDE_CODE_ENABLE_TODO_TOOLS=1 in the Claude instance's Environment variables (or the server's environment); the adapter passes the configured environment through unchanged. This follows the review on this PR; the triage had suggested a default of 1, which an earlier revision implemented.
  • A finished top-level TaskCreate, TaskUpdate or TaskList call updates one task list per native session and emits it as a todo_list plan, one plan per turn, updated in place. TaskCreate takes the id and subject from the tool result; TaskUpdate changes status or subject by taskId (in_progress shows as running, deleted removes the task); TaskList replaces the list. A failed call, an update for an unknown id, and a subagent's task tools leave the list alone.

TodoWrite handling is unchanged for models that still have it.

Scope and approval

Triaged bug #14322, following the triage comment. This is the adapter mapping only. It does not touch when the drawer is shown: the list is visible while the run is active and leaves when the turn settles, as for the other providers; keeping unfinished lists after a turn is #14327 and is not part of this PR (the reason #14337 was closed). Server only, Claude adapter only.

Verification

Real web client, before and after. Headless Chromium at 1400×900 against vp run dev, main at cc1e634 versus this branch, isolated state, a synthetic project and a stand-in claude binary (no account or model call). The stand-in emits the same SDK frames on both builds: two TaskCreate calls with their results, a TaskUpdate to in_progress, a pause, then a TaskUpdate to completed and one to in_progress for the second task. It also logs whether CLAUDE_CODE_ENABLE_TODO_TOOLS is in its environment.

Before (main), mid-turn: no Tasks control After, mid-turn: the drawer lists both tasks
Before: the composer has no Tasks drawer while the turn runs After: the Tasks drawer above the composer shows Draft the outline running and Write the summary pending
Before After
Mid-turn No Tasks control, no plan in the database Drawer: "Draft the outline" running, "Write the summary" pending (crop)
Turn completed No plan One persisted todo_list plan: outline completed, summary running. The drawer is gone, as it is for every provider once the run settles
Stand-in's environment Variable absent Variable absent unless set in the instance's Environment variables (the capture above was taken with the earlier default-on revision; the stand-in emits task frames regardless, so the drawer looks the same)

Tests. ClaudeAdapterV2.test.ts gains: the variable not being injected by default, and a user-set CLAUDE_CODE_ENABLE_TODO_TOOLS=1 (instance or host environment) reaching the SDK; TaskCreate and TaskUpdate projected into one plan per turn that a later turn supersedes; deletion without resurrection; no update for a TaskUpdate that reports success: false, an error result or an unknown id; TaskList replacing the list, including an empty one; a subagent's task tools kept out of the parent's plan; and the persisted todo_list projection from inline task-tool frames. 171 tests pass across the adapter and replay files; with the adapter reverted, 9 fail. Server typecheck, targeted lint, format and knip are clean.

Not checked: a live Claude 5 session. The stand-in shows what the adapter does with these frames and that the variable reaches the process; it does not show the real CLI exposing the tools. The frame shapes come from the issue's recorded sequence, the triage and the Agent SDK types (0.3.276). I did not add a Claude transcript to testkit/fixtures/todo_list/, since the files there are provider recordings and making one needs a live session. Opting in through the provider's Environment variables setting is covered by the test, not exercised in the client.

Implemented with Claude Code (Claude Opus 5.5, coordinated by Claude Fable 5.1); tests, independent review and evidence capture by GPT-6 Astra via Codex.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Oct 3, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 3, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 8523d2d

Macroscope's review found this PR approvable — This is a bounded Claude adapter fix that maps opt-in Claude task-tool results into the existing tasks drawer without changing default environment behavior or stored schemas. The production change is isolated and extensively covered by adapter and replay tests.

Notes:

  • No code objects were reviewed. Approvability was decided on eligibility alone.

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

@juliusmarminge juliusmarminge added the macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews label Oct 3, 2026 — with ChatGPT Codex Connector
@coderabbitai

coderabbitai Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

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: 6b2a86c9-6c7d-4fa3-8eb4-1979f86b8364



📥 Commits

Reviewing files that changed from the base of the PR and between 1c15d1a and aedddc4.




📒 Files selected for processing (2)
  • apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts
  • apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.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
📝 Walkthrough

Walkthrough

ClaudeAdapterV2 enables Claude task tools by default and tracks TaskList, TaskCreate, and TaskUpdate results per native thread. Successful root-thread task changes produce todo-list plan updates. Tests cover task state changes, replay projection, subagent filtering, and environment overrides.

Changes

Claude task-list projection

Layer / File(s) Summary
Track and project task state
apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts, apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts
The adapter tracks task lists by native thread. TaskList replaces the list; TaskCreate adds a pending task; and TaskUpdate changes a known task or removes it when deleted. Valid tasks become plan steps. Tests cover replay projection, multi-turn updates, deletion, failed or unknown updates, list replacement, subagent calls, and ambiguous results.
Wire root results and enable task tools
apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts, apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts
Successful root-thread task results update the tracked list and emit a todo-list plan. The adapter defaults CLAUDE_CODE_ENABLE_TODO_TOOLS to "1" while preserving an existing value. Tests cover default and opt-out environment values.

Priority: ➖ Normal

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix · Severity of issue fixed: Medium

Sequence Diagram(s)

sequenceDiagram
  participant ClaudeSDK as Claude SDK
  participant ClaudeAdapterV2
  participant TodoListPlan as todo_list plan projection
  ClaudeSDK->>ClaudeAdapterV2: TaskCreate, TaskUpdate, or TaskList result
  ClaudeAdapterV2->>TodoListPlan: Emit plan steps from tracked tasks
Loading

Suggested reviewers: juliusmarminge





Merge Risk: ⚪ Minimal · up to aeddd

The task-list projection has no identified merge-blocking defect. A live Claude 5 check remains unperformed, but the supplied evidence does not establish a failure.

Security Architecture Review

Security architecture risk: 🔵 Low · up to aeddd

The task list remains tied to its owning session, and explicit opt-outs are preserved. No new privileged action is evident in the reviewed path. Recovery after session recreation and third-party task-tool behavior remain incompletely established.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • observed — Provider-controlled task subjects and IDs become plan-step data. The reviewed projection obtains thread, run, root-node, and provider-turn ownership from server context rather than task fields. This path emits presentation events; it does not use task fields to select filesystem resources, credentials, or executable actions. Provider-internal task-tool effects remain outside this verified scope.

Trust Boundaries and Controls

  • observed — Frames from replaced queries are rejected before routing. Task projection requires a successful root-thread result, excludes subagent results, and keys state by the live native thread. Unsuccessful TaskUpdate results and updates for unknown IDs do not mutate the list.

Resilience and Maintainability Implications

  • inferred — The identified recovery uncertainty concerns task-display consistency and plan ownership. The reviewed projection contains no authorization or privileged-action decision derived from task completion, so the available evidence does not connect lost projection state to a security-control bypass.



Pre-merge checks | Passed 3 | Failed 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 9 functions across 2 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check Warning The description includes all required sections, issue context, scope, and focused verification. However, it materially contradicts the changeset by stating that the adapter does not set CLAUDE_CODE_EN… Update the Problem, Change, and Verification sections to accurately describe the default CLAUDE_CODE_ENABLE_TODO_TOOLS="1" behavior and its override rules. Reconcile the test and client-verification claims with the implemented behavior.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check Passed Issue #14322 requires Claude V2 sessions to enable task tools unless the configured environment sets the variable, and to project Claude task-tool results into todo_list plans. The change defaults `…
Out of Scope Changes check Passed The whole-PR summary identifies changes to ClaudeAdapterV2.ts and its tests. The environment default, task projection, and regression tests directly support issue #14322. No unrelated changes are id…
Title check Passed The title clearly identifies the server-side Claude task-list fix and matches the main change.

Full details: Description check

Explanation

The description includes all required sections, issue context, scope, and focused verification. However, it materially contradicts the changeset by stating that the adapter does not set CLAUDE_CODE_ENABLE_TODO_TOOLS by default, while the implementation sets it to "1" unless overridden.


  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR





  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@Mnigos
Mnigos force-pushed the claude-task-tools-reach-tasks-drawer branch from 1c15d1a to aedddc4 Compare October 3, 2026 05:47
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts Outdated
sandscooling pushed a commit to sandscooling/t3code that referenced this pull request Oct 3, 2026
…s drawer)

Carried until it lands upstream: Claude's TaskCreate, TaskUpdate and
TaskList calls become the same todo_list plan TodoWrite produces, so the
tasks drawer and the hover progress meter show them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
sandscooling pushed a commit to sandscooling/t3code that referenced this pull request Oct 3, 2026
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts Outdated
The reviewer asked that T3 Code not override the default, so CLAUDE_CODE_ENABLE_TODO_TOOLS is only set when the user configures it.
@Yash-Singh1
Yash-Singh1 merged commit a8bdfdb into pingdotgg:main Oct 10, 2026
31 checks passed
sandscooling pushed a commit to sandscooling/t3code that referenced this pull request Oct 10, 2026
…ream landed it

Upstream pingdotgg#14964 landed without the CLAUDE_CODE_ENABLE_TODO_TOOLS=1 default
the fork carried from an earlier revision, so the default and its duplicated
executable-path tests go. The variable still reaches Claude from the user's
settings or the instance environment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 11, 2026
## What's Changed
* fix(pi): preserve tool images and structured results by @StiensWout in pingdotgg/t3code#17851
* fix(server): Claude 5 task lists reach the tasks drawer by @Mnigos in pingdotgg/t3code#14964
* fix(web): find bar and thread details panel stop covering each other by @MatthewFeroz in pingdotgg/t3code#17858
* fix(web): use server metadata for file chip icons by @Yash-Singh1 in pingdotgg/t3code#17923
* fix(desktop): copy images from HTML previews by @Bil0000 in pingdotgg/t3code#17555
* docs(pi): update installation and remote login guidance by @StiensWout in pingdotgg/t3code#17836
* fix(pi): preserve native abort outcomes by @StiensWout in pingdotgg/t3code#17853
* fix(pi): keep thinking defaults specific to each model by @StiensWout in pingdotgg/t3code#17835
* fix(pi): preserve shell command exit codes by @StiensWout in pingdotgg/t3code#17834
* fix(pi): expire and cancel extension approvals by @StiensWout in pingdotgg/t3code#17840
* feat(pi): include native sessions in usage reports by @StiensWout in pingdotgg/t3code#17848
* fix(server): route Copilot ACP subagent output into subagent threads by @maria-rcks in pingdotgg/t3code#17714
* fix(web): composer banner titles truncate beside their icon instead of wrapping by @maria-rcks in pingdotgg/t3code#17699
* fix(server): Muse turns no longer fail on Windows by @ntindle in pingdotgg/t3code#17163
* fix(pi): allow known read-only T3 tools without approval by @StiensWout in pingdotgg/t3code#17852
* fix: worktree threads keep their worktree when the agent starts, and messages sent during setup queue by @maria-rcks in pingdotgg/t3code#17654
* fix(server): keep Claude workflows alive while they report progress by @maria-rcks in pingdotgg/t3code#17715
* fix(web): media preview centers its content and pins the close button by @maria-rcks in pingdotgg/t3code#17951
* fix(server): threads without a project no longer need Git installed by @t3dotgg in pingdotgg/t3code#17959
* fix(web): toggling tools and thinking at the bottom keeps you at the bottom by @t3dotgg in pingdotgg/t3code#17954
* fix(web): Compact chip follows Claude's real prompt cache TTL by @t3dotgg in pingdotgg/t3code#17945
* fix(usage): bound OpenCode history reads to prevent backend OOM by @Yash-Singh1 in pingdotgg/t3code#17961
* refactor: format diff line counts through one shared helper by @maria-rcks in pingdotgg/t3code#17948
* fix: new projects start their first thread in the project folder, not a worktree by @t3dotgg in pingdotgg/t3code#17371

## New Contributors
* @ntindle made their first contribution in pingdotgg/t3code#17163

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261010.2948...v0.0.46-nightly.20261011.2955

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261011.2955
github-actions Bot added a commit to davidvanderklay/t3code-flake that referenced this pull request Oct 11, 2026
## What's Changed
* fix(pi): preserve tool images and structured results by @StiensWout in pingdotgg/t3code#17851
* fix(server): Claude 5 task lists reach the tasks drawer by @Mnigos in pingdotgg/t3code#14964
* fix(web): find bar and thread details panel stop covering each other by @MatthewFeroz in pingdotgg/t3code#17858
* fix(web): use server metadata for file chip icons by @Yash-Singh1 in pingdotgg/t3code#17923
* fix(desktop): copy images from HTML previews by @Bil0000 in pingdotgg/t3code#17555
* docs(pi): update installation and remote login guidance by @StiensWout in pingdotgg/t3code#17836
* fix(pi): preserve native abort outcomes by @StiensWout in pingdotgg/t3code#17853
* fix(pi): keep thinking defaults specific to each model by @StiensWout in pingdotgg/t3code#17835
* fix(pi): preserve shell command exit codes by @StiensWout in pingdotgg/t3code#17834
* fix(pi): expire and cancel extension approvals by @StiensWout in pingdotgg/t3code#17840
* feat(pi): include native sessions in usage reports by @StiensWout in pingdotgg/t3code#17848
* fix(server): route Copilot ACP subagent output into subagent threads by @maria-rcks in pingdotgg/t3code#17714
* fix(web): composer banner titles truncate beside their icon instead of wrapping by @maria-rcks in pingdotgg/t3code#17699
* fix(server): Muse turns no longer fail on Windows by @ntindle in pingdotgg/t3code#17163
* fix(pi): allow known read-only T3 tools without approval by @StiensWout in pingdotgg/t3code#17852
* fix: worktree threads keep their worktree when the agent starts, and messages sent during setup queue by @maria-rcks in pingdotgg/t3code#17654
* fix(server): keep Claude workflows alive while they report progress by @maria-rcks in pingdotgg/t3code#17715
* fix(web): media preview centers its content and pins the close button by @maria-rcks in pingdotgg/t3code#17951
* fix(server): threads without a project no longer need Git installed by @t3dotgg in pingdotgg/t3code#17959
* fix(web): toggling tools and thinking at the bottom keeps you at the bottom by @t3dotgg in pingdotgg/t3code#17954
* fix(web): Compact chip follows Claude's real prompt cache TTL by @t3dotgg in pingdotgg/t3code#17945
* fix(usage): bound OpenCode history reads to prevent backend OOM by @Yash-Singh1 in pingdotgg/t3code#17961
* refactor: format diff line counts through one shared helper by @maria-rcks in pingdotgg/t3code#17948
* fix: new projects start their first thread in the project folder, not a worktree by @t3dotgg in pingdotgg/t3code#17371

## New Contributors
* @ntindle made their first contribution in pingdotgg/t3code#17163

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261010.2948...v0.0.46-nightly.20261011.2955

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261011.2955
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews size:L 100-499 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]: Claude 5 task lists never reach the UI on orchestrator v2

3 participants