Before submitting
Area
apps/server
Steps to reproduce
- Use the Claude provider in the desktop app with a repository whose
.claude/skills/ is gitignored. Ours is gitignored on purpose; a new worktree gets it from a Claude Code SessionStart hook that symlinks .claude/skills from the main checkout.
- Start a new thread in New worktree mode and send the first message. T3 runs
git worktree add, starts the Claude session, and the hook creates <worktree>/.claude/skills within the same second.
- In that thread, type
$ in the composer.
Expected behavior
The $ picker lists the project skills from <worktree>/.claude/skills, the same ones Claude Code itself loads in that session.
Actual behavior
The picker shows only the user-scope skills from ~/.claude/skills, and it stays that way for the life of the server process. Claude Code in the same thread does see the project skills: they are in the session's skill listing, and typing $name by hand still invokes them. A thread whose worktree already existed when T3 started shows all project skills, which is how we noticed the difference (two threads created after the last app launch are affected, one created before it is not).
Mechanism, read from ProviderRegistry.refreshWorkspaceSnapshot and ClaudeDriver.snapshotForCwd: the workspace snapshot for a cwd is scanned once, and every later call returns early because a snapshot for that cwd already exists. If the first scan runs before .claude/skills is present in the new worktree, the empty project list is cached for that cwd. In server.trace.ndjson every refreshWorkspaceSnapshot span for the affected thread lasts 0.005 to 0.017 ms and has no discoverClaudeSkills child, so the folder is never read again.
#14542 (merged 2026-10-01) adds Restart agent session with a fresh rescan, which should work around this by hand. Nothing rescans automatically, so every new worktree thread starts with a picker that is missing the project skills until the user knows to run it. This is the skills counterpart of #11575, where the same early return freezes the / menu.
A possible fix: rescan the workspace snapshot when a thread's provider session starts (after its hooks have run), or treat a snapshot whose project root did not exist or was empty as stale.
Impact
Minor bug or occasional failure
Version or commit
Desktop 0.0.44; the early return is still on main @ 921cb3c without the fresh flag.
Environment
macOS 27, T3 Code desktop 0.0.44, Claude Code 2.1.286, Claude provider (Fable 5.1 and Opus 5.5).
Workaround
Type the skill name in full ($name), or restart the T3 app. On builds with #14542, Restart agent session from cmd+k should rescan.
Before submitting
Area
apps/serverSteps to reproduce
.claude/skills/is gitignored. Ours is gitignored on purpose; a new worktree gets it from a Claude CodeSessionStarthook that symlinks.claude/skillsfrom the main checkout.git worktree add, starts the Claude session, and the hook creates<worktree>/.claude/skillswithin the same second.$in the composer.Expected behavior
The
$picker lists the project skills from<worktree>/.claude/skills, the same ones Claude Code itself loads in that session.Actual behavior
The picker shows only the user-scope skills from
~/.claude/skills, and it stays that way for the life of the server process. Claude Code in the same thread does see the project skills: they are in the session's skill listing, and typing$nameby hand still invokes them. A thread whose worktree already existed when T3 started shows all project skills, which is how we noticed the difference (two threads created after the last app launch are affected, one created before it is not).Mechanism, read from
ProviderRegistry.refreshWorkspaceSnapshotandClaudeDriver.snapshotForCwd: the workspace snapshot for a cwd is scanned once, and every later call returns early because a snapshot for that cwd already exists. If the first scan runs before.claude/skillsis present in the new worktree, the empty project list is cached for that cwd. Inserver.trace.ndjsoneveryrefreshWorkspaceSnapshotspan for the affected thread lasts 0.005 to 0.017 ms and has nodiscoverClaudeSkillschild, so the folder is never read again.#14542 (merged 2026-10-01) adds Restart agent session with a
freshrescan, which should work around this by hand. Nothing rescans automatically, so every new worktree thread starts with a picker that is missing the project skills until the user knows to run it. This is the skills counterpart of #11575, where the same early return freezes the/menu.A possible fix: rescan the workspace snapshot when a thread's provider session starts (after its hooks have run), or treat a snapshot whose project root did not exist or was empty as stale.
Impact
Minor bug or occasional failure
Version or commit
Desktop 0.0.44; the early return is still on
main@ 921cb3c without thefreshflag.Environment
macOS 27, T3 Code desktop 0.0.44, Claude Code 2.1.286, Claude provider (Fable 5.1 and Opus 5.5).
Workaround
Type the skill name in full (
$name), or restart the T3 app. On builds with #14542, Restart agent session from cmd+k should rescan.