|
| 1 | +# Milestone 5 — Recommender suite (usage guide) |
| 2 | + |
| 3 | +The M5 engine answers, for **every location** (not just CB): *what team should |
| 4 | +I bring, how do I build each hero, are my heroes ready, and what should I pull |
| 5 | +or farm next?* Everything is grounded in game-truth (skill descriptions, static |
| 6 | +data, the live `/hero-computed-stats` endpoint); HellHades ratings are an |
| 7 | +additive signal, never authoritative. |
| 8 | + |
| 9 | +## The data layer (regenerate after a Raid patch) |
| 10 | + |
| 11 | +| File | Tool | What it holds | |
| 12 | +|---|---|---| |
| 13 | +| `docs/m5_phase1_inventory.md` | `m5_inventory.py` | universe inventory (heroes/skills/masteries/blessings/sets/locations) | |
| 14 | +| `data/m5_hero_catalog.jsonl` | `m5_hero_catalog.py` | per-hero CB sim coverage (modeled / no_op / gap) | |
| 15 | +| `data/m5_synergy.jsonl` | `m5_synergy_graph.py` | per-hero provides/needs (team buffs, debuffs, DoTs, TM, cleanse, …) | |
| 16 | +| `data/static/mastery_relevance.json` | `m5_mastery_tagger.py` | all 66 masteries × 12 locations | |
| 17 | +| `data/static/blessing_relevance.json` | `m5_blessing_tagger.py` | all 34 blessings × 12 locations | |
| 18 | +| `data/static/blessing_procs.json` | `extract_blessing_procs.py` | game-truth blessing proc formulas (grade-by-grade) | |
| 19 | +| `data/static/stage_stat_targets.json` | `m5_stat_targets.py` | per-stage boss stat modifiers + ACC floors | |
| 20 | +| `hero_computed_stats.json` | `/hero-computed-stats` (live) | the user's actual Total-Stats per geared hero | |
| 21 | + |
| 22 | +Regenerate the derived files: |
| 23 | +```bash |
| 24 | +python3 tools/refresh_static_data.py # static data from live mod |
| 25 | +python3 tools/m5_inventory.py |
| 26 | +python3 tools/m5_hero_catalog.py |
| 27 | +python3 tools/m5_synergy_graph.py |
| 28 | +python3 tools/m5_mastery_tagger.py |
| 29 | +python3 tools/m5_blessing_tagger.py |
| 30 | +python3 tools/extract_blessing_procs.py |
| 31 | +python3 tools/m5_stat_targets.py |
| 32 | +curl -s "http://localhost:6790/hero-computed-stats?min_grade=4" -o hero_computed_stats.json |
| 33 | +``` |
| 34 | + |
| 35 | +## The recommender layer (what you run day-to-day) |
| 36 | + |
| 37 | +### Team for a location |
| 38 | +```bash |
| 39 | +python3 tools/m5_recommender.py --location cb # owned roster |
| 40 | +python3 tools/m5_recommender.py --location dragon --builds # + per-hero builds |
| 41 | +python3 tools/m5_recommender.py --location arena --pool all # "what if I pulled X" |
| 42 | +python3 tools/m5_recommender.py --list-locations |
| 43 | +``` |
| 44 | +Greedy axis-coverage builder over 8 location profiles (cb / dragon / spider / |
| 45 | +fire_knight / ice_golem / hydra / chimera / arena). CC providers are |
| 46 | +downweighted vs CC-immune bosses; the game-truth ACC floor is surfaced. |
| 47 | + |
| 48 | +### How to build a specific hero |
| 49 | +```bash |
| 50 | +python3 tools/m5_build_recommender.py --hero Venomage --location cb |
| 51 | +``` |
| 52 | +Maps the hero's game-truth kit → relevant masteries (filtered to the location), |
| 53 | +blessing, and stat focus — and checks the user's **actual ACC** against the |
| 54 | +floor (`[READY: you have 423]` / `[GAP: need +M]`). |
| 55 | + |
| 56 | +### What to pull / build next |
| 57 | +```bash |
| 58 | +python3 tools/m5_roster_gaps.py # all locations summary |
| 59 | +python3 tools/m5_roster_gaps.py --location cb # gaps + best unowned upgrades |
| 60 | +``` |
| 61 | + |
| 62 | +## Coverage / limitations (no silent caps) |
| 63 | + |
| 64 | +- **Sim validation**: the recommender ranks by synergy coverage + HH signal; it |
| 65 | + does **not** yet run the CB sim on the suggested team (CB-only + calibration |
| 66 | + work in progress — see `project_spirit_fixture_attribution_20260623`). |
| 67 | +- **Damage stat targets**: only game-imposed floors (ACC = boss RES) are |
| 68 | + modeled. Per-build CR/CD/ATK% targets are intentionally not invented. |
| 69 | +- **Readiness**: covers heroes present in `hero_computed_stats.json` (grade≥4 |
| 70 | + snapshot). Absent heroes get no annotation. |
| 71 | +- **Blessing procs**: extracted game-truth (`blessing_procs.json`) but not yet |
| 72 | + wired into the CB damage sim. |
| 73 | + |
| 74 | +## Naming gotcha (blessings) |
| 75 | + |
| 76 | +`blessings.json` `id` is the internal **code enum** (MagicOrb, Meteor, |
| 77 | +Exterminator); the **UI name** is the proc skill's display name (Phantom Touch, |
| 78 | +Brimstone, Cruelty). `blessing_procs.json` carries both. Match by either; the |
| 79 | +`skill_type_id` link is authoritative. |
0 commit comments