---
task_id: "2699+1"
type: plan
scope: task
title: OWNER_GEMINI_TRIGGER FRESH RE-EXTRACT (origin/main a2a20f94 기준 복구)
team: 1팀 (dev1-team / Hermes)
level: 3
priority: P1
status: completed
created_at: 2026-05-27
chair_authorization_id: CHAIR-AUTH-TASK-2699-PLUS1-FRESH-REEXTRACT-OWNER-GEMINI-WIRING-20260527-JJONGS-IMPLEMENT-001
base_sha: a2a20f94cf3723a943ead9c2c3e11d48d7b711df
completion_target: TASK_2699_FRESH_REEXTRACT_READY
---

# 계획서 — task-2699+1 Fresh Re-extract

## 1. 목표 (1줄)
origin/main(**a2a20f94**) 기준 fresh clean worktree 에서 task-2699 산출을 재적용 →
**새 fresh PR** open. PR #158(stale base 사고)은 보존 evidence 로 미접촉.

## 2. 배경
- task-2699 PR #158 = stale 로컬 main(f14b3850, origin/main 대비 ahead 68/behind 6) 기반 분기 사고.
- merge-base 6220f5b5(stale) → CONFLICTING + 무관 파일(dispatch/__init__.py, memory/**, scripts/**, tests/regression/**) 부풀림.
- 로컬 main dirty → finish-task GIT-GATE 차단 → callback 미발사.
- ★ task-2699 봇 산출 자체는 정상. PR #158 은 보존 evidence.

## 3. 범위 (재적용 대상)
### 3.1 신규 추가 3파일 (origin/main 에 없음 — task-2699 고유 production)
1. `anu_v2/owner_trigger_http_post.py` (233줄, production http_post — urllib single endpoint)
2. `anu_v2/owner_trigger_entry.py` (487줄, entry point — CLI 단발 + scheduler)
3. `anu_v2/tests/test_owner_trigger_http_post_wiring_2699.py` (493줄, 8 시나리오 검증 test)

### 3.2 기존 origin/main 정본과 동일 — 미변경 (중복정리)
4. `anu_v2/owner_gemini_trigger_router.py` — origin/main(task-2641 0c0162e2)과 **byte-identical** → 미변경
5. `anu_v2/owner_gemini_trigger_router_audit.py` — origin/main과 **byte-identical** → 미변경
6. `anu_v2/gemini_evidence_freshness_checker.py` — origin/main과 **byte-identical** → 미변경

### 3.3 코어 보존 (다운그레이드 금지)
- `anu_v2/owner_trigger_only.py` — origin/main 버전에 task-2563 FUC-3 보안 하드닝(logger.exception,
  `_redact_diagnostics` secret masking) 포함. task-2699 worktree 버전은 이것이 누락된 behind 버전 →
  **절대 덮어쓰지 않음**. 신규 파일이 import 하는 심볼(TOKEN_ENV_NAME, TokenBoundaryViolation,
  assert_endpoint_allowed, OwnerTriggerOnly, invoke_from_scheduler)은 origin/main 버전에 모두 존재 → 호환.

## 4. router 중복 정리 결론
- origin/main(a2a20f94)에 task-2641 OWNER_GEMINI_TRIGGER_ROUTER(0c0162e2) 이미 존재.
- 봇 산출의 router 3파일 = origin/main 정본과 **바이트 단위 동일**.
- → 차이 0. 재추가 불필요. **기존 origin/main 정본이 정본**, fresh PR 에 해당 3파일 포함 안 함(중복 0).
- 결과적으로 fresh PR 은 신규 production 3파일만 담는다.

## 5. 호환성 검증 (사전)
- 신규 3파일 import 심볼 전수조사 → origin/main 의존 모듈(owner_trigger_only, auto_gemini_triage,
  merge_queue_executor[GhRunner/GitRunner/AuditWriter/PytestRunner/MergeQueueExecutor],
  executor_scheduler, idle_pr_diagnoser, owner_trigger_audit) 에 전부 존재 확인 완료.

## 6. 작업 절차 (base SHA 명시 강제)
1. ✅ git fetch → origin/main == a2a20f94 확인 (완료)
2. git worktree add <new> **a2a20f94** (로컬 HEAD 금지)
3. base SHA 를 task marker 기록
4. task-2699 worktree(361b1699) 에서 신규 3파일 read-only 추출 → fresh base 재적용
5. router 중복정리(=미변경 확인)
6. regression: pytest test_owner_trigger_http_post_wiring_2699.py + import smoke
7. fresh branch commit + push
8. fresh PR open (base origin/main a2a20f94)
9. merge-base == a2a20f94 검증 (stale base 0)
10. finish-task → .done → ANU callback

## 7. 금지 (회장 verbatim)
- 6파일 외 포함 / artifact(memory/reports/plans/envelope/log/marker) PR head commit
- dispatch/__init__.py 등 무관 파일 포함
- 로컬 main 기준 worktree 분기 (반드시 origin/main a2a20f94)
- 로컬 main reset --hard / dirty 일괄 stash / ahead 68 commit 손실
- PR #158 same-PR conflict fix push / PR #158 branch 접촉
- manual .done / auto-merge / merge

## 8. 완료 기준
- TASK_2699_FRESH_REEXTRACT_READY (merge 는 회장 결재 영역, 본 작업 범위 아님)
