# truncate 확정 캡처 — 하나로 좁힌 승인안 (실행 전 회장 승인 필요)

상태명: `TRUNCATE_CAPTURE_PLAN_NARROWED_APPROVAL_PENDING_ACTIVE_FALSE`
작성: ANU 직접 (2026-07-02 KST). **승인 전 실행 0.** 근거: 회장 GPT 판정(1순위=truncate 확정 캡처·하나로 좁혀서·각 방식 권한/명령/증거/리스크/중단복구 비교). 선행: [[infra_defect_remediation_design_260702]] · truncate 2차 REPRODUCED + inotify CAPTURE_INSUFFICIENT.

## 문제 재확인
finish-task 돌 때마다 canonical 2파일(`utils/replacement_pr_runner.py`·`tests/regression/test_replacement_pr_runner_2510.py`)이 **동시에 0바이트**. **2회 재현**(task-2781 00:13:59 / task-2782 01:37:07, 둘 다 mask IN_CLOSE_WRITE = 쓰기용 open→truncate→close). inotify로 이벤트는 즉시 잡았으나 **pid/comm 미포착**(무권한 한계 확정). 다음 한 수 = **어떤 pid·comm이 어떤 syscall로 truncate했는지** 확정.

## 환경 제약 (실측)
- auditctl/inotifywait **미설치** · bpftrace 설치됨(**root 필요**) · **passwordless sudo 불가** · auditd inactive · chattr 존재(+i root) · chmod 0444(소유자 무권한 가능).
- 재현 조건: truncate는 **finish-task 실행 중에만** 발생. 현재 dev dispatch 동결 → 캡처하려면 **controlled reproduction**(더미 task id로 finish-task 1회 통제 실행)이 필요.

## 4방식 비교 (권한/명령/증거/리스크/중단복구)
**① python sys.audit hook (D안) — ★추천(무권한·비차단·라인 직격)**
- 권한: **불필요**(repo 밖 /tmp sitecustomize를 controlled 실행에만 PYTHONPATH 주입). 전역 PYTHONPATH 변경 0.
- 명령: `PYTHONPATH=/tmp/twcap python3 ...`(sitecustomize가 `sys.addaudithook`으로 `open`(O_TRUNC)/`os.truncate`를 잡아 대상 2파일이면 **정확한 traceback 파일:라인** 기록).
- 캡처 증거: 파이썬 truncate 호출의 **정확한 코드 파일·라인·스택**(범인이 파이썬이면 직격). 1순위 후보 merge-executor 체인이 파이썬 → 적중 가능성 높음.
- 리스크: 범인이 파이썬이 아니면(쉘 `>`/git) 미포착 → 그때만 ②로 승격. 관측만 하므로 finish-task 흐름 **비차단**.
- 중단/복구: controlled 실행 후 /tmp sitecustomize 삭제 + PYTHONPATH 원복(시스템 변경 0).

**② bpftrace (sudo) — 정석·최고정밀·단 root 필요**
- 권한: **root/sudo 필요**(현재 passwordless 불가 → 회장이 sudo 허용 또는 직접 1회 실행).
- 명령: `sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /* filename 필터 O_TRUNC */ { printf("%d %s\n",pid,comm); }'` (+ftruncate).
- 캡처 증거: **pid·comm·syscall**(+파이썬이면 ustack). 언어 무관 확실.
- 리스크: root 필요. ustack 심볼화 제약. 시스템 변경 없음(트레이스만).
- 중단/복구: Ctrl-C. 잔여 0.

**③ auditctl (sudo+설치) — 가장 확실하나 가장 무거움**
- 권한: **auditd 설치 + root** 둘 다 필요(현재 없음).
- 명령: `sudo apt-get install auditd` → `sudo auditctl -w <file> -p wa -k twcap` → `sudo ausearch -k twcap`.
- 증거: pid·comm·exe·syscall·cwd·ts 완전.
- 리스크: 설치+전역 audit 부하. 잔여물(패키지) 제거 회장 결정.
- 중단/복구: `sudo auditctl -W <file> ...` rule 삭제.

**④ chmod/chattr 트립와이어 — 비추천(finish-task 교란 위험)**
- 권한: chmod 0444 무권한(소유자) / chattr +i root.
- 명령: 감시창에 2파일 `chmod 0444` → truncate 시도 EACCES 실패 → finish-task 로그에 명령/라인 노출.
- 증거: 실패 지점 로그(간접). 
- 리스크: ★**파일 정상 쓰기를 막아 finish-task 흐름 교란** 가능(정상 종단까지 깨질 수 있음). 파일속성 변경.
- 중단/복구: `chmod 644`. 단 교란 부작용 원복 어려울 수 있음.

## ★ 하나로 좁힌 추천
**① python audit hook (D안) + controlled finish-task reproduction.**
- 이유: (a) **sudo 불가** 환경에서 유일하게 무권한 실행 가능 (b) 트립와이어와 달리 **비차단**(finish-task 안 깨뜨림) (c) 1순위 후보(merge-executor 체인)가 파이썬이라 **정확한 파일:라인** 직격 가능성 높음 (d) repo 변경 0(/tmp sitecustomize).
- **에스컬레이션(딱 하나)**: D안이 "범인 비파이썬" 판정이면 → **② bpftrace(sudo)** 로 승격(회장 sudo 승인 필요). ③/④는 채택 안 함.

## 승인 요청 (실행 전 대기 — 3건)
1. **controlled reproduction 승인**: 더미 task id로 finish-task 1회 통제 실행(merge_policy none·PR 0·markers는 통제·truncate 후 즉시 복원). truncate 재현이 목적.
2. **D안 audit hook arm 승인**: /tmp/twcap/sitecustomize.py(repo 밖) 작성 → controlled 실행에만 PYTHONPATH 주입 → 종료 후 삭제.
3. **(조건부) sudo 에스컬레이션 승인**: D안이 비파이썬이면 bpftrace(sudo) 실행 허용 여부.

## 금지 (승인 전)
sitecustomize 작성/주입 · controlled finish-task 실행 · sudo/bpftrace/auditctl/chmod/chattr · dev dispatch · PR/merge · ci.yml/ruleset — 전부 미실행. 승인 후에만.

## 상태
승인안 좁힘 완료·대기. task-2782 PR은 truncate 캡처/차단 전략 확정 후 재논의(GPT).
