CAPSTONE 7 / PLAYBOOK FOUNDRY / 135 MIN

내 기술분야 플레이북, 파운드리

신호 필터 → 페이지 생성 → 신선도 게이트 → 출고, 스스로 안 낡는 지식 자산

내가 가장 자주 질문받는 기술분야를 하나 골라, 검증 우선(THE FILTER) 큐레이션 방법론으로 나만의 플레이북 사이트를 만듭니다. Claude Code가 마스터 프롬프트 하나로 페이지를 규격대로 찍어내고, 신선도 메타데이터와 출고 게이트가 문서가 낡는 것을 감시합니다. 실존 프로젝트 pai-playbook(Physical AI Playbook, 4개 언어 운영)의 골격을 135분 스코프로 압축했습니다. API 키가 필요 없고, 로컬에서 완결됩니다.

소요 시간 135분 미션 5개 + 피날레 산출물 출고 게이트를 통과한 내 도메인 플레이북 Update 2026.08
MISSION BRIEFING

지식을 제품처럼 출고하는 법

숙지

다른 캡스톤과 같은 기조입니다: 빈 폴더에서 Claude Code와 함께 설계하고 미션 단위로 빌드합니다. 다른 점이 하나 있습니다. 이번 산출물은 서비스가 아니라 지식 자산이고, 적은 코드로 콘텐츠의 품질과 신선도를 구조적으로 강제하는 것이 미션입니다.

파이프라인, 이 캡스톤이 만드는 것
후보 항목 (뉴스, 논문, 릴리스 노트, 데모)
        │
        ▼
  THE FILTER (4기준 중 2개 이상) ──미달──▶ docs/radar.md (한 줄 대기열)
        │ 통과
        ▼
  필러 페이지 5장 (성숙도 라벨 + 다음 액션 + front matter 메타데이터)
        │
        ▼
  출고 게이트 ship.sh
    [1/3] check_freshness.py   [2/3] 성숙도 라벨 lint   [3/3] mkdocs build --strict
        │ 전부 통과
        ▼
  site/ (정적 사이트, 어디에나 배포 가능)

지키는 규칙은 세 줄입니다.

규칙의미
검증 없이 본문 없음THE FILTER 미달 후보는 radar 대기열에 한 줄로만 남는다
모든 항목은 다음 액션으로 끝난다개념 설명으로 끝나는 항목은 미완성이다
낡음은 게이트가 감시한다모든 페이지에 owner, updated, volatility를 붙이고 기한을 스크립트로 판정한다
L학습 목표, Level 200

이 캡스톤을 마치면 다음 네 가지를 설명할 수 있고, 다시 만들 수 있습니다.

목표검증되는 순간
정보 더미를 신호로 거르는 포함 기준(THE FILTER)을 설계하는 법M1에서 4개 기준을 내 도메인의 언어로 확정할 때
마스터 프롬프트 하나로 페이지를 규격대로 찍어내는 법M2에서 다섯 페이지가 같은 골격(L0/Top3/L1 표)으로 나올 때
메타데이터로 문서의 낡음을 감시하는 법M3에서 과거 날짜 페이지가 REVIEW NEEDED로 잡힐 때
품질 규율을 스크립트 게이트로 강제하는 법M4에서 불량 페이지가 출고를 막는 것을 관측할 때
원작이 있습니다 이 캡스톤의 골격은 실제 운영 중인 Physical AI Playbook에서 왔습니다. 원작은 여기에 4개 언어 번역 드리프트 감지(ko_hash), 주간 자동 레이더 스캔, CI 배지 주입까지 얹어 운영합니다. 오늘 만드는 것은 그 심장부인 필터, 규격, 게이트입니다.
완성 예시 갤러리, 영감이 필요할 때 다른 미션들의 완성 예시가 Capstone Showcase에 전시되어 있습니다. 특히 01 서울 청약 열람소는 이 미션과 같은 계열, "지식을 정적 사이트로 출고"를 다른 도메인에서 해낸 결과물입니다. 장 구성과 안내 문장의 밀도를 내 플레이북의 마감 기준으로 삼으세요, 주제 선택은 자유입니다.
MISSION 00

