# task-1437.1 완료 보고서: modularity-check.py scan 오탐률 개선

**S**: modularity-check.py scan이 코드베이스 전체에서 하드코딩된 값(ChatID, 절대경로, DQ 폰트, 팀명)을 감지하여 총 1,893건 위반을 보고하고 있다.

**C**: 보고된 위반의 대부분이 오탐(false positive)이다. env fallback 패턴(`os.environ.get("KEY", "fallback")`), config fallback 패턴, tests/ 내 의도적 하드코딩, 이미 정리된 워크트리/생성 파일 등이 모두 FAIL로 집계되어 실제 위반을 식별하기 어렵다.

**Q**: 오탐을 제거하여 실제 위반만 정확히 감지할 수 있는가?

**A**: 4가지 개선(경로 제외 확장, env/config fallback 컨텍스트 인식, tests/ WARNING 전환, 결과 요약 개선)을 적용하여 FAIL을 1,207건 → 816건으로 32% 감소시켰다. env fallback 118건, config fallback 2건을 정확히 스킵하며, tests/ 852건을 WARNING으로 재분류했다. `--exclude-tests` 옵션 사용 시 총 1,242건(FAIL: 816, WARN: 426)으로 정리된다.

## 수정 전/후 비교

**수정 전:**
- FAIL: 1,207건 / WARN: 686건 / 합계: 1,893건
- env fallback, config fallback 모두 FAIL로 오탐
- tests/ 내 하드코딩도 FAIL로 카운트
- .worktrees, output 등 불필요 디렉토리도 스캔

**수정 후:**
- FAIL: 816건 / WARN: 1,278건(tests 포함) / 합계: 2,094건
- `--exclude-tests` 시: FAIL: 816건 / WARN: 426건 / 합계: 1,242건
- env fallback 스킵: 118건 / config fallback 스킵: 2건
- tests/ → WARNING 전환: 852건
- FAIL 32% 감소 (1,207 → 816)

## 변경사항 상세

### 1. 스캔 제외 경로 추가
EXCLUDE_DIRS에 `.worktrees`, `__pycache__`, `.git`, `node_modules`, `output` 5개 추가

### 2. 오탐 제외 패턴 (컨텍스트 인식)
- `_ENV_FALLBACK_RE`: `os.environ.get(...)`, `os.getenv(...)`, `default=os.environ.get(...)` 패턴
- `_CONFIG_FALLBACK_RE`: `get_constant/get_path/get_config(...) if/or` 패턴
- 각각 `_is_env_fallback()`, `_is_config_fallback()` 헬퍼 함수로 구현

### 3. tests/ 처리 변경
- `_is_in_tests(rel)`: `tests/` 또는 `/tests/` 경로 판별
- tests/ 내 모든 카테고리 위반을 `tests_violations` 리스트로 분리, WARNING 레벨
- `--exclude-tests` 옵션: tests/ 위반을 출력에서 완전 제거

### 4. 결과 요약 개선
- 텍스트 출력에 "오탐 제외 통계" 섹션 추가
- JSON 출력에 `skipped_env_fallback`, `skipped_config_fallback`, `tests_warnings`, `tests_violations` 필드 추가

## 검증 결과

### 감지 정확도 테스트
- 실제 하드코딩 감지: chat_id 1건, absolute_path 1건, team_name 1건 정확히 감지
- env fallback 오탐: 0건 (올바르게 스킵)
- 결과: ALL DETECTION TESTS PASSED

### verify 커맨드
- 기존과 동일 동작 확인: 11 sources, 정상 26, 경고 0, 실패 0

### 정적 분석
- pyright: 0 errors, 0 warnings, 0 informations

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **JSON 출력 chat_id 중복 구성** — 불필요한 중첩 리스트 컴프리헨션을 단순화
   - 수정: `tools/modularity-check.py:318-344` 정리
2. **env fallback 카운터 조건부 증가** — 패턴 매칭 시 실제 위반 패턴과 교차하는 경우만 카운트하도록 조건 추가
   - 수정: `tools/modularity-check.py:237-244`
3. **tests_violations 총계 계산** — exclude_tests 플래그에 따라 WARN 총계가 정확히 반영되도록 수정
   - 수정: `tools/modularity-check.py:318`

## 산출물

- `/home/jay/workspace/tools/modularity-check.py`

## 모델 사용 기록

- 팀원: 스바로그 / 작업 내용: modularity-check.py 코드 수정 구현 / 사용 모델: sonnet / 정당성: -
