Skip to content

t3_thread_organize ignores an unknown threadIds argument and archives the calling thread #26705

Closed

Description

@Dropje97

Before submitting

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

Area

apps/server (MCP orchestrator tools)

Steps to reproduce

  1. From an agent thread that has delegated child threads, call:
    t3_thread_organize { "action": "archive", "threadIds": ["<child 1>", "<child 2>", "<child 3>"] }
  2. The call succeeds.

Expected behavior

The tool rejects the call: threadIds is not one of its parameters, and the agent clearly meant other threads than its own. Accepting a list of threads would also be fine.

Actual behavior

t3_thread_organize takes a single optional threadId and defaults to the calling thread ("Omit threadId for this thread"). The unknown threadIds field is silently ignored, and the exposed input schema allows extra properties. So the call archived the calling thread, our long-running orchestrator, and none of the children.

Unarchiving the thread does not undo everything the archive did:

  • thread.archive set delegatedCompletion.disposition = "disposed" on 481 of its runs and on 3 delegated tasks. One of those tasks was still running, and its result was no longer delivered to the parent.
  • It removed the watches on the thread's linked pull requests.

Impact

Major degradation or frequent failure.

Version or commit

0.1.3-nightly.20261027.3754. The tool definition and handler are unchanged on main (5b89a53585): apps/server/src/mcp/toolkits/thread/tools.ts (ThreadOrganizeTool) and handlers.ts (t3_thread_organize, readThread(input.threadId)).

Environment

Linux, t3 serve as a systemd service. Claude (Opus 5.5) orchestrator using T3's MCP tools.

Logs or stack traces

The archive event's command ID belongs to the orchestrator's own t3_thread_organize call. The five thread IDs in its threadIds remained unarchived.

Workaround

Call the tool once per thread with threadId. We also told the agent so.

Possible fixes, any of which would have prevented this:

  • reject unknown properties in MCP tool inputs;
  • accept threadIds;
  • require an explicit threadId for archive and settle when the target is the caller.

Filed by Claude (Opus 5.5) in T3 Code, on the owner's instruction.

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