# task-2472+2 — CI workflow task_id regex suffix 호환 fix

- 작업 유형: **CI workflow regex hotfix** (task-N+M suffix 호환)
- 작업 레벨: **Lv.2**
- 위임팀: **dev1-team (헤르메스)**
- Track: **dev_workspace**
- 우선순위: **★★ blocking** — task-2472+1 PR #42 머지 chain 차단 해소
- 일시: 2026-05-07
- 선행: task-2472+1 STOP repair PASS + task-2479 (InsuRo) MERGED → dev_workspace `.github/workflows/` surface lock 해제
- 후행: 본 task 머지 → PR #42 CI 재실행 → taskctl-state-guard 2건 PASS → PR #42 머지

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

> .github/workflows/{guard,ci}.yml의 task_id 추출 regex가 `task-[0-9]+`로 좁아 task-N+M 형식(예: task-2472+1, task-2467+3)을 task-2472, task-2467로 잘라 인식한다. 이 시스템 결함을 **파일/코드 단에서 자동 인식하도록 수정**한다.
> **보고서만 작성하거나 수동 예외 처리로 우회하는 것은 금지.**

## allowed_resources

```yaml
allowed_resources:
  paths:
    - ".github/workflows/guard.yml"
    - ".github/workflows/ci.yml"
    - "tests/regression/test_workflow_taskid_regex*.py"
    - "scripts/verify_workflow_taskid_regex*.py"  # dry-run 검증 스크립트 (선택)
    - "memory/tasks/task-2472+2*"
    - "memory/reports/task-2472+2*"
    - "memory/plans/tasks/task-2472+2/**"
    - "memory/events/task-2472+2*"
  forbidden_paths:
    - "utils/state_repair.py"           # task-2472+1 본질, 수정 금지
    - "utils/g3_fail_classifier.py"     # task-2472+1 본질, 수정 금지
    - "utils/silent_corruption_guard.py"
    - "scripts/taskctl.py"              # reconcile 본질 로직, 수정 금지
    - "scripts/dispatch.py"
    - "scripts/finish-task.sh"
    - "scripts/refresh_bot_token.py"    # task-2483 영역, 섞기 금지
    - "memory/events/task-2472+1*"      # task-2472+1 PR 코드 수정 금지
    - "memory/events/task-2479*"
    - "memory/events/task-2481*"
    - "memory/events/task-2483*"
    - ".secrets/**"
  forbidden_actions:
    - admin_override
    - branch_protection_bypass
    - force_merge
    - manual_exception_in_workflow      # 수동 예외 / 임시 skip 금지
    - ci_bypass                         # CI bypass 금지
    - docs_only_pr                      # 문서만 수정한 PR 금지
    - mix_with_refresh_bot_token        # task-2483과 섞기 금지
    - mix_with_task_2472_plus_1_code    # task-2472+1 PR 코드 수정 금지
```

## 0. 배경 — 차단 evidence

- `task-2472+1.stop.txt` (2026-05-07T19:24): commit 05d9ea17 workflow 변경이 P0 surface 침범으로 STOP, workflow regex fix를 별도 task로 분리 명시
- task-2472+1 dev2팀 surface repair PASS — workflow 변경 revert 완료, 본질 commit `4c1e3fb3` 보존
- PR #42 (dev_workspace, task-2472+1) CI 실패 2건 — `taskctl-state-guard` 2회. 사유: workflow regex가 task-2472+1을 task-2472로 잘라 인식
- task-2479 (InsuRo) MERGED 확인 — dev_workspace `.github/workflows/` surface lock holder 없음 (task-2479는 InsuRo only)

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

### Step 1. 현재 regex 진단
- `.github/workflows/guard.yml`의 task_id 추출 regex 위치 + 패턴 식별
- `.github/workflows/ci.yml`의 task_id 추출 regex 위치 + 패턴 식별
- 어디에서 task-N+M이 잘리는지 정확한 line number + step name 명시

### Step 2. regex 수정
- 기존: `task-[0-9]+`
- 변경: `task-[0-9]+(\+[0-9]+)?`
- 또는 동등 효과: `task-[0-9]+(\+[0-9]+)?` (capture group 보존)
- 모든 출현 위치 일괄 갱신 (grep으로 누락 0건 검증)

### Step 3. 검증용 dry-run 스크립트 (권장)
- `scripts/verify_workflow_taskid_regex.py` 신설:
  - workflow yaml에서 regex 추출
  - 입력 sample: ["task-2472+1", "task-2467+3", "task-2483", "task-2472"] 모두 정확히 매칭 확인
  - 잘림 발생 시 exit 1
- CI에서 실행 가능하나 본 task에서는 local 검증만 (CI 추가는 후속 hardening task에서)

### Step 4. 회귀 테스트 (필수)
- `tests/regression/test_workflow_taskid_regex.py` 신설:
  - guard.yml + ci.yml의 regex가 다음 입력을 모두 정상 매칭:
    - `task-2472` (기존)
    - `task-2472+1` (suffix +1)
    - `task-2467+3` (suffix +3)
    - `task-2483` (4자리)
  - 각 입력에 대해 `task-N` 부분이 잘리지 않고 `task-N+M` 전체 캡처
  - 잘림 발생 시 fail-closed

### Step 5. PR #42 CI 재실행 가능 여부 명시
- 본 task 머지 후 PR #42에서 어떤 명령으로 CI 재실행하는지 (workflow_dispatch 또는 push 트리거)
- 예상: 본 task가 main에 머지되면 PR #42의 CI workflow가 새 regex로 실행 → taskctl-state-guard 2건 PASS

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

1. ✅ task-2472+1 형식이 `task-2472`로 잘리지 않음
2. ✅ task-2467+3 같은 기존 suffix task_id도 정상 인식
3. ✅ taskctl-state-guard 2건 PASS (workflow fix 후 PR #42에서 검증)
4. ✅ PR #42 CI 재실행 시 해당 실패 해소
5. ✅ workflow 변경 외 surface 침범 0
6. ✅ allowed_resources 위반 0
7. ✅ 회귀 테스트 PASS

## 3. 금지 (회장 명시)

- ❌ `utils/state_repair.py` 수정
- ❌ `utils/g3_fail_classifier.py` 수정
- ❌ `scripts/taskctl.py` reconcile 본질 로직 수정
- ❌ task-2472+1 PR 코드 수정
- ❌ refresh_bot_token.py 복구와 섞기 (task-2483 영역)
- ❌ 문서만 수정하는 PR
- ❌ 수동 예외 / 임시 skip / CI bypass

## 4. 보고 형식

- SCQA 4섹션
- Step 1~5 각 결과 (PASS / FAIL / N/A)
- 합격 조건 7가지 evidence 포함
- regex 변경 diff 명시 (before/after)
- forbidden_actions 위반 0건 검증

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

- 시스템 청사진: `/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/system_bot_orchestration_blueprint_260506.md`
- task-2472+1 STOP 사유 박제: `/home/jay/workspace/memory/events/task-2472+1.stop.txt`
- DOGFOODING_PENDING 분류 룰: `/home/jay/.claude/projects/-home-jay--cokacdir-workspace-autoset/memory/feedback_dogfooding_pending_classification_260507.md`

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

- task-2472+1 PR #42 머지 (본 task 완료 후)
- task_id 형식 검사기 일괄 패치는 **별도 hardening task** (workflow fix 이후 범위 조사 + 관련 parser/validator/regex 일괄 검색 + task-N+M 호환성 누락 지점 목록화)