# task-2762+2 보고서 — PR #245 Gemini HIGH 수렴 시도 → STOP_REPORT (dev1)

> 목표 상태명(`PR245_GEMINI_HIGH_REMEDIATED_PUSHED_AWAIT_REREVIEW_ACTIVE_FALSE`) **미달성**.
> 사유: Gemini HIGH 가 **명세대로(동적 재로드 제거 + 표준 import) 해결 불가능** — 원인이 expected scope(2파일) 밖 파일(`tests/dispatch/__init__.py`)에 있음. 중단 조건 #4(scope 밖)·#9(HIGH 해결 불가) 발동. **push 0 · merge 0 · Gemini 트리거 0 · real fire 0 · .done 0.**

## Situation (상황)
PR #245(branch `task/task-2762-dev1`, head `e123609c`, merge-base `origin/main 1029131c`)의 Gemini 2026-06-18 15:26 리뷰 지적 3건(HIGH 1 + MEDIUM 2)을 same-PR·same-branch·scope 2파일 내부에서 수정해 **Gemini High 0** 으로 닫는 것이 목표였다. 직전 라운드(task-2762+1)는 stale base(8420a763) → fresh(1029131c) **rebase 정렬만** 수행했고(코드 축 추가 0), Gemini 실수정은 본 라운드(+2)의 몫이었다.

## Complication (문제)
HIGH 항목(테스트 파일의 `sys.modules` 직접 조작 + dispatch 패키지 동적 재로드 제거 → 표준 import 화)을 명세대로 적용하자, **테스트 collection 단계에서 전면 붕괴**(`ModuleNotFoundError: No module named 'dispatch.anu_result_pickup_runner'`)했다. 표준 import 의 전제("sys.path 부트스트랩이 이미 있으므로 표준 import 만으로 동작")가 **이 레포의 pytest 환경에서 성립하지 않는다.**

## Question (핵심 질문)
expected scope(2파일) 내부 수정만으로, 테스트 의도(실 build_owner_gate_fn 경로·executor_key kwarg 정합) 약화(permissive lambda 化) 없이 HIGH 를 해결할 수 있는가?

## Answer (결론 — 불가능, STOP)
**불가능.** 근본 원인은 scope 밖 파일이다. 따라서 push 하지 않고 STOP_REPORT 로 ANU/회장 adjudication 에 escalation 한다.

---

## 근본 원인 — 결정적 증거 (Gemini HIGH 전제의 사실 오류)

레포 구조:
- `tests/__init__.py` **부재**, 그러나 `tests/regression/__init__.py` **존재**, 그리고 **`tests/dispatch/__init__.py` 존재(0바이트 빈 shadow 패키지)**.
- pytest 기본 `prepend` import 모드는 `tests/regression/test_*.py` 수집 시, 첫 비-패키지 부모인 **`tests/` 를 `sys.path[0]` 에 삽입**한다.
- 그 결과 `import dispatch` 가 워크트리 root 의 **실제 `dispatch/` 패키지보다 `tests/dispatch/`(빈 패키지)를 우선 resolve** 한다.

pytest 내부 진단(임시 테스트로 직접 측정):
```
[DIAG] dispatch.__file__ = .../task-2762-dev1/tests/dispatch/__init__.py     ← 빈 shadow
[DIAG] dispatch.__path__ = ['.../task-2762-dev1/tests/dispatch']
[DIAG] has anu_result? NO  ModuleNotFoundError No module named 'dispatch.anu_result_pickup_runner'
```

즉 **HIGH 가 제거하라고 지목한 `sys.modules` 직접 조작 + spec_from_file_location 동적 재로드는 이 shadow 를 무력화하기 위한 구조적 필수 장치**다. 형제 회귀 테스트 2개(`test_p0b_event_strategy_2760.py`, `test_p0b_event_strategy_wiring_2760.py`)도 **동일한 동적 재로드 패턴을 의도적으로 사용**하며, 그 파일 상단 주석이 사유를 명시한다:
> "tests/dispatch/__init__.py(테스트용 빈 패키지)가 실제 dispatch 패키지를 가리지 않도록, 워크트리 root 의 실제 dispatch 를 파일 위치로 직접 로드한다."

### 검증 대비표 (실측)
- **원본(동적 재로드 유지, e123609c)**: 3그룹 `42 passed` (owner_gate 6 + 2760 16 + wiring 20).
- **HIGH 명세 적용(동적 재로드 제거 → 표준 import)**: collection `ERROR` — `ModuleNotFoundError`, **6 테스트 전부 미수집(전면 붕괴)**. 단독 실행·클린 인터프리터(`python3 -c`)에서는 성공하나 **pytest 수집 경로에서만 shadow 가 우선**하여 실패.

→ HIGH 명세 그대로 적용 시 결과는 "test pollution 위험 제거"가 아니라 **테스트 전면 불능**이며, 이는 리뷰어가 우려한 것보다 엄격히 더 나쁜 상태다.

