# task-2485 — task_id parser/verifier task-N+M 호환 자동화 hardening

- 작업 유형: **시스템 hardening / verifier 계층 코드 자동화**
- 작업 레벨: **Lv.3** (Lv.3+)
- 위임팀: **dev1-team (헤르메스)**
- 우선순위: **★★ blocking** — task-2472+1 PR #42 머지, task-2483 close lifecycle, task-2484 자동 해소 모두 의존
- Track: **dev_workspace**
- 일시: 2026-05-07
- 선행: task-2472+2 머지 완료(PR #46) — workflow regex만 수정, 다른 계층 미반영
- 후행: 본 task 머지 → PR #42 CI 자동 PASS → task-2472+1 .done → task-2483 finish-task 재실행 → MERGED_DONE

## ⚠️ 본 task의 본질 — 회장 명시

> 시스템 전 계층(parser / validator / verifier / hook / evidence collector / taskctl)에서 task-N과 task-N+M 형식을 자동 인식하게 만든다. **문서화/목록화/박제만으로 종료 금지. 반드시 코드 수정 + 테스트 + PR 머지까지 수행한다.**

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "scripts/pre_push_guard.py"
    - "scripts/qc_report_guard.py"
    - "scripts/guard.sh"
    - "scripts/verify_task_id_hardening.py"  # 신설 dry-run 검증 스크립트
    - "scripts/verify_workflow_taskid_regex*.py"
    - "utils/task_id_parser*.py"  # 신설 또는 확장
    - "utils/git_evidence*.py"
    - "teams/dev1/qc/verifiers/browser_verify.py"
    - "teams/dev1/qc/verifiers/**/*.py"  # 다른 verifier 호환 패치 가능
    - "tests/regression/test_task_id_parser*.py"
    - "tests/regression/test_browser_verify*.py"
    - "tests/regression/test_git_evidence*.py"
    - "tests/regression/test_workflow_taskid_regex*.py"
    - "memory/tasks/task-2485*"
    - "memory/reports/task-2485*"
    - "memory/plans/tasks/task-2485/**"
    - "memory/events/task-2485*"
  forbidden_paths:
    - ".github/workflows/**"  # task-2472+2에서 이미 처리됨
    - "scripts/refresh_bot_token.py"  # task-2483 영역
    - "utils/state_repair.py"  # task-2472+1 본질
    - "utils/g3_fail_classifier.py"  # task-2472+1 본질
    - "utils/silent_corruption_guard.py"
    - "scripts/taskctl.py"  # 본질 로직
    - "scripts/dispatch.py"
    - "scripts/finish-task.sh"
    - ".secrets/**"
    - "memory/events/task-2472*"
    - "memory/events/task-2479*"
    - "memory/events/task-2481*"
    - "memory/events/task-2483*"
    - "memory/events/task-2484*"
  forbidden_actions:
    - admin_override
    - branch_protection_bypass
    - force_merge
    - docs_only_pr
    - listing_only_completion
    - followup_only_completion
    - hardcoded_task_id
    - verifier_skip
    - gate_bypass
    - dirty_check_removal  # git_evidence dirty check 자체 제거 금지
    - other_task_changes_cleanup  # 다른 task 변경 정리 금지
    - manual_exception_pattern  # 수동 예외 처리 금지
```

## 0. 배경 — 차단 evidence

- task-2472+2 PR #46 MERGED — workflow regex `task-[0-9]+` → `task-[0-9]+(\+[0-9]+)?` 적용
- 그러나 PR #42 CI 재실행 시 taskctl-state-guard 2건 여전히 FAIL
- 실패 사유: `B-3 task scope 일치 — task scope 밖 파일 1건: utils/g3_fail_classifier.py`
- 검증: task-2472+1.md 및 task-2472+1.json 모두 `utils/g3_fail_classifier.py` 명시
- 결론: **workflow regex만으로 부족. parser/verifier 계층 깊이에서 task-N+M 미호환 잔존**
- evidence: `memory/events/task-2472+1.merge-pending-rerun-evidence`

## 1. 작업 범위 (회장 명시 4파트)

### Step A. 전수 검색 (필수)

다음 패턴을 workspace 전 범위에서 검색:
- `task-[0-9]+` (literal 사용 위치)
- task_id regex / parser / validator / verifier
- evidence task_id extraction
- hook task_id validation
- taskctl task_id parsing
- finish-task.sh task_id 처리
- browser_verify task_id 처리
- git_evidence repo dirty check

목표: task-N만 허용하고 task-N+M을 거부하거나 잘라먹는 지점을 **모두** 식별. 결과는 별도 inventory file로 박제하되 그 자체로는 완료 아님.

### Step B. 공통 parser/regex 유틸 도입 또는 확장

권고 모듈: `utils/task_id_parser.py` (이미 있으면 확장)

API 후보:
- `is_valid_task_id(task_id: str) -> bool`
- `extract_task_id(text: str) -> str | None`
- `TASK_ID_RE` (compiled regex)
- `TASK_ID_PATTERN` (string)

요구사항 (회귀 테스트로 검증):
- task-2472 → PASS
- task-2472+1 → PASS
- task-2472+2 → PASS
- task-2467+3 → PASS
- task-abc → FAIL
- task-2472+ → FAIL
- task-2472++1 → FAIL
- foo-task-2472+1-bar → extract 시 task-2472+1 정상 추출
- 기존 task-N legacy 동작 미파괴

전수 검색에서 식별된 지점 모두 이 공통 유틸을 사용하도록 마이그레이션.

### Step C. browser_verify.py 패치

대상: `teams/dev1/qc/verifiers/browser_verify.py`

현재 실패: "잘못된 task_id 형식: task-2472+2"

수정 목표:
- task-2472+2 같은 suffix task_id를 정상 task_id로 인정
- invalid task_id는 여전히 FAIL

완료 조건:
- browser_verify.py 단독 실행 또는 해당 verifier 테스트에서 task-2472+2 PASS
- invalid (task-abc, task-2472++1 등) 여전히 FAIL

### Step D. git_evidence verifier 개선

현재 실패: main repo `/home/jay/workspace`에 다른 task의 staged/unstaged 변경이 있으면 현재 task가 FAIL 처리됨.

수정 목표:
- 현재 task의 worktree 상태와 main repo dirty 상태를 분리 판단
- 현재 task worktree clean이면 PASS 가능
- main repo에 다른 task 변경이 있어도 현재 task FAIL 처리하지 않음
- 단, 현재 task worktree 자체가 dirty이면 FAIL 유지
- evidence에는 어떤 repo/worktree 기준으로 검사했는지 명시

금지:
- ❌ dirty check 자체 제거
- ❌ 모든 dirty 상태 PASS 처리
- ❌ 다른 task 변경 임의 정리

## 2. 필수 회귀 테스트 7항 (회장 명시)

`tests/regression/test_task_id_parser*.py`, `test_browser_verify*.py`, `test_git_evidence*.py` 등에 추가:

1. ✅ task-N legacy valid (task-2472 등 여전히 PASS)
2. ✅ task-N+M suffix valid (task-2472+1, task-2467+3 등)
3. ✅ invalid task_id reject (task-abc, task-2472+, task-2472++1)
4. ✅ branch / title / text에서 task-N+M extract 정상
5. ✅ browser_verify가 task-2472+2를 거부하지 않음
6. ✅ git_evidence가 main repo dirty와 current worktree dirty 구분
7. ✅ 기존 task-N 작업 흐름 미파괴

★ **하드코딩성 `assert True` 금지. 실제 parser/verifier 코드를 호출.**

## 3. 검증 자동화 (필수)

`scripts/verify_task_id_hardening.py` 신설 또는 기존 검증 스크립트 확장.

목표: local/CI 어디서나 다음을 한 번에 검증
- task_id parser valid/invalid matrix
- browser_verify task-N+M acceptance
- git_evidence worktree 기준 판단
- legacy task-N backward compatibility

완료 예: `python3 scripts/verify_task_id_hardening.py` → PASS

## 4. 합격 조건 9건 (회장 명시)

본 task는 아래를 **모두** 만족해야 완료:

1. ✅ 코드 변경 PR 생성
2. ✅ regression test PASS
3. ✅ dry-run 검증 (`scripts/verify_task_id_hardening.py`) PASS
4. ✅ browser_verify.py가 task-2472+2 정상 인식
5. ✅ git_evidence가 다른 task의 main repo dirty 상태로 현재 task 오탐 안 함
6. ✅ forbidden_paths / gate bypass / skip 위반 0건
7. ✅ CI required checks PASS
8. ✅ PR MERGED
9. ✅ .done 생성 또는 .done 차단 사유 0건

★ **보고서와 followup.txt는 evidence일 뿐. 코드 자동화 PR 없이 완료 처리 금지.**

## 5. 금지 (회장 명시 7건 + 보강 4건)

- ❌ 문서화만 하고 종료
- ❌ 목록화만 하고 종료
- ❌ followup.txt 박제만 하고 종료
- ❌ 특정 task_id 하드코딩
- ❌ verifier skip / gate bypass / `if: false`
- ❌ dirty check 제거
- ❌ 다른 task 변경 정리
- ❌ admin override / branch protection bypass / force merge
- ❌ workflow modification (task-2472+2 영역, 본 task 범위 외)
- ❌ task-2472+1 / task-2483 본질 코드 추가 수정
- ❌ 수동 예외 처리

## 6. 보고 형식

- SCQA 4섹션
- Step A~D 각 결과 (PASS / FAIL / N/A)
- 합격 조건 9가지 evidence 포함
- 회귀 테스트 7항 결과 표
- forbidden_actions 위반 0건 검증
- 전수 검색 inventory (별도 파일 박제 권고)

## 7. 시스템 3문서 참조 (필수)

- 시스템 청사진: `/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 차단 evidence: `memory/events/task-2472+1.merge-pending`, `memory/events/task-2472+1.merge-pending-rerun-evidence`
- task-2483 close blocker evidence: `memory/events/task-2483.close-blocked-external`
- task-2484 보류 evidence (read-only): `memory/tasks/task-2484.md`
- MERGED_CLOSE_BLOCKED_EXTERNAL 분류 룰: `memory/feedback/feedback_merged_close_blocked_external_classification_260507.md`
- MERGE_PENDING_DEPENDENCY 분류 룰: `memory/feedback/feedback_merge_pending_dependency_classification_260507.md`
- Phase B 통합 항목: `memory/orchestration/phase_b_integration_items_260507.md`

## 8. 후속 (회장 명시 — 본 task 범위 외)

- 본 task 머지 후:
  1. PR #42 CI 자동 재실행 → taskctl-state-guard 2건 PASS
  2. PR #42 머지 → task-2472+1 .done 자동 생성 (MERGE_PENDING_DEPENDENCY 해소)
  3. task-2483 finish-task.sh 재실행 → MERGED_DONE 정리 (MERGED_CLOSE_BLOCKED_EXTERNAL 해소)
  4. task-2484 보류 해제 또는 자동 해소

## goal_assertions (auto-generated)

- `python3 scripts/verify_task_id_hardening.py` exit 0
- `pytest tests/regression/test_task_id_parser*.py tests/regression/test_browser_verify*.py tests/regression/test_git_evidence*.py -v` PASS
- PR #42 CI rerun 후 taskctl-state-guard 2건 PASS