# replacement_pr_runner truncate — stdlib polling Watch 실행계약

상태명: `REPLACEMENT_PR_RUNNER_TRUNCATE_STDLIB_POLLING_WATCH_CONTRACT_READY_ACTIVE_FALSE`
작성: ANU 직접 (2026-06-30 KST). 코드 0 · 문서만 · 조건 고정. **실제 watch 실행은 회장 별도 승인.**
근거: GPT 단계판정(260630, preflight 수용 → stdlib polling watch 계약). preflight `replacement_pr_runner_truncate_watch_preflight_260630.md` / 원인조사 `replacement_pr_runner_truncate_root_cause_preflight_260630.md` / hygiene backlog [[project-replacement-pr-runner-truncate-hygiene-bug-recurred-260630]].

## 1. 목적
`replacement_pr_runner.py`와 그 테스트가 **언제 0바이트로 바뀌는지** 관측한다. writer PID 직접 확정이 아니라(auditd 막힘), **truncate 시각 + 상관관계(fuser/lsof/ps/schedule_history)** 를 확보하는 **1차 관측**임을 명시.

## 2. watch 대상 (2파일만)
- `/home/jay/workspace/utils/replacement_pr_runner.py`
- `/home/jay/workspace/tests/regression/test_replacement_pr_runner_2510.py`

## 3. 범위
- canonical `/home/jay/workspace`의 위 2파일만. task worktree 제외.
- 파일 내용 수정 0 · chmod/chown/touch/restore 0 · package 설치 0 · audit rule 0 · cron/systemd/daemon 0.

## 4. 구현 방식
- Python **stdlib `os.stat()` polling**(size/mtime). 외부 의존 0.
- 짧은 간격(예: 5~10s) **bounded** 관측.
- 0바이트(또는 size 급감) 전환 감지 시 **즉시 evidence 수집**: `fuser`·`lsof`(open PID 시도)·`ps`·schedule_history·최근 finish-task/봇 세션 로그 스냅샷.
- read-only(os.stat/read만). watched file write 0.

## 5. 종료조건
- truncate **1회 감지 시 즉시 종료**, 또는 **최대 관측시간 도달 시 종료**.
- 무기한 실행 금지. session-bound sleep loop 아니라 **명시적 one-shot bounded 관측**(자체 timeout/종료).

## 6. 권장 관측 시간
- 우선 **6시간 이하**. 더 길면 회장 승인 별도.
- 다음 bot finish-task가 예정돼 있으면 그 전후 타깃 관측 우선(truncate가 finish-task/sync 주기와 연동 의심).

## 7. evidence schema (수집 항목)
timestamp(KST/UTC) · before size / after size · before mtime/ctime / after mtime/ctime · sha256 before/after(가능 시) · fuser 결과 · lsof 결과 · ps snapshot · schedule_history snapshot · 관련 finish-task/봇 세션 후보 · `observed_status` ∈ {`TRUNCATE_DETECTED`, `TIMEOUT_NO_TRUNCATE`, `WATCH_ERROR_FAIL_OPEN`}.

## 8. 실패/오류 처리
- watcher 내부 오류 시 **파일 절대 미수정**. fail-open report만 생성. watched file 복원 금지. 자동 fix 금지.

## 9. 성공조건
- truncate 발생 시 시각+상관 증거 확보. 미발생 시 timeout 보고. 어느 경우도 **파일 내용 변경 0 · ACTIVE=false 유지 · systemd/cron 0 유지**.

## 10. STOP 조건 (→ `..._WATCH_CONTRACT_STOP_REPORT`)
설치 필요 / sudo 필요 / audit rule 등록 필요 / 장기 daemon 필요 / watched file 수정 필요 / 자동 복원 필요 / 코드 수정 필요 / PR 생성 필요.

## 금지
실제 watch 시작 / package 설치 / audit rule 등록 / cron·systemd·daemon 등록 / 코드 수정 / PR 생성 / 파일 복원·삭제·수정 / reset·stash / 실제 Stop hook 설치 / strict·blocking 승격 / broad Phase 2 확장 — **전부 금지(계약 단계).**

## 절차 / 다음
- 현재(본 문서) = 실행계약 작성 = 코드 0·문서만. 완료: `..._WATCH_CONTRACT_READY`.
- 다음(회장 승인 후) = bounded one-shot polling 관측 실행 → evidence 보고(`TRUNCATE_DETECTED`/`TIMEOUT_NO_TRUNCATE`) → 범인 특정 시 bounded fix task 별도. 단발 추측 수정 계속 금지.
