What happened. #1082 de-duplicated two spellings of one repo onto one DB connection, but the daemon
pipe name and registry key are still derived from path.resolve(root) (src/mcp/daemon-paths.ts
~41-43; also acquireProject, src/mcp/project-lifecycle.ts ~37). fs.realpathSync keeps the
caller's casing (realpathSync.native does not), so D:\gllSpell and D:\GllSpell get two daemons
and two watchers, and a session started with the "other" casing polls a pipe nobody listens on for 6 s
and then runs read-only. Our ~/.codegraph/daemons registry held both spellings of one repo.
Suggested fix (what we did): an identity key of realpathSync.native(root) lower-cased on win32,
used for the pipe hash, the registry record and the project-lifecycle map; display paths unchanged.
All found on Windows 11, Node 24, main at f416357 (2026-10-02), running as Claude Code's MCP server.
Each has a fix with a regression test in our fork (ijbranch/gllCodeGraph, private); the test and the
patch can be offered as a PR if wanted.
What happened. #1082 de-duplicated two spellings of one repo onto one DB connection, but the daemon
pipe name and registry key are still derived from
path.resolve(root)(src/mcp/daemon-paths.ts~41-43; also
acquireProject,src/mcp/project-lifecycle.ts~37).fs.realpathSynckeeps thecaller's casing (
realpathSync.nativedoes not), soD:\gllSpellandD:\GllSpellget two daemonsand two watchers, and a session started with the "other" casing polls a pipe nobody listens on for 6 s
and then runs read-only. Our
~/.codegraph/daemonsregistry held both spellings of one repo.Suggested fix (what we did): an identity key of
realpathSync.native(root)lower-cased on win32,used for the pipe hash, the registry record and the project-lifecycle map; display paths unchanged.
All found on Windows 11, Node 24,
mainat f416357 (2026-10-02), running as Claude Code's MCP server.Each has a fix with a regression test in our fork (
ijbranch/gllCodeGraph, private); the test and thepatch can be offered as a PR if wanted.