사전 준비, 도구와 원작 견학

10분

이 캡스톤은 API 키가 필요 없습니다. Python 가상환경과 MkDocs만 준비하면 끝입니다.

1작업 디렉토리와 가상환경
Terminal, 전체 복사
mkdir -p ~/capstone/capstone-7 && cd ~/capstone/capstone-7
python3 -m venv .venv && source .venv/bin/activate
pip -q install mkdocs-material pytest
mkdocs --version
출력 예시
mkdocs, version 1.6.1 from .../capstone-7/.venv/... (Python 3.9)
이후 모든 터미널은 이 가상환경에서 새 터미널을 열었다면 먼저 cd ~/capstone/capstone-7 && source .venv/bin/activate. mkdocs: command not found가 보이면 십중팔구 활성화를 빼먹은 것입니다.
2원작 견학, 5분

comeddy.github.io/pai-playbook을 열고 세 가지만 관찰하세요. 오늘 전부 직접 만들 것들입니다.

관찰 포인트어디서
항목마다 붙은 성숙도 라벨 🟢🟡🔵⚪아무 필러 페이지의 표
본문에 못 들어온 후보들의 대기열Radar 페이지
페이지마다 다른 리뷰 주기(volatility)페이지 하단 메타데이터
CHECKPOINT
MISSION 01

도메인 선정과 마스터 프롬프트

25분

플레이북의 헌법을 만듭니다: 도메인, 독자, 필러 5개, 그리고 THE FILTER 4기준.

이 미션의 바탕 학습: Ch1의 세션 운용과 Capstone Setup의 superpowers 워크플로.

1도메인 고르기, 3분 안에

세 가지가 겹치는 분야가 정답입니다: ① 내가 실제로 질문받는 분야 ② 후보 항목이 20개 이상 바로 떠오르는 분야 ③ 6개월이면 낡는 정보가 섞여 있는 분야. 마땅치 않으면 아래에서 하나를 가져가세요.

도메인 예시필러가 될 만한 축독자 예시
GenAI 애플리케이션 보안프롬프트 인젝션 방어, 데이터 유출 통제, 평가와 레드팀, 가드레일 운영, 규제 대응보안 검토를 받는 개발팀
Kubernetes 운영(EKS)업그레이드 전략, 오토스케일링, 비용 최적화, 관측성, 장애 대응플랫폼 엔지니어
데이터 엔지니어링수집 파이프라인, 테이블 포맷, 오케스트레이션, 품질 게이트, 거버넌스분석 조직의 DE
프론트엔드 성능Core Web Vitals, 번들링, 렌더링 전략, 이미지와 폰트, 계측웹 서비스 프론트엔드 팀
2마스터 프롬프트 골격 배치

원작에서 가져온 골격입니다. 《...》 부분만 내 도메인으로 채우면 됩니다.

Terminal (~/capstone/capstone-7), 전체 복사
cat > PROMPT.md << 'PSKEOF'
# 《도메인》 Playbook, Master 생성 프롬프트

> 목적: 《도메인》 정보 더미(블로그, 논문, 릴리스 노트, 데모)를 그대로 옮겨 담는 게 아니라,
> 신호를 거르고(signal filter), 실행 가능하게 만들고(actionable), 스스로 안 낡게(self-fresh) 만드는
> 참조 자산을 생성하기 위한 시스템 프롬프트.
> 사용법: 페이지 단위로 하나씩 생성하고 검토한 뒤 다음으로 진행한다. 한 번에 전체를 생성하지 않는다.

## 1. 역할과 미션

당신은 《도메인》 큐레이터다. 산출물은 《독자》가 질문을 받았을 때
5분 안에 방향, 근거, 다음 액션을 찾는 참조 자산이다. 뉴스 아카이브가 아니다.

