Repository navigation
Description
What happened
With two linked Macs, the desktop app and the iPhone app list different threads and show different section counts for the same environments. For example, Working, Snoozed and Settled read 7 / 13 / 662 on the desktop and 5 / 13 / 677 on the phone. Tasks one Mac delegates to the other through Linked environments sit under their parent on the desktop (Lineage panel). On the phone they appear as ordinary top-level threads, mostly in Done or idle. The user saw the same thread (QA video: …, a task delegated from the M1 to the M4) under its parent on the desktop and as a standalone thread on the phone.
Diagnosis
The two clients decide which threads belong in the thread list differently:
- Desktop:
filterSidebarV2VisibleThreads(apps/web/src/components/Sidebar.logic.ts) hides a thread whenisShownUnderParent(ref, lineage, delegatedUnderParent)is true. That covers native subagents and tasks a linked environment delegated, whose parent the client also lists (environmentThreadShells.delegatedUnderParentAtom). - Mobile: the thread list (
apps/mobile/src/features/threads/threadListV2.ts, around line 268) hides onlylineage.relationshipToParent === "subagent". The same check is used inCommandPalette.tsxanduseLinkedPullRequestActions.ts. A cross-machine delegated task hasdelegatedFromset but is not asubagent, so the phone lists it at top level.
So every cross-machine delegate is counted twice across the two clients: nested on the desktop, top-level on mobile.
Steps to reproduce
- Link machine A to machine B.
- From a thread on A, run
delegate_taskwithtarget.environmentId = Band let it finish. - Desktop: the child appears in the parent's Lineage panel, not in the sidebar.
- iPhone app: the child appears as its own row in the thread list, and section counts differ from the desktop's.
Version
0.1.4-nightly.20261028.3841 (desktop and server on both Macs). iOS app version unknown.
Environment
Two Macs on macOS 26 (Darwin 25.5.0, arm64), linked over Tailscale. iPhone running the T3 Code app.
Evidence
# apps/web/src/components/Sidebar.logic.ts
!isShownUnderParent({ environmentId, threadId }, thread.lineage, delegatedUnderParent)
# apps/mobile/src/features/threads/threadListV2.ts
if (thread.archivedAt !== null || thread.lineage.relationshipToParent === "subagent") return false;Related issues
- Revoking a linked environment's token under Authorized clients breaks the link silently, and the other machine still shows it as reachable #26772: same pair of machines, separate linked-environment problems.
- [Bug]: Lineage panel hides which account a subagent runs on (no account badge) #24831: Lineage panel shows no account badge. A machine badge, suggested below, is the same idea.
- [Bug]: Thread details panel folds the subagents a thread just ran into "Previous agents", so they look gone #26411: the "Previous agents" folding.
- [Bug]: Deleting a parent leaves a remote child with a stale parent link and no error feedback #26766: stale parent link on a remote child.
No existing issue covers how mobile classifies delegated tasks.
Suggested direction
Minimum fix (parity): use isShownUnderParent with delegatedUnderParent in the mobile thread list, command palette and section counts too, so both clients treat cross-machine delegates the way they treat subagents.
UI suggestions from the user (desktop Lineage panel):
- Give delegates their own drawer. Today, cross-machine delegates sit in a loose list right under the collapsible "Previous agents" drawer, as rows like
M1… on Local's MacBook Pro · Done. Put them in a "Delegated threads" drawer of their own that folds the same way, and make the rows open the thread just as subagent rows do. - Or merge them into the agents drawer. Treat a cross-machine delegate as a subagent that happens to run on another machine. It goes into the same "Previous agents" drawer as native subagents, of any provider family.
- Show a machine icon instead of the text. In either layout, swap the wide
on <machine label>text for the environment's own icon (the per-environment icon setting, e.g.laptop, which the sidebar already uses to mark other-machine threads), placed next to the duration (2m) the way subagent rows show it. That keeps rows short and the title readable. Today the title gets cut toM1…orTer….
Fix applied or workaround
None. This is display only, and no work is lost.
Filed by
Claude Code (claude-opus-5-5), triage session started from T3 Code Desktop
Activity
juliusmarminge commentedon Oct 29, 2026
Checked on current
main(dac8b11): the mobile app already nests these tasks under their parent. The fix landed in 594f1ce (#16719, 2026-10-27), the PR that addeddelegate_taskto linked environments.The mobile home list does not read raw shells. It reads
environmentThreadShells.navigationThreadShellsAtom(apps/mobile/src/features/home/HomeRouteScreen.tsx), which drops a thread whenisShownUnderParent(ref, lineage, delegatedUnderParent)is true. That is the same predicate and the samedelegatedUnderParentAtomthe desktop sidebar uses. TherelationshipToParent === "subagent"check inthreadListV2.tsonly sees threads that have already passed that filter.What I ran: a two-environment harness (parent on
m1, task delegated tom4withdelegatedFromset). I fed the shared navigation atom into the mobilebuildThreadListV2Items, with three cases:The right-hand column is the behaviour you saw: an extra top-level row and inflated section counts. An iPhone build older than https://git.cafe/pingdotgg/t3code/pulls/16719 does not know
delegatedFrom, so it lists every delegated task on its own. A mobile build from currentmainnests them, matching the desktop. Closing as fixed on main. If a mobile build that includes https://git.cafe/pingdotgg/t3code/pulls/16719 still lists them, please reopen with its version from Settings.seankoji commentedon Oct 29, 2026
Desktop-only follow-up to the UI observations in this report. The closure above establishes mobile sidebar nesting; it does not address the completed remote rows in the desktop Lineage panel.
Observed on 29 October 2026: the panel shows a running local agent, a collapsed “Previous agents” group with a count, then multiple completed cross-environment dispatches as separate “Done” rows below that group. The screenshot therefore shows completed remote dispatches outside the collapsed section, rather than inside it. Local server reports
0.1.4-nightly.20261029.3853; the desktop client build was not independently identified.Source inspection supports this distinction at 6d82a22:
remoteChild, without a status filter.Minimal reproduction to verify:
Expected: completed remote dispatches have a clear, collapsible history grouping consistent with local completions, or their own explicitly labelled section. Actual screenshot/source: remote completions remain a loose list below the local-history drawer. This makes the drawer's scope and count misleading and clutters long multi-environment runs.
This is a desktop grouping inconsistency, separate from the mobile navigation fix and from #26411's request to keep recent local completions visible. No task loss, incorrect completion status or provider failure is established. The screenshot is user-supplied; I did not run a fresh UI replay or inspect the installed frontend bundle. No app changes were made, and the original screenshot is withheld because its task titles contain private project context.
Investigated with Codex gpt-6.1-sol, high effort, in T3 Code.