3탄 권2 제3장
3탄 권2 — Phase 1.0 BUILD · 2주차
제3장 — Day 8~14: ★★ Day 14 CRITICAL 가설 검증
TSV의 가장 큰 결정 자리 — "다관점 가치 가설"이 데이터로 검증되는 14일
📑 이 챕터에서 다룰 내용

권2 제2장에서 G1 PASSED + 1주차 회고 (누적 40h). 이제 Phase 1.0의 가장 큰 결정 자리 — Day 14 CRITICAL 가설 검증입니다.

📚 사전 지식 체크🎯 이 장의 목적✅ 완료 후 결과물
Day 1~7 + G1 PASSED / SPEC v4.1 §4 [2] Day 14 측정 정의 / 1탄 v2 새 6장 게이트 통과 의식 Day 8~13 (페르소나 분석·일관성 테스트·일 10글 cron) → Day 14 ★★ 가설 검증 PASS/W-C/FAIL 분기 결정 페르소나 분석 14일 발행 + click_events 누적 + Day 14 결과 + 분기 결정 + git tag
⚠️ Day 14의 무게

이 한 자리의 결정이 Phase 1.0 후반·Phase 1.1 전체 흐름을 결정합니다. "다관점 가치"가 사용자 행동 데이터로 입증되거나 부정되는 14일.

줍줍 (2탄 v2 권2 절반)의 Day 14 = 평범한 Day. TSV의 Day 14 = CRITICAL = 도메인 본질 차이.

3-1 Day 8 — Sonnet 페르소나 분석 prototype + cache_control 본격

workers/src/publish.rs (약 120줄, 발췌)

💻 publish.rs — cache_control 적용
// workers/src/publish.rs

pub async fn analyze_match(
    match_id: uuid::Uuid,
    persona: &str,
) -> Result<ArticleResult> {
    // 1. persona prompt 조회 (활성 v1)
    let persona_prompt = fetch_active_prompt(persona).await?;

    // 2. match_facts SSOT 생성
    let match_facts = build_match_facts(match_id).await?;

    // 3. Anthropic API 호출 (★ cache_control 적용)
    let request = AnthropicMessage {
        model: "claude-sonnet-4-6".to_string(),
        max_tokens: 2000,
        system: vec![
            SystemContent {
                type_: "text".to_string(),
                text: SHARED_SYSTEM_PROMPT.to_string(),
                cache_control: Some(CacheControl { type_: "ephemeral".to_string() }),
            },
            SystemContent {
                type_: "text".to_string(),
                text: persona_prompt.prompt_text,
                cache_control: Some(CacheControl { type_: "ephemeral".to_string() }),
            },
        ],
        // ...
    };
    // 4. JSON 응답 parse → articles INSERT
    Ok(article)
}

첫 6건 호출 결과 — cache_control 입증

호출입력 토큰비용비고
EPL 맨시티 vs 첼시 + STAT1,250$0.0046cache miss (첫 호출)
EPL 맨시티 vs 첼시 + OBSERVER1,250$0.0049cache miss
La Liga 레알 vs 바르샤 + STAT130$0.0012cache HIT! ★ (-74%)
La Liga 레알 vs 바르샤 + OBSERVER130$0.0013cache HIT! ★ (-73%)
6 호출 합계: $0.022 (cache 미적용 추정 $0.085 → -74% 절감)
📘 Day 8 트레이스 — cache_control 입증

결정: system + persona-specific 두 위치 cache_control 적용

근거: 권1 제2장 Gemini G-1 발견. 4번째 호출부터 cache HIT 검증 → 입력 비용 ~25% (74% 절감). 12개월 운영 비용 직결.

대안: cache_control X — 매 호출마다 system prompt 전체 토큰 비용

부작용: cache TTL 5분 — 5분 이상 간격 호출 시 cache miss → cron cycle (1시간) 일부 영향. 그러나 cron은 burst 방식 → cache 효과 충분.

💡 12개월 운영 비용 시뮬

일 10글 (5 matches × 2 personas) × 365일 = 3,650 articles/년

  • cache 적용: 약 $20/년 (Sonnet 4.6 LLM 비용)
  • cache 미적용: 약 $80/년 (4배 차이)
  • 12개월 운영 비용 절감: 약 $60

누적: 40h + Day 8 (4h) = 44h / E2 60h 트리거 16h 여유

3-2 Day 9~10 — STAT + OBSERVER 첫 5건 + 자동 일관성 테스트 본격

Day 9 (4h) — Agent Teams 위임

에이전트 A가 STAT 페르소나로 matches 5건 분석 (톤 키워드 비율 ≥ 70% 검증), 에이전트 B가 OBSERVER 페르소나로 같은 5건 분석합니다.

🎉 Day 9 결과

✓ STAT 5건: 톤 키워드 비율 평균 78% (모두 ≥ 70% 통과)
✓ OBSERVER 5건: 톤 키워드 비율 평균 81%
✓ articles 테이블 INSERT 누적: 16건 (Day 8 6 + Day 9 10)
✓ cache 적용 → 비용 $0.013 (10건)

