# task-2729+12 — CANONICAL_EXECUTION_PATH_ALIGNMENT_B_IMPLEMENTATION (B안 구현/검증, activation 0)

## 레벨
Lv.3 (execution path 정렬 구현/검증 — production activation 아님, canonical 무손상, isolated temp + clean worktree 후보)

## 한 줄 목표
production pickup 의 **CODE path = 별도 clean main worktree(origin/main #186/#187 포함)** / **DATA root = canonical /home/jay/workspace** 로 분리하는 **최소 변경(entrypoint + systemd 3줄)** 을 구현·검증한다. driver/runner 무변경(`CANONICAL_ROOT` 절대 하드코딩 활용). **systemctl enable / ACTIVE=true / activation_epoch / real spawn 0.**

## 핵심 설계 근거 (회장 채택 B안 · 단일 소스)
- `CANONICAL_ROOT = "/home/jay/workspace"` 절대 하드코딩(`dispatch/anu_owned_callback_enforcement.py:83`) → `main()` 의 DATA root(events/flag/epoch/ledger/quarantine/.done)는 **코드 import 위치와 무관하게 항상 canonical**.
- ⇒ **CODE(PYTHONPATH/cd)만 clean main worktree 로 바꾸면 DATA 자동 canonical 유지.** task-2716 parked working tree 무손상 정렬.
- 현 blocker: canonical working tree=task-2716(75fdf540), 실행파일 DIFFER 4 + ABSENT 2(`anu_result_pickup_runner.py`·`anu_pickup_entrypoint.sh`) → 지금 enable 시 task-2716 driver import→runner 부재 ModuleNotFoundError 크래시(실증).
- 선행 설계: `memory/plans/p0b-pickup/canonical_execution_path_alignment_design_260607.md`.

## 최소 변경안 (anchor 실측 기준)
### CODE_ROOT 후보 (★ stable clean main worktree — 회장 추가 lock)
- ★ **임시 세션 디렉터리/휘발성 worktree(/tmp 등) 금지. 장기 운영 가능한 stable clean-main worktree 후보**여야 한다.
- `git worktree add <CODE_ROOT> origin/main` (70f36d82 또는 이후 최신 main). 권장 경로 `${HOME}/p0b-pickup-main`(canonical 외부 sibling·영속 경로, 중첩 혼동 0). 대안 `.worktrees/pickup-main`(단 영속).
- CODE_ROOT 동기: fetch + checkout origin/main. (자동 동기 절차는 report 에 운영안 기술)
- ★ 후보 path 생성/검증은 허용하되 **systemd enable / production activation 으로 연결 금지.** entrypoint/service 변경은 **후보 patch + regression 수준**으로만.

### A. `scripts/anu_pickup_entrypoint.sh` (DATA/CODE 분리)
- `WORKSPACE="${HOME}/workspace"` 유지(=DATA). **신규** `CODE_ROOT="${PICKUP_CODE_ROOT:-${HOME}/p0b-pickup-main}"`.
- FLAG_FILE / LOCK_DIR = `${WORKSPACE}` 유지(DATA·flag·lock canonical).
- line 48 `cd "${WORKSPACE}"` → `cd "${CODE_ROOT}"`.
- line 49 `PYTHONPATH="${WORKSPACE}" python3 -m dispatch.anu_pickup_driver` → `PYTHONPATH="${CODE_ROOT}" python3 -m dispatch.anu_pickup_driver`.
- CODE_ROOT 부재/비-git 시 fail-closed(exit 0 no-op + stderr 1줄). flag 확인은 DATA 기준 그대로(enable 안 했으면 어차피 no-op).

### B. `deploy/systemd/anu-pickup.service`
- `WorkingDirectory=%h/workspace` → `WorkingDirectory=%h/p0b-pickup-main`(CODE_ROOT).
- `Environment=PYTHONPATH=%h/workspace` → `Environment=PYTHONPATH=%h/p0b-pickup-main`.
- `ExecStart=/bin/bash %h/workspace/scripts/anu_pickup_entrypoint.sh` → `ExecStart=/bin/bash %h/p0b-pickup-main/scripts/anu_pickup_entrypoint.sh` (★ entrypoint 스크립트가 canonical 에 부재 → CODE_ROOT 참조 필수).

### C. `deploy/systemd/anu-pickup.path`
- `PathExistsGlob=%h/workspace/memory/events/task-*.result.json` = canonical DATA watch → **무변경**.

### driver/runner
- 무변경(read-only). `CANONICAL_ROOT` 하드코딩이 DATA=canonical 보장.

## 작업 방식 (audit-first + clean worktree 후보 + isolated 검증)
1. clean CODE worktree 후보 생성/검증(origin/main 70f36d82+). **canonical/task-2716 무손상.**
2. entrypoint/systemd 변경을 **task 브랜치(origin/main base worktree)에서 구현** → PR-able diff. **production 경로 직접 수정/enable 0.**
3. isolated temp DATA root + CODE=clean worktree 로 시뮬레이션: driver import 성공 + `scan_once(root=canonical형 temp, legacy_cutoff=True)` → 128 NOOP_LEGACY_SKIP, move/delete/quarantine 0.
4. 회귀(CODE/DATA 분리 + legacy NOOP) 작성.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "scripts/anu_pickup_entrypoint.sh"
    - "deploy/systemd/anu-pickup.service"
    - "tests/regression/test_canonical_execution_path_alignment_b_2729p12.py"
    - "memory/reports/task-2729+12.md"
    - "memory/plans/p0b-pickup/execution_path_alignment_b_validation_260607.md"
    - "memory/events/task-2729+12.*"
    - "memory/tasks/task-2729+12-canonical-execution-path-alignment-b-implementation.md"
  read_only_reference:
    - "dispatch/anu_pickup_driver.py (CANONICAL_ROOT/main/scan_once — read only, 무변경)"
    - "dispatch/anu_result_pickup_runner.py (read only)"
    - "dispatch/anu_owned_callback_enforcement.py (CANONICAL_ROOT 정의 — read only)"
    - "deploy/systemd/anu-pickup.path (무변경 확인용)"
    - "memory/plans/p0b-pickup/canonical_execution_path_alignment_design_260607.md"
    - "memory/plans/p0b-pickup/activation_approval_packet_post_callback_dogfood_260607.md"
  forbidden_paths:
    - "/home/jay/workspace (canonical working tree — reset/clean/stash -u/checkout -f 금지)"
    - "dispatch/anu_pickup_driver.py"
    - "dispatch/anu_result_pickup_runner.py"
    - "deploy/systemd/anu-pickup.path"
    - "memory/state/** (activation_epoch 생성·flag enabled 전환 금지)"
    - "memory/events/task-*.result.json (canonical result.json 이동·삭제·quarantine 금지)"
    - "memory/events/task-*.g4-fix-loop-count (G4 counter reset 금지)"
    - "dispatch.py"
    - ".github/**"
    - "hooks/**"
    - "/home/jay/.claude/**"
    - "/usr/local/bin/cokacdir"
    - "task-2716 branch (수정 금지)"
```

## EXPECTED FILES (정확히 5 — 초과 시 즉시 HOLD_FOR_CHAIR)
1. `scripts/anu_pickup_entrypoint.sh` — CODE_ROOT 분리(cd/PYTHONPATH), DATA(flag/lock) canonical 유지, CODE_ROOT fail-closed
2. `deploy/systemd/anu-pickup.service` — WorkingDirectory/Environment/ExecStart → CODE_ROOT (★ enable 안 함)
3. `tests/regression/test_canonical_execution_path_alignment_b_2729p12.py` — CODE/DATA 분리 + legacy NOOP 회귀
4. `memory/reports/task-2729+12.md` — 구현/검증 결과 + 필수검증 10 + CODE_ROOT 운영(생성/동기)안
5. `memory/plans/p0b-pickup/execution_path_alignment_b_validation_260607.md` — isolated 시뮬레이션 evidence/설계
- ★ driver/runner/path **무변경**. systemd enable·activation_epoch·flag enabled **0**.

## 필수 검증 (회장 verbatim 10)
1. clean CODE worktree 가 origin/main 70f36d82 또는 이후 최신 main 인지 확인.
2. #184 real wake launcher / #186 guard·G2 / #187 dogfood artifact 가 CODE path 에 포함됐는지 확인.
3. CODE path 에서 `python3 -m dispatch.anu_pickup_driver` import 성공 확인(runner 포함).
4. DATA root 가 canonical /home/jay/workspace 로 유지되는지 확인(`CANONICAL_ROOT` + flag/lock 경로).
5. legacy result.json 140 중 scan 대상(`task-*.result.json`=128) vs 비대상(12=NOOP_NOT_TARGET) 분리 기록.
6. `legacy_cutoff=True` 경로에서 pre-activation result.json 이동·삭제·quarantine 0 확인(isolated temp).
7. raw key(ANU c1190…) 출력 0 확인.
8. ACTIVE=false 유지 확인(flag ABSENT/disabled).
9. systemd enable 0 확인(unit not-found/installed 0).
10. real spawn 0 확인(driver launcher_fn=None·dry_run=True default 유지, subprocess sabotage 0).

## 금지 (회장 verbatim)
1. systemctl enable --now  2. production ACTIVE 전환  3. activation_epoch 생성  4. real ANU spawn  5. canonical reset/clean/stash -u/checkout -f  6. task-2716 branch 수정  7. live memory artifacts 이동·삭제  8. canonical result.json 이동·삭제·quarantine  9. G4 counter reset  10. ACTIVE=true 선언  11. production path 직접 enable
- 모든 시뮬레이션 isolated temp + clean worktree. canonical/task-2716 무손상.

## 완료 판정 (회장 verbatim)
- CODE/DATA 분리 구현 + 필수검증 14 통과 + isolated NOOP(이동 0) → **`CODE_DATA_PATH_ALIGNMENT_VERIFIED_ACTIVE_FALSE`**.
- enable/epoch/spawn/canonical write 필요 or import 실패 or legacy 이동 발생 or expected_files 5 초과 → **`HOLD_FOR_CHAIR`**(중단·보고).
- 조건 PASS 시 PR 생성 + CI/Gemini fresh gate 확인. PR 후 **fresh HIGH/CRITICAL 0 · CI GREEN · diff expected_files 유지 · raw key 0 · ACTIVE=false · real spawn 0** → **`MERGE_APPROVAL_CANDIDATE_CODE_DATA_ALIGNMENT_ACTIVE_FALSE`** 로 보고.
- ★ **merge·activation 은 별도 회장 승인 전까지 금지.** PR merge 자동 실행 0. 이 단계 PASS 해도 systemctl enable / ACTIVE=true / activation_epoch / real wake pilot 은 별도 회장 승인 전까지 금지.

## 필수 검증 (회장 verbatim 14 — 추가 4)
11. systemd path unit(`anu-pickup.path`)은 canonical events watch 유지(무변경) 확인.
12. entrypoint/service 가 CODE_ROOT 와 DATA_ROOT 분리됐는지 확인.
13. canonical reset/clean/stash/checkout 0 확인.
14. task-2716 수정 0 확인.

## doctrine
직접 코딩 금지(ANU)/봇 위임 / canonical·task-2716 무손상 / isolated temp + clean worktree 검증 / driver·runner 무변경(최소 변경) / activation 실행 0 / raw key 0 / same-PR push 금지 · bot trigger 금지 · chain limit · long polling 금지.
```yaml
callback_envelope_byte_limit: 3900
callback_collector_role: ANU
callback_owner_key_source: ".env.keys COKACDIR_KEY_ANU (literal 출력 0)"
```

## goal_assertions (auto-generated)
- `python3 -m dispatch.anu_pickup_driver`
