클로드 코드가 하루 네 번 먼저 말을 겁니다 — 스케줄 작업으로 만든 AI 비서와 다섯 개의 함정
하루 네 번, 컴퓨터가 먼저 말을 겁니다
정오, 오후 두 시, 오후 여섯 시, 밤 열 시. 하루 네 번 컴퓨터가 스스로 날씨와 일정과 시세를 모아 음성으로 읽어줍니다. 제가 뭘 물어보지 않아도요. 만드는 데 걸린 시간은 두 시간 남짓이었는데, 그중 크론에 등록하는 일은 5분도 안 걸렸습니다. 나머지 시간은 전부 이 시스템이 조용히 거짓말하지 못하게 막는 일에 썼어요.

자비스가 대부분 실패하는 이유
"AI 비서를 만들었다"는 글은 많은데 두 주 뒤에도 쓰고 있다는 글은 드뭅니다. 이유는 대개 비슷해요. 처음엔 잘 돌다가, 어느 날 뉴스를 지어내기 시작하고, 장이 열려 있는데 "오늘 장은 이렇게 마쳤습니다"라고 말하고, 결국 신뢰를 잃고 꺼집니다. 기능이 모자라서가 아니라 틀린 말을 자신 있게 하기 때문에 버려집니다.
클로드 코드 스케줄 작업이 뭔가요
클로드 코드에는 정해진 시각에 스스로 깨어나 지정된 일을 하는 기능이 있습니다. 스케줄 작업(scheduled task)이라고 불러요. 등록하면 ~/.claude/scheduled-tasks/ 아래에 폴더가 하나 생기고, 그 안의 SKILL.md가 매 회차 실행될 지시문이 됩니다. 사람이 옆에 없어도 도는 게 핵심이에요.

크론 한 줄이 하는 일
시각은 크론 표현식으로 지정합니다. 2 12 * * *는 매일 12시 2분이라는 뜻이에요. 분·시·일·월·요일 순서라 익숙해지면 금방 읽힙니다. 주의할 점은 이게 내 컴퓨터의 로컬 시간으로 해석된다는 것. UTC로 환산하려다 아홉 시간 어긋나게 만드는 실수가 흔합니다.
첫 번째 함정 — 프롬프트는 자기완결이어야 합니다
여기서 처음 걸립니다. 스케줄 작업은 매 회차 완전히 새로운 세션에서 시작해요. 제가 지금 대화하며 알려준 맥락은 하나도 넘어가지 않습니다. "아까 말한 그 폴더에" 같은 표현은 다음 회차에 아무 의미가 없어요.

매 회차가 낯선 사람이라고 생각하세요
그래서 지시문을 쓸 때는 오늘 처음 온 사람에게 인수인계한다고 생각하는 게 정확합니다. 어떤 커넥터를 쓸지, 파일 경로가 어디인지, 결과를 어떤 형식으로 낼지, 실패하면 어떻게 할지를 전부 적어야 해요. 저는 각 브리핑 지시문에 절대 경로와 실행 명령을 통째로 박아뒀습니다.
네 개의 시간대를 이렇게 나눴습니다
시간대마다 필요한 정보가 다릅니다. 아침에 듣고 싶은 것과 자기 전에 듣고 싶은 것이 같을 리 없죠. 그래서 하나의 만능 브리핑 대신 네 개의 성격이 다른 브리핑으로 쪼갰습니다. 각각 5~8문단, 3~4분짜리 짧은 분량이에요.

정오 — 하루의 방향을 잡는 자리
날씨, 받은 메일, 오늘 남은 일정, 어제오늘 작업 흐름, 그리고 해야 할 일. 특히 지금 이후 남은 일정만 강조하게 했습니다. 이미 지나간 오전 회의를 읽어주는 건 소음이니까요. 할 일은 "내가 결정해야 하는 것"과 "AI가 이어서 할 것"을 나눠 말하게 했어요.
오후 두 시 — 장이 열려 있는 시간
점심 메뉴 추천, 주요 뉴스, 코스피 요약, AI 뉴스. 여기서 중요한 건 코스피가 아직 열려 있다는 사실입니다. 국내 정규장은 오후 3시 30분에 닫아요. 그래서 이 시간대 지시문에는 "마감이라고 말하지 말고 장중 현재 기준으로 말하라"를 대문자 경고로 박아뒀습니다.

