---
task_id: task-2502
type: plan
scope: task
created: 2026-05-08
updated: 2026-05-08
status: completed
---

# 계획서: task-2502 — SSOT legacy validator export minimal patch

**task**: task-2502
**목표**: origin/main의 `from utils.task_id_parser import is_valid_task_id, TASK_ID_RE` ImportError를 해소하고 + suffix / dot-phase legacy task id 검증을 모두 PASS하도록 SSOT export를 최소 패치한다.
**승인**: 회장 §3 / §4 / §5 (2026-05-08) "minimal patch만 수행, PR #52 cleanup 시도 금지"
**근거**: `memory/tasks/task-2502.md` (task 파일 본문 §1-§11), `memory/reports/task-2487+1.md` (ESCALATE evidence)

---

## 목표 (회장 §4 5건)

1. `utils/task_id_parser.py`에 `is_valid_task_id_with_legacy` export 추가 (origin/main 미존재)
2. `teams/shared/verifiers/browser_verify.py` (origin/main line 18: `from utils.task_id_parser import is_valid_task_id, TASK_ID_RE`) import 정합성 — origin/main에 `TASK_ID_RE` alias **이미 존재**, 본 패치는 영향 0. 봇 worktree dev1~dev8 verifier가 import 시도하는 `is_valid_task_id_with_legacy`만 추가하면 자동 해결
3. `task-2485+1`, `task-2487+1`, `task-2494`, `task-1234.1` 모두 검증 PASS, invalid id는 FAIL
4. main의 finish-task QC ImportError 해소
5. task-2497/2498/2494 finish-task 재실행 가능 상태 만들기

## 범위

### 포함
- `utils/task_id_parser.py`에 SSOT 추가:
  - `_LEGACY_DOTPHASE_PATTERN` 정의 (legacy dot-phase 호환 패턴)
  - `is_valid_task_id_with_legacy()` 함수 (V2 + legacy dot-phase 모두 허용)
- 회귀 테스트 2개:
  - `tests/regression/test_task_id_parser_legacy_export_2502.py` (함수 동작 + + suffix + dot-phase 검증)
  - `tests/regression/test_browser_verify_import_2502.py` (shared verifier import-only smoke)
- 새 PR 생성: `task/task-2502-dev1`

### 제외 (다음 페이즈 이후)
- PR #52 / #49 / #50 / #51 수정 (회장 §6)
- dev1~dev8 verifier 수정 (origin/main에 미존재 — 본 PR 영역 외)
- task-2497/2498/2494 finish-task 재실행 (회장 §10)
- 기존 `is_valid_task_id` 시그니처 변경 (호환성 유지)

## 위임 계획

- **불칸 (백엔드)**: `utils/task_id_parser.py` SSOT export 추가 (Sonnet)
- **아르고스 (테스터)**: 회귀 테스트 2개 작성 + pytest 실행 (Sonnet)
- **헤르메스 (팀장, 직접)**: G1 sanitize → Codex 게이트 → 통합 검증 → PR + Gemini 대응

## 검증 기준 (회장 §7 5단계)

1. `python3 -c "from utils.task_id_parser import is_valid_task_id_with_legacy"` → PASS
2. `is_valid_task_id_with_legacy("task-2485+1")` → True, `("task-2487+1")` → True, `("task-2494")` → True, `("task-1234.1")` → True, `("invalid")` → False
3. `python3 -c "from teams.shared.verifiers.browser_verify import verify"` → PASS (TASK_ID_RE 해소)
4. `pytest tests/regression/test_task_id_parser_legacy_export_2502.py tests/regression/test_browser_verify_import_2502.py` → PASS
5. finish-task dry-run smoke (manual .done 없이 ImportError 해소 확인)

## 3 Step Why 자문

- **1st Why**: 왜 이 설계가 필요한가? → A: PR #47 partial merge로 origin/main verifier가 `TASK_ID_RE`/`is_valid_task_id_with_legacy`를 import하지만 SSOT에는 미정의. 모든 봇 worktree QC가 ImportError로 차단되어 task-2497/2498/2494 finish-task 재실행 불가 상태.
- **2nd Why**: 왜 SSOT export 추가가 최선의 접근인가? → B: 대안1(verifier에서 import 제거)은 task-1234.5 legacy 검증 회귀(PR #49/#50/#51 evidence) 재발생. 대안2(verifier try/except graceful)은 task_id 검증 약화 + tech debt 누적. SSOT export는 1 함수 + 1 alias 추가로 모든 호출자 자동 해결.
- **3rd Why**: 왜 SSOT export가 다른 대안보다 나은가? → C: (a) 변경 파일 최소(코어 1 + 회귀 2 = 3 파일), (b) 기존 `is_valid_task_id` 무수정으로 호환성 100%, (c) PR #49/#50/#51의 dot-phase 회귀 픽스 동시 해결, (d) verifier의 task_id 검증 로직 보존(보안 회귀 없음).
- **A-B-C 일관성**: ✅ 모두 "최소 변경으로 SSOT 정합성 회복" 단일 명제 지향.

## 회장 §6 금지 18건 준수 체크리스트

- [x] PR #52/#49/#50/#51 수정 0건
- [x] memory/plans/tasks/task-2485+1, task-2487+1 수정 0건
- [x] memory/poc, tests/poc, tools/poc 수정 0건
- [x] dashboard/dispatch 대규모 수정 0건
- [x] report_parser, auto_merge 등 동시 수정 0건
- [x] rebase / force push / admin override / CI bypass / manual .done 0건
- [x] PR #52 branch (`task/task-2487+1-dev2`) 접근 0건
- [x] origin/main 최신 기준 clean branch 사용 (task/task-2502-dev1)
