[BUG] SSH session startup: 13+ min per-session delay from sequential per-file plugin sync + no UI toggle for bundled Anthropic skills
Preflight Checklist
- [x] I have searched existing issues and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code
What's Wrong?
Bug: Claude Code SSH session startup takes 13+ min due to per-file plugin sync and bundled-skill UI gap
Title (copy to GitHub)
[Bug] SSH session startup: 13+ min per-session delay from sequential per-file plugin sync + no UI toggle for bundled Anthropic skills
Environment
- Client: Claude Code desktop, Windows 11, Electron-based
- Client version: 2.1.117 (per
main.logUser-Agent) - Remote CLI:
ccd-cli 2.1.111deployed to remote - Remote host: Ubuntu Linux over SSH, ~250ms RTT from client
- Measured link: 7 Mbps upload via scp, confirmed by
ssh.logSFTP progress (0.83 MB/s)
Summary
Starting a new SSH session to a remote host takes 13–20 minutes to receive the first assistant response. Deep log analysis proves the time is spent in [RemotePluginSync] pushing 293 skill files one-by-one via SFTP to a fresh hash-named directory on every session — even when the content is byte-identical to existing copies on the remote.
A second, compounding bug: the Claude Code desktop "Skills" UI only lists skills where creatorType !== "anthropic". Bundled skills (xlsx, pptx, docx, pdf, schedule, setup-cowork, consolidate-memory) are enabled: true in manifest.json but have no UI toggle, so users cannot disable them to reduce sync volume.
Evidence
1. 13+ min query= in CCD start-timing (before any workaround)
From %APPDATA%\Claude\logs\main.log:
2026-04-22 20:20:03 [info] [CCD start-timing] local_24cd73b5-...
preflight=5ms worktree=0ms mcp=3ms
query=791352ms enqueue=7ms init=3760ms first_assistant=2094ms
| ccd_overhead=791360ms total_to_init=795127ms total_to_assistant=797221ms
query=791352ms = 13 min 11 sec purely on plugin sync, before Claude even starts. init and first_assistant (together ~6 sec) prove Claude itself is fast; the bottleneck is entirely pre-session.
2. Per-file SFTP serialization (no batching, no delta)
From ssh.log:
2026-04-22 20:19:35 [info] [RemotePluginSync] Synced 293 file(s) from
C:\Users\...\skills-plugin\...\f9eca4c7-...\skills
→ /home/user/.claude/remote/plugins/15e539efb77a9cc7
2026-04-22 20:19:58 [info] [RemotePluginSync] Synced 293 file(s) from (same path)
→ /home/user/.claude/remote/plugins/15e539efb77a9cc7
Measured directly from remote file mtimes: 248 files in one plugin dir took 5 min 13 sec = ~0.8 files/sec = ~1.25 sec per file regardless of size. This matches ~3 RTT per file at 250ms (create/write/close/setstat via SFTP).
3. New hash-directory per session (content not reused)
After one day of use on a single client+remote pair, ~/.claude/remote/plugins/ contained 10 duplicate copies of the same anthropic-skills v1.0.0 bundle (9.7 MB each, 96 MB total waste). Each session generates a different hash-named dir even though bundle content is identical:
2026-04-22 12:52 anthropic-skills 2bbe092247639f09
2026-04-22 13:28 anthropic-skills c5d0151024a4a42d
2026-04-22 13:41 anthropic-skills 7f359546736e1774
2026-04-22 15:32 anthropic-skills 79d0f7f734ca27ea
2026-04-22 15:51 anthropic-skills addac1661d0d0e61
2026-04-22 16:20 anthropic-skills d9aca3ae63f1a098
2026-04-22 16:20 anthropic-skills 4873f521e3b18271
2026-04-22 16:29 anthropic-skills 05d5252d44236f9f
2026-04-22 16:35 anthropic-skills 03bafb393abfa8e2
Hash appears to be session/install-id based, not content-hash based.
4. Bundled Anthropic skills cannot be disabled from UI
manifest.json contains 8 skills with enabled: true:
{ "skillId": "skill-creator", "creatorType": "anthropic", "enabled": true },
{ "skillId": "xlsx", "creatorType": "anthropic", "enabled": true },
{ "skillId": "pptx", "creatorType": "anthropic", "enabled": true },
{ "skillId": "pdf", "creatorType": "anthropic", "enabled": true },
{ "skillId": "docx", "creatorType": "anthropic", "enabled": true },
{ "skillId": "schedule", "creatorType": "anthropic", "enabled": true },
{ "skillId": "setup-cowork", "creatorType": "anthropic", "enabled": true },
{ "skillId": "consolidate-memory", "creatorType": "anthropic", "enabled": true }
The Customize → Skills → "Personal skills" panel in Claude Code desktop shows only skill-creator. The other 7 bundled skills have no toggle. xlsx/pptx/docx/pdf alone add 186 files (~3.9 MB) that sync on every session.
5. Orphaned skill directories sync anyway
canvas-design (83 files) and doc-coauthoring (1 file) exist in the local skills-plugin/skills/ directory but are not listed in manifest.json. RemotePluginSync walks the directory tree, so it pushes these too. Total: 293 files synced vs 8 skills declared enabled.
6. Impact measurement after workaround
Manually editing manifest.json (setting enabled: false on 4 heavy skills), deleting their local dirs, and creating read-only placeholder files to block mkdir-recreation:
| Metric | Before | After workaround |
|---|---|---|
| query= | 791,352 ms | 120,907 ms |
| Files synced | 293 | 28 |
| Total to first response | 13 min 17 sec | 2 min 6 sec |
~84% improvement. But the workaround required bypassing Windows ACLs (icacls deny) because SkillsPlugin polls every 10 min and re-downloads the skills, flipping enabled: true back on. Log confirms ongoing fight:
2026-04-22 20:50:00 [error] [SkillsPlugin] Sync failed:
EPERM: operation not permitted, open '...\manifest.json'
Requested fixes (priority order)
- Use content-addressable plugin directories on the remote. Hash by bundle content (skill set + versions), not by session. Identical content should reuse an existing
~/.claude/remote/plugins/<content-hash>/dir with zero file transfer. This alone would drop 95%+ of the recurring cost.
- Batch file transfer with tar + streaming. Per-file SFTP at high RTT is catastrophic. A single
tar | sshpipe (optionally gzipped) would transfer 293 files in seconds instead of 5+ minutes.
- Implement delta sync. Check remote file hashes/mtimes and only push changed files.
SkillsPluginalready does delta sync against the Anthropic API (Delta: 0 to download);RemotePluginSyncshould do the same against the SSH remote.
- Expose bundled Anthropic skills in the Skills UI with toggles. Users have no way to opt out of xlsx/pptx/docx/pdf via the supported UI. At minimum, add them to a "Built-in" / "Bundled" section alongside "Personal skills".
- Sync only
enabled: trueskills, not the full directory tree. Orphaned directories (no manifest entry) should be ignored or cleaned up, not pushed.
- Add a setting to disable auto-sync or make it manual/triggered. For users on high-latency links, the 10-min periodic
SkillsPluginsync + fresh per-sessionRemotePluginSyncis a recurring tax they can't opt out of.
Repro steps
- Install Claude Code desktop on Windows (or macOS).
- Configure an SSH host with >200ms RTT to your machine (or use a geographically distant VPS).
- Open a new session targeting that SSH host, working dir on the remote.
- Measure time from "send first message" to "first assistant response".
- Inspect
%APPDATA%\Claude\logs\main.log— look for[CCD start-timing]and notequery=ms. - Inspect
%APPDATA%\Claude\logs\ssh.log— look for[RemotePluginSync] Synced N file(s)and note N.
With default bundled skills, expect query= > 500,000 ms and N ≥ 250.
Additional context
- Anthropic-skills bundle version in use:
1.0.0 - Remote server binary:
claude-ssh 9a871e263f5ad85fb147f437ce5f11a5450ef3e8(built 2026-04-21T17:07:27Z) ccd-clibinary size: 225 MB (one-time SFTP upload on version change — also slow but at least infrequent)- Historical handshake timeouts observed in
ssh.logup to 213,625,944 ms (59 hours) — likely a separate issue but worth investigating timeout ceilings.
What Should Happen?
time to start session should be less than 30 sec
Error Messages/Logs
Steps to Reproduce
check description
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
2.1.111
Platform
Anthropic API
Operating System
Ubuntu/Debian Linux
Terminal/Shell
Other
Additional Information
_No response_
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