오후 여섯 시 — 마감과 저녁
저녁 메뉴, 주요 뉴스, 코스피 마감, 테크 신제품. 뉴스는 오후 두 시 브리핑 이후 새로 나온 것을 우선하게 했습니다. 네 시간 전에 들은 걸 또 듣는 건 브리핑이 아니라 반복이니까요. 저녁 메뉴는 점심과 결이 겹치지 않게 고르라고 적었습니다.
밤 열 시 — 톤을 한 단계 낮춥니다
자기 전 간식, 맨손 운동, 나스닥, 문화 콘텐츠. 운동은 스트레칭 위주로 제한했어요. 자기 전에 버피나 점프를 추천하면 오히려 잠을 방해합니다. 목·어깨·허리처럼 오래 앉아 일한 부위를 푸는 동작만 고르게 했습니다.

두 번째 함정 — 같은 내용을 네 번 복제하면 죽습니다
네 개의 브리핑은 공통점이 많습니다. 음성 만드는 방법, 숫자를 한글로 바꾸는 규칙, GPU를 기다리는 절차. 이걸 네 지시문에 각각 복사해 넣으면 고칠 때 네 곳을 고쳐야 하고, 반드시 한 곳을 빠뜨립니다. 그러면 브리핑 하나만 이상하게 동작하는데 원인 찾기가 아주 어려워져요.
공통 문서 한 장으로 묶기
그래서 공통 절차를 문서 한 장으로 빼고, 네 지시문 맨 앞에 "시작 전 반드시 이 문서를 읽어라"를 넣었습니다. 시간대별 지시문에는 그 시간에만 해당하는 재료와 대본 순서만 남겼어요. 덕분에 각 지시문이 3KB 안팎으로 짧아졌고, 규칙을 고칠 땐 한 곳만 고칩니다.

세 번째 함정 — AI는 뉴스를 지어냅니다
이게 가장 위험합니다. "오늘 주요 뉴스를 알려줘"라고만 적으면, AI는 검색을 안 하고도 그럴듯한 뉴스를 만들어냅니다. 학습 시점의 기억과 문맥으로 조합하거든요. 게다가 음성으로 들으면 출처를 확인할 방법이 없어서, 틀린 정보가 그대로 하루의 판단 근거가 됩니다.
실시간 검색을 규칙으로 못 박는 법
세 가지를 지시문에 명시했습니다. 첫째, 뉴스는 반드시 웹 검색 결과만 쓸 것. 둘째, 검색어에 오늘 날짜를 넣을 것 — 날짜가 없으면 지난 기사가 섞입니다. 셋째, 검색 결과에 없는 사실은 배경 설명으로도 덧붙이지 말 것. 시세도 마찬가지로 실제 API 응답값만 쓰게 했어요.

검색이 실패하면 침묵하게 하세요
이게 핵심입니다. 검색이 실패했을 때 뭘 하라고 안 적으면 AI는 빈칸을 메우려고 합니다. 그래서 "검색이 실패하거나 결과가 비면 그 절을 통째로 생략하고 보고에 사유를 남겨라"를 못 박았어요. 브리핑이 짧아지는 건 괜찮지만 틀리는 건 안 되니까요.
네 번째 함정 — 시간 표현을 틀립니다
시세 데이터에는 "지금이 장중인지 마감 후인지"가 안 적혀 있습니다. 숫자만 있어요. 그래서 AI는 아무 때나 "오늘 장은 이렇게 마감했습니다"라고 말합니다. 오후 두 시에 이 말을 들으면 그 브리핑 전체를 못 믿게 됩니다.

장중·마감·개장 전을 구분시키기
시간대별로 명시했습니다. 오후 두 시는 장중, 오후 여섯 시는 마감 후. 밤 열 시가 까다로웠어요. 미국 정규장은 한국시간 밤 10시 30분에 열리니 10시 브리핑 시점은 개장 전입니다. 그때 받는 숫자는 간밤 종가예요. "지금 오르는 중"이라고 말하면 완전히 틀린 말이 됩니다.
목소리를 붙이는 일
텍스트로 남기면 결국 안 읽습니다. 그래서 로컬 음성 합성으로 mp3를 만들고 완성되면 자동 재생하게 했어요. 대본은 빈 줄로 문단을 나누고 문단 하나가 음성 한 번입니다. 문단별로 만든 뒤 하나로 이어 붙이는 구조예요.

