# task-2729+25 — LAUNCH_WAKE_AT_FORMAT_COMPAT (pickup wake --at 30s 제거, activation 0)

## 레벨
Lv.2 (pickup wake launcher --at 형식 호환성 hardening. real callback spawn canary blocker 수정. production activation 아님)

## 발번 주석
real callback spawn canary 에서 발견: launch_wake 가 cokacdir 발사 시 `--at "30s"`(초 suffix) 사용 → cokacdir 거부('invalid --at value: 30s') → wake-build/authority 통과·실 cron 등록 실패. **launcher compatibility bug** (production activation blocker 아님). 회장 2026-06-09 봇 위임 승인. canary 재실행은 본 task 범위 밖(별도 승인).

## ★ FRESH BASE HARD GATE
1. worktree 반드시 **origin/main `38177185`(또는 이후 최신 main)** 분기. canonical(task-2716) 분기 금지.
2. `git worktree add -b task/task-2729+25-<bot> <path> origin/main`. commit 전 merge-base --is-ancestor 38177185 HEAD==YES + task-2716 div 0 검증, 실패 시 HOLD.
3. diff origin/main..HEAD = expected_files 만(3). 오염 diff → HOLD.

## 근본 (단일 소스)
- `dispatch/anu_owned_callback_enforcement.py:1005` — `anu_runner_pickup_and_fire` 가 `build_anu_owned_callback_request(..., at=at or "30s", ...)` 호출. `at=None`(pickup 경로) → default `"30s"` → cokacdir 거부.
- cokacdir 허용 --at: 절대 `YYYY-MM-DD HH:MM:SS` / 상대 `30m`·`4h`·`1d`. **초 `Ns` 미지원.**
- 선례: `normal_fallback_callback_helper.py:386` `build_absolute_at_for_normal_delay(delay_seconds, now)` = task-2661 Phase 2b 검증 helper, `(now+delay).strftime("%Y-%m-%d %H:%M:%S")` 절대 timestamp 반환. normal 경로엔 이미 적용·pickup wake 경로만 미반영.

## 수정 (최소 1줄+import — 회장 verbatim)
1. `anu_owned_callback_enforcement.py:1005` 의 **`at=at or "30s"` 에서 `"30s"` 제거** → `at=at or build_absolute_at_for_normal_delay(60)` (now+60s 절대 timestamp).
2. `build_absolute_at_for_normal_delay` 를 `normal_fallback_callback_helper` 에서 import(재사용, 신규 로직 0). (기존 import 패턴/lazy import 관용 따름)
3. ★ **명시 `at` 인자 제공 시 그 값 우선**(기존 동작 보존 — `at or ...` 구조 유지).
4. 기본 delay = **now+60s 절대**(등록~발사 race 회피 + STABLE_SEC 여유).
5. 그 외 함수/모듈 로직 무변경. ★ `_build_envelope_prompt`(hygiene patch) 무수정.

## EXPECTED FILES (정확히 3 — 초과 시 HOLD)
1. `dispatch/anu_owned_callback_enforcement.py` — L1005 at default(import + 1줄)
2. `tests/regression/test_launch_wake_at_format_2729p25.py` — 회귀
3. `memory/reports/task-2729+25.md`
- ★ normal_fallback_callback_helper.py(재사용만, 수정 0)/git_evidence.py/dispatch.py/callback_preregistration.py 무수정. _build_envelope_prompt 무수정. 수정 필요 판명 시 HOLD.

## 필수 regression (isolated)
1. pickup 경로 default at 가 **`is_absolute_at` True**(cokacdir-compatible 절대 `YYYY-MM-DD HH:MM:SS`) 반환. 2. 출력/argv 에 `"30s"`/`Ns` suffix **부재**. 3. **명시 `at` 주입 시 그 값 우선**(기존 동작). 4. normal callback path(build_absolute_at_for_normal_delay 재사용) **무영향**. 5. owner proof/envelope/raw key(owner_key 제거 유지) 회귀 무손상. 6. raw key 0. 7. ACTIVE=false / systemd enable 0 / activation_epoch absent / real spawn 0.

## dry-run 검증
- launch_wake `dry_run=True` 로 빌드된 argv 의 `--at` 값이 `is_absolute_at` True 확인(실 cron 등록 0·real spawn 0). isolated temp.

## 금지 (회장 verbatim)
1. real wake  2. canary 재실행  3. systemd enable  4. ACTIVE=true 선언  5. activation_epoch 생성  6. legacy result.json 처리  7. production queue 스캔  8. callback prereg Phase B 착수  9. task-2716 수정.
- 모든 검증 isolated temp. canonical 무손상.

## 이번 라운드 범위 (★PR 생성까지)
- 구현 + isolated verify(회귀+dry-run) + **PR 생성** + CI/Gemini fresh gate 확인까지. merge·canary 재실행 = 별도 회장 승인 전까지 0.

## 완료 판정
- 회귀 PASS + "30s" 제거(절대 timestamp default) + 명시 at 우선 + normal 무영향 + hygiene/authority 무손상 + PR 생성 + CI GREEN + fresh Gemini HIGH/CRITICAL 0 + unresolved 0(또는 non-blocking) → **`MERGE_APPROVAL_CANDIDATE_LAUNCH_WAKE_AT_FORMAT_COMPAT_ACTIVE_FALSE`**.
- fresh HIGH/CRITICAL 재발 / PR diff raw key 노출 / expected_files 초과 / 타파일 수정 필요 / 명시 at 동작 깨짐 / activation 필요 → **`HOLD_FOR_CHAIR`**.
- ★ real_callback_spawn 은 여전히 NOT_YET_VERIFIED 유지. merge·canary 재실행 = 별도 회장 승인 전까지 0.

## 완료 후 callback
- 봇 완료 시 ANU(c119085addb0f8b7)로 normal callback cron 발사(envelope only, UTF-8 ≤3900 bytes, collector=ANU): task_id/result_path/report_path/PR번호/terminal_state/sha256/one-line summary. ★envelope/로그에 full key literal 박지 말 것.

## doctrine
직접 코딩 금지(ANU)→봇 위임 / fresh origin/main 38177185 / 1줄+import surgical / build_absolute_at_for_normal_delay 재사용(신규 로직 0) / 명시 at 동작 보존 / _build_envelope_prompt·normal_fallback_helper·git_evidence·dispatch·callback_prereg 무수정 / PR diff raw key 0 / activation 0 / real wake·canary 0 / same-PR post-Gemini push 금지.
```yaml
callback_envelope_byte_limit: 3900
callback_collector_role: ANU
callback_owner_key_source: ".env.keys COKACDIR_KEY_ANU (sealed, literal 출력 0)"
```
