2026.06.22 작업일지 v1.0.0
00:45, retry 코드는 고쳤지만 같은 종류의 race가 한 번 더 드러났다. 21:53, 노트북 Claude 브릿지가 텔레그램 한 통을 받아 한 번만 답했다. 23:22, Codex reasoning mirror가 5노드와 GitHub release까지 올라갔다.
6월 22일은 브릿지의 하루였다. 전날 설계한 Claude Telegram Bridge는 코드리뷰에서 막혔고, 새벽에는 그 블로커를 끝까지 닫았다. 밤에는 실제 노트북 카나리로 MCP 없이 텔레그램 왕복을 확인했고, 별도로 Codex 쪽은 reasoning mirror 기능을 배포했다.
1. 한 번 보내야 하는 봇이 두 번 보낼 수 있었다
Claude Telegram Bridge PR #163은 처음부터 바로 머지되지 않았다. send 실패 뒤 active turn이 wedge 되는 문제, pretool-block fail-open, drain queue double injection, PID 재사용, 과도한 deny, update 중복 재주입이 모두 블로커로 잡혔다. 라이덴 Codex가 701a308에서 6개 필수와 4개 권장 블로커를 고쳤고, 테스트는 25개까지 통과했다.
그런데 재리뷰에서 같은 계열의 새 결함이 하나 더 나왔다. retry_pending_send()를 jsonl thread와 telegram thread가 동시에 호출하면, eligibility check와 timestamp 갱신 사이에서 둘 다 send 권리를 얻을 수 있었다. 175ec97은 이 권리를 lock 안에서 원자적으로 claim하게 바꿨고, 동시성 테스트로 send가 정확히 1회만 일어나는지 박았다.
배운 것 — “보냈는가” dedup만으로는 부족하다. 보내기 직전의 권리도 하나의 상태로 claim해야 한다.
2. 머지는 끝이 아니라 enable 전 단계였다
00:54, PR #163은 squash merge됐다. merge commit은 72ec8bd였다. 하지만 daemon은 켜지지 않았다. 이 브릿지는 Claude 라이브 세션에 paste를 넣고, transcript를 tail해서 텔레그램으로 답을 보내는 프로그램이다. 코드가 main에 들어왔다는 것과 실제 봇 토큰을 잡는 것은 다른 일이다.
그래서 원칙은 분리됐다. 코드 머지까지가 Phase 2, 실제 enable은 별도 GO를 받은 Phase 3다. 처음에는 6월 27일 토요일 카나리로 미뤘지만, 밤에 아니키가 “브릿지 카나리 켜줘”라고 명시했고, blast radius가 작은 노트북 노드에서 먼저 열었다.
3. 노트북 카나리는 MCP를 끄고 통과했다
노트북에서는 기존 claude-chatbot.service를 멈추고, telegram plugin poller를 제거하고, plain Claude 세션 위에 새 브릿지를 붙였다. 21:53, 아니키 폰에서 보낸 한 통이 received -> enqueued -> injected -> user_jsonl_seen -> SEND를 거쳐 최종 답장 한 통으로 돌아왔다. outbox에는 단일 엔트리만 남았고, 409 conflict도 없었다.
이후 systemd user service, tmux supervisor, watchdog timer까지 서비스화했다. 다만 새 결함도 같이 보였다. 기존 telegram-stop-ping.sh 터미널 미러가 브릿지 final send와 동시에 답해 double-send가 날 수 있었다. 이건 다음 날 stop-ping sidecar ownership guard로 이어질 숙제가 됐다.
4. Codex reasoning mirror도 실제 기능이 됐다
밤에는 Codex Telegram Bridge 쪽도 움직였다. PR #164는 Codex의 마지막 reasoning block을 텔레그램에 미러링하는 로직을 넣었고, PR #165는 이 기능을 켜고 끄는 toggle로 정리했다. 23:22에는 1dc75d1 기준으로 mac, macmini, wsl, desktop3060ti, notebook3060 5노드 배포가 끝났고, codex-bridge-reasoning-mirror-2026-06-22 GitHub release도 생성됐다.
이 기능은 “raw reasoning 전체 공개”가 아니라, 한 턴당 마지막 공개 가능한 요약 블록만 보여주는 방향이었다. 실제로는 다음 날 summary_len=0과 encrypted reasoning의 한계가 드러나지만, 22일의 성과는 브릿지 경로와 toggle이 배포됐다는 점이었다.
5. 공개 기록도 같이 정리했다
daejong-page에는 뉴스레터 정렬 버그 수정과 Ep.9 결번 안내, 새 인사이트 두 편, 정책 페이지 갱신이 들어갔다. choso 쪽에서는 Codex rate limit을 sqlite에서 읽는 보드 수정과 휴가 노드 표시가 반영됐다. 메모요 UI tweak도 main으로 올라가 1.0.9 배포 코드와 정합됐다.
그래서 6월 22일은 한 줄로 정리된다. 브릿지는 만들었고, 리뷰로 한 번 더 부쉈고, 카나리로 다시 증명했다. 그리고 Codex 쪽에는 “생각을 어떻게 보여줄 것인가”라는 다음 문제가 올라왔다.
다음 이야기는 브릿지 카나리가 실제 노드 확장과 운영 헌법 재설계로 번지는 이야기.
— 강대종 / @ssamssae