# task-2553+1 — F1-only 보안 fix · 결과 보고 (HOLD_FOR_CHAIR)

- **작업**: PR #102 OWNER PAT trigger-only **F1만** (원칙 5 forbidden API hard-block)
- **방식**: Option B clean replacement PR (fresh base `origin/main` 7346df82, source PR#102 bd5ad74f 자산 보존)
- **executor**: dev2 Odin (1회 한정)
- **종료 상태**: **HOLD_FOR_CHAIR** — 신규 spec contradiction 발견. GitHub write 0 (push/PR/merge/closeout 미수행).
- **종료 시각(server)**: 2026-05-16 12:36 KST

---

## 1. 결론 요약

F1 코드 수정 자체는 **완성·검증 완료**(RED→GREEN, 접근 가능한 66 PR#102 tests zero-regression).
그러나 완료 기준 **"기존 79 tests 전부 PASS"** 는 지시 범위 내에서 **충족 불가** —
phase3 integration 16 tests 가 mandated fresh base(7346df82)에서 **수집(collection) 자체 실패**.
이는 F1 회귀가 아니라 **Option B base divergence** 로 인한 신규 발견이며, 해소하려면
6-file effective diff 밖의 forbidden action(7번째 파일)이 필수 → 지시서 §9/HOLD 트리거 →
**즉시 HOLD_FOR_CHAIR + 회장 escalate (무한 재시도 금지)**.

## 2. 신규 발견 (BLOCKER) — phase3 ↔ merge_queue_executor Option-B base divergence

- `anu_v2/tests/test_owner_trigger_pat_phase3_integration_2553.py:36` 가
  `from anu_v2.merge_queue_executor import (... STALE_EVIDENCE_BLOCK ...)` 수행.
- `STALE_EVIDENCE_BLOCK` 는 **PR#102 의 stale merge-base 계보(ed8c1250)** 의
  `merge_queue_executor.py`(748 lines)에만 존재. **origin/main 계보에는 한 번도 존재한 적 없음**
  (`git log -S STALE_EVIDENCE_BLOCK -- anu_v2/merge_queue_executor.py` on base lineage = 0).
- fresh base 7346df82 의 `merge_queue_executor.py`(1113 lines)는 해당 개념을
  `GEMINI_STALE_ON_HEAD`(task-2554+2 §3 owner-trigger integration)로 **진화·대체**.
- 결과: 신선 base 위에서 phase3 16 tests `ImportError: cannot import name 'STALE_EVIDENCE_BLOCK'`
  → **collection error**, 79 tests 중 16 불가.
- phase3 외 imports 10개(`AUTO_MERGE_ALLOWED` … `PRMeta`)는 base 에 **존재** — 결손은
  `STALE_EVIDENCE_BLOCK` **단 1 심볼**.

### 해소가 forbidden 인 이유 (3 경로 전부 위반)

| 경로 | 결과 | 위반 |
|---|---|---|
| (A) PR#102 `merge_queue_executor.py`(748L) 도입 | base 1113L→748L, **485 del / 120 ins (605 churn)**, task-2554+2 GEMINI_STALE_ON_HEAD evolution 파괴 | 7번째 파일 = effective diff >6 (Critical 7) + 파괴적 base 회귀 + "F1만" 위반 |
| (B) base `merge_queue_executor.py` 에 `STALE_EVIDENCE_BLOCK` 추가 | 7번째 파일, 진화 모델과 의미 불일치 | effective diff >6 (Critical 7) |
| (C) phase3 test 수정 | — | "phase2·phase3 test 파일 수정" 금지 / "79 tests assertion 수정" 금지 |

→ "79 tests 전부 PASS" ∧ "6-file effective diff" ∧ "phase3 무수정" ∧ "merge_queue_executor 무변경"
**동시 충족 불가 = irreconcilable spec contradiction** (F2 IRRECONCILABLE_SPEC_CONTRADICTION 와
별개의, F1/Option-B base 상의 신규 contradiction).

## 3. F1 구현 — 완성·검증됨 (회장 결정용 evidence)

- 대상: `anu_v2/owner_trigger_pat.py` **F1 영역만** (PR#102 기준 :325-345
  `_FORBIDDEN_ENDPOINT_FRAGMENTS` + `_validate_no_forbidden_fragments`).
- 변경: **fragment blacklist 폐기 → default-deny allowlist**.
  `_build_allowed_gh_args` 박제 형태(issue comments POST, body==`/gemini review`)와
  **구조적 strict-equality** 일치 외 **전부 raise**. 호출부가 내부 헬퍼 우회해
  gh_runner 직접 호출해도 실행 직전 본 함수가 deny (strict gate).
- effective diff(owner_trigger_pat.py, PR#102→F1) = **단일 hunk `@@ -322,27 +322,40 @@`**.
  함수 시그니처/호출부(line 665) 무변경. **F2 영역(env GH_TOKEN/GITHUB_TOKEN,
  `self._gh(args,env)`) byte-identical 검증 완료** (PR#102 bd5ad74f 와 0 diff).
- **RED**(pre-F1): F1 negative regression 7 fail (`DID NOT RAISE` — blacklist 미매칭
  non-allowlisted endpoint 통과 = 원칙5 FAIL 입증). → `task-2553+1.red-evidence.log`
- **GREEN**(post-F1): **77 passed** (66 PR#102 non-phase3 + 11 F1 negative regression).
  helper-bypass non-allowlisted endpoint 전건 deny, 정상 `/gemini review` 경로 통과
  유지(zero-regression). → `task-2553+1.green-evidence.log`

원칙 5: **FAIL → PASS** (F1 범위 한정, 검증 완료).
원칙 10(F2): **여전히 FAIL** — 의도된 미처리, **task-2553+2 이관**(지시서 §3 명시).

## 4. effective diff (6 파일 규율 — phase3 blocker 로 PR 미생성)

| # | 파일 | 상태 |
|---|---|---|
| 1 | `anu_v2/owner_trigger_pat.py` | F1만 (단일 hunk, F2 무변경 검증) ✓ |
| 2 | `tests/regression/test_owner_trigger_2553_plus1_f1.py` | 신규 (11 negative regression) ✓ |
| 3 | `memory/reports/task-2553+1.md` | 본 보고 ✓ |
| 4 | `memory/events/task-2553+1.result.json` | marker ✓ |
| 5 | `memory/events/task-2553+1.red-evidence.log` | RED 박제 ✓ |
| 6 | `memory/events/task-2553+1.green-evidence.log` | GREEN 박제 ✓ |

6 파일 밖 effective diff **0**. PR#102 원본 무변경, same-branch push **미수행**.
isolated worktree `task/task-2553+1-dev2-f1`(@7346df82) 에 작업 보존, **push/PR/merge/closeout 0**.

## 5. HOLD 사유 & 회장 escalate

지시서 §9 / HOLD 트리거 다중 적중:
"79 tests assertion 수정 필요" · "6파일 밖 diff 필요" · "phase3 test 수정 필요" ·
"79 tests 회귀(수집 불가) 발생" · "신규 finding". → "즉시 HOLD_FOR_CHAIR + 회장 보고.
무한 재시도 금지." 자동 merge/closeout/finish-task.sh/수동.done **미수행**.

### 회장 결정 요청 (옵션)

1. **F2 패턴 준용 분리**: phase3↔merge_queue_executor base-divergence 를 별도 task
   (예: task-2553+2 에 흡수 또는 task-2553+3)로 이관 — test-suite redesign(phase3
   의 STALE_EVIDENCE_BLOCK → GEMINI_STALE_ON_HEAD 모델 재매핑) 동반. 본 cycle 은
   F1 단독 GO (phase3 16 tests 제외, 63→ 실측 66 non-phase3 + F1 11 zero-regression).
2. **base 변경 승인**: phase3 가 통과하는 base(PR#102 merge_queue_executor 포함
   계보) 지정 — 단 task-2554+2 evolution 손실 trade-off 회장 판단.
3. 기타 회장 지정.

— 회장 GO 없이 dispatch/GitHub write/추가 시도 0. **dev2 ALL_HALTED.**
