# task-2775+1 ANU 독립검증 — active+epoch 부재 production main 경로 확인 (260626)

> ★ read-only 독립검증. 코드 직접 확인. 머지 0 · activation 0 · real fire 0 · flag 생성 0 · ACTIVE=false 유지.
> 회장 1차 판단(2026-06-26): epoch-scope 보정은 긍정, 단 잔여 갭(active+epoch 부재 production fail-closed 미결선) 확인 요구.

## 최종 판정: `ACTIVE_EPOCH_MISSING_PRODUCTION_GAP_ACTIVE_FALSE`
**production main() 경로에서 `p0b_driver_enabled=enabled` + `p0b_activation_epoch` 부재/손상 시 →
fail-closed 안 되고 None pass-through로 scan_once 진행.** 회장 판정기준(pass-through → MERGE_CANDIDATE 금지)에
해당. **머지 후보 보류.**

---

## 1. epoch-scope 보정 자체는 양호 (수용 후보)
- `_count_active_window_pickups(activation_epoch=...)`: epoch 이후 entry만 카운트. `activation_epoch=None`이면
  **0 반환**(전체 ledger 누계 금지 → 재가동 즉시 false-OFF 방지). ✅
- `processed_at` ISO8601 → tz-aware 파싱 후 unix epoch 비교. **naive(offset 미보존)/부재/파싱 실패 → 보수적
  제외(None)**. ✅
- T=120 만료 `main()` L1 스모크(`test_main_t_expired_smoke`, epoch=now−121분) 추가. ✅
- 재가동 false-OFF 방지 테스트 포함. ✅
- +1 commits: `2786ae72`(epoch-scope) · `29ec5819`(epoch 부재 fail-closed 보존). expected_files 2개 유지.

## 2. ★ 잔여 갭 (치명 — MERGE 보류 사유)
**production main() 호출부**(PR #255 diff):
```python
_bound = limited_activation_bound_gate(CANONICAL_ROOT)   # ← is_activated_fn 미주입
if _bound is not None: return 0
```
gate 내부(diff line 183-190): `is_activated_fn` **미주입 → active=False 보수처리**. dev2 주석이
*"미주입(production main 기본 호출) → active=False"* 라고 명시.

→ **결과 (검증 4항 답):**
1. production main()에서 enabled + epoch 부재 → active=False → epoch 부재 fail-closed **미발동** →
   `_count_active_window_pickups`는 epoch None이라 0, T도 epoch None이라 미발동 → **gate None 반환**.
2. governor/launcher 이전 fire 0 fail-closed/auto-disabled → **안 됨**(None이라 단락 안 함).
3. **조용히 None pass-through → 기존 is_activated(enabled) 경로로 scan_once까지 진행 = YES (문제 지점).**
4. dev2가 req#5 fail-closed를 main에 직접 결선 시 **test-2760 hermetic 라우팅 3건**(is_activated=True patch +
   epoch 미설정)이 깨져서, **fail-closed를 `is_activated_fn` 명시 주입(테스트)에서만 발동**하도록 우회 →
   **안전정책을 테스트 주입에만 고정 → 실제 가동 안전 약화 = YES.** (보고서도 "별도 승인 작업 필요"로 자인.)

## 3. 정직한 뉘앙스 (환각 방지)
- **지금 당장 위험 0**: ACTIVE=false(p0b_driver_enabled OFF)라 main()이 애초에 NOOP_DISABLED로 단락. dev2의
  "production 영향 0"은 **현재 시점 한정으로 참**.
- **그러나 limited GO의 전제가 깨짐**: limited activation을 실제로 켜는 순간(enabled ON) epoch 마커가 없거나
  손상되면 → **기준선(N/T) 없이 무제한·무기준으로 scan_once 진행** = limited 경계 붕괴. 우리가 막으려던 바로
  그 계열. **limited GO 전 반드시 닫아야 할 갭.**

## 4. micro-fix 필요 범위 (★자동 진행 안 함 — 회장 승인 후 dev2 재위임)
**목적**: production main()에서 active(enabled) + epoch 부재/손상 → governor·launcher 이전 fire 0
fail-closed(또는 auto-disabled). 조용한 pass-through 제거.
- **(핵심) main() 호출부에 `is_activated_fn` 결선**:
  `limited_activation_bound_gate(CANONICAL_ROOT, is_activated_fn=lambda: is_activated(CANONICAL_ROOT))`.
  → enabled + epoch 부재 → active=True → `NOOP_ACTIVE_EPOCH_MISSING` 자동 disabled + fire 0.
- **★ test-2760 회귀 처리(설계 판단 필요)**: 직접 결선 시 test-2760의 라우팅 테스트(is_activated=True, epoch
  미설정)가 깨짐. 두 방향 —
  - (A) test-2760에 epoch 마커 setup 추가 → **expected_files가 3개로 확장**(test-2760 파일). 범위 확장 승인 필요.
  - (B) epoch 부재 fail-closed를 **limited-activation 모드(예 `activation_intended=True` 또는 전용 flag)에서만**
    적용해 legacy scan_once 라우팅과 분리 → test-2760 무손상. **driver 2파일 내 가능성 높음(권장 후보).**
  - 어느 쪽이 옳은지는 **회장 설계 판단** 영역 → 범위만 보고, 임의 선택 안 함.
- expected_files(잠정): `dispatch/anu_pickup_driver.py` + `tests/regression/test_limited_activation_bounds_2775.py`
  (B안) / test-2760 포함 시 3개(A안). governor/runner/launcher/systemd/.github/finish-task **무수정** 유지.
- 테스트: production main() enabled+epoch부재 → fire 0 fail-closed/auto-disabled 실경로 검증, 기존 12+ 회귀 ·
  test-2760 무손상.

## 5. 금지 유지 (회장 지시)
merge / activation / real fire / systemd enable·start / flag 생성 / canary / recurring — **전부 금지.**
ACTIVE=false · systemd disabled · flags OFF. micro-fix는 **범위 제시까지만**, 구현·PR·머지 **자동 진행 0**,
회장 승인 대기.

## 6. 한 줄 결론
**N window scope는 잘 고쳤다. 그러나 "epoch가 없을 때 production main이 실제로 멈추는가"가 미결 —
현재 코드는 멈추지 않고 pass-through. limited GO 전 main() 호출부 is_activated_fn 결선(+ test-2760 분리/보강)
micro-fix 1건이 필요하다.**
