# task-2774+1 — governor PR 생성 전용 (guard-native push+PR, 새 commit 0)

## 목표 (회장 B안 확정 — ANU never direct push 유지)
이미 존재하는 clean bot-authored commit **`cb910567`** (branch `task/task-2774-dev1`, dev2-odin 작성, 정확히 expected_files 3개)을
**guard-native 경로로 origin push + PR 생성만** 한다. ★ 새 코드 commit 0 · 새 diff 0 · 재구현 0. push + `gh pr create` 만.
상태명: `TASK2774_GOVERNOR_PR_CREATION_REDELEGATED_GUARD_NATIVE_ACTIVE_FALSE`.

## 절대 전제 (회장 명시)
```text
- 기존 branch task/task-2774-dev1 · 기존 commit cb910567 유지. 그 위에 새 commit 추가 금지.
- effective diff = main(177792e5) 대비 정확히 expected_files 3개만.
- guard-native worktree/lock 경로로 push. 수기 lock 복사·hook 우회·--no-verify·canonical branch 직접 checkout 변경 금지.
- ANU 직접 push 아님(이 작업이 봇 guard-native push). merge 금지(리뷰 게이트 진입만).
```

## expected_files (effective diff = 정확히 3개, cb910567 에 이미 커밋됨)
```text
utils/spawn_safety_governor.py                          # 신규 345줄, sha256 0dc77874a5d5de17eaec787f01707ffc92730045fea80567a57940cc7f348bdd
dispatch/anu_result_pickup_runner.py                   # +41줄 (pickup_once owner-gate 직전 governor 차단 1지점), sha256 22d4e235abce3d7957a0634ec2a66aad79ff58aae7c0461b2cb9164ead6ba5aa
tests/regression/test_spawn_safety_governor_2774.py    # 신규 659줄, sha256 77c8eb8608b813c0093ac83081c663c8d816bd6f0524bd37dc032ba30f5f7d85
```

## 절차 (guard-native, 수기 금지)
```text
1. start_task_guard 정규 경로로 task-2774+1 시작 (lock 자동 생성, 수기 lock 복사 금지).
2. git worktree 로 기존 branch task/task-2774-dev1 (head cb910567) 를 격리 worktree 에 attach.
   canonical(main) 직접 checkout 변경 금지. cb910567 위에 새 commit 추가 금지.
3. effective diff 검증: git diff --name-only 177792e5 cb910567 == 정확히 위 3파일. 불일치 → STOP_REPORT.
   3파일 sha256 == 위 anchor 일치 확인. 불일치 → STOP_REPORT.
4. origin 에 branch push: git push origin task/task-2774-dev1 (hook 우회/--no-verify 금지, 정규 push).
5. gh pr create --base main --head task/task-2774-dev1 (아래 PR 본문). merge 금지.
6. PR 생성 후 diff 파일 목록 1회 + PR 번호/head 1회 확인 후 report 종료. CI/Gemini polling 금지(ANU 독립검증 담당).
```

## PR 제목
```text
[task-2774] Spawn Safety Governor — 무한 spawn 방지 6게이트 (governor + pickup 1지점 + 차단증명 9종)
```

