# task-2775 — limited activation guard micro-PR: 3경계(kill/N/T) 선행 안전 결선 (ACTIVE=false)

상태명: `LIMITED_ACTIVATION_GUARD_MICRO_PR_APPROVED_FOR_DEV2_ACTIVE_FALSE`
담당: dev2-team (anu_pickup_driver 소유)
회장 승인: 2026-06-26 — **dev2 위임용 task md 작성 + 1회 dispatch 승인**.
★ 이 승인은 **activation / real fire / systemd enable / flag 생성 승인이 아님.**
ACTIVE=false · systemd disabled · flags OFF 유지.

## 배경
limited activation §10 gap audit(`memory/reports/limited_activation_gap_audit_260626.md`) 결과
`GAP_PRESENT_MICRO_PR_REQUIRED_ACTIVE_FALSE`. 관측/ fail-closed는 PRESENT이나, **limited를 "진짜 limited"로
만드는 3경계가 없어** 아직 "무인인데 스스로 안 꺼지는 상태". 이 micro-PR은 그 3경계만 코드에 박는 **선행 안전
micro-PR**(activation 아님).

## micro-PR 목적 (최소 3경계만)
driver 진입 최상단, **fire 가능 경로 이전**에 limited-bound gate 1개를 둔다. gate는 **kill → N → T 순서**로 확인:
1. `memory/state/p0b_kill` 존재 시 → 즉시 NOOP, **fire 0**, governor 호출 전 단락.
2. 활성창 누계 **N=3** 도달 시 → `p0b_driver_enabled` **atomic disabled write** + NOOP, **fire 0**.
3. `p0b_activation_epoch` + **120분(T)** 경과 시 → `p0b_driver_enabled` **atomic disabled write** + NOOP, **fire 0**.
세 조건 중 하나라도 걸리면 **fire 0, governor 호출 전 NOOP로 단락**.

## 범위 (엄수)
- expected_files **원칙적으로 2개만**:
  - `dispatch/anu_pickup_driver.py`
  - 신규 회귀 테스트 `tests/regression/test_limited_activation_bounds_*.py`
- **수정 금지**: governor / runner / launcher / owner-proof / freshness / systemd 유닛 / `.github/**` /
  `scripts/finish-task.sh`.
- **금지**: activation flag 생성 / `systemctl enable·start` / real fire / canary 주입 / recurring 등록 / backlog consumption.

## 구현 원칙
- driver 진입 최상단(fire 가능 경로 이전)에 limited-bound gate 1개.
- gate 확인 순서 = **kill → N → T**.
- 어느 하나라도 걸리면 **fire 0**, **governor 호출 전** NOOP 단락.
- N/T 초과 시 `p0b_driver_enabled`를 **atomic write로 `disabled`** 처리.
- ★ **default OFF 기존 동작 절대 무손상.**
- ★ 정상 조건(N 미만 · T 이내 · kill 없음)에서 **기존 B 1-shot 경로 무변경**.
- 누계 N의 기준 = processed_ledger(또는 동등 활성창 누계). epoch 기준 = `p0b_activation_epoch` 마커.

## 필수 테스트 (test_limited_activation_bounds_*.py)
- `p0b_kill` 존재 → 즉시 NOOP · fire 0 · **governor 미호출**.
- 누계 **N=3** 도달 → 다음 진입 시 자동 `disabled` + NOOP + fire 0.
- `epoch + 120분` 경과 → 자동 `disabled` + NOOP + fire 0.
- N 미만 / T 이내 / kill 없음 → **기존 정상 경로 보존**.
- `disabled` write **atomic** 검증.
- governor / owner-proof / freshness / self-callback 차단 **무회귀**.
- `py_compile` PASS · 관련 regression PASS · expected_files 밖 수정 **0**.

## 중단 조건 (하나라도 → STOP_REPORT, 우회 0)
- expected_files 밖 수정 필요.
- governor/runner/launcher/systemd/finish-task 수정 필요.
- activation 또는 real fire가 필요해지는 경우.
- 정상 작업을 **false-OFF** 하는 구조.
- 기존 default-OFF / `NOOP_DISABLED` / B 1-shot 경로를 깨는 경우.
- self-callback / owner-proof / raw key redaction 축으로 scope가 번지는 경우.

## 결과 보고 (필수)
- PR 번호 · base/head SHA · expected_files diff · 테스트 결과.
- ACTIVE=false / systemd disabled / flags OFF 증거.
- real fire 0 / canary 0 / recurring 0 증거.
- limited GO 후보 가능 여부.

## 완료 처리 + ANU callback (필수)
- 완료 시 `memory/events/task-2775.done` + `memory/reports/task-2775.md`.
- 봇 idle 전 **ANU callback 필수**(성공/실패/blocked 무관). collector=ANU, owner_key=`c119085addb0f8b7`,
  self-key 금지. callback prompt UTF-8 **≤3900 bytes** (`printf '%s' "$P" | wc -c`), envelope 만
  (task_id·PR#·new head sha·result_path·report_path·one-line). **merge 절대 금지.**
- PASS 나와도 **머지 금지** — ANU 독립검증 → fresh-head Gemini → CI 확인 → MERGE_CANDIDATE로만 보고.
  회장 명시 승인 전까지 PR open 유지.

## 진행
dev2는 3경계 결선 구현·테스트(real fire 0)·로컬검증 후 branch push → PR 생성 → 보고서 + .done +
ANU callback으로 마감. ANU가 이후 독립검증/Gemini/CI 확인 → 회장 머지 판단 → (머지 후) limited GO 후보 packet.

## allowed_resources (본 task의 capability)

```yaml
allowed_resources:
  paths:
    - "dispatch/anu_pickup_driver.py"
    - "tests/regression/test_limited_activation_bounds_2775.py"
    - "memory/reports/task-2775.md"
    - "memory/events/task-2775.done"
  forbidden_paths:
    - ".github/**"
    - "memory/events/*.cron-*"
    - "scripts/finish-task.sh"
    - "utils/spawn_safety_governor.py"
    - "dispatch/anu_result_pickup_runner.py"
    - "dispatch/anu_callback_launch_audit.py"
    - "dispatch/anu_owned_callback_enforcement.py"
    - "memory/state/p0b_driver_enabled"
    - "memory/state/p0b_callback_launch_enabled"
  commands:
    - "pytest"
    - "python3 -m py_compile"
    - "git"
    - "gh"
  merge_policy: "manual"
  ttl_hours: 24
```