# task-2699+1 — OWNER_GEMINI_TRIGGER FRESH RE-EXTRACT (origin/main a2a20f94 기준 복구 · 회장 verbatim 2026-05-27)

- Level: Lv.3 (보안 · OWNER capability · fresh re-extract 복구)
- 담당: **dev1-team Hermes 헤르메스** (★ 회장 verbatim 2026-05-27 지정 · bot key c38fb9955616e24d · task-2699 산출 동일 컨텍스트)
- chair_authorization_id: **`CHAIR-AUTH-TASK-2699-PLUS1-FRESH-REEXTRACT-OWNER-GEMINI-WIRING-20260527-JJONGS-IMPLEMENT-001`** (★ 회장 verbatim 2026-05-27 발급 확정)
- 완료 목표: **`TASK_2699_FRESH_REEXTRACT_READY`** (★ not MERGE_READY / not RELEASE_READY / not MERGED)

## ★ 배경

task-2699 PR #158 = **stale 로컬 main 기반 분기** 사고. 로컬 main(f14b3850)이 origin/main(a2a20f94)과 diverge(ahead 68/behind 6) → PR #158 merge-base 6220f5b5(stale) → CONFLICTING + 무관 파일 부풀림 + 로컬 main 808 dirty 로 finish-task GIT-GATE 차단 → callback 미발사.
박제: `memory/events/task-2699-callback-missing-main-dirty-deepcheck-plan-260527.json`

★ task-2699 봇 산출 자체는 정상(owner_trigger* 6파일 · forbidden 0 · QC PASS). PR #158 은 **보존 evidence**(건드리지 않음).

## ★ 목표 (1줄)

origin/main(**a2a20f94**) 기준 **fresh clean worktree** 에서 task-2699 산출 6파일만 재적용 → **새 fresh PR** open. (PR #158 same-PR push 수정 아님)

## ★ 재적용 산출 6파일 (★ task-2699 worktree 361b1699 에서 read-only 보존 추출)

1. `anu_v2/owner_trigger_http_post.py` (production http_post — urllib single endpoint)
2. `anu_v2/owner_trigger_entry.py` (entry point — CLI 단발 + scheduler)
3. `anu_v2/owner_gemini_trigger_router.py` (router)
4. `anu_v2/owner_gemini_trigger_router_audit.py` (router audit)
5. `anu_v2/gemini_evidence_freshness_checker.py` (freshness checker)
6. `anu_v2/tests/test_owner_trigger_http_post_wiring_2699.py` (검증 8 시나리오 test)

## ★ origin/main task-2641 router 중복 정리 (★ 회장 verbatim 4)

origin/main(a2a20f94)에 **이미 task-2641 OWNER_GEMINI_TRIGGER_ROUTER(0c0162e2) 존재**. task-2699 봇은 behind 라 이를 못 보고 router 재추가. fresh base 에서:
- origin/main 기존 router(owner_gemini_trigger_router.py 등)와 봇 산출 비교
- **중복 없이 정리**: 기존이 정본이면 봇 산출 차이분만 병합 / 봇 산출이 개선이면 교체 근거 명시
- 신규 고유분(owner_trigger_http_post.py · owner_trigger_entry.py — production http_post + entry point)은 origin/main 에 없으므로 신규 추가

## ★ 작업 절차 (★ base SHA 명시 강제 — divergence 재발 방지)

1. `git fetch origin` → origin/main SHA **a2a20f94 확인** (다르면 HOLD_FOR_CHAIR)
2. **`git worktree add <new> a2a20f94`** (★ 로컬 main 아닌 origin/main SHA 명시 base — 절대 로컬 HEAD 기준 분기 금지)
3. base SHA(a2a20f94)를 task marker 에 기록
4. task-2699 worktree(361b1699)에서 6파일 내용 read-only 추출 → fresh base 에 재적용
5. origin router(task-2641) 중복 정리 (위 §)
6. regression: `python3 -m pytest anu_v2/tests/test_owner_trigger_http_post_wiring_2699.py -q` + 기존 owner_trigger_only test PASS
7. fresh branch `task/task-2699-plus1-<bot>` commit + push
8. **fresh PR open** (base origin/main a2a20f94)
9. merge-base == a2a20f94 검증 (stale base 0 확인)
10. finish-task → .done → ANU callback (★ clean origin base 라 GIT-GATE 무관 dirty 0 기대)

## ★ 금지 (★ 회장 verbatim)

- expected_files(6파일 + 직접 필요분) 외 포함
- memory/reports/plans/envelope/log/marker artifact PR head commit
- dispatch/__init__.py 등 task-2699 무관 파일 포함
- 로컬 main 기준 worktree 분기 (★ 반드시 origin/main a2a20f94)
- 로컬 main reset --hard / dirty 876 일괄 stash·checkout / ahead 68 commit 손실 조치
- PR #158 same-PR conflict fix push
- task-2699 명목 타 task 파일 정리
- manual .done 생성
- auto-merge / merge

## ★ Spawn Verification + base SHA 검증

fire+5분 4 신호 + **worktree base SHA == a2a20f94 확인** (stale base 면 즉시 HOLD).

## ★ callback

ANU key c119085addb0f8b7 + --session 53e89540-... · 4-source · envelope ≤3900 bytes · self-key 금지. base SHA·fresh PR번호·6파일 evidence·중복정리 내역 포함. envelope PR head commit 0.

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "anu_v2/owner_trigger_http_post.py"
    - "anu_v2/owner_trigger_entry.py"
    - "anu_v2/owner_gemini_trigger_router.py"
    - "anu_v2/owner_gemini_trigger_router_audit.py"
    - "anu_v2/gemini_evidence_freshness_checker.py"
    - "anu_v2/tests/test_owner_trigger_http_post_wiring_2699.py"
    - "anu_v2/owner_trigger_only.py (★ 코어 보존 · 필요시 entry wiring 만)"
  forbidden_paths:
    - "settings.json · hooks/** · Axis/** · .github/** · dispatch.py · dispatch/__init__.py"
    - "memory/** · reports/** · plans/** · **/anu_callback/** · **/envelope/**"
    - "**/.env* · **/credentials*"
    - "PR #158 branch (★ 보존 · 미접촉)"
  commands:
    - "git fetch / worktree add <new> a2a20f94 / log / diff / show / commit / push"
    - "gh pr create / gh pr view / gh api (read)"
    - "python3 -m pytest (mock/dry-run only · live POST 0)"
  merge_policy: "no_merge_chair_approval_required"
  ttl_hours: 6
```

## ★ 보고 필드 (callback)

1. worktree base SHA (== a2a20f94 검증)
2. fresh branch/PR 번호 + head SHA
3. 6파일 재적용 evidence
4. origin router 중복 정리 내역
5. regression PASS
6. artifact 0 + forbidden 0 evidence
7. merge-base == a2a20f94 검증
8. finish-task .done 생성 여부 + callback
9. forbidden_action_count

## 종결

성공: **`TASK_2699_FRESH_REEXTRACT_READY`** (★ merge 회장 결재)

★ 회장 verbatim 2026-05-27 Option 1 fresh re-extract. origin/main a2a20f94 base 강제. PR #158 보존. divergence 재발 방지(base SHA 명시).

끝

## goal_assertions (auto-generated)
- `python3 -m pytest anu_v2/tests/test_owner_trigger_http_post_wiring_2699.py -q`
