# 작업 보고: task-3043 — update-system-spec.py 정기 실행 (11회차)

- 팀: dev8 (라 / Ra) · 레벨: Lv.1 (정기 운영 실행) · 코드 변경 0줄
- 실행: `python3 /home/jay/workspace/scripts/update-system-spec.py`
- 결과: **문서 갱신 성공 · exit code 1** (기지의 `cron` 섹션 거짓 양성)

## 1. 실행 결과

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

`cron` 실패는 **11회 연속 동일한 거짓 양성**이다(task-3015부터).
`collect_cron()`이 `ANU_CHAT`/`ANU_KEY`를 요구하나 크론 환경에 미주입 →
`new=None` vs `old=non-None` → 무조건 "데이터 변경" 로그 생성.
정작 문서 갱신 루프는 `if section not in new_state: continue`로 건너뛴다.
**로그만 찍히고 문서는 그대로.** 데이터 손실 0 = Critical 7 아님.

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

**전문 diff = 10줄, `task_stats` 단독:**

| 항목 | before | after |
|---|---|---|
| 총 작업 수 | 2284 | 2286 |
| 완료된 작업 | 2219 | 2221 |
| 평균 소요시간 | 1시간 10분 17초 | 1시간 10분 14초 |

증가분 +2 중 1건은 **본 task 자신**의 타이머 start(자기참조 — 외부 활동량으로 읽지 말 것).

**`AUTO:cron` 블록 보존 확인:**
- 마커 구간(601~658행) md5 before = after = `af7090faa1da20f713b9f6e31ae7eb8c`
- 블록 diff **0줄 (byte-identical)** — 11회 연속 보존
- `created_at` 6건 전부 `2026-04-16 11:16:10` 동결 유지

### ★ 이번 회차에서 잡은 검증 도구 자체의 결함
1차 md5 대조에서 before `ac055cca…` ≠ after `6ecf7942…` 로 나와
보존 스트릭이 깨진 것처럼 보였다. 원인은 스펙이 아니라 **검증 명령의 range 결함**이다.
`awk '/AUTO:cron/,/END:cron|AUTO:services/'` 를 썼는데
`AUTO:services:START`(539행)가 `AUTO:cron:START`(601행)보다 **앞에** 있어
종료 패턴이 이후 구간에 존재하지 않는다 → range가 **EOF까지 폭주**(634행)해
1164행의 `task_stats`를 삼켰다. 즉 md5 변화는 스펙 변경이 아니라 자기 도구의 오염.
→ **교훈: 구간 md5는 반드시 `sed -n '/START/,/END/p'` 로 양끝 마커를 명시할 것.**
   종료 마커가 시작 마커보다 앞에 있으면 awk range는 조용히 EOF까지 간다.

## 3. services — 변경 없음

`services`는 변경 감지 목록에 **없었다**. 스펙 17 = 실측 17,
`systemctl --user list-units --state=running --type=service` 와 **집합 diff 0줄**.

- 플래핑 3종(`at-spi-dbus-bus`·`dbus`·`gpg-agent`) **7회 연속 present** —
  그래도 승격하지 않는다. 승격 조건은 회차 수가 아니라 *세션 재시작을 관통한 생존*이다.

## 4. 지속 추적: `cloudflared-whisper.service` 정지 (t3038 최초 포착)

| 항목 | 값 |
|---|---|
| ActiveState / SubState | `inactive` / `dead` |
| ExecMainStatus | `0` (정상 종료) |
| ExecMainExitTimestamp | 2026-08-27 14:35:05 KST |
| 무복구 경과 | **약 15시간 40분** (t3041 시점 9시간 40분 → 계속 증가) |
| Restart | `on-failure` → exit 0 에 **구조적 미발동** |

**왕복하지 않고 머무는 델타**임이 3회차 연속 확증됐다. 자동 복구는 일어날 수 없다.
실피해는 여전히 **0건**: canonical 소비자 `scripts/youtube-transcribe.py:32` 는
`http://localhost:8200/v1/transcribe` 직접 호출이라 튜널과 무관하고,
`whisper-gpu.service` 는 `active`(HTTP **405** = 메서드 불일치 응답, 생존).
※ 405/404 는 프로브 메서드 차이일 뿐 — 생존 판정을 상태코드 절대값으로 하지 말 것.

## 5. 백업 격자 (08-24_18 ~ 08-28_06, 14슬롯)

13개 존재. 결번은 **`08-26_12` 모드B(레코드 자체 부재) 1건 그대로**, **신규 결번 0**.
당일 슬롯 `08-28_00`·`08-28_06` 정상. 연속 ok 회차를 세어 "고장 아님"으로 승격하지 않는다(t3036 정정 유지).

## 6. 회장님 판단 대기 (신규 아님, 계류)

1. **`cron` 거짓 양성 근본 해소** — (1) 크론에 ANU 소유 `ANU_CHAT`/`ANU_KEY` 주입,
   또는 (2) `detect_changes()`가 수집 실패 섹션을 변경으로 계산하지 않도록 수정.
   ※ dev8 등 팀 봇 키로 대체 수집은 **금지**(`--cron-list`는 key 소유자 스코프라 문서 퇴행).
2. **`collect_services()` returncode 미검사** — 세션버스 실패 시 `services` 블록
   21줄→2줄 소실 가능(재현 완료, 실발생 0회). 위임 대상 계류 중.
3. **`cloudflared-whisper` 처방 전 선행질문** — 이 quick tunnel 의 외부 소비자가 실재하는가?
   (repo 내 `trycloudflare` 실참조 0건, 주석뿐 → 긴급도 낮음)

## 결론

정기 실행 **정상 완료**. 문서·changelog 갱신됨, 데이터 손실 없음.
exit 1 은 기지의 단일 섹션 거짓 양성이며 **알림 대상 아님**.
