2026.07.05 작업일지 v1.0.0
00:33, 코덱스 브릿지의 중복 final 뒤 유령 typing 회복을 막았다. 15:33, 실패하던 사진 다운로드가 재시도와 청크 스트리밍을 거쳐 실제 이미지로 돌아왔다. 17:36, 다섯 노드의 자동업데이터 차단 상태를 다시 세며 “적용했다”와 “실제로 물려 있다”의 차이를 확인했다.
7월 5일은 브릿지의 날이었다. 전날까지는 “메시지가 오느냐”가 문제였다면, 이날은 더 까다로운 층으로 내려갔다. 끝난 대화가 계속 입력중으로 보이는 문제, 사진 파일서버가 느릴 때 한 번에 실패하는 문제, 봇이 자기 노드의 토큰 대신 다른 길로 빠지는 문제. 눈에 띄는 기능을 만든 날이라기보다, 이미 쓰고 있는 통로가 조용히 거짓말하지 않게 만든 날이었다.
1. 유령 입력중을 끊다
새벽엔 typing 표시부터 잡았다. 코덱스 쪽은 중복 final 이후 오래된 typing 회복 로직이 다시 살아나는 경로가 있었고, 클로드 쪽은 stop 신호를 놓친 스레드가 최대 두 시간까지 살아남는 구조였다. 둘 다 사용자는 같은 증상으로 본다. 대화는 끝났는데 텔레그램엔 아직 “입력중”이라고 뜬다.
수리는 단순히 시간을 줄이는 쪽이 아니었다. 지금도 실제 작업이 진행 중인지, 상태 파일과 transcript가 살아 있는지 확인하는 self-liveness 게이트를 붙였다. 표시가 UX라서 가볍게 볼 수 있지만, 자동화 시스템에서는 작은 표시 하나가 “아직 일하고 있나?”라는 운영 판단을 흐린다.
2. 사진은 다시 보내라고 말하기 전에 다시 받아야 한다
오후에는 미디어 다운로드 실패를 고쳤다. 텔레그램 파일서버가 느려지는 순간, 브릿지는 60초 단발 요청과 통짜 read로 버텼다. 실패하면 사용자에게도 친절하지 않았다. 양쪽 브릿지에 재시도, 백오프, 청크 스트리밍을 넣고 마지막 실패 메시지에는 다시 보내 달라는 안내까지 넣었다.
머지 뒤에는 실제 사진으로 검증했다. 테스트가 통과해도, 사용자가 보낸 이미지가 다시 온전하게 렌더되는지는 별개의 사실이다. 이날은 10개 브릿지 배포 뒤 실이미지 다운로드 성공까지 보고 닫았다.
배운 것 — 네트워크 실패는 예외가 아니라 정상 입력이다. 특히 사람이 다시 보내야 하는 흐름에서는, 프로그램이 먼저 두세 번 더 버텨 보고 나서 사람에게 요청해야 한다.
3. 봇은 자기 이름으로 말해야 한다
저녁 전에는 노드 대화와 카드 렌더링을 손봤다. 코덱스 node_dm 발신이 canonical 토큰을 쓰도록 고치고, 다른 노드 봇으로 폴백하는 길을 막았다. 동시에 카드 안에 REPL 장식이 새어 나오던 문제, 긴 명령이 100자에서 딱 잘려 어색하게 보이던 문제도 정리됐다.
작은 UX처럼 보이지만, 메시지 표면은 운영자에게는 계기판이다. 어느 노드가 말했는지, 무엇이 잘렸는지, 복사하면 그대로 읽을 수 있는지가 맞아야 다음 판단이 흔들리지 않는다.
4. 스킬책을 끝까지 넘기다
이날 가장 큰 덩어리는 스킬감사였다. submit-app에서 시작해 worklog, goodnight, issue, tuya, device-run, codex-fire, mesh-vote, design-skill까지 이어졌다. 결과만 보면 41개 스킬 디렉터리를 끝까지 훑고, 새 수리 태스크 30여 건을 뽑았다.
특히 submit-app 감사가 아팠다. 심사 제출 가드가 문서상으로는 안전해 보였지만, dry-run 테스트는 json import 누락 하나로 처음부터 죽고 있었다. IOS/ANDROID 보조 문서에는 예전 “제출 자동화 default” 문구가 남아 현행 aniki-GO 게이트와 충돌했다. 말로 안전하다고 쓰는 것과 코드가 실제로 멈추는 것은 다르다.
5. 적용된 줄 알았던 환경변수
마지막 큰 확인은 DISABLE_AUTOUPDATER=1이었다. 서비스 템플릿에는 들어갔지만, 오래 살아 있던 tmux 서버와 REPL에는 아직 안 물린 노드가 있었다. 결국 다섯 노드를 다시 실측했고, set-environment와 respawn으로 실행 중 세션까지 맞췄다.
이건 7월 5일의 핵심 교훈과도 같다. 파일을 고쳤다는 말은 약하다. 서비스가 다시 읽었는지, 프로세스 환경에 들어갔는지, 다음 세션 생성에도 유지되는지까지 봐야 적용이다.
6. 그래서 뭐가 남았나
남은 건 두 갈래였다. 하나는 브릿지 심장부를 고친 뒤 실제 런타임 재시작과 배포 창을 더 정교하게 관리하는 일. 다른 하나는 스킬감사에서 나온 부채를 수리 PR로 하나씩 줄이는 일이다. 이날은 새로운 제품 화면을 만든 날은 아니었지만, 자동화 시스템이 스스로를 설명하고, 실패를 견디고, 잘못된 자신감으로 넘어가지 않게 만든 날이었다.
다음 이야기는 낮에도 도는 픽업 레일, 로컬 스마트홈 상태 로거, 그리고 공개 홈페이지 세 곳의 헤더가 한 픽셀도 흔들리지 않게 된 이야기.
— 강대종 / @ssamssae