# task-2729+22 — RAW_KEY_DENYLIST_LITERAL_IN_TEST_HYGIENE Option A REPLACEMENT

- **레벨**: Lv.3 (QC verifier evidence-root hardening + test denylist hygiene)
- **base**: fresh origin/main `571a4ce3` (canonical task-2716 분기 아님)
- **branch**: `task/task-2729+22-dev4`
- **terminal_state**: `MERGE_APPROVAL_CANDIDATE_FILE_TOUCH_RATIO_ROOT_RECOGNITION_ACTIVE_FALSE` (후보 — CI/Gemini fresh gate 확인 후 확정)
- **activation**: false (production 전환 아님, merge·activation = 회장 별도 승인)

## 1. 배경
PR #194(task-2729+21, `245db3de`) 는 CODE_ROOT recognition + top-level 정규화
기능은 정상이나, 회귀 테스트의 raw-key denylist 에 실제 raw key full 16-hex
literal 을 박아 PR diff 노출 → `RAW_KEY_DENYLIST_LITERAL_IN_TEST_HYGIENE_BLOCKER`.
회장 2026-06-08 옵션 B 승인 → #194 same-branch push/rebase/cherry-pick 금지,
fresh origin/main 새 branch 에서 기능 재구현 + denylist 마스킹(Option A replacement).
#194 코드는 참고만(복붙/cherry-pick 0).

## 2. FRESH BASE HARD GATE (통과)
- `git worktree add -b task/task-2729+22-dev4 <path> origin/main` (origin/main = `571a4ce3`).
- `merge-base --is-ancestor 571a4ce3 HEAD` = YES.
- task-2716 divergence 0 (canonical 무손상, dirty config/constants.json 무관).
- diff `origin/main..HEAD` = expected_files(4)만.

## 3. 변경 파일 (4 — expected 3~4 이내)
- /home/jay/workspace/teams/shared/verifiers/file_touch_ratio_check.py
- /home/jay/workspace/tests/regression/test_file_touch_ratio_root_recognition_2729p22.py
- /home/jay/workspace/memory/reports/task-2729+22.md
- /home/jay/workspace/memory/plans/p0b-pickup/raw_key_denylist_masking_replacement_design_260608.md

## 4. 구현 요약
### verifier (`file_touch_ratio_check.py`)
- **env CODE_ROOT 인식**: `PROJECT_PATH → WORKTREE_PATH → QC_EVIDENCE_ROOT`
  (유효 git dir 시 채택), 없으면 `workspace_root` fallback(backward-compat).
- **top-level 정규화**: 선택 root 가 하위 디렉토리여도 `git rev-parse
  --show-toplevel` 로 정규화 → diff/report path mismatch 제거.
- **report-root / diff-root 분리**: report 는 canonical `workspace_root` read,
  diff 는 정규화된 CODE_ROOT 에서 계산.
- **HEAD~5 fail-safe**: 커밋 ≥6 → HEAD~5, 2..5 → bounded HEAD~(n-1), 1 →
  empty-tree, 0 → graceful SKIP (미정의 crash 0).
- **base_root "/" edge(MEDIUM, D안)**: 빈/루트 prefix catch-all 차단.
- 부수효과 0: report read 만, 파일 쓰기/외부 모듈 import 0.

### 회귀 테스트 (`test_..._2729p22.py`)
- **denylist 마스킹**: raw key 를 3/4/4/5 split fragment 로만 보관 → 어떤 줄에도
  연속된 full 16-hex literal 부재. `_denylist()` 가 런타임에만 조립(로그 미기록),
  assert 실패 메시지는 `_mask()` 만 출력 → full key 재구성 출력 0.
- positive control 로 detector 무력화 회귀 차단.

## 5. 회귀 결과 (isolated temp, 전부 PASS)
14 passed (회장 verbatim 13 + base_root "/" edge 1):
1. PR diff raw key literal 0 (소스/diff/로그 full key 0) — PASS
2. env root=repo root — PASS
3. env root=하위 디렉토리 top-level 정규화 — PASS
4. PROJECT_PATH/WORKTREE_PATH/QC_EVIDENCE_ROOT 우선순위 — PASS
5. env invalid → workspace_root fallback (crash 0) — PASS
5b. base_root "/" edge catch-all 차단 (D안) — PASS
6. canonical report + selected CODE_ROOT diff 조합 — PASS
7. 4/4 매칭 ratio 1.00 — PASS
8. HEAD~5 불가/커밋부족 fail-safe (단일커밋 empty-tree, 3커밋 bounded) — PASS
9. canonical dirty 가 selected CODE_ROOT clean finalize false-block 안 함 — PASS
10. per-team symlink parity (상대 8 수렴 + dev8 absolute caveat 1) — PASS
11. ACTIVE=false / systemd enable 0 / activation_epoch 0 / real spawn 0 — PASS
12. git_evidence·dispatch·callback 무수정 (verifier 단독, 쓰기 0) — PASS
13. canonical/외부 artifacts 무손상 (verify 파일 쓰기 0) — PASS

- pyright: 0 errors / 0 warnings.
- code-validator: ALL CHECKS PASSED.
- raw key full literal grep: 소스 0 / `origin/main..HEAD` diff 0.

## 6. self-dogfood
본 task finalize 도 `file_touch_ratio_check` 통과 확인(아래 §7). ANU
`origin/main..HEAD` diff 독립검증 = expected_files(4)만, raw key literal 0.

## 7. symlink parity / 무손상
- per-team 9팀 = `teams/<team>/qc/verifiers` 디렉토리 symlink → shared.
  shared 1파일 수정으로 10카피 동일성. 상대 8팀 워크트리 shared 수렴, dev8 =
  absolute double-hop caveat(구조 무변경). per-team 직접수정·디듀프 0.
- git_evidence.py / dispatch.py / callback prereg / qc_verify / per-team verifier
  무수정. canonical task-2716 무손상.

## 8. 판정
- 회귀 14 PASS + raw key literal 0 + top-level 정규화 유지 + HEAD~5 fail-safe +
  symlink parity + base_root "/" D안 처리.
- 잔여: PR 생성 + CI GREEN + fresh Gemini HIGH/CRITICAL 0 확인 후
  `MERGE_APPROVAL_CANDIDATE_FILE_TOUCH_RATIO_ROOT_RECOGNITION_ACTIVE_FALSE` 확정.
- merge·production activation = 회장 별도 승인 전까지 0.
