# task-2777+1 — PR #257 Gemini micro-fix (systemctl/DBus HIGH + epoch tz MED + cron helper MED, ACTIVE=false)

상태명: `TASK2777_PR257_GEMINI_MICROFIX_APPROVED_ACTIVE_FALSE`
담당: dev2-team (PR #257 / branch `task/task-2777-dev2` 소유)
회장 승인: 2026-06-28 — **bounded +1 micro-fix 1회.** OWNER resolve 금지(HIGH=신뢰성 결함).

## 배경
PR #257(read-only anu_control_status.py)은 CI 11/11 PASS 수렴했으나 Gemini unresolved 3건(HIGH 1 + MED 2)이
남아 MERGE_CANDIDATE 아님. HIGH는 조종석 systemd 상태 표시 신뢰성 결함 → style nit이 아니므로 +1 micro-fix로 닫는다.

## 범위 (엄수)
- **PR #257 같은 브랜치(`task/task-2777-dev2`) 위 commit 추가. 새 PR 생성 금지** — PR #257 head 갱신.
- expected_files:
  - `scripts/anu_control_status.py`
  - `tests/regression/test_anu_control_status_2777.py`
  - 보고서: `memory/reports/task-2777-r1.md` **또는** 기존 `memory/reports/task-2777.md`에 r1 섹션 추가(repo 관례대로 택1).
- **코드/테스트 범위 절대 확장 금지.**

## 수정 요구 1 — Gemini HIGH (systemctl / DBus 실패 처리, anu_control_status.py:205)
`systemctl --user is-active/is-enabled` 호출이 다음에서 **안전 처리**되어야:
nonzero exit · stderr 출력 · DBus/session bus unavailable · systemctl command missing · timeout · stdout empty.
- 허용 출력: `systemd.active = "unknown"|"unavailable"` · `systemd.enabled = "unknown"|"unavailable"` ·
  warnings에 `SYSTEMD_STATUS_UNAVAILABLE`(또는 유사 marker) 추가 · stderr 원문은 raw 길게 X(안전 요약/분류) · **crash 0**.
- 금지: 실패인데 `inactive/disabled`처럼 **확정 표시** · stderr가 human/json 출력 **오염** · traceback · raw 환경값/key 출력.

## 수정 요구 2 — Gemini MEDIUM (activation_epoch age timezone, line 227)
- p0b_activation_epoch가 **Unix timestamp 숫자**면 `time.time() - epoch_seconds`로 계산(tz 독립).
- ISO datetime 지원 시 **timezone-aware** 처리. **naive면 KST/local 임의 해석 금지** → UTC 가정 또는
  `UNKNOWN_NAIVE_DATETIME` warning.
- 음수 age·파싱 실패 → **crash 없이 unknown/warning**. **KST 환경에서도 안정적**.

## 수정 요구 3 — Gemini MEDIUM (cron helper 구조, line 261)
- raw key 여전히 금지. 기존 **sealed read-only cron helper가 실제로 있고** raw key 출력/기록 없이 cron-list 조회만
  안전하면 사용. helper 불명확/ key path 신설 필요면 **사용 금지** → `cron = "UNKNOWN_KEY_REQUIRED"` 유지.
- **왜 UNKNOWN인지 warnings/reason에 명확히 표기**. raw key literal을 code/test/log/output 어디에도 0. 새 key path 0.
  cron 등록/수정 0.

## 테스트 추가/보강 (필수)
- systemctl DBus failure / nonzero stderr: crash 0 · systemd unknown/unavailable · warning 존재 · stderr가 JSON 안 깨짐.
- systemctl command missing 또는 timeout: crash 0 · unknown/unavailable.
- activation_epoch numeric timestamp age: **timezone 독립** 계산.
- activation_epoch naive datetime: 임의 local tz 해석 금지 · unknown 또는 explicit warning.
- cron helper unavailable: UNKNOWN_KEY_REQUIRED 또는 safe unknown · raw key 출력 0.
- **read-only invariant 유지**: 파일 생성 0 · 수정 0 · evidence append 0 · flag write 0 · driver execution 0.
- 기존 2777 전체 PASS · 2776 regression PASS · 가능하면 2775/2760/2721 인접 회귀 PASS · py_compile PASS.

## 금지
OWNER resolve로 HIGH 닫기 / pending·unresolved서 merge candidate 선언 / merge / auto-merge / flag ON /
driver 실행 / fixture 생성 / real fire / LIVE_PROCESSED / systemd start·enable / cron 등록 / key rotation /
raw key 추가 / production activation.

## bounded fix doctrine
HIGH/Critical=0 목표 · 이번은 HIGH 1 + MED 2 대응. style-only는 비차단 분리. 같은 axis 반복 결함 시 구조 분리 보고.

## PR 게이트 (merge candidate 판정 — merge는 ANU/회장)
PR #257 head 갱신 · effective diff expected_files 안 · HIGH 0 · Critical 0 · blocking Medium 0 · Gemini unresolved 0 ·
CI 11/11 PASS · read-only invariant PASS · raw key/secret 0 · ACTIVE=false · flags OFF · real fire 0 · systemd 조작 0 ·
cron 신규 0 · archive 28 보존 · pending fixture quarantine 보존 · code dirty 0.

## 완료 처리 + ANU callback (필수)
- 완료 시 `memory/events/task-2777+1.done` + 보고서(r1).
- 봇 idle 전 **ANU callback 필수**. collector=ANU, owner_key=sealed loader 봉인, self-key 금지. callback prompt
  UTF-8 **≤3900 bytes**, envelope 만(task_id·PR#257·new head sha·result_path·report_path·one-line). **merge 금지.**
- PASS 나와도 머지 금지 — ANU 독립검증 → fresh Gemini → CI → MERGE_CANDIDATE 보고로만.

## 진행
dev2는 systemctl 실패 안전처리 + epoch tz-aware + cron helper 구조 보정 + 테스트 보강 후 branch push로
**PR #257 갱신**(새 PR 금지), 보고서(r1) + .done + ANU callback. ANU가 이후 독립검증/Gemini/CI/merge candidate 재판정.

## allowed_resources
```yaml
allowed_resources:
  paths:
    - "scripts/anu_control_status.py"
    - "tests/regression/test_anu_control_status_2777.py"
    - "memory/reports/task-2777-r1.md"
    - "memory/reports/task-2777.md"
    - "memory/events/task-2777+1.done"
  forbidden_paths:
    - ".github/**"
    - "scripts/finish-task.sh"
    - "dispatch/anu_pickup_driver.py"
    - "memory/state/**"
    - "memory/events/p0b_inbox/**"
    - "memory/events/p0b_live_inbox/**"
    - "memory/p0b_state/**"
    - "memory/reports/p0b_inbox_backlog_archive_260627/**"
    - "memory/reports/phase1_retry_observed_phase1obs260628/**"
  commands: ["pytest", "python3 -m py_compile", "git", "gh"]
  merge_policy: "manual"
  ttl_hours: 24
```
