Repository navigation
fix(harness-ops): converge treats a user home directory (including /mnt/c/Users/* on WSL) as a project path #7447
Description
What happened
On WSL2 (harness-ops 3.14.0, 2026-10-14), installed_plugins.json held project-scope records whose projectPath is the Windows user home as seen from WSL, /mnt/c/Users/<windows-home>. Converge treated that row like any other project path, so its uninstall strategy would run (cd /mnt/c/Users/<windows-home> && claude plugin uninstall <id> -s project --keep-data).
/mnt/c/Users/<windows-home>/.claude/settings.json is not a project settings file. It is the Windows Claude Code install's user settings file, with 128 enabledPlugins entries. A project-scope uninstall there would delete Windows user-scope enables.
Expected
Converge refuses to act on a projectPath that equals a user home directory: $HOME, any /home/*, /Users/*, C:\Users\*, and the WSL view of Windows homes, /mnt/<drive>/Users/*. The row is reported as BLOCKED with the reason.
Repro
- On WSL, have a project-scope record whose
projectPathis/mnt/c/Users/<windows-home>(created by running a project-scope install from that directory in a WSL session). - Run
/harness-ops:plugins converge. - The row gets the normal strategy and a
cdcommand into the Windows home.
Evidence
Paths are relative to plugins/harness-ops/skills/plugins/ on main at 8718950e9d.
context/converge.md:74-85buildscd "<projectPath>"commands with no check of what the path is; the only precondition isprojectPathPresent(context/converge.md:94-104)./mnt/c/Users/<windows-home>/.claude/settings.jsonholds 128enabledPluginsentries: the Windows user scope.- The same hazard applies to a record keyed to the Linux
$HOME, whose.claude/settings.jsonis this machine's user settings.
Proposed fix
- In
fleet-state.sh, mark each project/local record withprojectPathIsHome: truewhen the path equals the current$HOMEor matches^(/home/[^/]+|/Users/[^/]+|/mnt/[a-z]/Users/[^/]+|[A-Za-z]:[\\/]Users[\\/][^\\/]+)/?$. - Converge emits such rows as BLOCKED ("projectPath is a user home; its
.claude/settings.jsonis user settings, not project settings"), never as a runnable command. - Sync reports these records in their own row so the user can see they exist.
- Add a fixture for the
/mnt/c/Users/<name>case.
🤖 Generated with Claude Code
Activity
github-actions commentedon Oct 14, 2026
Understood: on WSL2, converge can see a project-scope record whose
projectPathis/mnt/c/Users/<name>(the Windows home as mounted in WSL) and build an uninstall command thatcds into it, acting against the Windows install's user-scope.claude/settings.jsoninstead of a project settings file. The same risk applies to any record keyed to$HOME. The report includes exact file/line evidence (context/converge.md:74-85,:94-104), a repro, and a concrete proposed fix (flag home-directory paths infleet-state.sh, block them in converge output, report them separately in sync, add a WSL fixture).Nothing appears missing for someone to act on this; the proposed fix is specific enough to review directly. I didn't find an existing issue describing this exact user-home/
projectPathconfusion, though related converge-correctness issues exist in the tracker (#7445, #7446, #7448) if useful for sequencing this fix.Automated triage. A maintainer reviews it.
kyle-sexton commentedon Oct 18, 2026
Agent Brief
Type: Bug
Summary:
/harness-ops:plugins convergerefuses to act on a project-scope record whose projectPath is a user home directory.Current behavior:
Converge treats every projectPath as a project. On WSL a record keyed to
/mnt/c/Users/<name>gets the normal uninstall strategy, which wouldcdinto the Windows home and remove the Windows install's user-scope enables.Desired behavior:
$HOME, any/home/<name>,/Users/<name>,C:\Users\<name>, or the WSL view/mnt/<drive>/Users/<name>(case-insensitive drive andUsers)./home/<name>/repos/x) are unaffected.Key interfaces:
Acceptance criteria:
scripts/run-test-file.sh plugins/harness-ops/skills/plugins/scripts/fleet-state.test.shpasses, with a WSL fixture whose record has projectPath/mnt/c/Users/someoneflagged as a user home, and a fixture under/home/someone/repos/appnot flagged.scripts/check-changelog-fragments.shpasses.Out of scope:
This was generated by AI during backlog shaping. Held, not admitted: this brief is drafted and checked, but the issue lane would stop on it today. It is admitted, by adding
agent-ready, once the lane can run the skill-quality check scripts (Automation Lanes' PR #7912). Held under the owner's 2026-10-18 lane-narrowing course correction.