---
task_id: task-2485
type: context
scope: task
created: 2026-05-07
updated: 2026-05-08
status: completed
---

# 맥락 노트: task-2485

**task**: task-2485

---

## 결정 근거

### 1. browser_verify.py 정규식 교체 방식
- 결정: 인라인 `r'^task-\d[\w.\-]*$'` 패턴을 제거하고 `utils.task_id_parser.is_valid_task_id` 호출로 위임
- 이유: 단일 진실 원천(SSOT) — 향후 패턴 확장 시 한 곳만 수정. 회장 명시 "공통 utility 도입"에 부합
- 대안 (기각): 패턴만 `+`를 포함하도록 수정 → SSOT 위반, parser와 lockstep 필요

### 2. git_evidence.py worktree/main repo 분리 방식
- 결정: `_resolve_project_dir` 결과에 `resolved_via` 라벨 부여 (env / timers / task-file / fallback).
  fallback(D) = main repo로 판단되는 경우, NO_UNCOMMITTED 검사를 task scope 내 파일에 한정.
- 이유: 회장 명시 "현재 task의 worktree 상태와 main repo dirty 상태를 분리 판단".
  worktree path가 정상 resolved 되면 그 worktree에서만 dirty 검사 → main repo의 다른 task 영향 차단.
- 대안 (기각):
  - 모든 dirty PASS → forbidden_actions(`dirty_check_removal`) 위반
  - main repo 검사 자체 스킵 → worktree 미발견 환경에서 검증 약화
  - 다른 task 변경 임의 정리 → forbidden_actions(`other_task_changes_cleanup`) 위반

### 3. parser 공통 API 확장 범위
- 결정: 기존 V2 패턴은 유지(하위 호환). `TASK_ID_RE`/`TASK_ID_PATTERN` 별칭 + 일반 텍스트용 `extract_task_id` 추가.
- 이유: 외부 호출자가 `from utils.task_id_parser import TASK_ID_RE, is_valid_task_id` 쉽게 가능.
- 대안 (기각): 이름 변경 (BREAKING) — 하위 호환 깨짐.

### 4. 후속 task 영역 미수정 결정
- 결정: dispatch/__init__.py, scripts/done-watcher.py 등은 본 task 범위 외 (forbidden_paths or task scope guard 자체 영역)
- 이유: 본 task의 본질은 PR #42 차단 해소 = browser_verify + git_evidence. 다른 영역 수정은 별도 task가 적절.

## 3 Step Why 자문

**1st Why**: 왜 이 설계가 필요한가?
→ A: PR #42의 taskctl-state-guard FAIL이 workflow regex 수정만으로 해소 안 됨. parser/verifier 깊이의 task-N+M 미호환 잔존이 원인. 이를 코드 자동화로 영구 해결해야 PR 머지 가능.

**2nd Why**: 왜 A가 최선의 접근인가? (대안은 무엇이며 왜 이 접근이 최선인가)
→ B: 대안 1 (수동 우회: task ID를 task-N으로만 사용) — 시스템 V2 task ID 체계 자체와 충돌. 대안 2 (workflow regex만 수정) — 이미 task-2472+2에서 시도, 부족 입증됨. 대안 3 (verifier skip) — forbidden_actions(`verifier_skip`) 위반. 따라서 verifier 계층 코드를 공통 parser 기반으로 마이그레이션이 유일한 정합 해법.

**3rd Why**: 왜 B가 다른 대안보다 나은가?
→ C: 공통 parser util(`utils.task_id_parser`)에 SSOT를 두고 verifier 측은 그걸 호출하면, 향후 task ID 형식 진화(예: `task-N+M+P`) 시에도 한 곳만 수정. 회귀 테스트 7항으로 진화 대비 안전망 확보. 대안들은 SSOT 부재로 동일 사고 재발 위험.

논리 일관성 검증: A → B → C가 모두 "SSOT 기반 코드 자동화 + 회귀 테스트"로 수렴. PASS.

## 참조 자료

- 시스템 청사진: `/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/system_bot_orchestration_blueprint_260506.md`
- task-2472+2 evidence: `memory/events/task-2472+2.completion-evidence`, `memory/reports/task-2472+2.md`
- task-2472+1 차단: `memory/events/task-2472+1.merge-pending`, `memory/events/task-2472+1.merge-pending-rerun-evidence`
- task-2483 close blocker: `memory/events/task-2483.close-blocked-external`
- 인벤토리: `memory/events/task-2485.inventory.md`
- pre_push_guard 본문: `scripts/pre_push_guard.py` (B-1/B-3가 allowed_resources 매칭 사용 — 본 task와 lockstep 작동)

## 주의사항

- ❌ `dirty_check_removal` 금지 — git_evidence dirty 검사 자체를 제거하지 말 것
- ❌ `other_task_changes_cleanup` 금지 — 다른 task의 main repo 변경을 임의로 정리하지 말 것
- ❌ `verifier_skip` 금지 — pytest skip / `if False:` 패턴 금지
- ❌ `manual_exception_pattern` 금지 — 특정 task_id 하드코딩 우회 금지
- ❌ `.github/workflows/**` 수정 금지 — task-2472+2 영역
- ❌ `dispatch/__init__.py`, `scripts/taskctl.py`, `scripts/dispatch.py`, `scripts/finish-task.sh` 수정 금지
- 외부 AI(Codex/Gemini) 호출 전 sanitize_gate 통과 필수 (PII 마스킹)
