---
task_id: sched-update-system-spec-260813-0015
scope: task
type: scheduled_maintenance
bot: dev8
member: 라(Ra)
executed_at: 2026-08-13 00:15
result: success
escalated: false
---

# update-system-spec.py 정기 스케줄 실행 보고 (2026-08-13 00:15)

## 1. 실행 개요

| 항목 | 값 |
|------|-----|
| 스케줄 ID | `8C2B2814` (`15 */6 * * *`) |
| 스크립트 | `/home/jay/workspace/scripts/update-system-spec.py` |
| 대상 문서 | `memory/specs/anu-system-spec.md` |
| 1차 실행 (env 미지정) | exit **1** — cron 섹션 FAIL, 5/6 섹션 OK |
| 2차 실행 (env 지정) | exit **0** — 6/6 섹션 OK, "변경 없음" |
| 최종 판정 | 성공 (스펙+changelog 갱신 완료) |

## 2. 1차 실행 결과 (스케줄 기본 환경)

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

- **cron 섹션 FAIL은 알려진 비파괴 이슈** — 스케줄 실행 환경에 `ANU_CHAT`/`ANU_KEY` env가 주입되지 않음 (`update-system-spec.py:29`, fallback 없음).
- `detect_changes`가 stale 캐시 ≠ None으로 오판해 `[cron] 데이터 변경` **허위 항목**을 남김. 실제 spec 본문 cron 섹션은 `if section not in new_state: continue`로 스킵되어 **무손상**.
- 실제 상태변화는 `task_stats` 1건.

## 3. 2차 실행 (dev8 key로 env 런타임 우회, 코드 무수정)

```
ANU_CHAT=6937032012 ANU_KEY=$(cat ~/.cokacdir/bot_keys/ab0845ef….key) \
  python3 scripts/update-system-spec.py
```

```
  [OK] skills / cron / services / projects / scripts / task_stats
[update-system-spec] 변경 없음 - 파일 업데이트 생략.
exit 0
```

→ 6섹션 전부 OK. **"변경 없음"** = spec의 cron 섹션이 라이브 데이터와 이미 일치(문서 최신 상태).

## 4. 교차검증 — spec cron 블록 vs 라이브 `--cron-list`

라이브 스케줄 6건과 spec `AUTO:cron` 블록 6건이 id/schedule 완전 일치:

| 스케줄 ID | schedule | 작업 |
|---|---|---|
| `EE825F5E` | `0 */6 * * *` | backup-spec.sh |
| `050ECF5D` | `0 9 * * 1` | weekly-retro.py |
| `8C2B2814` | `15 */6 * * *` | update-system-spec.py (본 스케줄) |
| `8F9C55BC` | `0 9 * * *` | canary-test.py |
| `0BCB9FBD` | `30 */6 * * *` | cleanup-large-audio.sh |
| `1063C2BC` | `0 8 * * 1` | weekly-report.py |

## 5. changelog 기록

`memory/specs/anu-system-spec-changelog.md` head:

```
## [2026-08-13 00:15] 변경 내역
- [cron] `cron` 데이터 변경        ← 허위(알려진 패턴)
- [task_stats] `task_stats` 데이터 변경   ← 실제
```

## 6. 실제 문서 변경 내용 (task_stats)

| 항목 | 이전(커밋본) | 현재 |
|------|------|------|
| 총 작업 수 | 1867 | **2175** |
| 완료된 작업 | 1842 | **2119** |
| 완료율 | 98.7% | **97.4%** |
| 평균 소요시간 | 43분 37초 | **1시간 9분 13초** |
| 최대 소요시간 | 100시간 49분 39초 | **512시간 25분 20초** |

※ 위 diff는 마지막 git 커밋 대비 누적치(services 13개·projects 9개·scripts 168개 변동 포함)이며, 본 실행분 changelog 델타는 `cron`(허위) + `task_stats`(실제) 2건.

## 7. Triage 판정

- **Critical 7 아님 · 신규 결함 아님 · 회장 알림 불필요.**
- 근거: `feedback-update-system-spec-cron-env-gap-260519` / `project-update-system-spec-cron-anu-chat-unset-260601`의 Triage 규칙("이 스케줄의 exit 1 보고는 재조사하지 말 것").
- 데이터 손실 없음. 스펙 본문 무손상.

## 8. 미해결 (회장 승인 대기)

근본 수정안 — `ANU_CHAT`/`ANU_KEY` fallback 추가:

```python
ANU_CHAT = os.environ.get("ANU_CHAT") or os.environ.get("COKACDIR_CHAT_ID") or "6937032012"
```

또는 `collect_cron()`을 raise 대신 warn+skip으로 graceful degrade.
→ 직접 코딩 금지 원칙에 따라 **팀 위임 필요**, 사전 **회장 승인 필수**. 승인 전까지 매 실행 런타임 우회로 대응.
