# task-3047 — update-system-spec.py 정기 실행 (6시간 주기 / 13회차)

- 담당: dev8 (라, Ra)
- 실행: 2026-08-28 18:15:35 KST ~ 18:16 KST
- 대상: `/home/jay/workspace/scripts/update-system-spec.py`
- 결과: **정상 실행 · 문서 갱신 완료 · 데이터 손실 0건** (exit code 1 = 알려진 `cron` 수집 실패)

## 1. 실행 결과

```
[FAIL] cron: ANU_CHAT 환경변수가 설정되지 않았습니다.
[OK] skills / services / projects / scripts / task_stats
변경 감지: ['cron', 'task_stats']
memory/specs/anu-system-spec.md 업데이트 완료.
변경 로그 기록 완료: memory/specs/anu-system-spec-changelog.md
EXIT: 1
```

`[cron]` 실패는 13회 연속 동일한 **거짓 양성**이다. `collect_cron()` 이
`ANU_CHAT`/`ANU_KEY` 를 요구하는데 크론 환경에 미주입 → `new=None`,
캐시의 `old` 는 non-None 이라 `old != new` 로 무조건 "변경" 항목이 생성된다.
정작 문서 갱신 루프는 `if section not in new_state: continue` 로 건너뛰므로
**로그만 찍히고 문서는 그대로**다. 데이터 손실 없음 = Critical 7 아님.

## 2. 검증 (실행 전 스냅샷 ↔ 실행 후 대조)

`cp` 스냅샷(1,234줄) → 실행 → 전문 `diff` + 마커 명시 구간 md5.
**판정 권위 = 전문 diff > 구간 md5** (t3043 교훈).

### 전문 diff — 10줄, `task_stats` 단독
```
1167,1168c1167,1168
< | 총 작업 수 | 2288 |      > | 총 작업 수 | 2290 |
< | 완료된 작업 | 2223 |     > | 완료된 작업 | 2225 |
1170c1170
< | 평균 소요시간 | 1시간 10분 11초 |  > | 평균 소요시간 | 1시간 10분 9초 |
```
증가분 **+2 중 1건은 본 task 자신**의 타이머 start = 자기참조.
이 수치를 외부 활동량으로 읽지 말 것.

### `AUTO:cron` 블록 — 13회 연속 보존
`sed -n '/AUTO:cron:START/,/AUTO:cron:END/p'` (t3043 교훈대로 `awk` range 미사용)
- before `af7090faa1da20f713b9f6e31ae7eb8c` (58줄)
- after  `af7090faa1da20f713b9f6e31ae7eb8c`
- 블록 diff **0줄**, `created_at` = `2026-04-16 11:16:10` 동결

### changelog
prepend 방식(최신이 상단). `## [2026-08-28 18:15] 변경 내역` 정상 기록 확인.

## 3. 잠복 항목 추적

### services — 변경 감지 목록에 없음
스펙 17 = 실측 17 (`systemctl --user list-units --state=running --type=service`),
**집합 diff 0줄**. 플래핑 3종(`at-spi-dbus-bus`·`dbus`·`gpg-agent`) **9회 연속 present**.
그래도 승격하지 않는다 — 승격 조건은 회차 수가 아니라 *세션 재시작을 관통한 생존*이다.

### ★ `cloudflared-whisper.service` — 5회차 연속 머무름
```
ActiveState=inactive  SubState=dead  ExecMainStatus=0
ExecMainExitTimestamp=Thu 2026-08-27 14:35:05 KST   Restart=on-failure
```
경과: t3038 포착 → t3041 **9h40m** → t3043 **15h40m** → t3045 **21h40m** →
**t3047 27h40m**. 단조 증가 = 왕복하지 않는 델타 확증(플래핑 아님).
`Restart=on-failure` 는 exit 0 에 구조적으로 미발동 → **자동 복구는 일어날 수 없다.**
무알림 상태 27시간 40분 지속.

**실피해 여전히 0건**: canonical 소비자 `scripts/youtube-transcribe.py:32` 는
`http://localhost:8200/v1/transcribe` **직접 호출**이라 튜널 무관.
`whisper-gpu.service` = `active`, 프로브 **HTTP 405**(메서드 불일치 응답 — 생존 판정
동일. 이전 회차 404 와 코드가 달라도 절대값으로 판정하지 말 것).
튜널은 quick tunnel 이라 URL 이 매 재시작 변경 → 하드코딩 소비자 존재 불가.
→ 긴급도 낮음. 처방 전 선행질문 유지: **이 튜널의 외부 소비자가 실재하는가?**

### 백업 격자 (08-25_00 ~ 08-28_18, 16슬롯)
**15 존재 / 결번 1** — `2026-08-26_12` **모드B(레코드 자체 부재)** 1건 그대로, 신규 결번 0.
연속 ok 회차를 세어 "고장 아님"으로 승격하지 않는다(t3036 정정 유지).

## 4. 미해소 잠복결함
`collect_services()` **returncode 미검사** — 세션버스 실패 시 `services` 블록
21줄→2줄 소실 가능(재현 완료, 실발생 0회). 위임 대상으로 계류 중.

## 5. 판정
**정상 완료.** 문서 갱신·changelog 기록 정상, 데이터 손실 0건.
제이회장님 알림 필요 사유(실패) **없음** — exit 1 은 알려진 거짓 양성 단일 섹션.