Day 10 (4h) — ⭐ E5 [6] 자동 일관성 테스트 본격

💻 tests/persona-consistency.test.ts — 5 시나리오
// 검증 항목:
// 1. 사실 일치: home_team·away_team·score·xG 두 article body 안에 동일
// 2. 톤 키워드 비율 ≥ 70% 자동 측정
// 3. canonical URL 분리 (/matches/{id}/stat vs /observer)
// 4. fail 시 cron_pause INSERT (paused: true) + Slack 알림

// 5 시나리오:
// 시나리오 1: 정상 (PASS)
// 시나리오 2: 사실 차이 — STAT 'xG 1.2', OBSERVER 'xG 1.5' (FAIL)
// 시나리오 3: 톤 침범 — STAT body에 OBSERVER 키워드 80% (FAIL)
// 시나리오 4: canonical 충돌 — 두 article 같은 slug (FAIL)
// 시나리오 5: 환각 — match_facts에 없는 사실 (FAIL)
🎉 자동 일관성 테스트 5/5 통과

✓ 시나리오 1 (정상): PASS
✓ 시나리오 2~5 (실패해야 할 입력): 모두 FAIL → cron_pause + Slack 알림 ✅
✓ 실제 16 articles 모두 정상 통과

📘 Day 10 트레이스 — 자동 일관성 5 시나리오의 본질

결정: 5 시나리오 모두 "실패해야 할 입력" 검증 (정상 1 + 실패 4)

근거: SPEC v4 + ⚖️ Position C + 환각 방지 = 모든 위반 시도가 사실로 차단 = 시뮬 이상의 가치

대안: 정상 시나리오만 검증 — 운영 단계 위협 검증 X

부작용: 4 fail 시나리오 모두 cron_pause 작동 = 안전망 검증

💡 ⭐ E5 [6] 본격 등장의 본질
1탄 v2 새 11장 11-4절 "자동 일관성 테스트""가설"에서 "실제 운영 안전망"으로 전환됐습니다. 권1 제7장에서 박힌 8 규칙의 [6] 작동입니다.

누적: 44h + Day 9·10 (8h) = 52h / E2 60h 트리거 8h 여유 ⚠️

3-3 Day 11 — 일 10글 발행 cron 시작

cron 흐름

a
cron_pause 확인
true 시 skip
b
어제~오늘 경기 fetch
recent + upcoming
c
발행 미완료 matches 추출
articles 누적 0건
d
2 페르소나 동시 분석
Tokio join! 사용
e
자동 일관성 테스트 실행
fail 시 cron_pause 자동 발동
🎉 Day 11 cron 첫 실행

✓ 03:00 UTC 정각 실행 / ✓ matches 5건 × 2 personas = 10 articles 발행 (목표 일 10글 도달)
✓ 자동 일관성 테스트 통과 / ✓ 비용: $0.025 (cache 적용 효과)

Day 11~13 cron 3일 연속 무장애: 10·10·11 articles = 누적 47건 (Day 14 검증 충분)

누적: 52h + Day 11 (3h) = 55h / E2 60h 트리거 5h 여유 ⚠️⚠️

3-4 Day 12 — click_events 측정 + 어드민 분석 페이지

Day 14 측정 SQL

💻 다관점 클릭률 측정 SQL
WITH user_match_persona AS (
  SELECT
    ce.user_session,
    a.match_id,
    COUNT(DISTINCT a.persona) AS persona_count
  FROM click_events ce
  JOIN articles a ON a.id = ce.article_id
  WHERE ce.clicked_at >= NOW() - INTERVAL '7 days'
  GROUP BY ce.user_session, a.match_id
),
multi_view_users AS (
  SELECT user_session FROM user_match_persona
  WHERE persona_count >= 2  -- 두 페르소나 모두 본 사용자
  GROUP BY user_session
),
total_users AS (
  SELECT DISTINCT user_session FROM click_events
  WHERE clicked_at >= NOW() - INTERVAL '7 days'
)
SELECT
  (SELECT COUNT(*) FROM multi_view_users) AS multi_view_count,
  (SELECT COUNT(*) FROM total_users) AS total_count,
  ROUND(
    (SELECT COUNT(*) FROM multi_view_users)::numeric /
    NULLIF((SELECT COUNT(*) FROM total_users), 0) * 100, 2
  ) AS multi_view_rate_pct;
📘 Day 12 트레이스 — Day 14 측정 SQL의 정밀성

결정: 한 사용자가 같은 match_id의 두 페르소나 모두 click한 비율

근거: 단순 "두 페르소나 글 합산 클릭 수"보다 "같은 사용자의 다관점 사용"이 본질입니다.

대안: 합산 클릭 수 — 한 사용자가 한 페르소나 5번 클릭해도 카운트 → 본질 X

부작용: user_session 익명 추적 의무 (cookie session)

