# task-408.1 완료 보고서: task-timer 이중 등록 방어 로직

## 작업 요약
dispatch.py에 `--task-id` 옵션을 추가하고, task-timer.py에 이중 등록 방어 로직(멱등성)을 구현.

## 변경 파일

### 1. `/home/jay/workspace/dispatch.py`
- `dispatch()` 함수에 `task_id: Optional[str] = None` 파라미터 추가 (line 274)
- `task_id`가 주어지면 `generate_task_id()` 호출하지 않고 해당 ID 사용 (line 285-286)
- `main()` argparse에 `--task-id` 옵션 추가 (line 420)
- `main()`에서 `dispatch()` 호출 시 `task_id=args.task_id` 전달 (line 459)

### 2. `/home/jay/workspace/memory/task-timer.py`
- `start_task()` 메서드에 이중 등록 방어 로직 추가 (line 111-115)
- 동일 task_id가 이미 running 상태면 중복 시작 거부
- `{"status": "already_running", ...}` 반환 (에러가 아닌 멱등성 응답)
- 경고 로그 출력

## 테스트 결과
- `tests/test_dispatch.py`: 70/70 PASS
- `tests/test_task_timer.py`: 87/87 PASS
- 총 157건 전부 통과, 신규 실패 0건

## pyright 결과
- 신규 에러 0건
- 기존 `reportMissingImports` 4건 (런타임 `sys.path.insert` 사용으로 인한 정적 분석 한계, 변경과 무관)

## 코드 스타일
- black: OK
- isort: OK

## QC 자동 검증 결과
```json
{
  "task_id": "task-408.1",
  "overall": "CONDITIONAL_PASS",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "PASS (보고서/이벤트 파일 생성 후)",
    "data_integrity": "PASS",
    "test_runner": "WARN (기존 test_team_prompts.py project_id 테스트 4건 실패 — 본 작업과 무관)",
    "tdd_check": "N/A (Lv.1 작업, TDD 적용 대상 아님)",
    "schema_contract": "SKIP",
    "pyright_check": "WARN (기존 reportMissingImports 4건)",
    "style_check": "PASS",
    "scope_check": "SKIP"
  }
}
```

## 기존 테스트 실패 (본 작업과 무관)
- `test_team_prompts.py`: project_id 관련 테스트 4건 — `prompts/team_prompts.py` 프롬프트 구조 변경에 의한 기존 이슈. dispatch.py/task-timer.py 변경과 무관.

## 비고
- 기존 동작 완전 호환: `--task-id` 미전달 시 기존과 동일하게 자동 발번
- 이중 등록 방어는 멱등성 패턴: running 상태 중복 시도 시 기존 task 정보 반환 (에러 아님)
