# task-2775+7 — PR #255 same-branch: Gemini fresh-head HIGH(ledger early-stop) + MEDIUM×2(fail-open 제거·flag 0644) micro-fix (ACTIVE=false)

상태명: `TASK2775_PLUS7_GEMINI_EFFICIENCY_SAFETY_MICROFIX_APPROVED_FOR_DEV2_ACTIVE_FALSE`
담당: dev2-team (PR #255 / branch `task/task-2775-dev2` 소유)
회장 승인: 2026-06-26 — **+7 micro-fix 1회. ★ efficiency 축 마지막 bounded micro-fix로 기록.**
★ +7 이후 같은 efficiency / ledger scan 계열 HIGH가 또 나오면 **micro-fix 중단 → 구조 재설계 보고로 전환**.
★ 이 승인은 **merge / activation / real fire / systemd enable·start / flag 생성 승인이 아님.**
ACTIVE=false · systemd disabled · flags OFF 유지.

## 배경 (fresh-head 29f68b5b Gemini 재리뷰 신규 3건)
ANU 독립검증 PASS(2파일·74 passed) 후 fresh-head 29f68b5b 재리뷰에서 신규 finding:
- **thread3 HIGH** (driver:545, Efficiency): `_count_active_window_pickups`가 ledger 순방향 전수 스캔 →
  active 동안 매 실행 O(N) 병목.
- **thread4 MEDIUM** (driver:466, Security/Correctness): `tempfile.mkstemp` 0o600 → `os.replace` 후
  `p0b_driver_enabled`도 0o600 → 다른 프로세스 읽기 시 Permission Denied.
- **thread5 MEDIUM** (driver:662, Correctness/Safety): `elapsed` 계산 TypeError/ValueError 시 `elapsed=-1.0`로
  T 검사 건너뛰고 **fail-OPEN** → limited 안전모델 위반.

## 핵심 지시 1 — thread3 HIGH: ledger count 최적화 (★correctness 우선)
- `_count_active_window_pickups`는 **N=3 판정에 필요한 만큼만** 세면 된다.
- **`count >= N`(max_count) 도달 시 즉시 stop.**
- ★ **`processed_at < activation_epoch`를 만났다는 이유로 break하지 말 것.** epoch 이전 break는 ledger append
  순서와 `processed_at` 단조성 가정이 필요하므로 **금지**.
- **correctness > efficiency.** N 미만인 경우 **under-count 절대 금지**.
- 역방향(backward) 스캔은 허용. 단 **stop 조건은 `count >= max_count`만** 사용.

## 핵심 지시 2 — thread5 MEDIUM: fail-open 제거 (★최우선)
- `elapsed` 계산 중 TypeError / ValueError / epoch 손상 / 비정상 값 → **`elapsed=-1`로 통과시키지 말 것.**
- fire-capable limited 상태에서 epoch 부재/손상/파싱 실패는 **fail-closed 또는 auto-disabled로 수렴**.
- ★ **N 카운트 경로 · active+epoch부재 경로 · T elapsed 경로 세 경로가 서로 모순 없이 동일 안전정책
  (fail-closed/auto-disabled)으로 수렴하는지 확인해 보고**.
- 결과 = **fire 0, governor/launcher 미호출, driver flag auto-disabled**.
- verdict는 기존 `NOOP_ACTIVE_EPOCH_MISSING_AUTO_DISABLED` 재사용 vs 신규 `NOOP_ACTIVE_EPOCH_INVALID_AUTO_DISABLED`
  중 **코드 일관성 기준으로 dev2가 판단하되 보고서에 명시**.

## 핵심 지시 3 — thread4 MEDIUM: p0b_driver_enabled 권한 0644
- `_atomic_write_flag_disabled`가 최종 `p0b_driver_enabled` 파일을 **0644**로 남기도록(예: replace 전
  `os.chmod(tmp, 0o644)`).
- ★ **이 권한 정책은 `p0b_driver_enabled` 한 파일에만 적용.** 다른 flag/민감 파일에 **일반화 금지**.
- ★ `p0b_driver_enabled`는 **secret이 아니며 값이 `enabled`/`disabled`뿐이라는 전제를 보고서에 명시**.
  이 전제가 코드상 맞지 않으면 **STOP 보고**(임의 dismiss 금지).

## 범위 (엄수)
- **PR #255 같은 브랜치(`task/task-2775-dev2`) 위 commit 추가**. **새 PR 생성 금지**(불가 시 STOP).
- expected_files **2개만**:
  - `dispatch/anu_pickup_driver.py`
  - `tests/regression/test_limited_activation_bounds_2775.py`
- **수정 금지**: preflight(`anu_activation_preflight.py`) / **test-2760** / governor / runner / launcher /
  owner-proof / entrypoint shell·systemd / `.github/**` / `scripts/finish-task.sh`.
- **금지**: merge / activation / real fire / `systemctl enable·start` / activation flag 생성 / canary 주입 /
  recurring 등록 / backlog consumption / **Gemini thread 임의 resolve**.

## 필수 테스트 (test_limited_activation_bounds_2775.py)
- active window count가 **N=3 도달 시 ledger 전체를 끝까지 읽지 않고 stop**.
- **stop 조건이 `count >= N`뿐이며 epoch 이전 break가 없음**을 테스트 또는 코드 근거로 확인.
- N 미만일 때 **correctness 유지**(under-count 0).
- epoch 이전/이후 mixed ledger에서 **epoch-scope 의미 무회귀**.
- `processed_at` 부재 / 파싱실패 / naive 제외 정책 **무회귀**.
- epoch/T 계산 **TypeError·ValueError·손상 입력에서 fail-open 없이 auto-disabled + fire 0**.
- **N 카운트 / active+epoch부재 / T elapsed 세 경로가 동일 안전정책으로 수렴**하는지 확인.
- `_atomic_write_flag_disabled` 최종 flag 권한 **0644**.
- `_atomic_write_flag_disabled` cleanup / 예외 전파 기존 테스트 **무회귀**.
- **2775 bounds 전체 PASS** · **test-2760 전체 PASS** · `py_compile` PASS · expected_files 밖 수정 **0**.

## 결과 보고 (필수)
- PR #255 head · base/head SHA · **diff 파일 수**.
- **thread3/4/5 각각 대응 내용**.
- **epoch 이전 break를 하지 않았다는 증거**.
- **fail-open 제거 및 세 경로 일관성**.
- **`p0b_driver_enabled` 0644 적용 결과**(+ secret 아님 전제).
- 테스트 결과 · ACTIVE=false / real fire 0 증거 · **fresh-head Gemini 재리뷰 필요 여부**.

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

## 진행
dev2는 thread3 early-stop + thread5 fail-closed + thread4 0644 구현·테스트(real fire 0)·로컬검증 후
branch push로 **PR #255 갱신**, 보고서 + .done + ANU callback으로 마감. ANU가 이후 독립검증/Gemini 재리뷰/CI 확인.

## 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+7.md"
    - "memory/events/task-2775+7.done"
  forbidden_paths:
    - ".github/**"
    - "memory/events/*.cron-*"
    - "scripts/finish-task.sh"
    - "dispatch/anu_activation_preflight.py"
    - "tests/regression/test_*2760*.py"
    - "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
```