Defines the file structure and fields of a design pack. This skill is the SSOT of the spec — to change the spec, update this file first and notify all curators.
Folder Structure
design-packs/{slug}/
prompt.md ← Claude Code 복붙용 디자인 지시문
tokens.json ← 머신리더블 디자인 토큰
preview.png ← 샘플 렌더 (sample-renderer가 생성)
meta.yaml ← 메타데이터·출처·라이선스
Slug Rules
{track}-{family} in the form of kebab-case. Example: ppt-swiss-editorial, web-neo-brutalism. The track prefix (ppt-/web-) is required. It must be unique across the entire catalog.
prompt.md — The Most Important Output
Claude Code에 Copy-paste as a single blockA self-contained instruction that reproduces that style. Vague terms ("modern", "clean") are forbidden — only verifiable, concrete instructions. Required sections:
# {Display Name} — {track} 디자인 팩
## 이 스타일의 정체성
(2~3문장. 무엇을 보고 이 스타일임을 알 수 있는가)
## 색
(구체적 hex 값과 역할: 배경/표면/텍스트/강조. 강조색 개수 제한 명시)
## 타이포그래피
(폰트 패밀리·대체 폰트, 위계별 크기·굵기·자간·행간)
## 레이아웃 / 그리드
(PPT: 슬라이드 그리드·여백·헤더 / 웹: 콘텐츠 폭·브레이크포인트·섹션 리듬)
## 형태 / 질감
(보더·모서리·그림자·아이콘·이미지 처리 방식)
## 모션 (웹) / 전환 (PPT)
(있다면 구체적 duration·easing·트리거)
## 하지 말 것
(이 스타일에서 금지: Claude 기본 미감으로 회귀하는 것을 차단하는 핵심 섹션)
## 적용 예
(PPT: 표지·본문·차트 슬라이드 / 웹: 히어로·카드·푸터 — 각 1~2문장 지시)
The "Do Not" section is required. The enemy of diversity is Claude regressing to defaults (purple gradients, rounded cards, emoji, uniform shadows).
tokens.json
{
"slug": "web-neo-brutalism",
"track": "web",
"family": "neo-brutalism",
"color": { "bg": "#ffffff", "surface": "#ffe14d", "text": "#0a0a0a",
"accent": ["#ff5a36"], "border": "#0a0a0a" },
"type": { "display": { "family": "Archivo Black", "fallback": "sans-serif",
"size": "clamp(2.5rem,6vw,5rem)", "weight": 900, "tracking": "-0.02em" },
"body": { "family": "Inter", "size": "1.0625rem", "weight": 400, "leading": 1.6 } },
"spacing": { "unit": 8, "section": 96, "content_max": "1100px" },
"shape": { "radius": "0px", "border": "3px solid", "shadow": "6px 6px 0 #0a0a0a" },
"motion": { "duration": "120ms", "easing": "steps(1)", "hover": "translate(-2px,-2px)" }
}
Keys are track-common (color·type·spacing·shape), and motion(웹)·slide(PPT slide meta) is per-track. The two curators use the same common key names — because the site must consume them consistently.
meta.yaml
slug: web-neo-brutalism
display_name: Neo-Brutalism
track: web # ppt | web
family: neo-brutalism
summary: 거친 보더·하드 섀도·원색 블록의 반(反)미니멀 웹 스타일.
axes: { color: vivid-primary, type: heavy-display, layout: block-grid, space: dense, motion: snappy }
sources:
- { title: "...", url: "https://...", type: official|article }
license: "원자산은 각 출처 라이선스를 따름. 본 팩이 배포하는 것은 디자인 명세·토큰이며 원자산 사본이 아님."
source_depth: full # full | partial
status: pass # pass | needs_review | reject (게이트에서 생성 — 사람이 쓰지 않는다)
catalog.json — Catalog Index
The machine-readable index at the root. Consumed by the site and tools.
{ "version": 1, "updated": "2026-05-20",
"packs": [
{ "slug": "web-neo-brutalism", "track": "web", "family": "neo-brutalism",
"display_name": "Neo-Brutalism", "summary": "...", "axes": {...},
"preview": "design-packs/web-neo-brutalism/preview.png", "status": "pass" }
] }
Style Axes (Units of Diversity Measurement)
Every pack is classified along 5 axes — pack-architect uses this matrix to narrow down candidates and prevent duplication.
| 축 | Example Values |
|---|---|
| color | mono / vivid-primary / pastel / dark / gradient / earth |
| type | minimal-sans / heavy-display / serif-editorial / mono / mixed |
| layout | strict-grid / block-grid / asymmetric / centered / full-bleed |
| space | dense / balanced / airy |
| motion | none / subtle / snappy / playful |
If two packs share 4 or more of the 5 axes, they are effectively twins — merge them or redefine one along a different axis.
Schema v2 — Category + Detail Pages (2026-05-21)
Adds two concepts to packs. All existing v1 packs are automatically classified as category: standardwith no migration needed (absent field = standard, absent pages = single preview).
category — Pack Grade
standard— A regular pack with a single preview.png. All 80 existing packs.premium— An advanced pack in which one pack has **5–7 detail pages**, specifying and rendering all of various usage scenes such as cover/body/chart/diagram/comparison.
category는 meta.yaml·catalog.json Record it on both sides.
Detail Pages (premium only)
A premium pack places 5–7 page renders in the design-packs/{slug}/pages/ folder:
design-packs/{slug}/
prompt.md
tokens.json
preview.png ← 카드 썸네일용 대표 1컷 (보통 pages/01과 동일하거나 표지)
meta.yaml
pages/
01-cover.png 02-agenda.png 03-body.png 04-chart.png
05-diagram.png 06-comparison.png 07-closing.png
The filename is NN-{page-id}.png (2-digit sequence number + page-id). 5–7 pages recommended, minimum 5 pages.
Page ID Taxonomy — Choose 5–7 from the standard IDs per track (select as appropriate for the pack's nature, new IDs may be added):
- PPT:
cover(cover) ·agenda(table of contents) ·section-divider(section divider) ·body(key body) ·chart(data chart) ·diagram(process/relationship diagram) ·comparison(comparison/matrix) ·timeline(timeline) ·kpi(KPI dashboard) ·closing(closing/Q&A) - 웹:
hero(hero) ·nav(Header·Navigation) ·features(Feature grid·Cards) ·pricing(Pricing table) ·content(Content detail·Article) ·gallery(Showcase·Gallery) ·dashboard(App·Dashboard screen) ·testimonial(Testimonials·Logo wall) ·cta-footer(CTA·Footer)
prompt.md — Additional sections of the premium pack
The premium pack's prompt.md extends the existing "Application examples" section into **"## Detail pages (5–7 types)"**. For each page, a subheading + verifiable, concrete layout instructions (grid coordinates, element placement, dimensions). "Use in various ways" must exist as actual instructions — a one-line summary is prohibited.
tokens.json — pages key of the premium pack
{ "...": "...",
"category": "premium",
"pages": [
{ "id": "cover", "label": "표지" },
{ "id": "chart", "label": "데이터 차트" }
] }
meta.yaml — v2 fields
category: premium # premium | standard (부재 시 standard)
pages: # premium 전용
- { id: cover, label: 표지, kind: cover }
- { id: chart, label: 데이터 차트, kind: chart }
catalog.json — v2 pack entry
{ "slug": "...", "track": "ppt", "category": "premium",
"display_name": "...", "summary": "...", "axes": {...},
"preview": "design-packs/{slug}/preview.png",
"pages": [
{ "id": "cover", "label": "표지", "img": "design-packs/{slug}/pages/01-cover.png" }
],
"status": "pass" }
categoryis required for all packs (existing 80 packs also batch standard backfilled). pagesis premium packs only.
Render convention (sample-renderer)
The premium pack is authored by stacking 5–7 panels vertically in 1 HTML, but each panel is saved as an individual screenshot해 pages/NN-id.png, and 1 representative cut is copied to preview.png. Baseline comparison is the same as before (reuse 1 track baseline cut).
Schema v3 — Reference contract · Field canonicalization · Density criteria (2026-08-16)
Packs up to v2 declared only "what style it is." v3 also requires **"on what basis do you claim so."**
Why v3 was needed (empirical diagnosis)
Of the 10 premium packs, meta.yamla full survey of 28 of 40 keys exist in only 1–2 packs. This is the result of inventing different names for the same concept in each pack.
| Concept | Names actually used | v3 canonical |
|---|---|---|
| Source→pack page mapping | page_mirror_plan · mirror_plan · v3_mirror_plan · v3_page_mirror_plan · page_mirror_plan_summary · v3_compression_plan |
page_mirror_plan |
| Signature motif | signature_motifs · signature_visual_motifs · signature_top5 · signature_locks_v2_carried · visual_vocabulary_anchors · visual_lexicon_11 |
signature_motifs |
| Version | version · spec_version · pack_id · based_on · changelog · v1_to_v2_diff · v2_to_v3_diff · v3_additions |
spec_version + changelog |
| Differentiation description | differentiation · v3_focus · chart_inventory |
differentiation |
The cause is that this file (SSOT) has never once defined mirror-related fields. When the fields became necessary in v3, each pack improvised and used them. Names not in the table above are all discarded, and if a new field is needed, this file is modified first.
reference_mode — required for all packs
Declares what the pack takes as its basis. For detailed definitions, reference-analysis the skill is the SSOT.
| 값 | Basis | fidelity scoring | source_depth: full allowed |
|---|---|---|---|
exact_document |
Specific public deck source file | All 7 axes | Only when source sha256 exists |
official_system |
Official design system documentation | F1·F3·F4·F6·F7 | When directly quoting official documentation |
historical_canon |
Academic·museum primary sources | F2·F3·F4·F7 | When primary sources are secured |
style_synthesis |
Synthesis of multiple secondary sources | Not scored | Not possible — always partial |
Strict adherence: Packs with only secondary sources (slide sales sites, commentary videos, blogs) are style_synthesis, and source_depth: fullcannot be used and cannot be marked as "reproduced the original."
v3 required fields (meta.yaml)
spec_version: v3-2026-08-16 # prompt.md·tokens.json과 3자 일치 필수
reference_mode: exact_document
reference: # exact_document 필수
canonical_url: "https://..."
retrieved_at: "2026-08-16T09:00:00+09:00"
sha256: "..."
media_type: application/pdf
page_count: 24
aspect_ratio: 1.778
page_mirror_plan: # exact_document 필수
original_pages: 24
pack_pages: 10
compression: merged # identity | selected | merged
map:
- { pack_page: 5, source_pages: [9, 10, 11], kind: chart, rationale: "..." }
signature_motifs: # 3~7개
- { rank: 1, name: "...", evidence_pages: [1, 5, 12], where: "...",
uniqueness: "...", must_preserve: true }
transform_contract: _workspace/{batch}/transform_contract/{code}.json
qa: # 게이트 결과. 사람이 손으로 pass를 쓰지 않는다
fidelity: { verdict: pass, total: 25, scored_at: "..." }
craft: { verdict: pass, total_B: 21 }
diversity:{ verdict: pass, total: 17 }
status: pass # 아래 규칙으로 생성
evidence_pagesA signature with an empty value is creation, not observation, so it is deleted.
status — generated, not written by a human (this section is the SSOT for the state formula)
The gates needed differ by mode. style_synthesishas no original, so it is not a fidelity target — requiring this pack to pass fidelity means it will never be published.
fidelity_required = reference_mode in [exact_document, official_system, historical_canon]
required_gates = [craft, diversity] + ([fidelity] if fidelity_required else [])
status = reject ⟸ 필요한 게이트 중 하나라도 verdict == reject
= needs_review ⟸ 필요한 게이트가 없거나 verdict != pass
(unreviewed / unverifiable / evidence_missing 포함)
= pass ⟸ 필요한 게이트 전부 pass
AND spec_version 3자 일치
AND render-manifest 해시가 현재 파일과 일치
style_synthesis pack's qa.fidelity는 passbut is recorded as **not_applicable**. Leave it as not applicable, not as passed.
Other files do not copy this formula. The orchestrator, publishing skill, and agent only write "the per-mode state formula is SSOT in design-pack-schema." Duplicating the formula in multiple places means only one side gets fixed and they diverge — a failure this project has already experienced.
status enum
pass · needs_review · reject only three are used. v2's escalate · draft · render_failedwas discarded. Cases where render evidence could not be produced are recorded as needs_review + reason_code: render_failedand excluded from production.
needs_review를 pass. If not all images were viewed or there is no verification input, that is the definition of needs_review. Lack of time or quota is not a reason to pass.
Detailed page count — per mode (replaces v2's fixed "5–7 pages" rule)
v2 fixed premium at 5–7 pages, but actual Korean reference packs have 10. The rule did not match reality.
style_synthesis / historical_canon : 5~7종
official_system : 6~9종
exact_document : 8~12종 (must_preserve 시그니처를 전부 담는 최소 슬롯 수)
prompt.md required sections (v3)
## 이 스타일의 정체성
## 레퍼런스 범위와 모드 ← v3 신설. 원본·모드·비선택 페이지 명시
## 변환 계약 ← v3 신설. preserve / adapt / substitute / drop
## 색
## 타이포그래피
## 레이아웃 / 그리드
## 형태 / 질감
## 차트·데이터 시각화 (PPT)
## 다이어그램·컴포넌트 (PPT)
## 컴포넌트·반응형·접근성 (웹)
## 모션 / 전환
## 하지 말 것
## 상세 페이지
## 렌더 합격 기준 ← v3 신설. 이 팩이 통과해야 할 구체 수치
## 출처·권리 경계
Instruction density — not measured by line count
Measurement showed that the premium 10 packs ranged from 145to 523 lines (3.6x), but character counts were 14.9Kto 30.7K (2.1x). Line count is not a quality metric — writing in long single lines makes only the line count smaller.
Density is measured by the number of instructions that have the constraint atom = (대상, 속성, 검증 가능한 값 또는 token 참조) three elements.
일반 페이지 : atom ≥ 14
chart/diagram 페이지 : atom ≥ 18
페이지 고유 atom : ≥ 8 (전역 규칙 상속분 제외)
수치·token으로 검증 가능한 atom 비율 : ≥ 60%
동일 규칙 자연어 중복률 : ≤ 15%
같은 대상·같은 속성의 상충 값 : 0건 ← hard fail
Zero conflicts is the most important rule in v3. Actual violation cases:
ppt-motie— declared the cover slogan size as76~86pt·60~80pt·60~72ptthree different timesppt-motie— simultaneously declared the canvas as16:9와1285×910(actual 1.412)ppt-mcst— specified the card body as14ptand also listed24pt 이하 금지under "things not to do"
Do not rewrite global rules on pages; reference them — inherits: [grid.body, type.body, card.base]. Duplicating natural language causes conflicts like the above.
Three-way synchronization
prompt.md·tokens.json·meta.yaml의 spec_version. If page IDs, order, or kind differ, automatic rejection. It was published misaligned as ppt-motie는 prompt v4 / meta v4 / tokens v3.
Handling of v1 and v2 packs
The existing 110 packs are not automatically migrated in this cycle. However, the following is recorded:
reference_modePacks with no entry are unclassified, and that pack'ssource_depth: fullis not a verified value.- Existing
status: passvalues have not passed the v3 gate. Do not treat packs before v3 and after v3 on the same basis. - Plan migrations as a separate round.
Schema change procedure
- Update this file. 2.
spec_versionand record the changes. 3. The pack-architect reports whether affected existing packs need migration. 4. Notify all curators.
If a new field is needed, do not create it on the fly in the pack; fix this file first. The 28 orphaned fields in the v3 diagnosis are the result of violating that discipline.