# [DRAFT — HOLD] A. QC critical_gap text-token false-positive hardening

> ★ 이 문서는 **초안**입니다. dispatch 금지. 회장 승인 후에만 task-NNNN 할당 + 위임. 코드 변경 0 (현재 단계).

## 분류
- priority: Core hardening HIGH
- severity: process-integrity smell (non-Critical7)
- recurrence: 2회+ (task-2721+4, task-2722) — RECURRING_DEFECT
- backlog 단일소스: `memory/events/backlog_qc_text_token_false_positive_260602.json`

## 근본 원인 (read-only 확인, 2026-06-02)
`teams/shared/verifiers/critical_gap.py` 가 보고서 **텍스트**에 정규식으로 CRITICAL/HIGH 이슈 마커를 탐지(ISSUE_MARKER 패턴: 헤더/리스트/`severity:critical`/`![critical|high]` badge). 그러나:
- RESOLVED 판정에는 부정문맥 가드(`미해결`/`해결 안 됨` 등)가 있으나,
- **ISSUE 탐지에는 "0건/없음/= 0/no findings" 같은 부정(개수=0) 문맥 가드가 없음.**
→ "HIGH/CRITICAL 신규 0건", "fresh unresolved HIGH/CRITICAL = 0" 처럼 **0건을 명시한 보고 문구**가 미해결 critical 이슈로 **오탐**. 봇이 보고서 문구를 바꿔서 WARN 우회 → 게이트 신뢰성 훼손.

## 목표 (2-track, 회장 택1 보고용)
- **Track 1 (surgical, 권장 1차)**: ISSUE_MARKER 매칭 직후 same-line/근접 컨텍스트에 zero-count 부정 토큰(`0건`, `0 건`, `없음`, `= ?0\b`, `없습니다`, `no (high|critical)`, `없이`)이 있으면 이슈로 카운트하지 않는다. RESOLVED 의 부정 가드와 대칭.
- **Track 2 (구조화, 근본)**: 보고서 자유텍스트 토큰 매칭을 폐기하고 **구조화 필드(finding_id / severity / resolved status)** 기반으로 critical_gap 을 판정. decision-as-data(`finding_attribution_v1`) 연계. (범위 큼 → 별도 단계)

## expected_files 후보 (회장 확정 필요)
1. `teams/shared/verifiers/critical_gap.py` ← 주 수정 (Track 1: zero-count 부정 가드 추가)
2. `teams/shared/verifiers/tests/test_critical_gap_*.py` 또는 기존 테스트 ← zero-count false-positive 회귀 추가 (경로 dispatch 전 확정)

## forbidden (이 task 범위 밖)
- finish-task.sh / dispatch runtime / pickup driver / systemd / activation flag 수정 금지
- QC 외 다른 verifier 동작 변경 금지
- 보고서 텍스트 컨벤션 강제(봇 보고 포맷)로 회피하는 방식 금지 — verifier 자체를 고쳐야 함

## verification_plan
1. zero-count 문구("HIGH/CRITICAL 신규 0건" 등) 포함 보고서 → critical_gap PASS (오탐 0) 회귀
2. 실제 미해결 CRITICAL(badge `![critical]` + resolved 없음) → 여전히 FAIL (탐지력 보존)
3. 기존 critical_gap 테스트 전부 PASS (regression 무손상)
4. py_compile PASS

## bounded loop
- severity = MEDIUM/process-integrity. code fix 시 remediation_round 예산 max 2/PR.
- 새 HIGH/CRITICAL 발생 시 즉시 CHAIR_REQUIRED.

## 상태
DRAFT_HOLD — auto_continue_allowed=false. chair_required_reason: 실제 코드 수정 PR 은 회장 승인 전 dispatch 금지.
