확인 끝났습니다. 아래는 추측이 아니라 daemon.js·run.bat 코드와 실제 프로세스 상태로 검증한 사실입니다.
결론 먼저: 중복 daemon 정리함
Jason이 수동으로 살리는 과정에서 daemon이 2개 겹쳐 돌고 있었습니다(double-poll = 같은 태스크 2번 실행 위험). 오래된 쪽이 idle인 걸 확인하고 방금 정리했습니다. 지금은 단일 인스턴스 정상입니다.
| 항목 | 정리 전 | 정리 후 |
|---|---|---|
| node daemon | 17852(11:05, idle) + 36256(12:56, 활성) | 36256 하나 |
| supervisor(run.bat) | 17560 + 19500 | 19500 하나 |
| 싱글톤 락 | 36256 소유(17852는 락 없이 폴링) | 36256 소유, 깨끗 |
제거한 건 11:05 쌍(supervisor 17560 → node 17852). 자식 claude 프로세스가 없어 in-flight 태스크 0건이라 무손실 정리. 롤백: 문제 시 daemon\run.bat 더블클릭 한 번으로 원복.
1. 왜 '재시작' 버튼이 죽은 daemon을 못 살리나
버튼이 두 가지 이유로 죽은 daemon에 무력합니다:
- 버튼은 재시작이 아니라 "graceful 종료"만 합니다.
/settings/bridge/restart-graceful은 bridge에 커맨드를 큐잉할 뿐, 실제 동작은 살아있는 daemon이 폴링으로 그 커맨드를 받아서.shutdown플래그 파일을 쓰는 것입니다(daemon.js 1572~1590). daemon은 in-flight 태스크를 다 비운 뒤process.exit(0)으로 스스로 종료합니다. - 재기동은 전적으로 supervisor(run.bat 루프)가 합니다. run.bat은
:loop … node daemon.js … goto loop구조라, node가 exit하면 3초 뒤 다시 띄웁니다. 즉 버튼은 "node를 깨끗이 죽이는" 역할이고, 다시 살리는 건 supervisor입니다.
→ 그래서 supervisor까지 죽으면 버튼은 회생 불가가 맞습니다. 이중으로 불가능합니다: ① 죽은 node는 커맨드를 받을 폴링 루프가 없고, ② 설령 받아 exit해도 재기동할 supervisor가 없습니다. 이번 컷오버에서 supervisor(cmd 29524)를 죽인 게 정확히 이 상황을 만들었습니다.
2. supervisor까지 죽었을 때 회생 방법
C:\Users\user\LAX-site\daemon\run.bat 를 실행하면 됩니다.
- 탐색기에서
C:\Users\user\LAX-site\daemon\run.bat더블클릭 (가장 단순·확실).- 정상 부팅 진입점은
start-hidden.vbs(창 숨김으로 run.bat 실행)지만, 회생 목적이면 run.bat 직접 실행으로 충분합니다.
- 정상 부팅 진입점은
- run.bat이
node daemon.js를 띄우고, 부팅 시 stale 락(.daemon.lock)과 stale.shutdown플래그를 자동 정리(daemon.js 1849~1855)하므로 죽은 PID가 남긴 찌꺼기 락은 알아서 풀립니다. - 중복 실행 걱정은 안 해도 됩니다 — 싱글톤 락이 살아있는 owner를 감지하면 새 인스턴스가 스스로 exit(0)합니다.
3. 앞으로 daemon 안 죽이는 안전한 방법
컷오버 같은 코드 반영 시엔 supervisor를 절대 죽이지 말고, '재시작' 버튼(restart-graceful)만 쓰세요. 그게 바로 "supervisor는 살려둔 채 node만 graceful restart" 경로입니다:
- 버튼 → daemon이
.shutdown작성 → 진행 중 태스크 드레인 후 node만 exit → supervisor가 3초 뒤 새 코드로 자동 재기동. 셀프 회생됩니다. - 슬러그 폴더 rename 같은 파일시스템 변경도, supervisor를 건드리지 않는 한 버튼 한 번으로 새 코드/새 폴더 구조를 그대로 물고 올라옵니다.
이번에 문제가 된 건 node .shutdown 수동 조작 + supervisor 강제 종료를 같이 한 것입니다. supervisor를 죽이는 순간 셀프 회생 안전망이 사라집니다 — 앞으로 컷오버 절차에서 supervisor 종료는 빼겠습니다.
4. 현재 상태
정상 동작 중입니다. Jason이 살린 node 36256이 활성 태스크(자식 claude.exe 35908)를 돌리고 있고, 락도 정상 소유, .shutdown 플래그 없음(운영 모드). 이 답변도 그 daemon이 돌리는 중입니다.
슬러그 rename도 정상 반영됨: agent-skills\agent-1 ~ agent-4 폴더와 각 .claude\skills 구조 모두 확인. agent-N 체계로 잘 붙었습니다.
남은 권고 한 가지: 이번처럼 supervisor가 2개로 늘어나는 일을 원천 차단하려면, run.bat 진입 시 기존 supervisor 중복 여부를 체크하는 가드를 넣는 게 좋습니다. 비가역 변경이라 daemon.js 커밋 고정 후 별도로 제안드리겠습니다 — 지금 당장은 단일 인스턴스로 안정 상태입니다.