[BUG] SSH session startup: 13+ min per-session delay from sequential per-file plugin sync + no UI toggle for bundled Anthropic skills

Resolved 💬 1 comment Opened Apr 22, 2026 by hkhamis1975 Closed May 29, 2026

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.log User-Agent)
  • Remote CLI: ccd-cli 2.1.111 deployed to remote
  • Remote host: Ubuntu Linux over SSH, ~250ms RTT from client
  • Measured link: 7 Mbps upload via scp, confirmed by ssh.log SFTP 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)

  1. 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.
  1. Batch file transfer with tar + streaming. Per-file SFTP at high RTT is catastrophic. A single tar | ssh pipe (optionally gzipped) would transfer 293 files in seconds instead of 5+ minutes.
  1. Implement delta sync. Check remote file hashes/mtimes and only push changed files. SkillsPlugin already does delta sync against the Anthropic API (Delta: 0 to download); RemotePluginSync should do the same against the SSH remote.
  1. 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".
  1. Sync only enabled: true skills, not the full directory tree. Orphaned directories (no manifest entry) should be ignored or cleaned up, not pushed.
  1. Add a setting to disable auto-sync or make it manual/triggered. For users on high-latency links, the 10-min periodic SkillsPlugin sync + fresh per-session RemotePluginSync is a recurring tax they can't opt out of.

Repro steps

  1. Install Claude Code desktop on Windows (or macOS).
  2. Configure an SSH host with >200ms RTT to your machine (or use a geographically distant VPS).
  3. Open a new session targeting that SSH host, working dir on the remote.
  4. Measure time from "send first message" to "first assistant response".
  5. Inspect %APPDATA%\Claude\logs\main.log — look for [CCD start-timing] and note query= ms.
  6. 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-cli binary size: 225 MB (one-time SFTP upload on version change — also slow but at least infrequent)
  • Historical handshake timeouts observed in ssh.log up 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_

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