Repository navigation
Description
Before submitting
- I searched existing issues and did not find a duplicate.
- I included enough detail to reproduce or investigate the problem.
Area
apps/server
Summary
With an ACP Registry provider selected, on a freshly started app the composer's / menu is empty for a brand-new thread in a project — every skill returns "No matching command." The skills only show up after the first message of the thread is sent.
Related issues (searched, but this looks distinct)
- [Bug]: ACP Registry providers probe commands/skills with the server cwd, so project-scoped commands never appear #24375 — ACP providers probed with the server cwd so project-scoped commands never appear. In my case the commands do appear eventually (after the first message), so this looks like a timing/snapshot issue rather than the wrong-cwd one.
- [Bug]: Workspace snapshot taken before the first Claude probe finishes leaves the / menu without provider commands for the whole session #11575 — workspace snapshot taken before the first Claude probe finishes (closed as fixed for the Claude driver). ACP Registry providers may still have the same race, with the first
session/new(triggered by the first message) being what finally populates the command list.
Steps to reproduce
-
Fresh-launch T3 Code (quit the app first, then start it).
-
Open a project, create a new thread.
-
Select an ACP Registry provider (in my case the z-ai ACP harness, model "DeepSeek V4.1 Flash (latest)").
-
In the composer, type
/grill.→ Menu shows "No matching command." No ACP skills are listed (also nothing under
$). -
Send any first message (even just "Hi").
-
Once the agent starts working, type
/grillagain in the composer.→ Now all ACP skills appear:
/grill-me,/grilling,/grill-with-docs,/loop-me,/git-guardrails-claude-code,/improve-codebase-architecture,/triage, ...
Expected behavior
The ACP provider's skills/commands should be available in the / menu as soon as a new thread opens, without requiring a first message.
Actual behavior
The command list is empty for the new thread until the first message is sent. After the session starts (first message), the skills appear and continue to work.
Impact
Low-to-medium: the agent runtime actually has the skills, and typing the full name of the command as the first message still works — it's mainly the composer menu that starts empty. But it makes skills undiscoverable right when starting a fresh thread, and users think their skills are broken (I did).
Version or commit
T3 Code 0.1.3 (Beta), Linux desktop build.
Environment
- Pop!_OS 22.04 LTS (Linux)
- T3 Code desktop 0.1.3 (Beta)
- Connection: local
- Provider: ACP Registry harness (z-ai), model "DeepSeek V4.1 Flash (latest)"
Logs or stack traces
None visible in the UI; happy to pull ~/.t3/userdata/logs spans if that helps pin down which probe/snapshot populates the composer list late.
Workaround
Send any first message (even "Hi") — skills load immediately afterwards. Alternatively type the full command name as the first message; the forward still works.
Activity
juliusmarminge commentedon Oct 28, 2026
Tried to reproduce this on current main (eb751fa) and couldn't. Linux, web client against the dev server, fresh database, ACP Registry providers set up, server restarted, then a brand-new thread in a project:
kilo, the opencode fork, via npx): typing/grilin a new draft lists/grill-meand/grillingbefore any message is sent.pi-acp):/lists/modeland the/skill:*entries before any message.available_commands_updateat the same moment it answerssession/new. That is when T3 Code's startup probe reads the command list, so it gets the full list. The server's working directory (project,$HOME, or/) made no difference.T3 Code's startup probe waits only briefly after
session/newfor the command list. An agent that sends it later, or a probe that fails, would give exactly what you describe: an empty menu until the first message opens a real session. To tell which:/, does the menu fill in?~/.t3/userdata/logs, any lines from the minute after launch that mentionAcpRegistryProbe,probe_failed, or that provider's instance id (e.g.acpRegistry_…).bhaaratkrishnan commentedon Nov 3, 2026
Answers to your questions + span data from the session where I hit it:
1. Which agent / Registry agent ID
It's a Local ACP command, not a harvested registry entry: the harness is
cmd acp(Command Code's own ACP harness, which advertises its bundled skills — hence/grill,/grilling,/grill-with-docs, …). Provider instance id:acpRegistry_command_code(display name "Command Code", driveracpRegistry,config.source: "local",commandPath: "cmd",commandArgs: ["acp"]).2. Provider status right after launch
The probe reports Success — no failure. From
~/.t3/userdata/logs/server.trace.ndjsonin the epoch of my repro:No
probe_failedentries. (Will re-check what the Settings panel shows next fresh launch, but the server-side probe itself is healthy.)3. Does waiting ~1 minute fill the menu?
No — the client kept polling
refreshProviderswell past the probe finishing and the menu stayed empty. Spans show this races exactly like the (closed/fixed for Claude) #11575: the workspace snapshot is stitched from the pending placeholder before the probe returns, and later refreshes early-exit, so nothing ever revisits it:4. Log lines
The
AcpRegistryProbespans are above; nothing matchingprobe_failed. The interesting event isn't a failure — it's thatrefreshWorkspaceSnapshotreturns early whenever a snapshot for the cwd already exists (mirroring the mechanism described in #11575), and the probe takes 3–4s here (spawningcmd acp+ ACP handshake), so the first workspace snapshot for the thread's project cwd always comes from the placeholder. The skills only reach the composer once the real session starts (first message) and the liveavailable_commands_updatefrom the session is consulted.So alongside your "agent sends
available_commands_updatelater" possibility, there's a second one your repro wouldn't show: the local-command agent probes fine, but slower than the first workspace snapshot. Consistent with the #11575 suggested fix — keep snapshotting the workspace while the machine snapshot is still pending, and refresh existing workspace snapshots when the machine-levelslashCommandschange.Replied using CommandCode and T3Codes
bhaaratkrishnan commentedon Nov 4, 2026
Root cause confirmed — it's the server-cwd probe from #24375, and there's a fix up in #30668.
What's happening: the ACP Registry driver probes
available_commandswithcwd: host.paths.cwd(the server process cwd) and implements nosnapshotForCwd, sorefreshWorkspaceSnapshotnever stores per-project workspace snapshots. The composer falls back to the machine snapshot's command list, which was probed with the wrong cwd. Project-scoped commands are missing until the first message opens a real session — itsavailable_commands_update(with the thread's real cwd) reaches the machine snapshot viawatchAvailableCommands, which is exactly the "skills appear only after the first message" symptom.Verified with a direct ACP handshake against this harness (
cmd acp, the "Command Code" provider — a Local ACP command, instance idacpRegistry_command_code,commandPath: cmd,commandArgs: ["acp"]):~/blueswype/thiranly/thiranly-monorepo) → 50 commands including/grill-me,/grilling,/grill-with-docs,/loop-me,/triage, …$HOMEor/(what the server-cwd probe effectively sees) → 12 built-ins only, none of the aboveThat's also why the repro with Kilo/pi-acp doesn't show it: their commands are all global, so the server cwd makes no difference for them. The span data from my earlier comment fits: the probe succeeded (3–4s), but its result was probed with the wrong cwd, and no later snapshot revisit could fix it.
Answers to the remaining questions:
snapshotForCwd), so there is nothing to revisit.Fix: #30668 adds
snapshotForCwdto the ACP Registry driver (per-workspace probe with the requested cwd, 15-min per-cwd cache, bounded concurrency, cache cleared on logout/auth changes). With it, a brand-new thread lists all project skills before any message:Happy to split or reshape the change however you'd prefer (e.g. moving the per-cwd probe into the runtime coordinator instead of the driver).
juliusmarminge commentedon Nov 12, 2026
This is the same problem as #24375, so I'm closing it in favour of that one. If it is different, say how and it will be reopened.