# replacement_pr_runner truncate — 관측 수단 Watch Preflight (read-only)

상태명: `REPLACEMENT_PR_RUNNER_TRUNCATE_WATCH_PREFLIGHT_REQUESTED_ACTIVE_FALSE`
조사: ANU read-only (2026-06-30 KST). 설치·audit rule·watch 시작·cron/daemon 등록 전부 **미실행**. 근거: GPT 단계판정(관측 수단 가용성만, 실제 watch는 WATCH_CONTRACT 별도).

## 결론 (한 줄)
**설치 없이 writer PID 직접 포착은 사실상 불가.** auditd(가장 적합)=미설치+sudo 무암호 불가로 rule 등록 불가. inotify-tools/watchdog=미설치(설치 금지). → 현실적 관측 = **stdlib polling(시각 좁히기) + schedule_history 상관 + truncate 순간 fuser 시도(불확실)**. PID 확실 포착 원하면 설치(회장 승인 별도) 필요.

## 가용성 점검 (14항목 응답)
1. **auditctl/ausearch/auditd**: 전부 **미설치**.
2. **audit rule 권한**: `sudo -n` **불가**(무암호 sudo 없음) → audit rule 등록 불가. `/var/log/audit` 접근 불가.
3. **inotifywait/inotifywatch**: **미설치**(inotify-tools 없음).
4. **inotify 설치 필요 여부**: 필요. 단 `apt install`은 sudo 필요 → **설치 자체가 막힐 수 있음**(권한). package 설치는 이번 금지 항목.
5. **설치 없이 가능한 watch**: Python **stdlib polling**(`os.stat` size/mtime 주기 확인)만 가능. 내용 미수정(read-only). 단 **PID 못 잡음**(파일 변경 사실/시각만).
6. **writer PID/command 포착 가능성**:
   - auditd: 확실(PID/comm/ppid) — **불가**(미설치+sudo).
   - inotifywait: 변경 이벤트는 잡으나 **PID 미포착**(설치도 막힘).
   - stdlib polling: 시각만, PID 미포착.
   - **fuser/lsof**(설치됨 ✓): truncate **순간 open한 PID** 포착 시도 가능 — 단 truncate는 순간적(open→write→close 짧음)이라 **타이밍 의존·불확실**.
7. **watch 대상 2파일 확정**: `utils/replacement_pr_runner.py` · `tests/regression/test_replacement_pr_runner_2510.py` ✓
8. **canonical 한정**: 가능(polling 경로를 `/home/jay/workspace` 2파일로만 한정).
9. **worktree 제외**: 가능(worktree 경로 미포함).
10. **내용 미수정**: polling=os.stat/read-only ✓ (파일 변경 0).
11. **장기 daemon 요구**: 단발 background polling(짧게)이면 cron/systemd 불필요. 장기면 daemon성 → 이번 금지. 최소 기간으로 제한 권장.
12. **최소 관측기간/종료조건 후보**: 다음 truncate 1회 포착 시 즉시 종료, 또는 N시간(예: 6~12h, truncate가 PR sync 주기와 연동되면 그 주기) timeout. 짧은 background bounded.
13. **truncate 재발 시 수집 evidence**: timestamp(KST) · filesize before/after · mtime/ctime · (fuser 성공 시)writer PID·command·ppid · 동시각 schedule_history/cron 활동 · 직전 finish-task/봇 세션 상관.
14. **expected_files(bounded fix)**: **미확정**(범인 특정 후). 현재 단계 확정 금지.

## 권장 관측 설계 (실행 미승인 — WATCH_CONTRACT 별도)
- **1차(설치 0)**: stdlib polling으로 2파일 size를 짧은 간격(예: 5~10s) bounded background 감시 → 0바이트 전환 **시각 포착** → 즉시 `fuser`/`lsof`로 open PID 시도 + 동시각 schedule_history/ps 스냅샷. PID 못 잡아도 **시각+상관**으로 범인 후보 좁힘.
- **2차(회장 승인 시)**: 설치 가능하면 auditd watch rule(`-w <file> -p wa`)로 writer PID/comm 확실 포착. 단 sudo 필요 → 권한 확인 선행.
- 둘 다 **파일 내용 미수정·canonical 2파일 한정·bounded(종료조건 명시)**.

## 다음
GPT 지시대로 **preflight 보고서만, 실제 watch/설치 0**. 관측 실행 시 = `WATCH_CONTRACT_READY` 실행계약 별도 제출(설치 필요 여부·종료조건·evidence schema 고정). 단발 추측 수정 계속 금지.
