삿포로에서 보낸 나흘 동안 6개 저장소에 566개의 커밋(코드 변경을 저장소에 기록하는 단위)이 쌓였다. 그런데 새 기능은 그중 일부였다. 가장 큰 덩어리는 어제 짠 코드가 오늘 결함으로 돌아오는 루프였다. 고치면 그 수정이 다음 결함을 낳고, 그것을 다시 고치는 되풀이가 커밋의 절반 가까이를 차지했다. 무엇을 했고 왜 그렇게 됐는지를 커밋 이력과 피드백 기록에서 그대로 꺼내 적었다.
커밋의 절반 가까이가 직전 수정이 만든 결함을 되돌리는 작업이었다. 새 기능은 나머지 절반에 들어 있다. 7월 26일 하루에만 294개가 몰렸다. 그날은 세 저장소에서 동시에 적대 리뷰(다른 AI 모델이 내 코드를 작정하고 깨뜨리려 드는 검토) 루프가 돌던 날이다. 리뷰가 결함을 찾으면 고치고, 고친 것을 다시 리뷰에 넣는 되풀이가 그 루프다.
저장소를 기능으로 나누는 대신 하네스와의 관계로 묶으면 세 갈래가 된다. 하네스 자신을 고친 곳, 하네스가 만든 것을 밖으로 내보낸 곳, 그 하네스를 쓰다가 결함을 되먹인(쓰다가 발견한 결함을 하네스 정본으로 돌려보낸) 곳이다.
cc-sync 는 내 Claude Code 설정, 곧 하네스의 정본을 저장소로 백업하고 동기화하는 곳이다. 커밋 제목 기준 111건이 적대 리뷰 봉합이다. 봉합이란 리뷰가 찾은 구멍을 메운 수정 커밋을 말한다. 문체 검증기가 13라운드, 진화 파이프라인(하네스가 스스로를 고치는 자동 절차)이 10라운드, 프로젝트 훅 스코프(작업 전후에 자동으로 끼어드는 검사 스크립트가 어느 프로젝트에 적용되는지의 범위) 재설계가 7라운드, 모델 컨텍스트(AI가 한 번에 읽을 수 있는 글의 양)를 1M으로 통일하고 스킬 18개를 에이전트(정해진 역할을 맡아 스스로 도구를 쓰는 AI 작업자)로 승격하는 일이 10라운드였다. 그 사이에 프로세스 위생(남아 도는 데몬 누수와 폭주 감지), 스킬 신설 2종, 외부 지식 수확(매일 논문과 저장소를 읽어 규칙으로 들이는 자동 수집) 212~223차가 끼어 있다.
claude-code-site지금 읽고 있는 이 사이트의 저장소다. 200차 수확(외부 지식 수확의 200번째 회차)을 발표 덱으로 재구성하고, 모바일 세로 화면 대응과 SEO(검색 엔진에 잘 잡히게 하는 손질)를 손봤다. 가장 많이 고친 파일은 링크를 공유할 때 뜨는 미리보기 이미지, 곧 Open Graph 이미지를 찍는 OG 캡처 스크립트(29회)인데, 방어를 반복하다 결국 캡처용 로컬 서버를 통째로 없애 공격면(공격자가 건드릴 수 있는 지점)을 제거했다.
learning-pane 은 학습 콘텐츠를 캔버스 위에서 만드는 저작 도구 앱이다. Figma(화면 디자인 도구) 시안을 코드로 옮기는 일로 시작해 저작 도구로 자랐다. Codex 라운드 76까지 갔다. Codex는 OpenAI의 코딩 AI로, 여기서는 내 코드를 반박하는 적대 리뷰어 역할이었다. 라운드는 리뷰가 결함을 찾고 내가 고쳐 다시 넣는 한 바퀴다. 초안 저장의 동시성(두 곳에서 동시에 저장할 때 서로 덮어쓰는 문제)과 권한 경계(누가 어떤 데이터를 읽고 쓸 수 있는지의 선)가 주 전장이었다. 여기서 발견된 하네스 훅 오탐(검사기가 정상을 결함으로 잘못 잡은 것) 3건이 하네스 정본으로 돌아갔다.
teamclaude (5) — Claude 계정 여러 개를 번갈아 쓰게 해 주는 API 중계 서버다. 오래 안 쓴 계정의 갱신 토큰(로그인을 유지해 주는 열쇠)이 만료되던 문제를 keep-alive 스윕(계정이 잠들지 않게 주기적으로 깨우는 순회)으로 막았다. 적대 리뷰는 3라운드까지 돌렸다(라운드 표기는 R3). teamclaude-cloud (6) — 그 중계 서버의 클라우드 판이다. 결제대행사 선정 문서 3건을 썼고, 인증에 실패한 계정이 quota(계정별 사용 한도) 복구 경로로 되살아나 요청을 받던 버그를 잡았다. memory-bank-cloud (2) — 세션 사이의 기억을 클라우드에 두는 메모리 뱅크 서비스다. 프로젝트를 다시 초기화했다. 이 셋은 규모는 작지만 전부 되살리면 안 되는 것을 되살리던 결함이라는 공통점이 있다.
라운드가 13·10·76까지 간 이유는 리뷰어(코드를 검토하는 쪽, 여기서는 다른 AI 모델)가 유난히 까다로워서가 아니었다. 내가 낸 패치(결함 하나를 고치려고 넣은 수정 조각) 자체가 새 구멍이었기 때문이다. 커밋 제목에 그 사실이 그대로 남아 있다. 교차 리뷰(내 코드를 다른 AI 모델이 검토하는 절차) 2차에서 심각도 HIGH(높음 — 당장 고쳐야 하는 등급) 결함 2건을 고쳤는데, 그 결함은 내 직전 패치가 만든 것이었다. 커밋 제목이 "내 패치의 결함"으로 끝나는 이유다.
동인(driver — 이 나흘을 움직인 힘)은 넷이고, 순서가 있다. 아래에 D 뒤에 번호를 붙여 그 순서대로 적었다. 사용자가 지적하면 고치고, 그 수정이 새 결함을 낳고, 그 과정에서 검사기가 결함을 못 보고 있었다는 사실이 드러나고, 마지막에 몇 개는 고치는 대신 없앴다.
D1피드백 기록에 그대로 남아 있다. 사용자가 이렇게 지적했다. "전혀 최적화가 안되어있는데? 뭘 기준으로 테스트한거야? 컨텐츠는 다 짤리고 구성도 안맞잖아" 그래서 모바일 375px(작은 스마트폰 화면 너비) 검증을 QA(품질 검사) 기준에 새로 넣었다. 또 이런 지적도 있었다. "Threads 글 6개는 너무 작지 50개까지 분석해서 다시해" 그래서 문체 코퍼스(글투를 배우는 기준 글 모음)를 6건에서 43건으로 늘렸다. 지적 하나가 규칙 하나를 만들었다.
D2이 기간의 지배적 패턴이다. 커밋 제목 하나를 그대로 옮기면 이렇다. "직전 TOCTOU 패치가 임베디드 python 두 블록에 문법 오류를 넣어 무음 실패하던 것 정정" 풀어 쓰면 이렇다. 검사한 시점(time of check)과 실제로 쓰는 시점(time of use) 사이에 상태가 바뀌는 틈을 막으려던 직전 패치가, 셸 스크립트 안에 끼워 넣은 python 코드 두 블록에 문법 오류를 만들었다. 오류를 삼키는 구문 때문에 스크립트는 정상 종료했고, 그래서 아무도 몰랐다. 라운드가 길어진 진짜 이유가 이것이다.
D3세 저장소에서 같은 종류의 문제가 따로 나왔다. 검사기는 있었는데 결함을 그냥 통과시키고 있었다. 커밋 제목으로 보면 앱에서는 "불가능한 호출 체인도 테스트를 통과하지 못하게", 사이트에서는 푸시 게이트(코드를 서버에 올리기 직전에 검사 증거가 있는지 확인하는 검문소)에서 "증거 검사가 결과를 못 내면 통과가 아니라 차단", 하네스에서는 파일이 존재한다는 이유만으로 만점을 받던 죽은 검사 항목이 그것이다. 셋 다 검사기가 초록불을 켜 주고 있었다. 초록불이 안전의 증거가 아니었다.
D4두 번 그렇게 했다. 사이트의 캡처 스크립트는 서버를 반복해서 방어하다 서버 자체를 제거해 공격면을 없앴다. 하네스에서는 같은 지적이 네 라운드 반복되자 그 에이전트를 삭제했다. 여섯 번째 패치를 쓰는 것보다 설계가 틀렸다고 인정하는 편이 쌌다.
| 저장소 | 작업 | 규모 | 성격 |
|---|---|---|---|
cc-sync | 문체 검증기 신설 (Threads) | 13R | 신설 + 봉합 |
| 이미지 생성 스킬 신설 | 6R | 신설 + 봉합 | |
| 프로젝트 훅 스코프 재설계 (17개 전수 재설치) | 7R | 재설계 | |
| 진화 파이프라인 4단계 격리 | 10R | 재설계 | |
| 프로세스 위생 — 데몬 누수·폭주 감지 | 5R | 사고 대응 | |
| 모델 컨텍스트 1M 통일 · 스킬 18개 에이전트 승격 | 10R | 재설계 | |
claude-code-site | 200차 수확 발표 덱 (4개 언어) | 18 | 신규 산출 |
| 캡처 스크립트 보안 — 서버 제거로 종결 | 25 | 설계 철회 | |
| 모바일 세로 대응 + QA 기준 신설 | 16 | 사용자 지적 | |
| 푸시 게이트 우회 경로 봉합 | 25 | 거짓 통과 | |
learning-pane | 초안·정본 저장 동시성 폐쇄 | 35 | 봉합 |
권한 경계 하드닝 (RLS) | 20 | 봉합 | |
| 저작 기능군 · 퀴즈 13종 | 30 | 신규 기능 | |
| 하네스 훅 오탐 3건 역류 | 3 | 되먹임 | |
teamclaude | 유휴 계정 토큰 만료 방지 | 5 | 봉합 |
teamclaude-cloud | 결제대행사 선정 + 인증 실패 계정 부활 버그 | 6 | 조사 + 봉합 |
memory-bank-cloud | 프로젝트 재초기화 | 2 | 유지보수 |
전부 닫히지는 않았다. 셸(터미널 명령을 해석하는 프로그램)에서는 원자성(검사와 사용을 쪼갤 수 없는 한 동작으로 묶는 성질)을 확보할 수 없어서, 검사한 순간과 쓰는 순간 사이에 상태가 바뀌는 검사-사용 경합이 남아 있다. 같은 작업이 겹쳐서 두 번 돌지 못하게 막는 동시 실행 잠금도 아직 없다. 그리고 외부 지식을 자동으로 규칙에 반영하는 경로의 근본 안전성은 열려 있다. 마지막 것은 매일 도는 자동화라 임의로 끄지 않고 남겨 뒀다. 끄는 것은 결정이지 수리가 아니다.