← 작업일지

2026-07-02 · v1.0.0

2026.07.02 작업일지 v1.0.0

10:16, “자동작업 모두 꺼”라는 한 줄이 왔다. 12:37, 나는 5노드 운영 아키텍처를 백지에서 다시 그리는 첫 정책 파일을 심고 있었다. 20:51, 232줄짜리 운영 규칙이 12원칙 70줄로 갈리고, 발효 도장이 찍혔다.

여러 대의 컴퓨터를 오케스트레이터 한 대가 지휘하는 구조로 앱을 만들다 보면, 어느 순간 “지금 이 뼈대가 맞나?”라는 질문이 온다. 2026년 7월 2일이 그 날이었다. 오전엔 이름표를 통일하고 오래된 자동화를 껐고, 낮부터 밤까지는 노드 사이 메시지가 오가는 뼈대(메시지 버스·정책 게이트·작업 큐)를 단계별로 새로 깔았다. 마지막엔 운영 규칙 문서 자체를 232줄에서 70줄로 갈아엎어 발효시켰다. 그리고 밤엔, 새 배선이 만든 두 개의 사고를 잡았다. 하루 커밋 141개짜리 날.

1. “자동작업 모두 꺼”로 시작한 아침

새벽엔 잔손질이었다. 노드마다 제각각이던 브랜치 이름표를 노드 정식 ID로 통일하고(0f93e7f), 컨텍스트 자동 정리 임계값을 40%에서 45%로 올려(db96238) 5노드에 전파했다. 보고가 엉뚱한 곳으로 가던 macmini 호스트 이름 오매칭도 SSH 별칭으로 정규화했다(9927d55).

그러다 10:16, 짧은 지시가 왔다. “자동작업 모두 꺼.” 이어서 “토글도 끄고”, “밤 1회·월 1회도 꺼”, “6/3 문자잡도 꺼”. 밤새 혼자 도는 자동 잡들을 전부 멈추라는 뜻이었다. 이 한 줄이 오늘 오후의 대청소(4번 섹션)와 저녁의 헌법 교체(5번 섹션)로 이어지는 방아쇠가 됐다.

2. M0→M3: 메시 버스를 백지에서 세우다

핵심 작업은 운영 아키텍처 v4였다. 여러 노드가 텔레그램으로 서로 지시·보고를 주고받는데, 그동안 그 배선이 스크립트마다 제각각이라 “누가 어느 봇으로 뭘 보냈는지”가 안 보였다. 이걸 하나의 메시지 버스로 모으는 게 목표였다. 하루를 단계(마일스톤)로 쪼갰다.

단계한 일대표 커밋
M0라우팅·위험등급 정책 파일 시드(행동 변화 0)e55d801
M1a발신 장부(ledger) + 렌더러 규격 v0.1 + fixture 12종88d3fec ad852fd
M1bmesh-send 버스 코어(dry-run) + 5노드 카나리 절체fc24ab3
M2정책 게이트 관측(observe) 훅 + 분류기 튜닝19e4dd4 c288bc5
M3작업 큐 코어 + 상태머신 + 절체 어댑터852390a 4a112b6

여기서 두 번 발이 걸렸다. 하나는 파일 잠금에 쓰던 flock 명령이 macOS엔 아예 없다는 것 — 파이썬 fcntl.flock으로 갈아끼웠다(781de39). 다른 하나는 YAML 파서(pyyaml)를 필수 의존성으로 박았다가 게이트가 막힌 것 — 표준 라이브러리 JSON 미러로 폴백을 뒀다(db4cb8d). 정책 게이트는 처음부터 “차단”이 아니라 “관측”으로만 켰다. 새 규칙이 실제로 뭘 막게 될지 데이터를 먼저 쌓고, 차단 전환은 나중에 별도 승인으로 하기로 했다.

배운 것 — 이식성은 “잘 되던 명령”이 아니라 “모든 노드에 있는 명령”으로 판가름난다. Linux에서 멀쩡한 flock 하나가 macOS 노드 전체를 조용히 실패시킨다.

3. 창고를 비운 여덟 번의 청소

오전의 “다 꺼” 지시는 오후에 M4b 창고 정리로 구체화됐다. 여덟 라운드에 걸쳐, 죽은 스크립트 23종을 _retired로, 죽은 훅 3종을 _disabled로 가역 보관했고(252bf78), 휴면 상태로 남아 있던 자동화 plist 13종을 한꺼번에 은퇴시켰다(00fbca7). 야간 자동 실행 체인(night-runner)과 야간 콘텐츠 잡, 텔레그램 폴링 감시견까지 정식으로 창고로 갔다(dc4d106). 중간 보고 훅이 데드락에 걸리던 버그도 이 김에 “차단→관측”으로 강등하며 잡았다(c1a743c).

핵심은 삭제가 아니라 이동이라는 점이다. 전부 _retired·_disabled 폴더로 옮겼을 뿐이라 필요하면 되살릴 수 있다.

배운 것 — 자동화를 끄는 건 지우는 게 아니라 보관하는 것이다. 되돌릴 여지를 남겨야 “일단 다 꺼봐”라는 과감한 정리가 안전해진다.

4. 헌법을 232줄에서 70줄로

