Repository navigation
Description
What happened
t3_thread_list with a projectId that does not exist returns a successful, empty result instead of an error. An agent that passes a wrong id sees {"projectId":"<unknown id>","threads":[],"nextCursor":null,"total":0} and concludes that the project exists and simply has no threads.
In our case this happened right after t3_thread_launch had failed for the same unknown id with the generic "The operation could not be completed." (#29094). The agent called t3_thread_list to verify the target, got a clean empty list, and retried the launch six times before giving up and reporting a T3 bug to the user.
Diagnosis
listThreads in apps/server/src/mcp/OrchestratorMcpService.ts (v0.1.6, 2359643c; unchanged on main at d01b92c0) resolves the target with resolveProjectTarget(parent, input.projectId) and passes the id straight to threadManagement.listProjectThreads. Nothing checks that the project exists. The same file has requireProject, which other launch paths and t3_project_read use to return invalid_request with "Project … was not found."
Steps to reproduce
- In any thread, have the agent call
t3_thread_listwithprojectIdset to a random UUID (or a mistyped real id) andlimit: 5. - Read the tool result.
Expected: an invalid_request failure saying the project was not found, as t3_project_read returns.
Actual: success with threads: [] and total: 0.
Version
Desktop app 0.1.6 (2359643c), local server 0.1.6. Triage CLI 0.1.6.
Environment
macOS arm64 (Darwin 27.0.0), T3 Code desktop app against the local server, Claude Agent provider (claude-opus-5-5).
Evidence
Provider event log of the calling thread, 2026-11-02 07:47:41Z:
call: mcp__t3-code__t3_thread_list {"projectId":"20b75d6f-f2cf-4ea1-99b3-3eb11969a3a9","titleContains":"gitleaks","limit":5}
result: {"projectId":"20b75d6f-f2cf-4ea1-99b3-3eb11969a3a9","currentThreadId":"thread:project:mcp%3A…","threads":[],"nextCursor":null,"total":0}
`projection_projects` has no row with that id. The real project the agent meant is `20b75d6f-2e40-4ac8-ad1a-5a2dac05e39d`; the tail came from a neighbouring project's id in an earlier `t3_project_list` result.Related issues
#29094 (the launch tool hides "Project not found." behind a generic message). The two together left the agent with no way to learn that its project id was wrong.
Fix applied or workaround
Call t3_project_read or t3_project_list to check the id before listing or launching.
Filed by
Filed via t3 triage by Claude Fable 5.1 in Claude Code.
Activity
ashish10alex commentedon Nov 10, 2026
(Posted by Antigravity
gemini-4-argon-highvia T3 Code triage on behalf of @ashish10alex)Additional reproduction & trace evidence on
0.1.9-nightly.20261110.4491(1a2a4a5e9684585c31eb55c1974fb32f8b1db2b7, macOS 15.8.1 arm64):During the same external MCP session (
server.trace.ndjson.1:5713,6057), aftert3_thread_launchfailed withorchestration_errorfor a corruptedprojectId(219cc563-c857-4251-b6ec-8c2bfb27e44ccinstead of219cc563-c857-4251-b763-34f2832c44cc), the caller tried to verify the project's threads via:{"projectId": "219cc563-c857-4251-b6ec-8c2bfb27e44cc", "limit": 20}OrchestratorMcpService.listThreads(apps/server/src/mcp/OrchestratorMcpService.ts:2911-2948) filteredthis.deps.ReadModel.threadswithout callingthis.requireProject(input.projectId)and returned{"threads": [], "total": 0}instead ofnot_found. Combined withcheck_worktree_basereturningreadyfor the same bogusprojectId(#29094), this masked the badprojectIdcompletely.