# task-2617+1 — Track A AUTO_REMEDIATION: atomic_guarded_write dir-rename TOCTOU 닫기 (non-Critical 자동 수렴)

> **Lv**: Lv.3. **goal_type**: auto_remediation_toctou_close. **Executor**: dev1-team 헤르메스 (key c38fb9955616e24d) 1회 한정 — task-2617 원 executor(guard 모듈 직접 인지). **TTL**: 3h. **분류**: **AUTO_REMEDIATION_HOLD 자동 수렴**(non-Critical HIGH·신규 Critical7 0·shared invariant 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.independent-anu-collector.adjudication.json`(Codex HIGH×1·CRITICAL 0). **+N=원래 goal completion blocker(feedback-stop-plus-n-separate-rounds 케이스1).**

## 1. 잔여 HIGH (collector 확정 — 자동 remediation 입력)

`anu_v3/cli_output_path_guard.py` `atomic_guarded_write`: `_open_dir_nofollow` 로 부모 dir fd(dfd) 고정 후 `/proc/self/fd` 1회 realpath containment 체크를 하나, **그 체크 이후 `os.link()` 사이에 memory/events|reports 디렉터리가 rename 되면 pinned dfd 가 이동된 inode(ws 밖)를 가리켜 write 가 ws 밖에 안착**. final inode 에 bound 된 **post-link 재검증 부재**. 3 sink 전부 이 helper 의존 → 전 remediated sink 도달 가능. non-Critical(신규 Critical7 0·shared invariant 0) → AUTO_REMEDIATION_HOLD.

## 2. 목표 (자동 remediation)

`atomic_guarded_write` 에 **post-link final-inode bound 재검증**을 추가해 check-후-rename TOCTOU 를 닫는다. link 완료 후 최종 안착 inode 가 CANONICAL_WS_ROOT/memory/{events,reports} 하위임을 final fd(O_NOFOLLOW) lstat/realpath 로 재확인, 이탈 시 즉시 unlink + fail-closed(SystemExit). 기존 통과 경로 동작 불변.

## 3. 필수

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

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

`anu_v3/cli_output_path_guard.py`(atomic_guarded_write post-link 재검증만) · `tests/regression/test_cli_output_path_guard_2617.py`(TOCTOU 재현 케이스 additive·기존 무회귀) · `memory/events/task-2617+1.{decision,result}.json` · `memory/reports/task-2617+1.md`. 이 외 write 0. **config/cli_output_path_policy.yaml·3 sink 적용부(batch_hold_adjudicator/batch_dependency_classifier/pre_authorized_evidence_bundle_builder)·Track B(task-2618)/C(task-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 위반(argparse/main 추가) · 3 sink/policy/stdout-only 동작 변경 · 검출 1건(dir-rename TOCTOU) 외 임의 리팩터링 · 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 완료(정상수렴/AUTO_REMEDIATION_HOLD 확정) **즉시 본 task 의 ANU fallback safety-net cron 을 cancel-on-success 제거**(노이즈 0·회장 강화원칙 4). Codex 재audit HIGH/CRITICAL 0 일 때만 +53 durable-success write-back. 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, overlap no)** — atomic_guarded_write TOCTOU 1건 한정·guard import-only 불변·3 sink/policy/stdout-only byte-0 무회귀·premature write-back gate·fallback cancel-on-success(노이즈 0)·self-key ban·자기 deliverable allowlist·타 track byte-0 전부 정합. re-lint 불요. ANU key 로 dev1 헤르메스 1회 위임.