가장 상징적인 작업은 운영 규칙 문서 교체였다. 그동안 하드룰이 232줄까지 불어나 있었는데, 이걸 12개 원칙 + 상세 정책 파일 포인터만 남긴 약 70줄로 갈아엎었다(9e7a62e). 옛 본문은 지우지 않고 history 폴더로 강등 보존했다. 같은 맥락에서, 나(사용자) 대상 답변은 앞으로 기본을 “열 살에게 설명하듯” 쉬운 말로 하도록 규칙을 하나 추가했다(4cee54d) — 전문용어·코드네임은 일상 비유로 풀고, 필요할 때만 정밀 모드로.

저녁 20:51, 발효 승인이 떨어졌다. 규칙·게이트·유닛의 실제 발효는 사람이 도장을 찍어야만 넘어가는 비가역 관문으로 뒀고, 그 도장이 찍힌 시점이었다.

5. 밤에 봇이 남의 이름표를 달고 나갔다

새 배선을 5노드에 실제로 꽂자, 밤에 두 개의 사고가 드러났다.

첫째는 봇 오발신. 노드마다 클로드용 봇과 코덱스용 봇이 따로 있는데, 코덱스가 보낸 메시지가 클로드 봇으로 새어 나갔다. 봇 토큰을 엔진별로 갈라 라우팅하도록 고쳤다(9e63c64, 88081f2). 실제로 폰에서 “코덱스한테 hi 했는데 왜 이쪽으로 오냐”는 관찰로 잡힌 진짜 사고였다.

둘째는 공개본 폭사 직전 봉합. 브릿지의 오픈소스 공개 버전을 내보내는 과정에서, 내부 심볼이 남아 공개본이 실행 즉시 NameError로 죽을 상태였다. 스텁을 주입하고 내부 심볼 잔존을 잡는 감사 게이트를 붙여 봉합했고(72a1ca9), sanitizer를 강화해 실누출 후보 2건을 선제 차단했다(4787d6b). 다행히 긴급 중지가 외부 발신 전에 먹혀 실제 공개 push는 0건 — 유출은 없었다. 봉합 뒤 브릿지 2종을 v0.4.0으로 정식 릴리스했다. 덤으로, 수동 머지 게이트 마커를 공백 형태로 못 알아보던 자동머지 봇 버그도 같은 종류로 세 번째 재발이라 아예 고쳤다(6436af8).

배운 것 — 공개 릴리스는 “내보내기”가 끝이 아니라 “내보낸 게 실행되는가”까지다. 내부 심볼 하나가 남아도 공개본은 첫 줄에서 죽는다. 감사 게이트를 코드로 박아두는 게 다짐 한 줄보다 낫다.

6. 학습·상담

  • “관측(observe)이 말 그대로 관측만 하는 거지?” — 맞다. 정책 게이트를 observe로 켜면 아무것도 막지 않고 “이 규칙이 켜졌으면 뭘 막았을지”만 기록한다. 데이터가 쌓인 뒤 차단(enforce)으로 올린다.
  • “병목이 어디야, ack 펜딩인가?” — 그날 흐름의 병목은 대체로 사람 승인 대기(ack)였다. 노드들이 PR을 올려두고 머지 도장을 기다리는 구간.
  • ELI10 요청 반복 — “쉽게 설명해줘”가 여러 번 나왔고, 그게 4번 섹션의 “기본을 쉬운 말로” 규칙으로 굳었다.

7. 그래서 뭐가 남았나

하루 결산: 커밋 141개(자동화 저장소 125·스킬 저장소 10·홈페이지 4·한줄일기 앱 2). 남은 결과물은 —

  • 5노드 메시지 버스·정책 게이트·작업 큐의 뼈대가 M0~M3까지 깔렸고, 5노드 브릿지가 새 버스로 절체됨.
  • 운영 규칙이 12원칙 70줄로 교체·발효, 답변 기본이 쉬운 말 모드로.
  • 죽은 자동화 수십 종이 가역 보관으로 정리됨.
  • 브릿지 공개 버전 2종 v0.4.0 릴리스(NameError·실누출 봉합 후).
  • 곁다리로 홈페이지 뉴스레터 짧은 회차(ep55·57·59)를 살 붙여 확장(5eb9e3c), 한줄일기 앱에 읽어주기 음성 성별 설정 추가(d16e2c7).

남은 일: 정책 게이트를 관측에서 차단으로 올리는 발효 게이트, 렌더러 규격 v0.2(이야기체 카드 + 답장 스레드)의 잔여 배선, 메시지 버스 위에서 도는 관측 데이터 수집.

repoSHA메시지
claude-automationse55d801feat(policy): 아키텍처 v4 M0 — 정책 파일 시드(행동 변화 0)
claude-automationsfc24ab3feat(mesh): dry-run mesh-send 버스 코어
claude-automations00fbca7chore(gc): 휴면 자동화 plist 13종 일괄 은퇴
claude-automations9e63c64fix(mesh): 봇토큰 engine-aware 라우팅 — 오발신 fix
claude-automations72a1ca9fix(oss-export): mesh 스텁 주입 + 공개본 NameError 봉합
claude-skills9e7a62eglobals: CLAUDE.md v4 발효 — 12원칙 + 포인터 전문 교체
claude-skills4cee54dglobals: 답변 쉬운말(ELI10) 디폴트 룰 추가
daejong-page5eb9e3cnewsletter: ep55·57·59 짧은 회차 확장
apps/hanjuld16e2c7feat(hanjul): 읽어주기 음성 성별 설정

다음 이야기는 정책 게이트가 관측을 지나 처음으로 무언가를 “차단”하는 이야기.

— 강대종 / @ssamssae