# generate_task_id() Task ID 포맷 v2 통일화

## 배경
dispatch.py의 `generate_task_id()`가 단순 자동 증가(`task-{번호}.1`)만 하고, Task ID 포맷 v2 규칙을 따르지 않음.
카운터 오염 시 5자리 번호(18386 등)가 생성되는 버그도 발생함.

## Task ID 포맷 v2 규칙 (단일 소스: memory에 정의)
```
task-{번호}[_{총Phase}.{현Phase}][_{병렬}][+{재시도}]
```
- `_` 뒤에 숫자.숫자 → Phase (`_3.1` = 3Phase 중 1번째)
- `_` 뒤에 알파벳 → 병렬 (`_a` = 1번째)
- `+` 뒤에 숫자 → 재시도 (`+1` = 1회 재시도)

## 수정 사항

### 1. generate_task_id() 포맷 변경
- 현재: `f"task-{next_num}.1"` (항상 .1 접미사)
- 수정: `f"task-{next_num}"` (접미사 없음, 순수 번호만)
- 이유: `.1`은 포맷 v2에서 의미가 모호함. Phase도 아니고 재시도도 아닌 단순 접미사.

### 2. 카운터 이상치 방지 로직 추가
- `.task-counter` 읽을 때, `_compute_next_id_from_timers()` 결과와 비교
- 현재: `카운터 < timers` 일 때만 보정
- 수정: `카운터 - timers_max >= 1000` 일 때도 보정 (카운터가 비정상적으로 큰 경우)
- 보정 시 경고 로그 출력

### 3. _sync_counter_if_needed() Phase 인식
- 외부 지정 task_id에서 번호 추출 시 Phase 접미사(`_3.1`) 무시하고 기본 번호만 추출
- 예: `task-1845_2.2` → 1845 추출

### 4. dispatch CLI에서 --task-id 포맷 검증
- `--task-id` 옵션으로 전달된 값이 포맷 v2 규칙에 맞는지 정규식 검증
- 패턴: `^task-\d+(_\d+\.\d+)?(_[a-z])?(\+\d+)?$`
- 불일치 시 경고 출력 (에러 아님, 경고만)

## 검증 시나리오 (이게 되면 성공)
1. `python3 dispatch.py --team dev1-team --task "테스트"` → `task-185X` (4자리, .1 없음)
2. `.task-counter`에 99999 넣고 실행 → 이상치 감지하여 timers 기준으로 보정
3. `--task-id task-1845_2.2` 전달 → 카운터가 1845로 sync되지 않음 (1845는 이미 존재)
4. `--task-id task-잘못된형식` 전달 → 경고 메시지 출력
5. 기존 테스트 전체 PASS 유지

## 참고 파일
- dispatch.py: `generate_task_id()` (line 823~), `_compute_next_id_from_timers()` (line 787~), `_sync_counter_if_needed()` (line 889~)
- Task ID 포맷 v2 규칙: memory 참조

## 주의사항
- dispatch.py 수정 후 즉시 커밋
- 기존 `task-번호.1` 형식의 task도 하위 호환 유지 (파싱 시)
- dry-run으로 먼저 테스트 후 적용
