📑 이 챕터에서 다룰 내용
권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주차 회고 |
작업 (3.5h)
Day 3 완료된 fetch.rs를 보강합니다. fetch_league() 함수를 fetch_recent_league() / fetch_upcoming_league()로 분리하고, 5 리그 × 2 (recent + upcoming) = 10 동시 호출로 확장합니다.
결과 — 60건 누적
✓ 5 리그 recent: 25건 (Day 3 누적)
✓ 5 리그 upcoming: 35건 신규 (UNIQUE 위반 0)
✓ 누적: 60건 (목표 100건+ 미달, Day 5·6 추가 fetch 결정)
4 리그 정상 / 1 리그 (Bundesliga) "venue" 필드 추가됨 — graceful 통과 (필수 4 필드 deserialize 성공).
strict deserialize였다면 Bundesliga 전체 fail. SPEC v4 §7 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 여유
작업 (4h) — Agent Teams 위임
/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.5h | 1h (병렬) |
| OBSERVER v1 작성 | 1.5h | (동시) |
| INSERT + 검증 | 0.5h | 0.5h |
| 합계 | 3.5h | 1.5h (-57%) |
lib/persona_prompts/stat.ts (약 80줄, 발췌)
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 사용 (-57% 시간 절감)
근거: 1탄 v2 새 23장 + 권1 제7장 권고 일치. CLAUDE.md §6 폴더 분리 = 분배 기준 자연.
대안: 순차 작성 — 3.5h, E2 페이스 부담
부작용: 토큰 비용 약 1.7배 증가 ($0.4 → $0.7), 시간 절감 가치 > 비용
결정: 시스템 프롬프트에 명시적 키워드 풀 + 70% 임계값
근거: 권1 제7장 ⭐ E5 [3]. Day 18 (자동 측정)의 토대. "사실은 같지만 표현은 다름" SSOT 깊이 = 코드 레벨 박힘.
대안: 키워드 풀 없음 — Day 18 자동 측정 불가
부작용: 키워드 풀 변경 시 prompt v2 versioning
누적: 32h + Day 5 (4h) = 36h / E2 60h 트리거 24h 여유
G1 통과 조건 체크리스트
[기능 통과 조건] [✅] 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 등록.
누적: 99건 (목표 100건+ 1건 부족). 조치: Day 7 fetch 1회 추가 → 102건 도달 예정.
결정: 매일 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 여유
G1 통과 의식
# 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
✅ 5리그 시드 ≥ 100: 102 / ✅ DB schema 5 테이블 / ✅ graceful deserialize
✅ persona_prompts v1 / ✅ 1주차 누적 시간 28h 이하: 18h / ✅ 토요일 작업 X
1주차 회고 (BUILD.md 1.2KB)
- workers/src/fetch.rs (100줄, Tokio join! 5리그 동시)
- workers/src/main.rs (cron 호출 함수, 50줄)
- supabase/migrations/0001_init.sql (100줄, 5 테이블)
- supabase/migrations/0002_persona_prompts_seed.sql
- lib/persona_prompts/stat.ts (80줄, STAT v1)
- lib/persona_prompts/observer.ts (75줄, OBSERVER v1)
- tests/api-samples/ (5 JSON, schema 비교용)
총: 7개 파일 + ~410줄. PLAN.md 추정 G1 시점 7개 파일 일치.
1탄 v2 메타 원칙 입증 (이번 1주차)
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탄 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 schema | 4 테이블 + 트리거 3 | 5 테이블 (matches·articles·click_events·persona_prompts·cron_pause) |
| Day 5+ Agent Teams | Day 5 LLM 분류 (E5 [4]) | Day 5 STAT·OBSERVER (-57%) |
| Day 6~7 G1 | 시딩 20건 + ★ G1 통과 | 시드 102건 + ★ G1 통과 |
| 1주차 누적 시간 | 14h | 18h (Rust 학습 곡선) |
| 1주차 LogOnTable | ~9 트레이스 | ~9 트레이스 (동일) |
구조 일관 ✅ — 외부 인증 → 첫 코드 → DB schema → graceful → Agent Teams → G1 통과. 도메인 본질 차이만:
- 줍줍: TS + Supabase + Expo (속도 빠름, 1주차 14h)
- TSV: Rust + Oracle + Next.js (학습 곡선, 1주차 18h, +4h)
핵심 한 줄: 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 후반 흐름이 결정됩니다.