## 왜 scope 내 해결이 불가능한가 (중단 조건 매핑)
HIGH 를 진짜로 닫으려면 다음 중 하나가 필요한데, 전부 expected scope 밖이거나 테스트를 깨뜨린다:
1. **`tests/dispatch/__init__.py` 삭제/개명** → shadow 제거 → 표준 import 가능. 그러나 이 파일은 expected_files(2파일)·allowed_resources.paths 밖 → **중단 조건 #4(scope 밖 수정 필요)**.
2. **conftest(`tests/regression/conftest.py`) 에 dispatch 경로 교정 추가** → 역시 scope 밖 파일 수정 → **중단 조건 #4**.
3. **동적 재로드 제거만 하고 방치** → 테스트 전면 붕괴 → HIGH "해결"이 아니라 회귀. 테스트 의도(실 factory 경로 검증)를 permissive 化 없이 살릴 방법이 scope 내에 없음 → **중단 조건 #9**.

## 3 항목 처리 결과
1. **[HIGH] 동적 재로드 제거 → 표준 import**: **적용 불가(상기 사유)**. 시험 적용 후 e123609c 원본으로 **완전 원복**(working tree clean). push 0.
2. **[MEDIUM] runner line 1345 `isinstance` 가드 → `or` 단순화**: **현행 유지 결정**. `executor_key if (isinstance(executor_key, str) and executor_key) else bound_executor_key` 와 `executor_key or bound_executor_key` 는 **모든 type-valid 입력(str|None)에서는 동일**하나, **비-str truthy 입력**에서 의미가 달라진다(원본: bound 폴백으로 이상치 무시 / `or`: 이상치를 보안 게이트로 forward). 게이트는 `executor_key and runtime_key == executor_key → FAIL_CLOSED` 로 executor_key 를 self-collector 방어 판정에 사용하므로, `isinstance` 가드 제거는 **방어 narrowing 의 약화**에 해당. task 의 "의미 변하면 현행 유지" + 중단 조건 #5(medium 단순화가 self-collector 방어 약화 유발)에 따라 **무수정**.
3. **[MEDIUM] 테스트 `try...finally` → `self.addCleanup`**: **수정 자체는 안전·타당(검증 완료)**. 6개 테스트 메서드 전부 `td = _TmpDir(); self.addCleanup(td.cleanup)` 로 치환 시 의미 보존·py_compile OK 확인. 그러나 **HIGH 가 닫히지 않아 본 task 가 STOP 이므로 단독 push 하지 않음**(push 안 함 doctrine). ANU 가 HIGH 처리 방침 확정 시 동반 적용 권장(아래 권고).

## ANU/회장 권고 (adjudication 요청)
HIGH 는 **구조적 false-positive 성격**(동적 재로드가 shadow 패키지 무력화에 필수)이다. 다음 중 택일 권고:
- **(A) Gemini HIGH 를 rationale 과 함께 DISMISS**: "동적 재로드는 `tests/dispatch/__init__.py` shadow 무력화에 구조적 필수, 형제 회귀 2개 동일 패턴, 제거 시 테스트 전면 붕괴." (단, 본 task 는 Gemini 트리거/PR 코멘트 금지 — ANU owner 권한으로 처리)
- **(B) 별도 follow-up task 승인**: scope 를 `tests/dispatch/__init__.py`(또는 conftest)로 확장하여 shadow 자체를 제거 → 그 후 표준 import + MEDIUM #3(addCleanup) 동반 적용. 이 경우 본 +2 의 MEDIUM #3 패치도 함께 반영.

## 보고 요구 항목 (필수)
- **task id**: task-2762+2
- **old head**: `e123609c5b8842318d04a9528dd8a8066c747255`
- **new head**: `e123609c5b8842318d04a9528dd8a8066c747255` (**push 0 — 변동 없음**)
- **merge-base(origin/main, HEAD)**: `1029131cdcb43da570755fb5131046f11922c2f3` (유지)
- **effective diff (origin/main...HEAD)**: 정확히 2파일 유지 (`dispatch/anu_result_pickup_runner.py`, `tests/regression/test_p0b_owner_gate_signature_2762.py`)
- **3 항목 수정 diff**: HIGH=적용불가·원복 / MEDIUM#2=현행유지 / MEDIUM#3=안전하나 STOP 으로 미push
- **self-collector 방어 보존 근거**: line 1345 무수정(isinstance 가드 보존) — 방어 narrowing 유지
- **테스트 3그룹 결과**: 원본 상태 `42 passed` (owner_gate 6 / 2760 16 / wiring 20). HIGH 명세 적용 시 collection ERROR(증거 상기).
- **가드 우회 0 증거**: start_task_guard 9/9 `[GUARD OK]` 정식 통과(lock 자동 생성). 수기 lock 0 · hook bypass 0.
- **real fire 0**: cokacdir --cron / systemd / 외부 발사 0. executor self-key callback 0.
- **ACTIVE=false**: activation/systemd enable/recurring cron 변경 0.
- **3 flag OFF**: 유지.

