# [SUPERSEDED → task-2722.md 확정본] 
## 상태
**초안 단계.** dispatch·설치·activation·실 wake·merge 일체 금지. 회장 승인 후 task md 확정 → dispatch.
★ **중요 정정**: 회장님 가정("finish-task.sh writer 수정")과 실제 코드가 다름. 아래 §4 참조.

## 1. 목적
result.json writer atomicization — 크래시/전원차단 시에도 부분 write/절단 result.json 0 보장. P0-b driver(이미 readiness grace로 부분 JSON 방어)와 **양면 방어**(writer 측 원자성 + reader 측 readiness).

## 2. 패턴 (회장 verbatim)
`tmp write → fsync(file) → fsync(dir) → atomic rename(os.replace)`
- ★ **현재 이미 구현된 부분**: tmp write + `os.replace`(atomic rename) — origin/main `executor_write_result_json` L796~798에 존재.
- ★ **빠진 것 = 이번에 추가**: `fh.flush()` + `os.fsync(fh.fileno())`(file) + **부모 디렉터리 fd `os.fsync`(dir)** — rename durability 보장. (현재는 page cache 단계에서 rename, 전원차단 시 유실 가능.)

## 3. 예상 수정 파일 후보 (expected_files)
1. `dispatch/anu_owned_callback_enforcement.py` ← **주 수정**(executor_write_result_json + 동일 패턴 L720~722 record writer)
2. `tests/regression/test_anu_owned_callback_enforcement_2717.py` ← 회귀(fsync 호출 spy / atomic 보장)
(evidence: memory/events/task-2722.done · memory/reports/task-2722.md)

## 4. ★ finish-task.sh 수정이 필요한 정확한 함수/영역 — **정정: 불필요**
- 실제 result.json writer = **`executor_write_result_json` @ `dispatch/anu_owned_callback_enforcement.py`** (P0-a 도입, origin/main `7839dede` 기준).
- `scripts/finish-task.sh` L1559는 **`python3 -m dispatch.anu_owned_callback_enforcement` 호출만** — result.json 직접 write 없음. → **finish-task.sh 수정 0**.
- ★ 따라서 이 task의 핵심 영역은 **P0-a main 파일(`anu_owned_callback_enforcement.py`)** 이며, 이는 그동안 `forbidden_paths`였음 → **expected_files 재정의 + 회장 승인 필요**.
- 정확한 수정 지점: `executor_write_result_json` 의 `with open(tmp,"w") ... os.replace(tmp,path)` 블록(L796~798) 사이/직전에 `fh.flush()+os.fsync(fh.fileno())`, replace 후 `dir fd fsync` 추가. 동일 패턴 L720~722도 옵션(같은 모듈).
- writer 시그니처/반환/스키마/필드 변경 0 — fsync 호출만 surgical 추가.

## 5. forbidden actions
- finish-task.sh 수정 금지(writer 거기 없음 — 무수정 유지) · P0-a `anu_result_pickup_runner.py` 무수정(reader) · `.github/**` 금지.
- expected_files(위 2파일) 밖 수정 금지 · ANU key literal 노출 0 · writer 스키마/필드/시그니처 변경 0.
- pickup_once lock 재도입 금지 · dev bot self-callback/self-collector 금지 · ANU-owned collector만 authoritative.

## 6. activation 금지
- activation flag(p0b_driver_enabled) 생성 0 · pilot 0 · active/installed/wired=false 유지.

## 7. systemctl 금지
- systemctl enable/start/daemon-reload 0 · unit 설치 0.

## 8. real pickup/wake 금지
- 실제 result.json pickup / ANU key wake / 독립 세션 spawn 실행 0. 테스트는 mock/stub + tmpdir fsync 검증만.

## 9. merge 금지
- 로컬 commit only. push/PR/merge 회장 승인 전 금지. MERGE_READY_CANDIDATE 까지만 자동 수렴.

## 10. regression / smoke 계획
- 기존 test_anu_owned_callback_enforcement_2717 PASS 유지/증가.
- ★ fsync 호출 입증: `os.fsync` mock spy → file fd + dir fd 각 1회 이상 호출. tmp 경유 + os.replace 순서 보장.
- atomic 보장: write 중 크래시 시뮬(tmp 미완) → final path 미생성/이전값 유지(부분 result.json 0).
- 정상 result.json write → 스키마/필드 불변(회귀 0). ANU key literal 0.
- smoke: `python3 -m py_compile dispatch/anu_owned_callback_enforcement.py`.

## 11. capability matrix expected delta
- `callback_pickup` / `anu_pickup_driver`: 변화 없음(여전히 installed=false/wired=false/active=false).
- 신규 기록: `result_json_writer_durability = IMPLEMENTED+VERIFIED`(fsync 보강 후). active 무관(write 경로 견고성만). 과장 금지 — wired/active 승격 아님.

## 12. 충돌 회피 (회장 verbatim — 한 PR에 섞지 말 것)
- ★ **QC text-token hardening**(backlog_qc_text_token_false_positive) = 별도. 미포함.
- ★ **finish-task worktree_path 정책**(backlog_finish_task_scope_guard) = 별도. 미포함. (이번엔 finish-task.sh 무수정이므로 자연 분리.)
- ★ **gate-parser hardening**(backlog_gemini_gate_parser_badge) = 별도. 미포함.
- ★ **P0-b medium defer 4건**(backlog_p0b_driver_medium_deferred) = activation 전 hardening, 별도.
- finish-task 관련 후속 순서: ① 본 writer atomicization(파일=anu_owned_callback_enforcement.py, finish-task 무수정) → ② worktree_path 정책(finish-task.sh) → ③ QC text-token. 같은 PR 금지.

## ★ 멈춤 조건 (회장 verbatim)
finish-task.sh writer 범위 밖 / credential·permission 확장 / activation·pilot / systemd install·enable·start / actual wake / expected_files 밖 / HIGH·CRITICAL 신규 / Critical7 / merge 승인 → CHAIR_REQUIRED.

## allowed_resources (승인 시 적용 — 현재 설계만)
```yaml
allowed_resources:
  paths:
    - "dispatch/anu_owned_callback_enforcement.py"
    - "tests/regression/test_anu_owned_callback_enforcement_2717.py"
    - "memory/events/task-2722.done"
    - "memory/reports/task-2722.md"
  forbidden_paths:
    - "scripts/finish-task.sh"
    - "dispatch/anu_result_pickup_runner.py"
    - "dispatch/anu_pickup_driver.py"
    - ".github/**"
  commands:
    - "pytest"
    - "python3 -m pytest"
    - "python3 -m py_compile"
  merge_policy: "none"
  ttl_hours: 48
```
