---
task_id: "2699+1"
type: context-notes
scope: task
status: completed
---

# 맥락노트 — task-2699+1

## 핵심 결정 (Decision Log)

### D1. 신규 3파일만 fresh PR 에 포함, router 3파일 미포함
- **근거**: origin/main(a2a20f94)에 task-2641(0c0162e2) router 3파일이 이미 정본으로 존재하고,
  task-2699 봇 산출의 동일 3파일과 `diff` 결과 **byte-identical**. 차이가 0 이므로 재적용=no-op.
  fresh PR 에 포함하면 origin/main 과 동일 내용을 중복 커밋하는 것이라 무의미 + diff noise.
- **검증**: `diff <(git show origin/main:<f>) <wt>/<f>` → 3파일 모두 "identical".

### D2. owner_trigger_only.py 코어 보존 (다운그레이드 금지) — 보안 결정
- **근거**: origin/main 버전은 task-2563 FUC-3 보안 하드닝 보유 — `logger.exception` 으로 http_post
  실패 경로 traceback 박제 + `_redact_diagnostics` 가 token/Authorization/api_key/secret/password 를
  case-insensitive 로 마스킹. task-2699 worktree 버전은 이 하드닝이 **누락된 behind 버전**.
- 만약 task-2699 버전으로 덮어쓰면 → **secret masking 손실 = 보안 회귀**. 이 작업은 SECURITY 작업이므로
  절대 불가. task 지시 allowed_resources 도 "owner_trigger_only.py (★ 코어 보존)" 명시.
- **호환성**: 신규 파일이 import 하는 5개 심볼 전부 origin/main 버전에 존재 → 보존해도 신규 파일 정상 작동.

### D3. worktree base = origin/main SHA a2a20f94 명시 (로컬 HEAD 금지)
- **근거**: task-2699 사고의 root cause = 로컬 main(f14b3850) 기반 분기 → divergence(ahead68/behind6) →
  stale merge-base 6220f5b5 → 무관파일 부풀림. base 를 SHA 로 명시 고정하면 재발 차단.
- `git worktree add <path> a2a20f94` 형태로 commit-ish 직접 지정.

## 3 Step Why 자문 (Lv.3 설계 검증)

- **1st Why — 왜 이 설계(fresh re-extract, 신규 3파일만)가 필요한가?**
  → A: PR #158 은 stale base 로 인해 merge-base 가 오염되어 무관파일 30+ 개가 부풀려졌고 CONFLICTING 이라
  머지 불가. clean origin base 에서 실제 필요한 production 산출(신규 3파일)만 다시 올려야 GIT-GATE 통과 +
  리뷰 가능한 최소 diff 가 된다.

- **2nd Why — 왜 A(신규 3파일만 + 정본 router 미포함)가 최선의 접근인가?**
  → B: router 3파일은 이미 origin/main 정본과 byte-identical 이라 재포함은 0-diff noise 일 뿐 가치 0.
  반대로 production 진입점인 http_post/entry/test 3파일은 origin/main 에 부재 → 이것만 추가하면
  "OWNER_GEMINI_TRIGGER wiring" 의 실제 미싱피스를 정확히 메운다. 최소 surface = 최소 리스크.

