| name | asset-build |
| description | Final build step โ render all Marp slides, validate SSML, synthesize the course manifest, and package bundle.zip. Use when coherence review has passed and the course is ready for deployment. Triggered by the asset-builder agent. |
Asset Build โ Deployable Bundle
coherence-reviewer๊ฐ overall: "pass" ํ์ ํ ๋ค ์ํ. Idempotent โ ์ฌ๋ฌ ๋ฒ ๋๋ ค๋ ๊ฒฐ๊ณผ ๋์ผ.
์คํ ์กฐ๊ฑด
_workspace/99_coherence_report.json์ overall == "pass"
- ์๋๋ฉด ๊ฑฐ๋ถ:
BUILD_REFUSED: coherence not passed
๋น๋ ์์
1. ํ๊ฒฝ ๊ฒ์ฆ
marp CLI ์ค์น ํ์ธ
xmllint ๋๋ fallback ๊ฒฝ๋ก ํ์ธ
zip ์ค์น ํ์ธ
2. Marp ์ ์ฒด ์ฌ๋ ๋
๋ชจ๋ slide.source.md๋ฅผ ์ฌ๋ ๋ํ์ฌ slide.html์ ๊ฐฑ์ .
์ด์ : ์ค๊ฐ์ ์ฌ๋ผ์ด๋๋ง ์์ ๋์์ ์ ์์ผ๋ฏ๋ก ํญ์ ์ต์ ์ํ ๋ณด์ฅ (idempotency).
find course/sections -name slide.source.md -print0 | while IFS= read -r -d '' f; do
dir=$(dirname "$f")
marp --html --allow-local-files "$f" -o "$dir/slide.html"
done
3. SSML ๊ฒ์ฆ
์กด์ฌํ๋ transcript.ssml ๊ฐ๊ฐ์ ๋ํด validate-ssml.sh ์คํ.
์คํจ๋ WARNING์ผ๋ก ๊ฒฉํ (txt๋ ํญ์ ์ ํจ).
4. Quiz schema ๊ฒ์ฆ
๊ฐ quiz.json ๋น์ฆ๋์ค ๋ฃฐ ๊ฒ์ฆ:
- items ๊ธธ์ด 5~9
- mcq_single์ correct ๊ธธ์ด == 1
- mcq_multi์ correct ๊ธธ์ด 2~3
- ๋ชจ๋ item.explanation ๋น์ด์์ง ์์
- bloom_distribution ํค ์งํฉ ์ ํจ
5. Manifest ํฉ์ฑ
course/manifest.json:
{
"course": {
"topic": "...", "audience": "...",
"depth": "...", "language": "ko", "tone": "...",
"total_duration_min": 120,
"build_ts": "2026-04-22T14:30:00Z",
"harness_version": "1.1.0"
},
"learning_objectives": [ ],
"sections": [
{
"id": "S1", "slug": "01-intro", "title": "...",
"lo_ids": ["LO-1.1","LO-1.2"],
"quiz_path": "sections/01-intro/quiz.json",
"classes": [
{
"id": "S1.C1", "slug": "01-what-is-rsc", "title": "...",
"lo_ids": ["LO-1.1"],
"assets": {
"slide_source": "sections/01-intro/classes/01-what-is-rsc/slide.source.md",
"slide_html": "sections/01-intro/classes/01-what-is-rsc/slide.html",
"note_md": "sections/01-intro/classes/01-what-is-rsc/note.md",
"transcript_txt": "sections/01-intro/classes/01-what-is-rsc/transcript.txt",
"transcript_ssml": "sections/01-intro/classes/01-what-is-rsc/transcript.ssml"
}
}
]
}
],
"stats": {
"sections": 4, "classes": 10, "total_slides": 45,
"lo_count": 14,
"bloom_distribution": {"Remember":2,"Understand":4,"Apply":5,"Analyze":3},
"estimated_audio_duration_sec": 7200
},
"asset_errors": []
}
6. ๋ฒ๋ค ํจํค์ง
rm -rf course/build
mkdir -p course/build
cd course
zip -r build/bundle.zip . \
-x 'build/*' \
-x '_workspace/*' \
-x '.DS_Store' \
-x '*/.*'
cd ..
7. ๋น๋ ๋ก๊ทธ
_workspace/98_build_log.txt:
2026-04-22T14:30:00Z BUILD START
Marp render: 10/10 classes OK
SSML validate: 3/3 OK
Quiz schema: 4/4 OK
Manifest written
Bundle: course/build/bundle.zip (1.8 MB)
2026-04-22T14:30:42Z BUILD COMPLETE
๋ถ๋ถ ๋น๋ ํ์ฉ ์กฐ๊ฑด
coherence-reviewer๊ฐ overall: "pass"๋ผ๋ asset_errors๊ฐ ์์ ์ ์์:
- Marp ๋ ๋ ์คํจํ class 1~2๊ฐ
- SSML ๊ฒ์ฆ ์คํจ (warning ์์ค)
์ด ๊ฒฝ์ฐ manifest.asset_errors์ ๊ธฐ๋กํ๊ณ ๋ฒ๋ค์ ๊ณ์ ๋น๋. ์ฌ์ฉ์์๊ฒ๋ "๋ถ๋ถ ๋น๋ ์๋ฃ, N๊ฐ ์ด์ ์์" ์๋ฆผ.
์๋ฌ ํธ๋ค๋ง
Marp ๋ฏธ์ค์น
BUILD_FAILED: marp CLI missing. Install: npm install -g @marp-team/marp-cli
zip ์คํจ
์ฌ์๋ 1ํ. ์ฌ์คํจ ์ tar.gz ๋์ฒด ์ ์.
Disk full
์ฆ์ ์ค๋จ, ์ ๋ฆฌ ์์ฒญ.
์ฌํธ์ถ (Idempotency)
๋งค ๋น๋๋ง๋ค:
course/build/ ์ญ์
- ๋ชจ๋ slide.html ์ฌ์์ฑ
- manifest.json ์ฌ์์ฑ
_workspace/๋ ์ ๋ ๊ฑด๋๋ฆฌ์ง ์์.
์ฒดํฌ๋ฆฌ์คํธ