## L1 스모크테스트 결과 (필수 기록)
본 task 는 테스트 회귀·가드 push 시스템 작업이며, 코드 push 가 발생하지 않았다(STOP). 실동작 검증은 **real-factory pytest 실행 + pytest-내부 import resolve 직접 측정**으로 수행했다.
- **서버 재시작**: 해당없음 (서버 동작 변경 0)
- **API 응답 확인**: 해당없음 (API 변경 0). 대신 원격/로컬 진실 확인: `git diff --name-only origin/main...HEAD` = 2파일, `merge-base` = 1029131c, working tree CLEAN @ e123609c.
- **스크린샷**: 해당없음 (CLI/pytest 작업)
- **L1 판정**: **통과** — real-factory pytest 3그룹 실제 실행(원본 42 passed), HIGH 적용판 collection ERROR 실측, pytest 내부 `dispatch.__file__` shadow resolve 직접 측정. 실동작(원인 규명) 검증 완료.

## 머지 판단
- **머지 필요**: No (STOP — HIGH 미해결, merge 금지 유지, PR #245 open 유지)
- **브랜치**: task/task-2762-dev1
- **워크트리 경로**: /home/jay/workspace/.worktrees/task-2762-dev1
- **머지 의견**: HIGH 가 scope 내 미해결이므로 merge-ready 아님(ambiguous). ANU adjudication(A 또는 B) 후 진행 권고. relay_hints 로 `gemini_finding`·`merge_ready_ambiguous` 표기하여 ANU wake.

## 발견 이슈 및 해결
- **이슈(핵심)**: HIGH 명세(동적 재로드 제거)가 `tests/dispatch/__init__.py` shadow 로 인해 테스트 전면 붕괴 유발.
  - **해결**: 시험 적용 → 실패 실측 → 원본 완전 원복 → 근본 원인 규명 → STOP_REPORT escalation. scope 밖 수정 0, push 0.
- **범위 내 미해결**: HIGH (scope 내 해결 불가 — ANU adjudication 필요).

## 완료 경로 / ANU callback (contract 준수 — RESULT-ONLY EXECUTOR / OS-LEVEL PICKUP)
본 task 는 RESULT-ONLY EXECUTOR CONTRACT(task-2755) + OS-LEVEL PICKUP CLOSEOUT CONTRACT(task-2730) 적용 대상이다. STOP 이므로 .done 미생성(finish-task.sh 미호출). closeout/ANU callback 은 OS-level pickup runner 가 result.json owner-proof 후 소유.
- **result.json 작성**: `memory/events/p0b_inbox/task-2762+2.result.json` (schema=`dispatch.executor_completion_contract.result.v1`).
  - `terminal_state=EXECUTOR_STOP_REPORT_HIGH_INFEASIBLE`, `head_sha=e123609c...`, `changed_files=[]`(push 0), `report_path=memory/reports/task-2762+2.md`.
  - `schedule_created_by_executor=false`, `callback_fired_by_executor=false`, `owner_key_proof_present=false`, `owner_pickup_required=true`, `schedule_owner_proof=PENDING_ANU`, `authoritative=false`.
  - `relay_hints={gemini_finding:true, merge_ready_ambiguous:true, critical7:false, consolidated_report:false}` → ANU wake(결정 필요).
- **executor self-key callback 발사 0**: ANU key 를 executor 가 직접 등록/발사하지 않음. ANU-key OS-level pickup runner 가 result.json pickup. (SELF_COLLECTOR_FORBIDDEN 준수, result.json = NOT_REGISTERED/SENDFILE_ONLY 회피 채널.)

## 모델 사용 기록
- 본 task 는 hard STOP 게이트(scope/conflict/방어약화 발생 시 즉시 중단)와 guard-native 정밀 제어가 핵심인 시스템 작업이라, DIRECT-WORKFLOW 예외 조항(정밀 제어 필요·오위임이 오히려 scope 위반 위험)에 따라 **팀장(Hermes)이 직접 정밀 Edit/가드/진단 오케스트레이션 수행**. 팀원(불칸/이리스/아테나/아르고스) 신규 코딩 위임 없음(HIGH 적용불가·MEDIUM 1건 현행유지·1건 STOP 보류로 영구 변경 0). 디자인 작업 없음.
- haiku 사용: 없음.

## 비고 (금지사항 준수 확인)
- 새 PR 생성 0 · merge 0 · Gemini 트리거 0 · 2b′ real callback 재실행 0 · real callback fire 0 · activation 0 · systemd enable 0 · recurring cron 변경 0 · admin override 0 · hook bypass 0 · 수기 lock 0 · expected scope 밖 수정 0 · push 0 · 수동 .done 0.