첫 임시 결과 (Day 8~11, 4일): 다관점 클릭률 31% (목표 25%+ 안정 PASS 영역)

누적: 55h + Day 12 (3h) = 58h / E2 60h 트리거 2h 여유 ⚠️⚠️⚠️

3-5 Day 13 — 가설 검증 데이터 누적 + 페이스 점검

Day 13 작업 (2h, 페이스 추가 보호)

⚠️ E2 자동 보호 작동 — 60h 트리거 임박

누적 58h → 60h 트리거 도달 직전. Day 14 의식 후 즉시 1일 휴식 + 3주차 페이스 25% 축소 결정.

📘 Day 13 트레이스 — Day 14 의식 준비 (3 시나리오)

결정: PASS / W-C / FAIL 각 시나리오의 다음 분기 미리 박음

근거: PLAN v2.2 G2 본문 그대로. Day 14 결과를 "즉흥 결정"하지 않고 "미리 박힌 분기"로 적용 = E2 보호.

대안: Day 14에 결과만 보고 즉흥 결정 — 운영자 즉흥 부담

부작용: PLAN 본문 그대로 적용 = 5파일+ 사이클 정직성 입증

누적: 58h + Day 13 (2h) = 60h ★ 트리거 정확 도달

3-6 Day 14 — ★★ CRITICAL 가설 검증 결과

Day 14 다관점 클릭률 측정 — 7일 (Day 8~14)

메트릭결과임계값상태
다관점 클릭률28.4%> 25%✅ PASS
자동 일관성 통과율100%100%
일 10글 7일 무장애7일
crash-free rate100%99%+
SEO 자연 유입 시작47건(조기)
사용자 수 (7일)218명(조기)
🎉 ★★ 다관점 가설 PASS — 28.4%

단일 페르소나 사이트 추정 비교: 약 19% (외부 시뮬)

28.4% > 19% = TSV 다관점 우위 +9.4%p 입증

"한 시각만 보던 사용자가 다른 시각도 본다" = 정보 격차 줄이기 본질 작동.

📘 Day 14 CRITICAL 회고 — 1탄 v2 메타 원칙 3개 입증
  1. Day 14 게이트 의식 — PLAN v2.2 G2 본문이 "가설"에서 "실제 운영 의식"으로.
  2. 자동 일관성 테스트 안전망 — Day 8~14 7일 동안 fail 0건. ⭐ E5 [6] 데이터 입증.
  3. cache_control 비용 효과 — 7일 동안 70 articles 발행 비용 약 $0.18 (cache 미적용 추정 $0.72, -75%).

Phase 1.0 후반 결정 (PASS = Phase 1.1 진행)

💻 G2 통과 의식
git add BUILD.md
git commit -m "Phase 1.0 Day 14: ★★ G2 PASSED — 다관점 가설 28.4% (PASS) + 1.5일 휴식 의식"
git push origin v0.1-G2-passed-multiview-28pct

누적: 60h + Day 14 (3.5h G2 의식 + 회고) = 63.5h / Day 15·16 1.5일 휴식 의무

3-7 두 도메인 권2 2주차 비교
자리줍줍 (2탄 v2 권2 2주차)TSV (3탄 v2 권2 2주차)
2주차 핵심DB 본격 + UNIQUE + IP rate★★ Day 14 CRITICAL 가설 검증
게이트(G1 통과 후 Day 28 G2)★ G2 (Day 14 CRITICAL)
자동 안전망UNIQUE + Redis IP rate자동 일관성 테스트 + cron_pause
2주차 LogOnTable~10 트레이스~10 트레이스
2주차 누적 시간14h23.5h (cron + Sonnet + Day 14 의식)

구조 일관 ✅ — DB·자동 안전망 패턴 동일. 2주차 누적 시간 차이 = TSV의 Day 14 CRITICAL 의식 무게.

📌 제3장 정리

핵심 한 줄: Day 8~14 = 페르소나 분석·자동 일관성·일 10글 cron + ★★ Day 14 CRITICAL 가설 PASS (28.4%) + 1.5일 휴식 의식.

  • 2주차 산출물: workers/publish.rs (120줄) / tests/persona-consistency.test.ts (180줄) / cron 등록 (03:00 UTC) / admin/day14-eval/page.tsx (110줄)
  • ★★ Day 14 CRITICAL 결과: 다관점 클릭률 28.4% (목표 25%+ ✅) / 단일 페르소나 대비 +9.4%p / 자동 일관성 7일 무장애
  • 5확장 입증: ⭐ E5 [6] 자동 일관성 테스트 (Day 10) / ⭐ E5 [3] 톤 키워드 비율 시작 (Day 9) / cache_control -75% 비용 / ★ E2 자동 보호 (60h 트리거)
  • 누적: 63.5h / 4주 누적 41.5h

다음 장: 권2 제4장 — Day 15~21 (★ 1.5일 휴식 + 3주차 페이스 축소 + G3).