Pokémon GO Battle League — Great League 팀 추천 엔진.
Taiman Party 메타 피드 + PvPoke 게임마스터 + set-state-aware 3v3 시뮬레이터로
(expected_win_rate, worst_case_robustness, meta_coverage) 3축 Pareto 프론티어를 산출한다.
git clone https://github.com/blakkim/gbl-hacker.git
cd gbl-hacker
uv sync # .python-version + uv.lock 기반으로 가상환경 + 의존성 설치이후 uv run gblh ... 또는 활성화 후 gblh ... 로 실행.
리포에 박힌 fixture 스냅샷을 직접 가리켜 실행한다. 캐시·refresh 무관.
uv run gblh recommend \
--path fixtures/snapshots/great_league__upper__2026-05-19.json \
--top-k 5 \
--lang ko \
--candidates ranking \
--pool-size 30 \
--opponents ranking \
--opponents-size 30 \
--stochastic-samples 5 \
--exclude 'サニーゴ(ガラル)'소요 시간: ~110분 (M-series 기준). pool 30 × ordered 3-combo 23,352 후보 × 30 합성 상대 × N=5 샘플.
- RNG seed =
md5(repr((team_a.species, team_b.species)))[:4](src/gbl_hacker/score/expected_win_rate.py:462) → 프로세스/머신 무관하게 동일 seed - 데이터 입력 일체가 repo 안에 있음:
fixtures/snapshots/great_league__upper__2026-05-19.json— Taiman 스냅샷 (2026-05-19 05:40 UTC fetch)src/gbl_hacker/data/gamemaster.json— PvPoke 미러src/gbl_hacker/data/rankings_gl.json+rankings_gl_leads.json— PvPoke GL 랭킹src/gbl_hacker/data/cpm.json/type_chart.json/pokedex_localized.json/move_ja_to_pvpoke.json
| 옵션 | 값 | 의미 |
|---|---|---|
--path |
fixture JSON | 캐시 대신 명시 스냅샷 사용 |
--candidates ranking |
(기본) | PvPoke top-N에서 ordered 3-combo enumerate (마스카나 같은 niche 픽 포함) |
--pool-size 30 |
풀 크기. 30 = 거의 전체 메타 (23K combo). 12=70초, 15=2.5분, 20=6분, 30=22~110분 | |
--opponents ranking |
(기본) | PvPoke top 기반 합성 opponent 30팀 |
--stochastic-samples 5 |
(기본) | 쉴드 결정 stochasticity 평균. WCR 0/100 collapse 방지 |
--exclude |
JP 종명 콤마구분 | 후보 풀에서 제외 (상대 풀은 안 빠짐) |
--win-mode |
ko(기본)/resource |
턴버짓 내 미KO 스톨 처리. resource=잔여자원(생존>쉴드>HP>에너지) 우위 팀에 승 |
--critique |
(플래그) | #1 팀에 red-team 비판: 팀 전체 공격 blind spot + 최악 시뮬 매치업 교차참조 |
--lang ko |
(기본) | 출력 종명 한국어 |
--stochastic-samples 1 로 바꾸면 결정론 모드(빠르지만 WCR 의미 없음, legacy).
오늘자 Taiman 메타로 새 스냅샷 받아서 추천:
# 1) 새 스냅샷 fetch + 캐시 저장 (~/.cache/gbl-hacker/snapshots/...)
uv run gblh refresh
# 2) 캐시 최신 스냅샷으로 추천 (--path 생략 시 가장 최근 캐시 사용)
uv run gblh recommend \
--top-k 5 \
--pool-size 30 \
--opponents-size 30 \
--exclude 'サニーゴ(ガラル)'신선 데이터 = Taiman 업스트림 갱신 반영 → A의 결과와 다를 수 있음.
uv run gblh refresh
uv run gblh recommend --pool-size 12 --opponents-size 20 # ~70초uv run gblh show # 캐시 최신
uv run gblh show --path fixtures/snapshots/great_league__upper__2026-05-19.json추천 팀으로 실제 GBL 셋 돌린 뒤 pre/post 레이팅을 JSONL 라인으로 기록:
uv run gblh report-rating --team-id <id> --pre 2845 --post 2861 --notes "altaria lead vs steel lead"seed.yaml의 long-loop validation gate (rating_change_log ≥ 1) 충족 조건이기도 함.
uv run gblh refresh --helpuv run gblh recommend --helpuv run gblh show --helpuv run gblh report-rating --helpuv run gblh verify-reference --help— 추천 결과를 독립 reference top-tier 리스트와 Jaccard 비교 (AC 5 gate)
- EWR: 메타 사용률 가중 평균 승률
- WCR: 사용률 가중 10th-percentile 승률 (worst-case robustness,
--stochastic-samples > 1일 때만 의미 있음) - COV: meta coverage — 메타 종 단위로 본 커버리지
- Pareto size: 세 축 모두 dominated 되지 않는 팀 개수. 1~2팀만 나오면 합성 상대 풀이 한쪽으로 쏠려 있을 가능성 (cf. WCR collapse caveat)
추천 표 아래에 항상 따라 나온다 (숨길 플래그 없음):
- TRUST — opponent-pool sensitivity: top-K 팀을 반대 상대 풀(ranking↔meta) 양쪽에 채점한 EWR과 그 차이. gap ≥15%면 ⚠ — 그 순위는 상대 풀 선택에 의존한다는 뜻 (PvPoke 이론강팀엔 강하지만 실전 메타엔 약함, 또는 그 반대).
- FRAGILE FRONTIER 경보:
pareto_size ≤ 2면 프론티어가 붕괴한 것 — 한 팀이 모든 축을 지배해서가 아니라 상대 풀이 쏠렸을 신호. top 픽을 잠정으로 취급하라는 경고.
- offensive blind spots: 팀 3마리의 공격 무브 타입을 모아, 그중 어느 것도 super-effective가 아닌 메타 종 (사용률순). per-mon 방어약점이 아니라 팀 전체가 SE 레버리지 없는 적을 잡는다 (예: 메더/파이어로/쏘콘 → Diggersby 노말/땅).
- worst simulated matchups: 메타 30팀 대비 시뮬 승률 최하위. blind-spot 종을 포함한 매치업엔 ⚠ — 가설(blind spot)을 시뮬(승률)로 확정한다.
모든 빌드는 materialize 시 gbl_hacker.coherence로 검증된다 — 타이핑+무브가 단일 실제 gamemaster 폼으로 설명돼야 함. 어긋나면(과거 "メダ 키메라" 클래스) 기본 경고, coherence="raise"로 차단. 신선 스냅샷의 데이터 오염을 런타임에 잡는다.
데이터 신뢰성 caveat (Taiman은 report-density 가중 upper-bracket 피드)은 모든 refresh·show 출력에 구조적으로 박혀 나온다. 숨길 수 있는 플래그 없음.