Skip to content

Mobile: thread links written as [label](<t3-thread://…>) render as broken text #28473

Closed

Description

@EtanHey

What happened

On iPhone, an agent's reply showed I sent it to orc ([thread](Thread no longer available)):. The literal brackets and parentheses were visible, and the target thread existed.

Diagnosis

The agent wrote a labeled thread link whose destination is in angle brackets: [thread](<t3-thread://v2/<env>/<id>>). That's valid CommonMark. Agents produce it naturally, because T3's MCP tools return link values already wrapped as <t3-thread://…>, and the instructions say to use them verbatim.

relabelThreadLinks (packages/shared/src/threadLinks.ts, used by the mobile thread feed through useLiveThreadLinkLabels) only recognizes [label](t3-thread://…) and a bare <t3-thread://…>. For [label](<t3-thread://…>), THREAD_LINK_OUTSIDE_CODE matches only the inner autolink and rewrites it on its own, so:

  • if the title resolves: [label]([Title](t3-thread://…)) (a nested, broken link)
  • if it doesn't: [label](Thread no longer available) (the screenshot)

The web client doesn't call relabelThreadLinks, so this is mobile-only.

Steps to reproduce

  1. In any thread, have the agent reply with See [the fix](<t3-thread://v2/<environmentId>/<threadId>>)., or play it through the Replay (dev) provider.
  2. Open that thread in the iOS app.
  3. The reply shows See [the fix](Thread no longer available). and not a link.

Deterministic at the function level:

relabelThreadLinks("[Kept](<t3-thread://v2/local/t1>)", local, () => undefined)
// main: "[Kept](Thread no longer available)"

Version

Seen on the iOS app against a server on 0.1.6-nightly.20261029.3892. Reproduced in an iOS 27 simulator on current main (8b74a690). iOS app build version unknown.

Environment

macOS (M4 Max) T3 Code Desktop nightly as the server; T3 Code iOS app; iOS 27.0 simulator (iPhone 18 Pro) for the repro.

Evidence

Simulator, same message, current main:

before

Related issues

Fix applied or workaround

None on the machine. Fix PR to follow: accept an optional <…> around the destination in the labeled-link pattern.

Filed by

🤖 Generated with Claude Opus 5.5 in T3 Code Nightly, on behalf of Etan

Activity

  1. 1-ashraful-islam commented on Nov 1, 2026

    @1-ashraful-islam

    same! its seems like happening for 100% of cases for me since updating to 0.1.5 (currently in 0.1.6)

    possible cause
    image

  2. mchalszczepan-png commented on Nov 2, 2026

    @mchalszczepan-png

    Seen on Android too, not only iOS. An assistant message had [Worker A](<t3-thread://v2/<environmentId>/mcp:launch:<hex>>) links, using the exact link value from t3_thread_read. The Android phone client showed the literal text [Worker A](Thread no longer available), not tappable. Desktop showed the same message correctly. The links were inside a Markdown table, which matches the angle-bracket form described here and not a table-specific problem (not tested outside a table).

    Server and web bundle: 0.1.6-nightly.20261031.3977 on Linux. The Android app version was not captured. The target threads existed and were running.

  3. skyfallstatus commented on Nov 2, 2026

    @skyfallstatus

    Same bug on iPhone, from a delegate_task child link. The stored message contains a [separate agent](<t3-thread://v2/<environmentId>/thread:delegated-task:command%3Amcp%3A…>), and the app shows [separate agent](Thread no longer available), wrapped across two lines. The child thread existed and was running. THREAD_LINK_OUTSIDE_CODE on main @ d833184 still has no angle-bracket form for labeled links.

    That phone is on App Store build 202, whose last OTA predates #26485, which is probably why a running thread got the "no longer available" text (not confirmed on the device). A working title lookup doesn't fix this form. relabelThreadLinks on main then gives [separate agent]([Child title](t3-thread://…)), which still isn't a usable link.

    This form is common: 88 of 263 thread links stored in assistant messages in one local database used [label](<…>), across 14 threads. delegate_task returns link as <t3-thread://…> and T3's instructions say to use it verbatim, but they give no labeled form, so agents still wrap it.

    #28476 fixes the output in both cases. Results are in a comment on #29494, which needs this fix alongside it.

    Reported by Claude (Opus 5.5) in T3 Code at the user's request. Edited on 2 November to correct the count and add the build detail.

  4. Blazenetic commented on Nov 5, 2026

    @Blazenetic

    Additional matching occurrence on T3 mobile 2.2.0, reported on 5 November 2026. The user confirms the output is plain text and cannot be used to open the target by tapping.

    The saved assistant message uses this exact Markdown shape, with private identifiers redacted:

    An [independent Sol 6.1 high/fast review](<t3-thread://v2/ENV/thread:delegated-task:command%3Amcp%3A…>) is running…
    

    The user's rendered message instead contains [independent Sol 6.1 high/fast review](Thread no longer available).

    The user confirms that the same thread references display as correct links and open normally in the T3 desktop app used for this conversation. For these reported examples, the failure is visible only on mobile. This desktop/mobile comparison is user-reported, not an automated client test.

    During investigation, reading its exact destination through t3_thread_read succeeded and returned RUNNING, archived: false, settled: false. The returned v2 link matches the saved destination and names the same environment. The thread was therefore present at readback; this was not only a finished-child case.

    Connected Linux host at investigation: 0.1.8-nightly.20261104.4165. Mobile app 2.2.0 on Android 16 / NothingOS 4.1 is user-confirmed; numeric native build and installed JS/OTA fingerprint are unknown. No controlled client reproduction, agent-run desktop/mobile test, screenshot capture, update, cache reset or local patch was performed. This corroborates the reported Markdown form and loss of navigation without claiming a device-level root-cause confirmation.

    The mobile app connects to the environment through NetBird VPN. The user reports that this connection usually works well for other T3 functionality; no VPN cause is established.

    The same user also encountered plain autolinks to completed children showing unavailable text; that separate evidence is recorded at #29458 (comment).

    Private thread IDs and surrounding project/conversation contents are omitted.

    Posted by GPT-6.1 Sol through the Codex harness in T3 Code, at the user's explicit request.

  5. juliusmarminge commented on Nov 9, 2026

    @juliusmarminge
    Member

    Thanks for the detailed report! #30709, merged as f558007b20, fixes the angle-bracketed thread-link rendering.

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