2026.06.30 작업일지 v1.0.0
15:21, ack-pending을 직접 풀지 않고 먼저 읽기 전용 broker로 드러내기 시작했다. 19:35, 수동 게이트라고 적은 PR이 등호 하나 때문에 자동머지됐다. 23:25, 좁은 pane의
1 shell still running한 줄이 브릿지를 다시 멈추게 했고 hotfix로 풀었다.
6월 30일은 “자동화가 일을 한다”보다 “자동화가 멈출 때 어디서 멈추는지 보이게 한다”에 가까운 날이었다. YouTube 홍보영상은 무음 없는 Piper 버전과 자막 번인 버전으로 다시 만들어졌고, 텔레그램 브릿지는 노드가 받은 지시를 카드로 보여주기 시작했다. 동시에 auto-ack, auto-merge, narrow terminal, bridge stuck 같은 경계조건이 연달아 터졌다.
1. 영상은 목소리만으로 충분하지 않았다
오전의 큰 작업은 YouTube 홍보영상 4개 재제작이었다. 기존 Piper 교체본은 줄 사이에 긴 무음이 반복되는 문제가 있었다. T-260630-11에서 네 개 영상은 무공백 v2로 다시 렌더됐고, QA는 내부 무음 1.5초 초과 0개와 음성 커버리지 95% 이상을 확인했다.
하지만 아니키 피드백은 다음 단계로 이어졌다. Piper 발음이 뭉개져 알아듣기 어렵다는 것이다. T-260630-13은 같은 영상을 유지한 채 한국어 자막을 burn-in했고, 첫 버전에서 자막이 음성보다 먼저 넘어가는 문제까지 다시 싱크했다. 16:04에는 자막 v3 네 개가 YouTube에 공개 업로드되고, 자막 없는 v2 네 개는 비공개로 전환됐다.
배운 것 — 음성 합성이 상업적으로 안전해도, 사용자가 내용을 못 알아들으면 자막이 제품 품질의 일부가 된다.
2. 받은 지시는 한 장의 카드가 되어야 했다
오후에는 노드 브릿지가 “받은 지시”를 보여주는 방식이 정리됐다. bf762f7은 Claude 브릿지에 노드발 작업의 trigger card를 넣었고, dbfd4da는 Codex 브릿지에도 같은 개념을 붙였다. 이후 1010bb1은 보일러플레이트 헤더를 걷어내고, 발신→수신·task route만 남기는 방식으로 카드 gist를 정리했다.
처음에는 송신 미러와 수신 카드가 따로 떠서 중복될 위험이 있었다. 그래서 T-260630-48은 “노드 보고를 죽이자”가 아니라 “받은지시와 결과를 한 장으로 합치자”로 방향을 바꿨다. bridge가 내부 state를 잃으면 결과 맥락이 끊기기 때문에, 카드 수를 줄이되 fallback 보고는 남기는 쪽이 안전했다.
3. ack-pending은 승인하지 말고 먼저 드러내야 했다
ack-pending 자동화도 하루 종일 이어졌다. T-260630-20의 5-round debate 결론은 분명했다. persona ack는 사람 승인이 아니며, [?]를 자동으로 해결하지 말고 정리해서 올려주는 구조로 가야 한다. 그 결과 129aa56은 read-only auto_ack_broker.py를 넣었고, 0099dd6은 idempotent draft artifact를 만들었다.
이후 phase2와 phase3가 붙었다. b8dadf7은 저위험 자동승인 후보 산출을 구현했지만 live approval은 env gate 뒤에 묶었다. 2798dfa와 cb23094는 safe-unblock draft와 ack-request 루프를 추가했다. 실제 승인을 위장하지 않고, 닫을 수 있는 stale-done 후보와 사람에게 물을 우선순위를 표면으로 끌어올리는 쪽이었다.
4. 등호 하나가 수동 게이트를 뚫었다
19:35에는 큰 교훈이 나왔다. T-260630-34의 PR #251은 머지게이트=수동이라고 적혀 있었지만 자동머지됐다. 원인은 auto-merge workflow가 머지게이트:수동처럼 콜론만 인식하고, 등호를 gate marker로 보지 못한 것이다.
사후 검증 결과 머지된 코드는 기본 read-only이고 live approval은 별도 env gate가 있어 위험 실행은 없었다. 그래도 구멍은 즉시 막았다. 25c783b는 gate 정규식에 =와 전각 등호까지 추가했다. 이 사건은 자동화가 자연어 지시를 얼마나 좁게 해석하는지 보여줬다.
배운 것 — 안전 마커는 사람이 알아보는 문장이 아니라 CI가 모든 표기 변형을 읽는 테스트 케이스여야 한다.
5. 좁은 터미널은 상태 파서를 속였다
저녁 이후에는 터미널 폭과 브릿지 stuck가 이어졌다. 6216a8e는 tmux-repl-busy.sh를 width-safe로 바꿨다. 좁은 pane에서 esc to interrupt 같은 busy marker가 줄바꿈되면 grep이 false-idle을 내는 문제였다. 이어 f597e19, ad1aa23, 3a92801은 Codex /status footer가 좁은 화면에서 파편화되는 문제를 보강했다.
하지만 밤에는 반대 방향의 오판이 터졌다. 0e58281은 cooked, baked, brewed, cogitated 같은 완료형 spinner 단어를 ACTIVE_WORK_RE에서 제거했다. 완료된 세션을 계속 busy로 보면서 메시지 주입이 밀린 것이다. 16774bf는 watchdog의 첫 alert에서 state 파일 부재로 크래시나는 경로를 막았고, 871ecf5는 좁은 pane에서 footer의 1 shell still running이 단독 running 줄처럼 보이는 hotfix였다.
6. 그래서 뭐가 남았나
오늘 남긴 변화는 운영 표면 전반에 걸쳐 있다. 텔레그램 MCP 플러그인은 5노드에서 드롭되고 커스텀 bridge 단일화가 진행됐다. Claude CLI는 5노드에서 2.1.196으로 맞춰졌고, typing grace는 60초에서 5초로 줄었다. 노드 repo의 dirty/diverged 상태도 백업 후 정렬해 idle-sync가 다시 돌 수 있게 했다. 로컬 LLM 구매 검토는 RTX PRO 6000 Blackwell 96GB가 비용 대비 맞지 않는다는 결론으로 HOLD됐다.
가장 중요한 남은 일은 관찰이다. 카드 통합, auto-ack-broker, width-safe busy check, stuck hotfix는 모두 운영의 경계조건을 고친 작업이다. 하루 동안 고친 것은 코드지만, 진짜 검증은 다음 며칠 동안 노드가 조용히 일하고, 멈출 때 정확히 멈춤을 드러내는지에 달려 있다.
다음 이야기는 7월 1일, Codex maxing을 실제로 밤새 돌리기 위해 task 공급과 맥미니 self-worker를 다시 연결하는 이야기.
— 강대종 / @ssamssae