세 가지 원칙을 어기면 산출물을 폐기한다:
1. 신호 > 노이즈: "새로 나왔다"는 이유만으로 포함하지 않는다. THE FILTER를 통과한 것만 담는다.
2. 실행 가능성: 모든 항목은 "그래서 무엇을 하면 되는가"로 끝나야 한다.
3. 자기 갱신성: 모든 페이지에 owner, updated, volatility 메타데이터를 붙인다.

## 2. 독자와 깊이 계층

독자는 《독자》. 성숙도가 제각각이므로 문서를 나누지 않고 깊이를 계층화한다:
- L0 (TL;DR): 1~2문장. 상단만 읽어도 방향을 잡는다.
- L1 (1페이지 요약): 핵심 개념 + 의사결정 기준 + 매핑 표.
- L2 (Deep-dive): 링크나 접기(collapse)로 분리한다.

## 3. 범위, 5개 필러 (IA 고정)

1. 《필러 1》
2. 《필러 2》
3. 《필러 3》
4. 《필러 4》
5. 《필러 5》

각 필러 상단에 "이 필러에서 가장 자주 받는 질문 Top 3"를 배치한다.

## 4. 포함 기준 (THE FILTER)

후보 항목은 아래 4개 중 최소 2개를 충족해야 본문에 들어간다. 미달이면 radar.md에 한 줄로만 기록:
- [ ] ⓐ 《검증 기준: production 또는 실사용에서 검증됨》
- [ ] ⓑ 《매핑 기준: 우리 스택/서비스와 구체적으로 연결 가능》
- [ ] ⓒ 《수요 기준: 실제로 질문받은 이력이 있음》
- [ ] ⓓ 《성숙 기준: GA이거나 명확한 GA 로드맵이 있음》

화려한 데모가 성숙한 역량을 가리는 경우가 많다. "인상적 데모"와 "배포 가능"을 분리 표기한다.

## 5. 성숙도 라벨 (모든 항목 필수)

🟢 GA / 🟡 Preview / 🔵 Research-only / ⚪ Hype(데모만)

## 6. 페이지 규격 (모든 필러 페이지 공통)

- 파일 첫머리에 front matter: owner, updated(YYYY-MM-DD), volatility(1m/3m/6m)
- 순서: L0 TL;DR → 자주 받는 질문 Top 3 → L1 표(항목, 성숙도, 다음 액션) → L2 접기
- 모든 항목 행에 성숙도 라벨과 "다음 액션" 한 줄이 있어야 완성이다
PSKEOF
3Claude와 함께 《》 채우기
Terminal (~/capstone/capstone-7)
claude
Claude 세션 입력, 전체 복사
/superpowers:brainstorming PROMPT.md를 읽어라. 나와 함께 《...》 placeholder를 전부 채워
"내 기술분야 플레이북"의 마스터 프롬프트를 완성하자.
1) 먼저 내게 도메인과 독자를 물어라. 내 답을 그대로 쓰지 말고 더 좁고 구체적으로 다듬어 제안하라
2) 필러 5개: 상호배타적이고 도메인 전체를 덮게. 각 필러에 한 줄 정의를 붙여 내 확인을 받아라
3) THE FILTER 4기준(ⓐ검증 ⓑ매핑 ⓒ수요 ⓓ성숙)을 내 도메인의 언어로 다시 써라.
   예: "production 검증"이 이 도메인에서 정확히 무엇을 뜻하는지
4) 성숙도 라벨 4종과 페이지 규격(섹션 6)은 그대로 유지하라
5) 확정되면 PROMPT.md를 덮어써 저장하라. 《》가 하나도 남지 않아야 완료다
결정이 필요하면 이 범위 안에서 최소한으로만 물어봐.
Terminal, 완료 검사
grep -c '《' PROMPT.md   # 0이어야 완료
여기서 시간을 쓰는 게 남는 장사 THE FILTER가 느슨하면 M5에서 모든 후보가 통과해 버려 필터가 무의미해집니다. "데모 영상만으로는 불충분" 같은 탈락 조건이 기준마다 한 줄씩 있는지 확인하세요.
DEFINITION OF DONE
MISSION 02

