Field Log — 2026.07.25 → 07.28

삿포로에서 나흘간 566번 고쳤고
절반은 내가 낸 구멍이었다

삿포로에서 보낸 나흘 동안 6개 저장소에 566개의 커밋(코드 변경을 저장소에 기록하는 단위)이 쌓였다. 그런데 새 기능은 그중 일부였다. 가장 큰 덩어리는 어제 짠 코드가 오늘 결함으로 돌아오는 루프였다. 고치면 그 수정이 다음 결함을 낳고, 그것을 다시 고치는 되풀이가 커밋의 절반 가까이를 차지했다. 무엇을 했고 왜 그렇게 됐는지를 커밋 이력과 피드백 기록에서 그대로 꺼내 적었다.

나흘, 여섯 저장소, 566커밋
566commits
6repos
47%adversarial fixes
76max review rounds
294peak day

커밋의 절반 가까이가 직전 수정이 만든 결함을 되돌리는 작업이었다. 새 기능은 나머지 절반에 들어 있다. 7월 26일 하루에만 294개가 몰렸다. 그날은 세 저장소에서 동시에 적대 리뷰(다른 AI 모델이 내 코드를 작정하고 깨뜨리려 드는 검토) 루프가 돌던 날이다. 리뷰가 결함을 찾으면 고치고, 고친 것을 다시 리뷰에 넣는 되풀이가 그 루프다.

날짜별 커밋 분포 — 저장소 3갈래 누적 0 150 300 07-25 76 07-26 293 07-27 149 07-28 35 harness site app
막대는 주요 세 저장소만 쌓은 것이다(나머지 세 곳 13커밋 제외). 7월 26일의 293커밋은 그 세 곳이 각각 다른 적대 리뷰 루프에 들어가 있던 결과다. 하네스(harness — AI가 다 했다고 거짓말 못 하게 증거를 강제하는 감시 장치. 내 Claude Code 설정 전체가 여기 산다)는 문체 검증기를 13라운드 돌렸고, 앱은 동시성 문제로 34라운드에서 64라운드까지 갔고, 사이트는 캡처 스크립트 보안으로 25건을 고쳤다.
여섯 저장소, 세 가지 역할

저장소를 기능으로 나누는 대신 하네스와의 관계로 묶으면 세 갈래가 된다. 하네스 자신을 고친 곳, 하네스가 만든 것을 밖으로 내보낸 곳, 그 하네스를 쓰다가 결함을 되먹인(쓰다가 발견한 결함을 하네스 정본으로 돌려보낸) 곳이다.

자기 수리

cc-sync

cc-sync 는 내 Claude Code 설정, 곧 하네스의 정본을 저장소로 백업하고 동기화하는 곳이다. 커밋 제목 기준 111건이 적대 리뷰 봉합이다. 봉합이란 리뷰가 찾은 구멍을 메운 수정 커밋을 말한다. 문체 검증기가 13라운드, 진화 파이프라인(하네스가 스스로를 고치는 자동 절차)이 10라운드, 프로젝트 훅 스코프(작업 전후에 자동으로 끼어드는 검사 스크립트가 어느 프로젝트에 적용되는지의 범위) 재설계가 7라운드, 모델 컨텍스트(AI가 한 번에 읽을 수 있는 글의 양)를 1M으로 통일하고 스킬 18개를 에이전트(정해진 역할을 맡아 스스로 도구를 쓰는 AI 작업자)로 승격하는 일이 10라운드였다. 그 사이에 프로세스 위생(남아 도는 데몬 누수와 폭주 감지), 스킬 신설 2종, 외부 지식 수확(매일 논문과 저장소를 읽어 규칙으로 들이는 자동 수집) 212~223차가 끼어 있다.

238
commits
바깥으로

claude-code-site

