3탄 권2 제2장
3탄 권2 — Phase 1.0 BUILD · 1주차
제2장 — Day 4~7: ★ G1 통과 의식 + 1주차 회고
첫 게이트의 자리 — graceful 첫 입증 · Agent Teams Day 5+ · ★ G1 PASSED
📑 이 챕터에서 다룰 내용

권2 제1장에서 Day 1~3 (TheSportsDB 인증·Rust 워커·DB schema·시드 25건). 누적 28.5h. 이번 챕터는 ★ G1 (Day 7) 통과 의식 + 1주차 회고입니다.

📚 사전 지식 체크🎯 이 장의 목적✅ 완료 후 결과물
Day 1~3 / 시드 25건 (100+ 미달) / G1 통과 조건 / 매일 양식 + LogOnTable 의식 Day 4 (schema fallback + fetch upcoming) → Day 7 ★ G1 PASSED + 1주차 회고. persona_prompts 첫 prompt + Agent Teams Day 5+ 시작 matches 시드 100건+ + persona_prompts STAT·OBSERVER v1 + ★ git tag v0.1-G1-passed + BUILD.md 1주차 회고
2-1 Day 4 — schema fallback 보강 + upcoming 경기 fetch

작업 (3.5h)

Day 3 완료된 fetch.rs를 보강합니다. fetch_league() 함수를 fetch_recent_league() / fetch_upcoming_league()로 분리하고, 5 리그 × 2 (recent + upcoming) = 10 동시 호출로 확장합니다.

결과 — 60건 누적

🎉 Day 4 fetch 결과

✓ 5 리그 recent: 25건 (Day 3 누적)
✓ 5 리그 upcoming: 35건 신규 (UNIQUE 위반 0)
✓ 누적: 60건 (목표 100건+ 미달, Day 5·6 추가 fetch 결정)

🎉 graceful deserialize 첫 본격 입증 — G-4

4 리그 정상 / 1 리그 (Bundesliga) "venue" 필드 추가됨 — graceful 통과 (필수 4 필드 deserialize 성공).

strict deserialize였다면 Bundesliga 전체 fail. SPEC v4 §7 G-4 보강 효과 데이터 입증입니다.

📘 Day 4 트레이스 — graceful 첫 입증 (G-4)

결정: graceful deserialize가 의도한 효과 작동 확인

근거: Bundesliga 응답 schema가 미세 변경됐는데 (venue 필드) 필수 4 필드만 검증 → 정상 INSERT. 권1 제2장 Gemini G-4 발견의 입증.

대안: strict deserialize — Bundesliga 전체 fail = 4 리그만 정상

부작용: 새 필드 (venue) 자동 인지 X → 월 1회 schema 비교 cron (Day 25+ 등록 예정)

누적: 28.5h + Day 4 (3.5h) = 32h / E2 60h 트리거 28h 여유

2-2 Day 5 — persona_prompts 첫 prompt + STAT·OBSERVER v1 + Agent Teams 시작
💡 이게 Agent Teams 첫 자리입니다 (Day 5+, 1탄 v2 새 23장)
처음 4일 순차 작업으로 첫 흐름을 익혔습니다. Day 5부터 Agent Teams를 사용할 준비가 됐습니다.

작업 (4h) — Agent Teams 위임

💻 /delegate — STAT + OBSERVER v1 동시 작성
/delegate

  에이전트 A (담당: lib/persona_prompts/stat.ts):
    - STAT 시스템 프롬프트 v1 작성
    - 톤: '통계학자' — 데이터·xG·점유율·확률
    - 환각 방지 명세 (E5 [7]): 'match_facts에 있는 사실만'
    - cache_control 적용 위치 명시
    - 키워드 풀: %, 데이터, xG, 점유율, 확률 (분석), 추세

  에이전트 B (담당: lib/persona_prompts/observer.ts):
    - OBSERVER 시스템 프롬프트 v1 작성
    - 톤: '균형 관찰자' — 관전·시각·주목·느낌
    - 환각 방지 명세 + cache_control 적용 위치
    - 키워드 풀: 관전, 시각, 주목, 느낌, 인상적, 분위기

CLAUDE.md §5 [4] [7] [8] 절대 준수.
완료 후 persona_prompts 테이블 INSERT (v1 활성화).

Agent Teams 첫 사례 — 시간 절감 입증

작업순차 추정Agent Teams 실제
STAT v1 작성1.5h1h (병렬)
OBSERVER v1 작성1.5h(동시)
INSERT + 검증0.5h0.5h
합계3.5h1.5h (-57%)