뼈대와 다섯 페이지

35분

사이트 뼈대를 깔고, 마스터 프롬프트로 필러 페이지 5장을 같은 규격으로 찍어냅니다.

1뼈대 배치, 파일 두 장

파일명은 규격입니다: 필러 페이지는 p1.md부터 p5.md, 대기열은 radar.md. M3와 M4의 게이트 스크립트가 이 이름을 봅니다.

Terminal 1/2, 전체 복사
mkdir -p docs scripts tests
cat > mkdocs.yml << 'MKDEOF'
site_name: Playbook Foundry
theme:
  name: material
  language: ko
  palette:
    scheme: slate
    primary: deep orange
  features:
    - navigation.sections
    - content.code.copy
nav:
  - 홈: index.md
  - 필러:
      - 필러 1: p1.md
      - 필러 2: p2.md
      - 필러 3: p3.md
      - 필러 4: p4.md
      - 필러 5: p5.md
  - Radar 대기열: radar.md
MKDEOF
Terminal 2/2, 전체 복사
cat > docs/index.md << 'IDXEOF'
---
owner: me
updated: 2026-08-09
volatility: 6m
---

# 이 플레이북을 읽는 법

질문을 받았을 때 5분 안에 방향, 근거, 다음 액션을 찾는 참조 자산입니다. 뉴스 아카이브가 아닙니다.

## 이 사이트의 규칙

- 모든 항목은 THE FILTER(4개 기준 중 2개 이상)를 통과해야 본문에 들어옵니다.
- 미달 후보는 [Radar 대기열](radar.md)에 한 줄로만 기록됩니다.
- 성숙도 라벨: 🟢 GA / 🟡 Preview / 🔵 Research-only / ⚪ Hype(데모만)
- 모든 페이지는 owner, updated, volatility 메타데이터를 가지며 기한이 지나면 게이트가 경고합니다.

## 필러

| 필러 | 한 줄 소개 |
|---|---|
| [필러 1](p1.md) | (M2에서 채웁니다) |
| [필러 2](p2.md) | (M2에서 채웁니다) |
| [필러 3](p3.md) | (M2에서 채웁니다) |
| [필러 4](p4.md) | (M2에서 채웁니다) |
| [필러 5](p5.md) | (M2에서 채웁니다) |
IDXEOF
2페이지 단위 생성, 원작의 리듬

원작 마스터 프롬프트의 사용법 그대로입니다: 한 번에 전체를 생성하지 않고, 페이지 단위로 생성하고 검토합니다. LLM 콘텐츠 파이프라인의 기본 리듬입니다.

Claude 세션 입력, 전체 복사
PROMPT.md를 읽고 그 규격을 시스템 지침으로 삼아라. 필러 페이지를 생성한다.
1) docs/p1.md부터 docs/p5.md까지 다섯 장, mkdocs.yml nav 순서대로 한 장씩:
   내가 "다음"이라고 하면 다음 페이지로 넘어간다. 각 장의 규격(PROMPT.md 섹션 6):
   - 첫머리 front matter: owner는 내 이름, updated는 오늘(YYYY-MM-DD),
     volatility는 페이지 성격에 맞게 1m/3m/6m 중 택일하고 이유를 한 줄 말하라
   - L0 TL;DR(2문장 이내) → 자주 받는 질문 Top 3 → L1 표(항목/성숙도/다음 액션, 4~6행)
   - 성숙도는 반드시 🟢 GA / 🟡 Preview / 🔵 Research-only / ⚪ Hype 중 하나
   - L2 심화는 details 태그 접기로 1~2개만
