Repository navigation
[Bug]: Workspace snapshot taken before the first Claude probe finishes leaves the / menu without provider commands for the whole session #11575
Description
Activity
Thanks for the unusually precise write-up — the race is real on current
main(20363c3).Confirmed. The restored thread mounts and asks for a workspace snapshot while Claude’s managed provider is still
makePendingClaudeProvider(slashCommands: [], “status has not been checked in this session yet”).ClaudeDriver.snapshotForCwdcopies that placeholder and only overlays filesystemskills, soupsertProviderWorkspaceSnapshotstores an empty command list for that cwd.refreshWorkspaceSnapshotthen returns early whenever a snapshot for the cwd already exists, and background health checks only replace the machine-level snapshot (mergeProviderSnapshotkeepsworkspaceSnapshots). The client prefers the workspace list (resolveProviderSlashCommandsForCwd), and also stops retrying once any snapshot exists. That is why later-opened threads are fine and the restored one is stuck for the process lifetime.Error snapshots are already discarded (
scopedSnapshot.status === "error"). The pending probe iswarning+installed: false, so it is treated as a valid catalog.Surfaces
- Web/desktop
/menu: affected (composer uses the cwd resolver). - Mobile: currently reads machine-level
slashCommands, so it may recover after the probe. feat(providers): expose native slash commands across clients #11519 would put mobile on the same resolver and inherit this. - Other drivers use the same
{ ...getSnapshot, skills }cwd snapshot. Claude is the worst case becauseplugin:skillentries only arrive from the capability probe. - Remote/relay: same server-side race.
Related, not duplicates
- [Bug]: Provider refresh does not update cached skills after installing skills or plugins #11497 / fix(server): refresh workspace skills with provider status #11532 — same “never revisit workspace snapshots” rule, from explicit refresh. fix(server): refresh workspace skills with provider status #11532 only invalidates on
refreshOneSourceand retains workspace catalogs on background snapshot updates. The first Claude probe is a background publish, so that PR does not fix this launch race. - [Bug]: One failed Claude capability probe empties the slash-command menu for 5 minutes and persists the empty list #7111 / fix(claude): keep last good slash commands after a failed probe #7175 — failed probe emptying the machine-level list. Here the probe succeeds.
- [Bug]: Plugin-provided Claude skills (e.g. mattpocock-skills) never appear in the
$picker #5622 —$picker / filesystem skill discovery. Unaffected.
Fix (server, not client)
- Do not store a workspace snapshot while the machine snapshot is still the pending placeholder (same shape as the existing error skip). Clients already retry when no snapshot exists.
- When machine-level
slashCommandschange, refresh or patch existing workspace snapshots for that instance.
Workaround stands: toggle a Claude setting (instance rebuild drops workspace snapshots) or type the full
/plugin:skillcommand.Accepting as a bug. A follow-up PR should add a
ProviderRegistryregression for “cwd snapshot taken during pending probe, then probe completes.”Reacted by Rute Figueiredo- Web/desktop
- addedbugSomething is broken or behaving incorrectly.Something is broken or behaving incorrectly.acceptedfeature request acceptedfeature request acceptedvia-triageFiled through npx t3 triageFiled through npx t3 triage
on Sep 13, 2026 On T3 Code desktop 0.0.45, typing
/mattpocock-skills:in a Claude thread shows “No matching command,” even though T3’s persisted machine-level cache contains 25 commands from that plugin.Environment
- macOS 26.7 (25G229), arm64
- Claude Code 2.1.289; the thread uses Claude Opus 5.5
mattpocock-skills@claude-plugins-official1.2.3, installed at user scope and enabled in~/.claude/settings.json- T3 Claude instance:
binaryPath: "claude",homePath: "" - “Show skills in slash menu” is enabled
Cache evidence
Read-only inspection of
~/.t3/caches/claudeAgent.jsonfoundstatus: "ready"and 436slashCommands, including:mattpocock-skills:ask-matt mattpocock-skills:diagnosing-bugs mattpocock-skills:tddThe cache’s
checkedAtis2026-10-04T05:28:52.166Z, before the screenshot’s filename timestamp of 14:36:39 local time. The packaged backend’s cwd is the user’s home directory.This report concerns
/autocomplete. The cache also lacks plugin entries in its filesystemskillslist, matching the separate$picker report in #5622.The populated machine-level cache and empty menu fit the catalog mismatch described here, but I have not captured the affected workspace’s live snapshot or reproduced the startup race. Restart behavior and full command execution remain untested. These checks were AI-assisted and read-only.

