← 작업일지

2026-07-12 · v1.0.1

2026.07.12 작업일지 v1.0.1

00:35, “이제 자려는데 오토로 돌리는 거 가능할까?”라는 말과 함께 밤샘 자동 운영이 시작됐다. 12:35, 워커 노드 하나가 “타스크 없다”며 일을 거부했다. 23:30, 공개 저장소에 계정 정보가 실려 나갈 뻔한 사고가 코드 게이트로 막혔다.

이 날은 자동화 시스템이 스스로의 한계를 세 번 드러낸 날이었다. 워커가 일을 거부했고, 로그인 자동화가 계정 정보를 공개 저장소로 밀어 넣을 뻔했고, 네트워크 한 번 끊긴 걸로 배차 하나가 4시간을 통째로 날렸다. 셋 다 “사람이 조심하자”가 아니라 코드로 막았다.

1. 워커가 일을 거부했다

낮에 워커 노드 하나에 일을 시켰더니 이런 답이 돌아왔다.

“라이덴한테 일 시키니까 타스크 없다고 거부하네? 적극적으로 타스크를 해결할 생각을 하도록 세팅 가능해?”

규정을 따르면 워커는 정식으로 등재된 일감 없이는 움직이면 안 된다. 그래서 “일감 없음 → 거부”는 사실 규정대로 동작한 것이다. 문제는 거기서 멈춰 섰다는 점이다. 마치 창고에 재고가 없다고 손님을 돌려보내고 본사에 발주는 안 넣는 직원 같은 상태였다.

고침은 거부를 없애는 게 아니라 거부 다음 행동을 계약에 박는 것이었다. “일감이 없으면 지휘부에 일감 발급을 요청하라”는 조항을 워커 계약서에 추가하고 5노드에 배포했다. 거부는 그대로 두되, 거부가 막다른 길이 되지 않게 했다.

배운 것 — 규정을 지키다 멈춰 선 자동화는 고장 난 자동화와 겉모습이 같다. 규정에는 “그 다음에 뭘 할지”까지 있어야 한다.

2. 계정 정보가 공개 저장소로 갈 뻔했다

저녁에 더 아찔한 게 나왔다. 웹 로그인 자동화를 정리해 올린 변경분에 계정 정보가 그대로 실려 있었다. 공개 저장소로 나가는 경로였다.

다행히 게이트에서 잡혔고, 해당 변경분은 민감 정보를 걷어내고 새로 썼다. 그리고 여기서 멈추지 않았다: 앞으로 공개 저장소로 향하는 모든 변경분에 대해 이메일·계정·개인정보 패턴을 자동으로 스캔해 걸러내는 검사를 병합 관문에 코드로 심었다(#716). 사람이 매번 눈으로 확인하는 방식은 언젠가 반드시 뚫린다.

3. 끊긴 SSH 하나가 4시간을 삼켰다

낮에 다른 노드로 작업을 넘겼는데, 응답이 오지 않았다. 원격 연결이 중간에 조용히 끊겼는데 명령을 보낸 쪽이 무한정 기다리고 있던 것이다. 그 사이 약 4시간 동안 다음 작업이 전부 막혔다.

ServerAliveInterval + ConnectTimeout 부재
→ 원격 세션이 죽어도 로컬은 '응답 대기 중'으로 영원히 착각

수리는 간단했다. 연결에 심장박동 신호(keepalive)와 유한한 제한 시간을 붙였다(#710). 이제 상대가 죽으면 몇 분 안에 실패로 떨어지고, 그 실패가 보고된다.

배운 것 — 자동화에서 가장 위험한 상태는 실패가 아니라 영원한 대기다. 실패는 보이지만 대기는 안 보인다.

4. 그 밖에 굴러간 것들

영역결과
5노드 버전 통일Claude Code 2.1.207 전 노드 라이브 확인
텔레그램 브릿지모델 전환 명령이 안 먹던 결함 수리(#687/#689), 패키지 v0.8.0·v0.8.1 릴리스
공개 홈페이지소개 페이지 전면 리뉴얼(#310), 인사이트 글 발행, 뉴스레터 4개 초안
첫이름 사이트·아이콘 리뉴얼, 작명 엔진 1차 구현, 광고 스택 작업 착수
규칙절대경로 사용 + 파일 조회는 전용 도구로 — 두 룰을 운영 헌법에 못 박음

밤에는 채팅 화면에 작업 흐름을 실시간 카드로 보여주는 미러도 손봤다(#714/#715).

5. 그래서 뭐가 남았나

하루 동안 병합된 변경분 40여 건, 그중 절반은 이 날 터진 사고의 재발방지 코드다. 밤 12시 반에 시작된 자동 운영이 자정 넘어까지 굴러갔고, 그 과정에서 시스템이 자기 약점을 셋이나 스스로 드러냈다 — 그게 가장 큰 수확이다.


다음 이야기는 앱 두 개가 처음으로 스토어에 나가는 월요일 이야기.

— 강대종 / @ssamssae