2) docs/radar.md: front matter(volatility 1m) + 표 헤더(후보/판정/근거)만, 행은 M5에서 채운다
3) 다섯 장이 끝나면 mkdocs.yml nav의 "필러 n" 라벨과 index.md의 필러 표를 실제 이름으로 갱신하라
사실 확신이 없는 항목은 지어내지 말고 성숙도를 ⚪로 적고 "검증 필요"를 다음 액션에 남겨라.
환각을 규격으로 눌러 두기 마지막 줄이 이 미션의 안전벨트입니다. 플레이북은 참조 자산이라 틀린 확신이 빈칸보다 나쁩니다. 생성된 표를 훑으며 낯선 항목이 있으면 성숙도가 ⚪인지, 다음 액션에 검증 경로가 있는지 확인하세요.
3strict 빌드와 첫 화면
Terminal, 전체 복사
mkdocs build --strict && mkdocs serve
출력 예시
INFO    -  Documentation built in 0.42 seconds
INFO    -  [15:30:00] Serving on http://127.0.0.1:8000/

브라우저에서 http://127.0.0.1:8000을 엽니다. 좌측 내비게이션에 필러 5개와 Radar 대기열이 보이면 성공입니다. 확인 후 Ctrl+C로 serve를 멈추세요.

--strict가 하는 일 nav에 있는데 파일이 없거나, 깨진 내부 링크가 있으면 빌드 자체가 실패합니다. 원작은 이 옵션 하나로 "죽은 링크가 라이브 사이트에 나가는 사고"를 구조적으로 없앴습니다.
DEFINITION OF DONE
MISSION 03

신선도 게이트, 테스트 먼저

30분

모든 페이지의 updated + volatility로 리뷰 기한을 판정하는 스크립트를 TDD로 만듭니다. 스펙은 테스트가 말합니다.

이 미션의 바탕 학습: Ch2의 superpowers:test-driven-development.

1스펙 배치, RED 확인

테스트 파일이 곧 요구사항 문서입니다. 아직 구현이 없으니 실패해야 정상입니다.

Terminal, 전체 복사
cat > tests/test_freshness.py << 'TSTEOF'
"""신선도 게이트 스펙. scripts/check_freshness.py가 이 테스트를 전부 통과해야 M3 완료.
실행: .venv/bin/python -m pytest tests/ -q"""
import datetime
import importlib.util
import pathlib

_spec = importlib.util.spec_from_file_location(
    "check_freshness",
    pathlib.Path(__file__).resolve().parents[1] / "scripts" / "check_freshness.py")
assert _spec is not None and _spec.loader is not None
cf = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(cf)

TODAY = datetime.date(2026, 8, 9)

FRESH = """---
owner: me
updated: 2026-08-01
volatility: 3m
---
# 최근 페이지
"""

STALE = """---
owner: me
updated: 2026-01-05
volatility: 1m
---
# 오래된 페이지
"""

NO_META = """# 메타데이터가 없는 페이지
본문만 있다.
"""


def test_parse_meta_reads_front_matter():
    meta = cf.parse_meta(FRESH)
    assert meta["owner"] == "me"
    assert meta["updated"] == "2026-08-01"
    assert meta["volatility"] == "3m"


def test_parse_meta_returns_none_without_front_matter():
    assert cf.parse_meta(NO_META) is None


def test_classify_fresh_page_is_ok():
    assert cf.classify(cf.parse_meta(FRESH), TODAY) == "ok"


def test_classify_overdue_page_needs_review():
    assert cf.classify(cf.parse_meta(STALE), TODAY) == "review"


def test_classify_missing_meta():
    assert cf.classify(None, TODAY) == "missing"


def test_scan_exit_code(tmp_path):
    docs = tmp_path / "docs"
    docs.mkdir()
    (docs / "a.md").write_text(FRESH)
    (docs / "b.md").write_text(STALE)
    assert cf.scan(docs, TODAY) == 0          # review는 경고일 뿐 통과
    (docs / "c.md").write_text(NO_META)
    assert cf.scan(docs, TODAY) == 2          # 메타데이터 누락은 차단
TSTEOF
.venv/bin/python -m pytest tests/ -q
출력 예시 (RED, 아직 구현이 없다)
ERROR tests/test_freshness.py - FileNotFoundError: [Errno 2] No such file or directory:
'.../capstone-7/scripts/check_freshness.py'.
2Claude에게 구현을 맡기기, GREEN까지
Claude 세션 입력, 전체 복사
/superpowers:test-driven-development tests/test_freshness.py를 읽어라. 이 테스트 6개를 전부
통과하는 scripts/check_freshness.py를 구현하라.
1) 표준 라이브러리만 사용. 함수는 테스트가 부르는 그대로: parse_meta(text), classify(meta, today),
   scan(docs_dir, today)
2) volatility 기한: 1m=30일, 3m=90일, 6m=180일. updated에서 기한을 넘기면 "review"
3) scan은 페이지별 판정 표를 출력하고 exit code를 돌려준다:
   메타데이터 누락이 하나라도 있으면 2, 아니면 0 (review는 경고일 뿐 통과다)
4) __main__에서는 docs/를 스캔해 sys.exit로 끝낸다
5) 구현 후 .venv/bin/python -m pytest tests/ -q 로 6 passed를 보여라
출력 예시 (GREEN)
......                                                                   [100%]
6 passed in 0.01s
왜 "review는 통과"인가 낡음(review)은 사람이 검토할 일이지 출고를 막을 일이 아닙니다. 반면 메타데이터 누락은 감시 자체가 불가능한 상태라 차단합니다. 원작도 같은 정책입니다: 낡음은 배지로 경고하고, 메타데이터가 없으면 CI가 막습니다.
3낡음 실험, 시간을 감아 보기
Terminal, 전체 복사
sed -i 's/^updated: .*/updated: 2026-01-05/' docs/p1.md
python3 scripts/check_freshness.py
sed -i "s/^updated: .*/updated: $(date +%F)/" docs/p1.md
python3 scripts/check_freshness.py
출력 예시 (첫 실행은 REVIEW, 둘째는 전부 OK)
  index.md  OK
  p1.md     REVIEW NEEDED
  p2.md     OK
막힐 때 열어보기, 완성본 scripts/check_freshness.py
scripts/check_freshness.py
"""페이지 신선도 점검. 사용: python3 scripts/check_freshness.py [docs디렉토리]
front matter의 updated + volatility(1m/3m/6m)로 리뷰 기한을 판정한다.
exit 0: 통과(review는 경고만), exit 2: 메타데이터 누락 페이지 존재."""
import datetime
import pathlib
import sys

VOLATILITY_DAYS = {"1m": 30, "3m": 90, "6m": 180}


def parse_meta(text):
    """front matter(--- ... ---)를 dict로. 없으면 None."""
    lines = text.splitlines()
    if not lines or lines[0].strip() != "---":
        return None
    meta = {}
    for line in lines[1:]:
        if line.strip() == "---":
            return meta if meta else None
        if ":" in line:
            key, value = line.split(":", 1)
            meta[key.strip()] = value.strip()
    return None


def classify(meta, today):
    """'ok' / 'review'(기한 경과) / 'missing'(메타데이터 불량)"""
    if not meta or "updated" not in meta or "volatility" not in meta:
        return "missing"
    days = VOLATILITY_DAYS.get(meta["volatility"])
    if days is None:
        return "missing"
    try:
        updated = datetime.date.fromisoformat(meta["updated"])
    except ValueError:
        return "missing"
    return "review" if (today - updated).days > days else "ok"


def scan(docs_dir, today):
    """docs의 모든 .md를 판정해 표를 찍고 exit code를 돌려준다."""
    rows = []
    for page in sorted(pathlib.Path(docs_dir).glob("*.md")):
        rows.append((page.name, classify(parse_meta(page.read_text()), today)))
    width = max(len(name) for name, _ in rows) if rows else 10
    mark = {"ok": "OK", "review": "REVIEW NEEDED", "missing": "MISSING META"}
    for name, verdict in rows:
        print("  %-*s  %s" % (width, name, mark[verdict]))
    if any(v == "missing" for _, v in rows):
        return 2
    return 0


