# task-2723+2 round-3 FINAL surgical fix (2026-06-03, 오딘 / 회장 명시 승인)

> 이어서 작업: PR #169, worktree `/home/jay/workspace/.worktrees/task-2723-dev2` (branch `task/task-2723-dev2`)
> 이전 head `bf150dfa` → 새 head `a2783b39` (non-force push)

## SCQA 요약 (round-3)

**S (상황)**: round-2(`bf150dfa`)에서 `_ZC_ZERO_EXPR` 의 zero 표현 정규식이 선행 `\b` 에 의존했다.

**C (문제)**: Gemini T5 HIGH 유효 — Python `re` 에서 한글은 `\w`(word char)라 "총0건"의 한글(총)↔숫자(0), "이슈없음"의 한글(이슈)↔한글(없음) 사이에 `\b` 경계가 없다. 따라서 `\b0`/`\b없음` 미매칭 → zero-expr suppress 실패 → 정상 zero-count 문구("- CRITICAL 총0건", "- 이슈없음", "- 이슈없다")가 오탐되어 FAIL.

**Q (질문)**: anchor 결속·strong marker·vuln deny-list 원칙을 전부 유지하면서 한글 무공백 zero-count 오탐만 제거할 수 있는가?

**A (답변)**: `_ZC_ZERO_EXPR` 의 **선행 `\b`만 숫자 전방 방어 `(?<!\d)` 로 교체**하고 한글어 word-boundary 의존을 제거하는 surgical 변경으로 달성. 나머지 가드(count-context anchor 결속, strong issue marker 미억제, vuln deny-list 미억제, `_is_zero_count_context` 우선순위)는 불변. verify 시그니처·return `{status,details}` 스키마 불변. 회귀 43건(기존 40 + 신규 3) 전수 통과.

## 변경 내용 (round-3)

```python
# before (round-2)
_ZC_ZERO_EXPR = re.compile(
    r"(?:\b0\s*건\b|\b0\s*개\b|[:=]\s*0(?!\d)|count\s*=\s*0|\b없음\b|없습니다|\b없다\b)"
)
# after (round-3)
_ZC_ZERO_EXPR = re.compile(
    r"(?:(?<!\d)0\s*건|(?<!\d)0\s*개|[:=]\s*0(?!\d)|count\s*=\s*0|없음|없습니다|없다)"
)
```
- `\b0\s*건\b` → `(?<!\d)0\s*건` / `\b0\s*개\b` → `(?<!\d)0\s*개` (숫자 전방 방어 유지: "10건"은 미매칭)
- `\b없음\b` → `없음` / `\b없다\b` → `없다` (한글 word-boundary 의존 제거)
- 유지: `[:=]\s*0(?!\d)` · `count\s*=\s*0` · `없습니다`

## 수정 파일 (expected_files 2개 내부, 그 외 0)
1. `teams/shared/verifiers/critical_gap.py` — `_ZC_ZERO_EXPR` 1줄 + 의도 주석 3줄
2. `tests/regression/test_critical_gap_false_positive_2506.py` — round-3 회귀 3건 append (기존 40건 무수정)

## 테스트 결과 (round-3)
- `python3 -m pytest tests/regression/test_critical_gap_false_positive_2506.py -q` → **43 passed in 0.18s**
- 신규 PASS(zero-count 인정): R3-1 `- CRITICAL 총0건`, R3-2 `- 이슈없음`, R3-3 `- 이슈없다` ("이슈"가 anchor)
- 탐지력 보존(FAIL 유지): `[CRITICAL] 인증 없음`, `[CRITICAL] port=0`, `[HIGH] secure_mode=0`, `[HIGH] timeout=0`, `[CRITICAL] 신규 버그 패치 없음`, ZC10 `수정 없음`, ZC11 `![critical]` 전부 유지

## 검증 조건 (전수 충족)
1. round-3 regression 43건 의도대로 PASS ✓
2. `git diff --name-only origin/main` = expected_files 2파일 내부 ✓ (forbidden 0)
3. goal_assertion `(?<!\d)0` present → PASS ✓
4. goal_assertion ANU key literal 부재 (critical_gap.py + 테스트 파일 모두) → PASS ✓
5. verify interface/return schema 불변 ✓

## L1 스모크테스트 결과 (round-3, 필수 기록)
- **서버 재시작**: 해당없음 (순수 verifier 모듈 — 서버/HTTP 무관)
- **API 응답 확인**: 해당없음 (HTTP API 아님)
- **실동작 확인(LIVE verify() end-to-end)**: 통과 — 임시 보고서 5종을 작성해 `critical_gap.verify()` 라이브 호출:
  - `- CRITICAL 총0건` → PASS ✓ / `- 이슈없음` → PASS ✓ / `- 이슈없다` → PASS ✓
  - `- [CRITICAL] 인증 없음` → FAIL ✓ / `- [CRITICAL] port=0` → FAIL ✓
  - L1 RESULT: **ALL_OK** (pytest와 별개로 실제 모듈 실행 확인. pytest PASS ≠ 실동작이므로 별도 e2e 호출 수행)
- **스크린샷**: 해당없음 (CLI/모듈 — UI 없음)

## 머지 판단 (round-3)
- **머지 필요**: Yes (단, merge_policy=none — ★ 본 task에서 merge 금지)
- **브랜치**: task/task-2723-dev2 (head `a2783b39`)
- **워크트리 경로**: /home/jay/workspace/.worktrees/task-2723-dev2
- **머지 의견**: round-3 FINAL surgical. expected_files 2개 내부, 회귀 43건 PASS(PASS/FAIL 의도 일치), L1 e2e ALL_OK. ★ merge 금지 — ANU/watcher가 새 head(`a2783b39`) OWNER `/gemini review` → CI/Gemini watcher → MERGE_READY_CANDIDATE 판정·보고. 실제 merge는 회장 승인.

## doctrine 준수 (round-3)
- same-PR post-Gemini push: 새 commit(`a2783b39`)→new head→non-force push로 진행, amend 미사용 ✓
- ★ round-3 = 같은 regex 영역 FINAL. 이후 새 HIGH/CRITICAL → 추가 패치 금지 → LOOP_BOUNDARY/CHAIR_REQUIRED (redesign/alternative resolver) ✓
- bot `/gemini review` 무효(인간 OWNER 1회만), long polling 금지(watcher 위임) ✓

## 모델 사용 기록 (round-3)
- 토르(백엔드, `_ZC_ZERO_EXPR` 교체 + sanity check): sonnet
- 헤임달(테스터, round-3 회귀 3건 append): sonnet
- 통합/회귀/검증/커밋/push/L1 e2e/보고: 오딘(Opus, 팀장)
- haiku 미사용 (정규식 정합성·탐지력 보존 정밀도 요구)

