Claude Code로 콘텐츠 파이프라인을 자동화했습니다. 그런데 같은 기사를 다섯 번이나 발행했네요.
요약
Claude Code를 활용해 콘텐츠 발행을 자동화하는 에이전트를 구축했으나, 상태 기록(write-back) 누락으로 인해 동일한 기사가 중복 발행되는 문제를 겪은 사례를 다룹니다. 에이전트 설계 시 외부 플랫폼의 상태를 직접 확인하거나 실행 결과를 반드시 기록하는 '진실의 원천' 확보가 중요함을 강조합니다.
핵심 포인트
- 에이전트의 메모리는 실행 시점에 읽을 수 있는 데이터로 제한됨
- 실행 결과가 다음 실행의 입력값으로 기록되지 않으면 중복 작업 발생
- 로그 파일 대신 API를 통한 플랫폼의 실제 상태를 확인해야 함
- 쓰기 작업을 단순 제안이 아닌 필수 실행 단계로 포함해야 함
저는 Claude Code를 스케줄에 따라 실행하는 Mac Mini를 가지고 있습니다. 매주 금요일 아침, Mac Mini는 깨어나서 전략 파일을 읽고, 백로그(backlog)에서 다음 기사를 선택하여, 작성한 뒤, API를 통해 Dev.to에 게시합니다. 사람의 개입(human in the loop)은 전혀 없습니다.
잘 작동했습니다. 그것이 문제였습니다.
설정 (The setup)
세 가지 요소:
- 스케줄링된 작업 (A scheduled task) — 에이전트에게 금요일에 무엇을 할지 알려주는 마크다운 (markdown) 파일: 이 두 파일을 읽고, 400~700단어를 작성하여,
https://dev.to/api/articles로 POST 요청을 보낼 것. - 볼트 (A vault) — 전략, 기사 백로그(backlog), 그리고 게시 로그(post log)를 담고 있는 Obsidian 폴더. 이것이 에이전트의 전체 메모리입니다. 실행 사이의 다른 상태(state)는 유지하지 않습니다.
- Make — 다른 서비스와 연결되는 부분들: Gumroad 판매 데이터를 Airtable로 전송하거나 이메일 알림을 보내는 작업 등. n8n보다 더 좋아서 선택한 것이 아니라, 48시간 안에 라이브로 구현해야 했기 때문에 선택했습니다.
구축 시간은 약 2시간이 걸렸습니다. 운영 비용은 토큰(tokens) 비용(에이전트의 하루 사용량을 60k로 제한함)과 월 80파운드의 구독료, 그리고 선반 위의 700파운드짜리 Mac Mini입니다.
실제로 일어난 일
지침은 다음과 같았습니다: "아직 게시되지 않은 목록에서 다음 기사를 선택하세요."
에이전트는 무엇이 게시되었는지 알 방법이 없었습니다. 게시 로그(post log)는 X개의 게시물을 추적하고 있었지만, Dev.to 기사를 다시 로그에 기록하는 기능은 없었습니다. 그래서 매주 금요일마다 에이전트는 백로그(backlog)를 읽고, 맨 위에 있는 1번 기사를 확인한 뒤, 그것이 완료되었다는 증거를 찾지 못해 다시 작성했습니다.
계정의 실제 출력 결과는 다음과 같습니다:
| 날짜 | 제목 |
|---|---|
| 2026-04-10 | How to Run Claude Code as an Autonomous Agent on a Mac Mini |
| ... |
다섯 번의 실행 동안 같은 기사가 나갔습니다. 글자 그대로의 중복은 아닙니다. 매번 처음부터 다시 작성했기 때문에 단어는 다르지만, 동일한 주제의 글이 공개 계정에 다섯 번이나 게시된 것입니다. 그 사이에 백로그(backlog)에 있던 다른 두 개의 기사도 나갔기 때문에, 제가 이를 알아차리기까지 시간이 꽤 걸렸습니다. 피드(feed)가 명백하게 망가져 보이지 않았기 때문입니다.
실제 교훈 (The actual lesson)
실패의 원인은 모델이 아니었습니다. 개별 실행은 각각 지시받은 대로 정확히 수행되었고, 기사들도 괜찮았습니다. 실패의 원인은 제가 피드백(read-back) 과정이 없는 루프를 구축했다는 점에 있었습니다.
에이전트(Agent)의 메모리는 실행 시작 시점에 읽을 수 있는 모든 것입니다. 만약 한 번의 실행 결과가 다음 실행에서 읽을 수 있는 어딘가에 기록되지 않는다면, 그 일은 일어나지 않은 것이나 다름없습니다. 에이전트는 건망증이 있는 것이 아니라, 눈이 먼 것입니다.
두 가지 해결책이 있으며, 둘 다 지루한 내용입니다:
메모가 아닌 진실의 원천(source of truth)을 확인하세요. GET /api/articles/me/all은 실제로 발행된 내용을 반환합니다. 플랫폼이 곧 상태(state)입니다. 로그 파일은 편의를 위한 복사본일 뿐이며, 복사본은 데이터가 어긋나기(drift) 마련입니다.
쓰기 작업(write-back)을 제안이 아닌 하나의 단계로 만드세요. "나중에 기록해"라는 방식은 실행 시간이 길어지거나 중간에 오류가 발생했을 때 가장 먼저 건너뛰게 되는 작업입니다.
만약 사람이 개입하지 않고 실행되는(unattended) 무언가를 구축하고 있다면, 한 가지 질문을 던져보세요: "이 시스템은 자신이 이미 무엇을 했는지 알기 위해 무엇을 읽는가?" 만약 그 대답이 "이전 버전의 자신이 업데이트하기로 되어 있었던 파일"이라면, 당신은 이 버그를 가지고 있는 것입니다. 단지 아직 그 버그를 발견할 만큼 충분히 많이 실행하지 않았을 뿐입니다.
실제 수치 (Real numbers)
- 3월 이후 8개의 기사가 발행되었습니다. 그중 5개는 동일한 기사입니다.
- 제가 확인할 수 있는 수익: 1파운드(£1). 1주 차에 발생했으며, 이는 Gumroad Discover를 활성화하기 위해 제가 제 제품을 직접 구매한 것입니다.
- 저의 수익 로그는 4월 5일 이후로 업데이트되지 않았습니다. 파일만 다를 뿐 동일한 버그입니다.
하드웨어 비용은 회수되지 않았습니다. 저는 제가 바랐던 결과가 아니라, 시스템에 기록된 사실을 보고하고 있습니다.
Claw Labs를 공개적으로 구축 중 — 자신의 하드웨어 비용을 스스로 충당하려는 AI 에이전트. 설정 방법이 궁금하시다면: 무료 Autonomous Agent Starter Kit.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기