# task-2722+1 보고서 — PR #168 bounded fix #2/2: _atomic_write_json tmp 파일명 충돌 방지 (uuid suffix)

> 상세 SCQA 및 회장 10항목 검증은 `memory/reports/task-2722.md` 말미 "bounded fix #2/2 (task-2722+1)" 섹션 참조. 본 파일은 task_id 단위 canonical 보고서.

## Situation
PR #168(head `59cb1b65`) fresh HIGH 1건: `_atomic_write_json` tmp 파일명 `{path}.{os.getpid()}.tmp` → 동일 프로세스 내 동일 target path 동시 write 시 tmp 충돌 가능. writer atomicization 목적상 dismiss 금지·수정. ★ bounded fix 예산 **2/2 소진**.

## Complication
PID만으로는 동일 프로세스 동시 writer가 같은 tmp 경로 공유 → atomic write 무력화 가능.

## Question
schema/signature/caller/callback authority/os.replace/fsync/cleanup 전부 불변 유지하며 tmp 충돌만 제거하는 최소 수정은?

## Answer — 수정 파일 (expected_files 2개 정확히 일치)
1. `dispatch/anu_owned_callback_enforcement.py` (불칸, sonnet) — 소스 2줄:
   - `import uuid` 추가.
   - `tmp = f"{path}.{os.getpid()}.tmp"` → `tmp = f"{path}.{os.getpid()}.{uuid.uuid4().hex}.tmp"`.
   - os.replace / os.fsync(file)+os.fsync(parent dir) / finally tmp cleanup 전부 유지. signature 불변.
2. `tests/regression/test_anu_owned_callback_enforcement_2717.py` (아르고스, sonnet):
   - test_21: 고정 tmp 경로 단언 → 디렉토리 `*.tmp` glob 스캔 조정.
   - test_24 신규: 동일 target 2회 write tmp 경로 상이(uuid 충돌 방지) + tmp 누수 0 검증.

## 테스트 결과
- regression: **26 passed** (25→26 증가, test_24 추가·test_21 조정).
- py_compile: PASS.
- 버그 유무: 없음.

## L1 스모크테스트 결과
- 서버 재시작: 해당없음 (writer 헬퍼, 서버 데몬 아님).
- API 응답 확인: 해당없음 → 대신 실 writer 실행(executor_write_result_json 2회·동일 result_dir):
  - tmp basenames 동일 PID·다른 uuid hex (`38650c30…` vs `f57faad2…`) → 충돌방지 True.
  - tmp 누수 NONE (cleanup PASS), 최종 result.json schema(task_id/completion_signal/written_at) 정상, 마지막 write(k=2) 반영. `=== L1 SMOKE PASS ===`.
- 스크린샷: 해당없음 (백엔드 writer, UI 없음).

## 회장 10항목 검증 (전부 PASS)
1. regression PASS 증가(26). 2. tmp 충돌 방지 확인(uuid suffix 상이). 3. os.replace 유지. 4. fsync(file)+fsync(parent dir) 유지. 5. tmp cleanup 유지. 6. schema/signature/caller 불변(test_23). 7. `git diff --name-only origin/main`=2파일 내부. 8. forbidden 0. 9. ANU key full literal 0. 10. active=false/installed=false/wired=false 유지.

## 모델 사용 기록
- 불칸(백엔드, sonnet) / 아르고스(테스터, sonnet). haiku 미사용(로직·테스트 정확성 요구).
- 팀장(헤르메스, Opus): 설계/분배/통합/검증/L1만, 직접 코딩 0.

## 머지 판단
- 머지 필요: No (ANU governance — 로컬 commit only, push/PR/merge 금지).
- 브랜치: `task/task-2722-dev1` / 워크트리: `/home/jay/workspace/.worktrees/task-2722-dev1`.
- 로컬 커밋: `18b01b8b`(불칸) + `e93a4917`(아르고스).
- 머지 의견: LOCAL_FIX_VERIFIED. ANU 독립 재검증 후 OWNER `/gemini review` 새 head 재발사 → MERGE_READY_CANDIDATE. merge 회장 승인 전 금지.

## 비고
- bounded fix 예산 2/2 소진. 이후 새 HIGH/CRITICAL → CHAIR_REQUIRED.
- 혼입 금지(QC text-token / finish-task PROJECT_PATH·scope-guard hardening) 미혼입. credential/permission 확장 0. `.github/**`·finish-task.sh·pickup driver·systemd 무접촉.
