---
task_id: task-2699
type: plan
scope: task
created: 2026-05-27
updated: 2026-05-27
status: completed
---

# 계획서: task-2699 — OWNER_GEMINI_TRIGGER_CAPABILITY_WIRING

**task**: task-2699
**목표**: `owner_trigger_only` 코어(검증/dedupe/redaction/decision v1)에 **production http_post 구현체**와 **entry point(CLI 단발 + scheduler 자동)**를 무훼손으로 wiring 하여 ad-hoc POST를 영구 제거한다.
**승인**: 회장 verbatim 2026-05-27 / chair_authorization_id `CHAIR-AUTH-TASK-2699-OWNER-GEMINI-TRIGGER-CAPABILITY-WIRING-20260527-JJONGS-IMPLEMENT-001`
**근거**: `memory/tasks/task-2699.md` (회장 verbatim 10) + `memory/events/task-2698-pr157-owner-trigger-capability-incomplete-260527.json`

---

## 목표 (측정 가능)

1. `anu_v2/owner_trigger_http_post.py` — urllib 기반 단일 endpoint POST `http_post` 구현체 + `OWNER_GEMINI_TRIGGER_TOKEN` token_provider (BOT_GITHUB_TOKEN fallback 0). dry-run 지원.
2. `anu_v2/owner_trigger_entry.py` — `OwnerTriggerOnly` 생성 + http_post/token_provider 주입 + 구동 진입점 (단발 CLI `trigger` + scheduler 자동 `scan`).
3. `owner_gemini_trigger_router.py` + 의존 2개 main 반영 단일화 (정본 규명 후).
4. 검증 8 시나리오 전부 PASS + 기존 owner_trigger 회귀 PASS (현재 baseline 32 PASS).
5. token 누출 0 (grep evidence) + live POST 0 (mock/dry-run only).

## 범위

### 포함
- production http_post 구현체 (urllib single endpoint, FORBIDDEN_ENDPOINT 재검증, redaction)
- token_provider (OWNER_GEMINI_TRIGGER_TOKEN only, fail-closed)
- entry point: 단발 CLI(`trigger`) + scheduler 자동(`scan`) — runner 생성 + 주입 + 구동
- router main 반영 단일화 (router.py + gemini_evidence_freshness_checker.py + owner_gemini_trigger_router_audit.py)
- 신규 테스트 (mock HTTP/dry-run/dedupe/forbidden/token-unavail/redaction/entry/regression)

### 제외 (다음 페이즈 이후)
- owner_trigger_only 코어 로직 재작성 (★ http_post wiring + entry point 만 추가)
- 실제 OWNER PAT live POST (mock/dry-run 만)
- merge/push/PR/admin endpoint 경로 추가
- task-2698 / PR #157 (별개 task)

## 위임 계획

- MT-1 production http_post + token_provider: **불칸(백엔드)** — urllib 보안 구현
- MT-2 entry point (CLI + scheduler): **불칸(백엔드)** — 합성 루트(composition root)
- MT-3 router main 반영 단일화: **불칸(백엔드)** — 정본 byte-identical 복사 + orphan pyc 제거
- MT-4 검증 8 시나리오 테스트: **아르고스(테스터)** — mock/dry-run
- G2 QC: **마아트(독립검증)** + **로키(레드팀)**

## 검증 기준

- mock HTTP: `pytest anu_v2/tests/test_owner_trigger_http_post*.py` → POST 1회, body=="/gemini review", endpoint==issues/{pr}/comments
- dry-run: 실제 POST 0 + decision path 통과
- dedupe: 동일 (pr,head) 2회 → 2번째 DEDUPED, POST 0
- forbidden endpoint: merge/pulls 주입 → ForbiddenEndpointError
- token unavailable: OWNER_GEMINI_TRIGGER_TOKEN 부재 → fail-closed (POST 0)
- redaction: `grep -rn "OWNER_GEMINI_TRIGGER_TOKEN값\|Bearer " 로그/marker` → token 문자열 0
- entry point: CLI/scheduler 단발 → runner 생성 + http_post 주입 + (mock) POST
- regression: `pytest anu_v2/tests/test_owner_trigger_*` 전부 PASS
