공개 스펙
바이브코딩 채점 기준 v2
version 65a64532b706b05e
# VibeTier 바이브코딩 채점 기준 v2
**문서 ID:** `vibe-scoring-criteria-v2`
**상태:** 초안 (v1 비판적 개정 + 연구 노트 반영)
**대체 대상:** [`vibe-scoring-criteria-v1.md`](vibe-scoring-criteria-v1.md)
**연관 연구:** [`scoring-research-2026-05-30.md`](scoring-research-2026-05-30.md)
> v2의 핵심 원칙: **문서는 산문(왜)을 담고, 기준의 사실(무엇·어떻게)은 코드가 단일 출처(SoT)다.**
> 101개 기준의 정의·축·가중치·minPhase는 [`lib/rubric/registry.ts`](../lib/rubric/registry.ts)가 정본이고,
> 본 문서는 그 위에서 **철학·검증·교정 사항**만 규정한다. (v1이 표를 통째로 복제해 코드와 어긋난 점을 되풀이하지 않는다.)
---
## 0. v2를 만드는 이유 — v1에 대한 비판
v1은 “101개 기준 카탈로그”로서는 충실했지만, **실제 구현과 어긋났고**, 사용자가 보는 점수의 **진짜 계산 경로를 설명하지 못했다.** 아래는 v1 ↔ 코드 대조에서 확인한 구체적 불일치다.
### 0.1 치명적: v1은 사용자에게 보이는 점수 모델을 설명하지 않는다
- v1 전체는 `vibe_toxicity_score`(루브릭 엔진의 축 점수)를 헤드라인으로 설명한다.
- 그러나 실제 UI 점수·티어는 **PRD 레이어**(`SCORING_MODEL_PRD_V01 = "prd-v0.1"`)가 만든다. 6개 카테고리 합(만점 100)으로 계산된다.
- `visual_default_signature` 24 · `layout_cliche` 18 · `copy_slop` 16 · `faux_functionality` 17 · `stack_fingerprint` 15 · `polish_gaps` 10 (`lib/scoring/prd-types.ts`)
- 즉 v1이 설명한 5개 축(`trope_density / meta_stack / copy_slop / static_bloat / craft_hygiene`)은 **내부 중간 산물**일 뿐, 화면 점수가 아니다. **두 채점 레이어가 존재한다는 사실 자체가 v1에 빠져 있다.**
### 0.2 콤보 보너스 수치가 코드와 다르다
| Combo | v1 문서 | 실제 코드(`lib/rubric/combos.ts`) |
|---|---|---|
| `combo_next_tailwind_vercel` | **+8** | **+12** |
| `combo_shadcn_framer_landing` | +5 | +5 (일치) |
| `combo_ai_copy_stack` | +6 | +6 (일치) |
| `combo_logo_marquee_pricing` | +7 | +7 (일치) |
### 0.3 v1에 아예 없는 보정 로직이 코드에 있다
다음은 점수에 직접 영향을 주는데 v1 어디에도 문서화되지 않았다.
- **PRD 카테고리 롤업의 "상위 30%" 평균** (`prd-evaluate.ts`): 카테고리 내 criterion을 toxicity 내림차순 정렬 후 상위 30%만 가중평균 → 강한 토큰 몇 개가 카테고리를 대표한다. (연구 노트가 1순위 병목으로 지목)
- **보너스/패널티 시스템** (`prd-bonus.ts`): visual 스파이크 +5, `✨` 밀도 +2, AI-powered +2, dead CTA 군집 +2, 신성한 3카드 +2, 자기선언 바이브코딩 +10 / “사람 손맛” 패널티(craft·실질 카피·고유 타이포) 최대 −16.
- **자기선언 바이브코딩 캘리브레이션** (`applySelfDeclaredVibecodingCalibration`): URL/카피가 vibe coding을 자처하고 얇은 템플릿이면 카테고리에 바닥값(floor)을 강제.
### 0.4 Phase 모델이 코드와 불일치
- v1은 Phase A/B/**C**(비전·LLM)를 전제로 기준 detectability를 작성했다.
- 실제 파이프라인 `AnalysisPhase`는 `"A" | "B" | "auto"`뿐이고 **Phase C는 존재하지 않는다.** LLM copy/vision/roast는 Phase가 아니라 **별도의 선택적 보조 레이어**다.
- 결과적으로 `minPhase: "C"` 기준(예: `perf_lcp_element_hero_image`, `ai_illustration_style_generic`, `ai_generated_favicon_pattern`, `craft_custom_illustration_not_stock`)은 **사실상 항상 N/A 또는 40 캡**에 걸려 **죽은 가중치**가 된다.
### 0.5 detectability가 다중값으로 적힌 표 vs 단일 enum 코드
v1 표는 `static_html, rendered_dom`처럼 여러 값을 병기하지만, `CriterionMeta.detectability`는 **단일 enum**이다. 신뢰도 가중(`DETECTABILITY_WEIGHT`)도 단일 값으로만 계산된다. 표의 다중 표기는 구현되지 않은 의도였다.
### 0.6 망가진/모순된 기준 정의
- `craft_honest_limitations_section`(v1 §244): “0=없음; 100=명시 → raw 낮음=좋음 inverted: actually score as craft…” — **문장 자체가 초안 오류**로 극성이 자기모순. v2에서 정의를 재작성한다(0.x §4 참조).
### 0.7 검증되지 않은 예시 프로필
- v1 Appendix C는 “Next+Tailwind SaaS ≈ Platinum–Emerald(48–58)”라 적었지만, 연구 노트의 배치 로그는 동일 계열(`v0.dev`)이 한 실행 39(gold), 다른 실행 84로 **출렁였다.** 예시는 **회귀 fixture로 고정되기 전까지 구속력이 없다.**
### 0.8 “안티 게이밍”은 선언일 뿐 보장이 아니다
- v1 §54–59는 토큰 경계 매칭을 약속하지만, 연구 노트는 scorer가 여전히 부분 문자열/정규식 중심이며 렌더 실패·HTML 샘플링에 민감해 **불안정**하다고 평가했다.
---
## 1. v2 채점 철학
### 1.1 이 점수가 의미하는 것 / 아닌 것 (v1 유지, 표현 강화)
`vibe_toxicity`는 공개 URL의 **첫 인상 표면 신호**에서 드러나는 클리셰·템플릿·메타스택·카피 슬롭의 밀도다. **높을수록** “또 그 랜딩/그 스택/그 카피” 느낌이다.
여전히 **아닌 것**: 엔지니어링 품질, 비즈니스 성공, WCAG 인증, 런타임 성능 보증, 도덕 판단, 단독 미학 평가. **그리고 AI 사용의 증명이 아니다** — Challenger는 고발이 아니라 “클리셰 밀도 최고”라는 관상 라벨이다.
### 1.2 핵심 변화: 단일 toxicity → 4개 분해 점수 (연구 노트 채택)
운영 티어(LoL 9단)는 **하나로 유지**하되, 내부 모델을 다음 4축으로 분해하는 것을 v2 목표로 한다.
| 분해 점수 | 의미 | 대표 evidence |
|---|---|---|
| **Template Fingerprint** | AI 빌더/템플릿 산출물 가능성 | v0/lovable/bolt 지문, generated metadata, class 구조 |
| **Cliche Density** | SaaS/AI 랜딩 클리셰 밀도 | hero gradient, 카드 반복, logo wall, vague CTA |
| **Product Specificity** | 실제 제품·맥락의 구체성 (감점 아닌 **독립 축**) | 실제 화면, 구체 워크플로, 문서/가격/지원 링크 |
| **Confidence** | 분석 신뢰도 | 렌더 성공, 스크린샷 확보, DOM 완전성, bot-block 여부 |
**왜 분리하나:** 진짜 성숙한 제품도 랜딩 문법을 쓴다. `Product Specificity`를 별도 축으로 빼야 “예쁘지만 빈 템플릿”과 “클리셰를 쓰는 진짜 제품”을 구분할 수 있다.
### 1.3 점수는 단일 숫자가 아니라 (점수 + 신뢰도 + 증거)다
UI는 항상 **점수 · `confidence` · `limitations` · evidence type**을 함께 노출한다(Lighthouse 점수 변동성 고지 원칙 준용). 사용자가 반박할 수 있도록 matched selector/text/screenshot crop을 제공하는 것을 목표로 한다.
### 1.4 두 레이어를 명시적으로 인정한다
```
HTML/DOM/스크린샷
└─ 루브릭 엔진(lib/rubric) → 5축 axisScores → vibe_toxicity_score (내부)
└─ PRD 평가(lib/scoring) → 6 카테고리 합 + 보너스 − 패널티 → score/tier (사용자)
└─ LLM 보조(선택) → copy / vision / roast 병합
```
- 내부 `vibe_toxicity_score`와 사용자 `score`는 **다른 수**일 수 있다. 문서·UI·테스트는 어느 레이어를 말하는지 항상 명시한다.
---
## 2. 축(Axes)과 가중치 — 코드와 일치하도록 명시
### 2.1 루브릭 엔진 축 가중치 (`lib/rubric/engine.ts`)
| 축 ID | 가중치 | 극성 |
|---|---|---|
| `trope_density` | 0.30 | toxic(+) |
| `meta_stack` | 0.24 | toxic(+) |
| `copy_slop` | 0.22 | toxic(+) |
| `static_bloat` | 0.16 | toxic(+) |
| `craft_hygiene` | relief 계수 **0.11** | **역극성(−)** — 좋을수록 toxicity 감소 |
- 축 점수는 **클래스 가중평균**(`CLASS_SHARE = micro 2 / small 4 / medium 7 / large 11`)에 **피크 블렌드 0.5**(상위 5개 평균)를 섞는다. 강한 트로프 몇 개가 희석되지 않게 하기 위함.
- 최종 toxicity = `Σ(toxic축×가중치) − 0.11×craft_hygiene`, 0–100 클램프.
### 2.2 PRD 카테고리 만점 (`lib/scoring/prd-types.ts`)
| 카테고리 | 만점 | UI 라벨(KO) |
|---|---|---|
| `visual_default_signature` | 24 | 시각 클리셰 |
| `layout_cliche` | 18 | 카드농장 지수 |
| `copy_slop` | 16 | 카피 슬롭 |
| `faux_functionality` | 17 | 가짜 버튼 에너지 |
| `stack_fingerprint` | 15 | 테일윈드 냄새 |
| `polish_gaps` | 10 | 프로토타입 아우라 |
합 100. 루브릭 criterion → PRD 카테고리 매핑은 `lib/scoring/criterion-category-map.ts`가 정본.
---
## 3. 아키타입 모디파이어 — 코드와 일치
`lib/rubric/archetype-modifiers.ts`에 **실제 적용되는 값**만 둔다(나머지 아키타입은 현재 무보정).
| 아키타입 | 적용 모디파이어 |
|---|---|
| `open_source` | meta_stack −20, copy_slop −10 |
| `portfolio` | meta_stack −15 |
| `government` | copy_slop −30, trope_density −40 |
| `corporate` | trope_density −10 |
| 그 외 | 보정 없음 |
> v1 Site Archetype 표의 “docs: copy↓/trust↓”, “app_shell: vis↓” 등은 **모디파이어로 구현돼 있지 않다.** 아키타입 효과는 주로 개별 기준의 `naArchetypes`/`applyOnlyArchetypes`로만 들어간다. 이 차이를 v2에서 분명히 한다.
---
## 4. 기준 카탈로그 — 변경/교정 사항만
전체 101개 정의는 `registry.ts`가 SoT. 본 문서는 v1 대비 **델타**만 규정한다.
### 4.1 죽은 가중치 정리 (`minPhase: "C"`)
Phase C가 없으므로 아래 기준은 현재 의미 있게 채점되지 않는다. v2는 둘 중 하나를 택한다.
- (A) **LLM/비전 보조 레이어로 이관** — vision assist가 채우는 evidence로 점수화, 또는
- (B) **명시적 보류** — 측정 불가 표시(`insufficient evidence`)하고 가중치에서 재정규화.
대상: `perf_lcp_element_hero_image`, `ai_illustration_style_generic`, `ai_generated_favicon_pattern`, `craft_custom_illustration_not_stock`.
### 4.2 `craft_honest_limitations_section` 정의 재작성
- **극성:** 역극성(`craft_hygiene`). 한계/면책 섹션이 **있으면 craft 양호 = toxicity 감소.**
- **raw 규칙(0–100, 낮을수록 좋음):** `0` = “limitations/한계/면책/not financial advice” 등 정직성 문구가 명확히 존재; `100` = 전무.
- v1의 모순 문장(“actually score as craft: 100 if present”)을 폐기한다.
### 4.3 detectability 단일값 원칙
표기·구현 모두 **단일 enum**으로 통일한다. “두 경로로 잡힌다”는 의도는 산문 주석으로만 남기고 점수 계산엔 단일 값만 쓴다.
### 4.4 inverse 자동 규칙 명문화
`registry.ts`의 `c()` 헬퍼는 `id`가 `craft_` 또는 `a11y_`로 시작하면 자동으로 `inverse: true`다. 따라서 **역극성 기준 = craft_ 9개 + a11y_ 7개 = 16개**. (v1 §85 문구는 맞으나, 자동 규칙임을 v2에서 명시.)
---
## 5. 보너스·패널티·캘리브레이션 — v2에서 정식 문서화
(이전 v1엔 부재. `lib/scoring/prd-bonus.ts`, `prd-evaluate.ts` 기준.)
### 5.1 보너스 (점수 가산)
| 조건 | +점 | note |
|---|---|---|
| `visual_default_signature` ≥ 20 | +5 | visual-cliche-spike |
| sparkle/✨ 흔적 ≥ 2 | +2 | sparkles-density |
| `copy_en_ai_powered_density` ≥ 60 | +2 | ai-powered-everywhere |
| dead CTA ≥ 3 | +2 | dead-cta-cluster |
| `lay_three_column_features` ≥ 50 | +2 | sacred-three-card |
| 자기선언 바이브코딩 + stack≥14 + copy≥15 | +10 | self-declared-vibecoding-template |
### 5.2 “사람 손맛” 패널티 (baseVibe < 18일 때만)
| 조건 | −점 |
|---|---|
| 저toxic craft 기준 ≥ 3 | −min(8, 3+개수) |
| `craft_substantive_copy_density` 양호 | −5 |
| `craft_unique_typography_choice` 양호 | −3 |
### 5.3 자기선언 캘리브레이션
`copy_meta_vibe_self_reference ≥ 80` + 템플릿 스택 + 얇은 랜딩이면 카테고리 바닥값 강제(visual 21 / layout 16 / copy 16 / stack 15).
> v2 과제: 이 보정들은 **회귀 fixture 없이는 감 튜닝**이다. §7의 고정 fixture로 각 보정의 효과를 회귀 테스트로 묶는다.
---
## 6. 신뢰도와 정직성(Honesty) 규칙
- `analysis_confidence` = 측정된 기준의 detectability 가중 평균 × 아키타입 확신. PRD `confidence`는 high(≥0.72)/medium(≥0.45)/low로 환산.
- **저신뢰 가드(v2 신규):** 렌더 실패·봇 차단·HTML 샘플링으로 신뢰도가 낮으면 **낮은 티어를 확정하지 말고** `근거 부족(insufficient evidence)` 상태로 표시한다. (연구 노트 §4단계)
- `limitations`(예: `perf-html-only`, `phase-a-dom-proxy`, `dom-proxy-scored`, `html-truncated-for-rubric`, `crawler-unconfigured`)는 항상 노출.
---
## 7. 캘리브레이션 & 회귀 (v2의 1순위 작업)
연구 노트의 결론: **코드 수정보다 고정 fixture와 오판 리포트가 먼저다.**
1. `docs/fixtures/vibe-coded-seed*.json`을 **구속력 있는 회귀 fixture**로 승격.
2. 대표 URL의 기대 구간 정의: `v0.dev`, `lovable.dev`, `bolt.new`, `cursor.com`, `linear.app`, `vercel.com`, `webflow.com`, `MDN`, `.go.kr`, GitHub repo page.
3. 현재 점수 vs 기대 구간 차이를 **CI에서 표시**(통과/회귀).
4. 라벨셋(≥200 URL)을 축별로 라벨링: `template_fingerprint 0–3`, `cliche_density 0–3`, `product_specificity 0–3`, `craft_quality 0–3`, `confidence_issue yes/no`. `captured_at` + screenshot/HTML hash 저장.
5. 점수식은 **calibration 기반**으로: 상위 30% 롤업 제거 또는 보조화, family cap, diminishing return(반복은 로그/루트), specificity relief, low-confidence 보류.
### LLM/비전 judge 사용 원칙
- 최종 점수를 LLM에 맡기지 않는다(drift/bias).
- 용도 제한: evidence cluster 설명, **pairwise**(A/B 중 더 템플릿스러운 쪽), gold label 일치율 측정, judge 버전 변경 시 calibration set 재평가.
---
## 8. Tier Band (코드 일치, `lib/tiers.ts`)
| Tier | Score |
|---|---|
| Iron | 0–11 |
| Bronze | 12–22 |
| Silver | 23–33 |
| Gold | 34–44 |
| Platinum | 45–55 |
| Emerald | 56–66 |
| Diamond | 67–77 |
| Master | 78–88 |
| Challenger | 89–100 |
---
## 9. 버전·롤아웃 주의사항
> **중요:** `lib/rubric-version.ts`는 **`docs/vibe-scoring-criteria-v1.md`의 SHA-256**을 rubric version으로 쓴다.
> 이 v2 문서를 추가하는 것만으로는 version이 바뀌지 않는다. v2를 정본화하려면:
> 1. `getRubricVersion()`가 v2 파일을 가리키도록 변경, **또는** 명시적 버전 상수로 전환.
> 2. 해시 변경은 **기존 스냅샷 토큰·리더보드 rubricVersion을 무효화**하므로, 마이그레이션(`scripts/migrate-scoring-v2.ts`)과 함께 배포한다.
> 3. PRD 모델 문자열(`prd-v0.1`)도 점수식이 바뀌면 함께 올린다(`prd-v0.2` 등).
### Appendix: 예시 프로필 (비구속 — §7로 고정되기 전까지 참고용)
| Profile | 대략 구간 | 비고 |
|---|---|---|
| `example.com` bare | Iron–Bronze | 낮은 trope/meta |
| 전형 Next+Tailwind SaaS landing | Platinum±2 | **단, 배치 로그상 변동 큼 → fixture로 고정 필요** |
| AI wrapper waitlist | Diamond–Master | copy+trust+ai |
| MDN / docs | Iron–Bronze | archetype N/A 다수 |
| `.go.kr` government | Iron | copy/trope 강한 음수 모디파이어 |
| GitHub repo page | Bronze | `typo_inter` FP 회귀 금지 |
---
## Changelog
| Version | Date | Notes |
|---|---|---|
| v1 | 2026-05-29 | 101 기준 카탈로그 초안 |
| v2 | 2026-05-31 | v1 비판적 개정: 코드 드리프트 교정(콤보 +12, 누락 보너스/패널티/캘리브레이션 문서화), PRD 레이어 명문화, Phase C 죽은 가중치 정리, 4축 분해·저신뢰 보류·회귀 fixture를 목표로 채택 |
| v2.1 | 2026-05-31 | 구현 정합: `prd-v0.2`, vision bridge, family cap, 219 URL calibration set, compliance tests — see [`v2-implementation-status.md`](v2-implementation-status.md) |