왜 MCP 호출로는 안 되는가
처음엔 음성 도구를 그냥 호출하면 될 줄 알았는데 안 됩니다. 문단 하나 만드는 데 시간이 걸려서 도구 호출이 먼저 타임아웃해요. 그래서 HTTP를 직접 치는 작은 파이썬 스크립트를 두고 그걸 부르게 했습니다. 긴 작업은 도구 대신 스크립트로 빼는 게 정석이에요.
재실행 안전이라는 설계
무인 작업은 반드시 중간에 끊깁니다. 그래서 스크립트가 이미 만든 문단은 건너뛰게 했어요. 문단 내용의 해시를 파일명에 넣어서, 대본이 바뀌면 그 문단만 다시 만들고 안 바뀐 건 재사용합니다. 끊기면 같은 명령을 그대로 다시 돌리면 돼요.

다섯 번째 함정 — 눈으로 읽는 글과 귀로 듣는 글은 다릅니다
대본을 그냥 쓰면 음성이 망가집니다. 85%는 "팔십오 퍼센트"로, GPU는 "지피유"로 미리 바꿔 써야 해요. URL과 파일 경로와 이모지는 통째로 빼야 하고요. 그리고 너무 짧은 문단은 금지했습니다. 열두 글자가 안 되면 음성이 비거나 톤이 튀더라고요.
GPU 한 장을 나눠 쓰는 규율
제 작업실은 그래픽카드 한 장으로 이미지·영상·음성을 전부 돌립니다. 그래서 브리핑 지시문에 "다른 작업이 돌고 있으면 끝날 때까지 기다려라, 남의 작업을 죽이지 마라"를 넣었어요. 겹쳐 돌리면 실패가 아니라 품질 저하로 나타나서 로그로는 안 잡힙니다.

실제 사례 — 스모크 테스트가 잡아낸 것
등록만 하고 끝냈다면 첫 회차가 실전이 됐을 겁니다. 그래서 두 문단짜리 짧은 대본으로 미리 돌려봤어요. 그 덕에 음성 게이트웨이가 내려가 있다는 걸 발견했습니다. 엔진만 떠 있으면 첫 문단부터 연결 거부로 죽는 조건이었어요. 덤으로 문단당 소요 시간이 예상 1분 30초가 아니라 실제로는 29초라는 것도 확인했습니다.
실제 사례 — 등록하고 나서야 보인 충돌
등록 목록을 다시 훑다가 발견했어요. 정오 브리핑이 12시 10분인데, 영상 제작 작업이 12시 5분에 GPU를 잡습니다. 영상은 길게 도는 작업이라 브리핑이 순번 대기로 몇 시간 밀릴 수 있어요. 망가지진 않지만 제때 안 울립니다. 시스템은 하나씩 보면 멀쩡한데 모아 놓으면 충돌합니다.

핵심 정리
클로드 코드 스케줄 작업으로 AI 비서를 만들 때, 어려운 건 등록이 아니었습니다. 크론 한 줄은 5분이면 끝나요. 진짜 일은 이 시스템이 틀린 말을 못 하게 막는 규칙을 적는 것이었습니다.
정리하면 이렇습니다. 지시문은 낯선 사람에게 인수인계하듯 자기완결적으로 쓸 것. 공통 규칙은 문서 하나로 묶어 고칠 때 한 곳만 고칠 것. 뉴스는 반드시 실시간 검색만 쓰고, 검색이 실패하면 지어내지 말고 침묵할 것. 장중인지 마감인지를 명시할 것. 그리고 등록하기 전에 반드시 한 번 돌려볼 것.
결국 자동화 지시문은 기능 명세가 아니라 실패를 막는 규칙의 목록에 가깝습니다. "무엇을 하라"보다 "무엇을 하지 마라"를 적는 데 시간을 더 쓰게 되더라고요. 그리고 그게 두 주 뒤에도 이 시스템을 쓰고 있게 만드는 부분이라고 생각합니다.
여러분은 어떤 걸 자동화하고 계신가요? 비슷한 함정을 만나셨거나 더 나은 방법을 찾으셨다면 댓글로 알려주세요. 특히 "이건 이렇게 막았다" 같은 이야기가 제일 반갑습니다.
이 포스트는 Claude Code + SVIL Ghost MCP를 통해 AI가 직접 작성하고 발행했습니다.