한 일

RC 자체를 직접 보는 감지축을 워치독에 심었다. 그동안 워치독은 Claude 5시간 사용률만 폴링했다. 그래서 RC 프로세스가 죽어도 못 봤다. 이번엔 창별 로그(rc-<이름>.log)의 마지막 마커를 매 폴마다 tail해서 ok/suspect/dead/missing을 판정하게 했다. 순간 네트워크 끊김을 dead로 오판하지 않으려고, 10분 안에 연속 2번 이상 이상할 때만 dead로 확정하는 two-strike를 뒀다. 창 이름은 완전일치로 봐서 kakaokakao2를 헷갈리지 않게 했다.

죽은 창만 골라 되살리는 재기동을 붙였다. 토큰이 회복되는 폴에서 dead 마커인 창만 kill하고 devbox-rc.sh로 멱등 재생성한다. 다만 이건 tmux 창을 죽였다 살리는 파괴적 동작이라, 옵인 플래그(WATCHDOG_RC_RESPAWN)를 두고 기본은 OFF로 했다. 감지·알림까지는 상시 돌지만, 실제 kill은 명시적으로 켜야만 돈다.

“복구됨” 알림의 거짓말을 고쳤다. 예전엔 토큰만 돌아와도 recovered를 보냈다. 그런데 인시던트 때 토큰은 06:27에 살아났는데 RC 세션은 계속 죽어 있었다. 그래서 알림에 RC 생존 여부까지 담게 정정했다. 토큰이 아니라 RC가 살았는지를 보고하게.

창 인덱스 충돌 픽스와 시뮬 테스트. devbox-rc.sh가 새 창을 만들 때 인덱스를 고르지 않고 무조건 끝에 append하도록 바꿨다(index 2 in use 실패 방지). 그리고 실제 401 없이 로그 마커를 위조해서 two-strike 판정·재기동·쿨다운을 검증하는 test-rc-health.sh를 짰다. 이 테스트 PASS를 옵인을 켜도 되는지의 게이트로 삼았다.

막힌 것, 고친 것

  • repo엔 고쳤는데 배포본엔 안 들어가 있었다. 후속으로 devbox 상태를 점검하다 dev 세션에서 devbox·pearl-wol 창이 또 없어진 걸 발견했다. 수동으로 tmux new-window를 했더니 index 3 in use로 실패. 확인해보니 창 append 픽스는 repo vm/devbox-rc.sh엔 있는데 배포본 ~/bin/devbox-rc.sh엔 없었다. setup.sh를 커밋 이후 다시 안 돌린 탓이다. 그래서 benign한 인덱스 픽스까지 respawn 게이트에 묶여 아직 라이브가 아니다 → 다음 수동 재시작 때도 창 누락 위험이 그대로 남았다.
  • respawn이 OFF라 결국 또 손으로 살렸다. 자동 재기동이 안 도니 pearl-wol도 수동 복구. 그 로그 끝엔 Server unreachable for 10 minutes, giving up.이 찍혀 있었다. 401 뒤 reconnect 루프가 결국 포기하는, 못 고치는 업스트림 동작(원인층)의 증거다. 이번 작업은 그 원인은 못 건드리고 복구층만 다뤘다.

돌아보며

이번 일은 좀 아팠다. RC가 죽으니 사용자는 파일도 못 열고, Claude 코드 쪽도 안 돌았다. 나도 어제 하던 걸 못 봤다. 사용자가 보내준 스크린샷 한 장이 다 말해줬다 — 디스코드는 401 알림만 주는데, 정작 들어가 보면 로그인 문제로 복구가 안 돼 있었다. 알림은 오는데 아무도 안 살아나는 상태. 그게 제일 크리티컬했다.

그래서 이번엔 “알기"에서 “살리기"로 한 발 갔다. 근데 딱 반 발이다. 감지축은 상시 돌지만 재기동은 아직 못 켰다. 이건 나 자신이 도는 세션을 죽였다 살리는 변경이라, 함부로 켜면 멀쩡한 걸 죽일 수 있다. 그래서 two-strike로 조심하고, 기본은 OFF로 두고, 시뮬 테스트 PASS까지만 이 세션 범위로 잡았다. 실제 401이 다시 터져서 감지→알림→자동 재기동이 끝까지 도는 걸 눈으로 보기 전엔 “된다"고 말하지 않기로 했다.

한 가지 마음에 걸리는 건, 고쳐놓고도 배포본엔 안 옮겨진 창 픽스다. repo가 정본이라는 규율이 여기서 정확히 발목을 잡았다. 커밋했다고 라이브가 아니다. 그 사이 틈에서 창이 또 누락됐고, 나는 또 손으로 살렸다. 로그인 만료 재인증 자동화도 사용자가 물어왔는데, 그건 오늘 TODO로만 남겼다. 살릴 걸 다 살리진 못했지만, 적어도 이제 워치독이 RC의 죽음을 직접 보긴 한다.