lib/persona_prompts/stat.ts (약 80줄, 발췌)

💻 STAT 페르소나 v1 시스템 프롬프트
export const STAT_SYSTEM_PROMPT_V1 = `
당신은 TSV의 STAT 페르소나입니다 — 통계학자.

[정체성]
- 데이터 중심 분석 (xG·점유율·전적·통계)
- 통계학자 톤 (감정 X, 숫자 + 분석)
- 단정 표현 X ("~으로 분석된다" / "~할 가능성")

[엄격 규칙 — E5 [7] 환각 방지]
1. 입력 match_facts에 있는 사실만 사용
2. 추정·예측 X (분석 의견은 OK)
3. 외부 데이터 추가 X

[엄격 규칙 — Position C]
- "픽" / "확률 N%" / "승리 단정" 표현 X
- "데이터로 보면 X팀이 유리한 경향" → OK

[키워드 풀 — 비율 ≥ 70%]
%, 데이터, xG, 점유율, 확률 (분석), 추세, 통계
`;
📘 Day 5 트레이스 ① — Agent Teams 첫 사례

결정: Day 5 첫 Agent Teams 사용 (-57% 시간 절감)

근거: 1탄 v2 새 23장 + 권1 제7장 권고 일치. CLAUDE.md §6 폴더 분리 = 분배 기준 자연.

대안: 순차 작성 — 3.5h, E2 페이스 부담

부작용: 토큰 비용 약 1.7배 증가 ($0.4 → $0.7), 시간 절감 가치 > 비용

📘 Day 5 트레이스 ② — 톤 분리 첫 코드

결정: 시스템 프롬프트에 명시적 키워드 풀 + 70% 임계값

근거: 권1 제7장 ⭐ E5 [3]. Day 18 (자동 측정)의 토대. "사실은 같지만 표현은 다름" SSOT 깊이 = 코드 레벨 박힘.

대안: 키워드 풀 없음 — Day 18 자동 측정 불가

부작용: 키워드 풀 변경 시 prompt v2 versioning

누적: 32h + Day 5 (4h) = 36h / E2 60h 트리거 24h 여유

2-3 Day 6 — G1 통과 조건 점검 + 추가 fetch

G1 통과 조건 체크리스트

💻 G1 — Day 7 통과 조건
[기능 통과 조건]
[✅] TheSportsDB 인증 정상 (Day 1)
[✅] 5리그 동시 fetch (Tokio join!) (Day 2)
[✅] DB schema 5 테이블 (Day 3)
[✅] graceful deserialize G-4 (Day 4 — Bundesliga venue 추가)
[✅] persona_prompts STAT·OBSERVER v1 (Day 5)
[ ] matches 시드 100건+  ← Day 6·7 목표

[★ 페이스 점검 (E2)]
[ ] 1주차 누적 시간 28h 이하
[ ] 토요일 작업 X
[ ] 일요일 30분 회고

Day 6 작업 (3h) — 시드 100건+ 진행

eventsnextleague 호출 추가 (다음 7일 경기). 5 리그 × 7일 = 추가 약 35건 가능. pg_cron 매일 03:00 등록.

⚠️ Day 6 결과 — 99건 (1건 부족)

누적: 99건 (목표 100건+ 1건 부족). 조치: Day 7 fetch 1회 추가 → 102건 도달 예정.

📘 Day 6 트레이스 — cron 첫 등록

결정: 매일 03:00 UTC 기준 (한국 시간 18:00 새벽)

근거: 한국 시청자 새벽 = 트래픽 X = cron 시간 안전. EU 경기 끝난 후 시점.

대안: KST 09:00 — 사용자 활성 시간 + Oracle DB 부하 ↑

부작용: cron 정지 시 KST 18:00에 알림 (Slack), 운영자 24h+ 대응

누적: 36h + Day 6 (3h) = 39h / E2 60h 트리거 21h 여유

2-4 Day 7 — ★ G1 PASSED + 1주차 회고

G1 통과 의식

💻 G1 통과 의식 — git tag
# 1. Day 7 추가 fetch → 시드 102건
cargo run --bin tsv-workers
# 시드: 102건 ✅

# 2. git tag
git tag v0.1-G1-passed
git push origin v0.1-G1-passed
🎉 G1 통과 조건 전체 확인

✅ 5리그 시드 ≥ 100: 102 / ✅ DB schema 5 테이블 / ✅ graceful deserialize
✅ persona_prompts v1 / ✅ 1주차 누적 시간 28h 이하: 18h / ✅ 토요일 작업 X

1주차 회고 (BUILD.md 1.2KB)

