## 2026-05-04 — Windows에서 Strict 샌드박스 path 분리자 정규화

### 배경

Strict 샌드박스 모드의 todo/discussion 오케스트레이터가 워크트리의 `.claude/settings.json`에 `Read/Edit/Write(${workDir}/**)` 패턴을 직접 박고 있었는데, Windows에서 `path.join`이 디렉터리 부분에 백슬래시를 만들어 trailing `/**`만 forward slash로 남으면서 Claude의 path-normalizing permission matcher가 모든 Edit/Write 매칭을 silently 거부하는 회귀가 있었다. 자동 실행 작업이 Bash 우회(`sed -i`, `pwsh`)로 빠지면서 turn만 까먹고 exit 1으로 종료되는 일이 잦았음. 워크트리 경로를 forward slash로 정규화하는 한 줄 수정으로 해결.

### 주요 변경

#### 1. 오케스트레이터에서 워크트리 path 정규화 후 패턴 합성 (`f03b2c7`)

- **`src/server/services/orchestrator.ts`** — `normalizedWorkDir = workDir.replace(/\\/g, '/')` 도출, Read/Edit/Write allow glob에 사용.
- **`src/server/services/discussion-orchestrator.ts`** — 같은 fix를 `normalizedWorktreePath`로 적용.
- macOS/Linux는 path가 이미 슬래시라 no-op. 기존 깨진 `settings.json` 파일은 다음 실행에서 `existingSettings.permissions`가 덮어쓰여 자가 치유.

### 수정된 주요 파일

| 파일 | 변경 내용 |
|------|----------|
| `src/server/services/orchestrator.ts` | `normalizedWorkDir`로 Read/Edit/Write allow 패턴 합성. Windows 백슬래시를 `/`로 치환 |
| `src/server/services/discussion-orchestrator.ts` | 동일한 normalize 처리 (`normalizedWorktreePath`) |

### 아키텍처 결정

1. **path matcher가 mixed separators를 깰 수 있다는 가정**: Claude가 path를 normalize하는 방식은 우리 컨트롤 밖이라 `${workDir}/**` 패턴 자체를 안전한 형태로 만들어 두는 게 가장 robust한 fix. `path.posix.join` 같은 Node 표준은 워크트리 path 자체가 OS native로 들어와서 적용이 어색하므로, 패턴 합성 직전에 한 번 `replace(/\\/g, '/')`로 정규화하는 게 가장 작은 변경.
2. **자가 치유 마이그레이션**: 기존에 깨진 `settings.json`을 가진 워크트리가 있어도 별도 cleanup 코드 없이 다음 실행에서 `existingSettings.permissions`가 덮어쓰여 정상화. `.claude/settings.json` 자체가 워크트리당 1개 + 매 실행마다 다시 박는 구조라 가능.

---
