# task-2617+2 — Track A AUTO_REMEDIATION: post-link recheck inode-bound 화 (non-Critical 자동 수렴·연속)

> **Lv**: Lv.3. **goal_type**: auto_remediation_toctou_inode_bound. **Executor**: dev1-team 헤르메스 (key c38fb9955616e24d) 1회 한정 — task-2617/+1 원 executor. **TTL**: 3h. **분류**: **AUTO_REMEDIATION_HOLD 자동 수렴 연속**(non-Critical HIGH·CRITICAL 0·회장 확인 대기 0 — 분류 후 멈추지 말 것·feedback-auto-remediation-hold-vs-chair-hold 강화원칙 2/3). 문서-only 금지. **callback: 반드시 독립 ANU key c119085addb0f8b7(executor self key c38fb9955616e24d 절대 금지·+49 코드 정본).**
> **HOLD 정본**: `memory/events/task-2617+1.independent-anu-collector.adjudication.json`(Codex HIGH×1·CRITICAL 0). **+N=원래 goal completion blocker 연속 수렴.**

## 1. 잔여 HIGH (task-2617+1 Codex 재audit 확정)

`anu_v3/cli_output_path_guard.py` `atomic_guarded_write`: task-2617+1 이 post-link 재검증을 추가했으나 **recheck 가 inode-bound 가 아님** — `os.link()` 후 fname 을 **NAME 으로 재오픈**해 reopened fd 의 realpath 만 검증, `os.link()` 가 생성한 실제 inode 에 bound 안 됨. 이론적 잔여: post-link 과 recheck-reopen 사이 부모 dir 이동/이름 치환 시 reopen-by-name substitution race. CRITICAL 0·신규 Critical7 0 → non-Critical AUTO_REMEDIATION 계속.

## 2. 목표 (자동 remediation 연속)

post-link 재검증을 **inode-bound** 로 전환: `os.link()` 직후 생성된 final fd 를 유지(reopen-by-name 제거)하고 **동일 fd 의 `os.fstat` st_dev/st_ino** 가 사전 검증한 containment 대상과 일치하는지 확인. reopen-by-name substitution 경로 제거, 불일치 시 즉시 unlink + fail-closed(SystemExit). 기존 통과 경로 동작 불변.

## 3. 필수

- 변경 범위: `anu_v3/cli_output_path_guard.py` `atomic_guarded_write` post-link 재검증부만(inode-bound 화). guard import-only 불변(argparse/main 금지)
- 3 sink 적용부·policy yaml·stdout-only byte-0 무회귀
- regression: reopen-by-name substitution race 재현 케이스(substitution 주입 시 차단·unlink) 추가, task-2617+1 의 dir-rename 케이스 포함 기존 전수 무회귀
- 기존 정상 통과 경로 동작 불변(변경 전후 동등 입증)
- Codex 재audit HIGH/CRITICAL 0 일 때만 durable-success write-back

## 4. expected_files allowlist (자기 deliverable 한정)

`anu_v3/cli_output_path_guard.py`(post-link recheck inode-bound 화만) · `tests/regression/test_cli_output_path_guard_2617.py`(substitution race 재현 additive·기존 무회귀) · `memory/events/task-2617+2.{decision,result}.json` · `memory/reports/task-2617+2.md`. 이 외 write 0. **config/cli_output_path_policy.yaml·3 sink 적용부·task-2611+2/Track B(2618)/C(2619) 산출물·기존 task-2553/task-2604 multitrack/task-2610~2616 byte-0**. git HEAD·branch 전후 EQUAL(ANU Layer-A no-git·커밋 0).

## 5. 금지

guard import-only 위반 · 3 sink/policy/stdout-only 동작 변경 · 검출 1건(reopen-by-name inode-bound) 외 임의 리팩터링 · executor self-callback/self-collector/self-adjudication/self-dispatch · PR/branch/main write·merge·credential · premature write-back(Codex HIGH/CRITICAL 0 전) · 타 track/기존 산출물 변조 · 문서-only 완료.

## 6. HOLD_FOR_CHAIR

신규 Critical7 또는 shared invariant 파손 시에만 CHAIR_HOLD. 그 외 잔여 non-Critical 은 AUTO_REMEDIATION 자동 수렴 계속(회장 확인 대기 0·멈춤 금지).

## 7. callback (a) — 독립 ANU key 강제 + fallback 노이즈 0

완료 직후 normal completion callback **ANU key c119085addb0f8b7로만 발사** → 독립 ANU collector 회수·Codex 재audit·adjudication. ★ collector 는 adjudication 완료 **즉시 본 task ANU fallback cron 을 cancel-on-success 제거**(노이즈 0). Codex 재audit HIGH/CRITICAL 0 일 때만 +53 durable-success write-back. **잔여 non-Critical HIGH 시 회장 보고 없이 task-2617+3 자동 수렴 계속**(분류 후 멈춤 금지). executor self key c38fb9955616e24d 절대 금지(+49 코드 정본). ANU fallback=ANU key·안전망 한정·진행 트리거 아님·정상수렴 시 self-cancel.

## 8. 9-R (확정 — 본 절 본문 우선·PRE-DISPATCH SPEC)

**ANU-Codex lint = GO_READY (HIGH/CRITICAL 0)** — inode-bound post-link recheck 1건 한정·import-only/byte-0 불변·premature write-back gate·adjudication cancel-on-success·잔여 non-Critical HIGH 시 자동 수렴 계속(멈춤 금지) 전부 정합. re-lint 불요. ANU key 로 dev1 헤르메스 1회 위임.
