Skip to content

Repository files navigation

TrueParse

TrueParse

A parse that shows you actually did your job.

TrueParse is a World of Warcraft group meter that grades every player on a Group Contribution Score, a 0 to 99 number in the parse colors you already know from Warcraft Logs, instead of raw damage or healing. A tank or healer can top the card as easily as a DPS, because each role is scored on its own job: damage for DPS, healing for healers, active-mitigation uptime for tanks, and enabled damage for Augmentation Evokers.

The score is a verifiable Warcraft Logs base plus visible adjustments: your throughput measured against real ranked parse curves for your spec and encounter, then signed nudges for everything else, each showing its exact impact ("Excellent interrupting (+5)"). Staying out of the bad earns points, standing in it costs them, and you are never penalized for lacking an ability your spec doesn't have.

Most meters answer "who did the most damage?" TrueParse answers "who played their role well, and how do I get better?" After each fight it names the one change that would raise your score most, calls out the specific mechanic you keep eating ("you took Exploding Iron Star 3 times, only 41% of players get hit by it"), and explains every death.

Supports retail and Mists of Pandaria Classic.

What it does

  • Post-fight scorecard: Details-style ranked rows with per-fight scores, run averages, the signed adjustment column, and a merged Raid/Group summary row (green dot = running TrueParse). Hover any row for a plain-language breakdown sorted best-to-worst — every line that moved the score says by how much — with percentile gauges wherever a real WCL population backs the number. Personal-best tags on new records. Optional letter grades (F to S+) via /tp letters.
  • Deep, honest detail: interrupt coverage ("Kicked 7 of 9 interruptible casts" — the kickable-spell list teaches itself), whether tank and healer cooldowns actually met the fight's damage spikes, a WCL-style death recap on every death, dispel reaction times, healer mana timelines, and Bloodlust usage.
  • Two lenses, switchable on the window: TrueParse (the full contribution score) or Raw — your true Warcraft Logs percentile for this exact boss, bracket, and spec. If you parse 92 on WCL, Raw shows 92. Raw disables itself on content WCL doesn't rank instead of inventing a number.
  • Fair by construction: real WCL population curves per encounter, spec, and bracket for damage and healing, so a Disc priest's damage and a Blood DK's self-healing count the way their populations say they should. Tanks are scored on active-mitigation uptime against their own spec's field. Metrics your spec can't perform redistribute; nothing that forces damage onto you counts as a penalty; fights with nothing to heal don't scold healers; item level is normalized (toggleable).
  • A real group story: the Raid card reads like an analysis, not an average — kill speed vs every ranked kill, kick coverage, deaths and avoidable pressure as facts, and an execution-vs-parses verdict when the group killed faster (or slower) than its meters predict.
  • Augmentation attribution: an Aug Evoker's card credits the damage their buffs enabled ("27.9k own + 18.1k buffs enabled"), scored against the real DPS population and calibrated to land within a few points of WCL's own attributed parses, plus a Prescience-upkeep metric for the buff no meter can otherwise see.
  • Called-wipe forgiveness (MoP): when group damage output collapses and never recovers, the raid stopped trying — avoidable damage, deaths, and inactivity after that moment don't count. A wipe fought to the last death counts everything.
  • Coaching that names the problem: after a fight, one private line with the single change that would raise your score most. It names the specific avoidable ability you kept eating and how often the field takes it, or points at downtime, a mistimed cooldown, or where your rotation trails the top parses. Wipe debriefs say what happened; a clean fight gets none.
  • Every death explained: read against crawled per-encounter data, each death is labeled an avoidable hit, a tankbuster to pre-mitigate, a slow chip-down (a healing gap, not the dead player's fault), or an unavoidable one-shot.
  • Awards that mean something: one per player per fight, rarest wins, and winning must be earned — Untouchable goes to a sole dodger, Giant Slayer needs a 25% margin, Not on My Watch needs a real fight.
  • Career tracking (/tp career), run report cards (/tp run), and /tp share — one line to group chat with the latest kill's time vs Warcraft Logs ranked kills plus the group score. Opt-in run announcements stay polite: when several TrueParse users have them on, they elect ONE announcer over the addon channel — no duplicate lines.
  • Better together: TrueParse users share their own combat facts (defensive cooldowns, consumables, activity, defensives sitting ready at death) over a hidden addon channel — data Blizzard hides from everyone except the player themselves. These nudge the score a few points at most; a player without the addon still gets an accurate base score, and missing data is always neutral, never a penalty.

Install

CurseForge, or drop the folder into Interface/AddOns/. Left-click the minimap icon for the scorecard, right-click for options (/tp config).

Commands

/tp help lists everything in-game. Highlights: /tp toggle window · /tp mode TrueParse/Raw · /tp letters letter grades · /tp run run report · /tp share post group summary · /tp career · /tp trends · /tp fights history · /tp score [n] · /tp buffs pre-pull diagnostic · /tp ilvl · /tp coach · /tp announce · /tp mock demo raid

How scoring works (short version)

Score = WCL base + adjustments, capped at 99 (100 doesn't exist, same as Warcraft Logs). The base is what's verifiable for every player, addon or not: damage and healing measured against Warcraft Logs percentile curves sampled from the full ranked population for your spec, on that boss, in your bracket (10/25-player on Classic; Normal/Heroic/Mythic on retail; timed-top-run curves for dungeons), split per spec by its own population's damage/healing mix. Tanks lead on active-mitigation uptime, scored against their spec's own crawled uptime field the same way, so survival is the base and not a bolt-on. When your exact spec+bracket has no curve, the fallback ladder was calibrated by measuring six million parses: your spec on other bosses first, then ratio-corrected neighboring difficulties, then role pools, and the tooltip names the population used.

Everything else is a signed, context-scaled adjustment on top: kicks swing up to ±6 on a kick-heavy fight and barely register on a quiet one; dispels ±4; staying out of avoidable damage earns up to +3 while eating it costs up to −15; deaths, threat accidents (5-mans), and missing raid buffs subtract; cooldowns that meet damage spikes, activity, preparation, Bloodlust usage, and combat rezzes nudge. The net adjustment caps at ±15, so a score never drifts far from its verifiable core, and every bullet shows its exact points. The scoring engine is pure Lua with a headless test suite.

Known limitations

  • English clients get the sharpest data: encounter matching keys on English names today, so non-English clients fall back to wider population pools. Keying by encounter ID is planned.
  • On retail, Blizzard hides other players' casts and mid-combat values ("secrets"), so combat-log-based extras (Bloodlust windows, damage-target splits, defensives for non-TrueParse players) are MoP-Classic-only.
  • Dungeon comparisons on normal/heroic/Timewalking use the dungeon's timed-top-run curves — honestly labeled as such, since WCL doesn't rank those difficulties separately. Delves, follower dungeons, and scenarios aren't captured at all (nothing to compare against).
  • On retail, Blizzard blocks automated chat from addons: run announcements show a one-click Post prompt instead of auto-sending.

Bug reports and requests: GitHub issues.

Design guide

The card's visual language is built from three things WoW raiders already read fluently, and nothing else. Every rule below is load-bearing; if a new feature can't be expressed in this language, the feature is redesigned, not the language.

Color is meaning, and every hue is reserved.

Color Meaning Values
WCL parse brackets how good — the only judgment colors grey #8a8a8a 0–24 · green #1eff00 25–49 · blue #0070ff 50–74 · purple #a335ee 75–94 · orange #ff8000 95–98 · pink #e268a8 99 · gold #e5cc80 100/awards
Class colors who — names and bars, never judgment Blizzard RAID_CLASS_COLORS
Red #e64d4d danger only — deaths, wipes, uncovered spikes never decorative
Coach cyan #66ccff the parse coach — advice comparing you to top parses one line, tooltips only

A colored two-digit number carries value and verdict at once — the number IS the indicator. Nothing on the card uses color outside this table.

The card: one hero, uniform quiet rows, zero sentences.

  • The score is the hero — one large bracket-colored number. Nothing else competes at that size.
  • Every continuous signal is an identical micro-row: [icon] [thin 0–100 bar] [colored number] [signed grey points]. All bars share the 0–100 scale, so the column reads as an honest profile — a radar chart unrolled flat.
  • Population-backed rows render the bracket gauge itself: the five bracket zones as segments with a white marker at your position — the zone structure IS the judgment, so the row shows the population, not just a fill. WCL percentiles mark their percentile; quantile-anchored metrics (Active, and the tank Mitigation gauge scored against the spec's crawled uptime field) mark their population TIER while the number stays the raw %. One marker, nothing else: the field median is the gauge's own green/blue seam. Own-rules bars (coverage, shares) stay solid verdict-colored fills — no population, no brackets. (Mitigation's retail anchors are provisional until enough field data recalibrates them; Active's traveled the same road.)
  • A thin comparison tick on solid-fill bars marks the group's average: your fill vs the tick is the "my shape vs the group's shape" read. Gauges never carry one — two white ticks read as noise.
  • Discrete things are markless, never bars: deaths, coverage ("1/3"), kicks ("0/10"), and dispel counts render as label + colored count + points — a bar under a count implies a continuous scale that isn't there. The availability cap lives in the judged denominator ("your cooldowns could reach N" in the tooltip).
  • Two zones, one rule (layout A, 2026-07-25): every population visualization stacks full-width in the top zone; every markless verdict packs two-per-line into a chip grid below the rule, each chip a hover target with its own tooltip (highlight on mouseover). Died always ends the grid. The rule reads "measured against a population" above, "counted verdicts" below — the scored/unscored story rides the points column. Header carries name+score, boss line, and a time line (duration · pulled); the player-card footer is retired.
  • Verdict labels, never sentences. Each row carries a 2–4 word verdict in muted ink stating what happened — "Lust missed", "Died, CDs ready", "Stayed clean" — so nobody computes a finding from marks. Labels state; marks quantify; tooltips explain. Anything needing a sentence lives in a tooltip.

Tooltips: one grammar, five lines, no paragraphs.

title · one number cluster ("35.6M · 104k/s · spec median 157k/s") · one dim context line · the coach line when it applies. Tooltips are text that explains — they never duplicate a visualization the card already shows (the percentile gauge lived in both places once; the card won).

Floating marker labels own their vertical band. A label that rides a mark always reserves a full line of empty space above the mark — layouts that add lines (the coach) push the mark down rather than letting text and label share pixels.

Graphs only where they carry story: the group card's fight-shape sparkline (output per second: opener ramp, Bloodlust burst, death dots, the post-call collapse) and the per-player output lines. A graph that duplicates chrome dies — the progression staircase retired once the fight picker's wipe-% labels told the same story. Everything is built from flat rectangles, cropped icons, and outlined condensed text — the current "quality addon" dialect — because that's all WoW renders cleanly, and designs that fight the engine read as janky.

Where the data comes from

All Warcraft Logs statistics (percentile curves, kill times, spec benchmarks in Data/*.lua) ship inside the addon — users never fetch anything, and every addon update carries refreshed data. The addon nags in-game once shipped data is 60+ days old, which just means it's time to update.

Development

Maintainer data refresh (never needed by users): the scripts/ crawlers regenerate the Data/ files from the Warcraft Logs API — fetch-percentiles-v2.ps1 (percentile curves, V2 client credentials in scripts\wcl-v2-client.local.txt), fetch-killtimes.ps1 (kill-speed curves), and fetch-benchmarks.ps1 (spec factors, V1 key in scripts\wcl-key.local.txt; both files gitignored). Zone IDs change each season — list them via the API and update .github/workflows/benchmarks.yml to match. Run one crawler at a time: WCL V2 tokens are single-active.

  1. Clone anywhere; run scripts\link-addon.ps1 to junction the repo into _retail_\Interface\AddOns (repeat with your Classic path if wanted).
  2. /reload after changes; BugSack + BugGrabber recommended.
  3. Headless tests: lua tests/run.lua [path-to-SavedVariables].

Releases: push a v* tag; the packager workflow builds and uploads to CurseForge (secret: CF_API_KEY).

Credits

Benchmark data derived from Warcraft Logs public statistics. Built on Ace3, LibSharedMedia, LibDataBroker, LibDBIcon. MIT licensed.

About

A parse that shows you actually did your job. WoW scorecard: Warcraft Logs percentile base + visible adjustments (kicks, mechanics, cooldown timing, Aug attribution). Every role can top the meter. Retail + MoP Classic.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages