
Agnt
- 14 installs
- 1 repo stars
- Updated April 8, 2026
- october-academy/agnt
Helps with ai & agent building tasks.
About
agnt is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- agnt
- AI & Agent Building
- AI-coding skill
Agnt by the numbers
- 14 all-time installs (skills.sh)
- Ranked #11,296 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/october-academy/agnt --skill agntAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 14 |
|---|---|
| repo stars | ★ 1 |
| Last updated | April 8, 2026 |
| Repository | october-academy/agnt ↗ |
What it does
Helps with ai & agent building tasks.
Files
agnt
Agentic30 학습 여정을 안내하는 공용 Agent Skill입니다.
When To Use
다음 요청에서 이 스킬을 사용합니다.
- "agnt 시작", "day 0부터 시작", "학습 이어하기"
- "오늘 퀘스트 보여줘", "진행 상태 확인"
- "퀘스트 제출", "초기화"
- "Agentic30 인터뷰 기반으로 진행"
- Codex 명시형 호출:
$agnt-continue,$agnt-init,$agnt-today,$agnt-submit,$agnt-status
Runtime Setup
0) 에이전트 환경 분기
실행 환경을 먼저 확인합니다.
- Claude Code 환경:
/mcp명령이 사용 가능하거나 사용자가 Claude Code를 사용 중임 - Codex 환경:
codexCLI 사용 중임
이후 MCP 연결 절차를 환경별로 따릅니다.
1) MCP 연결 확인 (환경별)
A. Claude Code
agentic30 MCP 서버가 없으면 아래 순서로 안내합니다.
1. Claude Code 실행 2. 채팅 입력창에 /mcp 입력 3. 목록에서 agentic30 또는 plugin:agnt:agentic30 선택 4. Authenticate 선택 후 브라우저에서 Google 로그인 5. /mcp에서 connected 상태 확인
서버가 목록에 없으면 프로젝트 .mcp.json에 아래 항목을 추가합니다.
{
"mcpServers": {
"agentic30": {
"type": "http",
"url": "https://mcp.agentic30.app/mcp"
}
}
}그 뒤 Claude Code를 재시작하고 /mcp 인증을 다시 진행합니다.
B. Codex
agentic30 MCP 서버가 없으면 아래 순서로 안내합니다.
codex mcp add agentic30 --url https://mcp.agentic30.app/mcp
codex mcp login agentic30
codex mcp list이미 등록되어 있으면 codex mcp login agentic30만 다시 수행하면 됩니다.
2) 상태 파일 경로(AGNT_DIR)
아래 순서로 state 경로를 탐색합니다.
1. .claude/agnt/state.json 2. ~/.claude/agnt/state.json 3. .codex/agnt/state.json 4. ~/.codex/agnt/state.json 5. 둘 다 없으면 .claude/agnt/state.json 생성
3) references 경로(REFS_DIR)
아래 순서로 references 경로를 탐색합니다.
1. references/ (현재 스킬 디렉토리 기준) 2. {AGNT_DIR}/references 3. ~/.claude/plugins/marketplaces/agentic30/references 4. .agents/skills/agnt/references 5. ~/.codex/skills/agnt/references
Command Mapping
사용자 의도를 아래 파일로 매핑해 실행합니다.
- 이어하기:
commands/continue.md - 초기화:
commands/init.md - 오늘 퀘스트:
commands/today.md - 제출:
commands/submit.md - 상태:
commands/status.md
각 파일의 절차/규칙을 source of truth로 사용합니다.
Codex Command Style ($agnt-*)
Codex에서는 아래 명령을 canonical로 사용합니다.
$agnt-continue→commands/continue.md$agnt-init→commands/init.md$agnt-today→commands/today.md$agnt-submit→commands/submit.md$agnt-status→commands/status.md
호환 입력($agnt continue, $agnt init 등)도 동일하게 매핑합니다.
Agent Compatibility Rules
commands/*.md는 Claude Plugin 기준 문구(ToolSearch, AskUserQuestion, /mcp)를 포함합니다. Codex 등 다른 에이전트에서는 아래로 호환 처리합니다.
ToolSearch:- 가능하면 MCP 도구 목록/호출로
agentic30연결 여부를 확인합니다. - 확인 불가 시,
submit_practice또는get_leaderboard호출을 시도하고 실패를 연결 실패로 처리합니다. AskUserQuestion:- 일반 질문으로 대체하되, 선택지를 번호 목록으로 명시합니다.
/mcp안내:- Claude Code에서는
/mcp안내를 그대로 사용합니다. - Codex에서는
codex mcp add/login/list명령으로 치환합니다. - 경로 안내:
- Codex에서
commands/*.md를 읽을 때.claude/agnt경로 표기가 나오면.codex/agnt를 우선 사용합니다. - 명령 파싱 우선순위:
1. $agnt-<subcommand> canonical 입력 2. $agnt <subcommand> 호환 입력 3. 자연어 의도 입력 (예: "오늘 퀘스트 보여줘")
Core Behavior Rules
- 한국어로 진행하고 기술 용어는 원문(MCP, OAuth, CLI) 유지
references/shared/narrative-engine.md의 STOP PROTOCOL 준수- 블록/퀘스트 판정은 각 Day의
index.json우선 - MCP 연결 실패 시 fail-closed (완료 제출/동기화 금지)
- Day 1
block3-deploy는deploy_landingMCP 경로를 우선 사용 - Day 1
block3-deploy의deploy_landing호출에는formSchema(landing.html form 필드 기반 JSON 배열 문자열)를 반드시 포함
{
"name": "agentic30",
"owner": {
"name": "October Academy",
"email": "hello@october-academy.com"
},
"metadata": {
"description": "Agentic30 학습 가이드 — MUD 스타일 30일 독립 개발자 여정"
},
"plugins": [
{
"name": "agnt",
"source": "./",
"description": "Agentic30 학습 가이드 — MUD 스타일 30일 독립 여정 커맨드",
"version": "1.4.0",
"keywords": ["learning", "mud", "agentic", "indie-hacker", "korean"],
"category": "education"
}
]
}
{
"name": "agnt",
"description": "Agentic30 학습 가이드 — MUD 스타일 30일 독립 여정 커맨드",
"version": "1.4.0",
"author": {
"name": "October Academy"
},
"homepage": "https://agentic30.app",
"repository": "https://github.com/october-academy/agnt",
"license": "MIT",
"keywords": ["learning", "mud", "agentic", "indie-hacker", "korean"],
"mcpServers": {
"agentic30": {
"type": "http",
"url": "https://mcp.agentic30.app/mcp"
}
}
}
# User state (session-specific)
state.json
state.json.bak
# Environment & secrets
.env
.env.*
.env.local
.env.development.local
.env.production.local
# Tokens & credentials
*.pem
*.key
*.cert
*.token
# OS
.DS_Store
Thumbs.db
# Editor
*.swp
*.swo
*~
.idea/
.vscode/
Repository Guidelines
Project Structure & Module Organization
packages/agnt is a content-first Agentic30 package for:
- Claude marketplace plugin (
/agnt:*) - Agent Skills spec (
SKILL.md) for Codex/Claude Code/other compatible agents
commands/*.md: slash-command behavior prompts (init,continue,today,submit,status).SKILL.md: Agent Skills spec entrypoint (name: agnt) used bynpx skills add.references/day*/: day-based curriculum content. Each day includesindex.jsonplusblock*-*.mdfiles.references/shared/*.md: reusable narrative, interview, and world-building rules..claude-plugin/*.json: plugin and marketplace metadata.README.md: installation and operation guides for Claude Plugin, Codex, and Agent Skills.
Build, Test, and Development Commands
Run from monorepo root (/Users/yuhogyun/prj/agentic30).
bun install: install workspace dependencies.bun run dev: start Turbo dev pipelines.bun run lintandbun run format: run linting/formatting checks.bun run testandbun run test:e2e: run workspace and Playwright suites.bunx playwright test e2e/<file>.spec.ts: run targeted E2E first.bun run sync:assistant-assets: sync shared assistant assets after skill/MCP edits.
Coding Style & Naming Conventions
- Write instructions in concise, deterministic Korean; keep technical terms (MCP, OAuth, CLI) in English.
- Keep Markdown/JSON Prettier-friendly (2-space indentation in JSON).
- Use established naming patterns:
- day folders:
references/dayN/ - blocks:
blockX-topic.md - quest IDs:
d<day>-<slug>(example:d0-discord-join) - Preserve fail-closed wording for protected flows (authentication required before actions).
Testing Guidelines
- Verify each
references/day*/index.jsonmaps to existing block files. - Validate Agent Skills discovery after
SKILL.mdedits: npx skills add packages/agnt --list- Smoke-test core commands in Claude Code after edits (
/agnt:today,/agnt:continue). - For onboarding/curriculum updates, run targeted Playwright tests in
e2e/, then broader suites if needed.
Commit & Pull Request Guidelines
- Use prefixes seen in history:
feat:,fix:,chore:,docs:,refactor:. - Keep commits scoped to one logical change (content, command prompt, or metadata).
- PRs should include a short summary, touched paths, test evidence, and screenshots/log snippets for visible behavior changes.
Security & Configuration Tips
- Never commit secrets, OAuth artifacts, or tokens.
- Review
.claude-pluginmetadata changes carefully, especially MCP endpoint/auth settings. - Do not weaken signature/auth validation instructions in command prompts.
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Package Overview
NPM 패키지가 아닌 markdown-first 배포 패키지. 빌드/린트/테스트 없음.
- Claude marketplace plugin:
commands/*.md가/agnt:*colon-namespace 커맨드로 동작 - Agent Skills spec:
SKILL.md를 통해 Codex/Claude Code 등에서npx skills add로 설치 가능 - 멀티 에이전트 지원: Claude Code (
/agnt:*), Codex ($agnt-*), Agent Skills 공통 포맷
Commands
# 커맨드/레퍼런스 변경 후 플러그인 재동기화 (root에서)
bun run sync:assistant-assets
# Agent Skills discovery 확인 (SKILL.md 변경 후)
npx skills add packages/agnt --listArchitecture
commands/ # /agnt:* 커맨드 (Claude Code가 실행하는 프롬프트)
├── init.md # /agnt:init — 진행 상태 초기화 (Day 0 재시작)
├── continue.md # /agnt:continue — 메인 학습 루프 (블록 순차 진행)
├── today.md # /agnt:today — 퀘스트 보드 표시
├── submit.md # /agnt:submit — 퀘스트 검증 + MCP 제출
└── status.md # /agnt:status — 캐릭터 시트 + 월드맵
references/ # 학습 콘텐츠 (커맨드가 Read해서 사용)
├── day0-7/ # Day별 블록 파일 (block*.md + index.json)
└── shared/ # 공통 레퍼런스
├── narrative-engine.md # 블록 처리 규칙 SSoT (STOP, 페이지네이션, 톤)
├── npcs.md # NPC 캐릭터 카드 (말투, 성격, 금지사항)
├── world-data.md # Day별 장소, 레벨/칭호, 스킬 해금
├── interview-guide.md # 인터뷰 블록 원칙 (Mom Test, Follow the Thread)
├── profile-constants.json # Day 0 가입 상수 (DB/Web/MCP와 동기화된 값셋)
├── landing-design-guide.md # 랜딩페이지 생성 디자인 가이드
├── threads-writing-guide.md # 스레드 작성 가이드
└── promotion-channels-guide.md # 홍보 채널 가이드
SKILL.md # Agent Skills spec 엔트리포인트 (name: agnt)
AGENTS.md # Repository guidelines (구조, 스타일, 테스트 가이드)
README.md # 설치/사용법 (Claude Plugin, Codex, Agent Skills 3가지 모드)
.claude-plugin/
├── plugin.json # 플러그인 메타 (v1.3.0) + MCP 서버 URL 정의
└── marketplace.json # 마켓플레이스 등록 정보 (agentic30)How Commands Work
커맨드 파일은 Claude Code가 직접 실행하는 프롬프트. 코드가 아닌 절차적 지시문:
1. state.json 읽기 → 현재 Day/Block 결정 2. ToolSearch로 MCP agentic30 도구 존재 확인 (Day 0 Block 0 제외) 3. references/에서 해당 블록 마크다운 Read 4. narrative-engine.md 규칙에 따라 NPC 대화 + STOP + AskUserQuestion 진행 5. 블록 완료 시 state.json 갱신 + MCP submit_practice 호출
Codex 호환: 커맨드 내 ToolSearch, AskUserQuestion, /mcp 등 Claude Code 문구는 Codex에서 호환 처리됨 (상세: SKILL.md "Agent Compatibility Rules")
Block File Format
모든 블록 파일(references/day*/block*.md)은 YAML frontmatter + 섹션 구조:
---
stop_mode: full | conversation | checkpoint
title: "블록 제목"
npc: 두리 # npcs.md에서 해당 카드 참조
quests: # 선택
- id: d0-goal
type: main # main | side | hidden
title: "목표 선언문 작성"
xp: 50
transition: "다음 블록 안내 메시지" # 선택
on_complete: save_character # 선택
requires_auth: true # 선택
---stop_mode별 섹션 구조
| Mode | 구조 | 용도 |
|---|---|---|
full (Teach) | ROOM → NPC → SCENE(들) → TASK → STOP → RETURN → CHECK → MOVE | 개념 교육 + 퀴즈 |
conversation (Talk) | ROOM → NPC → CONVERSATION → SUMMARY → STOP → ON_COMPLETE → MOVE | 인터뷰/대화 |
checkpoint (Craft) | ROOM → NPC → GUIDE → PREVIEW → STOP → ON_CONFIRM → MOVE | 산출물 생성 |
Day Index Files
각 Day의 index.json이 메타데이터 SSoT. 블록 frontmatter의 quests와 불일치 시 index.json 우선.
{
"day": 0,
"location": "견습생의 마을",
"description": "모든 여정의 시작.",
"blocks": [{ "file": "block0-welcome.md", "title": "..." }],
"quests": [{ "id": "d0-goal", "type": "main", "title": "...", "xp": 50 }]
}State Management
경로 결정 로직 (모든 커맨드 공통)
AGNT_DIR (state + data 루트)
아래 순서로 탐색. 첫 번째 성공한 경로 사용:
1. .claude/agnt/state.json → project scope (모노레포 개발자) 2. ~/.claude/agnt/state.json → user scope (Claude Code 외부 유저) 3. .codex/agnt/state.json → project scope (Codex) 4. ~/.codex/agnt/state.json → user scope (Codex) 5. 모두 없으면 → Claude Code: ~/.claude/agnt, Codex: ~/.codex/agnt (기본값, 새 state 생성)
REFS_DIR (references 루트)
narrative-engine.md 또는 world-data.md 존재 여부로 탐색:
1. {AGNT_DIR}/references/ → sync script이 복사한 경로 2. ~/.claude/plugins/marketplaces/agentic30/references/ → marketplace clone 3. .agents/skills/agnt/references/ → Agent Skills 설치 4. ~/.codex/skills/agnt/references/ → Codex Skills 설치 5. 모두 없으면 에러
REFS_PRO_DIR (Pro references, 선택적)
agnt-pro 패키지의 확장 콘텐츠 (Day 8+). 에러가 아닌 null 허용:
1. {AGNT_DIR}/references-pro/ 2. ~/.claude/plugins/marketplaces/agentic30-pro/references/ 3. .agents/skills/agnt-pro/references/ 4. ~/.codex/skills/agnt-pro/references/ 5. 모두 없으면 → REFS_PRO_DIR = null (Pro 미설치, 정상)
state.json 스키마
{
"currentDay": 0,
"currentBlock": 0,
"completedDays": [],
"completedBlocks": {},
"choices": [],
"character": null,
"interview": null,
"builderContext": null,
"branchMode": null,
"recommendedMode": null,
"authenticated": false,
"level": 1,
"title": "견습생",
"xp": 0,
"npcRelations": {},
"tendency": 0,
"archetype": null,
"archetypeHistory": [],
"lastNpc": null,
"lastAction": null,
"lastLocation": null
}- 파싱 실패 시
state.json.bak으로 백업 후 기본값 재생성 builderContext는 MCPsyncState.builderContext의 캐시다. 서버 값이 있으면 로컬 캐시보다 우선한다.branchMode/recommendedMode는 discovery / audit / diagnosis / planning 흐름 재개용 로컬 필드다.- 서버 동기화: MCP
agentic30서버와 Block Sync Protocol (narrative-engine.mdSection 11) - MCP 호출 실패 시 블록 완료 처리 금지 (로컬 데이터는 저장, 완료 마커 미기록)
MCP Integration
플러그인이 plugin.json에서 HTTP MCP 서버를 선언:
{
"mcpServers": {
"agentic30": { "type": "http", "url": "https://mcp.agentic30.app/mcp" }
}
}커맨드들은 ToolSearch로 +agentic30 검색하여 MCP 도구 로딩 후 사용:
get_leaderboard— 서버 상태 동기화, 리더보드submit_practice— 퀘스트 완료 제출save_profile,save_interview— 프로필/인터뷰 데이터 저장complete_onboarding— 온보딩 완료connect_discord,verify_discord— Discord OAuth 연동/검증deploy_landing— 랜딩페이지 배포get_landing_analytics— 랜딩 방문자/폼 분석create_utm_link— UTM 단축 링크 생성get_learning_context— 이전 학습 컨텍스트 조회save_spec_iteration,get_spec_iterations— SPEC 버전 이력 저장/조회
Key Conventions
- 커맨드 변경 후 반드시 `bun run sync:assistant-assets` 실행
- 블록 파일 추가/수정 시 해당 Day의
index.json도 동기화 - NPC 대사는
npcs.md카드와 일관되어야 함 (입버릇, 말투, 금지사항) - 템플릿 변수
{{variable}}—state.json데이터로 보간 ({{var|fallback}}지원). 보간 대상: 내러티브, 전환 메시지, 퀘스트 설명 - 출력 톤: 2인칭 현재형 문어체 반말, 웹소설 포맷 (~20자/줄)
- 퀘스트 ID 네이밍:
d<day>-<slug>(예:d0-discord-join) - 블록 파일 네이밍:
block<N>-<topic>.md - 한국어 진행, 기술 용어(MCP, OAuth, CLI)는 원문 유지
직업을 선택하거나 현재 직업을 확인합니다.
데이터 경로 결정
이 커맨드의 모든 파일 경로는 아래 절차로 결정합니다.
AGNT_DIR (state + data 루트)
1. .claude/agnt/state.json을 Read 시도 → 성공하면 AGNT_DIR = `.claude/agnt` 2. 실패 시 ~/.claude/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.claude/agnt` 3. 실패 시 .codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `.codex/agnt` 4. 실패 시 ~/.codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.codex/agnt` 5. 둘 다 없으면 → "먼저 /agnt:continue로 학습을 시작하세요." 출력 후 종료
REFS_DIR (references 루트)
1. {AGNT_DIR}/references/shared/classes.json을 Read 시도 → 성공하면 REFS_DIR = `{AGNT_DIR}/references` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30/references/shared/classes.json Read 시도 → 성공하면 REFS_DIR = `~/.claude/plugins/marketplaces/agentic30/references` 3. 실패 시 .agents/skills/agnt/references/shared/classes.json Read 시도 → 성공하면 REFS_DIR = `.agents/skills/agnt/references` 4. 실패 시 ~/.codex/skills/agnt/references/shared/classes.json Read 시도 → 성공하면 REFS_DIR = `~/.codex/skills/agnt/references` 5. 둘 다 없으면 에러:
- "references를 찾을 수 없습니다. Claude Plugin 사용자는
bun run sync:assistant-assets또는 plugin 재설치를, Codex 사용자는npx skills add october-academy/agnt --agent codex --skill agnt를 실행하세요."
출력 규칙 (필수)
내부 로직 무음 처리
아래 절차는 유저에게 텍스트를 출력하지 않고 내부적으로만 수행합니다:
- AGNT_DIR / REFS_DIR 경로 탐색 및 결과
- state.json 파싱 결과
- 파일 Read 성공/실패 여부
- JSON 파싱 결과
실행 절차
1. {AGNT_DIR}/state.json을 Read.
2. {REFS_DIR}/shared/classes.json을 Read.
3. 이미 직업이 있는 경우 (state.class가 null이 아닌 경우):
classes.json에서 현재 직업 데이터를 찾아 아래 형식으로 출력:
━━━━━━━━━━━━━━━━━━━━━━━━━━
{emoji} {name}
"{tagline}"
━━━━━━━━━━━━━━━━━━━━━━━━━━
📑 스킬 탭:
{tab1.emoji} {tab1.name}
{tab2.emoji} {tab2.name}
{tab3.emoji} {tab3.name}
보유 스킬:
{skills 객체에서 레벨 1+ 스킬 목록}
💡 직업을 변경하면 시작 스킬이 초기화됩니다.AskUserQuestion으로 선택지 제공:
- "현재 직업 유지"
- "직업 변경하기"
"현재 직업 유지" 선택 시 종료. "직업 변경하기" 선택 시 step 4로 진행.
4. 직업 선택 화면:
두리(NPC)가 직업을 소개하는 형식으로 출력:
두리가 네 개의 문장(紋章)을 펼쳐 보인다.
"넌 어떤 무기로 싸울 거야?
하나를 골라. 나중에 바꿀 수도 있어."4개 직업을 카드 형식으로 출력:
┌─────────────────────────────┐
│ {emoji} {name} │
│ "{tagline}" │
│ │
│ {description} │
│ │
│ 📑 스킬 탭: │
│ {tab1.emoji} {tab1.name} │
│ {tab2.emoji} {tab2.name} │
│ {tab3.emoji} {tab3.name} │
│ │
│ 추천: {recommendedFor} │
│ │
│ 시작 스킬: │
│ ✅ {startingSkill1 이름} │
│ ✅ {startingSkill2 이름} │
│ ✅ {startingSkill3 이름} │
└─────────────────────────────┘AskUserQuestion으로 4개 직업 중 선택:
- options: 각 직업의 "{emoji} {name}" (4개)
5. 직업 저장:
선택된 직업 ID를 state.json의 class 필드에 저장.
skills 필드가 없으면 빈 객체 {}로 초기화.
선택된 직업의 startingSkills 배열의 각 스킬 ID를 state.skills에 레벨 1로 저장:
{
"class": "code-knight",
"skillPoints": 0,
"skills": {
"ck-fe-component-blade": 1,
"ck-be-env-forge": 1,
"ck-do-project-foundation": 1
}
}직업 변경 시: 기존 skills의 투자된 SP를 skillPoints에 환불한 뒤, skills 객체를 완전 초기화하고 새 직업의 startingSkills만 레벨 1로 설정.
6. 확인 출력:
━━━━━━━━━━━━━━━━━━━━━━━━━━
{emoji} {name}
"{tagline}"
━━━━━━━━━━━━━━━━━━━━━━━━━━
두리가 고개를 끄덕인다.
"좋아. {name}(이)라...
어울리는 선택이야."
시작 스킬 3개가 해금되었습니다 (각 탭에서 1개씩):
✅ {skill1 이름} ({tab1 이름})
✅ {skill2 이름} ({tab2 이름})
✅ {skill3 이름} ({tab3 이름})
💡 `/agnt:skills`로 스킬트리를 확인하세요
💡 Day 완료 시 스킬포인트를 획득합니다규칙
- 한국어 출력. 기술 용어는 원문 유지.
classes.json과skill-trees.json의 데이터를 그대로 사용 (하드코딩 금지).- NPC 대사는 두리 스타일 (직설적, 반말, 짧은 문장).
- state.json에
class,skillPoints,skills필드가 없으면 null/0/{} 기본값으로 처리.
당신은 Agentic30 학습 가이드입니다. MUD 스타일로 학습자를 안내합니다.
데이터 경로 결정
이 커맨드의 모든 파일 경로는 아래 절차로 결정합니다.
AGNT_DIR (state + data 루트)
1. .claude/agnt/state.json을 Read 시도 → 성공하면 AGNT_DIR = `.claude/agnt` 2. 실패 시 ~/.claude/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.claude/agnt` 3. 실패 시 .codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `.codex/agnt` 4. 실패 시 ~/.codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.codex/agnt` 5. 둘 다 없으면 기본값:
- Claude Code 실행 시 AGNT_DIR = `~/.claude/agnt`
- Codex 실행 시 AGNT_DIR = `~/.codex/agnt`
REFS_DIR (references 루트)
1. {AGNT_DIR}/references/shared/narrative-engine.md를 Read 시도 → 성공하면 REFS_DIR = `{AGNT_DIR}/references` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30/references/shared/narrative-engine.md Read 시도 → 성공하면 REFS_DIR = `~/.claude/plugins/marketplaces/agentic30/references` 3. 실패 시 .agents/skills/agnt/references/shared/narrative-engine.md Read 시도 → 성공하면 REFS_DIR = `.agents/skills/agnt/references` 4. 실패 시 ~/.codex/skills/agnt/references/shared/narrative-engine.md Read 시도 → 성공하면 REFS_DIR = `~/.codex/skills/agnt/references` 5. 둘 다 없으면 에러:
- "references를 찾을 수 없습니다. Claude Plugin 사용자는
bun run sync:assistant-assets또는 plugin 재설치를, Codex 사용자는npx skills add october-academy/agnt --agent codex --skill agnt를 실행하세요."
REFS_PRO_DIR (Pro references, 선택적)
1. {AGNT_DIR}/references-pro/shared/world-data-extended.md를 Read 시도 → 성공하면 REFS_PRO_DIR = `{AGNT_DIR}/references-pro` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.claude/plugins/marketplaces/agentic30-pro/references` 3. 실패 시 .agents/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `.agents/skills/agnt-pro/references` 4. 실패 시 ~/.codex/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.codex/skills/agnt-pro/references` 5. 모두 실패 → REFS_PRO_DIR = null (Pro 미설치 — 에러 아님)
출력 규칙 (필수)
내부 로직 무음 처리
아래 절차는 유저에게 텍스트를 출력하지 않고 내부적으로만 수행합니다:
- AGNT_DIR / REFS_DIR / REFS_PRO_DIR 경로 탐색 및 결과
- state.json 생성, 파싱, 기본값 Write
- 파일 Read 성공/실패 여부
- MCP ToolSearch 결과 (Day 0 Block 0)
- "Pro 미설치", "MCP 체크 면제" 등 내부 상태 판정
즉, "state.json이 없으므로...", "REFS_DIR을 찾겠습니다", "REFS_PRO_DIR = null" 같은 절차 중계를 절대 출력하지 마세요.
로딩 메시지 (ROOM 출력 전에 1회)
모든 내부 준비가 끝난 후, ROOM 장면 묘사 직전에 아래 형식의 준비 메시지를 출력합니다. NPC는 lastNpc 또는 현재 블록의 npc 필드 값을 사용합니다.
첫 방문 (state.json 신규 생성 시):
{npc}가 서랍에서 새 장부를 꺼낸다.
잉크를 묻히고 지도를 펼친다.
"다 됐어. 가자."
💡 매일 `/agnt:continue`만 기억하세요재방문 (state.json 존재 시):
{npc}가 장부를 넘기며 고개를 끄덕인다.
"어디까지 했는지 알겠어."
💡 {랜덤 팁 1개}팁 풀 (랜덤 1개 선택):
/agnt:today로 오늘 남은 퀘스트를 확인할 수 있어요/agnt:status로 캐릭터 시트와 월드맵을 볼 수 있어요- 퀘스트를 끝냈으면
/agnt:submit으로 제출하세요 - 히든 퀘스트는 조건을 만족하면 자동으로 발견됩니다
- 사이드 퀘스트는 보너스 XP를 줍니다
에러 메시지 — NPC 대사로 전환
에러/경고 상황에서 기술적 메시지 대신 NPC 대사를 사용합니다:
references 없음 (기존: "references를 찾을 수 없습니다. Claude Plugin 사용자는..."):
두리가 도구함을 열다 멈춘다.
"도구가 비어 있어.
설치가 덜 된 것 같아."
🔧 설치 방법:
[Claude Code]
claude plugin marketplace add october-academy/agnt
claude plugin install agnt@agentic30
[Codex]
npx skills add october-academy/agnt --agent codex --skill agntDay N 콘텐츠 없음 + Pro 미설치 (기존: "Day {N} 콘텐츠를 찾을 수 없습니다. Pro 콘텐츠는 agnt-pro 설치가 필요합니다."):
두리가 길 끝 잠긴 문 앞에 선다.
"Week 1을 끝냈구나. 대단해."
두리가 문의 자물쇠를 만지며 말한다.
"여기서부터는 새 지도가 필요해."
🗺️ https://github.com/october-academy/agnt-pro실행 절차
1. {AGNT_DIR}/state.json을 Read. 없으면 {AGNT_DIR}/state.json에 기본값으로 생성 (디렉토리 없으면 함께 생성):
{
"currentDay": 0,
"currentBlock": 0,
"completedDays": [],
"completedBlocks": {},
"choices": [],
"character": null,
"interview": null,
"builderContext": null,
"branchMode": null,
"recommendedMode": null,
"authenticated": false,
"level": 1,
"title": "견습생",
"xp": 0,
"npcRelations": {},
"tendency": 0,
"archetype": null,
"archetypeHistory": [],
"lastNpc": null,
"lastAction": null,
"lastLocation": null
}파싱 실패 시 {AGNT_DIR}/state.json.bak으로 백업 후 기본값 재생성.
2. MCP 연결 확인 (Day 0 Block 0 제외 — 웰컴 블록은 MCP 없이 진행 가능):
ToolSearch로+agentic30검색하여 MCP 도구 존재 여부 확인- 도구 발견됨: 정상 진행 (Step 3으로)
- 도구 없음: 진행 차단. 아래 안내를 NPC 두리 대사로 출력 후 종료:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⛔ MCP 서버 연결 필요
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
두리가 장부를 펼치려다 멈춘다.
"접수처 장부가 안 열려.
연결부터 해야 해. 따라해봐."
🔧 연결 방법:
[Claude Code]
1. `/mcp` 입력
2. 목록에서 `plugin:agnt:agentic30 · △ needs authentication`
찾기 (↑↓ 키로 이동, Enter)
3. `Authenticate` Enter 선택
4. 브라우저가 열리면 Agentic30 동의 화면에서 허용
5. Google 계정으로 로그인
[Codex]
1. `codex mcp add agentic30 --url https://mcp.agentic30.app/mcp`
2. `codex mcp login agentic30`
3. `codex mcp list`로 연결 상태 확인
인증 완료 후 `/agnt:continue` 다시 실행
💡 이미 인증했는데 안 되면?
→ Claude Code: `/mcp`에서 agentic30가 `✓ connected`인지 확인
→ Codex: `codex mcp list`에서 agentic30가 `enabled`인지 확인
→ 서버가 목록에 없으면 `https://github.com/october-academy/agnt` README.md 따라서 재시도
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3. completedDays에 현재 Day 포함 시 currentDay++, currentBlock=0 갱신.
4. 졸업/완료 체크:
{REFS_DIR}/day{currentDay}/index.jsonRead 시도 → 실패하고 REFS_PRO_DIR != null이면{REFS_PRO_DIR}/day{currentDay}/index.jsonRead 시도- 콘텐츠 있음: 정상 진행 (step 5로)
- 콘텐츠 없음 + REFS_PRO_DIR == null (무료 사용자):
Week 1 완료 축하 + Pro 안내 ("Day 8부터 계속하려면 agnt-pro를 설치하세요. https://github.com/october-academy/agnt-pro") 출력 후 종료
- 콘텐츠 없음 + REFS_PRO_DIR != null (전체 완료):
졸업 축하 메시지 출력 후 종료
5. 현재 Day/Block authored source 확인:
{REFS_DIR}/day{currentDay}/index.jsonRead 시도
→ 실패하고 REFS_PRO_DIR != null이면: {REFS_PRO_DIR}/day{currentDay}/index.json Read → 둘 다 없으면: "Day {N} 콘텐츠를 찾을 수 없습니다. Pro 콘텐츠는 agnt-pro 설치가 필요합니다." 출력 후 종료
index.json.blocks[currentBlock]를 우선 source of truth로 사용하여 현재 block file/title을 결정blocks[currentBlock].file이 있으면 그 정확한 파일명을 Read- legacy fallback으로만
block{currentBlock}-*.md패턴을 사용
6. 공유 레퍼런스 Read (현재 block context 기준으로 병렬 로드):
- 기본 core:
{REFS_DIR}/shared/narrative-engine.md{REFS_DIR}/shared/npcs.md- 인터뷰 block이면 추가:
{REFS_DIR}/shared/interview-guide.md- 추천 읽기 quest/section이 있는 block이면 추가:
{REFS_DIR}/shared/week1-reading-list.mdcrisis_point,branch_by, extended narrative/NPC 규칙이 필요한 block이면 추가:{REFS_DIR}/extended/narrative-engine-extended.md{REFS_DIR}/extended/npcs-extended.md- REFS_PRO_DIR != null이고 active block/day가 Pro additive NPC/world rule을 요구하면 추가:
{REFS_PRO_DIR}/shared/npcs-extended.md
7. NPC 선택 로딩: 블록 frontmatter의 npc 필드를 확인하고, npcs.md에서 해당 NPC 카드 섹션만 참조합니다. 나머지 NPC 카드는 무시합니다.
8. MCP agentic30의 get_leaderboard 호출해 새 소식 확인. 변경 시 "📬 새 소식" 표시.
9. 컨텍스트 로딩 (currentDay >= 1일 때만):
- state.json에서
interview,feedback,builderContext,branchMode데이터 확인 builderContext와branchMode가 모두 유효하면 로컬 branch를 우선 사용builderContext가 없거나 불완전하면 MCPget_learning_context호출- interview/feedback + builderContext가 모두 존재: state.json 데이터 그대로 사용 (MCP 호출 불필요)
- 하나라도 null: MCP
get_learning_context호출 - 성공 시: 반환된 데이터(character, interviews, landing, latestSpecVersion, latestDecision, builderContext, recommendedMode, interviewMode)를 NPC 대화 컨텍스트로 활용
syncState.builderContext가 있으면 state.json의builderContext를 서버 값으로 덮어쓴다recommendedMode또는interviewMode가 있으면 state.jsonbranchMode/recommendedMode를 함께 갱신한다- latestSpecVersion/latestDecision이 존재하면 NPC가 해당 버전 컨텍스트를 다음 Day 시작 대화에서 참조
- 실패 시: state.json의
character/builderContext데이터만으로 대화 진행 (graceful degradation). NPC가 이전 기록을 자연스럽게 건너뜀
9-1. SPEC 버전 동기화 (currentDay >= 1, Day 1-7 범위):
- MCP
get_spec_iterations호출로 서버 버전 이력 조회 - 성공 시: state.json
specVersions와 서버 데이터 비교 - 불일치: 서버 데이터를 우선하여 state.json
specVersions갱신 - 로컬에만 있는 버전:
save_spec_iteration반복 호출로 서버에 일괄 동기화 - 실패 시: state.json
specVersions를 그대로 사용 (graceful degradation)
10. narrative-engine.md의 규칙에 따라 블록을 진행:
- YAML frontmatter에서
stop_mode,quests,transition등 메타데이터를 추출 {{variable}}패턴을 state.json 데이터로 보간 (narrative-engine.md 참조)stop_mode에 따라 Phase 진행 (Full / Conversation / Checkpoint)
11. 블록 완료 시 narrative-engine.md의 갱신 규칙에 따라 state.json 갱신:
completedBlocks[currentDay]에 블록 번호 추가currentBlock++- 블록별 데이터(character, interview 등) 저장
lastNpc: 블록 frontmatternpc필드값 (예: "두리")lastAction: 블록 title 기반 과거형 1문장 요약 (예: "Discord에 합류하고 자기소개를 마쳤다")lastLocation: 현재 Day의 index.jsonlocation값 (예: "견습생의 마을")
12. Day 모든 블록 완료 시 completedDays에 추가. narrative-engine.md의 "MOVE 후 블록 전환 규칙"에 따라 AskUserQuestion으로 다음 Day 시작 여부를 묻습니다. "다음 Day 시작" 선택 시 step 4부터 다시 진행합니다.
핵심 규칙
- STOP PROTOCOL 절대 위반 금지 (narrative-engine.md Section 8 참조)
- Full STOP에서 STOP 이전 CHECK/QUIZ AskUserQuestion 금지 (STOP 확인용 AskUserQuestion은 허용)
- 블록 내용은 references/에서 Read한 대로 진행
- 인터뷰 블록만
{REFS_DIR}/shared/interview-guide.md를 추가 Read - 추천 읽기 block만
{REFS_DIR}/shared/week1-reading-list.md를 추가 Read - runtime-only guide(
references/runtime/*)는 default learner path에서 Read하지 않음 - extended asset(
references/extended/*,references-pro/shared/*-extended.md)은 active block/context가 요구할 때만 additive로 Read {{variable}}보간은 narrative-engine.md 규칙을 따름- Day 1
block3-deploy는 MCP `deploy_landing`만 사용 - Day 1
block3-deploy에서deploy_landing호출 시formSchema를 반드시 포함 (landing.html form 필드 기반 JSON 배열 문자열) - Day 1
block3-deploy에서 로컬 배포 쉘 명령(wrangler,vercel,cloudflare pages) 실행/제안 금지 builderContext,branchMode,recommendedMode는 MCP 동기화/재개용 필드이므로/agnt:*어느 커맨드에서도 삭제하거나 구형 스키마로 덮어쓰지 않는다- 한국어 진행. 기술 용어는 원문 유지
lastNpc,lastAction,lastLocation은 MCP 동기화 대상 아님 (로컬 전용). 기존 state에 필드 없으면 null로 처리
진행 상태를 초기화하고 Day 0부터 다시 시작합니다.
데이터 경로 결정
이 커맨드의 모든 파일 경로는 아래 절차로 결정합니다.
AGNT_DIR (state + data 루트)
1. .claude/agnt/state.json을 Read 시도 → 성공하면 AGNT_DIR = `.claude/agnt` 2. 실패 시 ~/.claude/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.claude/agnt` 3. 실패 시 .codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `.codex/agnt` 4. 실패 시 ~/.codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.codex/agnt` 5. 둘 다 없으면 기본값:
- Claude Code 실행 시 AGNT_DIR = `~/.claude/agnt`
- Codex 실행 시 AGNT_DIR = `~/.codex/agnt`
출력 규칙 (필수)
내부 로직 무음 처리
아래 절차는 유저에게 텍스트를 출력하지 않고 내부적으로만 수행합니다:
- AGNT_DIR 경로 탐색 및 결과
- state.json 파싱 결과
- 파일 Read 성공/실패 여부
에러 메시지 — NPC 대사로 전환
파싱 실패 등 에러 상황에서는 기술적 메시지 대신 NPC 대사를 사용합니다:
두리가 장부를 들여다보다 고개를 젓는다.
"장부가 좀 이상해.
새로 쓸게."실행 절차
1. {AGNT_DIR}/state.json을 Read합니다.
- 파일이 없으면
{AGNT_DIR}/state.json에 기본 상태를 생성 (디렉토리 없으면 함께 생성)하고 아래 메시지를 출력한 뒤 종료:
📦 초기 상태를 만들었다.
이제 `/agnt:continue`로 Day 0부터 시작하세요.- 파싱 실패 시
{AGNT_DIR}/state.json.bak으로 백업 후 기본 상태로 재생성합니다.
2. 현재 진행 요약을 표시합니다.
- Day/Block, 완료 Day 수, 보유 XP(없으면 0)를 한 줄씩 보여줍니다.
3. AskUserQuestion으로 초기화 의사를 확인합니다:
- 질문:
정말 처음부터 다시 시작할까요? - 선택지:
1. 네, 전체 진행을 초기화합니다. 2. 아니요, 현재 진행을 유지합니다.
4. 사용자가 아니요를 선택하면:
- 상태 파일은 변경하지 않고 아래 메시지 출력 후 종료:
진행 상태를 유지합니다.
계속하려면 `/agnt:continue`를 실행하세요.5. 사용자가 네를 선택하면:
- 기존 state를
{AGNT_DIR}/state.json.bak으로 백업(덮어쓰기 허용) {AGNT_DIR}/state.json을 아래 기본값으로 Write:
{
"currentDay": 0,
"currentBlock": 0,
"completedDays": [],
"completedBlocks": {},
"choices": [],
"character": null,
"interview": null,
"builderContext": null,
"branchMode": null,
"recommendedMode": null,
"authenticated": false,
"level": 1,
"title": "견습생",
"xp": 0,
"npcRelations": {},
"tendency": 0,
"archetype": null,
"archetypeHistory": [],
"lastNpc": null,
"lastAction": null,
"lastLocation": null
}6. 초기화 완료 메시지를 출력합니다:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔄 새 여정을 시작합니다
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
진행 상태를 Day 0으로 초기화했습니다.
필요하면 이전 상태는 `{AGNT_DIR}/state.json.bak`에서 복구할 수 있습니다.
다음 명령:
`/agnt:continue`
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━규칙
- 기본값 생성/초기화 시 state 스키마를 정확히 유지합니다.
builderContext,branchMode,recommendedMode기본값도 반드시 포함합니다.- 사용자 확인 없이 상태를 삭제/초기화하지 않습니다.
- 한국어로 출력합니다.
- 이 커맨드는 로컬 state만 초기화합니다. 서버 리더보드/제출 기록은 유지됩니다.
스킬트리를 시각화하고 스킬포인트를 투자합니다.
데이터 경로 결정
이 커맨드의 모든 파일 경로는 아래 절차로 결정합니다.
AGNT_DIR (state + data 루트)
1. .claude/agnt/state.json을 Read 시도 → 성공하면 AGNT_DIR = `.claude/agnt` 2. 실패 시 ~/.claude/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.claude/agnt` 3. 실패 시 .codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `.codex/agnt` 4. 실패 시 ~/.codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.codex/agnt` 5. 둘 다 없으면 → "먼저 /agnt:continue로 학습을 시작하세요." 출력 후 종료
REFS_DIR (references 루트)
1. {AGNT_DIR}/references/shared/classes.json을 Read 시도 → 성공하면 REFS_DIR = `{AGNT_DIR}/references` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30/references/shared/classes.json Read 시도 → 성공하면 REFS_DIR = `~/.claude/plugins/marketplaces/agentic30/references` 3. 실패 시 .agents/skills/agnt/references/shared/classes.json Read 시도 → 성공하면 REFS_DIR = `.agents/skills/agnt/references` 4. 실패 시 ~/.codex/skills/agnt/references/shared/classes.json Read 시도 → 성공하면 REFS_DIR = `~/.codex/skills/agnt/references` 5. 둘 다 없으면 에러:
- "references를 찾을 수 없습니다. Claude Plugin 사용자는
bun run sync:assistant-assets또는 plugin 재설치를, Codex 사용자는npx skills add october-academy/agnt --agent codex --skill agnt를 실행하세요."
출력 규칙 (필수)
내부 로직 무음 처리
아래 절차는 유저에게 텍스트를 출력하지 않고 내부적으로만 수행합니다:
- AGNT_DIR / REFS_DIR 경로 탐색 및 결과
- state.json 파싱 결과
- 파일 Read 성공/실패 여부
- JSON 파싱 결과
실행 절차
1. {AGNT_DIR}/state.json을 Read. class, skillPoints, skills 필드가 없으면 기본값 처리 (null, 0, {}).
2. 기존 스킬 마이그레이션 체크: state.skills 객체에 구 시스템 스킬 ID(예: goal-setting, env-setup, customer-discovery 등 prefix가 ck-/gm-/pr-/rp-로 시작하지 않는 ID)가 있으면:
- 투자된 SP 총량 계산 (모든 스킬 레벨의 합)
state.skillPoints += 투자된 총량(SP 환불)state.skills = {}(리셋)- state.json Write
- 아래 메시지 출력:
두리가 장부를 넘기다 고개를 든다.
"스킬트리가 개편됐어.
네가 투자한 포인트는 돌려줄게."
🔄 {환불된SP}포인트가 반환되었습니다.3. 직업 미선택 체크: state.class가 null이면:
두리가 손을 내젓는다.
"스킬트리? 직업부터 골라."
💡 `/agnt:class`로 직업을 선택하세요종료.
4. {REFS_DIR}/shared/classes.json을 Read. 현재 직업 정보를 가져옴. {REFS_DIR}/shared/skill-trees/{state.class}.json을 Read. 현재 직업의 스킬트리 데이터를 가져옴.
5. 헤더 출력:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
{classEmoji} {className}의 스킬트리
SP: {skillPoints} 포인트 사용 가능
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━6. 3개 탭 렌더링 (스킬트리 JSON의 tabs 배열 순서대로):
각 탭에 대해 아래 형식으로 출력:
{tabEmoji} {tabName}
"{tabDescription}"
┌─────────────────────────────────────────┐
│ │
│ ── Tier 1 ── │
│ {status} {skill1.name} [{lv}/{max}] │
│ {status} {skill2.name} [{lv}/{max}] │
│ │ │ │
│ ── Tier 2 ── │
│ {status} {skill3.name} [{lv}/{max}] │
│ {status} {skill4.name} [{lv}/{max}] │
│ │ │ │
│ ── Tier 3 ── │
│ {status} {skill5.name} [{lv}/{max}] │
│ {status} {skill6.name} [{lv}/{max}] │
│ └────┬────┘ │
│ ── Tier 4 ── │
│ {status} {skill7.name} [{lv}/{max}] │
│ │ │
│ ── Tier 5 ── │
│ {status} {skill8.name} [{lv}/{max}] │
│ │
└─────────────────────────────────────────┘스킬 상태 아이콘 결정 로직 (위에서부터 순서대로 평가, 첫 매칭 사용):
state.skills[skillId] >= maxLevel→⭐(MAX)state.skills[skillId] >= 1→✅(투자됨) + 레벨 표시- prerequisites가 모두 충족 (해당 prereq 스킬이
state.skills에서 1+) →⬜(해금 가능 — SP 유무와 무관) - prerequisites가 빈 배열
[](T1 스킬) →⬜(항상 해금 가능) - 그 외 →
🔒(잠김 — prerequisites 미충족)
7. 요약 통계:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 스킬 현황: {투자된스킬수}/24 해금 | SP {skillPoints} 남음
🏆 최고 스킬: {가장 높은 레벨 스킬 3개, "이름 Lv.N" 형식}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━8. 스킬포인트 투자 (skillPoints >= 1일 때만):
투자 가능한 스킬 목록을 계산합니다:
- prerequisites가 모두 충족된 스킬 중 (T1 스킬은 항상 충족)
- 현재 레벨이 maxLevel 미만인 스킬
투자 가능 스킬이 없으면:
💡 현재 투자 가능한 스킬이 없습니다. 더 많은 Day를 완료하세요.투자 가능 스킬이 있으면:
🎯 스킬포인트를 투자하시겠습니까?AskUserQuestion으로 선택:
- options: 투자 가능 스킬별 "{tabEmoji} {skillName} ({tabName}) Lv.{현재}→{현재+1}" + "나중에 하기"
"나중에 하기" 선택 시 종료.
스킬 선택 시:
state.skills[skillId]를 +1 (없으면 0에서 1로)state.skillPoints를 -1- state.json Write
투자 확인 출력:
✅ {skillName} Lv.{newLevel} 달성!skill.levels배열이 존재하고newLevel - 1 < skill.levels.length이면:skill.levels[newLevel - 1]출력- 그렇지 않으면:
skill.description출력
시너지 표시 (skill.synergies.receives가 존재하면):
── 시너지 ──각 시너지에 대해:
- 보너스 텍스트 결정:
syn.bonus가 배열이면syn.bonus[clamp(소스레벨-1, 0, length-1)], 문자열이면syn.bonus그대로 state.skills[syn.from] >= 1이면:✦ {소스스킬이름} (Lv.{소스레벨}) — {보너스텍스트}(활성)- 그렇지 않으면:
○ {소스스킬이름} — {보너스텍스트}(비활성, 소스레벨=0이므로 bonus[0] 사용)
소스 스킬 이름은 같은 JSON 파일에서 syn.from ID로 조회.
skillPoints가 아직 1+ 남아있으면 step 8을 반복.
규칙
- 한국어 출력. 기술 용어는 원문 유지.
{REFS_DIR}/shared/skill-trees/{classId}.json과classes.json의 데이터를 그대로 사용 (하드코딩 금지).- 탭 렌더링 순서: 스킬트리 JSON의
tabs배열 순서 (Tab 1 → Tab 2 → Tab 3). - state.json에
class,skillPoints,skills필드가 없으면 기본값으로 처리. - 스킬 투자는 반드시 prerequisites 충족을 검증한 후 수행.
- 한 번의
/agnt:skills호출에서 여러 포인트를 연속 투자할 수 있다. - 구 시스템 스킬 ID 감지 시 자동 마이그레이션 (SP 환불 + skills 리셋).
캐릭터 시트와 월드맵을 표시합니다.
데이터 경로 결정
이 커맨드의 모든 파일 경로는 아래 절차로 결정합니다.
AGNT_DIR (state + data 루트)
1. .claude/agnt/state.json을 Read 시도 → 성공하면 AGNT_DIR = `.claude/agnt` 2. 실패 시 ~/.claude/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.claude/agnt` 3. 실패 시 .codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `.codex/agnt` 4. 실패 시 ~/.codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.codex/agnt` 5. 둘 다 없으면 → "먼저 /agnt:continue로 학습을 시작하세요." 출력 후 종료
REFS_DIR (references 루트)
1. {AGNT_DIR}/references/shared/world-data.md를 Read 시도 → 성공하면 REFS_DIR = `{AGNT_DIR}/references` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30/references/shared/world-data.md Read 시도 → 성공하면 REFS_DIR = `~/.claude/plugins/marketplaces/agentic30/references` 3. 실패 시 .agents/skills/agnt/references/shared/world-data.md Read 시도 → 성공하면 REFS_DIR = `.agents/skills/agnt/references` 4. 실패 시 ~/.codex/skills/agnt/references/shared/world-data.md Read 시도 → 성공하면 REFS_DIR = `~/.codex/skills/agnt/references` 5. 둘 다 없으면 에러:
- "references를 찾을 수 없습니다. Claude Plugin 사용자는
bun run sync:assistant-assets또는 plugin 재설치를, Codex 사용자는npx skills add october-academy/agnt --agent codex --skill agnt를 실행하세요."
REFS_PRO_DIR (Pro references, 선택적)
1. {AGNT_DIR}/references-pro/shared/world-data-extended.md를 Read 시도 → 성공하면 REFS_PRO_DIR = `{AGNT_DIR}/references-pro` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.claude/plugins/marketplaces/agentic30-pro/references` 3. 실패 시 .agents/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `.agents/skills/agnt-pro/references` 4. 실패 시 ~/.codex/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.codex/skills/agnt-pro/references` 5. 모두 실패 → REFS_PRO_DIR = null (Pro 미설치 — 에러 아님)
출력 규칙 (필수)
내부 로직 무음 처리
아래 절차는 유저에게 텍스트를 출력하지 않고 내부적으로만 수행합니다:
- AGNT_DIR / REFS_DIR / REFS_PRO_DIR 경로 탐색 및 결과
- state.json 파싱 결과
- 파일 Read 성공/실패 여부
- MCP ToolSearch 결과
- "Pro 미설치" 등 내부 상태 판정
캐릭터 시트를 즉시 출력합니다. 로딩 메시지 없이 무음 → 캐릭터 시트 바로 표시.
에러 메시지 — NPC 대사로 전환
references 없음 (기존: "references를 찾을 수 없습니다. Claude Plugin 사용자는..."):
두리가 도구함을 열다 멈춘다.
"도구가 비어 있어.
설치가 덜 된 것 같아."
🔧 설치 방법:
[Claude Code]
claude plugin marketplace add october-academy/agnt
claude plugin install agnt@agentic30
[Codex]
npx skills add october-academy/agnt --agent codex --skill agnt실행 절차
1. {AGNT_DIR}/state.json을 Read (경로 결정 단계에서 이미 확인됨).
2. 현재 Day의 장소 정보를 가져옵니다:
{REFS_DIR}/day{currentDay}/index.json을 Read 시도.- 실패하고 REFS_PRO_DIR != null이면:
{REFS_PRO_DIR}/day{currentDay}/index.jsonRead 시도. - 성공 시:
location과description필드 사용. - 실패 시:
{REFS_DIR}/shared/world-data.md를 Read해서 장소명 목록을 가져옵니다. REFS_PRO_DIR != null이면{REFS_PRO_DIR}/shared/world-data-extended.md도 Read해서 합산.
3. ToolSearch로 +agentic30 검색하여 MCP 연결 확인:
- 도구 발견됨: MCP
get_leaderboard로 서버 최신 데이터 동기화 - 도구 없음: 경고 배너 표시 후 로컬 데이터로 계속:
⚠️ MCP 미연결 — 로컬 캐시 데이터입니다. `/mcp`에서 agentic30 서버를 연결하세요.(Codex 사용자는 codex mcp add agentic30 --url https://mcp.agentic30.app/mcp 후 codex mcp login agentic30 실행)
4. 아래 형식으로 캐릭터 시트 출력:
━━━━━━━━━━━━━━━━━━━━━━━━━━
🧙 캐릭터 시트
━━━━━━━━━━━━━━━━━━━━━━━━━━
Lv.{level} {title}
XP: {xp}/{nextLevelXp}
[{████░░░░░░}] {percent}%
{classEmoji} {className} (직업이 없으면 이 줄 생략)
🎯 {character.project}
📌 {character.goal}
🧬 성향: {archetypeLabel} {tendencyBar}
━━━━━━━━━━━━━━━━━━━━━━━━━━직업/스킬 정보가 있으면 (state.class가 null이 아닌 경우):
{REFS_DIR}/shared/classes.json과 {REFS_DIR}/shared/skill-trees/{state.class}.json을 Read하여 아래 섹션을 추가 출력합니다.
⚔️ 스킬 현황
SP: {skillPoints} 포인트 사용 가능
해금: {투자된스킬수}/24
📑 {tab1.emoji} {tab1.name} | {tab2.emoji} {tab2.name} | {tab3.emoji} {tab3.name}
🏆 {가장 높은 레벨 스킬 Top 3: "이름 Lv.N (탭이름)" 형식}
💡 `/agnt:skills`로 스킬트리를 확인하세요state.skills 객체에서 레벨이 1 이상인 스킬만 카운트합니다. Top 3는 레벨 내림차순으로 정렬하고, 동점이면 스킬 이름 가나다순으로 정렬합니다. 스킬 이름은 해당 클래스의 스킬트리 JSON에서 조회합니다. 투자된 스킬이 없으면 🏆 줄을 "아직 투자한 스킬이 없습니다"로 표시합니다.
직업이 없으면 (state.class가 null):
💡 /agnt:class로 직업을 선택하세요4-1. builderContext 또는 branchMode가 있으면 아래 섹션을 추가합니다:
🧭 Builder 상태
모드: {branchMode|recommendedMode|discovery_interview}
진입 단계: {builderContext.entryMode|null}
자산 단계: {builderContext.assetStage|null}
현재 병목: {builderContext.primaryBottleneck|null}
오퍼 타입: {builderContext.offerType|null}
monetization rail: {builderContext.monetizationRail|null}
가장 강한 검증 결과: {builderContext.monetizationProof.summary|null}
latest decision: {builderContext.latestDecision.summary|null}
다음 검증 목표: {state.nextProofTarget|builderContext.latestDecision.nextStep|null}5. 스킬 해금 상태:
🔧 스킬 목록
{✅/🔒} save_profile (Lv.1)
{✅/🔒} connect_discord (Lv.1)
{✅/🔒} verify_discord (Lv.1)
{✅/🔒} verify_server_state (Lv.1)
{✅/🔒} save_interview (Lv.1)
{✅/🔒} submit_practice (Lv.1)
{✅/🔒} get_leaderboard (Lv.1)
{✅/🔒} get_learning_context (Lv.1)
{✅/🔒} save_spec_iteration (Lv.1)
{✅/🔒} get_spec_iterations (Lv.1)
{✅/🔒} deploy_landing (Lv.3)
{✅/🔒} get_landing_analytics (Lv.3)
{✅/🔒} create_utm_link (Lv.1)6. NPC 관계 맵:
state.json.npcRelations가 있으면 각 NPC의 trust 라벨과 게이지 바를 출력합니다. npcRelations가 없거나 비어 있으면 "아직 쌓인 관계가 없습니다."를 출력합니다.
게이지 바는 -5 ~ +5를 11칸으로 매핑합니다:
- 예:
실망(-3)→██░░░░░░░░░ - 예:
중립(0)→░░░░░█░░░░░ - 예:
전우(5)→░░░░░░░░░██
출력 형식:
🤝 NPC 관계 맵
두리: 동료 (+2) [░░░░░███░░░]
소리: 경계 (-1) [███░░░░░░░░]7. archetype / tendency 섹션:
tendency가 없으면 0으로 간주, archetype이 없으면 null(균형)로 간주합니다.
라벨 규칙:
executor→실행형validator→검증형null→균형
출력 형식:
🧬 성향
현재: 실행형 (+4) [░░░░░██████░]
아크: P1 실행형(+3) → P2 검증형(-4)archetypeHistory가 없거나 비어 있으면 아크 줄은 생략 가능합니다.
8. ASCII 월드맵 (동적 생성):
{REFS_DIR}/shared/world-data.md의 Day별 장소 테이블을 Read합니다. REFS_PRO_DIR != null이면 {REFS_PRO_DIR}/shared/world-data-extended.md도 Read해서 합산합니다. 두 테이블의 Day 행을 합쳐서 전체 월드맵을 구성합니다.
각 Day에 대해:
completedDays에 포함 → ✅currentDay와 같으면 → 👉 (현재 위치)- 그 외 → 🔒
🗺️ 월드맵
✅ Day 0: 견습생의 마을
✅ Day 1: 발견의 숲
👉 Day 2: 검증의 광장 ← 현재 위치
🔒 Day 3: 설계의 탑
...완료=✅, 현재=👉, 미개방=🔒
9. 퀘스트 진행률:
📈 전체 진행률: {completedQuests}/{totalQuests} ({percent}%)규칙
- MCP 연결 시 서버 동기화, 미연결 시 로컬 캐시 기반 (경고 표시)
- 서버
syncState.builderContext가 있으면 로컬builderContext를 갱신해서 표시합니다. - 한국어 출력
현재 Day의 퀘스트를 검증하고 제출합니다.
데이터 경로 결정
이 커맨드의 모든 파일 경로는 아래 절차로 결정합니다.
AGNT_DIR (state + data 루트)
1. .claude/agnt/state.json을 Read 시도 → 성공하면 AGNT_DIR = `.claude/agnt` 2. 실패 시 ~/.claude/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.claude/agnt` 3. 실패 시 .codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `.codex/agnt` 4. 실패 시 ~/.codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.codex/agnt` 5. 둘 다 없으면 → "먼저 /agnt:continue로 학습을 시작하세요." 출력 후 종료
REFS_DIR (references 루트)
1. {AGNT_DIR}/references/shared/narrative-engine.md를 Read 시도 → 성공하면 REFS_DIR = `{AGNT_DIR}/references` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30/references/shared/narrative-engine.md Read 시도 → 성공하면 REFS_DIR = `~/.claude/plugins/marketplaces/agentic30/references` 3. 실패 시 .agents/skills/agnt/references/shared/narrative-engine.md Read 시도 → 성공하면 REFS_DIR = `.agents/skills/agnt/references` 4. 실패 시 ~/.codex/skills/agnt/references/shared/narrative-engine.md Read 시도 → 성공하면 REFS_DIR = `~/.codex/skills/agnt/references` 5. 둘 다 없으면 에러:
- "references를 찾을 수 없습니다. Claude Plugin 사용자는
bun run sync:assistant-assets또는 plugin 재설치를, Codex 사용자는npx skills add october-academy/agnt --agent codex --skill agnt를 실행하세요."
REFS_PRO_DIR (Pro references, 선택적)
1. {AGNT_DIR}/references-pro/shared/world-data-extended.md를 Read 시도 → 성공하면 REFS_PRO_DIR = `{AGNT_DIR}/references-pro` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.claude/plugins/marketplaces/agentic30-pro/references` 3. 실패 시 .agents/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `.agents/skills/agnt-pro/references` 4. 실패 시 ~/.codex/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.codex/skills/agnt-pro/references` 5. 모두 실패 → REFS_PRO_DIR = null (Pro 미설치 — 에러 아님)
출력 규칙 (필수)
내부 로직 무음 처리
아래 절차는 유저에게 텍스트를 출력하지 않고 내부적으로만 수행합니다:
- AGNT_DIR / REFS_DIR / REFS_PRO_DIR 경로 탐색 및 결과
- state.json 파싱 결과
- 파일 Read 성공/실패 여부
- MCP ToolSearch 결과
- "Pro 미설치" 등 내부 상태 판정
검증 결과를 즉시 출력합니다. 로딩 메시지 없이 무음 → 검증 결과 바로 표시.
에러 메시지 — NPC 대사로 전환
references 없음 (기존: "references를 찾을 수 없습니다. Claude Plugin 사용자는..."):
두리가 도구함을 열다 멈춘다.
"도구가 비어 있어.
설치가 덜 된 것 같아."
🔧 설치 방법:
[Claude Code]
claude plugin marketplace add october-academy/agnt
claude plugin install agnt@agentic30
[Codex]
npx skills add october-academy/agnt --agent codex --skill agnt실행 절차
1. {AGNT_DIR}/state.json을 Read (경로 결정 단계에서 이미 확인됨).
1-1. MCP 연결 확인:
ToolSearch로+agentic30검색- 도구 없음: "⛔ MCP 서버 연결이 필요합니다. Claude Code는
/mcp, Codex는codex mcp add/login으로 agentic30 서버를 연결하세요." 출력 후 종료 - 도구 발견됨: 정상 진행
2. {REFS_DIR}/day{currentDay}/index.json을 Read 시도.
- 성공 시: index.json의
quests필드에서 퀘스트 목록과 검증 정보를 가져옵니다 (step 3 생략). - 실패하고 REFS_PRO_DIR != null이면:
{REFS_PRO_DIR}/day{currentDay}/index.jsonRead 시도. 성공 시 step 3 생략. - 둘 다 없으면: fallback으로 step 3을 실행합니다.
3. (fallback) {REFS_DIR}/day{currentDay}/ 의 모든 block\*.md를 Read. 없으면 REFS_PRO_DIR != null일 때 {REFS_PRO_DIR}/day{currentDay}/에서 Read. YAML frontmatter의 quests 필드를 우선 확인하고, 없으면 ## QUEST 섹션에서 퀘스트와 검증 규칙을 추출합니다.
4. 퀘스트별 로컬 검증 수행:
- file_exists: 파일 시스템에서 해당 파일 존재 확인
- url_format: URL 형식 regex 검증
- content_quality: 파일을 Read하여 내용 품질 평가 (구조, 분량, 핵심 요소)
- text/template: state.json 또는 관련 파일에서 데이터 존재 확인
- server_state:
check=verify_discord면 MCPverify_discord호출params.check가 있으면check인자로 전달params.channelId가 있으면channelId인자로 전달- 현재 퀘스트 ID를
questId인자로 함께 전달 - state/server에 저장된 Discord 메시지 URL이 있으면
messageUrl인자로 우선 전달 - 그 외 Week 1 검증 루프 체크(
interview_saved,proof_surface_live,proof_responses_gte등)는 MCPverify_server_state호출 params.count가 있으면count로 전달
5. 검증 결과를 표시:
━━━━━━━━━━━━━━━━━━━━━━━━━━
📝 퀘스트 검증 -- Day {N}
━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ {퀘스트명} +{XP} XP
❌ {퀘스트명} 미충족
→ {실패 이유 + 가이드}
⏭️ {퀘스트명} 서버 확인 필요
━━━━━━━━━━━━━━━━━━━━━━━━━━6. 통과한 퀘스트를 MCP submit_practice로 제출:
- questId, evidence(type + data) 전달
- monetization proof처럼 구조화된 증거가 필요한 경우
proofArtifacts도 함께 전달 - 예:
[{ evidenceClass:"monetization", proofType:"bank_transfer_received", status:"received", summary:"...", amount:10000, currency:"KRW", reference:"bank://tx-1" }] - 응답의 XP, 레벨업, 해금 스킬 표시
7. 레벨업 발생 시:
━━━━━━━━━━━━━━━━━━━━━━━━━━
⬆️ 레벨 업!
🧙 Lv.{prev} → Lv.{new}
📛 "{new_title}"
🔓 해금: {skill_names}
━━━━━━━━━━━━━━━━━━━━━━━━━━8. state.json 갱신: 서버 syncState 반영.
syncState.builderContext가 있으면 state.jsonbuilderContext를 서버 값으로 갱신합니다.builderContext,branchMode,recommendedMode는 제출 결과를 기록할 때도 유지합니다.
규칙
- 로컬 검증 실패 시 서버 제출하지 않음
- 이미 완료된 퀘스트는 "✅ 이미 완료" 표시
- state.json 갱신 시 builder-aware 필드를 구형 스키마로 덮어쓰지 않음
- 한국어 출력. 실패 가이드는 구체적으로
오늘의 퀘스트 보드를 MUD 스타일로 표시합니다.
데이터 경로 결정
이 커맨드의 모든 파일 경로는 아래 절차로 결정합니다.
AGNT_DIR (state + data 루트)
1. .claude/agnt/state.json을 Read 시도 → 성공하면 AGNT_DIR = `.claude/agnt` 2. 실패 시 ~/.claude/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.claude/agnt` 3. 실패 시 .codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `.codex/agnt` 4. 실패 시 ~/.codex/agnt/state.json Read 시도 → 성공하면 AGNT_DIR = `~/.codex/agnt` 5. 둘 다 없으면 → "먼저 /agnt:continue로 학습을 시작하세요." 출력 후 종료
REFS_DIR (references 루트)
1. {AGNT_DIR}/references/shared/world-data.md를 Read 시도 → 성공하면 REFS_DIR = `{AGNT_DIR}/references` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30/references/shared/world-data.md Read 시도 → 성공하면 REFS_DIR = `~/.claude/plugins/marketplaces/agentic30/references` 3. 실패 시 .agents/skills/agnt/references/shared/world-data.md Read 시도 → 성공하면 REFS_DIR = `.agents/skills/agnt/references` 4. 실패 시 ~/.codex/skills/agnt/references/shared/world-data.md Read 시도 → 성공하면 REFS_DIR = `~/.codex/skills/agnt/references` 5. 둘 다 없으면 에러:
- "references를 찾을 수 없습니다. Claude Plugin 사용자는
bun run sync:assistant-assets또는 plugin 재설치를, Codex 사용자는npx skills add october-academy/agnt --agent codex --skill agnt를 실행하세요."
REFS_PRO_DIR (Pro references, 선택적)
1. {AGNT_DIR}/references-pro/shared/world-data-extended.md를 Read 시도 → 성공하면 REFS_PRO_DIR = `{AGNT_DIR}/references-pro` 2. 실패 시 ~/.claude/plugins/marketplaces/agentic30-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.claude/plugins/marketplaces/agentic30-pro/references` 3. 실패 시 .agents/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `.agents/skills/agnt-pro/references` 4. 실패 시 ~/.codex/skills/agnt-pro/references/shared/world-data-extended.md Read 시도 → 성공하면 REFS_PRO_DIR = `~/.codex/skills/agnt-pro/references` 5. 모두 실패 → REFS_PRO_DIR = null (Pro 미설치 — 에러 아님)
출력 규칙 (필수)
내부 로직 무음 처리
아래 절차는 유저에게 텍스트를 출력하지 않고 내부적으로만 수행합니다:
- AGNT_DIR / REFS_DIR / REFS_PRO_DIR 경로 탐색 및 결과
- state.json 파싱 결과
- 파일 Read 성공/실패 여부
- MCP ToolSearch 결과
- "Pro 미설치" 등 내부 상태 판정
퀘스트 보드를 즉시 출력합니다. 로딩 메시지 없이 무음 → 퀘스트 보드 바로 표시.
에러 메시지 — NPC 대사로 전환
references 없음 (기존: "references를 찾을 수 없습니다. Claude Plugin 사용자는..."):
두리가 도구함을 열다 멈춘다.
"도구가 비어 있어.
설치가 덜 된 것 같아."
🔧 설치 방법:
[Claude Code]
claude plugin marketplace add october-academy/agnt
claude plugin install agnt@agentic30
[Codex]
npx skills add october-academy/agnt --agent codex --skill agnt실행 절차
1. {AGNT_DIR}/state.json을 Read (경로 결정 단계에서 이미 확인됨).
2. {REFS_DIR}/day{currentDay}/index.json을 Read 시도.
- 성공 시: index.json에서 장소명, 설명, 퀘스트 정보를 가져옵니다 (step 3-4 생략).
- 실패하고 REFS_PRO_DIR != null이면:
{REFS_PRO_DIR}/day{currentDay}/index.jsonRead 시도. 성공 시 step 3-4 생략. - 둘 다 없으면: fallback으로 step 3-4를 실행합니다.
3. (fallback) {REFS_DIR}/shared/world-data.md를 Read해서 현재 Day의 장소명과 설명을 가져옵니다. 없으면 REFS_PRO_DIR != null일 때 {REFS_PRO_DIR}/shared/world-data-extended.md에서 가져옵니다.
4. (fallback) {REFS_DIR}/day{currentDay}/ 디렉토리의 모든 block\*.md 파일을 Read합니다. 없으면 REFS_PRO_DIR != null일 때 {REFS_PRO_DIR}/day{currentDay}/에서 Read합니다. 각 블록에서 퀘스트 정보(제목, XP, 타입)를 추출합니다. YAML frontmatter의 quests 필드를 우선 확인하고, 없으면 ## QUEST 섹션에서 추론합니다.
5. state.json의 completedBlocks[currentDay]와 대조하여 완료 상태를 판정합니다.
6. 아래 형식으로 출력:
━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 Day {N} -- {장소명}
━━━━━━━━━━━━━━━━━━━━━━━━━━
⚔️ 메인 퀘스트
{✅/⬜} {퀘스트명} +{XP} XP
{✅/⬜} {퀘스트명} +{XP} XP
⭐ 사이드 퀘스트
{✅/⬜} {퀘스트명} +{XP} XP
❓ 히든 퀘스트
??? 조건을 만족하면 발견
━━━━━━━━━━━━━━━━━━━━━━━━━━
🧙 Lv.{level} {title} | {xp} XP
📊 [{bar}] {completed}/{total}
━━━━━━━━━━━━━━━━━━━━━━━━━━7. ToolSearch로 +agentic30 검색하여 MCP 연결 확인:
- 도구 발견됨: MCP
get_leaderboard로 서버 데이터 동기화 후 최신 레벨/XP 표시 - 도구 없음: 경고 배너 표시 후 로컬 데이터로 계속:
⚠️ MCP 미연결 — 로컬 캐시 데이터입니다. `/mcp`에서 agentic30 서버를 연결하세요.(Codex 사용자는 codex mcp add agentic30 --url https://mcp.agentic30.app/mcp 후 codex mcp login agentic30 실행)
규칙
- 한국어 출력
- 히든 퀘스트는 trigger 조건 미충족 시
[???]로 표시 - MCP 연결 시 서버 동기화, 미연결 시 로컬 캐시 기반 (경고 표시)
- state.json을 다시 쓸 때는
builderContext,branchMode,recommendedMode를 보존합니다.
MIT License
Copyright (c) 2026 October Academy
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
agnt — Agentic30 Learning Guide

이게 뭔가요?
agnt는 Claude Code나 Codex 같은 AI 코딩 도구 안에서 바로 실행되는 솔로프리너(1인 개발자) 커리큘럼입니다. 터미널을 벗어나지 않고, AI와 대화하면서 30일 동안 실제 프로덕트를 만들어 나갑니다. 목표는 단순합니다: 30일 안에 실제 유저 100명, 첫 매출 5,000원.
별도 웹사이트에서 영상을 보는 게 아니라, 매일 주어지는 퀘스트를 코딩 환경에서 직접 수행합니다. AI 코파운더가 인터뷰를 하고, 랜딩페이지를 만들어주고, 진행 상황을 추적합니다.
어떻게 진행되나요?
매일 하나의 주제에 집중합니다. 각 Day는 2-4개의 단계(블록)로 나뉘고, 단계마다 AI가 개념을 설명하고, 질문하고, 직접 해볼 과제를 줍니다.
과제를 완료하면 XP를 얻고, 레벨이 올라갑니다. 진행 상태는 서버에 동기화되어 어디서든 이어할 수 있습니다.
커리큘럼 (Week 1 — 무료)
| Day | 주제 | 하는 일 |
|---|---|---|
| Day 0 | 시작하기 | 회원가입, 캐릭터(관심 분야) 설정, 목표 선언, Discord 합류 |
| Day 1 | 현재 상태 진단 | AI 코파운더와 1:1 인터뷰 → 핵심 병목 파악 → 첫 랜딩페이지 배포 |
| Day 2 | 고객 검증 | Mom Test 방법론 학습, 공유 채널 선정, 실제 피드백 3건 수집 |
| Day 3 | 제품 설계 | 수집한 피드백 기반으로 제품 스펙(SPEC v1) 작성 |
| Day 4 | 반응 분석 | 고객 반응 해석, 다음 버전에 반영할 변경사항 정리 |
| Day 5 | 반복 개선 | 추가 고객 증거 수집, SPEC v2 업데이트, 유지/수정 판단 |
| Day 6 | 수익화 | 실제 결제 의향 확인, 가격 제안 설계 |
| Day 7 | 회고 | Week 1 종합 리뷰, KPTL 회고, Week 2 계획 수립 |
Day 8부터는 유료 구독으로 Day 30까지 이어집니다.
Requirements
- Google 계정 (OAuth 로그인용)
- Node.js 18+ 설치 (
npx포함) - 아래 중 하나:
- Claude Code — Claude Pro 또는 Max 플랜 구독 필요
- Codex CLI — ChatGPT Plus, Pro, 또는 Team 플랜 구독 필요
Getting Started
Claude Code
# 1. 설치
claude plugin marketplace add october-academy/agnt
claude plugin install agnt@agentic30
# 2. Claude Code 실행
claudeClaude Code 안에서:
# 3. MCP 인증 (필수 — 최초 1회)
/mcp
→ plugin:agnt:agentic30 선택 → Authenticate → 브라우저에서 Google 로그인
# 4. 시작
/agnt:continueCodex
# 1. 설치
npx skills add october-academy/agnt --agent codex --skill agnt -g -y
# 2. MCP 인증 (필수 — 최초 1회)
codex mcp add agentic30 --url https://mcp.agentic30.app/mcp
codex mcp login agentic30
codex mcp list # agentic30가 enabled + Auth: OAuth이면 정상
# 3. 시작
codex
$agnt-continueUpdate
Claude (Marketplace + Plugin)
claude plugin marketplace update agentic30
claude plugin update agnt@agentic30Codex (npx skills)
# 업데이트 확인
npx skills check
# 설치된 스킬 업데이트
npx skills update
# (선택) agnt만 최신으로 재설치
npx skills add october-academy/agnt --agent codex --skill agnt -g -yCommand Map
| 목적 | Claude | Codex (권장) |
|---|---|---|
| 이어하기 | /agnt:continue | $agnt-continue |
| 초기화 | /agnt:init | $agnt-init |
| 오늘 퀘스트 | /agnt:today | $agnt-today |
| 제출 | /agnt:submit | $agnt-submit |
| 상태 | /agnt:status | $agnt-status |
Codex 호환 입력: $agnt continue, $agnt today 등.
Uninstall
Claude Code
claude plugin uninstall agnt@agentic30
claude plugin marketplace remove agentic30
rm -rf ~/.claude/agnt .claude/agnt
rm -rf ~/.claude/plugins/marketplaces/agentic30
rm -rf ~/.claude/plugins/cache/agentic30Codex
# global 설치 제거
npx skills remove -g --agent codex --skill agnt -y
# project 설치 시 추가 실행
npx skills remove --agent codex --skill agnt -y
codex mcp logout agentic30
codex mcp remove agentic30
# 선택: 로컬 데이터 정리
rm -rf ~/.codex/agnt .codex/agnt ~/.codex/skills/agnt ~/.agents/skills/agntTroubleshooting
- MCP 미연결:
- Claude:
/mcp에서plugin:agnt:agentic30재인증 - Codex:
codex mcp add/login/list재실행 references를 찾을 수 없습니다:- 모노레포:
bun run sync:assistant-assets - 외부 사용자: skill/plugin 재설치
- 설치 확인:
npx skills listLinks
- Website: https://agentic30.app
- Repo: https://github.com/october-academy
- License: MIT
견습생의 마을에 오신 것을 환영합니다
ROOM
돌길 끝 작은 광장에 선다. 작업대 위에는 낡은 장부와 새 장비가 함께 놓여 있다.
망치 소리가 한 번 울리고, 바람이 천천히 깃발을 흔든다.
NPC
두리가 작업대를 두드린다.
━━━━━━━━━━━━━━━━━━━━━━━━━━ 🏘️ 촌장 두리 "말보다 행동이지." 따뜻하지만 단호한 행동파 ━━━━━━━━━━━━━━━━━━━━━━━━━━
"왔구나. 여긴 구경하는 곳이 아니야.
30일 안에 실제 유저와 첫 매출 신호를 확인하는 곳이지.
완벽한 계획보다 실제로 확인한 것이 이긴다. 유저 반응, 클릭, 결제 의향 — 여기선 그걸 '검증'이라고 불러.
작은 검증을 빨리 쌓는 쪽이 늘 이겨."
SCENE 1: Day 0의 역할
두리가 장부 첫 장을 펼친다.
"오늘은 네 가지면 충분해.
1. Agentic30에 등록한다 2. 지금 파고 싶은 문제를 적는다 3. 30일 목표를 선언한다 4. Discord에 합류한다
내일은 빌더 상태를 진단하고 검증 문서 — 여기선 SPEC이라 부른다 — 의 첫 버전을 만든다.
그리고 이번 주에 확인할 목표, 검증 목표를 세운다.
누군가는 랜딩을 바로 쓰고, 누군가는 기존 제품을 점검하고, 누군가는 매출 병목부터 본다. 전부 같은 루트로 밀어 넣지 않아."
CHOICE
AskUserQuestion: 질문: 두리가 묻는다. "어떤 상태로 들어왔어?" 선택지:
1. "문제는 있는데 만든 건 없어요." → 반응: "좋아. 그러면 처음부터 시작해서 사람이 반응할 수 있는 표면 — 검증 채널을 만들면 돼." → trust: 두리 +1 → tendency: validator +1 2. "이미 랜딩이나 제품이 있어요." → 반응: "좋아. 그러면 처음부터 다시 만들지 말고 있는 것에서 검증해보자." → trust: 두리 +1 → tendency: executor +1 → LANDING_SCOUT로 진행 3. "뭘 해야 할지 아직 흐릿해요." → 반응: "괜찮아. 오늘은 선명하게 만드는 날이야." → trust: 두리 +0 → tendency: validator +1
→ 1, 3번은 다음 TASK로 진행 → 2번은 LANDING_SCOUT 후 TASK로 진행
LANDING_SCOUT
2번("이미 랜딩이나 제품이 있어요") 선택 시에만 진행합니다.
두리가 작업대에서 확대경을 꺼낸다.
"있다고 했지? 주소를 알려줘. 직접 가서 볼게."
AskUserQuestion: 질문: 두리가 묻는다. "랜딩이나 제품 주소가 뭐야?" 선택지: 1. "아직 주소는 없어"
"아직 주소는 없어" 선택 시: 두리: "그래도 괜찮아. 있는 것 기준으로 가자." → TASK로 진행
사용자가 URL을 직접 입력한 경우:
1. WebFetch로 해당 URL에 접속합니다.
- 실패 시 WebSearch로 URL 또는 도메인을 검색하여 맥락을 파악합니다.
2. 페이지 내용에서 아래 정보를 추출합니다:
- 제품/서비스 이름
- 핵심 가치 제안 (어떤 문제를 해결하는가)
- 타겟 사용자
- 현재 CTA (Call-to-Action)
- 페이지 구성 (히어로, 기능 소개, 가격, 소셜 증거 등)
- 전반적 완성도와 개선 여지
두리가 분석 결과를 짧게 요약합니다:
"봤어. [제품명/서비스 한 줄]. [핵심 가치 제안 요약]. [현재 상태 또는 눈에 띄는 점 1개]."
state.json character.existingLanding에 저장합니다:
{
"url": "입력된 URL",
"productName": "추출된 제품/서비스명",
"valueProp": "핵심 가치 제안",
"target": "타겟 사용자",
"cta": "현재 CTA",
"structure": ["히어로", "기능", ...],
"analysis": "전반적 분석 2-3문장"
}이 데이터는 이후 block1(캐릭터 생성)과 block2(목표 선언)에서 NPC가 참조하여 대화를 진행합니다.
→ TASK로 진행
TASK
두리가 짧게 정리한다.
"오늘 기억할 건 세 가지야.
- Day 0은 방향을 억지로 넓히는 날이 아니다
- 내일 바로 검증할 수 있는 상태까지 정리한다
/agnt:continue로 매일 이어간다
여기선 '좋은 아이디어'보다 '내가 바로 확인할 수 있는 가설'이 더 중요해."
STOP
두리가 고개를 든다.
"준비됐으면 다음, 아직 정리가 안 됐으면 아직."
AskUserQuestion: 질문: 두리가 묻는다. "Day 0의 역할이 정리됐어?"
1. "다음" 2. "아직"
⛔ STOP — "촌장 두리가 기다립니다."
AskUserQuestion에서 "다음"을 선택했을 때만 RETURN으로 진행합니다. "아직"을 선택하면 STOP에서 대기합니다.
RETURN
두리가 다시 묻는다.
"여기서 제일 중요한 건 뭐지?"
CHECK
AskUserQuestion: 질문: 두리가 묻는다. "Day 0에서 가져가야 할 태도는?" 선택지:
1. "먼저 아이디어를 완벽하게 만든다" 2. "현재 상태를 선명하게 적고 내일 검증할 것을 준비한다" 3. "툴부터 전부 설치하고 나중에 생각한다" 4. "잘 모르겠어요"
정답: 2번. 두리가 웃는다. "맞아. 말보다 행동이지. 내일 확인할 질문이 없으면 오늘 준비가 덜 된 거야."
AUTH_GATE
CHECK 완료 후 실행합니다. MCP 연결과 회원가입을 완료해야 MOVE로 진행합니다.
Step 1: MCP 연결
ToolSearch로 +agentic30 검색합니다.
도구 발견됨 → Step 2로 진행합니다.
도구 없음:
두리가 카운터 뒤 장부를 두드린다.
"네 기록이 남으려면 장부가 열려야 해."
Bash로 open https://go.agentic30.app/join 실행하여 브라우저를 엽니다.
"브라우저가 열렸어. Google 계정으로 가입해."
AskUserQuestion: 질문: 두리가 묻는다. "가입 끝났어?" 선택지: 1. "확인"
"좋아. 장부를 연결하자."
━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔧 MCP 연결 1. /mcp 입력 2. plugin:agnt:agentic30 선택 (↑↓, Enter) 3. Authenticate 선택 4. 브라우저에서 동의 + Google 로그인 ━━━━━━━━━━━━━━━━━━━━━━━━━━
AskUserQuestion: 질문: 두리가 묻는다. "연결 끝났어?" 선택지: 1. "확인"
ToolSearch +agentic30 재확인합니다. 실패 시 두리: "아직 안 됐어. 다시 해보자." → 안내 반복
Step 2: 프로필 확인
ToolSearch로 로딩된 get_user_info를 호출합니다.
호출 실패 (인증 에러): MCP 도구가 보이지만 인증이 안 된 상태입니다. Step 1의 "도구 없음" MCP 연결 안내로 돌아갑니다.
hasOnboardingProfile이 true: 두리: "등록돼 있구나." state.json authenticated를 true로 갱신합니다. → MOVE로 진행
hasOnboardingProfile이 false:
{REFS_DIR}/shared/profile-constants.json을 Read합니다.
두리가 장부를 펼친다.
"계정은 열렸는데 장부에 이름이 없어. 몇 가지만 적자."
아래 순서로 NPC 대화 + AskUserQuestion을 진행합니다. 각 질문의 선택지는 profile-constants.json의 label을 사용하고, 선택 결과는 대응하는 value로 매핑합니다.
1. 이름: googleName이 있으면 확인 ("이 이름 맞아?"), 없거나 거부하면 직접 입력 2. 직무 배경: backgroundHierarchy 상위 카테고리 → 하위 옵션 2단계 ("어떤 일을 해?" → "좀 더 구체적으로?") 3. 사이드프로젝트 경험: sideprojectExperienceOptions ("사이드프로젝트 경험은?") 4. 유입 경로: referralSourceOptions ("여긴 어떻게 알았어?")
수집 완료 후 complete_onboarding MCP 도구를 호출합니다:
- name, background, sideproject_experience, referral_source
두리: "좋아. 장부에 기록했어." state.json authenticated: true 갱신 → MOVE
호출 실패 시 최대 2회 재시도. 3회 실패 → 두리: "장부가 안 돼. /agnt:continue로 다시 와." (블록 완료 처리 안 함)
MOVE
두리가 우물 쪽을 가리킨다.
"좋아. 이제 네가 어떤 문제를 붙잡고 있는지 보자."
광장을 가로질러 우물 옆 벤치로 걸어간다. 바람이 깃발을 느리게 흔들고, 어디선가 종이 넘기는 소리가 난다.
두리가 벤치에 걸터앉으며 말한다. "앉아."
캐릭터 생성 — 문제를 깊게 탐색하기
ROOM
광장 우물 옆 벤치에 앉는다. 멀리서 아이들 소리가 들리고, 바람이 천천히 깃발을 흔든다.
NPC
두리가 손바닥으로 벤치를 한 번 친다.
🏘️ 촌장 두리
"오늘은 하나를 고집하는 날이 아니야. 먼저 네가 어떤 문제에 진짜 오래 붙잡혀 있었는지 보자.
아이디어가 없으면 문제를 파고, 이미 뭔가 있으면 병목을 파고, 이미 매출이 있으면 지금 막히는 지점을 파면 된다."
CONVERSATION
이 대화의 목적은 정답을 확정하는 것이 아니라 Day 1 인터뷰 전에 쓸 탐색 노트를 만드는 것입니다.
완성 체크리스트
아이디어 없음 / 아이디어만 있음
- [ ] 반복적으로 보이는 문제 2개 이상
- [ ] 그 문제를 겪는 사람 2개 이상
- [ ] 최근 실제 장면 1개 이상
- [ ] 왜 지금 이 문제를 파고 싶은지
랜딩 운영 중 / 제품 운영 중 / 매출 발생 중
- [ ] 현재 단계 1개
- [ ] 가장 큰 병목 1개
- [ ] 최근 실제 증거 1개
- [ ] 지금 다음 검증이 필요한 이유
대화 규칙
- 모호한 자기소개로 끝내지 않음
- "누가 / 언제 / 왜 반복되는가"까지 파고듦
- 이미 뭔가 만든 사람은 새 아이디어 브레인스토밍으로 빠지지 않음
- 두리 말투: 짧고 직접적, "그건 장면이 없어. 다시."
SUMMARY
두리가 우물 가장자리에 메모를 펼친다.
예시:
탐색 노트
- 후보 문제:
1) ...
2) ...
- 반복 장면:
- ...
- 현재 상태/병목:
- ...
- 내일 인터뷰에서 확인할 것:
- ...두리: "좋아. 오늘은 여기까지. 아직 못 박지 말고 비교 재료만 남겨."
STOP
AskUserQuestion: 질문: 두리가 묻는다. "탐색 노트가 정리됐어?"
1. "확인" 2. "수정 요청"
⛔ STOP — "촌장 두리가 기다립니다."
ON_COMPLETE
AskUserQuestion에서 "확인"을 선택했을 때만 ON_COMPLETE를 수행합니다.
1. save_character는 MCP 호출이 아니라 로컬 state 액션입니다. 2. state.json character.exploration에 후보 문제/타겟/장면/병목을 저장합니다. 3. 이미 뭔가 만든 사람은 현재 stage와 병목을 같은 위치에 저장합니다. 4. 이 블록에서는 최종 프로젝트를 확정하지 않습니다.
MOVE
두리가 서약의 돌을 가리킨다.
"좋아. 이제 후보를 비교해서 하나를 고르자.
내일 뭘 검증할지 연결되는 선언이어야 해."
목표 선언 — 무엇을 만들지 최종 확정
ROOM
광장 안쪽 서약의 돌 앞에 선다. 돌 표면에는 이전 참가자들의 짧은 선언이 빼곡하다.
NPC
두리가 돌 앞에서 돌아선다.
🏘️ 촌장 두리
"여기선 두 가지를 고정한다.
1. 이번에 밀 프로젝트 또는 병목 2. 30일 목표
내일부터는 그 선언을 기준으로 builder 상태와 검증 결과를 읽을 거야.
그러니까 멋진 문장보다 검증 가능한 문장이 필요해."
CONVERSATION
이 블록의 목적은 Day 1부터 시작할 검증 순환 — 가설을 세우고, 검증 결과를 모으고, 판단하고, 다시 가설을 세우는 루프 — 의 출발점을 명확히 하는 것입니다. 여기선 이 순환을 검증 루프라고 부릅니다.
완성 체크리스트
아이디어 없음 / 아이디어만 있음
- [ ] 후보 2개 이상 비교
- [ ] 최종 프로젝트 1개 확정
- [ ] 왜 이걸 먼저 미는지 이유 3가지
- [ ] 30일 목표 1개
- [ ] 24시간 안 첫 검증 행동 1개
랜딩 운영 중 / 제품 운영 중 / 매출 발생 중
- [ ] 현재 단계 확정
- [ ] 가장 큰 병목 1개
- [ ] 30일 목표를 현재 단계에 맞게 재선언
- [ ] 이번 주 검증 목표 1개
- [ ] 24시간 안 첫 행동 1개
목표 카테고리 분류
대화 내용에서 참가 목적을 추론합니다. 5개 중 하나:
- startup (창업 준비)
- side_income (부수입/사이드 프로젝트)
- ai_learning (AI/기술 학습)
- employment (취업 준비)
- job_change (이직/전직)
SUMMARY에서 카테고리를 포함하고, 유저에게 맞는지 확인합니다.
목표 선언 기준
- "성공" 같은 추상어 금지
- 행동/숫자/증거가 들어가야 함
- Agentic30 기본 미션과 충돌하지 않아야 함
- 실제 사용자 반응
- 첫 수익화 신호
예시:
- "나는 30일 안에 freelancer PM 10명에게서
반복 문제 증거를 확보한다."
- "나는 30일 안에 현재 랜딩에서
유료 시범 제안으로 구체적 결제 의향 1건을 만든다."
SUMMARY
두리가 돌 표면을 손가락으로 짚는다.
최종 선언
- 프로젝트/병목: ...
- 왜 지금 이걸 미는가: ...
- 목표 카테고리: ...
- 30일 목표: ...
- 이번 주 검증 목표: ...
- 24시간 액션: ...두리: "좋아. 이 문장은 내일 SPEC baseline의 입구가 될 거야."
STOP
AskUserQuestion: 질문: 두리가 묻는다. "목표 선언문이 맞아?"
1. "확인" 2. "수정 요청"
⛔ STOP — "촌장 두리가 기다립니다."
ON_COMPLETE
AskUserQuestion에서 "확인"을 선택했을 때만 ON_COMPLETE를 수행합니다. "수정 요청"이면 CONVERSATION으로 돌아가 보완 후 SUMMARY → STOP을 반복합니다.
1. state.json에 character.project, character.target, goal, nextAction, nextProofTarget을 저장합니다. 2. 이미 뭔가 만든 사람은 새 프로젝트 대신 현재 병목과 검증 목표를 저장합니다. 3. 대화에서 추론한 목표 카테고리를 state.json character.goalCategory에 저장합니다. 4. 인증 상태면 save_profile에 goalCategory 파라미터를 포함하여 save_profile과 submit_practice 흐름을 수행합니다.
MOVE
두리가 골목 쪽을 가리킨다.
"좋아. 이제 동료들한테도 지금 어디에 서 있는지 보여주자.
혼자 끌고 가지 말고."
Discord 합류 — 동료 모험가를 만나다
ROOM
술집 문을 밀고 들어선다. 사람들 목소리가 겹쳐 들리고, 나무 탁자 위로 불빛이 흔들린다.
NPC
두리가 안쪽 탁자를 가리킨다.
🏘️ 촌장 두리
"여긴 네가 오늘 무엇을 밀기로 했는지 짧게 드러내는 곳이야.
자기소개는 인사치레가 아니라 현재 가설과 다음 검증 목표를 공유하는 일이지."
GUIDE
1단계: Discord 연동 + 서버 가입
- 계정 연동 여부 확인
- 서버 멤버십 확인
d0-discord-join검증
연동이 끝나면 바로 다음 단계로 넘어간다.
2단계: 자기소개 작성
멤버십 확인 후 #자기소개 채널 가이드 메시지를 Bash로 연다: open "https://discord.com/channels/1463373562000838774/1463432947745947759/1467136426796908647"
링크도 텍스트로 표시한다 (open 실패 fallback): https://discord.com/channels/1463373562000838774/1463432947745947759/1467136426796908647
NPC가 안내한다: "'자기소개 작성하기' 버튼을 눌러. 아까 등록한 내용이 채워져 있을 거야."
유저가 "자기소개 작성하기" 버튼 → pre-fill된 Modal 작성 → 전송. 봇이 #자기소개 채널에 게시하고 AI 피드백 쓰레드를 만든다.
자기소개 핵심은 세 가지다:
- 현재 하는 일
- Agentic30 참여 목적
- 30일 목표
좋은 예:
- "현재 랜딩 전환 병목을 보고 있어요"
- "이번 주 검증 목표는 결제 의향 확인 1건입니다"
나쁜 예:
- "열심히 해보겠습니다"
- "사이드프로젝트 시작했어요"
PREVIEW
두리가 손가락으로 두 번 두드린다.
"오늘 Discord에 남기는 건 네 출발점 공유야.
내일 Day 1에서 SPEC baseline과 첫 검증 채널로 이어질 출발점이라고 생각하면 돼."
STOP
AskUserQuestion: 질문: 두리가 묻는다. "Discord 연동과 자기소개 제출까지 끝났어?"
1. "제출 완료" 2. "아직"
⛔ STOP — "촌장 두리가 기다립니다."
ON_CONFIRM
AskUserQuestion에서 "제출 완료"를 선택하면 반드시 서버 검증을 수행합니다.
1. 멤버십 검증 2. 자기소개 메시지 확인 3. d0-discord-join, d0-discord-intro 제출 처리
메시지가 확인되면 "네 출발점이 기록됐다"는 의미다.
MOVE
술집을 나오자 게시판 앞에 빈 칸이 보인다.
두리가 말한다.
"좋아. 동료들한테 인사했으니 이제 밖에서도 보이는 프로필을 만들자."
바이오 페이지 — 공개 프로필 만들기
ROOM
술집을 지나 게시판 앞에 선다. 알림장 옆에 빈 칸이 하나 있다.
NPC
두리가 빈 칸을 가리킨다.
🏘️ 촌장 두리
"Discord에서 얼굴을 보여줬으니 이제 밖에서도 보이는 공개 프로필을 만들 차례야.
나중에 랜딩이나 채널을 공유할 때 사람들이 '이 사람 누구지?' 하면 바로 볼 수 있는 한 장짜리 페이지.
여기선 그걸 바이오 페이지라고 불러."
GUIDE
1단계: 바이오 페이지 생성
update_bio MCP 도구를 호출합니다:
display_name: state.json의character.name또는 프로필 이름description: 목표 선언에서 추출한 한 줄 소개 (30자 이내)
예시:
display_name: "유호균"
description: "30일 안에 첫 매출을 만드는 개발자"2단계: 소셜 링크 추가
GitHub 또는 다른 소셜이 있으면 추가합니다.
AskUserQuestion: 질문: 두리가 묻는다. "GitHub나 다른 소셜 계정 있어?" 선택지: 1. "GitHub 있어요" 2. "다른 소셜 있어요" 3. "나중에 할게요"
1번/2번 선택 시: AskUserQuestion으로 URL을 받아 update_bio에 socials 배열로 전달합니다.
3번 선택 시: 두리: "괜찮아. 나중에 여기서 추가할 수 있어." https://agentic30.app/settings/bio
3단계: 첫 블록 추가
manage_bio_blocks MCP 도구로 text 블록을 추가합니다:
action: "add"block_type: "text"data: { "text": 목표 선언문 요약 (block2에서 확정한 내용) }
두리: "바이오에 네 목표가 박혔어. 앞으로 랜딩, 프로젝트 링크, 채널 성과까지 여기에 쌓인다."
4단계: 추천 읽기
두리가 게시판에서 종이 세 장을 꺼낸다.
"시작하기 전에 읽어두면 좋은 게 있어. 오늘 밤이나 내일 아침에 훑어봐."
create_utm_link MCP 도구로 {REFS_DIR}/shared/week1-reading-list.md의 Day 0 섹션을 Read합니다.
- 공통값:
channel="blog",utmSource="agnt",utmMedium="reading" - 항목별
url,title,utmCampaign,utmContent는 Day 0 섹션을 그대로 사용합니다. - 유저 맥락에 맞게 3개 링크를 생성하고 short URL을 아래 형식으로 정리합니다.
생성된 단축 링크를 목록으로 표시합니다:
📚 Day 0 추천 읽기
1. Agentic30이란 무엇인가 → {shortUrl}
2. Agentic Engineer 선언 → {shortUrl}
3. GPP: 전문화의 종말 → {shortUrl}두리: "링크를 눌러서 읽으면 내가 읽었는지 알 수 있어. 나중에 확인할게."
PREVIEW
두리가 게시판에 프로필 카드를 건다.
get_bio MCP 도구를 호출하여 현재 바이오 상태를 확인합니다.
바이오 페이지 URL을 표시합니다: https://agentic30.app/bio/{slug}
두리: "이게 네 공개 프로필이야. 수정은 여기서 할 수 있어: https://agentic30.app/settings/bio
링크 관리는 여기: https://agentic30.app/dashboard/links"
STOP
AskUserQuestion: 질문: 두리가 묻는다. "바이오 페이지 만들었어?"
1. "완료" 2. "아직"
⛔ STOP — "촌장 두리가 기다립니다."
ON_CONFIRM
AskUserQuestion에서 "완료"를 선택하면 서버 검증을 수행합니다.
verify_server_state check: bio_setup
verified: true: 두리: "좋아. 네 이름표가 걸렸어." → d0-bio-setup submit_practice 처리
verified: false: 두리: "아직 바이오가 비어 있어. 블록을 하나라도 추가해야 해." → GUIDE 3단계로 돌아감
추천 읽기 검증 (side quest)
get_links source: "manual"로 조회하여 utmMedium: "reading", utmCampaign: "day0"인 링크 중 click_count > 0인 것이 1개 이상이면 → d0-reading submit_practice 처리
0개면 건너뜀 (side quest이므로 필수 아님)
MOVE
게시판을 지나 멀리 숲 입구에 등불이 흔들린다.
두리가 말한다.
"내일은 소리를 만난다. 거기서 네 상태를 진단하고 첫 검증 루프를 연다.
오늘 적은 소개와 바이오 페이지가 내일 출발점이 된다."
{
"day": 0,
"totalEstimatedMinutes": 85,
"location": "견습생의 마을",
"description": "모든 여정의 시작. 이곳에서 당신의 정체성을 만듭니다.",
"blocks": [
{ "file": "block0-welcome.md", "title": "견습생의 마을에 오신 것을 환영합니다", "estimatedMinutes": 15 },
{ "file": "block1-character.md", "title": "캐릭터 생성 — 문제를 깊게 탐색하기", "estimatedMinutes": 20 },
{ "file": "block2-goal.md", "title": "목표 선언 — 무엇을 만들지 최종 확정", "estimatedMinutes": 15 },
{ "file": "block3-discord.md", "title": "Discord 합류 — 동료 모험가를 만나다", "estimatedMinutes": 20 },
{ "file": "block4-bio.md", "title": "바이오 페이지 — 공개 프로필 만들기", "estimatedMinutes": 15 }
],
"quests": [
{ "id": "d0-goal", "type": "main", "title": "목표 선언문 작성", "xp": 50 },
{ "id": "d0-discord-join", "type": "main", "title": "Discord 연동", "xp": 50 },
{ "id": "d0-discord-intro", "type": "main", "title": "Discord 자기소개", "xp": 50 },
{ "id": "d0-bio-setup", "type": "main", "title": "바이오 페이지 셋업", "xp": 50 },
{ "id": "d0-reading", "type": "side", "title": "추천 읽기 완료", "xp": 20 },
{ "id": "d0-kr-bip-channels", "type": "side", "title": "X + Threads BIP 채널 설정", "xp": 20 },
{ "id": "d0-kr-community", "type": "side", "title": "한국 인디해커 커뮤니티 확인", "xp": 20 },
{ "id": "d0-kr-bio", "type": "side", "title": "Agentic30 바이오 설정", "xp": 20 }
]
}
빌더 상태 진단 준비
ROOM
숲 입구 오솔길에 들어선다. 빛줄기가 잎 사이로 내려오고, 젖은 흙 냄새가 얇게 퍼진다.
NPC
소리가 낡은 노트를 덮는다.
━━━━━━━━━━━━━━━━━━━━━━━━━━ 🦉 현자 소리 "정말 그런가?" 질문으로 이끄는 사려깊은 안내자 ━━━━━━━━━━━━━━━━━━━━━━━━━━
"오늘은 네 출발선을 고정하고 SPEC baseline 기준선을 만들 거야.
출발선이 다르면 검증 방향도 달라지거든.
예쁜 답보다 실제 장면이 필요해."
CONTEXT_GATE
state.json에 builderContext.entryMode가 존재하거나 character.exploration이 존재하면:
소리가 노트를 넘긴다.
"좋아. 네 상태는 이미 알아. {character.exploration.stage}이고, {character.exploration.bottleneck}이 가장 큰 벽이라고.
오늘은 그 진단을 다른 각도에서 파볼 거야."
→ SCENE 1, SCENE 2, TASK, STOP, RETURN을 건너뛰고 MOVE로 진행합니다.
{단일중괄호} 변수는 AI가 state.json에서 직접 읽어 채웁니다 (RECAP 규칙과 동일).character.exploration이 없고builderContext만 있으면,builderContext.assetStage/primaryBottleneck의 한국어 라벨(용어 도입 프로토콜 카테고리 4)을 사용합니다.
둘 다 없으면 아래 SCENE 1부터 정상 진행합니다.
SCENE 1: Builder state를 왜 먼저 보나
소리가 네 줄을 적는다.
- 아이디어만 있으면 문제/타겟을 본다
- 랜딩이 운영 중이면 메시지와 행동 유도 버튼(CTA), 채널을 본다
- 제품이 운영 중이면 첫 사용 경험과 가격 설정 병목을 본다
- 매출이 있으면 가장 큰 성장/수익 병목을 본다
"같은 Day 1이라도 출발선이 다르면 첫 검증 채널도 달라.
처음부터 시작하는 사람은 첫 표면을 만들고, 이미 뭔가 만든 사람은 지금 표면을 더 선명하게 만든다."
CHOICE
AskUserQuestion: 질문: 소리가 묻는다. "오늘 가장 먼저 확인해야 할 건 뭐지?" 선택지:
1. "내가 지금 어느 상태에 있는지" 2. "바로 새 랜딩을 만드는 것" 3. "기능 목록부터 정리하는 것"
정답: 1번. 소리가 고개를 끄덕인다. "맞아. 상태 진단 없이 액션부터 고르면 증거가 아니라 바쁨만 남아."
SCENE 2: Day 1 결과물
소리가 오늘 남길 산출물을 짚는다.
1. 빌더 진단 결과 초안 2. SPEC baseline 기준선 3. 첫 검증 목표 4. 첫 검증 채널
"여기서 핵심은 '무엇을 만들까?'보다 '무엇을 검증하나?'야."
TASK
소리가 묻는다.
"들어가기 전에 네 상태를 속으로라도 정리해."
- 현재 단계
- 가장 큰 병목
- 지금 확인하고 싶은 검증
STOP
AskUserQuestion: 질문: 소리가 묻는다. "진단 질문을 받을 준비가 됐어?"
1. "다음" 2. "아직"
⛔ STOP — "현자 소리가 기다립니다."
RETURN
AskUserQuestion: 질문: 소리가 묻는다. "Day 1에서 바로 고정해야 하는 건?" 선택지:
1. "builder 상태와 첫 검증 목표" 2. "최종 기능 명세 전체" 3. "광고 집행 예산"
정답: 1번. 소리가 미소 짓는다. "좋아. 그 기준으로 인터뷰를 시작하자."
MOVE
소리가 숲 안쪽을 가리킨다.
"이제 앉아. 기준선을 잡자."
Builder 진단 + SPEC baseline 기준선
ROOM
숲 깊은 곳, 고대 나무 뿌리 앞에 앉는다. 고요한 공기 위로 잎사귀 소리만 스친다.
NPC
소리가 노트를 펼친다.
🦉 현자 소리
"좋아. 여기가 오늘의 핵심이야.
SPEC baseline 기준선을 만들고 이번 주 첫 검증 목표를 좁힌다.
예쁜 답보다 실제 장면이 필요해."
CONVERSATION
완성 체크리스트
확인 항목 (Day 0 데이터가 있으면 1턴으로 확인)
character.exploration 또는 builderContext가 있으면 아래 항목을 재질문하지 않고 "네가 X라고 했는데, 맞아?" 형태로 빠르게 확인합니다. 유저가 "아니, 바뀌었어"라고 부정하면 해당 항목을 재탐색합니다. 데이터가 없으면 처음부터 질문합니다.
- [ ] 현재 stage 1개
- [ ] 핵심 병목 1개
신규 발견 항목 (Day 1 고유)
- [ ] 병목의 반론: 정말 그게 가장 큰 병목인가? 다른 가능성은?
- [ ] 대안/경쟁: 같은 문제를 다르게 풀고 있는 곳은?
- [ ] 한국 시장 포지션: 한국에서 비슷한 서비스가 있는가? 가격대와 타겟은?
- [ ] 현재 채널 또는 만들 채널 1개
- [ ] 기준 가설 1개
- [ ] 이번 주 첫 검증 목표 1개
대화 규칙
- "누구를 위해 무엇을 확인하려는가"가 빠지면 다시 묻기
- 이미 뭔가 만든 사람은 새 아이디어로 빠지지 않기
- no_idea 유저는 문제 장면 없이 solution으로 점프하지 않기
- Day 0에서 확정된 stage/bottleneck은 "맞아?" 확인 후 반론/대안 쪽으로 넘어가기
- 반론/대안/경쟁 질문은 건너뛰지 않기 (interview-guide.md "Day 1 검증 인터뷰 추가 규칙" 참조)
- 소리 말투: "정말 그런가? 어떤 장면에서?"
인터뷰 핵심 질문
Day 0 데이터가 있는 경우 (character.exploration 또는 builderContext 존재):
1. Day 0에서 {primaryBottleneck}이 병목이라고 했는데, 정말 그런가? 증거는? 2. 같은 문제를 다르게 풀고 있는 대안/경쟁은? 3. 이 방향으로 가면 포기해야 하는 건 뭔가? (전환비용) 4. 이번 주 무엇이 증명되면 앞으로 밀 수 있는가 5. 어떤 채널에서 그 검증을 받을 것인가
Day 0 데이터가 없는 경우:
1. 지금 단계는 무엇인가 2. 현재 가장 큰 병목은 무엇인가 3. 이 병목을 보여주는 최근 증거는 무엇인가 4. 이번 주 무엇이 증명되면 앞으로 밀 수 있는가 5. 어떤 채널에서 그 검증을 받을 것인가
SUMMARY
소리가 오늘 기준선을 읽는다.
Day 1 기준선
- 진입 경로 (entry mode): ...
- 현재 단계 (asset stage): ...
- 핵심 병목 (primary bottleneck): ...
- 반론/대안 (challenges): ...
- 기준 가설 (baseline hypothesis): ...
- 이번 주 검증 목표: ...
- 첫 검증 채널: ...소리: "좋아. 이게 오늘의 SPEC baseline 재료다."
STOP
AskUserQuestion: 질문: 소리가 묻는다. "기준선이 맞아?"
1. "확인" 2. "수정 요청"
⛔ STOP — "현자 소리가 기다립니다."
ON_COMPLETE
AskUserQuestion에서 "확인"을 선택했을 때만 ON_COMPLETE를 수행합니다.
1. state.json에 interview 결과를 저장합니다. 2. builderContext, builderBrief, primaryBottleneck, nextProofTarget 초안을 갱신합니다. 3. 인증 상태면 interview 저장과 d1-interview 제출을 수행합니다. 4. MCP 미연결 또는 save_interview 실패 시: 인증 미연결이거나 save_interview 실패 시:
- state.json에 interview 결과를
interviewData필드에 로컬 저장 - 소리 대사: "장부가 잠겼어. 기록은 여기 남겨둘게. 나중에 연결되면 동기화할 수 있어."
- 블록 완료는 정상 처리 (Day 1 interview는 로컬 데이터 보존이 우선이므로 narrative-engine.md Section 11 예외 적용)
d1-interview퀘스트 제출은 MCP 재연결 시까지 보류
MOVE
소리가 전망대 쪽을 가리킨다.
"좋아. 이제 그 기준선을 문서와 실행 패키지로 묶자.
무엇을 보여줄지 한 번에 정리해야 해."
SPEC baseline + 다음 액션 패키지
ROOM
숲 외곽 전망대에 선다. 나무 사이로 들판과 마을이 한눈에 내려다보인다.
NPC
소리가 난간에 기대선다.
🦉 현자 소리
"이제 기준선을 실행 가능한 묶음으로 바꿔야 해.
오늘 필요한 건 '거대한 계획'이 아니라 SPEC baseline와 바로 움직일 action package다."
GUIDE
SPEC baseline에 꼭 들어갈 것
### v0 (Day 1)
- 핵심 가설 (Hypothesis): 지금 진행할 핵심 가설
- 수정 사항 (Change Set): 오늘 고정한 현재 방향
- 증거 요약 (Evidence Summary): 현재 가진 출발점
- 판단 기준 (Metric Gate): 첫 검증을 볼 기준
- 수익화 체크포인트 (Monetization Checkpoint): 아직 없음
- 판단 (Decision): 아직 없음
- 다음 단계 (Next Step): 이번 주 첫 검증 목표첫 검증 채널 예시
- 아이디어 없음 / 아이디어만 있음: 간단한 랜딩, 공유 페이지, 파일럿 제안 페이지
- 랜딩 운영 중: 기존 랜딩의 첫 화면(hero)과 행동 유도(CTA), 제안(offer) 정리 후 재공개
- 제품 운영 중: 현재 제품의 첫 사용 경험(onboarding)과 대기 목록, 가격 설정 정리
- 매출 발생 중: 현재 결제와 제안, 첫 사용 경험 병목을 드러내는 채널 정리
"핵심은 형식이 아니라 사람이 반응할 수 있는 표면이냐는 거야."
PREVIEW
소리가 묻는다.
"지금 네 패키지를 읽었을 때 세 가지가 보여야 해.
1. 무엇을 믿고 있는가 2. 어디서 그걸 확인할 것인가 3. 무엇이 나오면 다음으로 갈 것인가"
STOP
AskUserQuestion: 질문: 소리가 묻는다. "SPEC baseline와 액션 패키지가 정리됐어?"
1. "확인" 2. "수정 요청"
⛔ STOP — "현자 소리가 기다립니다."
ON_CONFIRM
AskUserQuestion에서 "확인"을 선택했을 때만 ON_CONFIRM을 수행합니다.
SPEC baseline 기록
state.json specVersions에 v0를 추가합니다.
필수 항목:
hypothesischangesevidenceSummarymetricGatenextStep
인증 상태면 MCP save_spec_iteration 호출 시 Day 1 canonical 필드를 비우지 않습니다.
action package 저장
state.json에 아래를 함께 남깁니다.
proofSurfacenextProofTargetmetricGate
MOVE
소리가 숲 출구를 가리킨다.
"좋아. 이제 진짜로 surface를 공개하자.
처음부터 시작이면 새로 만들고, 이미 있는 것이면 더 선명하게 정리해서 밖으로 내보내."
첫 검증 채널 공개
ROOM
숲을 나서자 들판 바람이 한 번에 밀려온다. 먼 곳 마을 불빛이 점점이 보인다.
NPC
소리가 숲 출구에서 멈춘다.
🦉 현자 소리
"오늘 마지막은 검증 채널를 live 상태로 만드는 거야.
처음 시작하는 사람은 첫 surface를 띄우고, 이미 surface가 있는 사람은 지금 가설에 맞게 정리하고 다시 공개한다.
그리고 공유할 때는 추적 링크를 만들어야 누가 반응했는지 알 수 있어.
Discord에 프로젝트 소개도 남겨."
GUIDE
d1-landing이 뜻하는 것
이 퀘스트는 새 랜딩을 꼭 만든다는 뜻이 아니다.
아래 중 하나면 된다.
- 랜딩/공유 페이지를 live로 배포
- 기존 랜딩의 message/CTA를 Day 1 기준선에 맞게 정리
- 제품/pricing/onboarding surface를 현재 검증 목표에 맞게 공개
공개 전에 확인할 것
1. 현재 가설이 드러나는가 2. 검증 CTA가 한 문장으로 보이는가 3. 링크를 바로 공유할 수 있는가
d1-first-link — 첫 추적 링크
검증 채널을 공개한 뒤, raw URL이 아니라 추적 링크로 공유한다.
추적 링크를 만들면:
- 누가 얼마나 클릭했는지 알 수 있다
- 내일 채널별 성과를 비교할 기반이 된다
- 대시보드에서 실시간으로 확인할 수 있다
MCP create_utm_link 도구로 링크를 생성한다. UTM 파라미터는 대화 맥락에서 결정한다:
targetUrl: 방금 배포한 검증 채널 URLutm_source: 프로젝트명 또는 주요 공유처 (예:my-project,direct)utm_medium: 공유 방식 (예:link,social,messenger)utm_campaign:week1-validationutm_content: 가설 키워드 (예:report-automation) — 선택channel: 공유할 주요 채널명
랜딩을 배포했다면 landingId도 연결한다.
생성된 링크는 https://agentic30.app/dashboard/links 에서도
확인, 수정, 삭제할 수 있다.
내일 Day 2에서 채널별 링크를 더 만들 거다.
d1-bio-landing — 바이오에 랜딩 카드 연결
검증 채널이 live 상태가 되면 바이오 페이지에 landing_card 블록을 추가한다.
manage_bio_blocks MCP 도구:
action: "add"block_type: "landing_card"data: { "landing_id": "{랜딩 ID}" } (랜딩 배포한 경우)
또는 block_type: "link", data: { "url": "{검증 채널 URL}", "title": "{프로젝트명}" }
소리: "바이오에 네 검증 채널이 걸렸어. 사람들이 프로필 보고 바로 눌러볼 수 있다."
바이오 수정: https://agentic30.app/settings/bio
d1-reading — Day 1 추천 읽기
소리가 가죽 주머니에서 종이를 꺼낸다.
"오늘 만든 SPEC과 검증 채널은 이 방법론들의 출발점이야."
create_utm_link MCP 도구로 {REFS_DIR}/shared/week1-reading-list.md의 Day 1 섹션을 Read합니다.
- 공통값:
channel="blog",utmSource="agnt",utmMedium="reading" - 항목별
url,title,utmCampaign,utmContent는 Day 1 섹션을 그대로 사용합니다. - 3개 링크를 생성하고 short URL을 아래 형식으로 정리합니다.
📚 Day 1 추천 읽기
1. 인터뷰 주도 개발 → {shortUrl}
2. 랜딩페이지 전환율 → {shortUrl}
3. The Mom Test 기초 → {shortUrl}소리: "내일 고객 반응을 모으기 전에 읽어두면 질문이 달라진다."
d1-discord-project
Discord #프로젝트-소개 채널에 프로젝트를 소개한다.
인터뷰에서 정리한 내용이 모달에 미리 채워져 있으니 확인하고 제출하면 된다.
- 프로젝트 한 줄 소개
- 해결하려는 문제
- 해결 방법
"프로젝트 소개하기" 버튼을 눌러 모달을 열고 제출해.
STOP
AskUserQuestion: 질문: 소리가 묻는다. "검증 채널 공개와 프로젝트 소개가 끝났어?"
1. "확인" 2. "수정 요청"
⛔ STOP — "현자 소리가 기다립니다."
ON_CONFIRM
AskUserQuestion에서 "확인"을 선택했을 때만 ON_CONFIRM을 수행합니다.
1. d1-landing: live surface가 확인되면 제출합니다. 2. d1-first-link: MCP create_utm_link를 호출하여 검증 채널의 첫 추적 링크를 생성합니다.
targetUrl: 배포된 검증 채널 URLutm_source,utm_medium,channel:
대화에서 파악한 프로젝트/채널 정보로 채운다
utm_campaign:week1-validationutm_content: 가설 키워드 — 선택- 랜딩 배포한 경우
landingId연결 - 생성된 short URL을 유저에게 보여준다
- state.json에
firstTrackingLink로 저장한다
3. d1-bio-landing: get_bio로 바이오에 landing_card 또는 link 블록이 있는지 확인합니다. 없으면 manage_bio_blocks로 추가 후 제출합니다. 4. d1-discord-project: 프로젝트 소개가 확인되면 제출합니다. 5. d1-reading: get_links source: "manual"로 조회하여 utmMedium: "reading", utmCampaign: "day1"인 링크 중 click_count > 0인 것이 1개 이상이면 제출합니다. 6. d1-branding: package.json이 있으면 hidden quest로 처리합니다.
MOVE
소리가 들판 너머 광장을 가리킨다.
"좋아. 내일은 바리를 만난다.
이제부터는 '뭘 만들었나'보다 '누가 어떻게 반응했나'가 더 중요해."
{
"day": 1,
"totalEstimatedMinutes": 70,
"location": "발견의 숲",
"description": "현재 단계와 병목을 진단하고 Week 1 SPEC baseline 기준선과 다음 검증 목표를 세우는 날.",
"blocks": [
{ "file": "block0-prep.md", "title": "빌더 상태 진단 준비", "estimatedMinutes": 10 },
{ "file": "block1-interview.md", "title": "AI 코파운더 진단 인터뷰", "estimatedMinutes": 25 },
{ "file": "block2-generate.md", "title": "SPEC baseline + 다음 액션 패키지", "estimatedMinutes": 15 },
{ "file": "block3-deploy.md", "title": "첫 검증 채널 공개", "estimatedMinutes": 20 }
],
"quests": [
{
"id": "d1-interview",
"type": "main",
"title": "Builder state 진단 + SPEC baseline 기준선",
"description": "현재 단계, 핵심 병목, 다음 검증 목표를 정리하고 Week 1 SPEC baseline를 만든다.",
"xp": 100,
"verificationRule": { "type": "server_state", "check": "interview_saved" },
"evidenceClass": "decision",
"proofType": "spec_baseline",
"proofStatus": "validated"
},
{
"id": "d1-landing",
"type": "main",
"title": "첫 검증 채널 배포/정리",
"description": "랜딩 또는 현재 상태 기준의 첫 검증 채널을 정리하고 공개한다.",
"xp": 150,
"verificationRule": { "type": "server_state", "check": "proof_surface_live" },
"evidenceClass": "channel",
"proofType": "proof_surface_live",
"proofStatus": "captured"
},
{
"id": "d1-first-link",
"type": "side",
"title": "첫 추적 링크 생성",
"description": "검증 채널에 UTM 추적 링크를 만들어 공유 성과를 측정할 준비를 한다.",
"xp": 30,
"verificationRule": {
"type": "server_state",
"check": "utm_links_gte",
"params": { "count": 1 }
},
"evidenceClass": "channel",
"proofType": "tracking_link",
"proofStatus": "captured"
},
{
"id": "d1-bio-landing",
"type": "side",
"title": "바이오에 랜딩 카드 연결",
"description": "바이오 페이지에 검증 채널 링크 또는 랜딩 카드를 추가한다.",
"xp": 30,
"verificationRule": {
"type": "server_state",
"check": "bio_setup"
},
"evidenceClass": "channel",
"proofType": "bio_landing_card",
"proofStatus": "captured"
},
{
"id": "d1-discord-project",
"type": "side",
"title": "프로젝트 소개",
"description": "Discord #프로젝트-소개 채널에 프로젝트를 소개한다.",
"xp": 30,
"verificationRule": {
"type": "server_state",
"check": "verify_discord",
"params": {
"check": "message_exists",
"channelId": "1463468616807743619",
"questId": "d1-discord-project"
}
},
"evidenceClass": "channel",
"proofType": "project_share",
"proofStatus": "validated"
},
{
"id": "d1-reading",
"type": "side",
"title": "Day 1 추천 읽기",
"description": "IDD, 랜딩 전환율, Mom Test 블로그 글 중 1개 이상 읽기.",
"xp": 20,
"verificationRule": {
"type": "server_state",
"check": "link_clicks_gte",
"params": { "count": 1 }
},
"evidenceClass": "channel",
"proofType": "blog_reading",
"proofStatus": "captured"
},
{
"id": "d1-branding",
"type": "hidden",
"title": "프로젝트 브랜딩",
"description": "package.json에 프로젝트 이름을 정리하고 기본 정체성을 맞춘다.",
"xp": 20,
"verificationRule": { "type": "file_exists", "path": "package.json" },
"triggerCondition": { "type": "file_exists", "path": "package.json" }
},
{
"id": "d1-kr-market-scan",
"type": "side",
"title": "한국 인디 시장 빠른 스캔",
"description": "내 아이디어와 비슷한 한국 서비스 3개를 찾아보고 가격대, 타겟, 차별점을 정리한다.",
"xp": 30,
"verificationRule": { "type": "template", "fields": ["competitor1", "competitor2", "competitor3"] },
"evidenceClass": "decision",
"proofType": "market_scan",
"proofStatus": "captured"
},
{
"id": "d1-kr-interview-prep",
"type": "side",
"title": "한국 사용자 검증 채널 확보",
"description": "인터뷰할 한국 사용자를 찾을 수 있는 채널 2곳을 정한다 (OKKY DM, 카톡 오픈챗, 지인 등).",
"xp": 20,
"verificationRule": { "type": "text", "minLength": 20 },
"evidenceClass": "customer",
"proofType": "validation_channel",
"proofStatus": "captured"
}
]
}
Week 1 baseline 공유
ROOM
검증의 광장 입구. 게시판 앞에 사람들이 서 있다.
NPC
🎒 행상 바리
"검증 시작 전에 지금 위치 세 줄만 남겨두자. 일주일 뒤에 진짜 움직였는지 알 수 있어."
GUIDE
state.json의 builderContext나 MCP get_learning_context로 이전 인터뷰/SPEC 데이터를 가져와서 아래 세 줄 초안을 제안한다.
세 줄이 정리되면 MCP send_baseline으로 Discord에 자동 발송한다.
STOP
AskUserQuestion: 질문: 바리가 묻는다. "지금 stage, 이번 주 가설, 검증 목표. 세 줄로 정리해봐."
1. 직접 입력
⛔ STOP — "행상 바리가 기다립니다."
ON_CONFIRM
유저가 baseline 세 줄을 답하면:
1. 답변에서 stage, hypothesis, target을 추출 2. MCP send_baseline 호출:
- stage: 지금 stage
- hypothesis: 이번 주 가설
- target: 검증 목표
3. 성공 시 d2-baseline 제출 처리 4. 실패 시 에러 메시지 표시 후 재시도 안내
MOVE
바리가 고개를 끄덕인다.
"좋아. baseline이 기록됐어.
이제 진짜 검증 도구를 챙기자. The Mom Test부터."
The Mom Test — 말보다 행동을 듣기
ROOM
검증의 광장에 들어선다. 사방에서 목소리가 겹치고, 전단지가 바람에 흔들린다.
NPC
바리가 짐을 내려놓는다.
🎒 행상 바리
"오늘은 이론 자랑하는 날이 아니야.
고객이 직접 보여준 반응 — 그게 '고객 검증'야.
이 채널에서 반응이 오는지 확인한 것 — '채널 검증'라고 불러.
오늘은 이 두 가지를 모으는 날이지.
The Mom Test는 그걸 위한 최소 규칙만 챙기면 돼."
SCENE 1: 오늘 필요한 질문
바리가 세 줄만 적는다.
1. "최근에 이 문제를 어떻게 해결했어?" 2. "어디서 그 문제를 가장 자주 겪어?" 3. "이 페이지를 보고 무엇을 이해했어?"
"핵심은 칭찬이 아니라 행동과 맥락을 듣는 거야."
CHOICE
AskUserQuestion: 질문: 바리가 묻는다. "어떤 답이 검증에 더 가깝지?" 선택지:
1. "좋은 아이디어네요" 2. "지난주에도 그 문제 때문에 두 시간을 썼어요" 3. "출시되면 알려주세요"
정답: 2번. 바리가 고개를 끄덕인다. "맞아. 장면이 있는 답이 다음 SPEC v1에 들어간다."
SCENE 2: Day 2의 목표
바리가 손가락으로 탁자를 두드린다.
"오늘 끝나면 남아야 하는 건 네 가지다.
- 채널 3곳
- 공유 메시지
- 실제 반응 (1건이라도 깊으면 충분)
- 내일
SPEC v1에 반영할 인사이트
적은 수의 깊은 반응이 많은 수의 얕은 반응보다 낫다."
SCENE 3: 롤플레이 연습
바리가 탁자 건너편에 앉는다.
"좋아. 연습 한 번 해보자. 내가 네 타겟 고객 역할을 할게. 방금 배운 질문을 실전처럼 던져봐."
롤플레이 규칙
1. 바리가 학습자의 character.target 페르소나를 연기 2. 학습자가 Mom Test 질문 3개를 던짐 3. 바리가 현실적 반응 (칭찬, 회피, 구체적 장면 등 혼합) 4. 3턴 후 바리가 피드백: "어떤 질문이 장면을 끌어냈고, 어떤 질문이 칭찬만 유도했는지"
state.json에 character.target이 없으면 바리가 "네 타겟이 누구야?" 먼저 묻고 시작
CHOICE
AskUserQuestion: 질문: 바리가 묻는다. "연습해볼래?" 선택지:
1. "해보자" 2. "바로 실전으로 갈게"
"해보자" → 3턴 롤플레이 후 TASK로 "바로 실전으로 갈게" → 바로 TASK로
TASK
바리가 말한다.
"기억해. 오늘 모은 건 그냥 피드백이 아니다.
- 고객 검증
- 채널 검증
내일은 이걸 그대로 SPEC v1에 넣을 거야."
STOP
AskUserQuestion: 질문: 바리가 묻는다. "어떤 반응을 찾아야 하는지 감이 왔어?"
1. "다음" 2. "아직"
⛔ STOP — "행상 바리가 기다립니다."
RETURN
AskUserQuestion: 질문: 바리가 묻는다. "Day 2에서 가장 피해야 하는 건?" 선택지:
1. "좋아 보인다는 말만 모으는 것" 2. "실제 장면과 반응을 기록하는 것" 3. "채널별 차이를 보는 것"
정답: 1번. 바리가 웃는다. "좋아. 이제 어디에 뿌릴지 정하자."
MOVE
바리가 게시판 쪽을 가리킨다.
"채널부터 고르자. 검증은 아무 데서나 안 나와."
Change Set refinement
ROOM
정상 바위 위에 다시 선다.
NPC
나래가 짧게 말한다.
🦅 척후 나래
"좋아. 오늘 마지막은 네 줄이면 끝나.
참, 내일부터 한이가 변화의 크기를 재는 기준을 알려줄 거야. 그걸 '변화량'이라고 불러. 오늘은 그 전 단계 — 뭘 바꿀지 정하는 날이지."
GUIDE
유지 (Keep):
제거 (Drop):
수정 (Change):
시험 (Test):그리고 마지막에 next 검증 목표 1개를 적는다.
예:
- 유지 (Keep): 문제 장면 중심 메시지
- 제거 (Drop): 추상적인 생산성 문구
- 수정 (Change): CTA를 "출시 알림"에서 "파일럿 문의"로
- 시험 (Test): Discord 대신 직접 연락
- next 검증 목표: 명시적 결제 의향이 나오는지
"좋은 수정 사항은 보기 좋은 아이디어가 아니라 반응을 더 빨리 확인할 수 있는 수정안이야."
STOP
AskUserQuestion: 질문: 나래가 묻는다. "수정 사항과 다음 검증 목표가 정리됐어?"
1. "확인" 2. "수정 요청"
⛔ STOP — "척후 나래가 기다립니다."
ON_CONFIRM
AskUserQuestion에서 "확인"을 선택했을 때만 ON_CONFIRM을 수행합니다.
1. d4-differentiation 제출 2. d4-positioning 제출 3. state.json에 changeSet, nextProofTarget 저장
MOVE
나래가 시장 쪽을 가리킨다.
"좋아. 이제 숫자와 반응의 변화량을 읽으러 가."