나는 만드는 사람이고, 이 사이트는 그 과정을 기록하는 곳이다

나는 동물 브랜드 아니모와 리프렙타일, 온라인 쇼핑몰을 운영하면서 운영에서 반복되는 일을 직접 소프트웨어로 만들어 해결하는 사람이다. 이 사이트는 그 과정을 기록하는 곳이다.

만드는 사람에게 기록은 부산물이 아니라 자산이다. 어떤 문제를 골랐고 왜 그 방법을 선택했는지의 판단 기록은 시간이 지나면 나조차 복원할 수 없다. 그리고 혼자 만드는 사람의 결과물은 코드보다 기록으로 먼저 신뢰를 얻는다. 그런데 기록은 늘 밀렸다. 만드는 시간은 어떻게든 냈지만 기록하는 시간은 내지 못했다. 몇 번의 다짐이 무너진 뒤 인정했다. 기록이 의지에 걸려 있는 한 반드시 무너진다. 그래서 기록을 의지에서 떼어내, 개발자가 하루에도 몇 번씩 하는 행동인 git push에 걸었다.

구조는 이렇게 돌아간다

전체 흐름은 다음과 같다.

  • GitHub Actions가 main 브랜치 푸쉬를 감지한다. 워크플로우 파일 하나가 트리거 전부다.
  • 스크립트가 그 푸쉬의 커밋 메시지들과 변경 파일 목록, 대표 코드 변경(diff)을 수집해 하나의 메모로 묶는다. 이때 .env 같은 민감 파일과 시크릿으로 보이는 줄은 자동으로 걸러낸다.
  • 메모가 내 사이트의 글쓰기 API로 전송된다. 인증은 비밀 토큰으로 하고, 푸쉬의 커밋 해시를 멱등성 키로 써서 같은 푸쉬가 두 번 실행돼도 글은 한 번만 발행된다.
  • Claude Sonnet 5가 메모를 받아 글을 쓴다. 자유 생성이 아니라 제목, 요약, 본문, 카테고리를 정해진 구조로만 제출하게 강제했고, 시스템 프롬프트에 두 가지 규칙을 박았다. 메모에 없는 숫자와 성과는 지어내지 않는다. 그리고 AI 특유의 말투가 나오는 표현들을 금지어로 걸었다.
  • 완성된 글이 Next.js로 만든 이 사이트의 Neon PostgreSQL에 저장되고 즉시 발행된다. Vercel이 서빙한다.

검토 없이 돌아가게 만든 이유

검토 단계를 일부러 없앴다. 발행 전에 사람이 확인하는 구조를 만들면 나중에 확인해야지가 쌓이고 결국 파이프라인 전체가 방치된다. 95점짜리 자동화는 자동화가 아니다.

대신 예외 장치 하나만 남겼다. 커밋 메시지에 [skip blog]라고 쓰면 그 푸쉬는 글이 되지 않는다. 예외는 있되 예외를 다루는 절차는 없어야 시스템이 계속 돌아간다.

만들면서 예상하지 못한 부산물도 있었다. 커밋 메시지를 대충 쓸 수 없게 됐다. 커밋 메시지가 곧 글의 재료라서, 성의 없는 커밋은 성의 없는 글로 몇 분 안에 되돌아온다. 기계에게 일을 시켰더니 내 습관이 먼저 고쳐지고 있다.

독자에게 남기는 질문

반복되는 일 중에 의지 없이도 돌아가야 할 일이 있다면, 그 일을 의지 위에 얹지 말고 이미 매일 하는 행동 위에 얹는 것을 권한다. 무엇을 자동화할지보다 무엇에 걸어둘지가 먼저다.