Feature: GitWorktreeSandbox class methods for stale cleanup and diff As a developer I want class-level helpers to clean up stale worktrees and generate diffs So that the CLI can manage sandbox lifecycle without a sandbox instance Background: Given a gwt_cm test git repository is initialised Scenario: cleanup_stale removes a stale worktree branch Given a gwt_cm stale worktree branch exists for plan "plan-stale-001" When I call GitWorktreeSandbox.cleanup_stale for plan "plan-stale-001" Then the gwt_cm stale branch should no longer exist Scenario: cleanup_stale is idempotent when no stale branch exists When I call GitWorktreeSandbox.cleanup_stale for plan "plan-nonexistent-999" Then no gwt_cm exception should have been raised Scenario: cleanup_stale handles empty plan_id gracefully When I call GitWorktreeSandbox.cleanup_stale with empty plan_id Then no gwt_cm exception should have been raised Scenario: cleanup_stale handles empty original_path gracefully When I call GitWorktreeSandbox.cleanup_stale with empty original_path Then no gwt_cm exception should have been raised Scenario: diff_against_head returns None when no worktree branch exists When I call GitWorktreeSandbox.diff_against_head for plan "plan-no-branch-001" Then the gwt_cm diff result should be None Scenario: diff_against_head returns diff when worktree branch has changes Given a gwt_cm worktree branch with changes exists for plan "plan-diff-001" When I call GitWorktreeSandbox.diff_against_head for plan "plan-diff-001" Then the gwt_cm diff result should not be None Scenario: diff_against_head handles empty plan_id gracefully When I call GitWorktreeSandbox.diff_against_head with empty plan_id Then the gwt_cm diff result should be None Scenario: diff_against_head handles empty original_path gracefully When I call GitWorktreeSandbox.diff_against_head with empty original_path Then the gwt_cm diff result should be None