📘 1주차 주요 산출물 (7개 파일)
  1. workers/src/fetch.rs (100줄, Tokio join! 5리그 동시)
  2. workers/src/main.rs (cron 호출 함수, 50줄)
  3. supabase/migrations/0001_init.sql (100줄, 5 테이블)
  4. supabase/migrations/0002_persona_prompts_seed.sql
  5. lib/persona_prompts/stat.ts (80줄, STAT v1)
  6. lib/persona_prompts/observer.ts (75줄, OBSERVER v1)
  7. tests/api-samples/ (5 JSON, schema 비교용)

총: 7개 파일 + ~410줄. PLAN.md 추정 G1 시점 7개 파일 일치.

1탄 v2 메타 원칙 입증 (이번 1주차)

1
Agent Teams Day 5+ 입증
1탄 v2 새 23장 23-5 절 사례 일치. STAT + OBSERVER 동시 작성 -57% 시간 절감 = 페이스 보호.
2
graceful 첫 입증
Day 4 Bundesliga venue 필드 추가. strict였다면 Bundesliga 전체 fail. SPEC v4 §7 G-4 보강 효과 데이터 입증.
3
⭐ E5 [4] LLM 분류 프롬프트 분리
STAT·OBSERVER 두 prompt 각각 별도 시스템 프롬프트 + 환각 방지 명세 + Position C 강제. 권1 제7장 8 규칙의 [4] 작동.
💻 Day 7 commit
git add BUILD.md
git commit -m "Phase 1.0 Day 7: ★ G1 PASSED + 1주차 회고 + Agent Teams Day 5+ 입증"

누적: 39h + Day 7 (1h G1 의식 + 회고) = 40h

2-5 1주차 점검 — 두 도메인 권2 1주차 일관 패턴
자리줍줍 (2탄 v2 권2 1주차)TSV (3탄 v2 권2 1주차)
Day 1 외부 인증API 4개 (data.go.kr)TheSportsDB 1개 + Rust workspace
Day 2 첫 코드TS 80줄Rust 100줄 + Tokio join!
Day 3 DB schema4 테이블 + 트리거 35 테이블 (matches·articles·click_events·persona_prompts·cron_pause)
Day 5+ Agent TeamsDay 5 LLM 분류 (E5 [4])Day 5 STAT·OBSERVER (-57%)
Day 6~7 G1시딩 20건 + ★ G1 통과시드 102건 + ★ G1 통과
1주차 누적 시간14h18h (Rust 학습 곡선)
1주차 LogOnTable~9 트레이스~9 트레이스 (동일)

구조 일관 ✅ — 외부 인증 → 첫 코드 → DB schema → graceful → Agent Teams → G1 통과. 도메인 본질 차이만:

  • 줍줍: TS + Supabase + Expo (속도 빠름, 1주차 14h)
  • TSV: Rust + Oracle + Next.js (학습 곡선, 1주차 18h, +4h)
📌 제2장 정리

핵심 한 줄: Day 4~7 = graceful 입증 + Agent Teams Day 5+ 시작 + persona_prompts 첫 prompt + ★ G1 PASSED + 1주차 회고.

  • 1주차 산출물: workers/fetch.rs + main.rs + 0001_init.sql + 0002_persona_prompts_seed.sql + stat.ts + observer.ts + tests/api-samples/ (7개 파일 + 2 SQL)
  • ★ 1주차 핵심 사건: graceful deserialize 첫 입증 (Day 4) ✅ / Agent Teams 첫 사례 (Day 5 -57%) ✅ / persona_prompts INSERT (STAT·OBSERVER v1) ✅ / ★ G1 PASSED ✅
  • 누적 시간: 40h (Phase 0 21h + 1주차 18h + Day 7 의식 1h)
  • 두 도메인 권2 1주차 구조 일관 ✅ + 본질 차이 (Rust 학습 +4h)

다음 장: 권2 제3장 — Day 8~14 (★ G2 Day 14 CRITICAL 가설 검증, Phase 1.0 절반의 본질).

★ G1 PASSED. 1주차 18h 안에 Rust 코드 410줄 + DB schema 5 테이블 + persona_prompts 시드가 완성됐습니다. 1탄 v2 메타 원칙이 매일 작동하기 시작합니다.

다음 장에서 ★ Day 14 CRITICAL — TSV의 가장 큰 결정 자리. "다관점 가치 가설"이 사용자 행동 데이터로 검증되거나 부정되는 14일. PASS/W-C/FAIL 분기에 따라 Phase 1.0 후반 흐름이 결정됩니다.