Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

"Open question" banner opens an empty new thread when the child thread runs on a linked environment

Open Beginner friendly
#27,005 2 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
74/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
typescript
Domain
frontend

Research direction

Start with apps/web/src/components/chat/ThreadActivityBanners.tsx and apps/web/src/components/chat/useThreadLifecycle.tsx, then read the EnvironmentThreadShell definition in packages/client-runtime/src/state/models.ts. Trace how the child thread’s environment is passed when opening it, including the background-work banner. Done when clicking the cross-environment child banner opens that child thread in its own environment; check any relevant tests in these files’ areas.

Written by the indexing model from the issue text.

Description

What happened

Feature: Linked environments, a beta behind Settings → Labs.

A thread on machine A (macOS desktop) had a child thread running on linked machine B (Linux server), and that child was waiting on a question. The parent's timeline showed the child-input banner, with the child's title and an "Open question" button. Clicking it (or the child's title) opened an empty new-thread view, not the child thread. Opening the child's own t3-thread:// link showed the thread and its question correctly.

Diagnosis

The banner sends only the child's thread id. The click handler then pairs that id with the parent's environment:

  • childInputNowItem (apps/web/src/components/chat/ThreadActivityBanners.tsx:52 and :60) calls onOpenThread(child.id) / onOpenThread(first.id). Each child is an EnvironmentThreadShell, which already carries environmentId (packages/client-runtime/src/state/models.ts:138), but that id is dropped here.
  • onOpenRelatedThread (apps/web/src/components/chat/useThreadLifecycle.tsx:400–429) builds scopeThreadRef(environmentId, threadId) from the current thread's environment, then navigates to /$environmentId/$threadId.
  • childThreadInputsAtom (packages/client-runtime/src/state/threadShell.ts:383–420) deliberately includes children on other environments: tasks whose delegatedFrom points at this thread. For those, the route becomes /<A>/<B's thread id>, a thread A doesn't have.
  • Because the server sends shellThreadFamilies: true (apps/server/src/ws.ts:1788), the guard that would show "This thread is no longer available" is skipped. The app navigates anyway and lands on a blank thread/draft view.

Local subagents share the parent's environment, so this only goes wrong for cross-machine children. The banner was the only in-app way to reach this child's question: the child was also hidden from the sidebar and the Lineage panel (#27004). So the user had no working path to answer it.

Steps to reproduce
  1. Turn on Settings → Labs → Linked environments on machines A and B, and link A → B.
  2. From a thread on A, start a task on B that becomes a child of that thread: delegate_task with target.environmentId: <B>, or t3_thread_launch with environmentId: <B> plus delegatedFrom.
  3. Make the child ask a question or request an approval. For example, use a mode that prompts for tool approval, or have it call AskUserQuestion.
  4. In the desktop app, open the parent thread on A. The banner "Subagent needs input · · Open question" appears.
  5. Click Open question. Expected: B's child thread opens. Actual: an empty new-thread view for environment A opens.
Version

0.1.5-nightly.20261029.3877 (desktop app and both servers). The same code is on main as of 2026-10-29.

Environment

A: macOS (Darwin 27.0.0, arm64), desktop app 0.1.5-nightly.20261029.3877, Node 24.22.1. B: Linux x64 server 0.1.5-nightly.20261029.3877. Provider claudeAgent (claude-opus-5-5).

Evidence
# apps/web/src/components/chat/ThreadActivityBanners.tsx
<InlineButton tone="muted" onClick={() => onOpenThread(child.id)}>   # environmentId dropped
<InlineButton onClick={() => onOpenThread(first.id)}>

# apps/web/src/components/chat/useThreadLifecycle.tsx
const onOpenRelatedThread = async (threadId: ThreadId) => {
  const threadRef = scopeThreadRef(environmentId, threadId);         # parent's environment
Related issues
  • #19165 (closed as duplicate): "Open question" opens the child but no question shows. Different symptom: there the right thread opened.
  • #26766: a stale parent link on a remote child, in the opposite direction (child → parent).
  • #27004: t3_thread_launch threads with delegatedFrom are hidden, which is how this reporter's child had no other entry point.
Fix applied or workaround

None applied. Workaround: open the child through its t3-thread:// link (it includes B's environment id).

Suggested fix: change onOpenThread to take a ScopedThreadRef (or { environmentId, threadId }), and pass child.environmentId from childInputNowItem. The background-work banner's Open button (ThreadActivityBanners.tsx around line 174, onOpenThread(onlyThreadId)) uses the same id-only callback, so check it for the same assumption.

Filed by

Claude Code (claude-opus-5-5) via T3 Code triage

Dominant language
TypeScript
Stars
24.8k
Forks
6.4k
Avg merge
3h 20m
Merged PRs (30d)
208

Getting set up

Open in Codespaces

Starts the project's dev container in your browser, under your own GitHub account.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from pingdotgg/t3code

All issues in pingdotgg/t3code

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.