You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(web): don't label Windows paths outside the workspace as relative - #28469
On Windows, a file outside the project, like an agent editing C:\Users\me\.claude\settings.json, shows up in the timeline as repo/C:/Users/me/.claude/settings.json, and "Copy relative path" on a chat file link copies that same string. formatWorkspaceRelativePath only treated paths starting with / as absolute, so a drive path fell into the relative branch and got the workspace label put in front of it.
It now skips the relative branch for Windows absolute paths too, which is what already happens to /Users/... on macOS. Paths inside the workspace are unchanged.
This is a one-line fix for an obvious display bug, so it goes under the small-fix exception in CONTRIBUTING rather than a prior issue.
Web dev server (vp run dev) from a worktree at main 8b74a69019, Windows 10, isolated .t3 state, headless Edge at 1000×640 (2x). One seeded thread whose agent changed C:\Users\demo\.claude\settings.json (outside the project) and src\config.ts (inside it). The project root ends in apps\server, so the workspace label is server. No provider ran.
Timeline, "Changed 2 files" expanded. Main: server/C:/Users/demo/.claude/settings.json. Fix: C:/Users/demo/.claude/settings.json. The file inside the project reads server/src/config.ts in both.
vp test run src/filePathDisplay.test.ts in apps/web: with main's filePathDisplay.ts the new case fails (1 failed, 1 passed); with the fix, 2 passed.
Not checked: the Electron shell, and mobile, which formats paths with its own helper in apps/mobile/src/features/files/filePath.ts and is not touched here.
Before (main 8b74a69019):
After (with this fix):
Model and harness
Claude Opus 5.5 (high effort) in Claude Code, run from T3 Code.
Macroscope's review found this PR approvable — Windows paths outside the workspace retain their absolute labels rather than receiving a misleading workspace prefix. The change is limited to displayed and copied path text, without changing file targets or stored data.
You can add or adjust custom eligibility rules. Learn more.
pingdotgg/t3code#31639: Changes the same Windows absolute path fallback behavior and adds overlapping path-formatting tests.
Suggested reviewers:t3dotgg, juliusmarminge
Merge Risk: Minimal · previous review e7de1
Windows paths outside the workspace will display as absolute paths, without the workspace label prefix. Paths inside the workspace are reported as unchanged. No merge-blocking risk remains.
Pre-merge checks: 4
Check name
Status
Explanation
Title check
The title "fix(web): don't label Windows paths outside the workspace as relative" matches the main change: Windows absolute paths outside the workspace no longer receive the workspace label in filePat…
Description check
The description covers the problem (Windows drive paths get the workspace label prefixed), the change (skip the relative branch for Windows absolute paths), scope (a small-fix exception under CONTRIBU…
Linked Issues check
Issue #27308 requires that an absolute Windows path outside the workspace stay absolute in activity headings, without the workspace basename. The reviewed head changes formatWorkspaceRelativePath in…
Out of Scope Changes check
The whole-PR diff against the merge base touches two files. apps/web/src/filePathDisplay.ts adds one guard clause to the relative-path branch. apps/web/src/filePathDisplay.test.ts adds a regression te…
Full details: Title check
Explanation
The title "fix(web): don't label Windows paths outside the workspace as relative" matches the main change: Windows absolute paths outside the workspace no longer receive the workspace label in filePathDisplay.ts. It is a conventional commit title in plain language, and it names the affected area (web) and the behavior.
Full details: Description check
Explanation
The description covers the problem (Windows drive paths get the workspace label prefixed), the change (skip the relative branch for Windows absolute paths), scope (a small-fix exception under CONTRIBUTING, with a replaced PR and a linked issue #27308), and verification (dev server captures, test results before and after). It also states what was not checked (Electron and mobile). The template's Problem, Change, Scope, Verification, and model/harness sections are all present. The linked issue and the small-fix claim are both stated, so the description is substantively complete.
Full details: Linked Issues check
Explanation
Issue #27308 requires that an absolute Windows path outside the workspace stay absolute in activity headings, without the workspace basename. The reviewed head changes formatWorkspaceRelativePath in apps/web/src/filePathDisplay.ts. The relative-path branch now also requires !isWindowsAbsolutePath(normalizedPath). A drive-qualified path such as C:/tmp/image.png no longer enters that branch, so it keeps its normalized form. isWindowsAbsolutePath (packages/shared/src/path.ts) matches C:/ after separator normalization, so the forward-slash and backslash inputs from the issue both take the fixed path. In-workspace paths still take the earlier workspace-root branch, and POSIX paths still skip the relative branch, which matches the issue's controls. The new test in apps/web/src/filePathDisplay.test.ts covers a backslash Windows path outside the workspace, a forward-slash D:/ path, and a relative path that still receives the label. The issue's scope excludes the image-visibility symptom, WSL, and Markdown escaping, and the PR does not claim to address them. Electron and mobile were not verified. Mobile uses a separate helper that the issue does not name as in scope. The PR's manual browser verification is not a coding requirement and is not assessed here.
Full details: Out of Scope Changes check
Explanation
The whole-PR diff against the merge base touches two files. apps/web/src/filePathDisplay.ts adds one guard clause to the relative-path branch. apps/web/src/filePathDisplay.test.ts adds a regression test for that branch. Both changes stay within the formatter behavior described in #27308. No unrelated files or refactors appear in the diff. The PR does not change the mobile helper, the image-visibility path, or WSL handling, and it does not claim to.
Finishing Touches
Generate unit tests (beta)
Create a new PR
Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Reviewing files that changed from the base of the PR and between b025102 and e7de164.
Files selected for processing: 1
apps/web/src/filePathDisplay.test.ts
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.
The automated pipeline stopped on this pull request and will not merge it:
the fix is written and reviewed, but proving it needs something no worker has:
Permanent blocker: Native Windows with T3 Code desktop is required for the supplied reproduction using C:/work/project and C:/tmp/image.png. This Linux VM cannot execute those steps, and the brief prohibits working around unavailable Windows. External-path labels, in-workspace labels, and relative-path controls remain unverified on both commits.
Seed a synthetic project and replay file reads for external C:/tmp/image.png and workspace-relative inside.png. Open the thread, expand its activity and Read 2 files, then inspect both labels. Environment: real web client, Chromium on Linux, 1280×800, light theme, fresh server state per commit.
The scenario fails on base and passes on head. Base prefixes the external path with project/; head retains its absolute label. Both retain project/inside.png.
Scope: shared web renderer with replayed tool activity; native Windows desktop and actual image reads were not exercised.
Not shown:
Native Windows desktop with a local Windows backend was not exercised; the scenario reproduced the label defect in the shared web client on Linux using replayed file-read activity.
The absolute in-workspace input C:/work/project/inside.png was not exercised against a Windows-rooted project; the unchanged control used workspace-relative inside.png.
Actual image creation and provider image inspection were not exercised; replay supplied synthetic tool activity through the real adapter, orchestration, server, and client.
* fix(server): Claude can show the user mid-turn text in full (pingdotgg#36384)
* fix(cli): tagged source builds report the release version (pingdotgg#36350)
Co-authored-by: Lakshmi Tanmay <[email protected]>
* fix(server): storage cleanup prunes idle No project folders under ~/.t3/scratch (pingdotgg#36369)
* fix(terminal): trimmed history no longer replays half of a control sequence (pingdotgg#36368)
* fix(usage): a re-emitted Codex snapshot is no longer billed as a counter rewind (pingdotgg#36367)
Co-authored-by: rihanaws <[email protected]>
* fix(server): a Claude Monitor line no longer wakes a delegated child's parent (pingdotgg#36339)
* fix(opencode): a lost subagent report no longer leaves a resumed call running (pingdotgg#36386)
* fix(web): a new worktree thread opened during a clone bases on the real default branch (pingdotgg#36379)
* fix(server): unauthenticated token requests no longer write DPoP replay markers (pingdotgg#36393)
* fix(server): other sites can no longer frame the web app (pingdotgg#36395)
* fix(server): a server browser tab survives a renderer crash, and a service worker badge call no longer causes one (pingdotgg#36389)
* fix(web): T3 Connect sign-in offers Retry after Clerk fails to load (pingdotgg#23620)
Co-authored-by: Claude Opus 5.5 <[email protected]>
* fix(ci): macOS PR previews no longer run the PR's bundle next to signing secrets (pingdotgg#36407)
* fix(mobile): a new thread's first message no longer returns to the composer after a lost launch reply (pingdotgg#32330)
* fix(web): size markdown media whose width and height carry a px unit (pingdotgg#32108)
* fix(web): file links the agent cited from a checkout it cd'd into open that file (pingdotgg#36364)
* ci(mobile): iOS jobs run on macos-27, store builds require the final Xcode 27.1 (pingdotgg#36421)
* fix(server): Claude context meter no longer shows an auto-compact point when auto-compaction is off (pingdotgg#36417)
* fix(web): a run waiting on foreground subagents says so instead of Thinking (pingdotgg#36334)
* fix(server): a follow-up to a delegated child waits for its awaited background work (pingdotgg#36411)
* fix(provider-grok): Grok follow-ups queue instead of cancelling the running tool (pingdotgg#36422)
* fix(server): thread list builds metadata only for the page it returns (pingdotgg#36434)
* fix(web): middle-clicking empty chat space on Linux no longer pastes into the composer (pingdotgg#36436)
* fix(web): closing Settings no longer leaves it as a back/forward stop (pingdotgg#36437)
* fix(opencode): OpenCode 1.x threads report context-window usage (pingdotgg#36430)
* fix(web): bare @ in the composer lists workspace files (pingdotgg#36435)
* fix(mobile): thread list project filter lists recently active projects first (pingdotgg#36433)
* fix(clients): live working timers count on the host's clock (pingdotgg#36420)
* perf(relay): lighter Postgres load and PS-160 cluster (pingdotgg#36442)
Co-authored-by: Claude Opus 5.5 <[email protected]>
* fix(mobile): mobile:install --session works on pooled devices (pingdotgg#36447)
* fix(native): KDE SnapShot no longer loses the first reply from KWin (pingdotgg#36218)
Co-authored-by: Claude Fable 5.2 <[email protected]>
* fix(server): t3 connect status no longer reports a publish-only link as exposed (pingdotgg#33967)
* fix(web): don't label Windows paths outside the workspace as relative (pingdotgg#28469)
Co-authored-by: Julius Marminge <[email protected]>
* fix(server): multi-line guest messages are no longer refused or stored with CRLF (pingdotgg#26542)
* perf(desktop): provider checks no longer compete with server startup (pingdotgg#35712)
Co-authored-by: Claude Opus 5.5 <[email protected]>
* fix(web,mobile): explain missing file access for host videos (pingdotgg#24637)
* fix(scripts): iOS scenarios prepare the dev client before leasing a device (pingdotgg#36456)
* perf(server): a new thread's first turn starts sooner (pingdotgg#35710)
Co-authored-by: Claude Opus 5.5 <[email protected]>
* fix(provider-pi): running shell output no longer stores a snapshot row per update (pingdotgg#36429)
* fix(web): NVDA browse mode reads the current thread's branch, not the previous one (pingdotgg#34446)
Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
* fix(server): T3 Connect clients are named "T3 Connect", not "T3 Connect connect" (pingdotgg#27887)
* fix(web): screen readers read the Update everything machine list as a table (pingdotgg#36445)
* feat: agents can restyle T3 Code with theme colors and CSS (pingdotgg#35247)
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Claude Fable 5.2 <[email protected]>
* fix(mobile): long-pressed iOS blockquotes no longer draw over the thread (pingdotgg#36461)
* fix(cli): npm launcher no longer leaves a runtime running after a stop signal (pingdotgg#30487)
* feat(connect): require approval for new T3 Connect devices (pingdotgg#36419)
Co-authored-by: Claude Opus 5.5 <[email protected]>
* fix(server): run the Azure CLI in UTF-8 on Windows (pingdotgg#25801)
Co-authored-by: Julius Marminge <[email protected]>
* fix(server): preview navigation leaves a page whose script never yields (pingdotgg#36365)
* fix(server): the auto-settle sweep no longer rereads every idle branch every few minutes (pingdotgg#36371)
* fix(web): rewind no longer offers file restore in project-folder threads (pingdotgg#36467)
* fix(server): stop the relay client a crashed server left running (pingdotgg#36465)
* fix(server): read Azure DevOps pull request templates (pingdotgg#22881)
* perf(azure-devops): PR Code tab loads a page's files in one az run instead of two per file (pingdotgg#35295)
Co-authored-by: Julius Marminge <[email protected]>
* fix(web): copying a file preview selection returns the selected lines after scrolling (pingdotgg#36466)
* fix(mobile): push-token failures no longer report notifications as enabled (pingdotgg#26557)
* fix(provider-core): mise updates a tool configured by its backend name (pingdotgg#36472)
* fix(server): parent turns no longer duplicate delegated task thread items (pingdotgg#36473)
* fix(server): Windows drive paths open under WSL (pingdotgg#26030)
* fix(client-runtime): new T3 Connect machines appear without signing in again (pingdotgg#29788)
* fix(azure-devops): local pull request checkout no longer fails on --detect (pingdotgg#31170)
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
* fix(usage): count shared Windows and WSL transcripts once (pingdotgg#24319)
* fix(azure-devops): pull requests report build validation as checks (pingdotgg#31146)
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Julius Marminge <[email protected]>
* fix(desktop): WSL backend starts in distros without automounted drives (pingdotgg#25734)
* fix(server): t3 browser setup reloads an AppArmor profile that is on disk but not loaded (pingdotgg#36490)
* Initial plan
* fix(azure-devops): finish reconciling nightly diff tests
Remove retired files-diff code and update mocks for iteration changes and blob reads. Preserve bounded paging, cache, and error-path coverage.
Co-authored-by: Copilot <[email protected]>
---------
Co-authored-by: Julius Marminge <[email protected]>
Co-authored-by: Lakshmi Tanmay <[email protected]>
Co-authored-by: rihanaws <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: Theo Browne <[email protected]>
Co-authored-by: ValeraZSD <[email protected]>
Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: nibarAhmed <[email protected]>
Co-authored-by: maria-rcks <[email protected]>
Co-authored-by: Pedro Henrique <[email protected]>
Co-authored-by: Kieren-Foenander <[email protected]>
Co-authored-by: Pavel Kroupa <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: Alex Vallone <[email protected]>
Co-authored-by: Copilot <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
size:XS0-9 changed lines (additions + deletions).vouch:unvouchedAuthor is not yet trusted in the VOUCHED list.
2 participants
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
On Windows, a file outside the project, like an agent editing
C:\Users\me\.claude\settings.json, shows up in the timeline asrepo/C:/Users/me/.claude/settings.json, and "Copy relative path" on a chat file link copies that same string.formatWorkspaceRelativePathonly treated paths starting with/as absolute, so a drive path fell into the relative branch and got the workspace label put in front of it.It now skips the relative branch for Windows absolute paths too, which is what already happens to
/Users/...on macOS. Paths inside the workspace are unchanged.This is a one-line fix for an obvious display bug, so it goes under the small-fix exception in CONTRIBUTING rather than a prior issue.
Replaces https://git.cafe/pingdotgg/t3code/pulls/13414, which was closed for missing captures. The captures were added there on 20 Oct with a reconsideration request; this is the same fix rebuilt on current main, as the closure guide's replacement route.
Verification
Web dev server (
vp run dev) from a worktree at main8b74a69019, Windows 10, isolated.t3state, headless Edge at 1000×640 (2x). One seeded thread whose agent changedC:\Users\demo\.claude\settings.json(outside the project) andsrc\config.ts(inside it). The project root ends inapps\server, so the workspace label isserver. No provider ran.server/C:/Users/demo/.claude/settings.json. Fix:C:/Users/demo/.claude/settings.json. The file inside the project readsserver/src/config.tsin both.vp test run src/filePathDisplay.test.tsinapps/web: with main'sfilePathDisplay.tsthe new case fails (1 failed, 1 passed); with the fix, 2 passed.Not checked: the Electron shell, and mobile, which formats paths with its own helper in
apps/mobile/src/features/files/filePath.tsand is not touched here.Before (main
8b74a69019):After (with this fix):
Model and harness
Claude Opus 5.5 (high effort) in Claude Code, run from T3 Code.
Fixes #27308