# replacement_pr_runner 0바이트 truncate — Root Cause Preflight (read-only)

상태명: `REPLACEMENT_PR_RUNNER_TRUNCATE_HYGIENE_ROOT_CAUSE_PREFLIGHT_REQUESTED_ACTIVE_FALSE`
조사: ANU read-only (2026-06-30 KST). 코드 수정·PR·삭제·reset·gitignore 전부 **미실행**. 근거: 회장 단계판정(원인 조사만, 수정은 bounded task 별도).

## 결론 (한 줄)
**범인 프로세스 단발 특정 실패.** 단 결정적 사실 다수 확보 → 범위 대폭 축소. 정확 특정은 **관측 기반 추가 task** 필요(정적 단발 조사 한계).

## 확정 사실 (검증 항목 응답)
1. **현재 상태(복원 후)**: 718줄/33557 bytes, py_compile PASS. mtime/ctime = 복원 시각(12:32)으로 덮임 → **과거 truncate 시각 미보존**(파일시스템 한계).
2. **HEAD vs working tree**: HEAD blob = **33557 bytes(정상)**. git status는 ` M`(working-tree-only 변경). → **git/HEAD는 정상, working tree만 0바이트로 외부 덮어쓰기**.
3. **worktree 비교**: `.worktrees/task-2779_a-dev2`·`task-2779_b-dev2` 둘 다 **718줄 정상**. → **canonical `/home/jay/workspace` working tree에서만 발생**(worktree·봇 작업 무관).
4. **finish-task.sh**: `replacement_pr_runner` 참조 **0건**. redirect(`>`)는 전부 다른 파일(EVENTS_DIR/SCOPE_DIFF/QC_DONE 등) 대상.
5. **코드 직접 참조**: `.sh`/`.py` 전체에서 `replacement_pr_runner` 실행/truncate 참조 **0건**(md 문서 10건만).
6. **shell redirect 오용**: 이 파일을 대상으로 한 `> file` 직접 오용 **미발견**.
7. **.gitattributes/심볼릭/하드링크**: 전부 아님(일반 tracked source).
8. **유력 후보 lint-workspace.py**: `.py` rglob 순회하나 **read_text만(read-only, write 0)** → **범인 아님**. lint.sh의 `black --fix`는 포매팅이라 0바이트 truncate 불가(빈 파일 안 만듦).
9. **봇 key cron**: replacement 언급 0(naver/InfoKeyword 무관 cron만).

## 원인 후보 분류 (미확정)
- GOAL-GATE / finalize-only / G4 / replacement runner 경로 = **참조 0건이라 직접 원인 아님**.
- canonical에서 도는 **미상 프로세스**(주기 cron/정리 스크립트/외부 도구)가 working tree 파일을 빈 내용으로 덮어쓰는 것으로 추정되나 **단발 정적 조사로 특정 불가**.
- "tracked source인데 runtime artifact 취급" = **코드 근거 없음**. 정상 source가 외부 프로세스 버그로 truncate되는 것(취급 의도 아님).

## bounded fix 후보 (회장 승인 시 별도 task)
1. **관측 기반 특정(권장)**: `inotifywait`(현재 미설치 → 설치 필요) 또는 주기 스냅샷으로 이 파일 watch → 다음 truncate 시점에 **어느 PID/프로세스가 write하는지 포착**. 범인 특정 후 그 경로만 bounded fix.
2. **임시 완화 가드**: local sync 루틴에 0바이트 자동복원 1줄(이미 수동으로 하는 것 정식화). 근본 아님.
3. expected_files: **원인 미특정이라 현재 미정**. 관측(1) 결과로 확정.

## 다음
회장 지시대로 **read-only 보고서만 작성, 코드 수정 0**. 수정 진행 시 = 관측 task(`inotifywait watch`) bounded 계약 별도 제출 → 범인 특정 → 그 프로세스만 fix. 단발 추측 수정 금지.
