← 제작기

매주 혼자 도는 자동화를 문서 한 장에 담기

정해진 시간에 혼자 도는 작업을 만들었습니다. 처음에는 두 개였습니다. 하나는 월요일 06시에 업계 주간 시황 카드뉴스 10장을 만들어 배포하는 작업이고, 다른 하나는 월요일 09시에 Gmail 받은편지함을 정리하는 작업입니다.

두 작업은 실행 환경이 같습니다. 매주 완전히 새로운 세션에서 시작하기 때문에 지난주에 무슨 이야기를 했는지, 무엇에 합의했는지 아무것도 남아 있지 않습니다. 이 작업들의 진짜 산출물이 카드뉴스나 정리된 메일함보다 SKILL.md 한 장인 이유가 여기 있습니다.

"알아서 잘"이 통하지 않는다

대화로 시킬 때는 지시가 조금 어설퍼도 일이 굴러갑니다. 결과가 이상하면 다음 메시지에서 고치면 되기 때문입니다. 새벽 6시에 혼자 도는 작업에는 그렇게 주고받을 기회가 없어서, 모호한 지점은 전부 그 자리에서 제멋대로 해석됩니다.

이 차이 때문에 규칙을 쓰는 방식이 달라졌습니다.

1. 독자를 문서로 정해 두기

카드뉴스의 대상 독자를 "그 업계 종사자"로 두면 매주 다른 어조가 나옵니다. 구체적인 직군 하나로 좁히고, 거기에 더해 "어느 직군은 아니다"와 그 직군이 실제로 신경 쓰는 항목까지 나열해 적었습니다.

"~는 아니다"를 함께 쓰는 것이 중요했습니다. 해당하는 조건만 주면 경계가 흐려집니다.

2. 상태를 계산할 수 있는 식으로

발행 호수 같은 값은 "지난번 다음 번호"로 쓸 수가 없습니다. 지난번을 모르기 때문에, 기준일을 고정해 두고 식으로 계산하게 했습니다.

Vol.1은 2026-07-31(수동 발행), 첫 자동발행일 2026-08-03을 Vol.2로 한다.
이번 실행일 기준 Vol 번호 = 2 + floor((오늘 − 2026-08-03).days / 7)

상태를 어딘가에 저장하지 않고, 날짜만 있으면 매번 같은 답이 나오게 만든 것입니다. 중간에 한 주를 건너뛰어도 호수가 꼬이지 않습니다.

3. 환경의 함정을 미리 적기

실행 환경에는 라이선스 때문에 "맑은 고딕"이 없습니다. 이 사실을 적어 두지 않으면 매주 한글이 깨진 카드가 나오거나, 대체 글꼴을 다시 찾느라 시간을 씁니다. 글꼴 경로까지 문서에 적은 이유입니다. NotoSansCJK-Regular.ttc 와 -Bold.ttc, index=0 입니다.

도구의 제약도 마찬가지입니다. 카카오톡 "나에게 보내기"는 텍스트만 보낼 수 있고, 200자 제한이 있으며, 이미지를 첨부할 수 없습니다. 이것을 적어 두지 않으면 매주 이미지를 카카오톡으로 보내려다 실패하는 일이 되풀이됩니다.

4. 지어내지 못하게 막기

반드시 실제 검색으로 확인한 수치만 사용하고, 확인이 안 되면 전주 수치를 유지하며 "전주와 동일"이라고 표시한다. 보간 금지.

시황 자료에서 가장 위험한 실패는 빈칸보다 그럴듯한 숫자입니다. 데이터 포인트가 8개가 안 되더라도 확인된 것만 쓰라고 분명히 적었습니다. 차트가 듬성듬성해 보이는 것보다 없는 값이 채워지는 쪽이 훨씬 나쁩니다.

5. 애매하면 건드리지 않기

메일함 정리에서는 규칙의 순서가 곧 안전장치입니다. 첫 번째 규칙이 "실제 사람이 개인적으로 쓴 메일은 완전히 그대로 둔다"이고, 마지막 규칙이 "사람이 쓴 것인지 자동 발송인지 애매하면 건드리지 말고 넘어간다"입니다.

나머지 규칙은 그 사이에 들어갑니다.

  • 보증서·정부 결정문·전자티켓·계약서처럼 보존할 가치가 있는 문서 → 라벨을 붙이고 받은편지함에서만 뺍니다(삭제하지 않습니다)
  • 뉴스레터, 광고 → 바로 휴지통으로 보냅니다
  • 결제·주문·배송 확인 메일 → 1년이 지나면 삭제합니다. 1년이 안 됐으면 그대로 두고 다음 실행에서 저절로 걸리게 합니다
  • 로그인 알림, 인증 코드 같은 일상적인 알림 → 몇 주가 지나 처리할 일이 없어졌으면 삭제합니다

"1년이 안 됐으면 지금은 아무것도 하지 않는다"는 규칙이 중요합니다. 미리 정리해 두고 싶은 마음을 참으면, 매주 조금씩 자연스럽게 처리됩니다.


결국 배운 것

반복 자동화를 쓰는 일은 프롬프트를 쓰는 일이라기보다 미래의 나를 믿지 않고 계약서를 쓰는 일에 가까웠습니다. 기준일, 글꼴 경로, 도구의 글자 수 제한, 지워도 되는 것과 안 되는 것처럼 말로 하면 한 줄인 것들도 문서에 없으면 매주 다르게 해석됩니다.

