# task-timers.json Atomic Write 긴급 수정

## Lv.2 작업 (긴급 — 프로덕션 데이터 손실 발생 중)

## 문제
dispatch.py의 `_patch_timer_metadata()`와 task-timer.py가 task-timers.json에 동시 쓰기하면서 **JSON 파손이 반복 발생**. 지난 1시간 동안 3회 파손됨.

### 파손 패턴
- `_patch_timer_metadata`가 `open(file, "w")` → 즉시 truncate → `json.dump()` 진행 중
- 동시에 task-timer.py가 같은 파일을 `open(file, "w")`로 열어서 truncate
- 결과: JSON이 `"task_file": ` 에서 잘리거나, 이전 작업 기록 전체 소실

### 영향
- 대시보드에 작업중 팀이 0개로 표시
- watchdog이 running 작업을 못 찾아서 오동작
- counter 소실로 dispatch.py 에러

## 수정 범위

### 1. dispatch.py `_patch_timer_metadata()` (697줄)
**현재 (위험):**
```python
with open(timer_file, "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
```

**수정 (atomic write):**
```python
import tempfile, os

# temp 파일에 먼저 쓰고 atomic rename
with tempfile.NamedTemporaryFile(
    'w', dir=timer_file.parent, delete=False,
    suffix='.tmp', encoding='utf-8'
) as tmp:
    json.dump(data, tmp, ensure_ascii=False, indent=2)
    tmp.flush()
    os.fsync(tmp.fileno())
os.replace(tmp.name, str(timer_file))
```

### 2. task-timer.py의 모든 JSON 쓰기
task-timer.py에서도 task-timers.json을 쓰는 모든 위치에 동일한 atomic write 패턴 적용.
또한 **flock 사용**: dispatch.py와 동일한 lock 파일(`memory/.task-timers.lock`) 사용.

**task-timer.py 수정 위치 찾기:**
```bash
grep -n "open.*task-timers.*w\|json.dump" /home/jay/workspace/memory/task-timer.py
```

### 3. session-watchdog.sh
watchdog도 task-timers.json을 수정하는 경우 flock 사용 확인. 이미 flock 사용 중이면 OK.

## 테스트
- TC1: dispatch.py를 2개 동시 실행 → task-timers.json 파손 없음 확인
- TC2: dispatch + task-timer.py end 동시 실행 → 파손 없음
- TC3: 기존 dispatch 동작 회귀 테스트

## 보고서
`/home/jay/workspace/memory/reports/task-{TASK_ID}.md`
