| name | craft-scoring |
| description | "세련됨"이라는 모호어를 렌더 산출물에서 실제로 판정 가능한 항목으로 분해해 채점하는 방법론 스킬. craft-qa 에이전트가 사용한다. 결정적 기계 검사(캔버스 규격·해시 신선도·대비·폰트 로드·그리드 스냅· 여백 토큰·차트 데이터잉크)를 먼저 돌리고, 기계가 못 잡는 광학 정렬·리듬만 시각 검수로 넘긴다. hard fail 항목은 점수와 무관하게 발행을 차단한다. |
Craft Scoring — 세련미의 정량화
"좀 더 세련되게"는 지시가 아니다. craft-qa는 그것을 아래 항목으로 바꿔 판정한다.
순서: 기계 먼저, 눈은 나중
결정적으로 판정 가능한 것에 모델 비용을 쓰지 않는다. A군(스크립트)이 하나라도 실패하면 B군(시각 검수)을 돌리지 않는다.
A군 — 결정적 검사 (스크립트, hard fail)
하나라도 걸리면 즉시 반려. 점수로 상쇄되지 않는다.
| 검사 | 기준 | 실패 예 (실제 관찰) |
|---|
| 캔버스 규격 | 한 팩의 전 페이지가 동일 픽셀 크기, 선언 종횡비 오차 ≤0.5% | ppt-motie 10장 중 5장만 2560×1440, 나머지는 2752×1616·2752×1640·2736×1616 |
| 캔버스 계약 일관성 | prompt.md·tokens.json의 캔버스 선언이 서로, 그리고 실제 렌더와 일치 | ppt-motie가 "16:9"와 "1285×910"(=1.412)을 동치로 병기 |
| 버전 신선도 | prompt.md·tokens.json·meta.yaml의 spec_version 3자 일치 | ppt-motie prompt v4 / meta v4 / tokens v3 |
| 렌더 신선도 | 렌더 매니페스트의 소스 해시 = 현재 prompt.md+tokens.json 해시 | ppt-motie 06-diagram이 명세(딥네이비 호 다이어그램)가 아닌 다른 슬라이드(한국지도) |
| 자기모순 지시 | 같은 대상·같은 속성에 상충 값 0건 | 표지 슬로건이 7686pt / 6080pt / 60~72pt 3중 선언 |
| 금지 자기위반 | "하지 말 것"이 본문 지시와 충돌 0건 | ppt-mcst 카드 본문 14pt 지정 + "24pt 이하 금지" 동시 기재 |
| 폰트 로드 | 선언 폰트 실제 로드 100%, tofu(口) 0건 | 캘리그래피가 일반 산세리프로 조용히 폴백 |
| 텍스트 잘림 | clipping·overflow 0건 | 카드 마지막 행이 컨테이너 밖으로 |
| 대비 | 아래 "대비와 원문 충실도" 절의 역할별 기준 | 밝은 하늘색 지도 위 흰 라벨(≈1.9:1)인데 선언 없음 |
| 차트 데이터 | 값·단위·순서 원본과 100% 일치, 막대 y축 0 시작 | 잘린 축으로 차이 과장 |
| 페이지 ID 정합 | pages/ 파일명·순서·kind가 meta.yaml·catalog.json과 일치 | 05-chart인데 실제로는 다이어그램 |
대비와 원문 충실도 — 역할로 가른다
여기서 규칙이 충돌한다. ppt-design-idioms는 접근성을 원본 이탈이 허용되는 예외 셋 중 하나로 두는데, 실제 레퍼런스 덱은 저대비를 디자인 장치로 의도적으로 쓴다 — 크래프톤의 고스트 목차(비활성 항목 #1A1A1A on 검정, 약 1.2:1)는 활성/비활성 대비 자체가 목차 문법이고, 삼성바이오·포스코·신한도 각각 의도적 저대비 지점이 있다.
"전부 교정한다"도 "전부 그대로 둔다"도 틀렸다. 텍스트의 역할로 가른다.
| 역할 | 기준 | 근거 |
|---|
| 의미 전달 텍스트 — 본문·데이터 라벨·축·표 수치·CTA·유일한 정보원 | 4.5:1 (큰 텍스트 3:1) hard fail | 못 읽으면 정보가 사라진다 |
| 의도적 de-emphasis — 비활성 목차 항목, 장식 배경 워터마크, 같은 정보가 다른 곳에 온전히 존재하는 중복 요소 | 하한 없음. 단 선언 필수 | 낮은 대비 자체가 전달하는 의미(비활성)가 있다 |
저대비를 유지하려면 팩이 선언해야 한다. transform_contract에 다음을 남기지 않은 저대비는 예외가 아니라 결함이다:
{ "element_id": "toc-inactive", "action": "preserve",
"role": "decorative-deemphasis",
"contrast": { "measured": "1.2:1", "below_aa": true },
"justification": "활성/비활성 대비가 목차 문법. 같은 정보가 활성 상태로 다른 페이지에 존재",
"accessibility_note": "이 팩 사용 시 해당 요소에 정보를 의존하지 말 것" }
craft-qa는 선언되지 않은 4.5:1 미만 텍스트를 hard fail로 처리하고, 선언된 것은 역할이 실제로 de-emphasis인지만 확인한다(본문을 de-emphasis로 위장하는 것을 막는다).
B군 — 시각 검수 (0~4점 × 6항, 24점)
기계가 못 잡는 것만. 렌더를 직접 보고 채점한다.
| 항목 | 무엇을 보는가 | 4점 | 0점 |
|---|
| C1 그리드 스냅 | 주요 요소 엣지가 선언 그리드에 붙는가 | 95% 이상이 2px 이내 | 3-up 카드가 제각각 높이 |
| C2 광학 정렬 | 수학적 중앙이 아니라 시각적 중앙 | 아이콘·글자 광학 보정됨 | 재생 삼각형이 원 안에서 가라앉음 |
| C3 한글 줄바꿈 | 단어·어절 중간 파단 0건, widow 없음 | 어절 단위로 끊김 | "메모리 반 / 도체", "디스 / 플레이" |
| C4 여백 리듬 | 반복 gap·padding이 토큰 배수인가 | 변동계수 ≤10% | 카드 padding이 24/31/44px 혼재 |
| C5 밀도 균형 | 의미 요소 점유율이 선언 space 축과 맞는가 | airy 3065% / balanced 5080% / dense 70~90% | 중앙 하단 25%가 데드 보이드 |
| C6 데이터잉크 | 차트에서 (의미 마크 + 직접 레이블) / 전체 요소 | ≥0.70, 격자선 ≤3 | 범례·격자·배경이 데이터보다 진함 |
C3은 한국어 팩의 최대 취약점이다. 영문 기준 줄바꿈 로직이 한글 어절을 무시하고 끊는다. word-break: keep-all과 어절 단위 검사를 기본으로 둔다.
합격 조건
A군 hard fail = 0
AND B군 총점 ≥ 19 / 24
AND 전 항목 ≥ 2
검사 입력
PNG만 보고 판정하지 않는다. 가능한 경우 구조 데이터를 함께 읽는다.
- 웹 트랙 — 렌더 시 DOM computed style을 덤프해 대비·폰트·여백을 실측
- PPT 트랙 — 네이티브
.pptx 생성 시 도형 좌표·폰트 목록을 XML에서 실측, 슬라이드 밖 객체 0건 확인
- 어느 쪽도 불가하면
structural_check: unavailable을 명시하고 A군 일부를 unverified로 둔다 — pass로 올리지 않는다
산출물
_workspace/{batch}/craft_qa/{slug}.json
{ "slug": "...", "hard_fails": [],
"checks_A": { "canvas_uniform": "pass", "version_sync": "pass",
"render_fresh": "pass", "contrast": "pass", "fonts": "pass" },
"scores_B": { "C1": 4, "C2": 3, "C3": 4, "C4": 3, "C5": 3, "C6": 4 }
하지 말 것
- A군을 눈으로 때우는 것. 종횡비·해시·대비는 재는 것이지 보는 것이 아니다.
- "전반적으로 깔끔함" 같은 총평. 항목별 점수와 실패 좌표를 써라.
- 시간·한도 부족을 통과 사유로 쓰는 것.
needs_review가 정직한 답이다.