지금 읽고 있는 이 사이트의 저장소다. 200차 수확(외부 지식 수확의 200번째 회차)을 발표 덱으로 재구성하고, 모바일 세로 화면 대응과 SEO(검색 엔진에 잘 잡히게 하는 손질)를 손봤다. 가장 많이 고친 파일은 링크를 공유할 때 뜨는 미리보기 이미지, 곧 Open Graph 이미지를 찍는 OG 캡처 스크립트(29회)인데, 방어를 반복하다 결국 캡처용 로컬 서버를 통째로 없애 공격면(공격자가 건드릴 수 있는 지점)을 제거했다.

153
commits
되먹임

learning-pane

learning-pane 은 학습 콘텐츠를 캔버스 위에서 만드는 저작 도구 앱이다. Figma(화면 디자인 도구) 시안을 코드로 옮기는 일로 시작해 저작 도구로 자랐다. Codex 라운드 76까지 갔다. Codex는 OpenAI의 코딩 AI로, 여기서는 내 코드를 반박하는 적대 리뷰어 역할이었다. 라운드는 리뷰가 결함을 찾고 내가 고쳐 다시 넣는 한 바퀴다. 초안 저장의 동시성(두 곳에서 동시에 저장할 때 서로 덮어쓰는 문제)과 권한 경계(누가 어떤 데이터를 읽고 쓸 수 있는지의 선)가 주 전장이었다. 여기서 발견된 하네스 훅 오탐(검사기가 정상을 결함으로 잘못 잡은 것) 3건이 하네스 정본으로 돌아갔다.

162
commits
나머지 셋

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건을 고쳤는데, 그 결함은 내 직전 패치가 만든 것이었다. 커밋 제목이 "내 패치의 결함"으로 끝나는 이유다.

수렴하지 않는 루프와, 그것을 끊은 두 사례 수정 결함 하나를 닫는다 적대 리뷰 다른 모델이 반박 새 결함 발견 방금 그 패치가 만든 것 되돌아온다 — 13R · 10R · 76R 탈출 패치를 하나 더 쓰지 않고, 기능을 철회한다 사이트 — 캡처용 로컬 서버를 반복 방어하다 서버 자체를 제거 (252 → 128줄) 하네스 — 같은 지적이 4라운드 반복되자 그 에이전트를 삭제 같은 지적의 반복은 미수정이 아니라 설계가 틀렸다는 신호다
리뷰가 새 결함을 계속 찾는다는 것은 두 가지 뜻이다. 리뷰가 유능하다는 뜻이고, 동시에 그 설계로는 안전하게 만들 수 없다는 뜻이기도 하다. 두 번은 후자였다.
무엇이 이 나흘을 움직였나

동인(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-site200차 수확 발표 덱 (4개 언어)18신규 산출
캡처 스크립트 보안 — 서버 제거로 종결25설계 철회
모바일 세로 대응 + QA 기준 신설16사용자 지적
푸시 게이트 우회 경로 봉합25거짓 통과
learning-pane초안·정본 저장 동시성 폐쇄35봉합
권한 경계 하드닝 (RLS)20봉합
저작 기능군 · 퀴즈 13종30신규 기능
하네스 훅 오탐 3건 역류3되먹임
teamclaude유휴 계정 토큰 만료 방지5봉합
teamclaude-cloud결제대행사 선정 + 인증 실패 계정 부활 버그6조사 + 봉합
memory-bank-cloud프로젝트 재초기화2유지보수
남은 것

전부 닫히지는 않았다. 셸(터미널 명령을 해석하는 프로그램)에서는 원자성(검사와 사용을 쪼갤 수 없는 한 동작으로 묶는 성질)을 확보할 수 없어서, 검사한 순간과 쓰는 순간 사이에 상태가 바뀌는 검사-사용 경합이 남아 있다. 같은 작업이 겹쳐서 두 번 돌지 못하게 막는 동시 실행 잠금도 아직 없다. 그리고 외부 지식을 자동으로 규칙에 반영하는 경로의 근본 안전성은 열려 있다. 마지막 것은 매일 도는 자동화라 임의로 끄지 않고 남겨 뒀다. 끄는 것은 결정이지 수리가 아니다.