if __name__ == "__main__":
    target = sys.argv[1] if len(sys.argv) > 1 else "docs"
    sys.exit(scan(target, datetime.date.today()))
DEFINITION OF DONE
MISSION 04

출고 게이트, 규율의 자동화

20분

신선도, 라벨 lint, strict 빌드를 한 줄로 묶습니다. 셋 중 하나라도 실패하면 출고가 없습니다.

1게이트 배치
Terminal, 전체 복사
cat > ship.sh << 'SHPEOF'
#!/usr/bin/env bash
# 출고 게이트: 셋 중 하나라도 실패하면 site/를 만들지 않는다.
set -euo pipefail

echo "[1/3] 신선도 메타데이터"
python3 scripts/check_freshness.py

echo "[2/3] 성숙도 라벨 lint"
missing=0
for f in docs/p*.md; do
  if ! grep -q "🟢\|🟡\|🔵\|⚪" "$f"; then
    echo "  성숙도 라벨 없음: $f"
    missing=1
  fi
done
test "$missing" -eq 0

echo "[3/3] mkdocs build --strict"
mkdocs build --strict

echo "GATE PASS, site/ 준비 완료"
SHPEOF
chmod +x ship.sh
2통과 확인
Terminal
./ship.sh
출력 예시
[1/3] 신선도 메타데이터
  index.md  OK
  p1.md     OK
  ...
[2/3] 성숙도 라벨 lint
[3/3] mkdocs build --strict
INFO    -  Documentation built in 0.41 seconds
GATE PASS, site/ 준비 완료
3실패 주입, 게이트가 정말 막는지

라벨도 메타데이터도 없는 불량 페이지를 심고 게이트에 태워 봅니다. 파일명이 p9.md인 이유: 라벨 lint가 docs/p*.md를 보기 때문입니다.

Terminal, 전체 복사
echo "# 라벨도 메타데이터도 없는 페이지" > docs/p9.md
./ship.sh; echo "exit=$?"
rm docs/p9.md
./ship.sh; echo "exit=$?"
출력 예시 (차단 후 복구)
[1/3] 신선도 메타데이터
  p9.md     MISSING META
exit=2
...
GATE PASS, site/ 준비 완료
exit=0
set -euo pipefail 한 줄의 힘 ship.sh의 둘째 줄이 게이트의 본체입니다. 어느 단계든 0이 아닌 exit code를 내면 그 자리에서 멈추고, GATE PASS는 영원히 출력되지 않습니다. 규율을 기억력이 아니라 스크립트에 맡기는 방법입니다.
DEFINITION OF DONE
MISSION 05

피날레, THE FILTER 실사격

15분

진짜 후보들을 필터에 태웁니다. 떨어지는 후보가 있어야 필터입니다.

1후보 6건 판정
Claude 세션 입력, 전체 복사
내 도메인에서 최근 1년 사이 화제가 된 후보 항목 6건을 뽑아라. 조건:
절반은 데모나 발표만 화려하고 실전 검증이 부족한 것으로 일부러 섞어라.
1) 후보 6건을 PROMPT.md의 THE FILTER 4기준(ⓐⓑⓒⓓ)으로 판정하는 표를 보여라:
   후보 / ⓐ / ⓑ / ⓒ / ⓓ / 판정(승급 또는 대기). 2개 미만 충족이면 대기다
2) 대기 후보들은 docs/radar.md 표에 근거 한 줄과 함께 추가하라
3) 승급 후보 중 1건을 골라 해당 필러 페이지 L1 표에 추가하라:
   성숙도 라벨과 다음 액션 필수, 그 페이지의 updated를 오늘로 갱신
4) 확신이 없는 판정은 그렇다고 말하고 보수적으로(대기 쪽으로) 판정하라
전원 승급은 실패 신호 6건이 모두 승급했다면 필터가 느슨한 것입니다. M1로 돌아가 기준에 탈락 조건을 한 줄씩 추가하고 다시 판정하세요. 원작 운영에서도 후보의 절반 이상은 Radar에 머뭅니다.
2최종 출고
Terminal
./ship.sh

