# task-2723+2 — critical_gap zero-count guard 한글 word-boundary FINAL surgical fix (round-3, 회장 명시 승인)

## 회장 인가 (2026-06-03, T5 HIGH — round-3 FINAL surgical, chair_override=true)
PR #169(head `bf150dfa`) Gemini **T5 HIGH** 유효: `_ZC_ZERO_EXPR` 의 선행 `\b` 가 한글 무공백 표현에서 동작 안 함 → "총0건", "이슈없음", "이슈없다" 같은 **정상 zero-count 문구를 오탐**(suppress 실패 → FAIL). round-2 narrowed fix 의 정합성 회귀. ANU 재현 확정: `- CRITICAL 총0건`/`- CRITICAL 이슈없음`/`- CRITICAL 이슈없다` 현재 FAIL(should PASS).
★ **이번은 같은 regex 영역 round-3 FINAL.** 이후 새 HIGH/CRITICAL → 추가 패치 금지 → LOOP_BOUNDARY/CHAIR_REQUIRED 로 **설계 재검토(redesign/alternative resolver)**. 기본값은 추가 패치 아님.

## worktree
- `/home/jay/workspace/.worktrees/task-2723-dev2` (branch `task/task-2723-dev2`, head `bf150dfa`)에서 **이어서**. new head → non-force push.

## 근본 원인 (ANU 확정)
`_ZC_ZERO_EXPR = re.compile(r"(?:\b0\s*건\b|\b0\s*개\b|[:=]\s*0(?!\d)|count\s*=\s*0|\b없음\b|없습니다|\b없다\b)")`
- Python `re` 에서 한글은 `\w`(word char). "총0건" 의 "총"(word)↔"0"(word) 사이엔 `\b` 경계 없음 → `\b0` 미매칭. "이슈없음" 의 "이슈"↔"없음" 도 동일 → `\b없음` 미매칭. → zero-expr 매칭 실패 → suppress 실패 → 정상 zero-count 가 FAIL(오탐).

## 핵심 설계 (surgical — 선행 \b만 제거, 나머지 원칙 불변)
`_ZC_ZERO_EXPR` 의 **선행 `\b`를 숫자 전방 방어 `(?<!\d)` 로 교체**하고 **한글어 앞/뒤 word-boundary 의존 제거**:
- `\b0\s*건\b` → `(?<!\d)0\s*건`
- `\b0\s*개\b` → `(?<!\d)0\s*개`
- `\b없음\b` → `없음`
- `\b없다\b` → `없다`
- 유지: `[:=]\s*0(?!\d)` · `count\s*=\s*0` · `없습니다`
즉 round-3 `_ZC_ZERO_EXPR ≈ re.compile(r"(?:(?<!\d)0\s*건|(?<!\d)0\s*개|[:=]\s*0(?!\d)|count\s*=\s*0|없음|없습니다|없다)")`

★ **유지 원칙 (변경 금지)**:
1. **count-context anchor 결속 유지** — zero-expr 단독 suppress 금지. `_ZC_COUNT_ANCHOR` 동일 줄 필수. (없음/0건/=0 을 다시 넓게 suppress 하지 말 것)
2. **strong issue marker 미억제 유지** — `[CRITICAL]`/`[HIGH]`/`![critical]`/`![high]`/`severity:` → suppress 안 함
3. **vuln deny-list 미억제 유지** — 인증/권한 검증/암호화/패치/수정/조치/해결 없음, secure_mode=0/timeout=0/port=0 → suppress 안 함
4. `_is_zero_count_context` 의 denylist/strong-marker 우선 순서 불변 (denylist·strong 먼저 False 반환 → 그 다음 anchor∧zero)

## 허용 파일 (expected_files 2개 — 그 외 수정 금지)
1. `teams/shared/verifiers/critical_gap.py` ← `_ZC_ZERO_EXPR` 선행 \b → (?<!\d) 교체만
2. `tests/regression/test_critical_gap_false_positive_2506.py` ← 한글 무공백 zero-count 회귀 3건 추가 + 기존 유지

