📑 이 챕터에서 다룰 내용
권1 제3장에서 SPEC v3 (Position C) 까지 완성했습니다. 이제 두 번째 검토 라운드 — 5확장 E3 두 검토자 등장 + 두 도메인 일관 패턴 데이터 입증. 줍줍 (2탄 v2 권1 제4장) 의 12건 4+6+2 패턴이 TSV에서도 같은 비율로 작동하는지 입증하는 자리입니다.
| 📚 사전 지식 체크 | 🎯 이 장의 목적 | ✅ 완료 후 결과물 |
|---|---|---|
| SPEC v3 (Position C) / 1탄 v2 새 8장 8-3 + 부록 H-3 / 2탄 v2 권1 제4장 (줍줍 12건) 인지 | Claude 시뮬 + Gemini 2차 동시 가동 + 12건 발견 + 4+6+2 패턴 두 도메인 일관 입증 + SPEC v4 통합 | SPEC.md v4 (12건 모두 반영) + git commit + 두 도메인 데이터 일관 패턴 ✅ |
1차 라운드 (권1 제2장): SPEC v1 → Gemini 검토 → SPEC v2.
두 번째 라운드 (이 장): SPEC v3 (Position C) → Claude 시뮬 + Gemini → SPEC v4.
두 번째 라운드가 필요한 이유: SPEC v2 → v3 진화 과정에서 Position C가 추가 = 그 새 결정이 또 다른 약점을 만들 가능성. 한 라운드만 하면 그 약점을 놓칩니다.
| 영역 | Claude만 | Gemini만 | 둘 다 |
|---|---|---|---|
| 줍줍 (B2C, 2탄 v2 권1 제4장) | 4 | 6 | 2 |
| TSV (미디어, 본 장 입증 기대) | 4 | 6 | 2 |
다른 도메인에서도 같은 비율 패턴이 입증되면 = 1탄 v2 메타 원칙의 "두 도메인 일관 작동" 데이터가 됩니다.
두 라운드를 동시에 진행합니다. 약 1시간이 걸립니다.
/model claude-opus-4-6 /effort high 다른 시뮬레이션 검토자가 SPEC v3을 본다고 가정하고 약점 5건+ 찾아줘. 사용자가 못 본 것, Gemini가 못 본 것을 중심으로. 특히: - ⚖️ Position C 결정의 빈틈 (5 차원 모두 다 막혔는가) - 페르소나 시스템의 빈틈 (4 페르소나 톤 분리·SSOT 일관) - Day 14 가설 검증 게이트 측정의 빈틈 - 비즈니스 로직·사용자 행동·측정 임계값
SPEC v3을 처음 보는 검토자라고 가정하고 약점 7건+ 찾아줘. 특히: - 인프라·edge case·외부 의존성 - LLM 페르소나 환각 방지의 robustness - 외부 API (TheSportsDB·SportsRadar) 응답 변경·schema 깨짐 - 다음을 명세에서 명시 부재인지 검증: · 페르소나 system prompt 버전 관리 (변경 시 영향) · DB schema migration 정책 (matches 추가 필드 시) · cron 정지 후 재개 시 누락 데이터 처리 [SPEC v3 전체 붙여넣기 — 약 12~14KB, Position C 추가됨]
비즈니스·페르소나·KPI 측정 (C-1·C-3·C-5) / 콘텐츠 형식 정밀 (C-2·C-4) / ⚖️ Position C 단계 ② 보강 (C-2)
5건 모두 "비즈니스·측정·페르소나 톤" 영역 — Claude 강점 패턴과 일치합니다.
인프라 (G-1·G-2·G-7) / Edge case (G-3·G-4) / 외부 의존성 (G-4·G-5·G-6) / DB·migration (G-2)
7건 모두 "인프라·edge case·외부 의존성" 영역 — Gemini 강점 패턴과 일치합니다.
두 검토자 발견 통합 + 중복 vs 독립 분류 결과입니다.
| # | 발견 | 분류 |
|---|---|---|
| C-1 | Day 14 "다관점 클릭률" 측정 정의 | Claude만 ✓ |
| C-2 | Position C 광고 차단 키워드 풀 | Claude만 ✓ |
| C-3 | 페르소나 톤 분리 검증 방법 | Claude만 ✓ |
| C-4 | 사용자 댓글 답변 봇 처리 | Claude만 ✓ |
| C-5 | 운영자 시간 측정 정의 | 둘 다 ✓✓ (Gemini도 "§5 측정 방법 부재" 발견) |
| G-1 | 페르소나 system prompt 버전 관리 | Gemini만 ✓ |
| G-2 | DB schema migration 정책 | Gemini만 ✓ |
| G-3 | cron 재개 시 누락 데이터 처리 | Gemini만 ✓ |
| G-4 | TheSportsDB API schema 깨짐 | Gemini만 ✓ |
| G-5 | Sentry crash-free rate 측정 분모 | Gemini만 ✓ |
| G-6 | Cloudflare WAF 룰 | Gemini만 ✓ |
| G-7 | Oracle Free Tier 4GB 임계값 | 둘 다 ✓✓ (Claude도 "운영 시간" 영역 추가) |
데이터 입증 표
| 영역 | 발견 수 |
|---|---|
| Claude만 | 4건 (C-1·C-2·C-3·C-4) |
| Gemini만 | 6건 (G-1·G-2·G-3·G-4·G-5·G-6) |
| 둘 다 | 2건 (C-5/Gemini도 발견 + G-7/Claude도 보강) |
| 합계 | 12건 |
| 도메인 | Claude만 | Gemini만 | 둘 다 | 합계 |
|---|---|---|---|---|
| 줍줍 (2탄 v2 권1 제4장) | 4 | 6 | 2 | 12 |
| TSV (3탄 v2 권1 제4장, 본 장) | 4 | 6 | 2 | 12 |
| 일관성 | ✅ | ✅ | ✅ | ✅ |
이게 1탄 v2 부록 H-3 표가 "두 도메인에서 같은 비율 작동"임을 데이터로 입증한 자리입니다. 두 검토자 사각지대 메타 원칙 = 도메인 가리지 않고 작동.
메타 교훈 — 한 검토자만 받았다면?
| 시나리오 | 놓치는 발견 |
|---|---|
| Claude만 | G-1·G-2·G-3·G-4·G-5·G-6 = 6건 놓침 |
| Gemini만 | C-1·C-2·C-3·C-4 = 4건 놓침 |
| 두 검토자 | 0건 놓침 ✅ |
| # | 발견 | 처리 |
|---|---|---|
| C-1 | Day 14 측정 정의 + 임계값 | 즉시 SPEC v4 — §4 [2] 보강 |
| C-2 | Position C 광고 차단 키워드 풀 | 즉시 SPEC v4 — § 회색지대 결정 단계 ② 보강 |
| C-3 | 페르소나 톤 분리 검증 | 즉시 SPEC v4 — §4 [3] 보강 |
| C-4 | 사용자 댓글 답변 봇 처리 | 즉시 SPEC v4 — §4 [3] + § 회색지대 |
| C-5 | 운영자 시간 측정 정의 | 즉시 SPEC v4 — §5 KPI 보강 |
| G-1 | 페르소나 prompt 버전 관리 | 즉시 SPEC v4 — §4 [1] + DB 추가 |
| G-2 | DB migration 정책 | 즉시 SPEC v4 — §3 보강 |
| G-3 | cron 재개 누락 처리 | 즉시 SPEC v4 — §4 [3] 보강 |
| G-4 | TheSportsDB schema 깨짐 fallback | 즉시 SPEC v4 — §7 보강 |
| G-5 | Sentry crash-free 측정 분모 | PLAN G2 (Day 14) |
| G-6 | Cloudflare WAF 룰 | PLAN G3 (Day 21) |
| G-7 | Oracle 4GB 임계값 | PLAN G2 (Day 14) |
즉시 SPEC v4 — 9건: 페르소나·SSOT·Position C 신뢰 직결
PLAN.md로 — 3건 (G-5·G-6·G-7): 모두 BUILD 단계 인프라 구체 (SPEC은 의도만)
기각 — 0건
12건 모두 정당. 9건 즉시 + 3건 PLAN으로 미룸. 줍줍 (9 + 3 + 0) 과 동일 분류 비율입니다.
/model claude-sonnet-4-6 /effort high SPEC.md를 v4로 패치해줘: [즉시 반영 9건] 1. C-1: §4 [2] Day 14 측정 정의 — "다관점 클릭률" = 한 사용자가 같은 경기 두 페르소나 모두 본 비율. 임계값: > 25% PASS / 15~25% W-C / < 15% FAIL 2. C-2: § 회색지대 결정 단계 ② — 광고 차단 키워드 풀 11개 명시 3. C-3: §4 [3] 페르소나 톤 분리 — 키워드 비율 자동 측정 (70%+ 자기 키워드) 4. C-4: §4 [3] + § 회색지대 — Phase 1.0 댓글 정적 + Phase 1.2+ 봇 도입 시 "추정 X 강제" + "분석 시각만" 응답 명시 5. C-5: §5 KPI 보강 — BUILD.md [누적] 라인 자동 파싱 + 주간 평균 6. G-1: §4 [1] persona_prompts 테이블 추가 (versioning) + A/B 테스트 Phase 1.1+ + 롤백 메커니즘 7. G-2: §3 끝 — DB migration 정책 (supabase/migrations 패턴 + backfill) 8. G-3: §4 [3] cron 재개 — catch-up 24h 자동 + 일관성 검증 후 발행 9. G-4: §7 TheSportsDB schema 깨짐 fallback — graceful degradation (필수 필드만 검증) [PLAN으로 미루는 3건] 10. G-5: §5 끝 박스 — "Sentry crash-free 측정 — PLAN G2 (Day 14)" 11. G-6: §7 끝 박스 — "Cloudflare WAF 룰 — PLAN G3 (Day 21)" 12. G-7: §7 끝 박스 — "Oracle 4GB 임계값 — PLAN G2 (Day 14)" CLAUDE.md §3 Critical Constraints 준수.
Claude (Sonnet) 가 생성한 SPEC.md v4 — 변경 발췌
Day 14 "다관점 클릭률" 측정:
- 정의: "한 사용자가 같은 경기 두 페르소나 모두 본 비율"
- SQL: SELECT COUNT(DISTINCT user_session) FROM (한 user_session이 matches.id 같은 두 articles.persona 다른 것 모두 click_events 발생)
- 임계값: > 25% = ✅ Phase 1.1 진행 / 15~25% = ⚠️ 페르소나 톤 강화 (4주 추가) / < 15% = 🚨 SPEC 재검토
광고 차단 키워드 풀 (Phase 1.1 광고 도입 시 자동 적용):
- 영어: 'gambling', 'betting', 'casino', 'sports betting', 'odds', 'pick', 'parlay', 'sportsbook'
- 한국어: '베팅', '도박', '카지노', '픽', '배당'
- 합계 11개 (글로벌 + 한국어)
- AdSense 광고 차단 카테고리: 분류 'Gambling' 자동 선택
- 정기 검증: 월 1회 차단 키워드 히트율 점검 (Phase 1.1+)
persona_prompts 테이블 신설:
- id, persona_type (STAT/OBSERVER/COACH/INSIDER), prompt_version, prompt_text, is_active, created_at, deprecated_at
- 운영 중 prompt 변경 시: 새 버전 추가 (deprecate 후 활성화)
- A/B 테스트 (Phase 1.1+ 50/50 분배)
- 롤백: deprecated_at 업데이트로 즉시 이전 버전 복귀
- articles 테이블에 prompt_version FK (사용 버전 추적)
페르소나별 톤 키워드 (시스템 프롬프트에 명시):
- STAT 키워드: '%', '데이터', 'xG', '점유율', '확률 (분석)'
- OBSERVER 키워드: '관전', '시각', '주목', '느낌', '인상적'
- COACH 키워드 (Phase 1.2+): '전술', '포메이션', '압박', '빌드업'
- INSIDER 키워드 (Phase 1.2+): '이적', '루머', '소식', '관계자'
자동 측정 (Phase 1.0 일관성 테스트 확장): 각 article body에서 자기 페르소나 키워드 비율 ≥ 70% 검증. < 70% 시 cron 정지 + Slack 알림 (톤 손상 위험).
DB schema 변경 정책:
- supabase/migrations/{timestamp}_{description}.sql 패턴
- production 적용: graceful (down-time X) — 새 컬럼 추가: NULL 허용 → backfill cron → NOT NULL 변경 / 컬럼 제거: 사용 중단 → 30일 후 제거
- migration 적용 후 BUILD.md entry 의무
API schema 변경 처리:
- Rust deserialize 실패 시 graceful degradation: 필수 필드 (id, kickoff_at, home/away_team) 만 검증 / 새 필드는 옵셔널 (Option<T>)
- 월 1회 schema 스냅샷 자동 비교 (변경 시 운영자 알림)
- 임계 변경 시 (필수 필드 제거) 즉시 cron 정지
git add SPEC.md git commit -m "SPEC v4: 두 검토자 12건 (4+6+2 패턴 두 도메인 일관) — 9 즉시 + 3 PLAN"
Phase 0 Day 4
[계획] 두 검토자 라운드 (Claude 시뮬 + Gemini 2차) + SPEC v4 통합
[실행]
- Claude Opus 시뮬 검토 (5건) — 비즈니스·페르소나·KPI 측정 패턴
- Gemini 2차 검토 (7건) — 인프라·edge case·외부 의존성 패턴
- 통합 12건 = Claude만 4 + Gemini만 6 + 둘 다 2 (★ 4+6+2 패턴 입증)
- 9건 즉시 SPEC v4 + 3건 PLAN.md로 미룸
[LogOnTable 트레이스]
- 결정: 12건 모두 수용. 9 즉시 SPEC + 3 PLAN으로 (줍줍과 동일 분류)
- 근거: 4+6+2 패턴 데이터 입증 (1탄 v2 새 8장 8-3 + 2탄 v2 권1 제4장 일치)
- 대안: Gemini 한 라운드만 (6건 놓침) / Claude만 (4건 놓침) — 모두 손실
- 부작용: SPEC 분량 14KB → 18KB. 정당한 증가 (페르소나 versioning + Position C 단계 ② 보강 + Day 14 측정 정의)
[★ 두 도메인 일관 패턴 데이터 입증]
- 줍줍 12건 (4+6+2) + TSV 12건 (4+6+2) = 동일 비율
- 한 검토자만 받았다면: 4건 또는 6건 놓침 (양 도메인 동일)
- 두 검토자: 0건 놓침 (양 도메인 동일)
[누적] 7h + Day 4 (2.5h) = 9.5h / E2 60h 트리거 50.5h 여유
[회고 1줄] 4+6+2 패턴이 두 도메인에서 동일 비율로 입증된 자리. 1탄 v2 메타 원칙의 깊이가 "여러 도메인 동일 작동" 사실로 박힘.
- 1️⃣ E3 두 검토자 등장: Claude 시뮬 5건 + Gemini 2차 7건 = 12건 4+6+2 패턴
- 2️⃣ 두 도메인 일관 입증: 줍줍 (4+6+2) + TSV (4+6+2) — 완벽 일치 ✅
- 3️⃣ 정직한 처리: 9건 즉시 SPEC v4 + 3건 PLAN + 기각 0건 (줍줍과 동일)
- 4️⃣ SPEC v4 보강 내용: Day 14 측정 정의 + 광고 차단 키워드 11개 + 페르소나 versioning + DB migration 정책 + cron catch-up + TheSportsDB fallback
- 5️⃣ 메타 교훈: 한 검토자에 의존하면 4~6건 놓침 (양 도메인 동일)
- 6️⃣ 누적 시간: 9.5h / R4 트리거 60h 여유 50.5h
- 7️⃣ 다음 장: 권1 제5·6장 — 5확장 회고 + PLAN v2.1 + ⭐ E2 본격
두 검토자 라운드 = E3 등장. 12건 4+6+2 패턴 줍줍·TSV 두 도메인 동일 비율 데이터 입증 ✅.
1탄 v2 부록 H-3 표가 "한 도메인만" 가설에서 "여러 도메인 동일 작동" 사실로 전환된 자리입니다. TSV의 헌법이 단단합니다.