AI 와의 대화를 요약하여 포스팅하기
blog-start 로 마킹하고 blog-draft 로 초안까지
대화에서 가장 잘 익은 자리는 가장 빨리 사라집니다. 며칠 동안 Claude Code 와 막히고 풀리고 다시 막히면서 알게 된 것들이, 정작 대화창을 닫으면 거의 다 휘발됩니다. 글로 남기면 좋은 줄은 알지만 — 작업이 끝난 그 시점이 가장 글 쓸 여력이 없는 시점이기도 합니다.
이 글은 그 자리를 자르기 위해 직접 만들어 쓰고 있는 두 개의 Claude Code 스킬에 대한 회고입니다. blog-start 와 blog-draft — 한 쌍으로 묶이지만 시점이 다른 두 자리. 이 글 자체도 그 두 스킬로 쓰고 있습니다.
blog-start — 시작에서 끝나는 마킹
처음엔 한 스킬로 끝내려고 했습니다. 대화가 끝나면 한 번에 컨텍스트를 읽어 메타데이터도 추정하고 본문도 뽑아내면 될 것 같았습니다. 그런데 한 번 돌려보니 한 자리가 어긋났습니다 — 카테고리·태그·slug 같은 결정은 대화가 끝난 자리에서 하면 이미 늦었습니다. 끝난 대화는 맥락이 흐릿해진 상태고, 거기서 “이건 backend 인가 tooling 인가” 를 다시 결정하는 일은 시작에서 결정하는 것보다 항상 더 흔들렸습니다.
그래서 결정을 시점 으로 갈랐습니다. 메타데이터는 대화가 시작될 때 박는다. 본문은 대화가 끝났을 때 굳힌다. 같은 작업으로 묶어 쓰던 두 결정이 사실 다른 자리에 있던 셈입니다.
blog-start 가 박는 건 단순합니다 — .claude/blog-session.md 한 파일에 frontmatter 한 블록.
1
2
3
4
5
6
7
8
9
10
11
---
topic: <주제> # title 로 직행. 짧게.
subtitle: <부제> # description 으로 직행. 필수.
slug: <slug>
started_at: 2026-05-14 10:34
categories: [tooling]
tags: [claude-code, skill, blog-automation, jekyll, workflow]
---
# 대화 메모
(대화 중 생기는 핵심 포인트·결정·코드 위치를 누적 메모)
이 파일은 .gitignore 에 들어가 있습니다 — 대화 단위 임시 메타데이터의 휘발성을 인정하고 시작합니다. 다음 대화에서 다른 주제로 blog-start 를 다시 걸면 그냥 덮어써집니다. 영구화하지 않는 자리.
마킹을 시작에 끝내두면 부수 효과가 한 가지 더 붙습니다. 대화를 이어가는 동안 Claude 가 “이 대화는 글감이다” 라는 사실을 알고 움직이게 됩니다. 위 # 대화 메모 섹션에 핵심 포인트를 누적해 둘 수 있고, 결정의 fingerprint (commit hash, 파일 경로, 굳어진 표현) 가 그 자리에 모입니다. 끝난 자리에서 본문 뽑을 때 그 메모가 무게 추 역할을 합니다.
topic 과 subtitle 을 처음부터 둘로 쪼갠 것도 같은 결입니다. 한 줄 긴 title 을 끝에 가서 줄이는 일은 잘 안 됩니다 — 글이 다 써진 뒤에는 title 의 모든 단어가 다 의미 있어 보이니까요. 시작에서부터 짧은 슬로건(topic) + 부연(subtitle) 으로 강제로 갈라두면 그 안티패턴이 원천적으로 막힙니다.
blog-draft — 대화가 본문이 되는 자리
blog-draft 는 호출 시점에 두 입력을 합칩니다 — .claude/blog-session.md 의 메타데이터와, 그때까지의 대화 컨텍스트 전체. 거기서 frontmatter + 본문 마크다운을 만들어 _posts/<categories[0]>/<YYYY-MM-DD>-<slug>.md 에 떨어뜨립니다. 카테고리별 폴더로 자동 정리되는 자리.
이 단계에서 대화를 머릿속에서 한 번 정리합니다. 보고서 라벨 — “문제 / 시도 / 해결 / 배운 점” — 을 본문에 그대로 쓰지는 않지만, 정리는 그 네 차원으로 합니다.
- 발단 — 무엇을 하려 했고 어디서 막혔나
- 시도와 발견 — 의미 있는 시행착오 두세 개
- 해결 — 최종적으로 동작한 한 길
- 일반화 — 도구·라이브러리에 한정되지 않는 한 줄
이 정리가 본문의 흐름이 되되, 라벨은 자연스러운 서술문(## 부팅할 때 한 번만 만들면 충분했다) 또는 짧은 의문문(## 어디서 빌드할 것인가)으로 갑니다. 보고서 톤을 본문에 박지 않는 자리.
blog-draft 가 frontmatter 를 채울 때 MEMORY.md 에 쌓아둔 feedback 메모리들이 안전장치가 됩니다. 몇 가지 대표적인 자리:
date:는 시스템 시간을 직접 조회한다 (Get-Date). 추정 금지. 한 번 추정으로 잘못 박혔다가 시간대가 어긋난 글이 나온 적이 있었습니다.title은 짧은 슬로건, 긴 부연은description으로 분리. 위에서topic/subtitle을 두 토막으로 받은 결과를 그대로 매핑.description:은 모든 글에 필수. Chirpy 카드 미리보기와<meta name="description">두 자리에 동시에 쓰입니다 — 비우면 두 자리가 다 빈 칸으로 박힙니다.- 커버 이미지는
frontmatter의image:블록만 채운다. 실제 이미지 파일 생성·삽입은 하지 않습니다 — 자동 생성을 묶어둔 적이 있는데(blog-cover스킬) 결과물 톤이 자꾸 비껴가서 codex 로 분리했습니다.
그리고 한 가지 더 — blog-draft 는 git push 를 하지 않습니다. 초안이 떨어지면 거기서 멈추고, 사용자가 에디터에서 검토·수정한 뒤 직접 push 합니다. 검토는 자동화에서 의도적으로 비워둔 자리입니다.
남는 것
- 시점이 다른 결정은 시점이 다른 자리에서. 시작 결정(메타데이터)과 마무리 결정(본문) 을 한 스킬에 묶지 않는다.
- 메타데이터의 휘발성을 받아들인다.
.claude/blog-session.md는 gitignore — 영구화하지 않을 자리는 영구화하지 않는 게 그 자리의 형식.
