# task-2717+2 — PR #163 Phase1 same-PR bounded fix 1회 (Gemini 5건, dev1)

- **팀**: dev1-team (헤르메스)
- **PR**: #163, head `7f6b0b55` (branch task/task-2717-anu-owned-callback-enforcement)
- **★ 작업 위치**: worktree `/home/jay/workspace/.worktrees/task-2717-dev1`. 시작 `git fetch origin && git merge --ff-only origin/task/task-2717-anu-owned-callback-enforcement`(=7f6b0b55) 후 작업. **PR #162 미접촉, 새 worktree 금지.**
- **분류**: Phase1 only same-PR bounded fix 1회. validity 확인 완료(ANU read-only): 5건 전부 valid, dismiss 0.
- **허용 파일 2개만**: `dispatch/anu_owned_callback_enforcement.py` · `tests/regression/test_anu_owned_callback_enforcement_2717.py`

## 수정 5건 (최소수정, 회장 수정원칙 내)

### ① HIGH — RealCokacdirCronHistoryProbe.__call__ 예외처리 (false quarantine 방지)
현재 `__call__`이 OSError/ValueError/SubprocessError 를 `{"status":"error","message":"probe exec failed: ..."}` 로 삼킴 → `resolve_authoritative_owner` 가 message 문자열을 `_ACCESS_DENIED_TOKENS`("not found"/"access denied")와 매칭 → **인프라 장애 메시지에 'not found' 등이 들어가면 OWNER_NOT_ANU 오분류(false quarantine).**
- **fix**: 인프라 예외를 **실 cokacdir access-denied 와 구분**. 예: `__call__` 가 infra 실패를 distinct 신호(`error_kind="probe_exec_failed"` 등 message-문자열 비의존)로 반환, `resolve_authoritative_owner` 는 probe-exec-failure → **OWNER_PENDING(retryable, fail-closed 아님)**. **명시적 cokacdir access-denied/not-found(실 응답)만 OWNER_NOT_ANU.** 인프라 장애 ≠ 실 self-owner/access-denied 분리.

### ② MED — _envelope_age_seconds timestamp 처리 (386)
숫자형 epoch(int/float) → `strptime` 은 TypeError(현 except 는 ValueError 만) + 전부 실패 시 `None` → staleness 체크 **silent bypass**.
- **fix**: 숫자 epoch(`datetime.fromtimestamp(..., tz=utc)`) 처리 + TypeError 포함 핸들. 파싱 실패가 **staleness 를 silent bypass 하지 않게**(미파싱 → stale 취급 또는 PENDING, silent pass 0).

### ③ MED — write_quarantine_record filename sanitize (565)
`str(...).replace(os.sep, "_")` 는 Linux 에서 `/` 만 치환, `\` 미치환(cross-platform).
- **fix**: `/` 와 `\` **양쪽 명시 치환**(예: `re.sub(r"[\\/]+","_",...)`).

### ④ MED — executor_write_result_json filename sanitize (648)
③과 동일 패턴(safe_task). 동일 fix(양쪽 separator 치환).

### ⑤ MED — test tmpdir cleanup (test:100)
`setUp` 의 `mkdtemp` 후 cleanup 없음 → tmpdir 누수.
- **fix**: `self.addCleanup(shutil.rmtree, self._tmp, ignore_errors=True)`(또는 동등) 만 추가.

## 검증 (전부 PASS)
- target regression PASS + **신규 regression**(infra-failure→OWNER_PENDING(not quarantine) / numeric-epoch staleness / backslash sanitize / tmpdir cleanup)
- `git diff --name-only origin/main...HEAD` = 2 expected_files only · forbidden 0 · **Phase2 혼입 0** · **ANU key literal 0** · **fire NOT_ACTIVATED 유지** · CI workflow 0 · PR #162 미접촉

## 금지
Phase2(OS-level pickup/systemd/inotify/crontab/hook/completion_contract/ANU key 봉인) 구현 · PR #162 접촉 · task-2713/2714/2715 시작 · 새 파일 추가 · force push/rebase · merge-ready 선언 · Gemini thread 임의 resolve · dev bot callback schedule 생성 · ANU key 노출.

## push (★ dev1 push 금지)
로컬 commit 까지만. push 는 ANU 독립 재검증 PASS 후 ANU OWNER PAT FF push.

## HARD_STOP
push 후 fresh Gemini/CI 확인. **새 valid finding 또 나오면 자동수정 금지 → LOOP_BOUNDARY 회장 보고.**

## 완료 신호 = result JSON
`memory/events/task-2717+2.result.json`(new_commit_sha/fixes_5/regression_result/expected_files_only/phase2_zero/anu_key_literal_0/fire_not_activated). ★callback schedule 자가발사 금지. 상세 report 1개.
