'하지 마'라고 적는 대신, 되돌리게 만들었다 — AI에 가드레일 셋
재시도마다 전략을 바꾸고, 에이전트가 채택한 표지를 건드리면 되돌리고, 조판 렌더러를 네트워크에서 떼어냈다. 그리고 책 한 권을 돌려보니, 오늘 고친 그 문제가 눈앞에서 재현됐다.
결론부터. 오늘은 ICEWriter(super-writer 엔진을 감싼 '책 쓰는 AI' 데스크톱 앱)에 기능을 더하지 않았다. AI 에이전트가 딴짓을 못 하게 막는 장치 세 개를 달았다. 프롬프트로 "하지 마"라고 부탁하는 대신, 코드로 되돌리게.
이 시리즈에서 몇 번이나 적었다 — "AI에게 하라고 적는 것과, 하게 만드는 것은 다르다". 오늘이 딱 그 이야기의 다음 편이다.
1. 같은 실패를 반복하던 재시도
단계가 게이트에서 막히면, 앱은 같은 프롬프트를 두 번 더 던졌다. 전략은 그대로. 그래서 같은 실패를 세 번 반복하고 멈췄고, [이어쓰기]를 눌러도 처음부터 똑같이 실패했다.
이제 재시도마다 전략을 바꾼다. 1차는 '수리 모드'(틀린 데만 최소 수정), 2차는 '재작성 모드'(처음부터 다시 쓰되 게이트 기준을 체크리스트로 스스로 대조). 그래도 안 되면 왜 막혔는지 진단 카드로 보여준다 — 시도 이력, 원인 추정, 다음에 뭘 하면 되는지. 이어쓰기는 리셋하지 않고 가장 센 전략부터 재개한다.
2. 에이전트가 표지를 건드리면 되돌린다
표지는 사용자가 4단계에서 이미 골랐다. 그런데 뒤 단계 에이전트가 "표지를 더 멋지게 하겠다"며 손대는 일이 있었다. "표지 건드리지 마"라고 프롬프트에 적어뒀지만, 프롬프트는 뚫린다. 이 시리즈에서 이미 두 번 겪은 일이다.
그래서 단계를 시작하기 전에, 그 단계가 쓸 수 있는 폴더 밖의 파일을 전부 스냅샷으로 떠둔다. 단계가 끝나면 비교해서 — 허용 폴더 밖이 바뀌었으면 되돌리고, 새로 만든 건 지운다. 채택한 표지와 표지 레이아웃은 '상시 보호' 대상이라, 어느 단계에서 손대든 원본으로 복원된다. "게이트·빌더는 앱만 실행한다"는 원칙을, 이번엔 파일 쓰기 레벨까지 내린 셈이다.
3. 조판 렌더러를 네트워크에서 떼어냈다
PDF를 굽는 1순위 렌더러(pagedjs)를 매 빌드마다 npx로 즉석에서 받아 썼다. 네트워크가 막히거나 캐시가 비면, 조용히 다른 렌더러로 떨어진다 — 쪽번호와 러닝헤더가 사라진 채로. 사용자는 "왜 이번엔 쪽번호가 없지?"만 남는다.
이제 데이터 폴더에 한 번 고정 설치하는 버튼을 넣었다. 설치돼 있으면 그걸 쓰고, 없으면 예전처럼 네트워크로 폴백. 설정과 온보딩 화면에 "PDF 렌더러" 상태등(초록/노랑/빨강)과 설치 버튼을 붙였다. 노란불이면 눌러서 고정하라는 뜻이다.
그리고 — 책 한 권을 돌려봤다
가드를 다 켠 채로, 부동산 입문서 한 권을 자율로 돌렸다. 결과가 재밌다.
- 집필 단계는 재시도 한 번 없이 전부 통과했다. 오늘 만든 재시도·진단 장치는 발동조차 안 했다 — 필요가 없었다는 뜻이니 좋은 신호다.
- 표지도 안 건드려졌다. 원본이 그대로 남아 있었다.
- 그런데 최종 조판이 pagedjs가 아니라 chrome으로 떨어졌다. 오늘 고친 바로 그 문제 — 이 컴퓨터에서 npx pagedjs가 안 붙는 — 가 눈앞에서 재현된 것이다. 34쪽, 24MB짜리 PDF는 나왔지만, 쪽번호를 얹는 그 렌더러가 아니었다. 로컬 설치 버튼 한 번이면 될 일. 오늘 그 버튼을 만든 게 우연이 아니었다.
왜 이걸 하나
super-writer를 프로그램으로 빌드한 뒤로, 나는 기능보다 '되는 척'을 지우는 데 더 많은 시간을 쓰고 있다. 팔 수 있는 물건이 되려면, 남의 컴퓨터에서 내 AI가 딴짓을 하지 않아야 한다. 오늘 단 세 개의 가드레일이 그 신뢰의 절반쯤 된다. 나머지는 아직 남았고, 방금 돌린 책 한 권이 그 남은 절반을 정확히 짚어줬다.