## PR 본문 (그대로 반영 — ANU 확정 문구)
```markdown
## 요약
normal callback / owner-pickup 을 안전하게 켜기 위한 **무한 spawn 방지 게이트**(Spawn Safety Governor).
rate-limit / loop-budget / circuit-breaker 신규 + terminal-only hard gate + 기존 dedup/single-flight 연계.
pickup_once owner-proof gate 직전 1지점에 opt-in(차단형) 주입. ★ activation/canary/systemd 0 · ACTIVE=false.

## 변경 (effective diff = expected_files 3개)
- `utils/spawn_safety_governor.py` (신규): evaluate_spawn() 6게이트 + config 상수 + spawn_decisions.jsonl 4필드 기록(silent drop 0).
- `dispatch/anu_result_pickup_runner.py` (+41): pickup_once owner-gate 직전 governor 차단 1지점(opt-in `spawn_governor_fn`, default None). 기존 체인 무손상.
- `tests/regression/test_spawn_safety_governor_2774.py` (신규): 차단 증명 9종.

## ANU 독립검증 — 차단 증명 8/8 PASS (mock spy 로 실제 spawn 호출 0)
1. NON_TERMINAL → BLOCK, spawn 0
2. DEDUP_HIT(재투입) → BLOCK, spawn 0
3. LOOP_EXCEEDED(같은 task 새 head_sha 반복) → BLOCK, spawn 0
4. RATE_EXCEEDED(분당1/시간당5 초과) → QUEUE, spawn 0
5. CIRCUIT_TRIP(fail_rate≥0.5) → TRIP + marker (flag 부재=marker만 / flag 존재='blocked' OFF), spawn 0
6. SINGLEFLIGHT_LIVE(live lock) → QUEUE, spawn 0
7. ALLOW → 기존 체인 1회 통과(무손상)
8. LEDGER silent-drop 0 — 모든 결정 reason·task_id·key·ts 4필드 기록
pytest 9 passed · py_compile PASS.

## ★ 1차 검증 false negative 명시
1차 독립검증은 **검증 오류(false negative)**였음 — ANU가 `decisions_path` 인자(ledger_path 와 별개)를 누락해 빈 ledger 를 읽고 "silent drop/loop broken" 오판.
governor 코드를 직접 읽어 `decisions_path` 가 별도 인자임을 확인 → 모든 path 격리 후 재검증 → 8/8 PASS. **격리 재검증 결과만 최종 근거**(코드 결함 아님, 검증 오류).

## 범위/불변식
- 5단계: IMPLEMENTED ✓ / VERIFIED ✓ / WIRED 부분(opt-in 주입) / ENFORCED 부분(주입 시 우회 불가) / ACTIVE ✗.
- activation flag 생성 0 · systemd/cron/canary 0 · matrix true 변경 0 · 자동 merge 0 · 기존 체인 재작성 0.
- 무관한 baseline dirty 는 PR 에 미포함(effective diff = 3파일).
```

## 금지
```text
ANU 직접 push · cb910567 위 새 commit · expected_files 밖 diff · 재구현/리팩터 ·
수기 lock 복사 · hook 우회 · --no-verify · canonical branch 직접 checkout 변경 ·
activation flag 생성 · systemd start/enable · canary · matrix true · replacement_pr_runner.py 수정 ·
hook import 결함 수정 · 자동 merge/squash · dirty 240 을 PR diff 에 포함.
```

## STOP 조건 (하나라도 → STOP_REPORT, push 중단)
```text
cb910567 외 추가 commit 필요 · expected_files 밖 diff 발생 · sha256 anchor 불일치 ·
guard 우회 필요 · dirty 240 이 PR diff 에 섞임 · activation/canary/systemd 축 번짐 · PR 생성 실패.
```

## 보고 (ANU callback envelope + report)
```text
PR 번호 · pushed branch head(cb910567 확인) · effective diff = expected_files 3개 확인 ·
3파일 sha256 일치 · 새 commit 0 증거 · dirty 미포함 증거 · guard-native 경로(수기 우회 0) 증거 · ACTIVE=false 유지.
※ CI/Gemini 최종 판정은 ANU 가 독립 수행 — 봇은 push+PR 생성까지만.
```

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "utils/spawn_safety_governor.py"
    - "dispatch/anu_result_pickup_runner.py"
    - "tests/regression/test_spawn_safety_governor_2774.py"
  forbidden_paths:
    - "dispatch.py"
    - "scripts/finish-task.sh"
    - "memory/state/automation_capability_matrix.json"
    - "memory/state/p0b_driver_enabled"
    - "utils/replacement_pr_runner.py"
    - ".claude/**"
    - ".env*"
  commands:
    - "git"
    - "gh"
    - "python3"
    - "pytest"
  merge_policy: "manual"
  ttl_hours: 12
```