# 학습허브 템플릿 기준으로 내 자동 발행 허브 점검하기

- 작성자: [캐시](https://community.clauders.ai/member/imported-member-ZpJPISU9zF)
- 공간: [AI 첫걸음 놀이터](https://community.clauders.ai/ai-playground)
- 게시: 2026-10-06
- 연재: [AI 첫걸음 놀이터](https://community.clauders.ai/series/ai-playground) 3/4편
- 태그: #AI놀이터
- 주소: https://community.clauders.ai/ai-playground/post/%ED%95%99%EC%8A%B5%ED%97%88%EB%B8%8C-%ED%85%9C%ED%94%8C%EB%A6%BF-%EA%B8%B0%EC%A4%80%EC%9C%BC%EB%A1%9C-%EB%82%B4-%EC%9E%90%EB%8F%99-%EB%B0%9C%ED%96%89-%ED%97%88%EB%B8%8C-%EC%A0%90%EA%B2%80%ED%95%98%EA%B8%B0-d7c80953-b2c3-8646-bf51-595a271bb2d9

---

## **소개**

강의에서 받은 학습허브 템플릿의 글 종류 여덟 가지를 매일 자동으로 발행하는 제 경제 브리핑 허브(econ-radar)에 대 보니, 세 칸은 채워져 있고 세 칸은 일부만, 로드맵과 계획 두 칸은 비어 있었습니다. 에이전트로 글을 자동 발행하면서도 그 기록이 어떤 구조로 쌓이는지는 따져 본 적이 없는 분께 도움이 될 것 같습니다.

AI놀이터 1주차는 MVP 실습에 들어가기 전에 "AI와 어떻게 배우고 어떻게 기록하는가"에 30분가량을 썼습니다(00:43~01:13). 스터디장이 나눠 준 학습허브 템플릿에는 순서가 정해져 있습니다. 매일 학습일지를 비공개로 쓰고, 거기서 소재를 뽑아 사례글로 다듬고, 사례글과 개념과 회고가 학습위키에 주차별로 쌓여 한 달 뒤 전자책이 됩니다. 스터디장은 사례글은 매일 안 써도 되지만 학습일지는 작업한 만큼 계속 남겨 달라고 했습니다. 그것이 AI가 내 일을 알게 되는 맥락이라는 이유였습니다.

저는 이번 기수에 이 스터디를 청강합니다. 입문 실습을 그대로 따라 하기보다, 6월부터 매일 돌아가는 제 허브가 이 순서에서 어느 칸을 채우고 있는지 세어 보기로 했습니다. 이 허브는 Claude Code가 클라우드에서 만들어 발행하고 저는 결과를 확인하는 구조라서, 템플릿이 말하는 "내가 쓰는 학습일지"와는 쓰는 주체부터 다릅니다. 그 차이가 숫자로 어디에 나타나는지 보고 싶었습니다.

## **진행 방법**

**사용 도구**: Claude Code, Python 3, git, GitHub Actions

### **Step 1. 템플릿 내려받기와 기준 정하기**

강의 0단계는 Codex로 learning-hub-template을 내려받는 것이었습니다. 저는 Claude Code에서 같은 저장소를 임시 폴더에 받았습니다.

```
/usr/bin/time -p git clone -q --depth 1 https://github.com/mumyungsee/learning-hub-template.git
git ls-files | wc -l; ls .claude/skills | wc -l; ls .agents/skills | wc -l
```

**항목**

**값**

내려받기

1.22초

마지막 커밋

2026-10-02 18:22 (c740de6)

파일

105개

학습메이트 스킬

10개 (학습일지, 개념정리, 계획문서, 로드맵, 주간종합, 프로젝트발견 등)

spec-kit 스킬

10개. 2주차용

템플릿 README는 글의 종류를 이렇게 나눕니다. 랜딩, 프로젝트 카드, 학습일지(비공개)가 각각 폴더 하나씩이고, 학습위키 안에서 로드맵, 계획, 개념, 사례, 회고 다섯이 `종류:` 값으로 갈립니다. 이 여덟 가지를 기준으로 삼았습니다.

### **Step 2. 허브 구조 세기와 칸 대응**

econ-radar는 `vault/` 폴더 아래에 발행 재료와 결과를 쌓습니다. 원격 저장소(origin/main) 기준으로 폴더별 파일 수를 먼저 셌습니다. 한글 파일 이름이 8진수 코드로 깨져 보이지 않게 `core.quotepath=off`를 켰습니다.

```
git fetch -q
git -c core.quotepath=off ls-tree -r --name-only origin/main | awk -F/ '$1=="vault"{print $2}' | sort | uniq -c | sort -rn
```

```
 231 analysis
 117 push
 117 html
 116 raw
 116 daily
  99 topics
  95 email
  18 reports
  17 assets
  17 _meta
   3 blog-drafts
   1 log.md
   1 README.md
   1 .obsidian
```

대응 기준은 두 가지로 정했습니다. 파일 이름과 폴더만 보고 내용은 읽지 않았고, 하루나 한 주 단위로 쌓이는 것은 학습일지나 회고 칸으로, 주제별로 누적되는 것은 개념 칸으로 봤습니다. 대응은 제 판단이라 그림 맨 위에 그렇게 적었습니다.

- 랜딩은 공개 첫 화면입니다. `kakyungkim.github.io/econ-radar/`가 열려서(HTTP 200) 있음으로 봤습니다.
- 프로젝트 카드는 `vault/README.md` 하나입니다. 카드 형식은 아니라 일부로 봤습니다.
- 학습일지는 `vault/daily`입니다. 하루 한 편씩 쌓이는 구조는 같지만 내용이 뉴스 발행본이라 제 작업 기록은 아닙니다. 일부로 봤습니다.
- 개념은 `vault/topics` 99개입니다. 주제별로 날짜 블록이 누적되고 9월 28일 이후 15개가 갱신됐습니다. 있음입니다.
- 사례는 `vault/blog-drafts` 3개입니다. paper-radar에도 초안 4개가 따로 있습니다. 일부입니다.
- 회고는 `vault/reports`의 주간 동향 리포트입니다. 17주가 이어져 있습니다. 템플릿의 주간종합과 같은 형태라 있음으로 봤습니다.
- 로드맵과 계획은 아래 Step 3에서 이름으로 찾았고 0개였습니다.

### **Step 3. 학습일지 칸의 빠진 날 찾기**

학습일지 칸은 개수만으로는 부족하다고 봤습니다. 이 칸은 하루도 거르지 않는 것이 목적이어서, 6월 9일 첫 발행부터 지금까지 날짜가 빠진 곳을 세었습니다. 저장소는 읽기만 하는 스크립트(`hub_check.py`)로 셌습니다.

```
import os, re, subprocess, datetime as dt, unicodedata

def tree(repo, ref):
    out = subprocess.run(["git", "-c", "core.quotepath=off", "ls-tree", "-r", "--name-only", ref],
                         cwd=repo, capture_output=True, text=True).stdout
    return [unicodedata.normalize("NFC", t) for t in out.split("\n") if t]

def count(files, prefix, ext=".md"):
    return len([f for f in files if f.startswith(prefix) and f.endswith(ext)])

econ = tree(os.path.expanduser("~/projects/econ-radar"), "origin/main")
paper = tree(os.path.expanduser("~/projects/paper-radar"), "origin/master")

dates = sorted(re.findall(r"^vault/daily/(\d{4}-\d{2}-\d{2})\.md$", "\n".join(econ), re.M))
first, last = (dt.date.fromisoformat(dates[0]), dt.date.fromisoformat(dates[-1]))
span = (last - first).days + 1
have = set(dates)
missing = [str(first + dt.timedelta(i)) for i in range(span) if str(first + dt.timedelta(i)) not in have]
weeks = sorted(set(re.findall(r"^vault/reports/(\d{4}-W\d{2})", "\n".join(econ), re.M)))
plan_like = [f for f in econ if not re.match(r"vault/(raw|daily|analysis|push|html|email)/", f)
             and re.search(r"roadmap|plan|로드맵|계획", f, re.I)]
```

119일 가운데 115일이 있고 빠진 날은 6월 12일, 7월 22일, 8월 1일, 10월 1일 네 날이었습니다. 폴더에는 파일이 116개인데 날짜 이름 파일은 115개입니다. 하나는 날짜 이름이 아닌 파일이라 학습일지 칸의 개수에서 뺐습니다.

### **Step 4. 빠진 날의 원인 확인과 감시 장치 추가**

네 날 중 10월 1일은 이번 주에 일어난 일이라 원인을 바로 찾을 수 있었습니다. 클라우드 예약 실행의 기록을 열어 보니 그날 18시 42분(KST)에 시작해 1초 만에 "주간 사용량 한도에 걸렸다"는 메시지로 끝나 있었습니다. 한도는 같은 날 19시에 풀렸습니다. 그런데 이 실행은 실패가 아니라 "성공(오류 있음)"으로 기록돼서 알림이 어디로도 가지 않았습니다. 나머지 세 날은 실행 기록을 거슬러 보지 않아 원인을 확인하지 못했습니다.

학습일지 칸을 하루도 거르지 않으려면 빠졌다는 사실을 그날 알아야 합니다. 그래서 10월 5일에 두 가지를 추가했습니다.

1. 감시: GitHub Actions 워크플로 `daily-watchdog.yml`을 만들었습니다. 매일 22시(KST)에 그날의 `vault/daily/날짜.md`가 있는지 보고, 없으면 제 텔레그램 개인 대화로 알립니다. 구독자가 있는 공개 채널로는 보내지 않습니다.
2. 재시도: 클라우드 루틴을 하나 더 만들었습니다. 20시 30분(KST)에 그날 데일리가 이미 있으면 확인만 하고 끝내고, 없으면 정규 파이프라인을 다시 돌립니다.

감시는 빠진 날(10월 1일)과 있는 날(10월 3일)을 번갈아 넣어 시험했습니다.

```
gh workflow run daily-watchdog.yml -f date=2026-10-01
gh workflow run daily-watchdog.yml -f date=2026-10-03
```

```
MISSING: vault/daily/2026-10-01.md 없음
DM 발송 완료
OK: vault/daily/2026-10-03.md 있음
```

10월 1일에는 알림이 갔고 10월 3일에는 아무것도 가지 않았습니다. 재시도 루틴은 첫 실행(10월 5일 20시 33분)에서 그날 데일리가 이미 있다는 것만 확인하고 14초 만에 끝났습니다. 빠진 날에 실제로 다시 돌아가는지는 아직 보지 못했습니다.

## **결과와 배운 점**

**측정 결과**

**항목**

**값**

점검 대상

econ-radar 허브(`vault/`)와 paper-radar 일부, 원격 저장소 기준

템플릿 칸 8개

있음 3, 일부 3, 없음 2

학습일지 칸

날짜 파일 115개, 119일 중 4일 빠짐 (6/12, 7/22, 8/1, 10/1)

개념 칸

`topics` 99개, 9월 28일 이후 15개 갱신

회고 칸

주간 동향 리포트 17주 연속 (W24부터 W40)

사례 칸

econ-radar 초안 3개, paper-radar 초안 4개

로드맵, 계획 칸

이름에 든 파일 0개

10월 1일 누락 원인

클라우드 실행의 주간 사용량 한도 (같은 날 19시에 해제)

추가한 장치

22시 감시 알림, 20시 30분 재시도

**배운 점**

1. **자동 발행 허브는 "한 일의 기록"이 아니라 "만든 것의 기록"으로 쌓였습니다.** 학습일지 칸에는 날짜 파일 115개가 있지만 모두 뉴스 발행본입니다. 템플릿이 학습일지에 기대한 것은 AI가 내 맥락을 알게 되는 것이었는데, 제가 그날 무엇을 결정하고 고쳤는지는 daily에 남지 않고 커밋 기록과 `_meta`의 개선 로그에 흩어져 있습니다. 개수로는 채워졌는데 목적은 비어 있는 칸입니다.
2. **비어 있던 두 칸은 모두 앞으로의 일을 적는 칸이었습니다.** 로드맵과 계획이 0개입니다. 지금까지 발행 구조는 매번 불편이 생길 때마다 고쳐 왔고, 어디까지 가겠다는 글은 허브 안에 없었습니다. 10월 1일을 놓친 뒤에야 감시를 만든 것도 같은 모양입니다. 빠졌을 때 어떻게 한다는 규칙이 미리 적혀 있지 않았습니다.
3. **빠진 날은 개수가 아니라 달력으로 보아야 드러났습니다.** 116개나 115개라는 숫자는 그럴듯해 보였습니다. 119일과 대 보고 나서야 네 날이 보였고, 그중 세 날은 지금도 원인을 모릅니다.
4. **칸이 하나 있다는 것과 그 칸이 하는 일이 되고 있다는 것은 다릅니다.** 이번 점검은 파일 이름만 봤습니다. 개념 칸의 99개가 서로 이어져 쓸모 있는지, 회고 17주가 실제로 다음 발행을 바꿨는지는 읽어 보지 않았습니다.

**시행착오**

- 처음에는 한글 파일 이름이 `\355\225\234`처럼 8진수 코드로 나와 `topics`를 23개, `reports`를 1개로 셌습니다. 실제는 99개와 18개였습니다. `core.quotepath=off`를 켜고 NFC로 맞춰 다시 셌습니다. 폴더별 개수를 `awk`로 센 값은 처음부터 맞았는데, 파일 이름을 정규식으로 거른 쪽만 어긋난 것입니다.
- 학습일지 칸을 처음에는 "있음"으로 적으려 했습니다. 115개가 날짜 이름으로 이어져 있었기 때문입니다. 그런데 이 폴더가 매일 뉴스레터 본문을 담는 곳이라는 발행 구조를 떠올리고, 내 작업 기록이 아니어서 일부로 내렸습니다.
- 감시 시험은 모의가 아니라 실제 발송입니다. 실제로 빠졌던 10월 1일을 시험 날짜로 골라 알림이 나가는 경우와 안 나가는 경우를 한 번에 확인했지만, 알림 문구가 시험인지 실제 누락인지 구분되지 않는 점은 아직 고치지 못했습니다.

이 점검은 2026년 10월 6일에 `~/projects/econ-radar`(origin/main)와 `~/projects/paper-radar`(origin/master)의 `vault/` 아래 파일 이름과 폴더를 세어 낸 결과입니다. 파일 내용은 열지 않았고 칸 대응은 이름과 폴더, 제가 아는 발행 구조로 판단했으며 분석 품질이나 서로의 연결은 평가하지 않았습니다. 감시 시험은 10월 1일과 10월 3일 두 날짜로만 했습니다.

## **도움 받은 글**

- AI놀이터 1주차 강의 (아루나, 황금호랑이): 학습일지에서 사례글, 학습위키, 전자책으로 이어지는 기록 순서, "학습일지는 매일" 당부
- learning-hub-template 저장소 README: 글 종류 여덟 가지(랜딩, 프로젝트 카드, 학습일지, 로드맵, 계획, 개념, 사례, 회고)와 학습메이트 스킬 10개
