Data sources & method

Every number on this site traces back to a game client build. No guessed values.

Where the data comes from

All talent data is extracted from the game clients published by wago.tools DB2 exports:

DatasetProductBuild
WoW Forever (beta) — DB2 tableswow_classic_beta1.60.1.70009
Live tree layout (client-pushed, current sync)wow_classic_betabeta-20261105-c929bf89 · build 1.60.1.70755
Legacy trees, perks & 16-point budget (login-pushed)wow_classic_betaclient export 2026-09-29
Classic Era (baseline)wow_classic_era1.15.9.69722

Tables used: Talent, TalentTab, ChrClasses, SpellName, Spell, SpellEffect, SpellMisc and race/skill tables for upcoming features. Rows are pulled as CSV per build, cached locally, normalized into the JSON served from /data/, and pinned — this page’s numbers change only when we re-run the pipeline against a new build.

Why the layout sync exists: the game client receives its actual talent trees as login-pushed data, which public DB2 snapshots lag behind — the plain Talent table for the pinned DB2 build still shows removed Classic-era talents at their old positions. The live membership and positions (which talents exist, which moved) are therefore synced against a live client export (beta-20261105-c929bf89); per-rank description text is likewise taken from the client's fully-substituted export where available (the client tooltip engine resolves cross-spell references such as $12976s1 and trigger-aura values that raw DB2 rows store as 0 — replaying that engine ourselves would mean guessing), while effects, icons and spell IDs keep coming from the DB2 pull. The prerequisite graph is adopted from the client export wholesale for the same reason: the DB2 PrereqTalent/PrereqRank rows badly trail the live trees (dozens of missing and stale links, some reversed), so all 69 prerequisite edges now mirror the client set — the beta planner gates a linked talent on its source being fully maxed, which we verified against the live planner (e.g. Shield Specialization 1/5 leaves Master of Defense locked; 5/5 unlocks it). Both sources are the same beta build.

Pipeline: scripts/fetch_talents.py (download + verify), scripts/build_talents.py (normalize), scripts/merge_client_talents.py (sync live layout + classic statuses), scripts/diff_talents.py (raw table diff), scripts/spotcheck.py (raw-CSV ↔ JSON alignment proof). Each run writes SHA-256 manifests for every downloaded table.

Diff methodology

Talents are matched by name within each tree between the live Forever layout and the Classic Era client. A talent is new if no Classic Era talent carries that name, changed if its rank text, values or rank count differ from Classic, moved if it sits in a different tree spot than its Classic position, and identical otherwise. Talents that left a tree entirely are listed per tree as removed. Numeric value changes inside identical wording still count as changes — the calculator's "Compare to Classic" toggle dims only the strictly identical ones.

Known gaps (honest list)

  • Rank 2+ values: the beta DB2 keeps effect rows only for rank-1/base spells. Per-rank description text now comes from the client's substituted export (1,299 of 1,379 ranks; flagged client in the JSON); the remaining higher ranks of unchanged spells are filled from the Classic Era tables by spell ID (76 rank rows, flagged valuesFromEra) and the detail panel marks those values. Era rows store every base value one below what the client displays (the old WDB convention), so the import adds the +1 back before substituting.
  • 17 talent names in the beta localization tables are empty holes; we fall back to the Classic Era name for the same spell ID and flag those nodes (nameFromEra) in the JSON. The same fallback resolves 17 rank-1 icons (iconFromEra); every other icon is decoded straight from the beta CASC and self-hosted.
  • Weaponmaster anomaly: three Arms slots (IDs 132/125/123) share the name “Weaponmaster” in the current beta tables — kept as-is, flagged for verification on the next build.
  • Zero-value texts: a few beta descriptions carry a literal 0% where an effect is not implemented yet (e.g. Moonkin Form's threat reduction). The client itself renders these as 0%, so we show them as-is rather than inventing a number.
  • Racial data: the beta skill-line race masks over-report, so the racials pages ship from a client export of the 17 September preview instead (10 races × 4 abilities, 26 Classic comparisons) until the masks are fixed in a later build. At launch, every recorded value was re-checked against Blizzard's November 2 official development notes and updated where the notes moved it — so what renders is the export plus officially-confirmed tuning.
  • Legacy system: the Legacy trees, perks and the 16-point budget on the Legacy page come from a client export of the login-pushed planner data (dataset table above; the export payload carries no build tag of its own, so it is identified by check date — 29 September 2026 — like the 17 September racial preview). The public DB2 registry for this build carries no Legacy tables at all (Legacy*/GarrTalent/MinorTalent probes all absent), so the client export is the only machine source. Earning rules and the reward track are cited to Blizzard's official deep-dive recap on-page; the challenge list, per-category point values and reward-track milestones are published nowhere we can verify, so the page omits them and says so.

Verification

Spot checks compare each normalized JSON node against the raw CSV row it came from (position, ranks, prerequisite links). The current dataset: 467 talent slots in the live trees — 48 identical / 268 changed / 30 moved / 121 new / 85 removed vs Classic Era.

Feedback & corrections

Found a wrong value? Mail hello@wowforevercalc.com with the talent name and what you see in game — corrections usually land within one build cycle. Change history is on the Updates page.

Legal

This is a fan-made tool, not affiliated with or endorsed by Blizzard Entertainment. World of Warcraft and WoW Forever are trademarks of Blizzard Entertainment, Inc. Game data © Blizzard Entertainment, extracted via wago.tools.