# task-2617+2 — 독립 ANU collector adjudication (AUTHORITATIVE)

- **role**: 독립 ANU collector · **collector_key**: `c119085addb0f8b7` (ANU 정본)
- **executor_self_key_forbidden**: `c38fb9955616e24d` (collector/adjudication/dispatch 0건)
- **ts**: 2026-05-19 16:30 KST
- **authoritative**: 독립 ANU collector only. executor self-chain 은 NON-AUTHORITATIVE.

## 1. 회수 (artifacts recovered)

`/home/jay/workspace` 에서 전수 회수:
`anu_v3/cli_output_path_guard.py` · `tests/regression/test_cli_output_path_guard_2617.py` ·
`memory/events/task-2617+2.{decision,result}.json` · `memory/reports/task-2617+2.md`.
deliverable sha256 = result.json 주장과 정확히 일치
(guard `07bc53de…2db24e`, test `122074b2…cbad439`). spec sha256
`98fe0a2f…a8fe53c` 일치.

## 2. 독립 ANU 검증 — PASS

- **guard import-only 불변**: HELD (AST — def main()/argparse import/`__main__` exec 0)
- **inode-bound post-link recheck**: temp inode `(st_dev,st_ino)` 를 write fd 에서
  write+fsync 후·`os.link` 전 캡처(`trusted_dev_ino`) — temp 는 containment 검증
  `dfd` 상대 `O_CREAT|O_EXCL|O_NOFOLLOW` 생성(anchor 비-공격자 선택). post-link
  재오픈 fd `os.fstat==anchor`(inode_bound) AND `/proc/self/fd` realpath ⊂
  ws+roots(containment), 둘 중 하나라도 불일치 → `unlink(dir_fd)`+`SystemExit`
  fail-closed. final_st/final_real 은 fd open 중 캡처된 불변 스냅샷.
- **fail-closed**: `SystemExit`(BaseException) → `except Exception→GuardError`
  미포획, 외부 전파. 외부 finally 가 SystemExit 에서도 실행 — ffd close, temp
  unlink(created_tmp True), dfd close.
- **regression 33/33 PASS**(독립 실행): baseline 30 무회귀 + task-2617+1
  dir-rename TOCTOU + legitimate path + **신규** reopen-by-name substitution
  race(containment=True 인데 inode_bound=False → SystemExit·decoy unlink·temp 0).
- **scope**: allowlist 한정(mtime 16:20–16:22). 3 sink+policy(13:48–13:49)·
  stdout-only 3(09:58–12:06) byte-0. Track B(2618)/C(2619)·2553/2604·2610~2616 무변.
- **git Layer-A**: HEAD `20456b5f…` before==after, branch 불변, commits 0,
  deliverables untracked `??` (no-git).

## 3. Codex 재audit — HIGH=0 CRITICAL=0

read-only, codex-cli 0.106.0, scope = inode-bound post-link block + TOCTOU 케이스.
- Q1 substitution race: **폐쇄** — inode-binding 이 link→reopen-by-name 치환을
  실질 차단, 정상 POSIX 에서 실효 우회 없음, anchor 비-공격자 선택.
- Q2 fail-closed: 정확. Q3 신규 Critical: 없음(수용조건 축소만). Q4 shared
  invariant: 미파손. Q5 잔여: **LOW×1**(predictable temp basename — availability/
  testability, 신규 containment-escape 아님).
- 신규 Critical7 0 · shared invariant 파손 0 · **잔여 HIGH 0**.

## 4. adjudication

- **분류**: AUTO_REMEDIATION 정상 수렴 — **완료(converged)**. task-2617+1 확정
  잔여 HIGH(post-link recheck not inode-bound / reopen-by-name substitution race)
  가 +2 inode-bound 화로 폐쇄. guard remediation 완료 판정.
- **HOLD_FOR_CHAIR = false**: 신규 Critical7 0 · shared invariant 파손 0.
- **task-2617+3 자동 수렴**: NOT_TRIGGERED — 잔여 non-Critical HIGH 0
  (Codex 잔여 = LOW×1). +N 트리거 조건(잔여 HIGH 존재) 미충족 → task-2617
  auto-remediation 체인 정상 종결(회장 보고 없음·확인 대기 0).

## 5. write-back gate · fallback · self-key

- **write-back gate 충족**(Codex HIGH=0 CRITICAL=0) → **+53 durable-success
  write-back 수행**: `anu_v3/batch_settle_writeback.py`
  evaluate(PASS/DURABLE_SUCCESS_WRITTEN)+apply →
  `memory/events/callback_4tuple_index.jsonl` additive append-only.
  - 34 → 36 lines (durable_success_writeback.v1 + +44 COMPLETED mirror)
  - 원본 34 lines byte-0 보존(sha256 `246df7c7…aa72ac` 불변), post `1ce8d310…`
  - `writeback_id=299197b3…b80717` · collector_key=`c119085addb0f8b7`(ANU) ·
    executor_key=`c38fb9955616e24d`(executor 로만 기록·collector 아님)
  - 멱등 재실행 = `WRITEBACK_IDEMPOTENT_SKIP`(중복 append 0, 36 유지)
- **fallback cancel-on-success**: cron-list(ANU key) = `[]` — task-2617+2 ANU
  fallback cron 미등록/미잔류, 취소 대상 0, **noise 0**. 본 collector run 은
  one-time, 실행 후 auto-delete.
- **self-key 준수**: executor self key `c38fb9955616e24d` 를 collector/
  adjudication/dispatch/callback 에 0건. ANU keyset={`c119085addb0f8b7`} ·
  collector≠executor · session≠executor_self → +49 정본 selector
  AUTHORITATIVE_PASS, SELF_COLLECTOR_FORBIDDEN 미발생.

## 6. 결론

task-2617 auto-remediation 체인(2617 → +1 → +2) **정상 수렴 종결**. CLI output
path guard 의 reopen-by-name substitution race 가 inode-bound 화로 폐쇄,
독립 ANU + Codex 재audit 무결, +53 durable-success write-back 영속화. HOLD 0.