이 문서들은 계속 고쳐집니다. 결과가 어색하게 나온 주에는 결과물을 고치지 않고 SKILL.md를 고칩니다. 다음 주에도 남는 수정은 그것뿐이기 때문입니다.

이 작업은 그 뒤 일간·주간·월간 셋으로 나뉘었습니다. 나누고 나니 이 문서들에 적혀 있던 문장 여럿이 조용히 거짓이 됐는데, 그 이야기는 가르니까 참이던 문장이 조용히 거짓이 됐다에 적어 두었습니다.

그 뒤로 작업이 하나 늘었습니다. 매일 아침 논문 한 편을 찾아 원문과 번역본 PDF 를 만드는 작업인데, 여기서는 상태를 관리하는 방식이 한 걸음 더 나갔습니다. 카드뉴스가 날짜로 계산했다면, 이쪽은 결과물이 쌓이는 폴더에 진행 이력 문서를 함께 두고 다음에 어느 데이터베이스를 볼지를 거기에 적어 둡니다. 그 문서의 지시가 SKILL.md 의 규칙보다 우선한다는 것도 정해 두었습니다. 매번 빈 세션으로 시작하는 작업에게는 파일로 남은 것만이 기억이기 때문입니다.

I built jobs that run by themselves at a fixed time. There were two at first. One produces and distributes ten weekly industry card-news slides at 06:00 on Monday; the other cleans up a Gmail inbox at 09:00 on Monday.

What they have in common is the execution environment. Every week starts in a completely new session. Nothing remains of what was discussed last week or what was agreed. Which means the real deliverable of these jobs is not the card news or the tidied inbox — it is a single SKILL.md.

"Use your judgment" does not work

In conversation, a sloppy instruction still gets you somewhere. If it comes out wrong, you correct it in the next message. A job that runs alone at six in the morning has no such round trip. Every ambiguity gets resolved arbitrarily, on the spot.

So the way I write rules changed.

1. Pin down the reader

Leave the card news audience as "people in that industry" and you get a different tone every week. So it narrows to one specific role, and on top of that spells out which role it is not, along with the things that role actually cares about.

Writing the "not this" was the key part. Give only positive conditions and the boundary blurs.

2. State as a computable expression

Something like an issue number cannot be written as "one after last time," because last time is unknown. So a fixed reference date is nailed down and the number is computed.

Vol.1 is 2026-07-31 (published manually); the first automatic publication, 2026-08-03, is Vol.2.
Vol number for this run = 2 + floor((today − 2026-08-03).days / 7)

Instead of storing state somewhere, the date alone yields the same answer every time. Skip a week and the numbering does not fall apart.

3. Write down the environment's traps in advance

The execution environment has no "Malgun Gothic" for licensing reasons. Leave that out and you get cards with broken Korean every week, or spend time every week rediscovering a substitute font. So the paths are pinned too — NotoSansCJK-Regular.ttc / -Bold.ttc, index=0.

Tool constraints are the same. KakaoTalk's "send to myself" accepts text only, caps at 200 characters, and cannot attach images. Without that written down, every week repeats the same failed attempt to send images over KakaoTalk.

4. Block invention

Use only figures confirmed by an actual search. If a figure cannot be confirmed, keep last week's and mark it "unchanged from last week." No interpolation.

In market material, the dangerous failure is not a blank — it is a plausible number. The rule explicitly says to use only what has been confirmed even if that leaves fewer than eight data points. A sparse-looking chart is far better than a value that does not exist being filled in.

5. When in doubt, do not touch it

On the inbox side, the order of the rules is the safety mechanism. Rule one is "mail written personally by an actual human is left completely alone," and the last rule is "if it is unclear whether a human or an automated sender wrote it, leave it and move on."

Everything else fits in between.

  • Documents worth keeping — warranties, government decisions, e-tickets, contracts → label and remove from the inbox only (not deleted)
  • Newsletters, advertising → straight to trash
  • Payment, order, and shipping confirmations → deleted after a year. Under a year, left alone to be caught automatically on a later run
  • Routine notices like login alerts and verification codes → deleted once weeks have passed and there is nothing to act on

"Under a year, do nothing now" matters. Resisting the urge to tidy ahead of schedule is what makes it work through a little at a time, every week.


What it came down to

Writing a recurring automation turned out to be less like writing a prompt and more like drafting a contract with a future self you do not trust. The reference date, the font path, a tool's character limit, what may and may not be deleted — things that take one sentence out loud get interpreted differently every week if they are not in the document.

And these documents keep getting revised. In a week where the output comes out awkward, I fix SKILL.md rather than the output. That is the only edit that survives to next week.

The job has since been split into daily, weekly and monthly editions. Splitting it turned several sentences in these documents false without a sound — that story is in True Until I Split It.

One more has been added since. A job that finds a paper each morning and produces the original and a translated PDF — and its state management went a step further. Where the card news computes from the date, this one keeps a running-history document in the same folder the outputs accumulate in, and records there which database to look at next. The rule states that that document's instructions take precedence over the rules in SKILL.md — for a job that starts from an empty session every time, only what is left in a file is memory.