| name | course-builder |
| description | Orchestrate end-to-end online course generation from a topic. Invoke when user asks to "create a course", "design a curriculum", "build online lectures", "๊ฐ์ ๋ง๋ค์ด", "์ฝ์ค ์ค๊ณ", "์ปค๋ฆฌํ๋ผ ์ง", "์น์
๋ณ ํด์ฆ ํฌํจ ๊ฐ์", "TTS ์คํฌ๋ฆฝํธ ๊ฐ์", or any request to produce structured learning material with slides + notes + scripts + quizzes. Also invoke for follow-ups โ "์ฌ์คํ", "์น์
๋ง ๋ค์", "์
๋ฐ์ดํธ", "์ด์ ๊ฒฐ๊ณผ ๊ฐ์ ", "์ฝ์ค ์์ ". Do NOT invoke for single-artifact requests (just a slide, just a quiz) โ those should call the specific authoring skill directly. |
Course Builder โ Orchestrator
๋ฉํฐ ์์ด์ ํธ ํ์ดํ๋ผ์ธ์ผ๋ก ์จ๋ผ์ธ ๊ฐ์ ์ ์ฒด๋ฅผ ์์ฑํ๋ค. ADDIE + Bloom's Taxonomy๋ฅผ ๋ฐฑ๋ณธ์ผ๋ก, 9๊ฐ ์ ๋ฌธ ์์ด์ ํธ๊ฐ ํ์ผ ๊ธฐ๋ฐ ๊ณต์ ์ํ(_workspace/)์ ํ ๋ฉ์์ง๋ก ํ์
ํ๋ค.
Phase 0: ์ปจํ
์คํธ ํ์ธ
์คํ ์ ๋ฐ๋์ ๋ค์์ ํ์ธํ๋ค.
0-1. ์คํ ๋ชจ๋ ํ๋ณ
if _workspace/ ๋ฏธ์กด์ฌ:
โ ์ด๊ธฐ ์คํ (Phase 1๋ถํฐ ์งํ)
elif _workspace/ ์กด์ฌ AND ์ฌ์ฉ์๊ฐ topic ๋ฑ ์ ํ๋ผ๋ฏธํฐ ์ ๊ณต:
โ full re-run (๊ธฐ์กด _workspace/ โ _workspace_prev/๋ก ์ด๋ ํ Phase 1)
elif _workspace/ ์กด์ฌ AND ์ฌ์ฉ์๊ฐ scope ์ง์ ๋ถ๋ถ ์์ :
โ partial re-run (scope์ ์ํ ์์ฐ๋ง ์ฌ์์ฑ, ๋๋จธ์ง๋ ๋ณด์กด)
else:
โ ์ฌ์ฉ์์๊ฒ ์๋ ํ์ธ
0-1a. Scope ๋ฌธ๋ฒ (partial re-run)
๋ถ๋ถ ์ฌ์คํ์ ๋ช
์์ scope๋ฅผ ๋ฐ๋๋ค. ์ฌ์ฉ์๊ฐ "S1.C2๋ง", "S2 section๋ง ๋ค์", "C3 tone๋ง formal๋ก" ๋ผ๊ณ ํ๋ฉด ๋ค์ ํ ํฐ์ผ๋ก ํ์:
| Scope | ์๋ฏธ | ์ํฅ |
|---|
S<n> | ์น์
์ ์ฒด | ํด๋น ์น์
์ ๋ชจ๋ class + section quiz |
S<n>.C<m> | ๋จ์ผ class | ํด๋น class์ slide/note/transcript(+audio) |
S<n>.C<m>.tone=X | ์์ฑ override | tone๋ง ๊ต์ฒด ํ 3์ข
์์ฐ ์ฌ์์ฑ |
S<n>.quiz | quiz๋ง | ์น์
quiz.json๋ง ๊ต์ฒด |
์ฌ๋ฌ scope์ ๊ณต๋ฐฑยท์ผํ๋ก ์ฐ๊ฒฐ: --scope "S1.C2,S2.C1".
0-1b. Partial re-run ์์น
- LO id ๋ณด์กด ์ ๋์์น โ architect๊ฐ
_workspace_prev/ ๋๋ _workspace/์ ๊ธฐ์กด 01_architect_learning_objectives.json ์ input์ผ๋ก ๋ฐ์ LO id/text๋ฅผ reuse. scope์ ์ํ ์น์
์ LO๋ง ๋ณ๊ฒฝ, ๋๋จธ์ง๋ byte-for-byte ๋์ผ.
- ์์ฐ cache-hit โ scope ๋ฐ class์
course/sections/.../{slide.source.md, note.md, transcript.txt, audio/} ๋ ๊ทธ๋๋ก ์ ์ง. build-bundle.sh๋ ์ด๋ฏธ audio/full.mp3 ์กด์ฌ ์ TTS skip (FORCE_TTS=1 ๋ก๋ง override).
- Quiz cross-ref ์์ ์ฑ โ quiz-master๋
course/sections/<sec>/quiz.json ๊ธฐ์กด ํ์ผ์ input์ผ๋ก ๋ฐ์ scope์ ์ํ class์ item๋ง ๊ต์ฒด. ๋๋จธ์ง item์ id ๋ณด์กด.
- Coherence regression mode โ reviewer๋ scope + ๊ทธ dependency(ํด๋น ์น์
quiz, cross-ref๋ note ๋ฑ)๋ง ์ฌ๊ฒ์ฆ. ๋ชจ๋ ์์ฐ ์ฌ๊ฒ์ฌ ๊ธ์ง.
๋ถ๋ถ ์ฌ์คํ์ _workspace/ ๋ฅผ _workspace_prev/ ๋ก ์ด๋ํ์ง ์๋๋ค. ์๋ณธ์ in-place๋ก ๋ถ๋ถ ์
๋ฐ์ดํธ.
0-2. ์
๋ ฅ ํ๋ผ๋ฏธํฐ ์์ง
ํ์: topic. ๋๋ฝ ์ ์ฌ์ฉ์์๊ฒ ์ง๋ฌธ.
์ ํ(๊ธฐ๋ณธ๊ฐ):
audience = "intermediate developers"
depth = "standard" (intro | standard | deep)
target_duration_min = 120
language = "ko" (ko | en)
tone = "friendly" (formal | friendly | socratic)
0-2a. ์ธ์ด ํ๋ณ (language resolution)
- ์ฌ์ฉ์๊ฐ ๋ช
์: "์์ด๋ก", "in English", "English course", "์๋ฌธ์ผ๋ก" โ
language = "en".
- ์ฌ์ฉ์๊ฐ "ํ๊ตญ์ด๋ก", "ํ๊ธ๋ก", "๊ตญ๋ฌธ์ผ๋ก" โ
language = "ko".
- ๋ช
์ ์์ โ
"ko" ๊ธฐ๋ณธ. ์ฌ์ฉ์ ๋ฐํ ์ธ์ด๋ง์ผ๋ก ์๋ ์ถ๋ก ํ์ง ์๋๋ค(์์ด๋ก ์ง๋ฌธํ๋ค๊ณ ์์ด ๊ฐ์๋ผ๊ณ ๊ฐ์ ๊ธ์ง).
language๋ Course Spec 01_architect_course_spec.json์ ์ ์ฅ๋์ด ํ๋ฅ ์์ด์ ํธ ์ ์ฒด๊ฐ ์ฐธ์กฐํ๋ค. ํ ๋ฒ ํ์ ํ ์ฌ์คํ ์ ๊น์ง ๋ณ๊ฒฝ ๊ธ์ง โ ์ค๊ฐ์ ๋ฐ๊พธ๋ฉด artifact ๋ถ์ผ์น ๋ฐ์.
0-3. HITL ํ๋๊ทธ
์ฌ์ฉ์๊ฐ "์๋์ผ๋ก ๋๊น์ง"๋ผ๊ณ ํ๋ฉด hitl=false, "์ค๊ฐ์ ํ์ธํ๊ณ ์ถ์ด"๋ผ๋ฉด hitl=true. ๊ธฐ๋ณธ๊ฐ์ hitl=true.
0-4. HITL ์ฒดํฌํฌ์ธํธ ๋ฉ์ปค๋์ฆ (ํ์ค)
hitl=true ์ผ ๋ Phase 1(#1), Phase 2(#2), Phase 4(#3) ๋ง์ง๋ง ์ฐ์ถ๋ฌผ ์์ ์ ์ฌ์ฉ์ ๋์๋ฅผ ๋ฐ๋๋ค. ๋ฉ์ปค๋์ฆ์ ๋ค์ 4๋จ๊ณ๋ก ํ์คํํ๋ค:
- ์์ฝ ์ ์ โ ํต์ฌ ์ฐ์ถ๋ฌผ์ ์ฌ๋์ด ์ฝ์ ์ ์๋ ์์ฝ์ ์ฌ์ฉ์์๊ฒ ์ถ๋ ฅ. ํ์:
- ์ฒดํฌํฌ์ธํธ #1 (Course Spec): ์น์
๋ชฉ๋ก(id, title, duration), LO ์ด์, Bloom ๋ถํฌ
- ์ฒดํฌํฌ์ธํธ #2 (์ฒซ class 3์ข
์์ฐ): slide.source.md ๋ฐ์ท + note.md ์ฒซ 200์ + transcript.txt ์ฒซ 200์
- ์ฒดํฌํฌ์ธํธ #3 (Coherence Report):
99_coherence_report.md ์ ## VERDICT: ์น์
+ ์์ 5๊ฐ ์ด์
- ๊ฒฐ์ ์ง๋ฌธ โ ๋ค์ 3์ง์ ๋ค๋ก๋ง ๋ฌป๋๋ค (์์ ์๋ต์ด๋ฉด ์๋ ์ถ์ ์์ ):
yes (๋๋ "์งํ", "go") โ ๋ค์ Phase ์งํ
edit: <์์ ํ
์คํธ ์์ ์ง์นจ> โ ํด๋น Phase ์ 1์ฐจ ์ฑ
์ ์์ด์ ํธ(architect / ์ฒซ class ์ 3์ ์ / coherence-reviewer) ์ ์์ ์ง์ ๋ฉ์์ง ์ ๋ฌ ํ ๊ฐ์ ์ฒดํฌํฌ์ธํธ ์ฌ์งํ
regen โ ๊ฐ์ ์
๋ ฅ์ผ๋ก ํด๋น Phase ์ ์ฒด ์ฌ์คํ (random seed ๊ฐ ๋ค๋ฅด๋ฉด ๊ฒฐ๊ณผ ๋ณ๋ ๊ธฐ๋)
- ์๋ต ๊ธฐ๋ก โ ์ฌ์ฉ์ ์๋ต์
_workspace/97_hitl_log.md ์ append ํ๋ค. ํ์:
## checkpoint #N ยท <iso8601>
verdict: yes | edit | regen
instructions: <์ฌ์ฉ์ ์์ ํ
์คํธ ๋๋ ๋น ์ค>
acted_on: <๋ณ๊ฒฝ๋ ํ์ผ ๋ชฉ๋ก ๋๋ "none">
- ํ์์์ ์ ์ฑ
โ ์ฌ์ฉ์ ๋ฏธ์๋ต ์ ์๋ ์งํ ๊ธ์ง. ๋ช
์ ์๋ต ๋ฐ์ ๋๊น์ง ๋๊ธฐ. (์ฌ์ฉ์๊ฐ ์ฒ์์
hitl=false ๋ก ์์ํ์ผ๋ฉด ์ด ๋จ๊ณ ์์ฒด๋ฅผ ๊ฑด๋๋.)
hitl=false ์ผ ๋๋ ์ 4๋จ๊ณ ๋ชจ๋ ๊ฑด๋๋ฐ๊ณ ์๋ ์งํํ๋, ๊ฐ Phase ์ข
๋ฃ ์์ ์ 1์ค ์งํ ๋ณด๊ณ ๋ง ์ถ๋ ฅํ๋ค (์ฌ์ฉ์๊ฐ ์งํ ์ํฉ ์ถ์ ์ฉ).
Phase 1: Design (Team A โ ์์ฐจ ํ์ดํ๋ผ์ธ)
์คํ ๋ชจ๋: ์์ด์ ํธ ํ (A = curriculum-architect + section-designer + class-planner)
TeamCreate(team_name="course-design", members=[curriculum-architect, section-designer, class-planner])
1-1. Course Spec
curriculum-architect์๊ฒ TaskCreate("Plan course for topic: <topic>")
- ์ถ๋ ฅ:
_workspace/01_architect_course_spec.json, _workspace/01_architect_learning_objectives.json
[HITL ์ฒดํฌํฌ์ธํธ #1] hitl=true๋ฉด ์ฌ์ฉ์์๊ฒ Course Spec ์์ฝ ์ ์, ์น์
๋ชฉ๋กยทLO ๋ถํฌ ํ์ธ. ์์ ์์ฒญ ์ architect ์ฌํธ์ถ.
1-2. Section Design (์น์
๋ณ fan-out)
- ๊ฐ ์น์
์ ๋ํด
section-designer์๊ฒ TaskCreate("Design classes for section: <sid>")
- ์น์
๋ค์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ (์์กด์ฑ ์์)
- ์ถ๋ ฅ:
_workspace/02_section_<sid>.json
1-3. Class Planning (class๋ณ fan-out)
- ๊ฐ class์ ๋ํด
class-planner์๊ฒ TaskCreate("Plan class <cid>")
- class ๊ฐ ๋
๋ฆฝ์ด๋ฉด ์ ๋ถ ๋ณ๋ ฌ, depends_on์ด ์์ผ๋ฉด ์์ ์ ๋ ฌ
- ์ถ๋ ฅ:
_workspace/03_class_<cid>_beats.json
Phase 1 ์๋ฃ ํ TeamDelete("course-design").
Phase 2: Content (Team B โ ์์ฐ 3์ข
์์ฑ)
์คํ ๋ชจ๋: ์์ด์ ํธ ํ (B = slide-author + note-writer + script-writer)
TeamCreate(team_name="content-authoring", members=[slide-author, note-writer, script-writer])
๊ฐ class์ ๋ํด:
slide-author โฅ note-writer ๋ณ๋ ฌ ์คํ (์๋ก ๋
๋ฆฝ)
- ๋ ๋ค ์๋ฃ๋๋ฉด
script-writer ์คํ (slide ๋ฒํธ๊ฐ ํ์)
์ฌ๋ฌ class๋ฅผ ๋์ ์งํํ ์ ์๋ค โ ํ์ด ์์ฒด์ ์ผ๋ก SendMessage๋ก "slide ready for S1.C1" ์๋ฆผ.
[HITL ์ฒดํฌํฌ์ธํธ #2] hitl=true์ด๊ณ ์ฒซ class ์๋ฃ ์์ ์ ์ฌ์ฉ์์๊ฒ ์ํ 3์ข
์์ฐ(slide/note/script) ๋ณด์ฌ์ฃผ๊ณ ํค/์คํ์ผ ์บ๋ฆฌ๋ธ๋ ์ด์
. ์์ ์ง์นจ ์์ผ๋ฉด ๋๋จธ์ง class์ ๋ฐ์.
Phase 2 ์๋ฃ ํ TeamDelete("content-authoring").
Phase 3: Assessment (quiz-master ๋จ๋
)
์คํ ๋ชจ๋: ์๋ธ ์์ด์ ํธ (๋จ์ผ ์คํ, ํ ํต์ ๋ถํ์)
๊ฐ ์น์
์ ๋ํด Agent(subagent_type="quiz-master", model="opus", run_in_background=true).
์น์
๋ค์ ๋
๋ฆฝ์ด๋ฏ๋ก ์ ๋ถ ๋ณ๋ ฌ. ์ถ๋ ฅ: course/sections/<sec>/quiz.json.
Phase 4: QA (coherence-reviewer)
์คํ ๋ชจ๋: ์์ด์ ํธ ํ (๊ธฐ์กด ์ ์๋ค + reviewer๊ฐ ์์ ๋ํ)
revise๊ฐ ํ์ํ๋ฉด reviewer๊ฐ ์์ ์์๊ฒ SendMessage๋ก ์์ ์ง์ โ ์ ์ ์ฌ์์
โ reviewer ์ฌ๊ฒํ (์ต๋ 2ํ ๋ฃจํ).
TeamCreate(team_name="qa-loop", members=[coherence-reviewer, slide-author, note-writer, script-writer, quiz-master])
- reviewer์๊ฒ
TaskCreate("Review full course")
- ์ถ๋ ฅ:
_workspace/99_coherence_report.json/.md
[HITL ์ฒดํฌํฌ์ธํธ #3] hitl=true๋ฉด ์ฌ์ฉ์์๊ฒ ๋ฆฌํฌํธ ์์ฝ ์ ์. pass๋ฉด ๋ฐ๋ก ์งํ, revise๊ฐ 2ํ ์ด๊ณผํ๋ฉด ์ฌ์ฉ์์๊ฒ ํ๋จ ์์.
Phase 4 ์๋ฃ ํ TeamDelete("qa-loop").
Phase 5: Build (asset-builder ๊ฐ ์กฐ์จ, tts-synthesizer ์์)
์คํ ๋ชจ๋: ํ์ด๋ธ๋ฆฌ๋
- ๋ฉ์ธ:
Agent(subagent_type="asset-builder", model="opus") ๊ฐ build-bundle.sh ๋ฅผ ํธ์ถํด ๋น๋ ํ์ดํ๋ผ์ธ์ ์กฐ์จ
- ์์: TTS ๋จ๊ณ๋
asset-builder ๊ฐ ๋น๋ ์คํฌ๋ฆฝํธ ์์์ tts-synthesizer ๊ฐ ์ฑ
์์ง๋ tts-synthesis/scripts/run.sh ๋ฅผ ํธ์ถ โ TTS ์คํจ๋ tts-synthesizer ๊ฐ ๋ณด๊ณ ํ๊ณ asset-builder ๊ฐ manifest.asset_errors ๋ก ์ง๊ณ
5-1. ๋น๋ ๋จ๊ณ (build-bundle.sh ์ 7 step๊ณผ ๋๊ธฐํ)
| Step | ์ฑ
์์ | ์์
| ์คํจ ๋ชจ๋ |
|---|
| 1 | asset-builder | gate: coherence_report.overall == "pass" ํ์ธ (์คํจ ์ BUILD_REFUSED) | hard fail |
| 2 | asset-builder | Marp HTML ์ฌ๋ ๋ (๋ชจ๋ slide.source.md โ slide.html) | per-class soft fail (asset_errors) |
| 3 | asset-builder | Marp PNG ๋ ๋ (player ์ฉ) โ SKIP_PLAYER=1 ๋๋ player ๋ฏธ์ฌ์ฉ ์ skip ๊ฐ๋ฅ | per-class soft fail |
| 4 | tts-synthesizer (์์) | per-class TTS ํฉ์ฑ โ OPENAI_API_KEY ์๊ณ SKIP_TTS!=1์ผ ๋๋ง. audio/full.mp3 ์บ์ hit ์ skip | per-class soft fail (๋ณด๊ณ TTS_FAILED <cls>) |
| 5 | asset-builder | Manifest ํฉ์ฑ (scripts/synth-manifest.py) | hard fail |
| 6 | asset-builder | Player HTML ์์ฑ (scripts/generate-player.py) โ SKIP_PLAYER=1์ด๋ฉด skip | warn only |
| 7 | asset-builder | SSML ๊ฒ์ฆ (์์ ๋) | warn only |
| 8 | asset-builder | course/build/bundle.zip ํจํค์ง | hard fail |
- ์
๋ ฅ ์กฐ๊ฑด:
coherence_report.overall == "pass"
- ์ถ๋ ฅ:
course/manifest.json, course/index.html (learner entry), course/build/bundle.zip
5-2. ์ ํ์ ํ๊ฒฝ๋ณ์
| ๋ณ์ | ํจ๊ณผ | ์์กด ๋๊ตฌ ์ฐํ |
|---|
SKIP_TTS=1 | TTS step 4 ์๋ต (์ฌ๋ผ์ด๋/๋
ธํธ/ํธ๋์คํฌ๋ฆฝํธ๋ง) | OPENAI_API_KEY ๋ถ์ |
FORCE_TTS=1 | ๊ธฐ์กด audio ๋ฌด์ํ๊ณ ์ฌํฉ์ฑ | โ |
SKIP_PLAYER=1 | step 3(PNG) + step 6(player HTML) ๋์ ์๋ต โ slides-only ์ฌ์ฉ ์ฌ๋ก | ffmpeg ์์กด ์ผ๋ถ ์ฐํ |
5-3. TTS ์์ ํธ์ถ ๊ท์ฝ
asset-builder ๋ ๋น๋ ์ค ๊ฐ class ์ transcript.txt ๋ฅผ ๋ฐ๊ฒฌํ ๋๋ง๋ค tts-synthesizer ์ ํ์ค ํธ์ถ์ ํธ๋ฆฌ๊ฑฐํ๋ค. ํ์ค ์ธ์:
- transcript path, audio out_dir
--language <ko|en> (course_spec ์์ ์ถ์ถ)
--beats <path> (์์ ๋) โ speaker affect overlay
--slide-source <path> (beats ๊ฐ ์์ ๋ ๋๋ฐ) โ ์ ํ ๋งคํ
์ ์ฒด ์์ ํ๋ฆยท์ฌ์๋ยท๋ถ๋ฅ ์ฑ
์์ tts-synthesizer.md ์ tts-synthesis/SKILL.md ๊ฐ ๋จ์ผ ์ง์ค์.
๋ฐ์ดํฐ ์ ๋ฌ
- ํ์ผ ๊ธฐ๋ฐ (์ฃผ) โ ๋ชจ๋ ์ค๊ฐ/์ต์ข
์ฐ์ถ๋ฌผ
- ๋ฉ์์ง ๊ธฐ๋ฐ (๋ณด์กฐ) โ ํ์ ๊ฐ ์ํ ์๋ฆผ, reviewer์ ์์ ์ง์
- ํ์คํฌ ๊ธฐ๋ฐ (์กฐ์จ) โ ๊ฐ Phase์ ์์
ํ ๋นยท์งํ ์ถ์
ํ์ผ๋ช
์ปจ๋ฒค์
_workspace/
01_architect_course_spec.json
01_architect_learning_objectives.json
02_section_<sid>.json
03_class_<cid>_beats.json
99_coherence_report.{json,md}
98_build_log.txt
course/
manifest.json
meta/audience.md
meta/learning_objectives.json
sections/<NN-slug>/section.json
sections/<NN-slug>/classes/<NN-slug>/{class.json,slide.source.md,slide.html,note.md,transcript.txt,transcript.ssml?}
sections/<NN-slug>/quiz.json
build/bundle.zip
์๋ฌ ํธ๋ค๋ง
- ์์ด์ ํธ ์คํจ ์: 1ํ ์ฌ์๋. ์ฌ์คํจ ์ ํด๋น ์ฐ์ถ๋ฌผ์
_workspace/98_failures.md์ ๊ธฐ๋กํ๊ณ ์งํ (QA ๋จ๊ณ์์ ์ง๊ณ)
- Marp ๋ ๋ ์คํจ: slide.source.md๋ ๋ณด์กด, coherence-reviewer๊ฐ ํ๋จ
- Coherence revise 2ํ ์ด๊ณผ: ์ฌ์ฉ์์๊ฒ ํ๋จ ์์ฒญ, ์๋ ์งํ ๊ธ์ง
- topic ๊ณผ๋ํ๊ฒ ๊ด๋ฒ์: architect๊ฐ ๋ฒ์ ์ขํ ์ ์ ๋ฐํ โ ์ฌ์ฉ์ ์ฌ์
๋ ฅ ํ์
- ์์ถฉ ์ ๋ณด: ์ญ์ ๊ธ์ง, ์์ชฝ ์ถ์ฒ ๋ณ๊ธฐ
ํ
์คํธ ์๋๋ฆฌ์ค
์ ์ ํ๋ฆ
์
๋ ฅ: topic="React Server Components", audience="intermediate", duration=60
๊ธฐ๋ ์ฐ์ถ๋ฌผ: 3 section ร 2 class = 6 class, ๊ฐ class์ slide/note/transcript 3์ข
+ 3 quiz.json + bundle.zip
๊ฒ์ฆ: jq '.stats' course/manifest.json๋ก sections=3, classes=6, lo_countโฅ9, bloom_levelsโฅ4.
์๋ฌ ํ๋ฆ
์
๋ ฅ: topic="ํ๋ก๊ทธ๋๋ฐ" (๊ณผ๋ํ๊ฒ ๋์)
๊ธฐ๋: curriculum-architect๊ฐ ์ ์ 3๊ฐ ๋ฐํ ("JS ๊ธฐ์ด", "ํจ์ํ ์
๋ฌธ", "ํ
์คํธ ์๋ํ") + Phase 1์์ ์ค๋จ.
๋ถ๋ถ ์ฌ์คํ
_workspace/ ์กด์ฌ + ์ฌ์ฉ์ "S2์ ํด์ฆ๋ง ๋ค์ ๋ง๋ค์ด์ค"
๊ธฐ๋: quiz-master๋ง ์ฌํธ์ถ, ๋ค๋ฅธ ์์ฐ ์ ์ง, coherence-reviewer๊ฐ S2 ์ฌ๊ฒํ ๋ง.
ํฌ๊ธฐ ๊ด๋ฆฌ
์ธ๋ถ Bloom ๋ ๋ฒจ ๊ธฐ์ค, beat type ๊ฐ์ด๋, Marp ๋ฌธ๋ฒ ์นํธ๋ ๊ฐ ์์ด์ ํธ์ ์ ์ฉ ์คํฌ(curriculum-design, class-planning, slide-authoring ๋ฑ)์ ์ฐธ์กฐ. ์ด ์ค์ผ์คํธ๋ ์ดํฐ SKILL.md๋ ์กฐ์จ ๋ก์ง๋ง ๋ด๋๋ค.