Before submitting
Area
apps/serverSteps to reproduce
compound-engineering@compound-engineering-pluginorexpo@claude-plugins-officialin~/.claude/settings.json). Any user-scope skill or command that only reaches T3 through the capability probe works the same way; plugin commands are just the easiest to notice./followed by the first letters of a plugin command, for example/comp./compthere.Expected behavior
The
/menu for the thread that was open at launch lists the provider commands from the capability probe, including theplugin:skillentries such as/compound-engineering:ce-plan, exactly like the thread opened later.Actual behavior
The thread that was open at launch never shows any provider commands. Only the built-ins and the
/skill:entries from~/.claude/skillsappear, and it stays that way for the whole process lifetime. Threads whose cwd is first opened after the first health check completes are fine.Mechanism, verified on
main @ 20363c3:ClaudeDriver.tspassesmakePendingClaudeProvideras the managed provider'sinitialSnapshot. That placeholder has noslashCommands(ClaudeProvider.ts, "Claude provider status has not been checked in this session yet").ProviderRegistry.refreshWorkspaceSnapshot(ProviderRegistry.ts:806) callsClaudeDriver.snapshotForCwd(ClaudeDriver.ts:234), which is{ ...snapshot.getSnapshot, skills }. When the firstcheckClaudeProviderStatushas not finished,getSnapshotis still the placeholder, soupsertProviderWorkspaceSnapshot(ProviderRegistry.ts:83) storesslashCommands: []for that cwd.refreshWorkspaceSnapshotreturns early whenever a snapshot for the cwd already exists (ProviderRegistry.ts:812-818), and the periodic health check only replaces the machine-level snapshot. Nothing ever revisits the workspace snapshot, so the empty list is permanent until the instance is rebuilt.packages/client-runtime/src/providerSkills.ts,resolveProviderSlashCommandsForCwd), which is why the correct machine-level list is never used for that thread.Span timings from
~/.t3/userdata/logs/server.trace.ndjsonfor one launch (T3 desktop 0.0.40):After the probe finished,
~/.t3/caches/claudeAgent.jsonheld 141 slash commands (81 of themplugin:skillentries), while the/menu for the thread still had none. Running the same probe by hand (initializecontrol request with--setting-sources user,project,local) also returns the full list, so Claude Code itself is not at fault.Related but distinct:
$picker #5622 covers plugin skills missing from the$picker. That is the filesystem-only skill discovery and is unaffected by this race.Impact
Minor bug or occasional failure.
It hits every launch for whichever thread is restored first, so for a single-project user it looks permanent: "T3 does not see my plugins", even though the runtime session has them and typing the full
/plugin:skillcommand works.Version or commit
T3 Code desktop (Alpha) 0.0.40, reproduced against
main @ 20363c3by reading the same code paths.Environment
macOS 26.5 (Darwin 25.5.0), T3 Code desktop 0.0.40, local connection, Claude Code CLI 2.1.270,
@anthropic-ai/claude-agent-sdk0.3.260 (perCLAUDE_AGENT_SDK_VERSIONon the spawned process).Logs or stack traces
None beyond the spans above. Nothing is logged because every step succeeds; the placeholder is a valid snapshot.
Workaround
Change any Claude provider setting in Settings > Providers and change it back. The instance rebuild drops the workspace snapshots, and the next thread mount rebuilds them from the populated machine snapshot. Alternatively, type the full command at the start of the message, for example
/compound-engineering:ce-plan; the server forwards it to Claude Code unchanged.Possible fixes: have
refreshWorkspaceSnapshotwait for the firstcheckProviderto complete (or skip storing a snapshot while the machine snapshot is still the pending placeholder), and refresh existing workspace snapshots whenever the machine-levelslashCommandschange.