# cokacdir 자동 업데이트는 봇 스케줄이 아니라 systemd user timer로 (봇 self-kill 금지)

## 사고 (2026-08-10)
매일 새벽 4시 dev8 봇 스케줄 `FDF2EE9A`("cokacdir 안전한 업데이트 절차 수행")가 봇(claude-p)에게 `cokacctl update`를 **직접 실행**시켜, 봇이 자기 통신 서버(`cokacdir.service` = ccserver)를 stop → **self-kill** → 텔레그램-클로드코드 통신 두절 + 바이너리 교체 중단(업데이트 미완). "업데이트를 스스로 가져가는 날(버전 차이로 실제 교체하는 날)"에만 발생.

## 근본 원인
봇 세션이 자기 통신 서버와 **같은 프로세스트리/cgroup**에 있어, update가 서비스를 stop하면 봇도 동반 종료. `Restart=always`는 `systemctl stop`(의도적 정지)엔 자동복구 안 됨.

## 해결 (Codex 조율 확정 · 실증 완료)
**봇을 완전히 배제하고 OS systemd user timer가 직접 업데이트** = self-kill 원천 차단.
- `~/.config/systemd/user/cokacdir-update.service` (`Type=oneshot`, `ExecStart=/usr/local/bin/cokacctl update`)
- `~/.config/systemd/user/cokacdir-update.timer` (`OnCalendar=*-*-* 04:00:00`, `Persistent=true`) — enabled·active
- 결과보고 스케줄 `D15CFD95` (매일 04:10 KST, **읽기전용**: `systemctl --user show ... -p Result` + journalctl, 버전변경/실패 시에만 회장 보고)
- 봇 스케줄 `FDF2EE9A` **제거**(dev8)

**왜 안전한가**: `cokacdir-update.service`와 `cokacdir.service`는 서로 다른 unit = **다른 cgroup**. update가 통신 서버를 stop해도 update 프로세스는 안 죽고 교체→재시작 완주. 봇 무개입.

## 선결조건(이미 충족)
- **sudo**: 회장님이 2026-08-05 등록한 NOPASSWD — `/usr/bin/mv * /usr/local/bin/cokacdir`, `chmod +x`, `rm -f` → 바이너리 교체 비번 없이 통과. (일반 `sudo -n true`는 실패해도 이 3명령만 열림)
- `cokacctl update` = **비대화형 CLI**(TUI 아님). 봇이 `cokacctl` 단독=TUI를 띄워 hang됐던 게 과거 실수.
- `cokacdir.service`: user unit, linger 활성(`/var/lib/systemd/linger/jay`).

## ★ 재발 방지 규칙
1. **cokacdir/cokacctl 업데이트를 봇 cron 스케줄로 걸지 말 것.** 반드시 systemd user timer.
2. 봇/아누가 세션 안에서 `cokacctl update`를 **foreground 직접 실행 금지**(self-kill). 필요 시 systemd timer 수동 트리거(`systemctl --user start cokacdir-update.service`)로.
3. 결과 확인은 완료 이벤트 기반(`systemctl --user show -p Result`), 로그 읽기 전용.