## 필수 regression (회장 명시 16)
PASS 유지(zero-count 인정):
1. HIGH/CRITICAL 0건  2. CRITICAL=0  3. fresh unresolved HIGH/CRITICAL = 0  4. 신규 HIGH 없음  5. 신규 CRITICAL 없음
6. **총0건**  7. **이슈없음**  8. **이슈없다**  (★ round-3 신규 — anchor 동반 문맥으로 구성: 예 "- CRITICAL 총0건", "- 이슈없음", "- 이슈없다". "이슈"가 anchor)
FAIL 유지(탐지력):
1. [CRITICAL] 인증 없음  2. [CRITICAL] 권한 검증 없음  3. [CRITICAL] 암호화 없음  4. [HIGH] secure_mode=0  5. [HIGH] timeout=0  6. [CRITICAL] port=0  7. 신규 버그, 패치 없음([CRITICAL] 문맥)  8. 기존 unresolved HIGH/CRITICAL 탐지력(기존 fp/tp/zc 전부 유지)

## 금지 (회장 verbatim)
- expected_files 2개 밖 수정 금지 · **verifier public interface/schema 변경 금지**(verify signature·return `{status,details}` 불변) · finish-task.sh / dispatch runtime / pickup / systemd / activation / systemctl / real wake / credential 확장 / Work 착수 / merge / force push·rebase·admin override 금지.
- **없음/0건/=0 자체를 다시 넓게 suppress 금지** — 반드시 count-context anchor 결속 유지. anchor/denylist/strong-marker 원칙 변경 금지.

## 검증 조건
1. round-3 regression 전부 의도대로 PASS (기존 40 + 신규 3 = 43 예상, PASS 8 + FAIL 8 의도 일치).
2. `git diff --name-only origin/main` = expected_files 2파일 내부. 3. forbidden 0. 4. ANU key full literal(`c119085addb0f8b7`) 0. 5. verify interface/schema 불변.
- smoke: `python3 -m pytest tests/regression/test_critical_gap_false_positive_2506.py -q`.

## doctrine
- same-PR post-Gemini push 금지(round-3 fix = 새 commit→new head→non-force push, amend 금지). bot `/gemini review` 무효(인간 OWNER 1회만). long polling 금지(watcher 위임).

## finalize (PR 갱신까지 — merge 금지)
1. \b→(?<!\d) 교체 → regression PASS → `git add` 2파일 → commit → **non-force push**(PR #169 갱신).
2. `memory/reports/task-2723.md` 보고서 갱신(round-3 + L1). 3. `memory/events/task-2723+2.done` 생성.
4. ANU normal callback cron 강제 등록 — collector_role=ANU, ANU_KEY=c119085addb0f8b7(sealed, literal 노출 금지). self-key 금지(SELF_COLLECTOR_FORBIDDEN). cron 0+sendfile only = NOT_REGISTERED fail-closed.
5. ★ merge 금지 — ANU/watcher 가 새 head OWNER /gemini review → CI/Gemini watcher → MERGE_READY_CANDIDATE 판정·보고.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "teams/shared/verifiers/critical_gap.py"
    - "tests/regression/test_critical_gap_false_positive_2506.py"
    - "memory/reports/task-2723.md"
    - "memory/events/task-2723+2.done"
  forbidden_paths:
    - "scripts/finish-task.sh"
    - "dispatch/**"
    - "deploy/systemd/**"
    - ".github/**"
  commands:
    - "pytest"
    - "python3 -m pytest"
    - "python3 -m py_compile"
  merge_policy: "none"
  ttl_hours: 48
```

## goal_assertions (auto)
- `python3 -m pytest tests/regression/test_critical_gap_false_positive_2506.py -q`
- `python3 -c "import sys; s=open('teams/shared/verifiers/critical_gap.py').read(); sys.exit(0 if '(?<!\\\\d)0' in s else 1)"`
- `python3 -c "import sys; s=open('teams/shared/verifiers/critical_gap.py').read(); sys.exit(1 if 'c119085addb0f8b7' in s else 0)"`