GATE PASS가 뜨면 site/에 완성된 정적 사이트가 있습니다. mkdocs serve로 마지막으로 열어 오늘 승급한 항목을 눈으로 확인하세요.

DEFINITION OF DONE
OPTION

웹 공개, GitHub Pages

+15분

출고 게이트를 통과한 사이트를 진짜 URL로 만듭니다. GitHub 계정과 gh CLI 인증이 있는 경우에만 진행하세요.

Terminal, 전체 복사
cd ~/capstone/capstone-7
printf '.venv/\nsite/\n' > .gitignore
git init -b main && git add -A && git commit -m "my playbook v1"
gh repo create my-playbook --public --source . --push
mkdocs gh-deploy --force

끝나면 https://<내 GitHub 계정>.github.io/my-playbook/에서 전 세계 어디서나 내 플레이북이 열립니다. 이 랩 문서 자체도 같은 방식으로 배포되어 있습니다.

원작의 다음 단계가 궁금하다면 push마다 게이트를 CI로 돌리고 싶다면 GitHub Actions에 ship.sh를 그대로 올리면 됩니다. 원작 리포(comeddy/pai-playbook)의 workflows 디렉토리가 살아 있는 예제입니다.
OPTION DONE, 진행률 미집계
부록

컷라인과 트러블슈팅

참고

시간이 부족하면 이 순서로 잘라내세요. 피날레(M5)는 남기는 것이 원칙입니다.

상황컷라인
20분 부족M3 step 3(낡음 실험)과 M4 step 3(실패 주입)을 건너뛰고 통과 경로만 확인
40분 부족위에 더해, 필러를 3장으로 축소(mkdocs.yml nav에서 p4/p5 제거, index.md 표도 3행으로) 후 M5 후보는 3건만
60분 부족위에 더해, M3 구현을 솔루션 접기에서 복사해 배치하고 pytest 통과만 확인

막히면 여기부터.

증상원인처방
mkdocs: command not found가상환경 비활성cd ~/capstone/capstone-7 && source .venv/bin/activate
strict 빌드 실패: nav 파일 없음페이지 파일명이 규격과 다름docs/에 p1.md~p5.md, radar.md가 정확히 있는지 확인
pytest가 ERROR로 시작M3 step 1 직후라면 정상(RED)구현 후에도 그렇다면 scripts/check_freshness.py 경로와 철자 확인
8000 포트가 이미 사용 중이전 serve가 살아 있음mkdocs serve -a 127.0.0.1:8001로 우회
PROMPT.md에 《》가 남음M1 세션이 일부만 채움M1 step 3 프롬프트를 다시 실행, grep -c '《' PROMPT.md가 0이어야
게이트 [2/3]에서 라벨 없음페이지에 성숙도 이모지가 없음해당 페이지 L1 표의 성숙도 열에 🟢🟡🔵⚪ 중 하나를 채움

미션 종료

필터가 품질을 만들고, 메타데이터가 신선도를 지키고, 게이트가 규율을 강제합니다. 지식을 제품처럼 출고하는 문법입니다.

가져가는 것내용
THE FILTER포함 기준을 먼저 못 박으면 콘텐츠 품질이 그때그때의 프롬프트가 아니라 구조에서 나온다
자기 갱신성owner, updated, volatility 세 줄이 문서를 "낡으면 스스로 알리는" 자산으로 바꾼다
출고 게이트기억에 맡긴 규율은 무너진다, 스크립트가 강제하는 규율만 살아남는다
이식처팀 위키, 온보딩 문서, 기술 레이더, 사내 표준 문서. 지식 자산이면 같은 골격이 통한다
NEXT

포털로

다른 캡스톤(1 Press Start, 2 Market Desk on Web, 3 Frame It, 4 Trend Radar)도 같은 리듬입니다. 워크샵 포털에서 다음 미션을 고르세요.