Skip to content

[BUG] Checkpoint worktree path comparison fails on Windows due to path identity mismatch #11343

@0xMink

Description

@0xMink

Description

ShadowCheckpointService.initShadowGit() compares core.worktree to this.workspaceDir using raw string equality (worktree !== this.workspaceDir at ~line 158). On Windows, equivalent paths can differ in string representation, causing checkpoints to fail with:

Checkpoints can only be used in the original workspace: C:/Users/Foo/project !== C:\Users\Foo\project

Root cause

Git on Windows stores core.worktree with forward slashes (e.g., C:/Users/Foo/project), while VS Code resolves workspace paths with native backslashes (e.g., C:\Users\Foo\project). Additional divergence sources include:

  • Drive-letter casing: c:\project vs C:\project
  • Trailing separators: C:\project\ vs C:\project
  • Symlink resolution: realpath may differ from the originally-provided path

How to reproduce

  1. Open a workspace on Windows where the workspace path uses backslashes
  2. Create a task that initializes checkpoints (shadow git repo is created, core.worktree stored with forward slashes)
  3. Close and reopen the workspace (VS Code may resolve the path differently)
  4. Attempt to resume the task — checkpoint initialization fails because core.worktree (forward slashes) doesn't string-match workspaceDir (backslashes)

Search pattern

worktree !== this.workspaceDir

Suggested fix

Add a normalizePathForCompare() helper that:

  • Applies path.resolve() + path.normalize() to canonicalize separators
  • Strips trailing path separators
  • Uses case-insensitive comparison on win32 platform
  • Preserves fail-closed behavior: missing/undefined core.worktree still throws

Acceptance criteria

  • Equivalent Windows paths with different separator styles are recognized as equal
  • Drive-letter casing differences don't cause false mismatches
  • Trailing separator differences don't cause false mismatches
  • Missing core.worktree still throws (fail-closed preserved)
  • No behavioral change on macOS/Linux (paths are already case-sensitive and use consistent separators)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions