# task-2720+3 — PR #166 P0-a 3차 micro-fix: pickup runner 파일락 완전 제거

## 회장 인가 (2026-06-01)
lock 계열 finding 반복(206→231/396→209). 209 = 실 liveness 결함(락 누수→pickup 영구 차단). 회장 결정 = **① 파일락 완전 제거**(② 단순화의 논리적 종착점). P0-a 멱등성 = dedupe(4-tuple) + terminal done-marker + idempotent no-op 로 충분(lock 불필요).
★ 3차 fix 후 새 High 또 반복 시 추가 fix 금지 → LOOP_BOUNDARY 보고.

## worktree
- `/home/jay/workspace/.worktrees/task-2720-dev1` (branch `task/task-2720-dev1`, head `6cb61450`)에서 **이어서**. base origin/main `5e714887`.

## expected_files (5개 — 그 외 수정 금지)
1. `dispatch/anu_owned_callback_enforcement.py`
2. `tests/regression/test_anu_owned_callback_enforcement_2717.py`
3. `dispatch/anu_result_pickup_runner.py`  ← 주 수정
4. `tests/regression/test_anu_result_pickup_runner_2720.py`
5. `scripts/finish-task.sh`
(evidence: memory/events/task-2720+3.done · memory/reports/task-2720.md 갱신 허용)

## 수정 — pickup runner 파일락 완전 제거
1. pickup runner 의 **파일락 생성/삭제/`_lock_acquired` 상태추적/lock-stealing/stale reclaim 관련 로직 전부 제거**.
   - `os.open(lock_path, O_CREAT|O_EXCL)` / `os.unlink(lock_path)` / `_lock_acquired` / `*.pickup.lock` / `PICKUP_SKIP_LOCK` / lock 경합 no-op 분기 — 전부 삭제.
2. **중복 wake 방지 = dedupe 4-tuple(`callback_4tuple_index.jsonl`) + `*.pickup.done` terminal marker + idempotent no-op** 로만 보장.
   - pickup 진입 시 (a) terminal done-marker 존재 → no-op (b) 4-tuple dedupe(task_id+sha256) 존재 → no-op (c) 통과 시 wake 빌드 후 done-marker + ledger 기록.
3. **209 liveness 결함은 lock 제거로 소멸**(추적할 lock 자체가 없음).
4. lock 제거로 `PICKUP_SKIP_LOCK` enum/관련 reason 도 제거(미사용 심볼 0).

## 기존 high/medium 처리 방향 (회장 verbatim)
- **타임존 high(466/484)**: 기존 fromisoformat fix + regression 유지 → ANU governance 에서 **stale resolve** 대상(코드 추가 변경 0).
- **lock token high(381)**: 회장 ① 방향과 반대 제안 → **design-intent dismiss** 대상.
- **medium 209**: lock 제거로 **fix 처리**(소멸). 나머지 무효 6(1560×2/229/242/354/333) = ANU governance evidence resolve 후보(코드 변경 0).

## regression (최소 포함)
- **lock 파일 생성 0** (`*.pickup.lock` 미생성 — fs 검증)
- **stale/steal/token/`_STALE_LOCK`/`_lock_acquired` 로직 참조 0** (grep 0)
- 동시 pickup 2회 → 중복 wake **0** (dedupe/done-marker로 보장, lock 없이)
- terminal done-marker 존재 → no-op
- 4-tuple dedupe 존재 → no-op
- timezone `+09:00` / `Z` / naive timestamp 파싱(회귀 0)
- 기존 PASS 유지/증가

## 검증 (finalize 전)
- `python3 -m pytest tests/regression/test_anu_result_pickup_runner_2720.py tests/regression/test_anu_owned_callback_enforcement_2717.py -q` 전 PASS.
- `git diff --name-only origin/main` = 코드 5(+evidence). ANU key literal 0 유지. active 완료주장 0 유지.
- semantic 3조건 유지: T2626_ANU_KEY=0 / callback-launch.json 생성=0 / result.json 작성=1.
- ★ `grep -cE 'pickup.lock|_lock_acquired|_STALE_LOCK|lock.?steal|O_EXCL' dispatch/anu_result_pickup_runner.py` = **0**.

## 금지 (회장 verbatim)
merge 금지 · **push 금지(ANU 수행)** · admin override 금지 · force push/rebase 금지 ·
expected_files 밖 수정 금지 · OS-level crontab/systemd/inotify 설치 금지 · PR #163 close/merge 금지 ·
과거 memory/scripts ANU key literal sanitize 금지 · active 완료 주장 금지.
★ 3차 fix 후 새 High 또 반복 시 추가 fix 금지 → LOOP_BOUNDARY 보고.

## finalize (로컬 commit 까지만)
1. fix → regression PASS → `git add` expected_files → 로컬 commit. **push/PR/merge 금지.**
2. `memory/reports/task-2720.md` 에 3차 처리내역(lock 완전 제거 / 209 소멸 / 타임존 stale·381 dismiss·무효6 resolve 후보 명시) 추가.
3. `memory/events/task-2720+3.done` 생성. ANU key(c119085, sealed) callback. ★ ANU key literal 노출 0.

## ANU 후속 (봇 아님 — governance)
ANU 독립 재검증 → FF push → OWNER `/gemini review` 1회 → high/medium evidence resolve(타임존 stale / 381 design-intent / 무효6 / 209 fix 확인) →
CI 11/11 + unresolved 0 + CLEAN/MERGEABLE + diff 5파일 + ANU key 0 + active 0 →
MERGE_READY_CANDIDATE / LOOP_BOUNDARY / HOLD_CRITICAL7 판정. merge 회장 승인 전 금지.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "dispatch/anu_owned_callback_enforcement.py"
    - "tests/regression/test_anu_owned_callback_enforcement_2717.py"
    - "dispatch/anu_result_pickup_runner.py"
    - "tests/regression/test_anu_result_pickup_runner_2720.py"
    - "scripts/finish-task.sh"
    - "memory/events/task-2720+3.done"
    - "memory/reports/task-2720.md"
  forbidden_paths:
    - ".github/**"
    - "anu_v2/ci_gemini_watcher_runner.py"
    - "anu_v2/ci_gemini_watcher_gh_adapter.py"
  commands:
    - "pytest"
    - "python3 -m pytest"
    - "python3 -m py_compile"
    - "gh"
  merge_policy: "none"
  ttl_hours: 48
```

## ★ dispatch 템플릿 G3(PR/머지) 무시. finalize 로컬 commit only 우선. finish-task --action pr 금지.

## goal_assertions (auto-generated)
- `python3 -m pytest tests/regression/test_anu_result_pickup_runner_2720.py tests/regression/test_anu_owned_callback_enforcement_2717.py -q`
- `python3 -c "import sys,re; sys.exit(1 if re.search(r'pickup.lock|_lock_acquired|_STALE_LOCK|lock.?steal|O_EXCL', open('dispatch/anu_result_pickup_runner.py').read()) else 0)"`