- **3rd Why — 왜 B가 다른 대안(PR #158 same-PR fix / 봇 owner_trigger_only 통째 복사)보다 나은가?**
  → C: (a) PR #158 same-PR fix 는 stale merge-base 를 그대로 끌고 가 conflict 가 재발하고 회장이 보존
  evidence 로 지정한 PR 을 훼손한다. (b) 봇 owner_trigger_only 통째 복사는 FUC-3 보안 하드닝을 덮어써
  secret masking 회귀를 일으킨다 — 보안 작업에서 치명적. B 는 보존 evidence 무손상 + 보안 무회귀 +
  최소 diff 라는 세 제약을 동시에 만족하는 유일한 선택.
  → A-B-C 논리 일관성 OK. 설계 확정.

## 로키(DA) 레드팀 적대 질문 대비 (3rd Why 검증 — "이 설계가 실패할 수 있는 시나리오는?")
- S1. 신규 파일이 origin/main 의 (behind 아닌) owner_trigger_only 와 심볼 불일치 → import 실패.
  → 방어: 5개 import 심볼 전수 grep 확인 완료 + pytest import smoke 로 실증.
- S2. merge_queue_executor 등 의존 모듈이 origin/main 에 부재/심볼 불일치.
  → 방어: GhRunner/GitRunner/AuditWriter/PytestRunner(typing alias)/MergeQueueExecutor 모두
  origin/main 동일 위치 존재 확인.
- S3. fresh worktree 가 또 로컬 HEAD 기준으로 분기되어 divergence 재발.
  → 방어: base SHA a2a20f94 명시 + 생성 직후 merge-base==a2a20f94 검증.
- S4. PR head commit 에 artifact(report/plan/marker) 혼입.
  → 방어: git add 를 3파일 명시 경로로만 수행, status 로 staged 목록 검증.

## G1 Agent 미팅 결과 (만장일치 찬성)
- **불칸(백엔드) 독립검증**: Q1 import 호환성 PASS / Q2 보안 무회귀 PASS / Q3 테스트 정합성 PASS /
  Q4 설계결함 — task-2699 worktree 의 owner_trigger_only.py 가 behind 라는 사실 재확인.
- **조건 자동 충족**: 본 설계는 owner_trigger_only.py 를 task-2699 worktree 에서 복사하지 **않는다**.
  fresh worktree 는 a2a20f94 에서 생성되어 FUC-3 하드닝된 정본 owner_trigger_only.py 를 이미 보유.
  → behind 버전 유입 경로 자체가 없음. G2 에서 `git diff origin/main -- owner_trigger_only.py == 빈값`
  으로 무변경 실증.
- **Codex 사전검증**: pass=true (critical=False). risks 5건은 "코드 미첨부" 류 → 실제 diff/심볼 전수검증으로 선제 대응.
- **blob SHA 핀(무결성)**: http_post=08e5837b / entry=7d6e4276 / test=9272f683 (Codex 제안2 반영).
- **합의**: 헤르메스(찬성) + 불칸(조건부찬성, 조건 설계상 자동충족) → **만장일치 G1 통과**.

## G2 구현 게이트 결과
- **regression**: wiring test 9/9 PASS + owner_trigger 전체 263 PASS (회귀 0, FUC-3 테스트 포함).
- **import smoke**: http_post/entry origin/main 호환 실증.
- **마아트 독립검증 PASS**: 5개 주장 전부 직접 명령 재실행 VERIFIED (merge-base==a2a20f94,
  3파일 scope, router/only blob-identical[997f6f69], FUC-3 9건, 263 PASS).
- **로키 보안 레드팀 PASS (미수정 High 0건)**: 핵심 보안속성(예외/audit redaction, fail-closed,
  엔드포인트 hard-block 11종, body '/gemini review' 고정, 토큰부재 fail-closed) 견고.
  - 발견: Medium#1 `_redact_owner_response` gho_/ghu_/ghr_ 임베디드 redaction 갭 /
    Medium#3 F-4 subprocess env 누락(pytest_runner·gh_snapshot_provider) / Low#5 SSRF api_base(외부도달경로 0).
  - **disposition = 범위 외 후속 hardening**: 3건 모두 task-2699 원본 산출에 동일 존재(verbatim).
    blob SHA 핀(08e5837b/7d6e4276/9272f683) 고정 + 회장 권한이 "동일 6파일 재적용"이라
    수정 시 무결성 위반 + 보존 evidence divergence. 실 production 토큰(github_pat_/ghp_)은 redaction 보호됨.
    → 후속 hardening task 권고 (본 작업 범위 아님).
  - **3rd Why 적대질문 충족**: "이 설계가 실패할 시나리오?" 5축(토큰유출/엔드포인트/권한/본문변조/fail-open)
    전수 점검 → High 0.

## 참조
- task 파일: memory/tasks/task-2699+1.md
- 사고 박제: memory/events/task-2699-callback-missing-main-dirty-deepcheck-plan-260527.json
- task-2699 worktree: /home/jay/workspace/.worktrees/task-2699-dev1 (361b1699)
- task-2641 정본 커밋: 0c0162e2 (origin/main 에 반영됨)
