"Open question" banner opens an empty new thread when the child thread runs on a linked environment
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:52and:60) callsonOpenThread(child.id)/onOpenThread(first.id). Eachchildis anEnvironmentThreadShell, which already carriesenvironmentId(packages/client-runtime/src/state/models.ts:138), but that id is dropped here.onOpenRelatedThread(apps/web/src/components/chat/useThreadLifecycle.tsx:400–429) buildsscopeThreadRef(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 whosedelegatedFrompoints 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
- Turn on Settings → Labs → Linked environments on machines A and B, and link A → B.
- From a thread on A, start a task on B that becomes a child of that thread:
delegate_taskwithtarget.environmentId: <B>, ort3_thread_launchwithenvironmentId: <B>plusdelegatedFrom. - 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.
- In the desktop app, open the parent thread on A. The banner "Subagent needs input · · Open question" appears.
- 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_launchthreads withdelegatedFromare 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
Starts the project's dev container in your browser, under your own GitHub account.
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from pingdotgg/t3code
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
pingdotgg/t3code#27445 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
pingdotgg/t3code#27146 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
pingdotgg/t3code#27022 · 1 comment ·
Maintainers usually reply within 1 day
All issues in pingdotgg/t3code
Similar issues
-
area:cli bug P4
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
bug from-studio
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
esengine/DeepSeek-Reasonix#14868 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
loopbackio/loopback-next#11878 ·
Maintainers usually reply within 2 days
-
bug 🐛
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
comunica/comunica#1925 · 1 comment ·
Maintainers usually reply within 1 day